Giter Club home page Giter Club logo

dashboards's Introduction

Jupyter

Read this in other languages: English, Español, Português, Français

Jupyter metapackage for installation and documents

Documentation structure

This documentation uses the Sphinx documentation engine.

The documentation is located in the docs/source folder. When you build the documentation, it will be placed in the docs/build folder. It is written in a combination of reStructuredText and MyST Markdown.

Build the documentation locally

There are a few ways to build the documentation; see below for instructions:

Build the documentation automatically with nox

The easiest way to build the documentation locally is by using the nox command line tool. This tool makes it easy to automate commands in a repository, and we have included a docs command to quickly install the dependencies and build the documentation.

To build and preview the site locally, follow these steps:

  1. Clone this repository.

    $ git clone https://github.com/jupyter/jupyter
    $ cd jupyter
  2. Install nox

    $ pip install nox
  3. Run the docs command

    $ nox -s docs

This will install the needed dependencies in a virtual environment using pip. It will then place the documentation in the docs/build/html folder. You may explore these HTML files in order to preview the site.

Create a live server to automatically preview changes

There is another nox command that will do the above, and also create a live server that watches your source files for changes, and auto-builds the website any time a change is made.

To start this live server, use the following nox command:

$ nox -s docs-live

When the build is finished, go to the URL that is displayed. It should show a live preview of your documentation.

To stop serving the website, press Ctrl-C in your terminal

Build the documentation manually

To build the documentation manually, follow these steps:

First, install the miniconda Python distribution.

Next, navigate to the /docs directory and create a conda environment:

conda env create -f environment.yml

Activate the environment:

source activate jupyter_docs

Build the docs using Sphinx with the following commands:

make clean
make html

The docs will be built in build/html. They can be viewed by opening build/html/index.html or starting an HTTP server and navigating to 0.0.0.0:8000 in your web browser.

python3 -m http.server

Releasing the jupyter metapackage

Anyone with push access to this repo can make a release of the Jupyter metapackage (this happens very rarely). We use tbump to publish releases.

tbump updates version numbers and publishes the git tag of the version. Our GitHub Actions then build the releases and publish them to PyPI.

The steps involved:

  1. Install tbump: pip install tbump
  2. Tag and publish the release tbump $NEW_VERSION.

That's it!

dashboards's People

Contributors

aluu317 avatar carreau avatar dalogsdon avatar ellisonbg avatar ftao avatar gnestor avatar jakirkham avatar jhpedemonte avatar jtyberg avatar lbustelo avatar lull3rskat3r avatar minrk avatar parente avatar rs2 avatar sterlinm avatar willingc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dashboards's Issues

Local Install Without Docker

Hi all,

I have been playing with IBM's dashboard following the README, thus deploying within a docker image. I was wondering if it is at all possible to setup the dashboard system on a normal JupyterHub install. For instance, does the docker image use a special fork of jupiter?

Dashboard layout is reset when going from notebook view to layout view on new notebook

  1. Create a new notebook with a few cells
  2. Enter dashboard layout view and arrange the cells
  3. Switch back to notebook view
  4. Switch back to dashboard layout view
  5. Note that the layout has not been preserved
  6. Repeat steps 1-2 above with a new notebook
  7. Save the notebook
  8. Refresh the page
  9. Switch to dashboard layout view
  10. Note that the layout is correct

Upon initial investigation it looks like Gridstack is not using saved layout coordinates for steps 1-5 above but is using saved layout coordinates for steps 6-10.

Make deployed dashboards secure, scalable

  • There's no API auth on the kernel provider at the moment (tmpnb, Jupyter)
  • There's no concept of authentication in the generated dashboard app
  • The original code is exposed in the dashboard frontend HTML and can be manipulated arbitrarily by any user

Long-term solution that probably involves:

  1. Using the jupyter-incubator/kernel-gateway remotely (or something like it) with proper API auth
  2. Writing a new kernel gateway client using jupyter-js-services
  3. Writing a new dashboard backend that acts as a proxy between the browser client that requests code execution and the kernel gateway.

Create a demo that uses other widget libraries in a dashboard

We need to show that dashboards don't only work with declarative widgets. Create a really simple demo that uses Bokeh or bqplot or ... whatever in a simple dashboard layout. Bonus: see if it can be deployed locally or if new, special hooks are required for the particular library.

Notebook user can include local files in deployed dashboard

The notebook author may want to include external files (e.g. HTML & CSS) without having to write the entire contents in a notebook cell. This works locally, but when the notebook is converted (and deployed) any links to local files will not work. There should be some way of "marking" files for inclusion during conversion.

Example cell linking files:

    %%html
    <link rel="stylesheet" type="text/css" href="main.css">
    <link rel="import" href="elements.html">

Some ideas:

  1. Cell magics for including files

    %%converter include "elements.html", "main.css"
    
    • or -
    %%linkcss "main.css"
    %%linkhtml "elements.html"
    

    The %%link* magics automatically insert the correct html tag, as well as being used to notify the converter.

  2. UI component for manually selecting files to include

Outreach demo should filter tracked meetups

  1. Left-side upcoming meetups panel is tracking meetup A
  2. User 1 appears in the right-side meetup candidates because he/she RSVPs for meetup A (hmm ...)

To be more realistic, I think we'd want to filter user 1 from the candidate list. We don't want to bother a user who just registered for a meetup one of our meetups to register again for another meetup right away.

Contents can overflow dashboard cell boundaries, overlap other cells

In Layout mode,

  1. Add cells to be displayed in View mode.
  2. Resize one of the cells to a much larger size, such that it overlaps existing cells.
  3. The overlapped cells are now underneath the enlarged cell.
  4. I now have to reposition all the overlapped cells.

When I resize a cell to make it larger, I think I'd like any cells that are being overlapped to be pushed beneath the one I'm enlarging. Less work for me.

Create a boilerplate sentiment dashboard notebook

Once we've got one example under our belt in the form of the community sentiment dashboard (issue #14), create a new notebook that tears it down to the barebones widget definitions and layouts. Document the structure of the data required by these widgets and how it must be bound to them. Then fill in very simple "hello world" versions of functions / DataFrames that generate fake data just so the notebook runs top to bottom.

The notebook should be very tutorial-like and walk people through what bits they need to replace and what bits stay. The goal is to demonstrate how UI doesn't have to be rewritten again and again for very similar use cases where only the domain data differs.

Gridstack: Fire onresizestop after CSS transition

gridstack/gridstack.js#159

When resizing a gridstack cell, the onresizestop event is fired on mouse up before the CSS transition to snap to the grid completes. This results in incorrect element dimensions when performing sizing calculations based on this event.

To work around this issue, we added a setTimeout to wait until a cell completes its CSS width/height transition before firing an iron-resize event to Polymer output elements.

Support resizable elements within dashboard cells

The some urth widgets need to update their internal dimensions when their container is resized. This requires that we have some sort of event/notification other than window.onResize().

Our current idea is as follows: There exists PolymerElement/iron-resizable-behavior, which adds a notifyResize() method to the element. We can listen in dashboard for when a cell is resized, then find any polymer elements contained within, and if they implement this behavior, we notifyResize on them so that they can then resize appropriately.

The problem from the Dashboard side is how do we query for Polymer elements and find out if they implement/mixin the iron-resizable-behavior?

Move to 4.x notebook as the minimum requirement

We put off moving the code in this repo to supporting the post-Big Split version of the notebook until we understood the future intersection of the work here with the future version of notebook based on Phosphor. After meeting with @sccolbert, @ellisonbg and others about that topic, we agreed that pushing the dashboard layout implementation into jupyter/notebook ahead of the phosphor port of notebook doesn't make much sense: it'll all need to be redesigned and reimplemented later in the context of the more pluggable notebook. That said, it looks like the jQuery-based notebook will be around for a while longer as work proceeds on the Phosphor-based UI encompassing all the current pieces of Jupyter Notebook.

In the interest of keeping the dashboard (and declarative widgets) concepts relevant along the way, we should invest the time in making them 4.x compatible. I suspect that by 4.x compatible, I really mean "any version post-Big Split compatible" since even if the notebook version numbers jump to 5.x, 6.x, etc. major UI changes aren't likely to land in the classic, jQuery impl, but rather in the PhosphorJS one. So, hopefully, migrating the extensions should be a one time cost.

All that said, we agreed that once there's some flavor of Phosphor in Jupyter Notebook, we will collaborate on how dashboards and other incubator features start to plug into that new foundation.

Deployed sibling polymer element can't find bower installed elements

For the Meetup Outreach demo, we moved some of our code out to HTML files which are siblings of the notebook file. We then import them like so:

%%html
<link rel="import" href="./dynamic-list.html">
<link rel="import" href="./upcoming-meetups.html">

The top of each of those HTML files has something like this:

<link rel="import" href="/urth_components/iron-list/iron-list.html"
    is="urth-core-import" package="PolymerElements/iron-list">
<link rel="import" href="/urth_components/paper-toggle-button/paper-toggle-button.html"
    is="urth-core-import" package="PolymerElements/paper-toggle-button#v1.0.10">
<link rel="import" href="/urth_components/paper-material/paper-material.html"
    is="urth-core-import" package="PolymerElements/paper-material">

<dom-module id="upcoming-meetups">
...

This works well in the Notebook, but doesn't when we deploy. We get the following error:

GET http://192.168.99.100:9500/files/local_dashboards/meetup-outreach/static/urth_components/iron-list/iron-list.html 404 (Not Found)

Tooltip or hint area for new users of dashboard layout

Need to document a few high-level suggestions somewhere:

  • Hover to see icons
  • Resize cells
  • Eyeball icons
  • Hotkey modifier for dragging cells by clicking anywhere (issue #52)
  • etc.

Ideas:

Tooltip / popover that shows on first visit to layout mode in a notebook (set a global), but requires a click on an icon near the Dashboard section of the toolbar thereafter.

Meetup outreach business dashboard scenario demo / tutorial

Goal: Have a demo based on a real business scenario that incorporates these key points:

  • Shows real-time processing
  • Surfaces insights
  • Allows the user to take action
  • Allows the user to see results of actions
  • Can apply to meetup.com topics
  • Can apply to other data sources / domains entirely (with coding)

Why: Demonstrate how notebooks can be used to prototype dashboards before further investment. Provide it as a tutorial / demo for the community to play with.

Scenario

I need to drive new sign-ups to my website. One way to do that is to increase attendance at meetups I organize at meetup.com. I want to try to entice people:

  1. Who are interested in relevant tech topics
  2. While they're thinking about meetups
  3. Who are likely to attend a meetup at a given location

To target these users specifically, I'd need to know:

  • What related meetups are upcoming? (meetup.com search API)
    • Where are the venues?
    • What's their current RSVP count?
    • UI: Columns or buckets or ... with meetup metadata at the top (name, location, number of RSVPs so far, ...)
  • Are there venues for which folks are RSVPing close to any of my meetups? (meetup.com stream API)
    • Close in location? (don't bother people that aren't coming near my meetup)
    • Close in time? (boost people that will be near my meetup when it is occurring)
    • Close in topic? (don't bother people not interested in topics related to my meetup + boost people that are interested in specific topics ...)
    • UI: maybe a widget to set the distance threshold (but not science-y widgets for setting topic relevancy ...)
    • Analytics: compute relevancy of RSVPer against all of my meetups (distance between other venue and my venue, distance between venue and where the person lives, topic of venue overlap with my venu, topic of interest to user overlap with my venue, ...)
  • Who are the people RSVPing nearby to my venues? (meetup.com member profile API + metadata from RSVP stream API)
    • What is the other meetup?
    • How close is the other venue to my venue?
    • How close is the other venue to the user?
    • What are their names?
    • What are their meetup topic interests?
    • UI: put users with above some threshold relevancy into appropriate buckets including info about the user and the other meetup (name, location, other meetup just RSVPed to, interests, link to member page to start a message to user, link to other meetup page to study details / contact meetup organizer)

Once I identify these users, I may want to:

  • Inform them soon that they might also be interested in one of my meetups nearby.
    • There is a "Start a discussion link" in the meet-up UI where humans can craft notes to other humans. not sure if "i saw you were attending X, you might also check out Y" in a personal note is abuse or not.
  • Contact the group offering the other meet-up to run a cross-post campaign (e.g., if I see lots of people also attending that meetup)
    • Same thing: can contact organizer via the meetup page

After I take these actions, I certainly want to:

  • See if any of the contacted users do indeed register for my meetup.
    • UI: Once user message link is clicked, user bucket entry shows an icon indicating the user was contacted
  • See if there is an uptick in my meetup RSVPs possibly due to my actions.
    • UI: if any user that I contacted appears in the RSVP stream as a "yes" for any of my meetups, that is called out in the UI (turn user gold, put it in a "win" bucket, whatever)

Multiple Instances of Dom Nodes In Dashboard View

When working with the Commnunity Sentiment Notebook multiple dom nodes are created for the urth-core-function elements in dashboard view. It appears there are multiple instances of the notebook represented in gridstack, as well as duplication of the cells within a given output area.

When I reference an element by its id, I see an array returned.
multiple dom nodes

The dom nodes are in the page in various places
One by itself:
first dom node

And two within the same output area
dom nodes within same output

The kicker is I can reproduce using the following code in that notebook:

%%html
<div id='baz'></div>
//i in dashboard mode
baz.length === 2 // true

However, if I start in a fresh notebook the problem doesn't happen.

Converter should put converted files into "dot" folder

Currently, when doing File>Deploy as>Local Dashboard, the converted files are added to the notebook server at the top level, as siblings to existing files and folders. This makes things very confusing when looking at the Notebook tree.

A better solution would be to have a top level folder called "converted" or "local_dashboards", where all the files reside.

Make Meetup Outreach demo more parallelizable (remove use of globals)

The Meetup Outreach demo (see issue #30) makes extensive use of globals in the Python code. While this works well when running the demo locally, it doesn't allow us to make good use of distributed nodes.

We need to replace the use of globals through the use of map/reduce and broadcast vars & accumulators.

Deployed dashboard errors out when trying to use Urth widgets channel

To recreate:

  • Create a new dashboard with this code cell:
from urth.widgets.widget_channels import channel
channel('foobar').set('baz', 'awesome');
  • Run File > Deploy as > Local Dashboard.
  • Open browser error console and notice this error:
AttributeError                            Traceback (most recent call last)
<ipython-input-1-9054bc59971b> in <module>()
      1 from urth.widgets.widget_channels import channel
----> 2 channel('foobar').set('baz', 'awesome');

/opt/conda/lib/python3.4/site-packages/urth/widgets/widget_channels.py in set(self, key, value, **kwargs)
     75     def set(self, key, value, **kwargs):
     76         global the_channels
---> 77         the_channels.set(key, value, self.chan, **kwargs)
     78 
     79     def watch(self, key, handler):

AttributeError: 'NoneType' object has no attribute 'set'

@lbustelo says that the channel code is initialized when the notebook receives a kernel ready event. I think we may be executing all code cells before that can happen. Perhaps this is due to how we invoke executeAll in main.js -- need to wait for Urth widgets to fully initialize?

500 error (sometimes) when converting to dashboard

The critical bit is in the render of the jinja template:

jinja2.exceptions.UndefinedError: \'IPython.nbformat.notebooknode.NotebookNode object\' has no attribute \'layout\

Best guess: the layout loop var is not defined on all iteration of the loop.

[E 17:47:53.751 NotebookApp] Uncaught exception GET /user/9RDX2WXLAjPc/bundle?type=dashboard&notebook=got_scotch_demo%2Fscotch_dashboard.ipynb (::ffff:45.37.178.151)
    HTTPServerRequest(protocol='http', host='jupyter.cloudet.xyz', method='GET', uri='/user/9RDX2WXLAjPc/bundle?type=dashboard&notebook=got_scotch_demo%2Fscotch_dashboard.ipynb', version='HTTP/1.1', remote_ip='::ffff:45.37.178.151', headers={'Accept-Encoding': 'gzip, deflate, sdch', 'Connection': 'close', 'X-Forwarded-For': '::ffff:45.37.178.151', 'Cookie': '_gat=1; _ga=GA1.2.1320566523.1442145202', 'X-Forwarded-Port': '80', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Referer': 'http://jupyter.cloudet.xyz/user/9RDX2WXLAjPc/notebooks/got_scotch_demo/scotch_dashboard.ipynb', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36', 'Upgrade-Insecure-Requests': '1', 'X-Forwarded-Proto': 'http', 'Accept-Language': 'en-US,en;q=0.8', 'Host': 'jupyter.cloudet.xyz'})
    Traceback (most recent call last):
      File "/opt/conda/lib/python3.4/site-packages/tornado/web.py", line 1413, in _execute
        result = method(*self.path_args, **self.path_kwargs)
      File "/opt/conda/lib/python3.4/site-packages/tornado/web.py", line 2721, in wrapper
        return method(self, *args, **kwargs)
      File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/nbexts/bundle_handler.py", line 58, in get
        self._get_local_app(abs_nb_path)
      File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/nbexts/bundle_handler.py", line 251, in _get_local_app
        md = self._create_app_bundle(abs_nb_path, bundle_root=os.path.join(self.nb_dir, 'local_dashboards'), overwrite=True, template_fn='local.tpl')
      File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/nbexts/bundle_handler.py", line 133, in _create_app_bundle
        converter.to_php_app(abs_nb_path, bundle_dir, template_fn)
      File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/converter/__init__.py", line 48, in to_php_app
        full_output = to_thebe_html(notebook_fn, {}, 'html', os.getcwd(), template_fn)
      File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/converter/__init__.py", line 235, in to_thebe_html
        raise RuntimeError('nbconvert wrote to stderr: {}'.format(stderr))
    RuntimeError: nbconvert wrote to stderr: b'Traceback (most recent call last):\n  File "/opt/conda/bin/ipython", line 6, in <module>\n    sys.exit(start_ipython())\n  File "/opt/conda/lib/python3.4/site-packages/IPython/__init__.py", line 120, in start_ipython\n    return launch_new_instance(argv=argv, **kwargs)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/config/application.py", line 574, in launch_instance\n    app.start()\n  File "/opt/conda/lib/python3.4/site-packages/IPython/terminal/ipapp.py", line 367, in start\n    return self.subapp.start()\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/nbconvertapp.py", line 278, in start\n    self.convert_notebooks()\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/nbconvertapp.py", line 401, in convert_notebooks\n    self.convert_single_notebook(notebook_filename)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/nbconvertapp.py", line 372, in convert_single_notebook\n    output, resources = self.export_single_notebook(notebook_filename, resources)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/nbconvertapp.py", line 324, in export_single_notebook\n    output, resources = self.exporter.from_filename(notebook_filename, resources=resources)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/exporters/exporter.py", line 156, in from_filename\n    return self.from_notebook_node(nbformat.read(f, as_version=4), resources=resources, **kw)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/exporters/html.py", line 65, in from_notebook_node\n    return super(HTMLExporter, self).from_notebook_node(nb, resources, **kw)\n  File "/opt/conda/lib/python3.4/site-packages/IPython/nbconvert/exporters/templateexporter.py", line 214, in from_notebook_node\n    output = self.template.render(nb=nb_copy, resources=resources)\n  File "/opt/conda/lib/python3.4/site-packages/jinja2/environment.py", line 989, in render\n    return self.environment.handle_exception(exc_info, True)\n  File "/opt/conda/lib/python3.4/site-packages/jinja2/environment.py", line 754, in handle_exception\n    reraise(exc_type, exc_value, tb)\n  File "/opt/conda/lib/python3.4/site-packages/jinja2/_compat.py", line 37, in reraise\n    raise value.with_traceback(tb)\n  File "/opt/conda/lib/python3.4/site-packages/urth/dashboard/converter/jinja_templates/thebe.tpl", line 83, in top-level template code\n    data-gs-x={{layout.col}} data-gs-y={{layout.row}}\n  File "/opt/conda/lib/python3.4/site-packages/jinja2/environment.py", line 408, in getattr\n    return getattr(obj, attribute)\njinja2.exceptions.UndefinedError: \'IPython.nbformat.notebooknode.NotebookNode object\' has no attribute \'layout\'\n\nIf you suspect this is an IPython bug, please report it at:\n    https://github.com/ipython/ipython/issues\nor send an email to the mailing list at [email protected]\n\nYou can print a more detailed traceback right now with "%tb", or use "%debug"\nto interactively debug it.\n\nExtra-detailed tracebacks for bug-reporting purposes can be enabled via:\n    c.Application.verbose_crash=True\n\n'
[E 17:47:53.759 NotebookApp] {
      "Accept-Encoding": "gzip, deflate, sdch",
      "Connection": "close",
      "X-Forwarded-For": "::ffff:45.37.178.151",
      "Cookie": "_gat=1; _ga=GA1.2.1320566523.1442145202",
      "X-Forwarded-Port": "80",
      "X-Forwarded-Proto": "http",
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Referer": "http://jupyter.cloudet.xyz/user/9RDX2WXLAjPc/notebooks/got_scotch_demo/scotch_dashboard.ipynb",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36",
      "Upgrade-Insecure-Requests": "1",
      "Accept-Language": "en-US,en;q=0.8",
      "Host": "jupyter.cloudet.xyz"
    }
[E 17:47:53.759 NotebookApp] 500 GET /user/9RDX2WXLAjPc/bundle?type=dashboard&notebook=got_scotch_demo%2Fscotch_dashboard.ipynb (::ffff:45.37.178.151) 970.95ms referer=http://jupyter.cloudet.xyz/user/9RDX2WXLAjPc/notebooks/got_scotch_demo/scotch_dashboard.ipynb

Top level index.ipynb guide to all demo / test notebooks

We've got a slew of content. Users need a roadmap. This should be something like the index.ipynb we put on jupyter.cloudet.xyz but specific to all the notebooks in this repo. The guide should suggest a sequence of reading through them to learn about dashboards and give a brief description of each to avoid having the user open each one to learn what it is.

Tutorial For Community Sentiment Notebook

Scenario: Create a notebook to give an overview of community sentiment about a project. This notebook should show the community sentiment for a open source project on github. This demo should be streaming.

  • Github project demo
    • Collect metrics for positive sentiment
      • Collect closed pull requests over x amount of time
      • Collect issues with activity over y amount of time
    • Collect metrics for negative sentiment
      • Pending pull requests over x amount of time
      • Collect issues with no activity over y amount of time
    • Calculate sentiment from the above metrics
    • Display the sentiment of the project visually
    • Add streaming support
    • Don't use red/green scheme (colorblindness)

Single-column dashboard reorders DOM nodes

When in layout/view dashboard, decrease the window width so the layout becomes single-column and then to back to normal width. Switch back to notebook view and observe the cells are out of order.

It looks like gridstack is rearranging the DOM nodes at the smallest width breakpoint. We need to disable that.

This is related to a larger issue of how to do responsive dashboard layouts.

Report mode

I have a few lengthy notebooks, each with a large number of cells, and I want to surface more cells than would fit in a single screen dashboard view. So what I want to show is more like a report than a dashboard.

Say out of 100 cells, I want to select 20 to show up when I switch to View Dashboard. I don't really want to layout the cells, I just want to display them top to bottom, in the same order they show up in Notebook mode.

Ideally, I would be able to select which cells to display while in Notebook mode, by clicking something (icon?) in the top right corner of the cell. Then I could switch to View Dashboard mode to see the result. Layout Dashboard would not be necessary in this case.

Add toolbar buttons to select Dashboard view mode

We frequently use the menu items for selecting a Dashboard view mode ('notebook', 'layout dashboard', 'view dashboard'). It may be beneficial to add a button group to the notebook toolbar to more quickly select a view mode.

Dragging dashboard cells does not recompute page height

Resizing, hiding, and showing dashboard cells causes the page height to recompute, but moving a dashboard cell does not.

This could be as simple as calling the resize function after the Gridstack dragstop event as we do with the resizestop event.

Taxi demo no longer autoloads table data

The taxi demo notebook should autoload table data as it hooks up a paper-menu with pre-selected item to an urth-core-function with an auto attribute.

This used to load the table whose data is set by the auto function so that the data is initially visible without user interaction to pick a dataset.

Not sure if this is a dashboard or declarative widgets issue.

Put cells at bottom of dashboard with full width when moving hidden -> showing

In Layout mode, when I 'Add' a cell from the Hidden Cells section, it moves to the top section, but the cell is automatically sized and positioned in this top section (to optimize space).

If my notebook has quite a few cells, I may add several of them from the Hidden Cells section. When I scroll up, I am disoriented by the lack of order of the newly added cells. I may add a couple of plots, along with some markdown or other output cells to go along with them, but they all become jumbled, and I have to mentally piece the cell puzzle back together.

Admittedly, this is probably only an issue for "dashboards" with quite a few cells. Still, I'd like the option of turning off the auto-layout. When I add a hidden cell, it just gets placed full-width below the existing shown cells. I think this would lend itself to less effort in attaining the final layout.

Remove host dependency on bower

We already have the bower requirement within our dev docker container to support urth-widgets. We can piggy back on this to do the minimal bower install for our own dev purposes. Probably just involves a few swizzles in the Makefile. Pay off: you don't need node/bower installed on the host.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.