diff --git a/.Rbuildignore b/.Rbuildignore
index c687d3d2..9f59af9a 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -7,3 +7,5 @@ todo\.txt
.github
tests/integration
tests/circleci
+gulp-assets
+node_modules
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 6c6f49b7..a92f615f 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -67,6 +67,4 @@ workflows:
version: 2
build:
jobs:
- - "test":
- context:
- - dash-docker-hub
+ - "test"
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000..b790e292
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,126 @@
+{
+ "extends": ["eslint:recommended", "prettier"],
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "arrowFunctions": true,
+ "blockBindings": true,
+ "classes": true,
+ "defaultParams": true,
+ "destructuring": true,
+ "forOf": true,
+ "generators": true,
+ "modules": true,
+ "templateStrings": true,
+ "jsx": true
+ }
+ },
+ "env": {
+ "browser": true,
+ "es6": true,
+ "jasmine": true,
+ "jest": true,
+ "node": true
+ },
+ "globals": {
+ "jest": true
+ },
+ "plugins": [
+ "react",
+ "import"
+ ],
+ "rules": {
+ "accessor-pairs": ["error"],
+ "block-scoped-var": ["error"],
+ "consistent-return": ["error"],
+ "curly": ["error", "all"],
+ "default-case": ["error"],
+ "dot-location": ["off"],
+ "dot-notation": ["error"],
+ "eqeqeq": ["error"],
+ "guard-for-in": ["off"],
+ "import/export": "error",
+ "import/named": ["off"],
+ "import/namespace": ["off"],
+ "import/no-duplicates": ["error"],
+ "import/no-named-as-default": ["error"],
+ "import/no-unresolved": ["off"],
+ "new-cap": ["error", {
+ "capIsNewExceptionPattern": "Immutable\\.*"
+ }],
+ "no-alert": ["off"],
+ "no-caller": ["error"],
+ "no-case-declarations": ["error"],
+ "no-console": ["error"],
+ "no-div-regex": ["error"],
+ "no-dupe-keys": ["error"],
+ "no-else-return": ["error"],
+ "no-empty-pattern": ["error"],
+ "no-eq-null": ["error"],
+ "no-eval": ["error"],
+ "no-extend-native": ["error"],
+ "no-extra-bind": ["error"],
+ "no-extra-boolean-cast": ["error"],
+ "no-inline-comments": ["off"],
+ "no-implicit-coercion": ["error"],
+ "no-implied-eval": ["error"],
+ "no-inner-declarations": ["off"],
+ "no-invalid-this": ["error"],
+ "no-iterator": ["error"],
+ "no-labels": ["error"],
+ "no-lone-blocks": ["error"],
+ "no-loop-func": ["error"],
+ "no-multi-str": ["error"],
+ "no-native-reassign": ["error"],
+ "no-new": ["error"],
+ "no-new-func": ["error"],
+ "no-new-wrappers": ["error"],
+ "no-param-reassign": ["off"],
+ "no-process-env": ["warn"],
+ "no-proto": ["error"],
+ "no-redeclare": ["error"],
+ "no-return-assign": ["error"],
+ "no-script-url": ["error"],
+ "no-self-compare": ["error"],
+ "no-sequences": ["error"],
+ "no-shadow": ["off"],
+ "no-throw-literal": ["error"],
+ "no-unused-expressions": ["error"],
+ "no-use-before-define": ["error", "nofunc"],
+ "no-useless-call": ["error"],
+ "no-useless-concat": ["error"],
+ "no-with": ["error"],
+ "prefer-const": ["error"],
+ "radix": ["error"],
+ "react/jsx-no-duplicate-props": ["error"],
+ "react/jsx-no-undef": ["error"],
+ "react/jsx-uses-react": ["error"],
+ "react/jsx-uses-vars": ["error"],
+ "react/no-did-update-set-state": ["error"],
+ "react/no-direct-mutation-state": ["error"],
+ "react/no-is-mounted": ["error"],
+ "react/no-unknown-property": ["error"],
+ "react/prefer-es6-class": ["error", "always"],
+ "react/prop-types": "error",
+ "valid-jsdoc": ["off"],
+ "yoda": ["error"],
+ "spaced-comment": ["error", "always", {
+ "block": {
+ "exceptions": ["*"]
+ }
+ }],
+ "no-unused-vars": ["error", {
+ "args": "after-used",
+ "argsIgnorePattern": "^_",
+ "caughtErrorsIgnorePattern": "^e$"
+ }],
+ "no-magic-numbers": ["error", {
+ "ignoreArrayIndexes": true,
+ "ignore": [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 10, 16, 0.5, 25]
+ }],
+ "no-underscore-dangle": ["off"],
+ "no-useless-escape": ["off"]
+ }
+}
diff --git a/.gitignore b/.gitignore
index 3f2b95ac..233490df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,9 @@
.RData
.DS_Store
+dash-core-components/
+dash-html-components/
+dash-table/
node_modules/
python/
todo.txt
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..eb81a49a
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "tabWidth": 4,
+ "singleQuote": true,
+ "bracketSpacing": false,
+ "trailingComma": "es5"
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4df6056f..e6369863 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,28 @@
All notable changes to `dash` will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
+## [1.0.0] - 2021-03-04
+### Changed
+- Unify the core Dash packages (dash, dashCoreComponents, dashHtmlComponents, dashTable) for streamlined maintenance and accessibility. The namespaces of these packages will be combined under the `dash` namespace, and all artifacts from the ancillary dash packages will be included with Dash for R. [#243](https://github.com/plotly/dashr/pull/243)
+
+### Fixed
+- Minor fix for favicon issue continued from [#240](https://github.com/plotly/dashr/pull/240) (for more details, see [#243](https://github.com/plotly/dashR/pull/243#issuecomment-842813526)).
+
+## [0.9.1] - 2020-11-16
+### Fixed
+- A regression which prevented favicons from displaying properly has been resolved, and a default Dash favicon is now supplied when none is provided in the `assets` directory. [#240](https://github.com/plotly/dashr/pull/240)
+
+## [0.9.0] - 2020-10-31
+### Fixed
+- Fixes a minor bug in `setCallbackContext` (described in [#236](https://github.com/plotly/dashR/issues/236)) which prevented pattern-matching callbacks from working properly if one or more `input` statements did not include a selector. [#237](https://github.com/plotly/dashR/pull/237)
+
+### Changed
+
+- Dash for R now depends on v1.1.1 of `dashHtmlComponents`
+- Dash for R now depends on v1.13.0 of `dashCoreComponents`
+- Dash for R now depends on v4.11.0 of `dashTable`
+- `dash-renderer` version is now v1.8.3
+
## [0.8.0] - 2020-10-27
### Fixed
- Usage of `glue` has been corrected to address [#232](https://github.com/plotly/dashR/issues/232) via [#233](https://github.com/plotly/dashR/pull/233).
diff --git a/DESCRIPTION b/DESCRIPTION
index 7c32031c..59171370 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,14 +1,11 @@
Package: dash
Title: An Interface to the Dash Ecosystem for Authoring Reactive Web Applications
-Version: 0.8.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"), comment = c(ORCID = "0000-0003-2479-9841"), email = "hammadkhan@plotly.com"), person(family = "Plotly Technologies", role = "cph"))
+Version: 1.0.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"), comment = c(ORCID = "0000-0003-2479-9841"), 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.2),
- dashTable (== 4.9.0),
R6,
fiery (> 1.0.0),
routr (> 0.2.0),
@@ -25,17 +22,6 @@ Imports:
glue
Suggests:
testthat
-Collate:
- 'utils.R'
- 'dependencies.R'
- 'dash-package.R'
- 'dash.R'
- 'imports.R'
- 'print.R'
- 'internal.R'
-Remotes: plotly/dash-html-components@e63acfa,
- plotly/dash-core-components@0770afb,
- plotly/dash-table@75ac3d9
License: MIT + file LICENSE
Encoding: UTF-8
LazyData: true
diff --git a/NAMESPACE b/NAMESPACE
index c347d660..c8e3960b 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -10,8 +10,6 @@ export(dashNoUpdate)
export(input)
export(output)
export(state)
-import(dashCoreComponents)
-import(dashHtmlComponents)
importFrom(R6,R6Class)
importFrom(assertthat,assert_that)
importFrom(base64enc,base64encode)
@@ -34,3 +32,172 @@ importFrom(routr,ressource_route)
importFrom(stats,setNames)
importFrom(tools,file_ext)
importFrom(utils,getFromNamespace)
+
+# dashCoreComponents exports appended by `npm unify` command: do not edit by hand
+
+export(dccChecklist)
+export(dccClipboard)
+export(dccConfirmDialog)
+export(dccConfirmDialogProvider)
+export(dccDatePickerRange)
+export(dccDatePickerSingle)
+export(dccDownload)
+export(dccDropdown)
+export(dccGraph)
+export(dccInput)
+export(dccInterval)
+export(dccLink)
+export(dccLoading)
+export(dccLocation)
+export(dccLogoutButton)
+export(dccMarkdown)
+export(dccRadioItems)
+export(dccRangeSlider)
+export(dccSlider)
+export(dccStore)
+export(dccTab)
+export(dccTabs)
+export(dccTextarea)
+export(dccUpload)
+
+
+# dashHtmlComponents exports appended by `npm unify` command: do not edit by hand
+
+export(htmlA)
+export(htmlAbbr)
+export(htmlAcronym)
+export(htmlAddress)
+export(htmlArea)
+export(htmlArticle)
+export(htmlAside)
+export(htmlAudio)
+export(htmlB)
+export(htmlBase)
+export(htmlBasefont)
+export(htmlBdi)
+export(htmlBdo)
+export(htmlBig)
+export(htmlBlink)
+export(htmlBlockquote)
+export(htmlBr)
+export(htmlButton)
+export(htmlCanvas)
+export(htmlCaption)
+export(htmlCenter)
+export(htmlCite)
+export(htmlCode)
+export(htmlCol)
+export(htmlColgroup)
+export(htmlCommand)
+export(htmlContent)
+export(htmlData)
+export(htmlDatalist)
+export(htmlDd)
+export(htmlDel)
+export(htmlDetails)
+export(htmlDfn)
+export(htmlDialog)
+export(htmlDiv)
+export(htmlDl)
+export(htmlDt)
+export(htmlElement)
+export(htmlEm)
+export(htmlEmbed)
+export(htmlFieldset)
+export(htmlFigcaption)
+export(htmlFigure)
+export(htmlFont)
+export(htmlFooter)
+export(htmlForm)
+export(htmlFrame)
+export(htmlFrameset)
+export(htmlH1)
+export(htmlH2)
+export(htmlH3)
+export(htmlH4)
+export(htmlH5)
+export(htmlH6)
+export(htmlHeader)
+export(htmlHgroup)
+export(htmlHr)
+export(htmlI)
+export(htmlIframe)
+export(htmlImg)
+export(htmlIns)
+export(htmlIsindex)
+export(htmlKbd)
+export(htmlKeygen)
+export(htmlLabel)
+export(htmlLegend)
+export(htmlLi)
+export(htmlLink)
+export(htmlListing)
+export(htmlMain)
+export(htmlMapEl)
+export(htmlMark)
+export(htmlMarquee)
+export(htmlMeta)
+export(htmlMeter)
+export(htmlMulticol)
+export(htmlNav)
+export(htmlNextid)
+export(htmlNobr)
+export(htmlNoscript)
+export(htmlObjectEl)
+export(htmlOl)
+export(htmlOptgroup)
+export(htmlOption)
+export(htmlOutput)
+export(htmlP)
+export(htmlParam)
+export(htmlPicture)
+export(htmlPlaintext)
+export(htmlPre)
+export(htmlProgress)
+export(htmlQ)
+export(htmlRb)
+export(htmlRp)
+export(htmlRt)
+export(htmlRtc)
+export(htmlRuby)
+export(htmlS)
+export(htmlSamp)
+export(htmlScript)
+export(htmlSection)
+export(htmlSelect)
+export(htmlShadow)
+export(htmlSlot)
+export(htmlSmall)
+export(htmlSource)
+export(htmlSpacer)
+export(htmlSpan)
+export(htmlStrike)
+export(htmlStrong)
+export(htmlSub)
+export(htmlSummary)
+export(htmlSup)
+export(htmlTable)
+export(htmlTbody)
+export(htmlTd)
+export(htmlTemplate)
+export(htmlTextarea)
+export(htmlTfoot)
+export(htmlTh)
+export(htmlThead)
+export(htmlTime)
+export(htmlTitle)
+export(htmlTr)
+export(htmlTrack)
+export(htmlU)
+export(htmlUl)
+export(htmlVar)
+export(htmlVideo)
+export(htmlWbr)
+export(htmlXmp)
+
+
+# dashTable exports appended by `npm unify` command: do not edit by hand
+
+export(dashDataTable)
+
+export(df_to_list)
diff --git a/R/dash.R b/R/dash.R
index bca7936c..8dcba7be 100644
--- a/R/dash.R
+++ b/R/dash.R
@@ -50,7 +50,7 @@ Dash <- R6::R6Class(
#' as `integrity` and `crossorigin`.
#' @param external_stylesheets List. An optional list of valid URLs from which
#' to serve CSS for rendered pages. Each entry can be a string (the URL) or a list
- #' with `href` (the URL) and optionally other `` tag attributes such as
+ #' with `href` (the URL) and optionally other `` tag attributes such as
#' `rel`, `integrity` and `crossorigin`.
#' @param compress Logical. Whether to try to compress files and data served by Fiery.
#' By default, `brotli` is attempted first, then `gzip`, then the `deflate` algorithm,
@@ -116,7 +116,7 @@ Dash <- R6::R6Class(
# ------------------------------------------------------------
router <- routr::RouteStack$new()
server$set_data("user-routes", list()) # placeholder for custom routes
-
+
# ensure that assets_folder is neither NULL nor character(0)
if (!(is.null(private$assets_folder)) & length(private$assets_folder) != 0) {
if (!(dir.exists(private$assets_folder)) && gsub("/+", "", assets_folder) != "assets") {
@@ -374,7 +374,6 @@ Dash <- R6::R6Class(
keys$package_name,
clean_dependencies(dep_list)
)
-
# return warning if a dependency goes unmatched, since the page
# will probably fail to render properly anyway without it
if (length(dep_pkg$rpkg_path) == 0) {
@@ -494,13 +493,17 @@ Dash <- R6::R6Class(
}
TRUE
})
-
dash_favicon <- paste0(self$config$routes_pathname_prefix, "_favicon.ico")
route$add_handler("get", dash_favicon, function(request, response, keys, ...) {
asset_path <- get_asset_path(private$asset_map,
"/favicon.ico")
+ # If custom favicon is not present, get the path for the default Dash favicon
+ if (is.na(names(asset_path)) || is.null(asset_path)) {
+ asset_path <- setNames(system.file("extdata", "favicon.ico", package = "dash"), c("/favicon.ico"))
+ }
+
file_handle <- file(asset_path, "rb")
response$body <- readBin(file_handle,
raw(),
@@ -618,9 +621,9 @@ Dash <- R6::R6Class(
#' library(dash)
#' app <- Dash$new()
#'
- #' # A handler to redirect requests with `307` status code (temporary redirects);
+ #' # A handler to redirect requests with `307` status code (temporary redirects);
#' # for permanent redirects (`301`), see the `redirect` method described below
- #' #
+ #' #
#' # A simple single path-to-path redirect
#' app$server_route('/getting-started', function(request, response, keys, ...) {
#' response$status <- 307L
@@ -653,11 +656,11 @@ Dash <- R6::R6Class(
"methods" = methods)
self$server$set_data("user-routes", user_routes)
- },
+ },
#' @description
#' Redirect a Dash application URL path
- #' @details
+ #' @details
#' This is a convenience method to simplify adding redirects
#' for your Dash application which automatically return a `301`
#' HTTP status code and direct the client to load an alternate URL.
@@ -705,7 +708,7 @@ Dash <- R6::R6Class(
TRUE
}
}
-
+
self$server_route(old_path, handler)
},
@@ -714,13 +717,13 @@ Dash <- R6::R6Class(
# ------------------------------------------------------------------------
#' @description
#' Retrieves the Dash application layout.
- #' @details
+ #' @details
#' If render is `TRUE`, and the layout is a function,
#' the result of the function (rather than the function itself) is returned.
#' @param render Logical. If the layout is a function, should the function be
#' executed to return the layout? If `FALSE`, the function is returned as-is.
- #' @return List or function, depending on the value of `render` (see above).
- #' When returning an object of class `dash_component`, the default `print`
+ #' @return List or function, depending on the value of `render` (see above).
+ #' When returning an object of class `dash_component`, the default `print`
#' method for this class will display the corresponding pretty-printed JSON
#' representation of the object to the console.
layout_get = function(render = TRUE) {
@@ -739,7 +742,7 @@ Dash <- R6::R6Class(
#' class.
#' @param value An object of the `dash_component` class, which provides
#' a component or collection of components, specified either as a Dash
- #' component or a function that returns a Dash component.
+ #' component or a function that returns a Dash component.
layout = function(value) {
# private$layout_ <- if (is.function(..1)) ..1 else list(...)
private$layout_ <- value
@@ -769,9 +772,9 @@ Dash <- R6::R6Class(
#' @description
#' Define a Dash callback.
#' @details
- #' Describes a server or clientside callback relating the values of one or more
+ #' Describes a server or clientside callback relating the values of one or more
#' `output` items to one or more `input` items which will trigger the callback
- #' when they change, and optionally `state` items which provide additional
+ #' when they change, and optionally `state` items which provide additional
#' information but do not trigger the callback directly.
#'
#' For detailed examples of how to use pattern-matching callbacks, see the
@@ -784,13 +787,13 @@ Dash <- R6::R6Class(
#' object(s) (which should reference layout components), which become
#' argument values for R callback handlers defined in `func`.
#'
- #' Here `func` may either be an anonymous R function, a JavaScript function
+ #' Here `func` may either be an anonymous R function, a JavaScript function
#' provided as a character string, or a call to `clientsideFunction()`, which
#' describes a locally served JavaScript function instead. The latter
#' two methods define a "clientside callback", which updates components
#' without passing data to and from the Dash backend. The latter may offer
#' improved performance relative to callbacks written purely in R.
- #' @param output Named list. The `output` argument provides the component `id`
+ #' @param output Named list. The `output` argument provides the component `id`
#' and `property` which will be updated by the callback; a callback can
#' target one or more outputs (i.e. multiple outputs).
#' @param params Unnamed list; provides [input] and [state] statements, each
@@ -852,12 +855,12 @@ Dash <- R6::R6Class(
#' the firing of a given callback, and allows introspection of the input/state
#' values given their names. It is only available from within a callback;
#' attempting to use this method outside of a callback will result in a warning.
- #'
+ #'
#' The `callback_context` method returns a list containing three elements:
#' `states`, `triggered`, `inputs`. The first and last of these correspond to
#' the values of `states` and `inputs` for the current invocation of the
#' callback, and `triggered` provides a list of changed properties.
- #'
+ #'
#' @return List comprising elements `states`, `triggered`, `inputs`.
callback_context = function() {
if (is.null(private$callback_context_)) {
@@ -877,14 +880,14 @@ Dash <- R6::R6Class(
#' duration required to execute a given callback. It may only be called
#' from within a callback; a warning will be thrown and the method will
#' otherwise return `NULL` if invoked outside of a callback.
- #'
+ #'
#' @param name Character. The name of the resource.
#' @param duration Numeric. The time in seconds to report. Internally, this is
#' rounded to the nearest millisecond.
#' @param description Character. A description of the resource.
#'
callback_context.record_timing = function(name,
- duration=NULL,
+ duration=NULL,
description=NULL) {
if (is.null(private$callback_context_)) {
warning("callback_context is undefined; callback_context.record_timing may only be accessed within a callback.")
@@ -897,7 +900,7 @@ Dash <- R6::R6Class(
stop(paste0("Duplicate resource name ", name, " found."), call.=FALSE)
}
- timing_information[[name]] <- list("dur" = round(duration * 1000),
+ timing_information[[name]] <- list("dur" = round(duration * 1000),
"desc" = description)
self$server$set_data("timing-information", timing_information)
@@ -906,9 +909,9 @@ Dash <- R6::R6Class(
# ------------------------------------------------------------------------
# return asset URLs
# ------------------------------------------------------------------------
- #' @description
+ #' @description
#' Return a URL for a Dash asset.
- #' @details
+ #' @details
#' The `get_asset_url` method permits retrieval of an asset's URL given its filename.
#' For example, `app$get_asset_url('style.css')` should return `/assets/style.css` when
#' `assets_folder = 'assets'`. By default, the prefix is the value of `requests_pathname_prefix`,
@@ -973,7 +976,7 @@ Dash <- R6::R6Class(
#' in components such as `dccLink` or `dccLocation`. For example, `app$get_relative_url("/page/")`
#' would return `/app/page/` for an app running on a deployment server. The path must be prefixed with
#' a `/`.
- #' @param path Character. A path string prefixed with a leading `/` which directs
+ #' @param path Character. A path string prefixed with a leading `/` which directs
#' at a path or asset directory.
#' @param requests_pathname_prefix Character. The pathname prefix for the application when
#' deployed. Defaults to the environment variable set by the server,
@@ -984,12 +987,12 @@ Dash <- R6::R6Class(
asset = get_relative_path(requests_pathname = requests_pathname_prefix, path = path)
return(asset)
},
-
-
+
+
# ------------------------------------------------------------------------
# return relative asset URLs
# ------------------------------------------------------------------------
-
+
#' @description
#' Return a Dash asset path without its prefix.
#' @details
@@ -998,7 +1001,7 @@ Dash <- R6::R6Class(
#' method, by taking a `relative path` as an input, and returning the `path` stripped of the `requests_pathname_prefix`,
#' and any leading or trailing `/`. For example, a path string `/app/homepage/`, would be returned as
#' `homepage`. This is particularly useful for `dccLocation` URL routing.
- #' @param path Character. A path string prefixed with a leading `/` which directs
+ #' @param path Character. A path string prefixed with a leading `/` which directs
#' at a path or asset directory.
#' @param requests_pathname_prefix Character. The pathname prefix for the app on
#' a deployed application. Defaults to the environment variable set by the server,
@@ -1014,7 +1017,7 @@ Dash <- R6::R6Class(
#' Specify a custom index string for a Dash application.
#' @details
#' The `index_string` method allows the specification of a custom index by changing
- #' the default `HTML` template that is generated by the Dash UI. #' Meta tags, CSS, and JavaScript are some examples of features
+ #' the default `HTML` template that is generated by the Dash UI. #' Meta tags, CSS, and JavaScript are some examples of features
#' that can be modified. This method will present a warning if your
#' HTML template is missing any necessary elements
#' and return an error if a valid index is not defined. The following interpolation keys are
@@ -1054,11 +1057,11 @@ Dash <- R6::R6Class(
assertthat::assert_that(is.character(string))
private$custom_index <- validate_keys(string, is_template=TRUE)
},
-
+
# ------------------------------------------------------------------------
- # modify the templated variables by using the `interpolate_index` method.
+ # modify the templated variables by using the `interpolate_index` method.
# ------------------------------------------------------------------------
- #' @description
+ #' @description
#' Modify index template variables for a Dash application.
#' @details
#' With the `interpolate_index` method, one can pass a custom index with template string
@@ -1087,14 +1090,14 @@ Dash <- R6::R6Class(
#'
#'