Skip to content

Commit

Permalink
Add update_title functionality to Dash for R (#218)
Browse files Browse the repository at this point in the history
  • Loading branch information
rpkyle authored Jul 28, 2020
1 parent 1ee1e92 commit 607e210
Show file tree
Hide file tree
Showing 12 changed files with 220 additions and 38 deletions.
15 changes: 13 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,22 @@
All notable changes to `dash` will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).

## [0.7.0] - 2020-07-28
### Added
- Dash for R now supports an `update_title` parameter, as in Dash for Python. [#218](https://github.com/plotly/dashR/pull/218)

### Changed
- `dash-renderer` updated to v1.6.0
- Dash for R now depends on v4.9.0 of `dashTable` (provides several fixes from [#806](https://github.com/plotly/dash-table/pull/806), [#808](https://github.com/plotly/dash-table/pull/808) and [#809](https://github.com/plotly/dash-table/pull/809)) and v1.10.2 of `dashCoreComponents` (which updates Plotly.js to 1.54.7 via [#835](https://github.com/plotly/dash-core-components/pull/835)).

### Removed
- Dash for R no longer produces a warning when callbacks with no IDs are declared; see [#216](https://github.com/plotly/dashR/pull/216).

## [0.6.3] - 2020-06-25
**Changed**
### Changed
- `dash-renderer` updated to v1.5.1

**Fixed**
### Fixed
- Resolves a regression that prevented multiple loading states from displaying concurrently when a callback updates multiple outputs (for more details, see [#1310](https://github.com/plotly/dash/pull/1310)).

## [0.6.2] - 2020-06-19
Expand Down
10 changes: 5 additions & 5 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
Package: dash
Title: An Interface to the Dash Ecosystem for Authoring Reactive Web Applications
Version: 0.6.3
Version: 0.7.0
Authors@R: c(person("Chris", "Parmer", role = c("aut"), email = "chris@plotly.com"), person("Ryan Patrick", "Kyle", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-5829-9867"), email = "ryan@plotly.com"), person("Carson", "Sievert", role = c("aut"), comment = c(ORCID = "0000-0002-4958-2844")), person("Hammad", "Khan", role = c("aut"), email = "hammadkhan@plotly.com"), person(family = "Plotly Technologies", role = "cph"))
Description: A framework for building analytical web applications, Dash offers a pleasant and productive development experience. No JavaScript required.
Depends:
R (>= 3.0.2)
Imports:
dashHtmlComponents (== 1.0.3),
dashCoreComponents (== 1.10.1),
dashTable (== 4.8.1),
dashCoreComponents (== 1.10.2),
dashTable (== 4.9.0),
R6,
fiery (> 1.0.0),
routr (> 0.2.0),
Expand All @@ -33,8 +33,8 @@ Collate:
'print.R'
'internal.R'
Remotes: plotly/dash-html-components@e63acfa,
plotly/dash-core-components@5049379,
plotly/dash-table@9603c6c
plotly/dash-core-components@0770afb,
plotly/dash-table@75ac3d9
License: MIT + file LICENSE
Encoding: UTF-8
LazyData: true
Expand Down
19 changes: 13 additions & 6 deletions R/dash.R
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,16 @@ Dash <- R6::R6Class(
#' possible layout mis-specifications when registering a callback.
#' @param show_undo_redo Logical. Set to `TRUE` to enable undo and redo buttons for
#' stepping through the history of the app state.
#' @param update_title Character. Defaults to `Updating...`; configures the document.title
#' (the text that appears in a browser tab) text when a callback is being run.
#' Set to NULL or '' if you don't want the document.title to change or if you
#' want to control the document.title through a separate component or
#' clientside callback.
initialize = function(server = fiery::Fire$new(),
assets_folder = 'assets',
assets_url_path = '/assets',
assets_folder = "assets",
assets_url_path = "/assets",
eager_loading = FALSE,
assets_ignore = '',
assets_ignore = "",
serve_locally = TRUE,
meta_tags = NULL,
url_base_pathname = "/",
Expand All @@ -69,7 +74,8 @@ Dash <- R6::R6Class(
external_stylesheets = NULL,
compress = TRUE,
suppress_callback_exceptions = FALSE,
show_undo_redo = FALSE) {
show_undo_redo = FALSE,
update_title="Updating...") {

# argument type checking
assertthat::assert_that(inherits(server, "Fire"))
Expand All @@ -96,6 +102,7 @@ Dash <- R6::R6Class(
self$config$external_scripts <- external_scripts
self$config$external_stylesheets <- external_stylesheets
self$config$show_undo_redo <- show_undo_redo
self$config$update_title <- update_title

# ------------------------------------------------------------
# Initialize a route stack and register a static resource route
Expand Down Expand Up @@ -1669,7 +1676,7 @@ Dash <- R6::R6Class(
config <- sprintf("<script id='_dash-config' type='application/json'> %s </script>", to_JSON(self$config))

if (is.null(private$name))
private$name <- 'dash'
private$name <- 'Dash'

if (!is.null(private$custom_index)) {
string_index <- glue::glue(private$custom_index, .open = "{%", .close = "%}")
Expand All @@ -1687,7 +1694,7 @@ Dash <- R6::R6Class(
config <- sprintf("<script id='_dash-config' type='application/json'> %s </script>", to_JSON(self$config))

if (is.null(private$name))
private$name <- 'dash'
private$name <- 'Dash'

if (!is.null(private$custom_index)) {
string_index <- glue::glue(private$custom_index, .open = "{%", .close = "%}")
Expand Down
16 changes: 8 additions & 8 deletions R/internal.R
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@
all_files = FALSE),
class = "html_dependency"),
`dash-renderer-dev` = structure(list(name = "dash-renderer",
version = "1.5.1",
version = "1.6.0",
src = list(href = "https://unpkg.com/dash-renderer@1.5.1",
file = "lib/dash-renderer@1.5.1"),
file = "lib/dash-renderer@1.6.0"),
meta = NULL,
script = "dash-renderer/dash_renderer.dev.js",
stylesheet = NULL,
Expand All @@ -48,9 +48,9 @@
all_files = FALSE),
class = "html_dependency"),
`dash-renderer-map-dev` = structure(list(name = "dash-renderer",
version = "1.5.1",
version = "1.6.0",
src = list(href = "https://unpkg.com/dash-renderer@1.5.1",
file = "lib/dash-renderer@1.5.1"),
file = "lib/dash-renderer@1.6.0"),
meta = NULL,
script = "dash-renderer/dash_renderer.dev.js.map",
stylesheet = NULL,
Expand All @@ -60,9 +60,9 @@
all_files = FALSE),
class = "html_dependency"),
`dash-renderer-prod` = structure(list(name = "dash-renderer",
version = "1.5.1",
version = "1.6.0",
src = list(href = "https://unpkg.com/dash-renderer@1.5.1",
file = "lib/dash-renderer@1.5.1"),
file = "lib/dash-renderer@1.6.0"),
meta = NULL,
script = "dash-renderer/dash_renderer.min.js",
stylesheet = NULL,
Expand All @@ -72,9 +72,9 @@
all_files = FALSE),
class = "html_dependency"),
`dash-renderer-map-prod` = structure(list(name = "dash-renderer",
version = "1.5.1",
version = "1.6.0",
src = list(href = "https://unpkg.com/dash-renderer@1.5.1",
file = "lib/dash-renderer@1.5.1"),
file = "lib/dash-renderer@1.6.0"),
meta = NULL,
script = "dash-renderer/dash_renderer.min.js.map",
stylesheet = NULL,
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -34803,7 +34803,7 @@ var getLayoutCallbacks = function getLayoutCallbacks(graphs, paths, layout, opti
Exclusion of inputs happens when:
- an input is missing
- an input in the initial callback chain depends only on excluded inputs
Further execlusion might happen after callbacks return with:
Further exclusion might happen after callbacks return with:
- PreventUpdate
- no_update
*/
Expand Down Expand Up @@ -35507,7 +35507,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
* @param {string} location e.g. "prop", "context", "child context"
* @param {string} componentName Name of the component for error messages.
* @param {?Function} getStack Returns the component stack.
* @return {string} Any error messsage resulting from checking the types
* @return {string} Any error message resulting from checking the types
*/

function checkPropTypes(typeSpecs, values, location, componentName) {
Expand Down Expand Up @@ -35600,19 +35600,38 @@ var DocumentTitle = /*#__PURE__*/function (_Component) {
_classCallCheck(this, DocumentTitle);

_this = _super.call(this, props);
var update_title = props.config.update_title;
_this.state = {
initialTitle: document.title
title: document.title,
update_title: update_title
};
return _this;
}

_createClass(DocumentTitle, [{
key: "UNSAFE_componentWillReceiveProps",
value: function UNSAFE_componentWillReceiveProps(props) {
if (!this.state.update_title) {
// Let callbacks or other components have full control over title
return;
}

if (props.isLoading) {
document.title = 'Updating...';
this.setState({
title: document.title
});

if (this.state.update_title) {
document.title = this.state.update_title;
}
} else {
document.title = this.state.initialTitle;
if (document.title === this.state.update_title) {
document.title = this.state.title;
} else {
this.setState({
title: document.title
});
}
}
}
}, {
Expand All @@ -35631,11 +35650,15 @@ var DocumentTitle = /*#__PURE__*/function (_Component) {
}(react__WEBPACK_IMPORTED_MODULE_1__["Component"]);

DocumentTitle.propTypes = {
isLoading: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired
isLoading: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,
config: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({
update_title: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string
})
};
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(function (state) {
return {
isLoading: state.isLoading
isLoading: state.isLoading,
config: state.config
};
})(DocumentTitle));

Expand Down Expand Up @@ -38281,7 +38304,7 @@ var observer = {
return group.slice(0, -1);
}, Object(ramda__WEBPACK_IMPORTED_MODULE_0__["values"])(Object(ramda__WEBPACK_IMPORTED_MODULE_0__["groupBy"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__["getUniqueIdentifier"], Object(ramda__WEBPACK_IMPORTED_MODULE_0__["concat"])(watched, requested)))));
/*
3. Modify or remove callbacks that are outputing to non-existing layout `id`.
3. Modify or remove callbacks that are outputting to non-existing layout `id`.
*/

var _pruneCallbacks = Object(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__["pruneCallbacks"])(requested, paths),
Expand Down Expand Up @@ -38389,7 +38412,7 @@ var observer = {
// If there is no `stored` callback for the group, no outputs were dropped -> `cb` is kept
if (!cb.executionGroup || !pendingGroups[cb.executionGroup] || !pendingGroups[cb.executionGroup].length) {
return false;
} // Get all intputs for `cb`
} // Get all inputs for `cb`


var inputs = Object(ramda__WEBPACK_IMPORTED_MODULE_0__["map"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_3__["combineIdAndProp"], Object(ramda__WEBPACK_IMPORTED_MODULE_0__["flatten"])(cb.getInputs(paths))); // Get all the potentially updated props for the group so far
Expand Down Expand Up @@ -39189,7 +39212,7 @@ var CallbackActionType;
CallbackActionType["RemoveBlocked"] = "Callbacks.RemoveBlocked";
CallbackActionType["RemoveExecuted"] = "Callbacks.RemoveExecuted";
CallbackActionType["RemoveExecuting"] = "Callbacks.RemoveExecuting";
CallbackActionType["RemovePrioritized"] = "Callbacks.ReomvePrioritized";
CallbackActionType["RemovePrioritized"] = "Callbacks.RemovePrioritized";
CallbackActionType["RemoveRequested"] = "Callbacks.RemoveRequested";
CallbackActionType["RemoveStored"] = "Callbacks.RemoveStored";
CallbackActionType["RemoveWatched"] = "Callbacks.RemoveWatched";
Expand Down

Large diffs are not rendered by default.

Loading

0 comments on commit 607e210

Please sign in to comment.