From a14d83675d238f8d92f2ce42b6bb0312ccfadeb5 Mon Sep 17 00:00:00 2001 From: admin <51248046+danton267@users.noreply.github.com> Date: Thu, 26 May 2022 16:30:49 +0100 Subject: [PATCH] refactor final --- apps/dash-pivottable/.gitignore | 190 ++++++++++++++++++ apps/dash-pivottable/app.py | 81 +++----- apps/dash-pivottable/assets/css/app.css | 70 +++++++ apps/dash-pivottable/assets/dash.png | Bin 17304 -> 0 bytes apps/dash-pivottable/assets/github.png | Bin 4268 -> 0 bytes .../assets/images/plotly-logo-light-theme.png | Bin 0 -> 30763 bytes apps/dash-pivottable/{ => data}/data.py | 0 apps/dash-pivottable/requirements.txt | 28 +-- apps/dash-pivottable/runtime.txt | 2 +- apps/dash-pivottable/utils/components.py | 22 ++ 10 files changed, 314 insertions(+), 79 deletions(-) create mode 100644 apps/dash-pivottable/.gitignore create mode 100644 apps/dash-pivottable/assets/css/app.css delete mode 100644 apps/dash-pivottable/assets/dash.png delete mode 100644 apps/dash-pivottable/assets/github.png create mode 100644 apps/dash-pivottable/assets/images/plotly-logo-light-theme.png rename apps/dash-pivottable/{ => data}/data.py (100%) create mode 100644 apps/dash-pivottable/utils/components.py diff --git a/apps/dash-pivottable/.gitignore b/apps/dash-pivottable/.gitignore new file mode 100644 index 000000000..8e1af00b7 --- /dev/null +++ b/apps/dash-pivottable/.gitignore @@ -0,0 +1,190 @@ +# .gitignore specifies the files that shouldn't be included +# in version control and therefore shouldn't be included when +# deploying an application to Dash Enterprise +# This is a very exhaustive list! +# This list was based off of https://github.com/github/gitignore + +# Ignore data that is generated during the runtime of an application +# This folder is used by the "Large Data" sample applications +runtime_data/ + +# Omit SQLite databases that may be produced by dash-snapshots in development +*.db + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + + +# Jupyter Notebook + +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# IPython +profile_default/ +ipython_config.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + + +# macOS General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# History files +.Rhistory +.Rapp.history + +# Session Data files +.RData + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# Linux +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# SublineText +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings \ No newline at end of file diff --git a/apps/dash-pivottable/app.py b/apps/dash-pivottable/app.py index bc1d69ea2..b3de57b01 100644 --- a/apps/dash-pivottable/app.py +++ b/apps/dash-pivottable/app.py @@ -1,46 +1,16 @@ -import dash -from dash.dependencies import Input, Output -import dash_html_components as html +from dash import Dash, html, Input, Output import dash_pivottable -from data import data +from data.data import data +from utils.components import header - -def Header(name, app): - img_style = {"float": "right", "height": 40, "margin-right": 10} - dash_logo = html.Img(src=app.get_asset_url("dash.png"), style=img_style) - ghub_logo = html.Img(src=app.get_asset_url("github.png"), style=img_style) - - return html.Div( - [ - html.H1(name, style={"margin": 10, "display": "inline"}), - html.A(dash_logo, href="https://plotly.com/dash/"), - html.A(ghub_logo, href="https://github.com/plotly/dash-pivottable"), - html.A( - html.Button( - "Enterprise Demo", - style={ - "float": "right", - "margin-right": "10px", - "margin-top": "5px", - "padding": "5px 10px", - "font-size": "15px", - }, - ), - href="https://plotly.com/get-demo/", - ), - html.Hr(), - ] - ) - - -app = dash.Dash(__name__) -app.title = "Dash Pivottable" +app = Dash(__name__, title="Dash Pivottable") server = app.server -app.layout = html.Div( - [ - Header("Dash Pivottable", app), +app.layout = html.Div([ + header(app, "black", "Dash PivotTable"), + + html.Div([ dash_pivottable.PivotTable( id="table", data=data, @@ -54,29 +24,32 @@ def Header(name, app): valueFilter={"Day of Week": {"Thursday": False}}, ), html.Div(id="output"), - ] -) + ], + className="app-body") +]) @app.callback( Output("output", "children"), - [ - Input("table", "cols"), - Input("table", "rows"), - Input("table", "rowOrder"), - Input("table", "colOrder"), - Input("table", "aggregatorName"), - Input("table", "rendererName"), - ], + Input("table", "cols"), + Input("table", "rows"), + Input("table", "rowOrder"), + Input("table", "colOrder"), + Input("table", "aggregatorName"), + Input("table", "rendererName"), ) def display_props(cols, rows, row_order, col_order, aggregator, renderer): + """ + This callback demonstrates how to access the properties of the PivotTable, which can then be used as needed. + """ return [ - html.P(str(cols), id="columns"), - html.P(str(rows), id="rows"), - html.P(str(row_order), id="row_order"), - html.P(str(col_order), id="col_order"), - html.P(str(aggregator), id="aggregator"), - html.P(str(renderer), id="renderer"), + html.H3("PivotTable parameters:"), + html.P("cols: " + str(cols)), + html.P("rows: " + str(rows)), + html.P("row_order: " + str(row_order)), + html.P("col_order: " + str(col_order)), + html.P("aggregator: " + str(aggregator)), + html.P("renderer: " + str(renderer)), ] diff --git a/apps/dash-pivottable/assets/css/app.css b/apps/dash-pivottable/assets/css/app.css new file mode 100644 index 000000000..f38272b3a --- /dev/null +++ b/apps/dash-pivottable/assets/css/app.css @@ -0,0 +1,70 @@ +body { + background-color: #9db2db; +} + +.app-body { + display: flex; + gap: 1%; +} + +/* Header */ +.header { + height: 10vh; + display: flex; + padding-left: 2%; + padding-right: 2%; + font-family: playfair display, sans-serif; + font-weight: bold; +} + +.header .header-title { + font-size: 5vh; +} +.subheader-title { + font-size: 1.5vh; +} + +.header-logos { + margin-left: auto; +} +.header-logos img { + margin-left: 3vh !important; + max-height: 5vh; +} + + +/* Demo button css */ +.demo-button { + font-size: 1.5vh; + font-family: Open Sans, sans-serif; + text-decoration: none; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-radius: 8px; + font-weight: 700; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + color: #ffffff; + letter-spacing: 1.5px; + border: solid 1.5px transparent; + box-shadow: 2px 1000px 1px #0c0c0c inset; + background-image: linear-gradient(135deg, #7A76FF, #7A76FF, #7FE4FF); + -webkit-background-size: 200% 100%; + background-size: 200% 100%; + -webkit-background-position: 99%; + background-position: 99%; + background-origin: border-box; + transition: all .4s ease-in-out; + padding-top: 1vh; + padding-bottom: 1vh; + vertical-align: super; +} + +.demo-button:hover { + color: #7A76FF; + background-position: 0%; +} \ No newline at end of file diff --git a/apps/dash-pivottable/assets/dash.png b/apps/dash-pivottable/assets/dash.png deleted file mode 100644 index 9ed7cd16048d9edfd25eda43682bdaba43369ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17304 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 VZHA12E1=h)7s^`CN|h`_|1THltRw&c diff --git a/apps/dash-pivottable/assets/github.png b/apps/dash-pivottable/assets/github.png deleted file mode 100644 index ea6ff545a246caa64074ba809bbc86fcb8589071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4268 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 XLyRvu{aX3a{{tgEGu={c*U0|?Dtn-9 diff --git a/apps/dash-pivottable/assets/images/plotly-logo-light-theme.png b/apps/dash-pivottable/assets/images/plotly-logo-light-theme.png new file mode 100644 index 0000000000000000000000000000000000000000..4920c6e340b86d3b6ca4b5603e899020768ad352 GIT binary patch literal 30763 zcmZs?1yr2Pnl%cI2Z!M9?gR@O+}(m(aCZo9!CeyE-QC^Y8+W(h4!1dTzM22b+_kEq zo7L1?^2o0J>Tv?6+4j_sfg@T*pq$+J-9&zJf!jZAzqR%5A9dhKah#CXsZemF$~i0K2)ne;$reH z+I5_tUG6JQufQeei0y1dKzWG~dJj3qM-jy}(~49AUW0+=Up zpL=Dc*I85CTs@NvY8ERIv0;}-l`$v*kv_e)R(GkD#Xov@@2+^`kY!;v7tglgHY@dK zQ#+#K^4h4X+TYcmTow>ea3VX!lf=YC7mC#n9!xGH1&-}r_vHHr7B+~OgRI$qo{HF~ z%HLt}-P~TrWelDywle3)Ik68^A$jL8%a1baN#mvQzABGCp=LT+x^!DI{8@OP6Jsm; z1|S#w&$h`5C_unB1U}e|=q0hQBzb=2=w3Ja`>WQ6iPKKxm!Gh=9dDGtIOPSj~W{W-J4^Z<;3lT+T?iNzx7--D)%y!Kbu{N;>I zouctiM6Jy}bCLhCxgUF-2N`m0Slh3XqVwQ`c?X`MBB-T~-TmFxV^?;NiV zr@Q&IyN`4bsqcr*w&%dlUi&ieJ|;M~CxkpsPIEAs-fViYyq*0ouh(SP0s;gq1GYlJ zzGN(sHXdi!J+j-kIZ~8+F<@~2t8ocuEk|m1>+ut={OoNIDp74RUQ~De`FQpIDp{{x zdL{SrGiPbCvh5xVn-f>7TuaLxn|s+N^ZNc)wZ^r`swaVdDeL{>>Z~xFn}=K zWv7Kt)?&ZHYxzAM4%IjGN*lH6rQf%MI?Ds?b3>5`jx)L3�vNUu%(;ewduU+-%ln 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 literal 0 HcmV?d00001 diff --git a/apps/dash-pivottable/data.py b/apps/dash-pivottable/data/data.py similarity index 100% rename from apps/dash-pivottable/data.py rename to apps/dash-pivottable/data/data.py diff --git a/apps/dash-pivottable/requirements.txt b/apps/dash-pivottable/requirements.txt index 5f008311f..205e40f51 100644 --- a/apps/dash-pivottable/requirements.txt +++ b/apps/dash-pivottable/requirements.txt @@ -1,24 +1,4 @@ -Brotli==1.0.7 -certifi==2020.6.20 -click==7.1.2 -dash==1.14.0 -dash-core-components==1.10.2 -dash-html-components==1.0.3 -dash-pivottable==0.0.1 -dash-renderer==1.6.0 -dash-table==4.9.0 -Flask==1.1.2 -Flask-Compress==1.5.0 -future==0.18.2 -gunicorn==20.0.4 -itsdangerous==1.1.0 -Jinja2==2.11.2 -MarkupSafe==1.1.1 -numpy==1.19.1 -pandas==1.1.0 -plotly==4.9.0 -python-dateutil==2.8.1 -pytz==2020.1 -retrying==1.3.3 -six==1.15.0 -Werkzeug==1.0.1 +dash==2.4.1 +dash-pivottable==0.0.2 +pandas==1.4.2 +gunicorn==20.1.0 \ No newline at end of file diff --git a/apps/dash-pivottable/runtime.txt b/apps/dash-pivottable/runtime.txt index 257b314f5..cfa660c42 100644 --- a/apps/dash-pivottable/runtime.txt +++ b/apps/dash-pivottable/runtime.txt @@ -1 +1 @@ -python-3.7.6 \ No newline at end of file +python-3.8.0 \ No newline at end of file diff --git a/apps/dash-pivottable/utils/components.py b/apps/dash-pivottable/utils/components.py new file mode 100644 index 000000000..7d362de69 --- /dev/null +++ b/apps/dash-pivottable/utils/components.py @@ -0,0 +1,22 @@ +from dash import html + +def header(app, header_color, header, subheader=None, header_background_color="transparent"): + left_headers = html.Div( + [ + html.Div(header, className="header-title"), + html.Div(subheader, className="subheader-title"), + ], + style={"color": header_color} + ) + + logo = html.Img(src=app.get_asset_url("images/plotly-logo-light-theme.png")) + logo_link = html.A(logo, href="https://plotly.com/get-demo/", target="_blank") + demo_link = html.A( + "LEARN MORE", + href="https://plotly.com/dash/", + target="_blank", + className="demo-button", + ) + right_logos = html.Div([demo_link, logo_link], className="header-logos") + + return html.Div([left_headers, right_logos], className="header", style={"background-color": header_background_color}) \ No newline at end of file