Compare commits
38 Commits
async-load
...
vfill
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f3399568f | ||
|
|
f50076f2f9 | ||
|
|
c4e314ae04 | ||
|
|
b4a8236df5 | ||
|
|
a3743e2c90 | ||
|
|
cda59da698 | ||
|
|
51da80d381 | ||
|
|
412606c594 | ||
|
|
da2df5ac58 | ||
|
|
98f17e0cd2 | ||
|
|
9b2c04f298 | ||
|
|
ed4a97154d | ||
|
|
9dcd62f944 | ||
|
|
213c645524 | ||
|
|
f1c0ac2b30 | ||
|
|
16c6d55f60 | ||
|
|
0e401d268d | ||
|
|
6e40a3dd39 | ||
|
|
04ad1453c1 | ||
|
|
80eeff68ab | ||
|
|
6128a3ab65 | ||
|
|
5f25537079 | ||
|
|
c21ba0baca | ||
|
|
ebf786c2eb | ||
|
|
b39ffafea9 | ||
|
|
4441945a68 | ||
|
|
cd95e058e6 | ||
|
|
a0144d77ef | ||
|
|
64cec08a74 | ||
|
|
7a77b55e6a | ||
|
|
dbe4896102 | ||
|
|
1c9f8940a9 | ||
|
|
514206850a | ||
|
|
809bc8c6de | ||
|
|
0d720616f3 | ||
|
|
0c325d422f | ||
|
|
d368aa72c3 | ||
|
|
27e1348dcb |
@@ -6,7 +6,6 @@ extends:
|
||||
- 'eslint:recommended'
|
||||
- 'plugin:@typescript-eslint/recommended'
|
||||
- 'plugin:jest/recommended'
|
||||
- 'prettier/@typescript-eslint'
|
||||
- 'plugin:prettier/recommended'
|
||||
- 'plugin:jest-dom/recommended'
|
||||
globals:
|
||||
@@ -64,6 +63,7 @@ rules:
|
||||
- error
|
||||
- default: array-simple
|
||||
readonly: array-simple
|
||||
|
||||
"@typescript-eslint/consistent-indexed-object-style":
|
||||
- error
|
||||
- index-signature
|
||||
|
||||
55
.yarn/releases/yarn-2.4.0.cjs
vendored
783
.yarn/releases/yarn-3.2.3.cjs
vendored
Executable file
@@ -6,4 +6,4 @@ plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
||||
spec: "@yarnpkg/plugin-interactive-tools"
|
||||
|
||||
yarnPath: .yarn/releases/yarn-2.4.0.cjs
|
||||
yarnPath: .yarn/releases/yarn-3.2.3.cjs
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Package: shiny
|
||||
Type: Package
|
||||
Title: Web Application Framework for R
|
||||
Version: 1.7.1.9003
|
||||
Version: 1.7.2.9001
|
||||
Authors@R: c(
|
||||
person("Winston", "Chang", role = c("aut", "cre"), email = "winston@rstudio.com", comment = c(ORCID = "0000-0002-1576-2126")),
|
||||
person("Joe", "Cheng", role = "aut", email = "joe@rstudio.com"),
|
||||
@@ -198,10 +198,11 @@ Collate:
|
||||
'version_bs_date_picker.R'
|
||||
'version_ion_range_slider.R'
|
||||
'version_jquery.R'
|
||||
'version_jqueryui.R'
|
||||
'version_selectize.R'
|
||||
'version_strftime.R'
|
||||
'viewer.R'
|
||||
RoxygenNote: 7.2.0
|
||||
RoxygenNote: 7.2.1
|
||||
Encoding: UTF-8
|
||||
Roxygen: list(markdown = TRUE)
|
||||
RdMacros: lifecycle
|
||||
|
||||
96
NEWS.md
@@ -1,54 +1,70 @@
|
||||
shiny development
|
||||
shiny 1.7.2.9000
|
||||
================
|
||||
|
||||
## Full changelog
|
||||
|
||||
### Breaking changes
|
||||
|
||||
### New features and improvements
|
||||
|
||||
* Internal: Added clearer and strict TypeScript type definitions (#3644)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* Closed #3687: Updated jQuery-UI to v1.13.2. (#3697)
|
||||
|
||||
|
||||
shiny 1.7.2
|
||||
===========
|
||||
|
||||
## Full changelog
|
||||
|
||||
### Breaking changes
|
||||
|
||||
* Closed #3626: `renderPlot()` (and `plotPNG()`) now uses `ragg::agg_png()` by default when the [`{ragg}` package](https://github.com/r-lib/ragg) is installed. To restore the previous behavior, set `options(shiny.useragg = FALSE)`. (#3654)
|
||||
|
||||
### Minor new features and improvements
|
||||
### New features and improvements
|
||||
|
||||
* Closed #1545: `insertUI()` now executes `<script>` tags. (#3630)
|
||||
|
||||
* `fileInput()` can set the `capture` attribute to facilitates user access to a device's media capture mechanism, such as a camera, or microphone, from within a file upload control ([W3C HTML Media Capture](https://www.w3.org/TR/html-media-capture/)). (Thanks to khaled-alshamaa, #3481)
|
||||
|
||||
* Closed tidyverse/dplyr#5552: Compatibility of dplyr 1.0 (and rlang chained errors in general) with `req()`, `validate()`, and friends.
|
||||
|
||||
* Closed tidyverse/dplyr#6154: Values from an `actionButton()` had S3 classes in the incorrect order.
|
||||
|
||||
* Closed #3346: Default for `ref` input in `runGithub()` changed from `"master"` to `"HEAD"`. (#3564)
|
||||
|
||||
* Closed #3619: In R 4.2, `splitLayout()` no longer raises warnings about incorrect length in an `if` statement. (Thanks to @dmenne, #3625)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* Closed #3250:`{rlang}`/`{tidyeval}` conditions (i.e., warnings and errors) are no longer filtered from stack traces. (#3602)
|
||||
|
||||
* Closed #3581: Errors in throttled/debounced reactive expressions no longer cause the session to exit. (#3624)
|
||||
|
||||
* Closed #3657: `throttle.ts` and the `Throttler` typescript objects it provides now function as intended. (Thanks gto @dvg-p4, #3659)
|
||||
|
||||
* The auto-reload feature (`options(shiny.autoreload=TRUE)`) was not being activated by `devmode(TRUE)`, despite a console message asserting that it was. (#3620)
|
||||
|
||||
* Closed #2297: If an error occurred in parsing a value in a bookmark query string, an error would be thrown and nothing would be restored. Now a message is displayed and that value is ignored. (Thanks to @daattali, #3385)
|
||||
|
||||
* Restored the previous behavior of automatically guessing the `Content-Type` header for `downloadHandler` functions when no explicit `contentType` argument is supplied. (#3393)
|
||||
|
||||
* Previously, updating an input value without a corresponding Input binding element did not trigger a JavaScript `shiny:inputchanged` event. Now, if no Input binding element is found, the `shiny:inputchanged` event is triggered on `window.document`. (#3584)
|
||||
|
||||
* Closed #2955: Input and output bindings previously attempted to use `el['data-input-id']`, but that never worked. They now use `el.getAttribute('data-input-id')` instead. (#3538)
|
||||
|
||||
### Minor improvements
|
||||
|
||||
* When taking a test snapshot, the sort order of the json keys of the `input`, `output`, and `export` fields is currently sorted using the locale of the machine. This can lead to inconsistent test snapshot results. To opt-in to a consistent ordering of snapshot fields with `{shinytest}`, please set the global option `options(shiny.snapshotsortc = TRUE)`. `{shinytest2}` users do not need to set this value. (#3515)
|
||||
|
||||
* Closed rstudio/shinytest2#222: When restoring a context (i.e., bookmarking) from a URL, Shiny now better handles a trailing `=` after `_inputs_` and `_values_`. (#3648)
|
||||
|
||||
* Shiny's internal HTML dependencies are now mounted dynamically instead of statically. (#3537)
|
||||
|
||||
* HTML dependencies that are sent to dynamic UI now have better type checking, and no longer require a `dep.src.href` field. (#3537)
|
||||
|
||||
* Default for `ref` input in `runGithub()` changed from `"master"` to `"HEAD"`. (#3346)
|
||||
|
||||
* When taking a test snapshot, the sort order of the json keys of the `input`, `output`, and `export` fields is currently sorted using the locale of the machine. This can lead to inconsistent test snapshot results. To opt-in to a consistent ordering of snapshot fields with `{shinytest}`, please set the global option `options(shiny.snapshotsortc = TRUE)`. `{shinytest2}` users do not need to set this value. (#3515)
|
||||
|
||||
* The auto-reload feature (`options(shiny.autoreload=TRUE)`) was not being activated by `devmode(TRUE)`, despite a console message asserting that it was. (#3620)
|
||||
|
||||
* Add `shiny.mathjax.url` and `shiny.mathjax.config` options for configuring the MathJax URL used by `withMathJax`. Thanks, @Neutron3529! (#3639)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* Closed #3657: `throttle.ts` and the `Throttler` typescript objects it provides now function as intended.
|
||||
|
||||
* Closed tidyverse/dplyr#5552: Compatibility of dplyr 1.0 (and rlang chained errors in general) with `req()`, `validate()`, and friends.
|
||||
|
||||
* Closed #1545: `insertUI()` now executes `<script>` tags. (#3630)
|
||||
|
||||
* Closed #2955: Input and output bindings previously attempted to use `el['data-input-id']`, but that never worked. They now use `el.getAttribute('data-input-id')` instead. (#3538)
|
||||
|
||||
* Closed tidyverse/dplyr#6154: Values from an `actionButton()` had S3 classes in the incorrect order.
|
||||
|
||||
* Fixed a bug where updating an input value without a corresponding Input binding element did not trigger a JavaScript `shiny:inputchanged` event. Now, if no Input binding element is found, the `shiny:inputchanged` event is triggered on `window.document`. (#3584)
|
||||
|
||||
* Restored the previous behavior of automatically guessing the `Content-Type` header for `downloadHandler` functions when no explicit `contentType` argument is supplied. (#3393)
|
||||
|
||||
* Closed #3619: In R 4.2, `splitLayout()` raised warnings about incorrect length in an `if` statement. (Thanks to @dmenne, #3625)
|
||||
|
||||
* Closed #2297: If an error occurred in parsing a value in a bookmark query string, an error would be thrown and nothing would be restored. Now a message is displayed and that value is ignored. (Thanks to @daattali, #3385)
|
||||
|
||||
* `fileInput()` can set the `capture` attribute to facilitates user access to a device's media capture mechanism, such as a camera, or microphone, from within a file upload control ([W3C HTML Media Capture](https://www.w3.org/TR/html-media-capture/)). (Thanks to khaled-alshamaa, #3481)
|
||||
|
||||
* Closed rstudio/shinytest2#222: When restoring a context (i.e., bookmarking) from a URL, Shiny now better handles a trailing `=` after `_inputs_` and `_values_`. (#3648)
|
||||
|
||||
* Closed #3581: Errors in throttled/debounced reactive expressions no longer cause the session to exit. (#3624)
|
||||
|
||||
* Closed #3250:`{rlang}`/`{tidyeval}` conditions (i.e., warnings and errors) are no longer filtered from stack traces. (#3602)
|
||||
|
||||
|
||||
shiny 1.7.1
|
||||
===========
|
||||
@@ -513,7 +529,7 @@ This is a significant release for Shiny, with a major new feature that was nearl
|
||||
|
||||
* Removed the (ridiculously outdated) "experimental feature" tag from the reference documentation for `renderUI`. (#2036)
|
||||
|
||||
* Addressed #1907: the `ignoreInit` argument was first added only to `observeEvent`. Later, we also added it to `eventReactive`, but forgot to update the documentation. Now done, thanks [@flo12392](https://github.com/flo12392)! (#2036)
|
||||
* Addressed #1907: the `ignoreInit` argument was first added only to `observeEvent`. Later, we also added it to `eventReactive`, but forgot to update the documentation. Now done, thanks @flo12392! (#2036)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
@@ -527,7 +543,7 @@ This is a significant release for Shiny, with a major new feature that was nearl
|
||||
|
||||
* Fixed #1600: URL-encoded bookmarking did not work with sliders that had dates or date-times. (#1961)
|
||||
|
||||
* Fixed #1962: [File dragging and dropping](https://blog.rstudio.com/2017/08/15/shiny-1-0-4/) broke in the presence of jQuery version 3.0 as introduced by the [rhandsontable](https://jrowen.github.io/rhandsontable/) [htmlwidget](https://www.htmlwidgets.org/). (#2005)
|
||||
* Fixed #1962: [File dragging and dropping](https://www.rstudio.com/blog/shiny-1-0-4/) broke in the presence of jQuery version 3.0 as introduced by the [rhandsontable](https://jrowen.github.io/rhandsontable/) [htmlwidget](https://www.htmlwidgets.org/). (#2005)
|
||||
|
||||
* Improved the error handling inside the `addResourcePath()` function, to give end users more informative error messages when the `directoryPath` argument cannot be normalized. This is especially useful for `runtime: shiny_prerendered` Rmd documents, like `learnr` tutorials. (#1968)
|
||||
|
||||
|
||||
@@ -57,17 +57,18 @@ bootstrapPage <- function(..., title = NULL, theme = NULL, lang = NULL) {
|
||||
ui <- attachDependencies(ui, bootstrapLib())
|
||||
}
|
||||
|
||||
setLang(ui, lang)
|
||||
setHtmlAttr(ui, "lang", lang)
|
||||
}
|
||||
|
||||
setLang <- function(ui, lang) {
|
||||
# Add lang attribute to be passed to renderPage function
|
||||
attr(ui, "lang") <- lang
|
||||
setHtmlAttr <- function(ui, attr_name, attr_value) {
|
||||
attrs <- getHtmlAttrs(ui)
|
||||
attrs[[attr_name]] <- attr_value
|
||||
attr(ui, "html_attrs") <- attrs
|
||||
ui
|
||||
}
|
||||
getLang <- function(ui) {
|
||||
getHtmlAttrs <- function(ui) {
|
||||
# Check if ui has lang attribute; otherwise, NULL
|
||||
attr(ui, "lang", exact = TRUE)
|
||||
attr(ui, "html_attrs", exact = TRUE)
|
||||
}
|
||||
|
||||
#' Bootstrap libraries
|
||||
@@ -331,10 +332,22 @@ fillPage <- function(..., padding = 0, title = NULL, bootstrap = TRUE,
|
||||
...
|
||||
)
|
||||
|
||||
ui <- setLang(ui, lang)
|
||||
ui <- setHtmlAttr(ui, "lang", lang)
|
||||
}
|
||||
|
||||
return(ui)
|
||||
# vfill-container rules live in bslib which means something like
|
||||
# fillPage(plotOutput("x")) won't work unless a bslib theme is used
|
||||
setBodyAttr(ui, "class", "vfill-container")
|
||||
}
|
||||
|
||||
setBodyAttr <- function(ui, attr_name, attr_value) {
|
||||
attrs <- getBodyAttrs(ui)
|
||||
attrs[[attr_name]] <- attr_value
|
||||
attr(ui, "body_attrs") <- attrs
|
||||
ui
|
||||
}
|
||||
getBodyAttrs <- function(ui) {
|
||||
attr(ui, "body_attrs", exact = TRUE)
|
||||
}
|
||||
|
||||
collapseSizes <- function(padding) {
|
||||
@@ -792,7 +805,7 @@ verbatimTextOutput <- function(outputId, placeholder = FALSE) {
|
||||
#' @name plotOutput
|
||||
#' @rdname plotOutput
|
||||
#' @export
|
||||
imageOutput <- function(outputId, width = "100%", height="400px",
|
||||
imageOutput <- function(outputId, width = NULL, height = NULL,
|
||||
click = NULL, dblclick = NULL, hover = NULL, brush = NULL,
|
||||
inline = FALSE) {
|
||||
|
||||
@@ -807,6 +820,7 @@ imageOutput <- function(outputId, width = "100%", height="400px",
|
||||
args <- list(
|
||||
id = outputId,
|
||||
class = "shiny-image-output",
|
||||
class = if (is.null(height)) "vfill-item",
|
||||
style = style
|
||||
)
|
||||
|
||||
@@ -1086,7 +1100,7 @@ imageOutput <- function(outputId, width = "100%", height="400px",
|
||||
#'
|
||||
#' }
|
||||
#' @export
|
||||
plotOutput <- function(outputId, width = "100%", height="400px",
|
||||
plotOutput <- function(outputId, width = NULL, height = NULL,
|
||||
click = NULL, dblclick = NULL, hover = NULL, brush = NULL,
|
||||
inline = FALSE) {
|
||||
|
||||
@@ -1135,16 +1149,18 @@ dataTableOutput <- function(outputId) {
|
||||
#' Create an HTML output element
|
||||
#'
|
||||
#' Render a reactive output variable as HTML within an application page. The
|
||||
#' text will be included within an HTML `div` tag, and is presumed to
|
||||
#' contain HTML content which should not be escaped.
|
||||
#' text will be included within an HTML `div` tag, and is presumed to contain
|
||||
#' HTML content which should not be escaped.
|
||||
#'
|
||||
#' `uiOutput` is intended to be used with `renderUI` on the server
|
||||
#' side. It is currently just an alias for `htmlOutput`.
|
||||
#' `uiOutput` is intended to be used with `renderUI` on the server side. It is
|
||||
#' currently just an alias for `htmlOutput`.
|
||||
#'
|
||||
#' @param outputId output variable to read the value from
|
||||
#' @param outputId output variable to read the value from.
|
||||
#' @param ... Other arguments to pass to the container tag function. This is
|
||||
#' useful for providing additional classes for the tag.
|
||||
#' @inheritParams textOutput
|
||||
#' @param fill Whether the output should be allowed to grow/shrink to the size
|
||||
#' of the `container`. Ignored when `inline = TRUE`.
|
||||
#' @return An HTML output element that can be included in a panel
|
||||
#' @examples
|
||||
#' htmlOutput("summary")
|
||||
@@ -1155,12 +1171,18 @@ dataTableOutput <- function(outputId) {
|
||||
#' )
|
||||
#' @export
|
||||
htmlOutput <- function(outputId, inline = FALSE,
|
||||
container = if (inline) span else div, ...)
|
||||
container = if (inline) span else div, fill = FALSE, ...)
|
||||
{
|
||||
if (any_unnamed(list(...))) {
|
||||
warning("Unnamed elements in ... will be replaced with dynamic UI.")
|
||||
}
|
||||
container(id = outputId, class="shiny-html-output", ...)
|
||||
|
||||
container(
|
||||
id = outputId,
|
||||
class = "shiny-html-output",
|
||||
class = if (fill && !inline) "vfill-container vfill-item",
|
||||
...
|
||||
)
|
||||
}
|
||||
|
||||
#' @rdname htmlOutput
|
||||
|
||||
10
R/jqueryui.R
@@ -103,10 +103,10 @@ fixedPanel <- function(...,
|
||||
|
||||
jqueryuiDependency <- function() {
|
||||
htmlDependency(
|
||||
'jqueryui',
|
||||
'1.12.1',
|
||||
src = 'www/shared/jqueryui',
|
||||
package = 'shiny',
|
||||
script = 'jquery-ui.min.js'
|
||||
"jqueryui",
|
||||
version_jqueryui,
|
||||
src = "www/shared/jqueryui",
|
||||
package = "shiny",
|
||||
script = "jquery-ui.min.js"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ registerClient <- function(client) {
|
||||
#' optional `session` parameter, which is used when greater control is
|
||||
#' needed.
|
||||
#'
|
||||
#' See the [tutorial](https://rstudio.github.io/shiny/tutorial/) for more
|
||||
#' See the [tutorial](https://shiny.rstudio.com/tutorial/) for more
|
||||
#' on how to write a server function.
|
||||
#'
|
||||
#' @param func The server function for this application. See the details section
|
||||
@@ -331,7 +331,7 @@ argsForServerFunc <- function(serverFunc, session) {
|
||||
getEffectiveBody <- function(func) {
|
||||
if (is.null(func))
|
||||
NULL
|
||||
else if (isS4(func) && class(func) == "functionWithTrace")
|
||||
else if (isS4(func) && inherits(func, "functionWithTrace"))
|
||||
body(func@original)
|
||||
else
|
||||
body(func)
|
||||
|
||||
@@ -185,9 +185,11 @@ workerId <- local({
|
||||
#' session is actually connected.
|
||||
#' }
|
||||
#' \item{request}{
|
||||
#' An environment that implements the Rook specification for HTTP requests.
|
||||
#' This is the request that was used to initiate the websocket connection
|
||||
#' (as opposed to the request that downloaded the web page for the app).
|
||||
#' An environment that implements the [Rook
|
||||
#' specification](https://github.com/jeffreyhorner/Rook#the-environment) for
|
||||
#' HTTP requests. This is the request that was used to initiate the websocket
|
||||
#' connection (as opposed to the request that downloaded the web page for the
|
||||
#' app).
|
||||
#' }
|
||||
#' \item{userData}{
|
||||
#' An environment for app authors and module/package authors to store whatever
|
||||
|
||||
11
R/shinyui.R
@@ -29,7 +29,6 @@ withMathJax <- function(...) {
|
||||
}
|
||||
|
||||
renderPage <- function(ui, showcase=0, testMode=FALSE) {
|
||||
lang <- getLang(ui)
|
||||
|
||||
# If the ui is a NOT complete document (created by htmlTemplate()), then do some
|
||||
# preprocessing and make sure it's a complete document.
|
||||
@@ -38,13 +37,17 @@ renderPage <- function(ui, showcase=0, testMode=FALSE) {
|
||||
ui <- showcaseUI(ui)
|
||||
|
||||
# Wrap ui in body tag if it doesn't already have a single top-level body tag.
|
||||
if (!(inherits(ui, "shiny.tag") && ui$name == "body"))
|
||||
ui <- tags$body(ui)
|
||||
ui <- if (inherits(ui, "shiny.tag") && ui$name == "body") {
|
||||
tagAppendAttributes(ui, !!!getBodyAttrs(ui))
|
||||
} else {
|
||||
tags$body(ui, !!!getBodyAttrs(ui))
|
||||
}
|
||||
|
||||
# Put the body into the default template
|
||||
ui <- htmlTemplate(
|
||||
system_file("template", "default.html", package = "shiny"),
|
||||
lang = lang,
|
||||
|
||||
html_open = HTML(sub("</html>$", "", tags$html(!!!getHtmlAttrs(ui)))),
|
||||
body = ui,
|
||||
# this template is a complete HTML document
|
||||
document_ = TRUE
|
||||
|
||||
2
R/version_jqueryui.R
Normal file
@@ -0,0 +1,2 @@
|
||||
# Generated by tools/updatejQueryUI.R; do not edit by hand
|
||||
version_jqueryui <- "1.13.2"
|
||||
@@ -16,7 +16,7 @@ Easily build rich and productive interactive web apps in R — no HTML/CSS/J
|
||||
* A prebuilt set of highly sophisticated, customizable, and easy-to-use widgets (e.g., plots, tables, sliders, dropdowns, date pickers, and more).
|
||||
* An attractive default look based on [Bootstrap](https://getbootstrap.com/) which can also be easily customized with the [bslib](https://github.com/rstudio/bslib) package or avoided entirely with more direct R bindings to HTML/CSS/JavaScript.
|
||||
* Seamless integration with [R Markdown](https://shiny.rstudio.com/articles/interactive-docs.html), making it easy to embed numerous applications natively within a larger dynamic document.
|
||||
* Tools for improving and monitoring performance, including native support for [async programming](https://blog.rstudio.com/2018/06/26/shiny-1-1-0/), [caching](https://talks.cpsievert.me/20201117), [load testing](https://rstudio.github.io/shinyloadtest/), and [more](https://support.rstudio.com/hc/en-us/articles/231874748-Scaling-and-Performance-Tuning-in-RStudio-Connect).
|
||||
* Tools for improving and monitoring performance, including native support for [async programming](https://www.rstudio.com/blog/shiny-1-1-0/), [caching](https://talks.cpsievert.me/20201117), [load testing](https://rstudio.github.io/shinyloadtest/), and more.
|
||||
* [Modules](https://shiny.rstudio.com/articles/modules.html): a framework for reducing code duplication and complexity.
|
||||
* An ability to [bookmark application state](https://shiny.rstudio.com/articles/bookmarking-state.html) and/or [generate code to reproduce output(s)](https://github.com/rstudio/shinymeta).
|
||||
* A rich ecosystem of extension packages for more [custom widgets](http://www.htmlwidgets.org/), [input validation](https://github.com/rstudio/shinyvalidate), [unit testing](https://github.com/rstudio/shinytest), and more.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html{{ if (isTRUE(nzchar(lang))) paste0(" lang=\"", lang, "\"") }}>
|
||||
{{html_open}}
|
||||
<head>
|
||||
{{ headContent() }}
|
||||
</head>
|
||||
|
||||
1
inst/www/shared/jquery.min.js
vendored
1
inst/www/shared/jquery.min.js.map
Normal file
@@ -312,7 +312,7 @@ Mani Mishra <manimishra902@gmail.com>
|
||||
Hannah Methvin <hannahmethvin@gmail.com>
|
||||
Leonardo Balter <leonardo.balter@gmail.com>
|
||||
Benjamin Albert <benjamin_a5@yahoo.com>
|
||||
Michał Gołębiowski <m.goleb@gmail.com>
|
||||
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
|
||||
Alyosha Pushak <alyosha.pushak@gmail.com>
|
||||
Fahad Ahmad <fahadahmad41@hotmail.com>
|
||||
Matt Brundage <github@mattbrundage.com>
|
||||
@@ -331,3 +331,42 @@ Peter Dave Hello <hsu@peterdavehello.org>
|
||||
Johannes Schäfer <johnschaefer@gmx.de>
|
||||
Ville Skyttä <ville.skytta@iki.fi>
|
||||
Ryan Oriecuia <ryan.oriecuia@visioncritical.com>
|
||||
Sergei Ratnikov <sergeir82@gmail.com>
|
||||
milk54 <milk851@gmail.com>
|
||||
Evelyn Masso <evoutofambit@gmail.com>
|
||||
Robin <mail@robin-fowler.com>
|
||||
Simon Asika <asika32764@gmail.com>
|
||||
Kevin Cupp <kevin.cupp@gmail.com>
|
||||
Jeremy Mickelson <Jeremy.Mickelson@gmail.com>
|
||||
Kyle Rosenberg <kyle.rosenberg@gmail.com>
|
||||
Petri Partio <petri.partio@gmail.com>
|
||||
pallxk <github@pallxk.com>
|
||||
Luke Brookhart <luke@onjax.com>
|
||||
claudi <hirt-claudia@gmx.de>
|
||||
Eirik Sletteberg <eiriksletteberg@gmail.com>
|
||||
Albert Johansson <albert@intervaro.se>
|
||||
A. Wells <borgboyone@users.noreply.github.com>
|
||||
Robert Brignull <robertbrignull@gmail.com>
|
||||
Horus68 <pauloizidoro@gmail.com>
|
||||
Maksymenkov Eugene <foatei@gmail.com>
|
||||
OskarNS <soerensen.oskar@gmail.com>
|
||||
Gez Quinn <holla@gezquinn.design>
|
||||
jigar gala <jigar.gala140291@gmail.com>
|
||||
Florian Wegscheider <flo.wegscheider@gmail.com>
|
||||
Fatér Zsolt <fater.zsolt@gmail.com>
|
||||
Szabolcs Szabolcsi-Toth <nec@shell8.net>
|
||||
Jérémy Munsch <github@jeremydev.ovh>
|
||||
Hrvoje Novosel <hrvoje.novosel@gmail.com>
|
||||
Paul Capron <PaulCapron@users.noreply.github.com>
|
||||
Micah Miller <mikhey@runbox.com>
|
||||
sakshi87 <53863764+sakshi87@users.noreply.github.com>
|
||||
Mikolaj Wolicki <wolicki.mikolaj@gmail.com>
|
||||
Patrick McKay <patrick.mckay@vumc.org>
|
||||
c-lambert <58025159+c-lambert@users.noreply.github.com>
|
||||
Josep Sanz <josepsanzcamp@gmail.com>
|
||||
Ben Mullins <benm@umich.edu>
|
||||
Christian Oliff <christianoliff@pm.me>
|
||||
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
||||
Adam Lidén Hällgren <adamlh92@gmail.com>
|
||||
James Hinderks <hinderks@gmail.com>
|
||||
Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com>
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
This a full jQuery UI build, downloaded from:
|
||||
https://jqueryui.com/resources/download/jquery-ui-1.12.1.zip
|
||||
|
||||
The copy of jQuery that is bundled with the download, under external/, is not
|
||||
included because Shiny already has its own copy of jQuery.
|
||||
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
@@ -58,7 +58,6 @@
|
||||
|
||||
<h1>YOUR COMPONENTS:</h1>
|
||||
|
||||
|
||||
<!-- Accordion -->
|
||||
<h2 class="demoHeaders">Accordion</h2>
|
||||
<div id="accordion">
|
||||
@@ -70,23 +69,17 @@
|
||||
<div>Nam dui erat, auctor a, dignissim quis.</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Autocomplete -->
|
||||
<h2 class="demoHeaders">Autocomplete</h2>
|
||||
<div>
|
||||
<input id="autocomplete" title="type "a"">
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Button -->
|
||||
<h2 class="demoHeaders">Button</h2>
|
||||
<button id="button">A button element</button>
|
||||
<button id="button-icon">An icon-only button</button>
|
||||
|
||||
|
||||
|
||||
<!-- Checkboxradio -->
|
||||
<h2 class="demoHeaders">Checkboxradio</h2>
|
||||
<form style="margin-top: 1em;">
|
||||
@@ -97,8 +90,6 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<!-- Controlgroup -->
|
||||
<h2 class="demoHeaders">Controlgroup</h2>
|
||||
<fieldset>
|
||||
@@ -125,8 +116,6 @@
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
|
||||
|
||||
<!-- Tabs -->
|
||||
<h2 class="demoHeaders">Tabs</h2>
|
||||
<div id="tabs">
|
||||
@@ -140,8 +129,6 @@
|
||||
<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<h2 class="demoHeaders">Dialog</h2>
|
||||
<p>
|
||||
<button id="dialog-link" class="ui-button ui-corner-all ui-widget">
|
||||
@@ -167,7 +154,6 @@
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
|
||||
<ul id="icons" class="ui-widget ui-helper-clearfix">
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-n"><span class="ui-icon ui-icon-caret-1-n"></span></li>
|
||||
@@ -345,25 +331,18 @@
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- Slider -->
|
||||
<h2 class="demoHeaders">Slider</h2>
|
||||
<div id="slider"></div>
|
||||
|
||||
|
||||
|
||||
<!-- Datepicker -->
|
||||
<h2 class="demoHeaders">Datepicker</h2>
|
||||
<div id="datepicker"></div>
|
||||
|
||||
|
||||
|
||||
<!-- Progressbar -->
|
||||
<h2 class="demoHeaders">Progressbar</h2>
|
||||
<div id="progressbar"></div>
|
||||
|
||||
|
||||
|
||||
<!-- Progressbar -->
|
||||
<h2 class="demoHeaders">Selectmenu</h2>
|
||||
<select id="selectmenu">
|
||||
@@ -374,14 +353,10 @@
|
||||
<option>Faster</option>
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
<!-- Spinner -->
|
||||
<h2 class="demoHeaders">Spinner</h2>
|
||||
<input id="spinner">
|
||||
|
||||
|
||||
|
||||
<!-- Menu -->
|
||||
<h2 class="demoHeaders">Menu</h2>
|
||||
<ul style="width:100px;" id="menu">
|
||||
@@ -400,8 +375,6 @@
|
||||
<li><div>Item 5</div></li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<!-- Tooltip -->
|
||||
<h2 class="demoHeaders">Tooltip</h2>
|
||||
<p id="tooltip">
|
||||
@@ -409,7 +382,6 @@
|
||||
the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- Highlight / Error -->
|
||||
<h2 class="demoHeaders">Highlight / Error</h2>
|
||||
<div class="ui-widget">
|
||||
@@ -429,11 +401,8 @@ the element with your mouse, the title attribute is displayed in a little box ne
|
||||
<script src="external/jquery/jquery.js"></script>
|
||||
<script src="jquery-ui.js"></script>
|
||||
<script>
|
||||
|
||||
$( "#accordion" ).accordion();
|
||||
|
||||
|
||||
|
||||
var availableTags = [
|
||||
"ActionScript",
|
||||
"AppleScript",
|
||||
@@ -462,28 +431,18 @@ $( "#autocomplete" ).autocomplete({
|
||||
source: availableTags
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#button" ).button();
|
||||
$( "#button-icon" ).button({
|
||||
icon: "ui-icon-gear",
|
||||
showLabel: false
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#radioset" ).buttonset();
|
||||
|
||||
|
||||
|
||||
$( "#controlgroup" ).controlgroup();
|
||||
|
||||
|
||||
|
||||
$( "#tabs" ).tabs();
|
||||
|
||||
|
||||
|
||||
$( "#dialog" ).dialog({
|
||||
autoOpen: false,
|
||||
width: 400,
|
||||
@@ -509,42 +468,27 @@ $( "#dialog-link" ).click(function( event ) {
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#datepicker" ).datepicker({
|
||||
inline: true
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#slider" ).slider({
|
||||
range: true,
|
||||
values: [ 17, 67 ]
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#progressbar" ).progressbar({
|
||||
value: 20
|
||||
});
|
||||
|
||||
|
||||
|
||||
$( "#spinner" ).spinner();
|
||||
|
||||
|
||||
|
||||
$( "#menu" ).menu();
|
||||
|
||||
|
||||
|
||||
$( "#tooltip" ).tooltip();
|
||||
|
||||
|
||||
|
||||
$( "#selectmenu" ).selectmenu();
|
||||
|
||||
|
||||
// Hover states on the static widgets
|
||||
$( "#dialog-link, #icons li" ).hover(
|
||||
function() {
|
||||
|
||||
21
inst/www/shared/jqueryui/jquery-ui.css
vendored
@@ -1,4 +1,4 @@
|
||||
/*! jQuery UI - v1.12.1 - 2016-09-14
|
||||
/*! jQuery UI - v1.13.2 - 2022-07-14
|
||||
* http://jqueryui.com
|
||||
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
|
||||
@@ -45,7 +45,7 @@
|
||||
left: 0;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
filter:Alpha(Opacity=0); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=0)"; /* support: IE8 */
|
||||
}
|
||||
|
||||
.ui-front {
|
||||
@@ -664,7 +664,7 @@ button.ui-button::-moz-focus-inner {
|
||||
.ui-progressbar .ui-progressbar-overlay {
|
||||
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
|
||||
height: 100%;
|
||||
filter: alpha(opacity=25); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=25)"; /* support: IE8 */
|
||||
opacity: 0.25;
|
||||
}
|
||||
.ui-progressbar-indeterminate .ui-progressbar-value {
|
||||
@@ -728,7 +728,7 @@ button.ui-button::-moz-focus-inner {
|
||||
z-index: 2;
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
cursor: default;
|
||||
cursor: pointer;
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
}
|
||||
@@ -1041,18 +1041,18 @@ a.ui-button:active,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=70)"; /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=35)"; /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
-ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
@@ -1093,7 +1093,10 @@ a.ui-button:active,
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-blank { background-position: 16px 16px; }
|
||||
/* Three classes needed to override `.ui-button:hover .ui-icon` */
|
||||
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
|
||||
background-image: none;
|
||||
}
|
||||
.ui-icon-caret-1-n { background-position: 0 0; }
|
||||
.ui-icon-caret-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-caret-1-e { background-position: -32px 0; }
|
||||
@@ -1304,7 +1307,7 @@ a.ui-button:active,
|
||||
.ui-widget-overlay {
|
||||
background: #aaaaaa;
|
||||
opacity: .003;
|
||||
filter: Alpha(Opacity=.3); /* support: IE8 */
|
||||
-ms-filter: Alpha(Opacity=.3); /* support: IE8 */
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
-webkit-box-shadow: 0px 0px 5px #666666;
|
||||
|
||||
1806
inst/www/shared/jqueryui/jquery-ui.js
vendored
4
inst/www/shared/jqueryui/jquery-ui.min.css
vendored
13
inst/www/shared/jqueryui/jquery-ui.min.js
vendored
@@ -1,5 +1,5 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.12.1
|
||||
* jQuery UI CSS Framework 1.13.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright jQuery Foundation and other contributors
|
||||
@@ -49,7 +49,7 @@
|
||||
left: 0;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
filter:Alpha(Opacity=0); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=0)"; /* support: IE8 */
|
||||
}
|
||||
|
||||
.ui-front {
|
||||
@@ -668,7 +668,7 @@ button.ui-button::-moz-focus-inner {
|
||||
.ui-progressbar .ui-progressbar-overlay {
|
||||
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
|
||||
height: 100%;
|
||||
filter: alpha(opacity=25); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=25)"; /* support: IE8 */
|
||||
opacity: 0.25;
|
||||
}
|
||||
.ui-progressbar-indeterminate .ui-progressbar-value {
|
||||
@@ -732,7 +732,7 @@ button.ui-button::-moz-focus-inner {
|
||||
z-index: 2;
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
cursor: default;
|
||||
cursor: pointer;
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
15
inst/www/shared/jqueryui/jquery-ui.theme.css
vendored
@@ -1,5 +1,5 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.12.1
|
||||
* jQuery UI CSS Framework 1.13.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright jQuery Foundation and other contributors
|
||||
@@ -172,18 +172,18 @@ a.ui-button:active,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=70)"; /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
-ms-filter: "alpha(opacity=35)"; /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
-ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
@@ -224,7 +224,10 @@ a.ui-button:active,
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-blank { background-position: 16px 16px; }
|
||||
/* Three classes needed to override `.ui-button:hover .ui-icon` */
|
||||
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
|
||||
background-image: none;
|
||||
}
|
||||
.ui-icon-caret-1-n { background-position: 0 0; }
|
||||
.ui-icon-caret-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-caret-1-e { background-position: -32px 0; }
|
||||
@@ -435,7 +438,7 @@ a.ui-button:active,
|
||||
.ui-widget-overlay {
|
||||
background: #aaaaaa;
|
||||
opacity: .003;
|
||||
filter: Alpha(Opacity=.3); /* support: IE8 */
|
||||
-ms-filter: Alpha(Opacity=.3); /* support: IE8 */
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
-webkit-box-shadow: 0px 0px 5px #666666;
|
||||
|
||||
@@ -1 +1 @@
|
||||
Selectize.define("selectize-plugin-a11y",function(c){var t=this,l=13;typeof t.accessibility=="undefined"&&(t.accessibility={}),t.accessibility.helpers={randomId:function(e){for(var a="",s=e||10,r="abcdefghijklmnopqrstuvwxyz0123456789",n=r.length,o=0;o<s;o++)a+=r[Math.floor(n*Math.random())];return a}},t.accessibility.liveRegion={$region:"",speak:function(e){var a=$("<div></div>");a.text(e),this.$region.html(a)},domListener:function(){var e=new MutationObserver(function(a){a.forEach(function(s){var r=$(s.target);if(r.hasClass("items"))if(r.hasClass("dropdown-active")){t.$control_input.attr("aria-expanded","true");var n=t.$dropdown_content[0].children;for(i=0;i<n.length;i++){var o=n[i].attributes;o.role||n[i].setAttribute("role","option"),o.id||n[i].setAttribute("id",t.accessibility.helpers.randomId())}}else t.$control_input.attr("aria-expanded","false"),t.$control_input.removeAttr("aria-activedescendant");else r.hasClass("active")&&r.attr("data-value")&&(t.$control_input.attr("aria-activedescendant",r.attr("id")),t.accessibility.liveRegion.speak(r.text(),500))})});e.observe(t.$dropdown[0],{attributes:!0,attributeFilter:["class"],subtree:!0,attributeOldValue:!0}),e.observe(t.$control[0],{attributes:!0,attributeFilter:["class"]}),e.observe(t.$control_input[0],{attributes:!0,attributeFilter:["value"]})},setAttributes:function(){this.$region.attr({"aria-live":"assertive",role:"log","aria-relevant":"additions","aria-atomic":"true"})},setStyles:function(){this.$region.css({position:"absolute",width:"1px",height:"1px","margin-top":"-1px",clip:"rect(1px, 1px, 1px, 1px)",overflow:"hidden"})},init:function(){this.$region=$("<div>"),this.setAttributes(),this.setStyles(),$("body").append(this.$region),this.domListener()}},this.setup=function(){var e=t.setup;return function(){e.apply(this,arguments);var a=t.accessibility.helpers.randomId(),s=t.accessibility.helpers.randomId();t.$control.on("keydown",function(r){r.keyCode===l&&(t.settings.openOnFocus?(t.settings.openOnFocus=!1,t.focus(),setTimeout(function(){t.settings.openOnFocus=!0},0)):t.focus())}),t.$control_input.attr({role:"combobox","aria-expanded":"false",haspopup:"listbox","aria-owns":s,"aria-label":t.$wrapper.closest("[data-accessibility-selectize-label]").attr("data-accessibility-selectize-label")}),t.$dropdown_content.attr({role:"listbox",id:s}),t.accessibility.liveRegion.init()}}(),this.destroy=function(){var e=t.destroy;return function(){return t.accessibility.liveRegion.$region.remove(),e.apply(this,arguments)}}()});
|
||||
"use strict";Selectize.define("selectize-plugin-a11y",function(c){var t=this,l=13;typeof t.accessibility=="undefined"&&(t.accessibility={}),t.accessibility.helpers={randomId:function(e){for(var a="",s=e||10,r="abcdefghijklmnopqrstuvwxyz0123456789",n=r.length,o=0;o<s;o++)a+=r[Math.floor(n*Math.random())];return a}},t.accessibility.liveRegion={$region:"",speak:function(e){var a=$("<div></div>");a.text(e),this.$region.html(a)},domListener:function(){var e=new MutationObserver(function(a){a.forEach(function(s){var r=$(s.target);if(r.hasClass("items"))if(r.hasClass("dropdown-active")){t.$control_input.attr("aria-expanded","true");var n=t.$dropdown_content[0].children;for(i=0;i<n.length;i++){var o=n[i].attributes;o.role||n[i].setAttribute("role","option"),o.id||n[i].setAttribute("id",t.accessibility.helpers.randomId())}}else t.$control_input.attr("aria-expanded","false"),t.$control_input.removeAttr("aria-activedescendant");else r.hasClass("active")&&r.attr("data-value")&&(t.$control_input.attr("aria-activedescendant",r.attr("id")),t.accessibility.liveRegion.speak(r.text(),500))})});e.observe(t.$dropdown[0],{attributes:!0,attributeFilter:["class"],subtree:!0,attributeOldValue:!0}),e.observe(t.$control[0],{attributes:!0,attributeFilter:["class"]}),e.observe(t.$control_input[0],{attributes:!0,attributeFilter:["value"]})},setAttributes:function(){this.$region.attr({"aria-live":"assertive",role:"log","aria-relevant":"additions","aria-atomic":"true"})},setStyles:function(){this.$region.css({position:"absolute",width:"1px",height:"1px","margin-top":"-1px",clip:"rect(1px, 1px, 1px, 1px)",overflow:"hidden"})},init:function(){this.$region=$("<div>"),this.setAttributes(),this.setStyles(),$("body").append(this.$region),this.domListener()}},this.setup=function(){var e=t.setup;return function(){e.apply(this,arguments);var a=t.accessibility.helpers.randomId(),s=t.accessibility.helpers.randomId();t.$control.on("keydown",function(r){r.keyCode===l&&(t.settings.openOnFocus?(t.settings.openOnFocus=!1,t.focus(),setTimeout(function(){t.settings.openOnFocus=!0},0)):t.focus())}),t.$control_input.attr({role:"combobox","aria-expanded":"false",haspopup:"listbox","aria-owns":s,"aria-label":t.$wrapper.closest("[data-accessibility-selectize-label]").attr("data-accessibility-selectize-label")}),t.$dropdown_content.attr({role:"listbox",id:s}),t.accessibility.liveRegion.init()}}(),this.destroy=function(){var e=t.destroy;return function(){return t.accessibility.liveRegion.$region.remove(),e.apply(this,arguments)}}()});
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
/*! shiny 1.7.1.9003 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
#showcase-well{border-radius:0}.shiny-code{background-color:#fff;margin-bottom:0}.shiny-code code{font-family:Menlo,Consolas,"Courier New",monospace}.shiny-code-container{margin-top:20px;clear:both}.shiny-code-container h3{display:inline;margin-right:15px}.showcase-header{font-size:16px;font-weight:normal}.showcase-code-link{text-align:right;padding:15px}#showcase-app-container{vertical-align:top}#showcase-code-tabs{margin-right:15px}#showcase-code-tabs pre{border:none;line-height:1em}#showcase-code-tabs .nav{margin-bottom:0}#showcase-code-tabs ul{margin-bottom:0}#showcase-code-tabs .tab-content{border-style:solid;border-color:#e5e5e5;border-width:0px 1px 1px 1px;overflow:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#showcase-app-code{width:100%}#showcase-code-position-toggle{float:right}#showcase-sxs-code{padding-top:20px;vertical-align:top}.showcase-code-license{display:block;text-align:right}#showcase-code-content pre{background-color:#fff}
|
||||
/*! shiny 1.7.2.9001 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
#showcase-well{border-radius:0}.shiny-code{background-color:#fff;margin-bottom:0}.shiny-code code{font-family:Menlo,Consolas,Courier New,monospace}.shiny-code-container{margin-top:20px;clear:both}.shiny-code-container h3{display:inline;margin-right:15px}.showcase-header{font-size:16px;font-weight:400}.showcase-code-link{text-align:right;padding:15px}#showcase-app-container{vertical-align:top}#showcase-code-tabs{margin-right:15px}#showcase-code-tabs pre{border:none;line-height:1em}#showcase-code-tabs .nav,#showcase-code-tabs ul{margin-bottom:0}#showcase-code-tabs .tab-content{border-style:solid;border-color:#e5e5e5;border-width:0px 1px 1px 1px;overflow:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#showcase-app-code{width:100%}#showcase-code-position-toggle{float:right}#showcase-sxs-code{padding-top:20px;vertical-align:top}.showcase-code-license{display:block;text-align:right}#showcase-code-content pre{background-color:#fff}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
/*! shiny 1.7.1.9003 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
(function(){var a=eval;window.addEventListener("message",function(i){var e=i.data;e.code&&a(e.code)});})();
|
||||
/*! shiny 1.7.2.9001 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
"use strict";(function(){var a=eval;window.addEventListener("message",function(i){var e=i.data;e.code&&a(e.code)});})();
|
||||
//# sourceMappingURL=shiny-testmode.js.map
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
"version": 3,
|
||||
"sources": ["../../../srcts/src/utils/eval.ts", "../../../srcts/extras/shiny-testmode.ts"],
|
||||
"sourcesContent": ["//esbuild.github.io/content-types/#direct-eval\n//tl/dr;\n// * Direct usage of `eval(\"x\")` is bad with bundled code.\n// * Instead, use indirect calls to `eval` such as `indirectEval(\"x\")`\n// * Even just renaming the function works well enough.\n// > This is known as \"indirect eval\" because eval is not being called directly, and so does not trigger the grammatical special case for direct eval in the JavaScript VM. You can call indirect eval using any syntax at all except for an expression of the exact form eval('x'). For example, var eval2 = eval; eval2('x') and [eval][0]('x') and window.eval('x') are all indirect eval calls.\n// > When you use indirect eval, the code is evaluated in the global scope instead of in the inline scope of the caller.\nvar indirectEval = eval;\nexport { indirectEval };", "/* eslint-disable unicorn/filename-case */\nimport { indirectEval } from \"../src/utils/eval\"; // Listen for messages from parent frame. This file is only added when the\n// shiny.testmode option is TRUE.\n\nwindow.addEventListener(\"message\", function (e) {\n var message = e.data;\n if (message.code) indirectEval(message.code);\n});"],
|
||||
"mappings": ";YAOA,GAAI,GAAe,KCHnB,OAAO,iBAAiB,UAAW,SAAU,EAAG,CAC9C,GAAI,GAAU,EAAE,KAChB,AAAI,EAAQ,MAAM,EAAa,EAAQ",
|
||||
"names": []
|
||||
"mappings": ";yBAOA,IAAIA,EAAe,KCHnB,OAAO,iBAAiB,UAAW,SAAUC,EAAG,CAC9C,IAAIC,EAAUD,EAAE,KACZC,EAAQ,MAAMC,EAAaD,EAAQ,IAAI,CAC7C,CAAC",
|
||||
"names": ["indirectEval", "e", "message", "indirectEval"]
|
||||
}
|
||||
|
||||
4
inst/www/shared/shiny.min.css
vendored
4
inst/www/shared/shiny.min.js
vendored
@@ -86,6 +86,11 @@ pre.shiny-text-output {
|
||||
}
|
||||
}
|
||||
|
||||
.shiny-image-output, .shiny-plot-output {
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
#shiny-disconnected-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
|
||||
@@ -42,7 +42,7 @@ In the example here, the \code{bindCache()} key consists of \code{input$x} and
|
||||
\code{input$y} combined, and the value is \code{input$x * input$y}. In this simple
|
||||
example, for any given key, there is only one possible returned value.
|
||||
|
||||
\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
|
||||
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
|
||||
bindCache(input$x, input$y)
|
||||
}\if{html}{\out{</div>}}
|
||||
|
||||
@@ -67,7 +67,7 @@ have a large data set with timestamps, it might make sense to extract the
|
||||
most recent timestamp and return that. Then, instead of hashing the entire
|
||||
data object, the cached reactive only needs to hash the timestamp.
|
||||
|
||||
\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ compute(bigdata()) \} \%>\%
|
||||
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ compute(bigdata()) \} \%>\%
|
||||
bindCache(\{ extract_most_recent_time(bigdata()) \})
|
||||
}\if{html}{\out{</div>}}
|
||||
|
||||
@@ -111,7 +111,7 @@ time that someone accesses the cached reactive. It is only re-executed if
|
||||
it has been invalidated by one of the reactives it depends on. For
|
||||
example, suppose we have this cached reactive:
|
||||
|
||||
\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
|
||||
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{ input$x * input$y \}) \%>\%
|
||||
bindCache(input$x, input$y)
|
||||
}\if{html}{\out{</div>}}
|
||||
|
||||
@@ -276,7 +276,7 @@ cache key, in addition to the one passed to \code{bindCache()} by the user. The
|
||||
cache hint can be viewed by calling the internal Shiny function
|
||||
\code{extractCacheHint()}:
|
||||
|
||||
\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- renderText(\{ input$x \})
|
||||
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- renderText(\{ input$x \})
|
||||
shiny:::extractCacheHint(r)
|
||||
}\if{html}{\out{</div>}}
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ user sets both \code{x} and \code{y}, and then clicks on an \link{actionButton}
|
||||
To use both caching and events, the object should first be passed to
|
||||
\code{bindCache()}, then \code{bindEvent()}. For example:
|
||||
|
||||
\if{html}{\out{<div class="sourceCode NA">}}\preformatted{r <- reactive(\{
|
||||
\if{html}{\out{<div class="sourceCode">}}\preformatted{r <- reactive(\{
|
||||
Sys.sleep(2) # Pretend this is an expensive computation
|
||||
input$x * input$y
|
||||
\}) \%>\%
|
||||
|
||||
@@ -125,12 +125,12 @@ function.
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{quoToFunction}: convert a quosure to a function.
|
||||
\item \code{quoToFunction()}: convert a quosure to a function.
|
||||
|
||||
\item \code{installExprFunction}: converts a user's reactive \code{expr} into a
|
||||
\item \code{installExprFunction()}: converts a user's reactive \code{expr} into a
|
||||
function that's assigned to a \code{name} in the \code{assign.env}.
|
||||
}}
|
||||
|
||||
}}
|
||||
\examples{
|
||||
# A custom render function that repeats the supplied value 3 times
|
||||
renderTriple <- function(expr) {
|
||||
|
||||
@@ -84,20 +84,20 @@ Please see the function descriptions for more details.
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{devmode}: Function to set two options to enable/disable Shiny
|
||||
\item \code{devmode()}: Function to set two options to enable/disable Shiny
|
||||
Developer Mode and Developer messages
|
||||
|
||||
\item \code{in_devmode}: Determines if Shiny is in Developer Mode. If the
|
||||
\item \code{in_devmode()}: Determines if Shiny is in Developer Mode. If the
|
||||
\code{getOption("shiny.devmode")} is set to \code{TRUE} and not in testing inside
|
||||
\code{testthat}, then Shiny Developer Mode is enabled.
|
||||
|
||||
\item \code{with_devmode}: Temporarily set Shiny Developer Mode and Developer
|
||||
\item \code{with_devmode()}: Temporarily set Shiny Developer Mode and Developer
|
||||
message verbosity
|
||||
|
||||
\item \code{devmode_inform}: If Shiny Developer Mode and verbosity are enabled,
|
||||
\item \code{devmode_inform()}: If Shiny Developer Mode and verbosity are enabled,
|
||||
displays a message once every 8 hrs (by default)
|
||||
|
||||
\item \code{register_devmode_option}: Registers a Shiny Developer Mode option with an updated
|
||||
\item \code{register_devmode_option()}: Registers a Shiny Developer Mode option with an updated
|
||||
value and Developer message. This registration method allows package
|
||||
authors to write one message in a single location.
|
||||
|
||||
@@ -138,7 +138,7 @@ register_devmode_option(
|
||||
)
|
||||
}\if{html}{\out{</div>}}
|
||||
|
||||
\item \code{get_devmode_option}: Provides a consistent way to change the expected
|
||||
\item \code{get_devmode_option()}: Provides a consistent way to change the expected
|
||||
\code{\link[=getOption]{getOption()}} behavior when Developer Mode is enabled. This method is very
|
||||
similar to \code{\link[=getOption]{getOption()}} where the globally set option takes precedence.
|
||||
See section "Avoiding direct dependency on shiny" for
|
||||
@@ -148,8 +148,8 @@ See section "Avoiding direct dependency on shiny" for
|
||||
\code{register_devmode_option()} to avoid supplying the same \code{devmode_default}
|
||||
and \code{devmode_message} values throughout your package. (This requires a
|
||||
\pkg{shiny} dependency.)
|
||||
}}
|
||||
|
||||
}}
|
||||
\section{Avoiding direct dependency on shiny}{
|
||||
|
||||
|
||||
|
||||
@@ -9,19 +9,29 @@ htmlOutput(
|
||||
outputId,
|
||||
inline = FALSE,
|
||||
container = if (inline) span else div,
|
||||
fill = FALSE,
|
||||
...
|
||||
)
|
||||
|
||||
uiOutput(outputId, inline = FALSE, container = if (inline) span else div, ...)
|
||||
uiOutput(
|
||||
outputId,
|
||||
inline = FALSE,
|
||||
container = if (inline) span else div,
|
||||
fill = FALSE,
|
||||
...
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{outputId}{output variable to read the value from}
|
||||
\item{outputId}{output variable to read the value from.}
|
||||
|
||||
\item{inline}{use an inline (\code{span()}) or block container (\code{div()})
|
||||
for the output}
|
||||
|
||||
\item{container}{a function to generate an HTML element to contain the text}
|
||||
|
||||
\item{fill}{Whether the output should be allowed to grow/shrink to the size
|
||||
of the \code{container}. Ignored when \code{inline = TRUE}.}
|
||||
|
||||
\item{...}{Other arguments to pass to the container tag function. This is
|
||||
useful for providing additional classes for the tag.}
|
||||
}
|
||||
@@ -30,12 +40,12 @@ An HTML output element that can be included in a panel
|
||||
}
|
||||
\description{
|
||||
Render a reactive output variable as HTML within an application page. The
|
||||
text will be included within an HTML \code{div} tag, and is presumed to
|
||||
contain HTML content which should not be escaped.
|
||||
text will be included within an HTML \code{div} tag, and is presumed to contain
|
||||
HTML content which should not be escaped.
|
||||
}
|
||||
\details{
|
||||
\code{uiOutput} is intended to be used with \code{renderUI} on the server
|
||||
side. It is currently just an alias for \code{htmlOutput}.
|
||||
\code{uiOutput} is intended to be used with \code{renderUI} on the server side. It is
|
||||
currently just an alias for \code{htmlOutput}.
|
||||
}
|
||||
\examples{
|
||||
htmlOutput("summary")
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
\usage{
|
||||
imageOutput(
|
||||
outputId,
|
||||
width = "100\%",
|
||||
height = "400px",
|
||||
width = NULL,
|
||||
height = NULL,
|
||||
click = NULL,
|
||||
dblclick = NULL,
|
||||
hover = NULL,
|
||||
@@ -18,8 +18,8 @@ imageOutput(
|
||||
|
||||
plotOutput(
|
||||
outputId,
|
||||
width = "100\%",
|
||||
height = "400px",
|
||||
width = NULL,
|
||||
height = NULL,
|
||||
click = NULL,
|
||||
dblclick = NULL,
|
||||
hover = NULL,
|
||||
|
||||
@@ -51,11 +51,11 @@ of the source code of your reactive expressions and observers.
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{reactlog}: Return a list of reactive information. Can be used in conjunction with
|
||||
\item \code{reactlog()}: Return a list of reactive information. Can be used in conjunction with
|
||||
\link[reactlog:reactlog_show]{reactlog::reactlog_show} to later display the reactlog graph.
|
||||
|
||||
\item \code{reactlogShow}: Display a full reactlog graph for all sessions.
|
||||
\item \code{reactlogShow()}: Display a full reactlog graph for all sessions.
|
||||
|
||||
\item \code{reactlogReset()}: Resets the entire reactlog stack. Useful for debugging and removing all prior reactive history.
|
||||
|
||||
\item \code{reactlogReset}: Resets the entire reactlog stack. Useful for debugging and removing all prior reactive history.
|
||||
}}
|
||||
|
||||
|
||||
@@ -96,9 +96,10 @@ The equivalent of hitting the browser's Reload button. Only works if the
|
||||
session is actually connected.
|
||||
}
|
||||
\item{request}{
|
||||
An environment that implements the Rook specification for HTTP requests.
|
||||
This is the request that was used to initiate the websocket connection
|
||||
(as opposed to the request that downloaded the web page for the app).
|
||||
An environment that implements the \href{https://github.com/jeffreyhorner/Rook#the-environment}{Rook specification} for
|
||||
HTTP requests. This is the request that was used to initiate the websocket
|
||||
connection (as opposed to the request that downloaded the web page for the
|
||||
app).
|
||||
}
|
||||
\item{userData}{
|
||||
An environment for app authors and module/package authors to store whatever
|
||||
|
||||
@@ -31,7 +31,7 @@ the Shiny application's page. It must take an \code{input} and an
|
||||
optional \code{session} parameter, which is used when greater control is
|
||||
needed.
|
||||
|
||||
See the \href{https://rstudio.github.io/shiny/tutorial/}{tutorial} for more
|
||||
See the \href{https://shiny.rstudio.com/tutorial/}{tutorial} for more
|
||||
on how to write a server function.
|
||||
}
|
||||
\examples{
|
||||
|
||||
@@ -29,12 +29,12 @@ Create a tab panel
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{tabPanel}: Create a tab panel that can be included within a \code{\link[=tabsetPanel]{tabsetPanel()}} or a \code{\link[=navbarPage]{navbarPage()}}.
|
||||
\item \code{tabPanel()}: Create a tab panel that can be included within a \code{\link[=tabsetPanel]{tabsetPanel()}} or a \code{\link[=navbarPage]{navbarPage()}}.
|
||||
|
||||
\item \code{tabPanelBody}: Create a tab panel that drops the title argument.
|
||||
\item \code{tabPanelBody()}: Create a tab panel that drops the title argument.
|
||||
This function should be used within \code{tabsetPanel(type = "hidden")}. See \code{\link[=tabsetPanel]{tabsetPanel()}} for example usage.
|
||||
}}
|
||||
|
||||
}}
|
||||
\examples{
|
||||
# Show a tabset that includes a plot, summary, and
|
||||
# table view of the generated distribution
|
||||
|
||||
37
package.json
@@ -3,7 +3,7 @@
|
||||
"homepage": "https://shiny.rstudio.com",
|
||||
"repository": "github:rstudio/shiny",
|
||||
"name": "@types/rstudio-shiny",
|
||||
"version": "1.7.1-alpha.9003",
|
||||
"version": "1.7.2-alpha.9001",
|
||||
"license": "GPL-3.0-only",
|
||||
"main": "",
|
||||
"browser": "",
|
||||
@@ -23,7 +23,7 @@
|
||||
"@types/bootstrap-datepicker": "0.0.14",
|
||||
"@types/datatables.net": "^1.10.19",
|
||||
"@types/ion-rangeslider": "2.3.0",
|
||||
"@types/jquery": "patch:@types/jquery@3.5.5#./srcts/patch/types-jquery.patch",
|
||||
"@types/jquery": "3.5.14",
|
||||
"@types/selectize": "0.12.34"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -32,33 +32,34 @@
|
||||
"@babel/preset-env": "^7.14.2",
|
||||
"@babel/preset-typescript": "^7.13.0",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@deanc/esbuild-plugin-postcss": "^1.0.1",
|
||||
"@deanc/esbuild-plugin-postcss": "^1.0.2",
|
||||
"@testing-library/dom": "^7.31.0",
|
||||
"@testing-library/jest-dom": "^5.12.0",
|
||||
"@testing-library/user-event": "^13.1.9",
|
||||
"@types/highlightjs": "^9.12.1",
|
||||
"@types/jest": "^26.0.23",
|
||||
"@types/jqueryui": "1.12.15",
|
||||
"@types/jqueryui": "1.12.16",
|
||||
"@types/lodash": "^4.14.170",
|
||||
"@types/node": "^15.6.1",
|
||||
"@types/showdown": "^1.9.3",
|
||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
||||
"@typescript-eslint/parser": "^4.25.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
||||
"@typescript-eslint/parser": "^5.38.1",
|
||||
"autoprefixer": "^10.2.6",
|
||||
"bootstrap-datepicker": "1.9.0",
|
||||
"browserslist": "^4.19.1",
|
||||
"caniuse-lite": "^1.0.30001312",
|
||||
"core-js": "^3.13.0",
|
||||
"esbuild": "^0.12.4",
|
||||
"esbuild": "^0.15.10",
|
||||
"esbuild-plugin-babel": "https://github.com/schloerke/esbuild-plugin-babel#patch-2",
|
||||
"esbuild-plugin-globals": "^0.1.1",
|
||||
"esbuild-plugin-sass": "^0.5.2",
|
||||
"eslint": "^7.27.0",
|
||||
"eslint-config-prettier": "^7.2.0",
|
||||
"eslint-plugin-jest": "^24.3.6",
|
||||
"eslint-plugin-jest-dom": "^3.9.0",
|
||||
"eslint-plugin-prettier": "^3.4.0",
|
||||
"eslint-plugin-unicorn": "^33.0.1",
|
||||
"esbuild-plugin-sass": "^1.0.1",
|
||||
"eslint": "^8.24.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-jest": "^27.0.4",
|
||||
"eslint-plugin-jest-dom": "^4.0.2",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-unicorn": "^43.0.2",
|
||||
"fs-readdir-recursive": "^1.1.0",
|
||||
"ion-rangeslider": "2.3.1",
|
||||
"jest": "^26.6.3",
|
||||
"jquery": "3.6.0",
|
||||
@@ -67,15 +68,15 @@
|
||||
"node-gyp": "^8.1.0",
|
||||
"phantomjs-prebuilt": "^2.1.16",
|
||||
"postcss": "^8.3.5",
|
||||
"prettier": "2.3.0",
|
||||
"prettier": "^2.7.1",
|
||||
"readcontrol": "^1.0.0",
|
||||
"replace": "^1.2.1",
|
||||
"selectize": "0.12.4",
|
||||
"strftime": "0.9.2",
|
||||
"ts-jest": "^26",
|
||||
"ts-node": "^10.0.0",
|
||||
"type-coverage": "^2.17.5",
|
||||
"typescript": "~4.1.5",
|
||||
"ts-node": "^10.9.1",
|
||||
"type-coverage": "^2.22.0",
|
||||
"typescript": "^4.8.4",
|
||||
"util-inspect": "https://github.com/deecewan/browser-util-inspect#c0b4350df4378ffd743e8c36dd3898ce3992823e"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
948
revdep/README.md
@@ -1,944 +1,12 @@
|
||||
# Platform
|
||||
|
||||
|field |value |
|
||||
|:--------|:----------------------------|
|
||||
|version |R version 4.0.0 (2020-04-24) |
|
||||
|os |macOS Catalina 10.15.5 |
|
||||
|system |x86_64, darwin17.0 |
|
||||
|ui |X11 |
|
||||
|language |(EN) |
|
||||
|collate |en_US.UTF-8 |
|
||||
|ctype |en_US.UTF-8 |
|
||||
|tz |America/New_York |
|
||||
|date |2020-06-19 |
|
||||
|
||||
# Dependencies
|
||||
|
||||
|package |old |new |Δ |
|
||||
|:-------|:-------|:-----|:--|
|
||||
|shiny |1.4.0.2 |1.5.0 |* |
|
||||
|
||||
# Revdeps
|
||||
|
||||
## Failed to check (3)
|
||||
## Failed to check (5)
|
||||
|
||||
|package |version |error |warning |note |
|
||||
|:--------------------------------------|:-------|:-----|:-------|:----|
|
||||
|[frailtypack](failures.md#frailtypack) |3.3.0 |1 | | |
|
||||
|[Rariant](failures.md#rariant) |1.24.0 |1 | | |
|
||||
|[skeleSim](failures.md#skelesim) |0.9.8 |1 | | |
|
||||
|
||||
## New problems (2)
|
||||
|
||||
|package |version |error |warning |note |
|
||||
|:--------------------------------------------|:-------|:------|:-------|:--------|
|
||||
|[bsplus](problems.md#bsplus) |0.1.1 |__+1__ | |1 |
|
||||
|[RforProteomics](problems.md#rforproteomics) |1.26.0 | |1 |2 __+1__ |
|
||||
|
||||
## All (902)
|
||||
|
||||
|package |version |error |warning |note |
|
||||
|:------------------------------------------------------------------------|:----------|:------|:-------|:--------|
|
||||
|[aaSEA](problems.md#aasea) |1.1.0 | | |1 |
|
||||
|ABACUS |1.0.0 | | | |
|
||||
|abstractr |0.1.0 | | | |
|
||||
|[ADAMgui](problems.md#adamgui) |1.4.0 | | |2 |
|
||||
|[adapr](problems.md#adapr) |2.0.0 | | |1 |
|
||||
|AdaptGauss |1.5.6 | | | |
|
||||
|adaptiveGPCA |0.1.2 | | | |
|
||||
|addinslist |0.3 | | | |
|
||||
|addinsOutline |0.1.6 | | | |
|
||||
|[adegenet](problems.md#adegenet) |2.1.3 | | |1 |
|
||||
|[adepro](problems.md#adepro) |3.0.0 | | |1 |
|
||||
|adespatial |0.3-8 | | | |
|
||||
|[AdhereRViz](problems.md#adhererviz) |0.1.0 | | |1 |
|
||||
|AFheritability |0.1.0 | | | |
|
||||
|AFM |1.2.6 | | | |
|
||||
|ahp |0.2.12 | | | |
|
||||
|airGRteaching |0.2.8.69 | | | |
|
||||
|[alevinQC](problems.md#alevinqc) |1.4.0 | | |1 |
|
||||
|AMModels |0.1.4 | | | |
|
||||
|AmpGram |1.0 | | | |
|
||||
|[AMPLE](problems.md#ample) |0.0.2 | | |1 |
|
||||
|AmyloGram |1.1 | | | |
|
||||
|[analysisPipelines](problems.md#analysispipelines) |1.0.2 | | |1 |
|
||||
|[animalcules](problems.md#animalcules) |1.4.0 |-1 | |4 |
|
||||
|[animaltracker](problems.md#animaltracker) |0.1.0 | | |1 |
|
||||
|[animint2](problems.md#animint2) |2019.7.3 |2 | |2 |
|
||||
|aniview |0.1.0 | | | |
|
||||
|[ANOVAIREVA](problems.md#anovaireva) |0.1.0 | | |1 |
|
||||
|ANOVAreplication |1.1.4 | | | |
|
||||
|[ANOVAShiny](problems.md#anovashiny) |0.1.0 | | |1 |
|
||||
|antaresRead |2.2.5 | | | |
|
||||
|antaresViz |0.15.2 | | | |
|
||||
|AnthropMMD |3.0.1 | | | |
|
||||
|[antitrust](problems.md#antitrust) |0.99.11 | | |1 |
|
||||
|aos |0.1.0 | | | |
|
||||
|[apexcharter](problems.md#apexcharter) |0.1.4 | | |1 |
|
||||
|[appreci8R](problems.md#appreci8r) |1.6.0 |1 | | |
|
||||
|[ArchaeoPhases](problems.md#archaeophases) |1.4.5 | | |1 |
|
||||
|archivist |2.3.4 | | | |
|
||||
|[arena2r](problems.md#arena2r) |1.0.0 | | |1 |
|
||||
|argonDash |0.2.0 | | | |
|
||||
|argonR |0.2.0 | | | |
|
||||
|ARPobservation |1.2.0 | | | |
|
||||
|arulesViz |1.3-3 | | | |
|
||||
|asciiSetupReader |2.3.1 | | | |
|
||||
|[ASSOCShiny](problems.md#assocshiny) |0.1.0 | | |1 |
|
||||
|[AUCell](problems.md#aucell) |1.10.0 | | |4 |
|
||||
|auth0 |0.2.1 | | | |
|
||||
|AutoDeskR |0.1.3 | | | |
|
||||
|autoshiny |0.0.2 | | | |
|
||||
|[autoTS](problems.md#autots) |0.9.11 | | |1 |
|
||||
|AzureAuth |1.2.4 | | | |
|
||||
|azuremlsdk |0.6.85 | | | |
|
||||
|backpipe |0.2.3 | | | |
|
||||
|bairt |0.1.2 | | | |
|
||||
|baRcodeR |0.1.5 | | | |
|
||||
|[BARIS](problems.md#baris) |1.1.1 | | |1 |
|
||||
|basictabler |0.3.1 | | | |
|
||||
|[BatchQC](problems.md#batchqc) |1.16.0 |1 | |1 |
|
||||
|[BayesBD](problems.md#bayesbd) |1.2 |1 | | |
|
||||
|BayesianFROC |0.2.3 | | | |
|
||||
|[BayesianNetwork](problems.md#bayesiannetwork) |0.1.5 | | |1 |
|
||||
|[BayesNetBP](problems.md#bayesnetbp) |1.5.2 | | |1 |
|
||||
|[BBEST](problems.md#bbest) |0.1-6 |1 | | |
|
||||
|[BCEA](problems.md#bcea) |2.3-1.1 | | |1 |
|
||||
|[bdchecks](problems.md#bdchecks) |0.1.7 | | |1 |
|
||||
|[bdclean](problems.md#bdclean) |0.1.15 | | |1 |
|
||||
|bdDwC |0.1.15 | | | |
|
||||
|[bde](problems.md#bde) |1.0.1 | | |1 |
|
||||
|BDEsize |1.2 | | | |
|
||||
|BDP2 |0.1.3 | | | |
|
||||
|[bea.R](problems.md#bear) |1.0.6 | | |1 |
|
||||
|BEACH |1.3.1 | | | |
|
||||
|[beanz](problems.md#beanz) |2.4 | | |3 |
|
||||
|beats |0.1.1 | | | |
|
||||
|[bestSDP](problems.md#bestsdp) |0.1.2 | | |1 |
|
||||
|[BETS](problems.md#bets) |0.4.9 | |2 |1 |
|
||||
|[bibliometrix](problems.md#bibliometrix) |3.0.2 | | |1 |
|
||||
|BIGL |1.4.3 | | | |
|
||||
|[bigPint](problems.md#bigpint) |1.4.0 | | |1 |
|
||||
|[bigQueryR](problems.md#bigqueryr) |0.5.0 | | |1 |
|
||||
|[billboarder](problems.md#billboarder) |0.2.8 | | |1 |
|
||||
|[binovisualfields](problems.md#binovisualfields) |0.1.1 | | |1 |
|
||||
|[bioCancer](problems.md#biocancer) |1.16.0 | |1 |2 |
|
||||
|[BiocOncoTK](problems.md#bioconcotk) |1.8.0 |1 | |3 |
|
||||
|[BioInstaller](problems.md#bioinstaller) |0.3.7 | | |1 |
|
||||
|[BioNetStat](problems.md#bionetstat) |1.8.4 | | |4 |
|
||||
|[BIRDS](problems.md#birds) |0.1 | | |2 |
|
||||
|[biva](problems.md#biva) |0.1.0 | | |1 |
|
||||
|[blkbox](problems.md#blkbox) |1.0 | | |2 |
|
||||
|[blockCV](problems.md#blockcv) |2.1.1 | | |1 |
|
||||
|blogdown |0.19 | | | |
|
||||
|[BLRShiny](problems.md#blrshiny) |0.1.0 | | |1 |
|
||||
|bookdown |0.19 | | | |
|
||||
|bpbounds |0.1.4 | | | |
|
||||
|bridger2 |0.1.0 | | | |
|
||||
|bs4Dash |0.5.0 | | | |
|
||||
|bSims |0.2-1 | | | |
|
||||
|[bsplus](problems.md#bsplus) |0.1.1 |__+1__ | |1 |
|
||||
|bullwhipgame |0.1.0 | | | |
|
||||
|bunchr |1.2.0 | | | |
|
||||
|bupaR |0.4.4 | | | |
|
||||
|[caffsim](problems.md#caffsim) |0.2.2 | | |1 |
|
||||
|CamelUp |0.1.1 | | | |
|
||||
|[canvasXpress](problems.md#canvasxpress) |1.27.6-1 | | |1 |
|
||||
|[CaPO4Sim](problems.md#capo4sim) |0.1.0 | | |1 |
|
||||
|[cartools](problems.md#cartools) |0.1.0 | | |1 |
|
||||
|causaloptim |0.7.1 | | | |
|
||||
|cbsodataR |0.4.1 | | | |
|
||||
|[ChAMP](problems.md#champ) |2.18.2 |1 | | |
|
||||
|ChannelAttributionApp |1.2 | | | |
|
||||
|cheatR |1.2.1 | | | |
|
||||
|[CHETAH](problems.md#chetah) |1.4.0 | | |2 |
|
||||
|[chipPCR](problems.md#chippcr) |0.0.8-10 | | |1 |
|
||||
|[chromoMap](problems.md#chromomap) |0.2 | | |1 |
|
||||
|chromVAR |1.10.0 | | | |
|
||||
|[cicerone](problems.md#cicerone) |1.0.1 | | |1 |
|
||||
|Cite |0.1.0 | | | |
|
||||
|citr |0.3.2 | | | |
|
||||
|[cjoint](problems.md#cjoint) |2.1.0 | | |2 |
|
||||
|CLME |2.0-12 | | | |
|
||||
|[clustDRM](problems.md#clustdrm) |0.1-0 | | |1 |
|
||||
|[CLUSTShiny](problems.md#clustshiny) |0.1.0 | | |1 |
|
||||
|cmsaf |2.0.1 |-1 | | |
|
||||
|[CMShiny](problems.md#cmshiny) |0.1.0 | | |1 |
|
||||
|cNORM |1.2.3 | | | |
|
||||
|[CNVPanelizer](problems.md#cnvpanelizer) |1.20.0 | | |1 |
|
||||
|CNVScope |3.0.9 | | | |
|
||||
|[cocktailApp](problems.md#cocktailapp) |0.2.1 | | |1 |
|
||||
|[codebook](problems.md#codebook) |0.9.2 | | |2 |
|
||||
|[cognitoR](problems.md#cognitor) |1.0.1 | | |1 |
|
||||
|colocr |0.1.1 | | | |
|
||||
|colorspace |1.4-1 | | | |
|
||||
|colourpicker |1.0 | | | |
|
||||
|compareGroups |4.4.1 | | | |
|
||||
|[COMPASS](problems.md#compass) |1.26.0 | | |3 |
|
||||
|[competitiontoolbox](problems.md#competitiontoolbox) |0.1.2 | | |1 |
|
||||
|complexity |1.1.1 | | | |
|
||||
|condformat |0.9.0 | | | |
|
||||
|condir |0.1.2 | | | |
|
||||
|condvis |0.5-1 | | | |
|
||||
|condvis2 |0.1.0 | | | |
|
||||
|[conflr](problems.md#conflr) |0.1.1 | | |1 |
|
||||
|convertr |0.1 | | | |
|
||||
|[CoRegNet](problems.md#coregnet) |1.26.0 | |1 |2 |
|
||||
|[corporaexplorer](problems.md#corporaexplorer) |0.8.2 | | |1 |
|
||||
|[cosinor](problems.md#cosinor) |1.1 | | |1 |
|
||||
|countfitteR |1.0 | | | |
|
||||
|[coveffectsplot](problems.md#coveffectsplot) |0.0.9 | | |1 |
|
||||
|[CRANsearcher](problems.md#cransearcher) |1.0.0 | | |1 |
|
||||
|[crawl](problems.md#crawl) |2.2.1 | | |1 |
|
||||
|credsubs |1.1.0 | | | |
|
||||
|[crispRdesignR](problems.md#crisprdesignr) |1.1.5 | | |1 |
|
||||
|[crisprseekplus](problems.md#crisprseekplus) |1.14.0 | | |1 |
|
||||
|cromwellDashboard |0.5.1 | | | |
|
||||
|cronR |0.4.0 | | | |
|
||||
|[CrossICC](problems.md#crossicc) |1.2.0 | | |1 |
|
||||
|[crossmeta](problems.md#crossmeta) |1.14.0 | |1 |2 |
|
||||
|crosstalk |1.1.0.1 | | | |
|
||||
|crunchy |0.3.1 | | | |
|
||||
|[CSUV](problems.md#csuv) |0.1.0 |1 | | |
|
||||
|[CTAShiny](problems.md#ctashiny) |0.1.0 | | |1 |
|
||||
|[ctsem](problems.md#ctsem) |3.2.1 | | |3 |
|
||||
|ctsGE |1.14.0 | | | |
|
||||
|[CTShiny](problems.md#ctshiny) |0.1.0 | | |1 |
|
||||
|CTTinShiny |0.1.0 | | | |
|
||||
|CTTShiny |0.1 | | | |
|
||||
|cubeview |0.2.0 | | | |
|
||||
|[CVE](problems.md#cve) |1.11.2 |1 |1 |2 |
|
||||
|cydar |1.12.0 | | | |
|
||||
|CytobankAPIstats |2.0 | | | |
|
||||
|d3heatmap |0.6.1.2 | | | |
|
||||
|[d3Tree](problems.md#d3tree) |0.2.0 | | |1 |
|
||||
|daqapo |0.3.0 | | | |
|
||||
|[datacheck](problems.md#datacheck) |1.2.2 | | |2 |
|
||||
|[datadigest](problems.md#datadigest) |1.0.2 | | |1 |
|
||||
|[dataesgobr](problems.md#dataesgobr) |1.0.0 | | |1 |
|
||||
|datamaps |0.0.3 | | | |
|
||||
|datasets.load |1.4.0 | | | |
|
||||
|daterangepicker |0.1.0 | | | |
|
||||
|dccvalidator |0.2.0 | | | |
|
||||
|ddpcr |1.15 | | | |
|
||||
|[debrowser](problems.md#debrowser) |1.16.1 | | |1 |
|
||||
|deepdep |0.2.1 | | | |
|
||||
|deisotoper |0.0.7 | | | |
|
||||
|[delayed](problems.md#delayed) |0.3.0 | | |1 |
|
||||
|demoShiny |0.1 | | | |
|
||||
|[DEP](problems.md#dep) |1.10.0 | | |1 |
|
||||
|[detzrcr](problems.md#detzrcr) |0.3.0 | | |1 |
|
||||
|dextergui |0.2.2 | | | |
|
||||
|diffr |0.1 | | | |
|
||||
|dipsaus |0.0.7 | | | |
|
||||
|[DiscoRhythm](problems.md#discorhythm) |1.4.0 | | |2 |
|
||||
|discoveR |1.2.4 | | | |
|
||||
|disk.frame |0.3.6 | | | |
|
||||
|distcomp |1.1 | | | |
|
||||
|distill |0.8 | | | |
|
||||
|distreg.vis |1.7.0 | | | |
|
||||
|Distributacalcul |0.2.2 | | | |
|
||||
|[diveRsity](problems.md#diversity) |1.9.90 | | |1 |
|
||||
|DIZutils |0.0.4 | | | |
|
||||
|[DLMtool](problems.md#dlmtool) |5.4.5 | | |1 |
|
||||
|dmdScheme |1.2 | | | |
|
||||
|[Doscheda](problems.md#doscheda) |1.10.0 | | |1 |
|
||||
|[dosedesignR](problems.md#dosedesignr) |0.2.4 | | |1 |
|
||||
|dpcR |0.5 | | | |
|
||||
|[dplyrAssist](problems.md#dplyrassist) |0.1.0 | | |1 |
|
||||
|dqshiny |0.0.4 | | | |
|
||||
|[dragon](problems.md#dragon) |0.2.1 | | |1 |
|
||||
|dragulaR |0.3.1 | | | |
|
||||
|DRomics |2.0-1 | | | |
|
||||
|[dropR](problems.md#dropr) |0.1 | | |1 |
|
||||
|DSAIDE |0.8.3 | | | |
|
||||
|DSAIRM |0.8.2 | | | |
|
||||
|DT |0.13 | | | |
|
||||
|DTAT |0.3-4 | | | |
|
||||
|[dtwclust](problems.md#dtwclust) |5.5.6 | | |1 |
|
||||
|[DVHmetrics](problems.md#dvhmetrics) |0.3.10 | | |1 |
|
||||
|[dynamichazard](problems.md#dynamichazard) |0.6.6 | | |1 |
|
||||
|DynNom |5.0.1 | | | |
|
||||
|Eagle |2.2 | | | |
|
||||
|eAnalytics |0.1.4 | | | |
|
||||
|easySdcTable |0.5.0 | | | |
|
||||
|[EBImage](problems.md#ebimage) |4.30.0 | |1 |1 |
|
||||
|ECharts2Shiny |0.2.13 | | | |
|
||||
|echarts4r |0.3.2 | | | |
|
||||
|edeaR |0.8.5 | | | |
|
||||
|edgebundleR |0.1.4 | | | |
|
||||
|editData |0.1.2 | | | |
|
||||
|eechidna |1.4.0 | | | |
|
||||
|eemR |1.0.1 | | | |
|
||||
|EffectLiteR |0.4-4 | | | |
|
||||
|[effectR](problems.md#effectr) |1.0.2 | | |1 |
|
||||
|egor |0.20.06 | | | |
|
||||
|einet |0.1.0 | | | |
|
||||
|elaborator |1.0 | | | |
|
||||
|[elementR](problems.md#elementr) |1.3.6 |1 | | |
|
||||
|[embryogrowth](problems.md#embryogrowth) |7.6 | | |1 |
|
||||
|[EML](problems.md#eml) |2.0.2 | | |1 |
|
||||
|EMMAgeo |0.9.7 | | | |
|
||||
|EMSaov |2.3 | | | |
|
||||
|emuR |2.1.0 | | | |
|
||||
|[ENCODExplorer](problems.md#encodexplorer) |2.14.0 | | |1 |
|
||||
|[enviGCMS](problems.md#envigcms) |0.6.6 | | |1 |
|
||||
|enviPick |1.5 | | | |
|
||||
|[epicontacts](problems.md#epicontacts) |1.1.0 | | |1 |
|
||||
|epimdr |0.6-5 | | | |
|
||||
|EpiModel |1.8.0 | | | |
|
||||
|[EpiSignalDetection](problems.md#episignaldetection) |0.1.1 | | |1 |
|
||||
|[epivizrChart](problems.md#epivizrchart) |1.10.0 | | |2 |
|
||||
|eq5d |0.7.1 | | | |
|
||||
|[erma](problems.md#erma) |1.4.0 | | |2 |
|
||||
|ERSA |0.1.1 | | | |
|
||||
|eSDM |0.3.4 | | | |
|
||||
|eseis |0.5.0 | | | |
|
||||
|esquisse |0.3.0 | | | |
|
||||
|EurosarcBayes |1.1 | | | |
|
||||
|evaluator |0.4.2 | | | |
|
||||
|EventDetectGUI |0.3.0 | | | |
|
||||
|[EventStudy](problems.md#eventstudy) |0.36 | | |2 |
|
||||
|evobiR |1.1 | | | |
|
||||
|excelR |0.4.0 | | | |
|
||||
|ExPanDaR |0.5.1 | | | |
|
||||
|explor |0.3.6 | | | |
|
||||
|explore |0.5.5 | | | |
|
||||
|ExploreModelMatrix |1.0.1 | | | |
|
||||
|[ezplot](problems.md#ezplot) |0.6.1 | | |1 |
|
||||
|Factoshiny |2.2 | | | |
|
||||
|fanplot |3.4.2 | | | |
|
||||
|[farrell](problems.md#farrell) |0.2.0 | | |1 |
|
||||
|[FastqCleaner](problems.md#fastqcleaner) |1.6.0 | | |2 |
|
||||
|[FELLA](problems.md#fella) |1.8.0 |1 | |1 |
|
||||
|findviews |0.1.3 | | | |
|
||||
|fingertipsR |1.0.4 | | | |
|
||||
|[firebase](problems.md#firebase) |0.1.0 | | |1 |
|
||||
|[fitteR](problems.md#fitter) |0.1.0 | | |1 |
|
||||
|[fitur](problems.md#fitur) |0.6.1 | | |1 |
|
||||
|flacco |1.8 | | | |
|
||||
|[flair](problems.md#flair) |0.0.2 | | |1 |
|
||||
|flexdashboard |0.5.1.1 | | | |
|
||||
|[flora](problems.md#flora) |0.3.4 | | |1 |
|
||||
|[flowAI](problems.md#flowai) |1.18.2 | | |1 |
|
||||
|[flowcatchR](problems.md#flowcatchr) |1.22.0 | | |2 |
|
||||
|flowPloidy |1.14.0 | | | |
|
||||
|formatR |1.7 | | | |
|
||||
|formattable |0.2.0.1 | | | |
|
||||
|[frailtypack](failures.md#frailtypack) |3.3.0 |1 | | |
|
||||
|FreqProf |0.0.1 | | | |
|
||||
|frequency |0.4.0 | | | |
|
||||
|fresh |0.2.0 | | | |
|
||||
|[FSK2R](problems.md#fsk2r) |0.1.1 |1 | | |
|
||||
|[FunChIP](problems.md#funchip) |1.14.0 |1 | | |
|
||||
|FuzzyR |2.3 | | | |
|
||||
|G2Sd |2.1.5 | | | |
|
||||
|[g3viz](problems.md#g3viz) |1.1.2 | | |1 |
|
||||
|[GA4GHshiny](problems.md#ga4ghshiny) |1.10.0 |1 | |1 |
|
||||
|[gamesGA](problems.md#gamesga) |1.1.3.7 | | |1 |
|
||||
|[gastempt](problems.md#gastempt) |0.5.0 | | |3 |
|
||||
|gazepath |1.3 | | | |
|
||||
|[GDCRNATools](problems.md#gdcrnatools) |1.8.0 | | |3 |
|
||||
|GDINA |2.8.0 | | | |
|
||||
|genBaRcode |1.2.3 | | | |
|
||||
|[genBart](problems.md#genbart) |1.0.1 | | |1 |
|
||||
|[GeneNetworkBuilder](problems.md#genenetworkbuilder) |1.30.0 | | |1 |
|
||||
|GeneralizedUmatrix |1.1.9 | | | |
|
||||
|[GenEst](problems.md#genest) |1.4.4 | | |1 |
|
||||
|[GeneTonic](problems.md#genetonic) |1.0.1 | | |2 |
|
||||
|genogeographer |0.1.19 | | | |
|
||||
|[GenomicScores](problems.md#genomicscores) |2.0.0 |1 | |4 |
|
||||
|genTS |0.1.3 | | | |
|
||||
|geodrawr |1.0.1 | | | |
|
||||
|[GerminaR](problems.md#germinar) |1.4.2 | | |1 |
|
||||
|gestate |1.4.0 | | | |
|
||||
|getTBinR |0.7.1 | | | |
|
||||
|gfonts |0.1.1 | | | |
|
||||
|[ggedit](problems.md#ggedit) |0.3.1 | | |1 |
|
||||
|[ggExtra](problems.md#ggextra) |0.9 | | |1 |
|
||||
|ggiraph |0.7.0 | | | |
|
||||
|[ggplotAssist](problems.md#ggplotassist) |0.1.3 | | |1 |
|
||||
|ggplotgui |1.0.0 | | | |
|
||||
|[ggquickeda](problems.md#ggquickeda) |0.1.6 | | |1 |
|
||||
|ggraptR |1.2 | | | |
|
||||
|ggThemeAssist |0.1.5 | | | |
|
||||
|ggvis |0.4.5 | | | |
|
||||
|gimmeTools |0.1 | | | |
|
||||
|giphyr |0.2.0 | | | |
|
||||
|gitgadget |0.5.2 | | | |
|
||||
|gitlabr |1.1.6 | | | |
|
||||
|gitlink |0.1.3 | | | |
|
||||
|glmaag |0.0.6 | | | |
|
||||
|GMCM |1.4 | | | |
|
||||
|[gmDatabase](problems.md#gmdatabase) |0.5.0 | |2 |1 |
|
||||
|[GmicR](problems.md#gmicr) |1.2.0 | | |3 |
|
||||
|GMSE |0.6.0.4 | | | |
|
||||
|[GOFShiny](problems.md#gofshiny) |0.1.0 | | |1 |
|
||||
|golem |0.2.1 | | | |
|
||||
|googleAnalyticsR |0.7.1 | | | |
|
||||
|googleAuthR |1.3.0 | | | |
|
||||
|googleCloudRunner |0.2.0 | | | |
|
||||
|googleLanguageR |0.3.0 | | | |
|
||||
|googleVis |0.6.5 | | | |
|
||||
|googleway |2.7.1 | | | |
|
||||
|[GPA](problems.md#gpa) |1.0.0 | | |1 |
|
||||
|GPoM.FDLyapu |1.0 | | | |
|
||||
|[gQTLstats](problems.md#gqtlstats) |1.20.0 | | |4 |
|
||||
|gradientPickerD3 |0.1.0.0 | | | |
|
||||
|[gravitas](problems.md#gravitas) |0.1.2 |2 | | |
|
||||
|[gridsampler](problems.md#gridsampler) |0.6 | | |1 |
|
||||
|[GSCA](problems.md#gsca) |2.17.0 | | |3 |
|
||||
|GSVA |1.36.2 | | | |
|
||||
|[gt](problems.md#gt) |0.2.1 | | |2 |
|
||||
|guiplot |0.1.0 | | | |
|
||||
|[gwdegree](problems.md#gwdegree) |0.1.1 | | |1 |
|
||||
|GWSDAT |3.0.3 | | | |
|
||||
|[HaDeX](problems.md#hadex) |1.2.1 | | |2 |
|
||||
|HARtools |0.0.5 | | | |
|
||||
|[hchinamap](problems.md#hchinamap) |0.1.0 | | |1 |
|
||||
|HelpersMG |4.2 | | | |
|
||||
|HH |3.1-40 | | | |
|
||||
|[highcharter](problems.md#highcharter) |0.7.0 | | |1 |
|
||||
|highlightHTML |0.2.5 | | | |
|
||||
|hpackedbubble |0.1.0 | | | |
|
||||
|hR |0.2.1 | | | |
|
||||
|[HumanTranscriptomeCompendium](problems.md#humantranscriptomecompendium) |1.4.0 |2 | | |
|
||||
|[hwordcloud](problems.md#hwordcloud) |0.1.0 | | |1 |
|
||||
|iAdapt |0.1.0 | | | |
|
||||
|iCellR |1.5.1 | | | |
|
||||
|iCOBRA |1.16.0 | | | |
|
||||
|ICSShiny |0.5 | | | |
|
||||
|[ideal](problems.md#ideal) |1.12.1 | | |1 |
|
||||
|[idefix](problems.md#idefix) |0.4.3 | | |1 |
|
||||
|[idem](problems.md#idem) |5.0 | | |2 |
|
||||
|ifaTools |0.21 | | | |
|
||||
|igraphinshiny |0.1 | | | |
|
||||
|iheatmapr |0.4.12 | | | |
|
||||
|imagefluency |0.2.3 | | | |
|
||||
|Imetagene |1.18.0 | | | |
|
||||
|[immunarch](problems.md#immunarch) |0.6.5 | | |2 |
|
||||
|IMP |1.1 | | | |
|
||||
|ImportExport |1.1 | | | |
|
||||
|[IMWatson](problems.md#imwatson) |0.5.0 | | |1 |
|
||||
|[IncucyteDRC](problems.md#incucytedrc) |0.5.4 |1 | | |
|
||||
|[INDperform](problems.md#indperform) |0.2.2 |2 | |1 |
|
||||
|inferr |0.3.0 | | | |
|
||||
|[inlabru](problems.md#inlabru) |2.1.13 | | |2 |
|
||||
|[INSPEcT](problems.md#inspect) |1.18.0 | | |2 |
|
||||
|[interactiveDisplay](problems.md#interactivedisplay) |1.26.0 | |1 |2 |
|
||||
|interactiveDisplayBase |1.26.3 | | | |
|
||||
|[interAdapt](problems.md#interadapt) |0.1 | | |2 |
|
||||
|interimApp |0.0.1 | | | |
|
||||
|[IOHanalyzer](problems.md#iohanalyzer) |0.1.3 | | |2 |
|
||||
|ioncopy |2.1.1 | | | |
|
||||
|ipc |0.1.3 | | | |
|
||||
|ipumsr |0.4.4 | | | |
|
||||
|irtDemo |0.1.4 | | | |
|
||||
|IRTShiny |1.2 | | | |
|
||||
|[iSEE](problems.md#isee) |2.0.0 |2 | |2 |
|
||||
|[iSEEu](problems.md#iseeu) |1.0.1 |2 | | |
|
||||
|[iSTATS](problems.md#istats) |1.4 | | |1 |
|
||||
|[ivygapSE](problems.md#ivygapse) |1.10.0 | | |2 |
|
||||
|JMbayes |0.8-85 | | | |
|
||||
|JointNets |2.0.1 | | | |
|
||||
|[jpmesh](problems.md#jpmesh) |1.2.1 | | |1 |
|
||||
|[jpndistrict](problems.md#jpndistrict) |0.3.7 | | |1 |
|
||||
|[jsmodule](problems.md#jsmodule) |1.0.8 | | |1 |
|
||||
|KappaGUI |2.0.2 | | | |
|
||||
|KCSKNNShiny |0.1.0 | | | |
|
||||
|KCSNBShiny |0.1.0 | | | |
|
||||
|kgc |1.0.0.2 | | | |
|
||||
|kgschart |1.3.5 | | | |
|
||||
|[KNNShiny](problems.md#knnshiny) |0.1.0 | | |1 |
|
||||
|[kokudosuuchi](problems.md#kokudosuuchi) |0.4.2 | | |1 |
|
||||
|[koRpus](problems.md#korpus) |0.11-5 | | |1 |
|
||||
|lavaan.shiny |1.2 | | | |
|
||||
|LBSPR |0.1.5 | | | |
|
||||
|lcars |0.3.1 | | | |
|
||||
|lcsm |0.1.1 | | | |
|
||||
|LDAvis |0.3.2 | | | |
|
||||
|leaflet |2.0.3 | | | |
|
||||
|[leaflet.extras2](problems.md#leafletextras2) |1.0.0 | | |1 |
|
||||
|leaflet.minicharts |0.6.0 | | | |
|
||||
|learnr |0.10.1 | | | |
|
||||
|[learnstats](problems.md#learnstats) |0.1.1 | | |1 |
|
||||
|[levi](problems.md#levi) |1.6.0 | | |2 |
|
||||
|lifelogr |0.1.0 | | | |
|
||||
|lightsout |0.3 | | | |
|
||||
|[likert](problems.md#likert) |1.3.5 | | |1 |
|
||||
|lime |0.5.1 | | | |
|
||||
|linguisticsdown |1.2.0 | | | |
|
||||
|linkspotter |1.2.0 | | | |
|
||||
|linpk |1.0 | | | |
|
||||
|listviewer |3.0.0 | | | |
|
||||
|[live](problems.md#live) |1.5.13 | | |1 |
|
||||
|[lmviz](problems.md#lmviz) |0.1.2 | | |1 |
|
||||
|manipulateWidget |0.10.1 | | | |
|
||||
|[mapdeck](problems.md#mapdeck) |0.3.3 | | |1 |
|
||||
|[mapedit](problems.md#mapedit) |0.6.0 | | |1 |
|
||||
|markdownInput |0.1.2 | | | |
|
||||
|matman |1.1.0 | | | |
|
||||
|MAVIS |1.1.3 | | | |
|
||||
|MazamaSpatialUtils |0.6.4 | | | |
|
||||
|MCPModPack |0.2 |-1 | | |
|
||||
|mcvis |1.0.4 | | | |
|
||||
|[MDSPCAShiny](problems.md#mdspcashiny) |0.1.0 | | |1 |
|
||||
|meltt |0.4.1 | | | |
|
||||
|[memapp](problems.md#memapp) |2.13 | | |1 |
|
||||
|[memery](problems.md#memery) |0.5.2 | | |1 |
|
||||
|merTools |0.5.0 | | | |
|
||||
|[meta4diag](problems.md#meta4diag) |2.0.8 | | |1 |
|
||||
|MetaAnalyser |0.2.1 | | | |
|
||||
|metamer |0.2.0 | | | |
|
||||
|metathis |1.0.2 | | | |
|
||||
|[MetCirc](problems.md#metcirc) |1.18.0 | | |2 |
|
||||
|[MethylAid](problems.md#methylaid) |1.22.0 |2 | |1 |
|
||||
|[methylGSA](problems.md#methylgsa) |1.6.1 | | |1 |
|
||||
|metricsgraphics |0.9.0 | | | |
|
||||
|[mgcViz](problems.md#mgcviz) |0.1.6 | | |1 |
|
||||
|[microhaplot](problems.md#microhaplot) |1.0.1 | | |1 |
|
||||
|microsamplingDesign |1.0.7 | | | |
|
||||
|midas |1.0.1 | | | |
|
||||
|MIMSunit |0.9.1 | | | |
|
||||
|[miniMeta](problems.md#minimeta) |0.2 | | |1 |
|
||||
|miniUI |0.1.1.1 | | | |
|
||||
|[miRcomp](problems.md#mircomp) |1.18.0 | |1 | |
|
||||
|mirt |1.32.1 | | | |
|
||||
|mirtCAT |1.9.3 | | | |
|
||||
|[MLDAShiny](problems.md#mldashiny) |0.1.0 | | |1 |
|
||||
|mldr |0.4.3 | | | |
|
||||
|[MLInterfaces](problems.md#mlinterfaces) |1.68.0 | | |5 |
|
||||
|[mlr3shiny](problems.md#mlr3shiny) |0.1.1 | | |1 |
|
||||
|[MLRShiny](problems.md#mlrshiny) |0.1.0 | | |1 |
|
||||
|[MLRShiny2](problems.md#mlrshiny2) |0.1.0 | | |1 |
|
||||
|mlxR |4.1.3 | | | |
|
||||
|[MMDiff2](problems.md#mmdiff2) |1.16.0 | | |4 |
|
||||
|[MNLR](problems.md#mnlr) |0.1.0 | | |1 |
|
||||
|modest |0.3-1 | | | |
|
||||
|MODIStsp |1.4.0 | | | |
|
||||
|Mondrian |1.1.0 | | | |
|
||||
|mplot |1.0.4 | | | |
|
||||
|mrMLM.GUI |4.0 | | | |
|
||||
|[MSEtool](problems.md#msetool) |1.6.0 | | |1 |
|
||||
|[MSGFgui](problems.md#msgfgui) |1.22.0 |1 | | |
|
||||
|[MSnbase](problems.md#msnbase) |2.14.2 | | |3 |
|
||||
|MSstatsQCgui |1.8.0 | | | |
|
||||
|[mstrio](problems.md#mstrio) |11.2.1 | | |1 |
|
||||
|MtreeRing |1.4.2 | | | |
|
||||
|[MuChPoint](problems.md#muchpoint) |0.6.1 | | |1 |
|
||||
|multichull |1.0.0 | | | |
|
||||
|mwaved |1.1.7 | | | |
|
||||
|mwshiny |2.1.0 | | | |
|
||||
|NACHO |1.0.1 | | | |
|
||||
|[nbc4va](problems.md#nbc4va) |1.1 |1 | |1 |
|
||||
|[NBShiny](problems.md#nbshiny) |0.1.0 | | |1 |
|
||||
|[NBShiny2](problems.md#nbshiny2) |0.1.0 | | |1 |
|
||||
|[NDP](problems.md#ndp) |0.1.0 | | |1 |
|
||||
|[neo4r](problems.md#neo4r) |0.1.1 | | |1 |
|
||||
|netCoin |1.1.25 | | | |
|
||||
|netrankr |0.2.1 | | | |
|
||||
|nlgeocoder |0.1.3 | | | |
|
||||
|NNTbiomarker |0.29.11 | | | |
|
||||
|normalr |1.0.0 | | | |
|
||||
|nph |2.0 | | | |
|
||||
|[nprcgenekeepr](problems.md#nprcgenekeepr) |1.0.3 | | |1 |
|
||||
|npregfast |1.5.1 | | | |
|
||||
|nse2r |0.1.2 | | | |
|
||||
|objectremover |0.7.0 | | | |
|
||||
|[oceanis](problems.md#oceanis) |1.7.3 | | |2 |
|
||||
|[omicplotR](problems.md#omicplotr) |1.8.0 | | |2 |
|
||||
|[oneSENSE](problems.md#onesense) |1.10.0 | |1 |1 |
|
||||
|[ontoProc](problems.md#ontoproc) |1.10.0 |1 | |3 |
|
||||
|[oolong](problems.md#oolong) |0.3.4 | | |1 |
|
||||
|OpenImageR |1.1.7 | | | |
|
||||
|[openmetrics](problems.md#openmetrics) |0.1.1 | | |1 |
|
||||
|[openPrimeRui](problems.md#openprimerui) |1.10.0 | | |2 |
|
||||
|[oppr](problems.md#oppr) |1.0.2 | | |1 |
|
||||
|optimStrat |2.1 | | | |
|
||||
|OWEA |0.1.1 | | | |
|
||||
|[pairsD3](problems.md#pairsd3) |0.1.0 | | |1 |
|
||||
|[PanVizGenerator](problems.md#panvizgenerator) |1.16.0 | | |1 |
|
||||
|ParallelLogger |2.0.0 | | | |
|
||||
|paramGUI |2.1.4 | | | |
|
||||
|parcoords |1.0.0 | | | |
|
||||
|[PathoStat](problems.md#pathostat) |1.14.0 | | |1 |
|
||||
|pcadapt |4.3.3 | | | |
|
||||
|[pcaExplorer](problems.md#pcaexplorer) |2.14.2 | | |2 |
|
||||
|[pcFactorStan](problems.md#pcfactorstan) |1.5.1 | | |2 |
|
||||
|PCRedux |1.0-6 | | | |
|
||||
|pdfsearch |0.3.0 | | | |
|
||||
|PDShiny |0.1.0 | | | |
|
||||
|PELVIS |2.0.1 | | | |
|
||||
|[pepStat](problems.md#pepstat) |1.22.0 | | |3 |
|
||||
|periscope |0.4.10-1 | | | |
|
||||
|[phenocamr](problems.md#phenocamr) |1.1.4 | | |1 |
|
||||
|phenofit |0.2.7 | | | |
|
||||
|phenology |7.3 | | | |
|
||||
|phuse |0.2.2 | | | |
|
||||
|PhyloProfile |1.2.5 | | | |
|
||||
|[piano](problems.md#piano) |2.4.0 | | |2 |
|
||||
|pipe.design |0.5.1 | | | |
|
||||
|pipefittr |0.1.2 | | | |
|
||||
|[pitchRx](problems.md#pitchrx) |1.8.2 | | |1 |
|
||||
|PivotalR |0.1.18.3.1 | | | |
|
||||
|[pivottabler](problems.md#pivottabler) |1.5.0 | | |1 |
|
||||
|pixels |0.1.0 | | | |
|
||||
|PKconverter |1.5 | | | |
|
||||
|pkgsearch |3.0.2 | | | |
|
||||
|plainview |0.1.0 | | | |
|
||||
|[plethem](problems.md#plethem) |0.1.7 |1 | |1 |
|
||||
|[plotGrouper](problems.md#plotgrouper) |1.6.0 | | |1 |
|
||||
|[plotly](problems.md#plotly) |4.9.2.1 | | |1 |
|
||||
|plotROC |2.2.1 | | | |
|
||||
|plotSEMM |2.4 | | | |
|
||||
|plsr |0.0.1 | | | |
|
||||
|[pmd](problems.md#pmd) |0.1.9 | | |1 |
|
||||
|[pogos](problems.md#pogos) |1.8.0 | | |1 |
|
||||
|[polaroid](problems.md#polaroid) |0.0.1 | | |1 |
|
||||
|[polmineR](problems.md#polminer) |0.8.0 | | |1 |
|
||||
|PopED |0.5.0 | | | |
|
||||
|poppr |2.8.6 | | | |
|
||||
|populationPDXdesign |1.0.3 | | | |
|
||||
|powdR |1.2.2 | | | |
|
||||
|powerlmm |0.4.0 | | | |
|
||||
|ppcSpatial |0.2.0 | | | |
|
||||
|pqantimalarials |0.2 | | | |
|
||||
|[precisely](problems.md#precisely) |0.1.0 | | |1 |
|
||||
|[PrecisionTrialDrawer](problems.md#precisiontrialdrawer) |1.4.0 |1 | | |
|
||||
|[predictoR](problems.md#predictor) |1.1.0 | | |1 |
|
||||
|[PREPShiny](problems.md#prepshiny) |0.1.0 | | |1 |
|
||||
|[primirTSS](problems.md#primirtss) |1.6.1 | |1 |1 |
|
||||
|[prioritizr](problems.md#prioritizr) |5.0.1 | | |2 |
|
||||
|ProbBayes |1.1 | | | |
|
||||
|[PROBShiny](problems.md#probshiny) |0.1.0 | | |1 |
|
||||
|[processanimateR](problems.md#processanimater) |1.0.3 | | |1 |
|
||||
|processmapR |0.3.4 | | | |
|
||||
|processmonitR |0.1.0 | | | |
|
||||
|processR |0.2.3 | | | |
|
||||
|profvis |0.3.6 | | | |
|
||||
|progressr |0.6.0 | | | |
|
||||
|ProjectionBasedClustering |1.1.1 | | | |
|
||||
|pRolocGUI |1.22.0 | | | |
|
||||
|Prostar |1.20.0 | | | |
|
||||
|[psichomics](problems.md#psichomics) |1.14.1 | | |1 |
|
||||
|PupilPre |0.6.2 | | | |
|
||||
|pushbar |0.1.0 | | | |
|
||||
|[pwrEWAS](problems.md#pwrewas) |1.2.0 |2 | | |
|
||||
|[QCA](problems.md#qca) |3.8.2 | | |2 |
|
||||
|qgam |1.3.2 | | | |
|
||||
|[qlcData](problems.md#qlcdata) |0.2.1 | | |1 |
|
||||
|[qqplotr](problems.md#qqplotr) |0.0.4 | | |1 |
|
||||
|qqvases |1.0.0 | | | |
|
||||
|QRAGadget |0.1.0 | | | |
|
||||
|qrage |1.0 | | | |
|
||||
|QTL.gCIMapping.GUI |2.1 | | | |
|
||||
|[questionr](problems.md#questionr) |0.7.1 | | |2 |
|
||||
|R.SamBada |0.1.2 | | | |
|
||||
|r2d3 |0.2.3 | | | |
|
||||
|[R3CPET](problems.md#r3cpet) |1.20.0 |1 | | |
|
||||
|r4ss |1.36.1 | | | |
|
||||
|rabi |1.0.2 | | | |
|
||||
|radarchart |0.3.1 | | | |
|
||||
|radiant |1.3.2 | | | |
|
||||
|radiant.basics |1.3.4 | | | |
|
||||
|radiant.data |1.3.9 | | | |
|
||||
|radiant.design |1.3.5 | | | |
|
||||
|radiant.model |1.3.10 | | | |
|
||||
|radiant.multivariate |1.3.5 | | | |
|
||||
|radix |0.6 | | | |
|
||||
|[RagGrid](problems.md#raggrid) |0.2.0 | | |1 |
|
||||
|rainette |0.1.1 | | | |
|
||||
|[rAmCharts](problems.md#ramcharts) |2.1.13 | | |1 |
|
||||
|rangeMapper |0.3-7 | | | |
|
||||
|[rangeModelMetadata](problems.md#rangemodelmetadata) |0.1.3 | | |1 |
|
||||
|RanglaPunjab |2.3.4 | | | |
|
||||
|[rapbase](problems.md#rapbase) |1.10.0 | | |1 |
|
||||
|[Rariant](failures.md#rariant) |1.24.0 |1 | | |
|
||||
|rbin |0.2.0 | | | |
|
||||
|rblt |0.2.4.5 | | | |
|
||||
|[rcellminer](problems.md#rcellminer) |2.10.0 | |1 |3 |
|
||||
|[rCGH](problems.md#rcgh) |1.18.0 | | |2 |
|
||||
|rclipboard |0.1.2 | | | |
|
||||
|rco |1.0.1 | | | |
|
||||
|rcrossref |1.0.0 | | | |
|
||||
|[Rcwl](problems.md#rcwl) |1.4.2 |1 |4 |5 |
|
||||
|[rddapp](problems.md#rddapp) |1.2.1 |1 | |2 |
|
||||
|RDML |1.0 | | | |
|
||||
|reactable |0.2.0 | | | |
|
||||
|reactlog |1.0.0 | | | |
|
||||
|reactR |0.4.2 | | | |
|
||||
|[recmap](problems.md#recmap) |1.0.7 | | |1 |
|
||||
|[ReDaMoR](problems.md#redamor) |0.4.2 | | |1 |
|
||||
|[RefNet](problems.md#refnet) |1.24.0 | |1 | |
|
||||
|refund.shiny |0.3.0 | | | |
|
||||
|regexSelect |1.0.0 | | | |
|
||||
|[regressoR](problems.md#regressor) |1.1.8 | | |1 |
|
||||
|Repliscope |1.1.0 | | | |
|
||||
|repo |2.1.5 | | | |
|
||||
|[ReportingTools](problems.md#reportingtools) |2.28.0 | | |1 |
|
||||
|reprex |0.3.0 | | | |
|
||||
|[reverseR](problems.md#reverser) |0.1 | | |1 |
|
||||
|revtools |0.4.1 | | | |
|
||||
|[RforProteomics](problems.md#rforproteomics) |1.26.0 | |1 |2 __+1__ |
|
||||
|[Rfssa](problems.md#rfssa) |1.0.0 | | |1 |
|
||||
|RGA |0.4.2 | | | |
|
||||
|[rgl](problems.md#rgl) |0.100.54 | | |2 |
|
||||
|[rhandsontable](problems.md#rhandsontable) |0.3.7 | | |1 |
|
||||
|Rilostat |1.1 | | | |
|
||||
|rintrojs |0.2.2 | | | |
|
||||
|rivr |1.2-2 | | | |
|
||||
|[RLumShiny](problems.md#rlumshiny) |0.2.2 | | |1 |
|
||||
|[rmarkdown](problems.md#rmarkdown) |2.3 | | |1 |
|
||||
|[rmd](problems.md#rmd) |0.1.5 | | |1 |
|
||||
|[RnBeads](problems.md#rnbeads) |2.6.0 | | |7 |
|
||||
|rnn |0.9.8 | | | |
|
||||
|roadoi |0.6 | | | |
|
||||
|robmed |0.7.0 | | | |
|
||||
|[RobStatTM](problems.md#robstattm) |1.0.2 | | |1 |
|
||||
|[rosr](problems.md#rosr) |0.0.10 | | |1 |
|
||||
|rPackedBar |0.2.2 | | | |
|
||||
|[rpostgisLT](problems.md#rpostgislt) |0.6.0 | | |1 |
|
||||
|rpredictit |0.0.2 | | | |
|
||||
|[Rqc](problems.md#rqc) |1.22.0 | | |2 |
|
||||
|[RQuantLib](problems.md#rquantlib) |0.4.12 |2 |1 | |
|
||||
|rrtable |0.2.1 | | | |
|
||||
|[rrvgo](problems.md#rrvgo) |1.0.0 | | |3 |
|
||||
|RSCAT |1.1.0 | | | |
|
||||
|rsconnect |0.8.16 | | | |
|
||||
|[rtimicropem](problems.md#rtimicropem) |1.4.0 | | |1 |
|
||||
|rTRMui |1.26.0 | | | |
|
||||
|[RtutoR](problems.md#rtutor) |1.2 | | |1 |
|
||||
|rusk |0.1.1 | | | |
|
||||
|ruv |0.9.7.1 | | | |
|
||||
|rwalkr |0.5.2 | | | |
|
||||
|[RxODE](problems.md#rxode) |0.9.2-0 | | |1 |
|
||||
|sadists |0.2.3 | | | |
|
||||
|[safetyGraphics](problems.md#safetygraphics) |1.1.0 | | |1 |
|
||||
|samr |3.0 | | | |
|
||||
|[sangerseqR](problems.md#sangerseqr) |1.24.0 | | |1 |
|
||||
|sankeywheel |0.1.0 | | | |
|
||||
|[santaR](problems.md#santar) |1.0 | | |1 |
|
||||
|[SC3](problems.md#sc3) |1.16.0 | | |3 |
|
||||
|scdhlm |0.3.2 | | | |
|
||||
|schex |1.2.0 | | | |
|
||||
|[scone](problems.md#scone) |1.12.0 | | |1 |
|
||||
|sdcHierarchies |0.18.2 | | | |
|
||||
|sdcMicro |5.5.1 | | | |
|
||||
|[SDEFSR](problems.md#sdefsr) |0.7.21 | | |1 |
|
||||
|sdm |1.0-89 | | | |
|
||||
|[SEA](problems.md#sea) |1.0 | | |1 |
|
||||
|searchConsoleR |0.4.0 | | | |
|
||||
|seasonalview |0.3 | | | |
|
||||
|semantic.dashboard |0.1.5 | | | |
|
||||
|[semdrw](problems.md#semdrw) |0.1.0 | | |1 |
|
||||
|[SemNeT](problems.md#semnet) |1.3.0 | | |2 |
|
||||
|sen2r |1.3.6 | | | |
|
||||
|[seqplots](problems.md#seqplots) |1.26.0 | | |4 |
|
||||
|serieslcb |0.4.0 | | | |
|
||||
|[sglr](problems.md#sglr) |0.7 | | |2 |
|
||||
|SHELF |1.7.0 | | | |
|
||||
|shiny.info |0.2.0 | | | |
|
||||
|[shiny.router](problems.md#shinyrouter) |0.1.1 | | |1 |
|
||||
|[shiny.semantic](problems.md#shinysemantic) |0.3.0 | | |1 |
|
||||
|[shinyAce](problems.md#shinyace) |0.4.1 | | |1 |
|
||||
|[shinyaframe](problems.md#shinyaframe) |1.0.1 | | |1 |
|
||||
|shinyalert |1.1 | | | |
|
||||
|shinyanimate |0.3.0 | | | |
|
||||
|shinybootstrap2 |0.2.1 | | | |
|
||||
|[shinybrms](problems.md#shinybrms) |1.1.0 | | |1 |
|
||||
|[shinyBS](problems.md#shinybs) |0.61 | | |1 |
|
||||
|shinybusy |0.2.0 | | | |
|
||||
|shinycssloaders |0.3 | | | |
|
||||
|shinycustomloader |0.9.0 | | | |
|
||||
|shinydashboard |0.7.1 | | | |
|
||||
|shinydashboardPlus |0.7.0 | | | |
|
||||
|shinyDND |0.1.0 | | | |
|
||||
|[shinyEffects](problems.md#shinyeffects) |0.1.0 | | |1 |
|
||||
|shinyEventLogger |0.1.1 | | | |
|
||||
|shinyFeedback |0.2.0 | | | |
|
||||
|shinyFiles |0.8.0 | | | |
|
||||
|shinyglide |0.1.2 | | | |
|
||||
|shinyHeatmaply |0.2.0 | | | |
|
||||
|[shinyhelper](problems.md#shinyhelper) |0.3.2 | | |1 |
|
||||
|ShinyImage |0.1.0 | | | |
|
||||
|[ShinyItemAnalysis](problems.md#shinyitemanalysis) |1.3.3 | | |2 |
|
||||
|shinyjqui |0.3.3 | | | |
|
||||
|[shinyjs](problems.md#shinyjs) |1.1 | | |1 |
|
||||
|[shinyKGode](problems.md#shinykgode) |1.0.5 | | |1 |
|
||||
|shinyKnobs |0.1.3 | | | |
|
||||
|shinylogs |0.1.7 | | | |
|
||||
|shinyLP |1.1.2 | | | |
|
||||
|shinymanager |1.0.200 | | | |
|
||||
|shinymaterial |1.1.0 | | | |
|
||||
|shinyMatrix |0.3.0 | | | |
|
||||
|[shinyMethyl](problems.md#shinymethyl) |1.24.0 |1 | | |
|
||||
|shinyML |0.2.0 | | | |
|
||||
|shinyMobile |0.7.0 | | | |
|
||||
|shinyMolBio |0.2 | | | |
|
||||
|shinyNotes |0.0.1 | | | |
|
||||
|shinyobjects |0.1.0 | | | |
|
||||
|[shinypanels](problems.md#shinypanels) |0.5.0 | | |1 |
|
||||
|[shinyr](problems.md#shinyr) |0.2.6 | | |1 |
|
||||
|[shinyrecap](problems.md#shinyrecap) |0.1.0 | | |1 |
|
||||
|shinyrecipes |0.1.0 | | | |
|
||||
|shinyreforms |0.0.1 | | | |
|
||||
|shinyRGL |0.1.0 | | | |
|
||||
|shinySearchbar |1.0.0 | | | |
|
||||
|shinySIR |0.1.1 | | | |
|
||||
|shinystan |2.5.0 | | | |
|
||||
|[shinyTANDEM](problems.md#shinytandem) |1.26.0 |1 | | |
|
||||
|shinytest |1.4.0 | | | |
|
||||
|shinythemes |1.1.2 | | | |
|
||||
|shinyTime |1.0.1 | | | |
|
||||
|shinytoastr |2.1.1 | | | |
|
||||
|shinyTree |0.2.7 | | | |
|
||||
|shinyWidgets |0.5.3 | | | |
|
||||
|shinyypr |0.0.2 | | | |
|
||||
|shotGroups |0.7.5.1 | | | |
|
||||
|[sigmajs](problems.md#sigmajs) |0.1.5 | | |1 |
|
||||
|sigmaNet |1.1.0 | | | |
|
||||
|signalHsmm |1.5 | | | |
|
||||
|[SimDesign](problems.md#simdesign) |2.0.1 | | |1 |
|
||||
|simglm |0.8.0 | | | |
|
||||
|simPATHy |0.4 | | | |
|
||||
|[simplevis](problems.md#simplevis) |1.3.0 | | |1 |
|
||||
|simrel |2.0.2 | | | |
|
||||
|sinew |0.3.8 | | | |
|
||||
|SingleCaseES |0.4.3 | | | |
|
||||
|[singleCellTK](problems.md#singlecelltk) |1.8.0 | | |3 |
|
||||
|sistec |0.1.0 | | | |
|
||||
|[skeleSim](failures.md#skelesim) |0.9.8 |1 | | |
|
||||
|[skpr](problems.md#skpr) |0.64.2 | | |2 |
|
||||
|SMITIDvisu |0.0.6 | | | |
|
||||
|snahelper |1.1.0 | | | |
|
||||
|snotelr |1.0.4 | | | |
|
||||
|[soc.ca](problems.md#socca) |0.7.3 | | |1 |
|
||||
|Sofi |0.16.4.8 | | | |
|
||||
|[soilcarbon](problems.md#soilcarbon) |1.2.0 | | |2 |
|
||||
|[sojourner](problems.md#sojourner) |1.2.1 |1 | | |
|
||||
|solvebio |2.7.2 | | | |
|
||||
|SOMbrero |1.3 | | | |
|
||||
|sortable |0.4.2 | | | |
|
||||
|[soundgen](problems.md#soundgen) |1.7.0 | | |1 |
|
||||
|[SpaDES.addins](problems.md#spadesaddins) |0.1.2 | | |1 |
|
||||
|Spaniel |1.2.0 | | | |
|
||||
|spANOVA |0.99.2 | | | |
|
||||
|[spant](problems.md#spant) |1.6.0 | | |1 |
|
||||
|sparkline |2.0 | | | |
|
||||
|[sparklyr](problems.md#sparklyr) |1.2.0 | | |1 |
|
||||
|[sparkTable](problems.md#sparktable) |1.3.0 | | |1 |
|
||||
|SpatialCPie |1.4.0 | | | |
|
||||
|[SpatialEpiApp](problems.md#spatialepiapp) |0.3 | | |2 |
|
||||
|[spatialLIBD](problems.md#spatiallibd) |1.0.0 |1 | |1 |
|
||||
|[spectrolab](problems.md#spectrolab) |0.0.9 | | |1 |
|
||||
|spinifex |0.2.0 | | | |
|
||||
|SpNetPrep |1.1 | | | |
|
||||
|spotGUI |0.2.1 | | | |
|
||||
|SqlRender |1.6.6 | | | |
|
||||
|squid |0.1.2 | | | |
|
||||
|[SSDM](problems.md#ssdm) |0.2.8 | | |1 |
|
||||
|[ssrch](problems.md#ssrch) |1.4.0 | | |2 |
|
||||
|[sstModel](problems.md#sstmodel) |1.0.0 | | |1 |
|
||||
|[STAT](problems.md#stat) |0.1.0 | | |1 |
|
||||
|statnetWeb |0.5.5 | | | |
|
||||
|statsr |0.2.0 | | | |
|
||||
|[steemr](problems.md#steemr) |0.1.3 | | |1 |
|
||||
|StereoMorph |1.6.3 | | | |
|
||||
|stmgui |0.1.6 | | | |
|
||||
|[stminsights](problems.md#stminsights) |0.3.0 | | |1 |
|
||||
|[STMotif](problems.md#stmotif) |2.0.0 | | |1 |
|
||||
|[strand](problems.md#strand) |0.1.3 | | |1 |
|
||||
|StratigrapheR |1.1.0 | | | |
|
||||
|[subscreen](problems.md#subscreen) |2.0.1 | | |1 |
|
||||
|SubVis |2.0.2 | | | |
|
||||
|swirlify |0.5.3 | | | |
|
||||
|[tableHTML](problems.md#tablehtml) |2.0.0 | | |2 |
|
||||
|[tablerDash](problems.md#tablerdash) |0.1.0 | | |1 |
|
||||
|tabulizer |0.2.2 | | | |
|
||||
|taipan |0.1.2 | | | |
|
||||
|target |1.2.0 | | | |
|
||||
|[TAShiny](problems.md#tashiny) |0.1.0 | | |1 |
|
||||
|[TBSignatureProfiler](problems.md#tbsignatureprofiler) |1.0.0 | | |1 |
|
||||
|[TCGAbiolinksGUI](problems.md#tcgabiolinksgui) |1.14.0 | | |3 |
|
||||
|[TeachBayes](problems.md#teachbayes) |1.0 | |1 | |
|
||||
|teachingApps |1.0.8 | | | |
|
||||
|[tenXplore](problems.md#tenxplore) |1.10.0 | | |1 |
|
||||
|[TestDesign](problems.md#testdesign) |1.0.2 | | |1 |
|
||||
|[testextra](problems.md#testextra) |0.1.0.1 | | |1 |
|
||||
|[texPreview](problems.md#texpreview) |1.4.4 | | |1 |
|
||||
|[TFutils](problems.md#tfutils) |1.8.0 |1 |1 |4 |
|
||||
|themetagenomics |1.0.2 | | | |
|
||||
|threeBrain |0.1.7 | | | |
|
||||
|[tidycells](problems.md#tidycells) |0.2.2 |2 | | |
|
||||
|tidycwl |1.0.4 | | | |
|
||||
|tidyvpc |1.0.0 | | | |
|
||||
|tigerstats |0.3.2 | | | |
|
||||
|[timeline](problems.md#timeline) |0.9 | | |2 |
|
||||
|[TimerQuant](problems.md#timerquant) |1.18.0 | | |1 |
|
||||
|[timeseriesdb](problems.md#timeseriesdb) |0.4.1 | | |1 |
|
||||
|[timevis](problems.md#timevis) |0.5 | | |1 |
|
||||
|tippy |0.0.1 | | | |
|
||||
|tmap |3.0 | | | |
|
||||
|[tmaptools](problems.md#tmaptools) |3.0 | | |1 |
|
||||
|TnT |1.10.0 | | | |
|
||||
|toxEval |1.1.0 | | | |
|
||||
|[TR8](problems.md#tr8) |0.9.21 | | |1 |
|
||||
|trackdem |0.5.2 | | | |
|
||||
|[trackeRapp](problems.md#trackerapp) |1.1 | | |1 |
|
||||
|trackr |0.10.6 | | | |
|
||||
|trade |0.5.4 | | | |
|
||||
|treemap |2.4-2 | | | |
|
||||
|TreeSearch |0.4.1 | | | |
|
||||
|[treespace](problems.md#treespace) |1.1.3.2 | | |1 |
|
||||
|TreeTools |1.0.0 | | | |
|
||||
|Trendy |1.10.0 | | | |
|
||||
|tricolore |1.2.2 | | | |
|
||||
|[TSCAN](problems.md#tscan) |1.26.0 | | |1 |
|
||||
|tsviz |0.1.0 | | | |
|
||||
|[ttestshiny](problems.md#ttestshiny) |0.1.0 | | |1 |
|
||||
|[TVTB](problems.md#tvtb) |1.14.0 | | |1 |
|
||||
|[twoddpcr](problems.md#twoddpcr) |1.12.0 | | |1 |
|
||||
|[TxRegInfra](problems.md#txreginfra) |1.8.0 | | |5 |
|
||||
|[ubiquity](problems.md#ubiquity) |1.0.1 | | |1 |
|
||||
|[UCSCXenaShiny](problems.md#ucscxenashiny) |0.5.0 | | |2 |
|
||||
|UCSCXenaTools |1.3.1 | | | |
|
||||
|[Ularcirc](problems.md#ularcirc) |1.6.0 |1 | | |
|
||||
|Umatrix |3.3 | | | |
|
||||
|[ursa](problems.md#ursa) |3.8.20 | | |1 |
|
||||
|[VariantFiltering](problems.md#variantfiltering) |1.24.0 |1 | |3 |
|
||||
|[VarSelLCM](problems.md#varsellcm) |2.1.3 | | |1 |
|
||||
|[vdiffr](problems.md#vdiffr) |0.3.2 | | |1 |
|
||||
|vegawidget |0.3.1 | | | |
|
||||
|vici |0.5.2 | | | |
|
||||
|VineCopula |2.3.0 | | | |
|
||||
|[viromeBrowser](problems.md#viromebrowser) |1.0.0 | | |1 |
|
||||
|[visit](problems.md#visit) |2.1 | | |2 |
|
||||
|[visNetwork](problems.md#visnetwork) |2.0.9 | | |1 |
|
||||
|vistributions |0.1.1 | | | |
|
||||
|visvow |0.9.0 | | | |
|
||||
|voronoiTreemap |0.2.0 | | | |
|
||||
|VOSONDash |0.5.4 | | | |
|
||||
|vov |0.1.0 | | | |
|
||||
|vtree |4.0.0 | | | |
|
||||
|[VTShiny](problems.md#vtshiny) |0.1.0 | | |1 |
|
||||
|VWPre |1.2.3 | | | |
|
||||
|[waiter](problems.md#waiter) |0.1.0 | | |1 |
|
||||
|[wallace](problems.md#wallace) |1.0.6.2 | | |1 |
|
||||
|[webr](problems.md#webr) |0.1.5 | | |1 |
|
||||
|webshot |0.5.2 | | | |
|
||||
|weco |1.2 | | | |
|
||||
|weightr |2.0.2 | | | |
|
||||
|wilson |2.4.0 | | | |
|
||||
|wiqid |0.3.0 | | | |
|
||||
|[wiseR](problems.md#wiser) |1.0.1 | | |2 |
|
||||
|workflowr |1.6.2 | | | |
|
||||
|wppExplorer |2.3-4 | | | |
|
||||
|[wTO](problems.md#wto) |1.6.3 | | |1 |
|
||||
|xplorerr |0.1.1 | | | |
|
||||
|[xROI](problems.md#xroi) |0.9.13 | |1 | |
|
||||
|[ymlthis](problems.md#ymlthis) |0.1.2 | | |1 |
|
||||
|yonder |0.2.0 | | | |
|
||||
|[yuimaGUI](problems.md#yuimagui) |1.3.0 | | |1 |
|
||||
|zooimage |5.5.2 | | | |
|
||||
|zscorer |0.3.1 | | | |
|
||||
|package |version |error |warning |note |
|
||||
|:----------|:-------|:-----|:-------|:----|
|
||||
|ctsem |3.6.0 |1 | | |
|
||||
|diveR |? | | | |
|
||||
|loon.shiny |? | | | |
|
||||
|NA |? | | | |
|
||||
|SSVS |? | | | |
|
||||
|
||||
|
||||
15
revdep/cran.md
Normal file
@@ -0,0 +1,15 @@
|
||||
## revdepcheck results
|
||||
|
||||
We checked 1039 reverse dependencies (1038 from CRAN + 1 from Bioconductor), comparing R CMD check results across CRAN and dev versions of this package.
|
||||
|
||||
* We saw 0 new problems
|
||||
* We failed to check 4 packages
|
||||
|
||||
Issues with CRAN packages are summarised below.
|
||||
|
||||
### Failed to check
|
||||
|
||||
* ctsem (NA)
|
||||
* diveR (NA)
|
||||
* loon.shiny (NA)
|
||||
* SSVS (NA)
|
||||
11893
revdep/problems.md
@@ -1,13 +1,23 @@
|
||||
import {
|
||||
build as esbuildBuild,
|
||||
import type {
|
||||
BuildFailure,
|
||||
BuildIncremental,
|
||||
BuildOptions,
|
||||
BuildResult,
|
||||
WatchMode,
|
||||
} from "esbuild";
|
||||
import readcontrol from "readcontrol";
|
||||
import { build as esbuildBuild } from "esbuild";
|
||||
|
||||
import process from "process";
|
||||
import { basename } from "path";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore; Type definitions are not found. This occurs when `strict: true` in tsconfig.json
|
||||
import readcontrol from "readcontrol";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore; Type definitions are not found. This occurs when `strict: true` in tsconfig.json
|
||||
import babelPlugin from "esbuild-plugin-babel";
|
||||
|
||||
const outDir = "./inst/www/shared/";
|
||||
|
||||
type ShinyDesc = { version: string; package: string; license: string };
|
||||
@@ -42,7 +52,7 @@ async function build(
|
||||
}
|
||||
}
|
||||
|
||||
const onRebuild = function (error?: string) {
|
||||
const onRebuild = function (error: BuildFailure | null) {
|
||||
if (error) {
|
||||
console.error(printNames.join(", "), "watch build failed:\n", error);
|
||||
} else {
|
||||
@@ -54,7 +64,7 @@ async function build(
|
||||
};
|
||||
|
||||
let incremental = false;
|
||||
let watch: false | { onRebuild: (error, result) => void } = false;
|
||||
let watch: WatchMode | false = false;
|
||||
|
||||
if (process.argv.length >= 3 && process.argv[2] == "--watch") {
|
||||
incremental = true;
|
||||
@@ -73,9 +83,9 @@ async function build(
|
||||
preserveSymlinks: true,
|
||||
...opts,
|
||||
}).then((x) => {
|
||||
onRebuild();
|
||||
onRebuild(null);
|
||||
return x;
|
||||
});
|
||||
}
|
||||
|
||||
export { outDir, build, shinyDesc, banner };
|
||||
export { outDir, build, shinyDesc, banner, babelPlugin };
|
||||
|
||||
97
srcts/build/_jquery.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Make sure all `*.ts` files contain `"jquery"` import statements to properly scope `jquery`.
|
||||
|
||||
Prior behavior:
|
||||
- Use a patch file to remove globally declared `$` variable
|
||||
- PR: https://github.com/rstudio/shiny/pull/3296/commits/169318382d1d00927d0148a16fde4c96a291a602
|
||||
Prior reasoning:
|
||||
- Only allow for jQuery type definitions to exist if imported.
|
||||
- This is problematic as it can lead to improperly scoped values of `$`
|
||||
- Ex:
|
||||
* If `a.ts` imports jquery, then `b.ts` can see the global definition of `$`
|
||||
even though `b.ts` does not import jquery.
|
||||
* If `$` is not scoped / encapsulated, then it is possible to have
|
||||
inconsistent versions of jquery executing within the shiny bundle.
|
||||
Related:
|
||||
- Open Issue ('16): https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11187
|
||||
- Closed stale PR ('19): https://github.com/DefinitelyTyped/DefinitelyTyped/pull/40295/files
|
||||
- Unsolved Issue ('14): https://github.com/DefinitelyTyped/DefinitelyTyped/issues/1564
|
||||
- Multiple `$` conflicts ('22): https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60443
|
||||
- Bandaid PR ('22): https://github.com/DefinitelyTyped/DefinitelyTyped/pull/60444
|
||||
|
||||
Approach within this file:
|
||||
* For every `*.ts` file:
|
||||
* Do not use `jQuery` (use `$`!)
|
||||
* If utilizing `$`
|
||||
* Require `jquery` import statement
|
||||
- Advantages:
|
||||
- Does not require a yarn patch file or separate GitHub repo containing the patched type definitions.
|
||||
- Disadvantages:
|
||||
- Variable reassignment isn't caught `jq = $; jq(divs)`. (This should not happen, but it is possible.)
|
||||
- Only tested when bundling is started, not on every file change.
|
||||
- PR: https://github.com/rstudio/shiny/pull/3710
|
||||
*/
|
||||
|
||||
import fs from "fs";
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore; Type definitions are not found
|
||||
import readdirRecursive from "fs-readdir-recursive";
|
||||
import { isUndefined } from "lodash";
|
||||
|
||||
const verifyJqueryUsage = async function (filename: string): Promise<void> {
|
||||
const contents = await fs.promises.readFile(filename, "utf8");
|
||||
const lines = contents.toString().split("\n");
|
||||
|
||||
// Find if using `jQuery` in the file
|
||||
const jqueryMatch = lines.find((line) => {
|
||||
return line.includes("jQuery.") || line.includes("jQuery(");
|
||||
});
|
||||
|
||||
if (!isUndefined(jqueryMatch)) {
|
||||
throw (
|
||||
`Using \`jQuery\` in file: ${filename}\n` +
|
||||
`Match:\n${jqueryMatch}\n` +
|
||||
"Please use `$` instead of `jQuery`\n" +
|
||||
"See file ./srcts/build/_jquery.ts for more details"
|
||||
);
|
||||
}
|
||||
|
||||
// Find if using `$` in the file
|
||||
const dollarMatch = lines.find((line) => {
|
||||
return line.includes("$.") || line.includes("$(");
|
||||
});
|
||||
|
||||
if (isUndefined(dollarMatch)) {
|
||||
// No match found. Not using jquery
|
||||
return;
|
||||
}
|
||||
|
||||
// Using jquery, find that it is being imported
|
||||
const importJquery = 'import $ from "jquery";';
|
||||
const hasJqueryImport = lines.includes(importJquery);
|
||||
|
||||
if (!hasJqueryImport) {
|
||||
// Not importing jquery, yell
|
||||
throw (
|
||||
`Using \`$\` in file: ${filename}\n` +
|
||||
`Match:\n${dollarMatch}\n` +
|
||||
`Please call \`${importJquery}\` at the top of the file.\n` +
|
||||
"See file ./srcts/build/_jquery.ts for more details"
|
||||
);
|
||||
}
|
||||
|
||||
// Using jquery and importing it;
|
||||
return;
|
||||
};
|
||||
|
||||
const verifyJqueryImport = async function (dir = "."): Promise<void> {
|
||||
const tsFiles = (readdirRecursive(dir) as string[])
|
||||
.filter((path: string) => path.endsWith(".ts"))
|
||||
.map((path) => dir + "/" + path);
|
||||
|
||||
// Run all checks in parallel
|
||||
await Promise.all(tsFiles.map((file) => verifyJqueryUsage(file)));
|
||||
return;
|
||||
};
|
||||
|
||||
export { verifyJqueryImport };
|
||||
@@ -5,8 +5,7 @@
|
||||
|
||||
// - TypeScript -----------------------------------------------------------
|
||||
|
||||
import { banner, build, outDir } from "./_build";
|
||||
import babelPlugin from "esbuild-plugin-babel";
|
||||
import { banner, build, outDir, babelPlugin } from "./_build";
|
||||
|
||||
build({
|
||||
bundle: true,
|
||||
@@ -25,8 +24,10 @@ build({
|
||||
// - Sass -----------------------------------------------------------
|
||||
|
||||
import autoprefixer from "autoprefixer";
|
||||
import postCssPlugin from "@deanc/esbuild-plugin-postcss";
|
||||
import sassPlugin from "esbuild-plugin-sass";
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore; Type definitions are not found. This occurs when `strict: true` in tsconfig.json
|
||||
import postCssPlugin from "@deanc/esbuild-plugin-postcss";
|
||||
|
||||
const sassOpts = {
|
||||
minify: true,
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
// yarn build
|
||||
// ```
|
||||
|
||||
import { banner, build, outDir, shinyDesc } from "./_build";
|
||||
import { banner, build, outDir, shinyDesc, babelPlugin } from "./_build";
|
||||
import globalsPlugin from "esbuild-plugin-globals";
|
||||
import babelPlugin from "esbuild-plugin-babel";
|
||||
import type { BuildOptions } from "esbuild";
|
||||
import { verifyJqueryImport } from "./_jquery";
|
||||
|
||||
const opts: BuildOptions = {
|
||||
entryPoints: ["srcts/src/index.ts"],
|
||||
@@ -27,12 +27,21 @@ const opts: BuildOptions = {
|
||||
banner: banner,
|
||||
};
|
||||
|
||||
build({
|
||||
...opts,
|
||||
outfile: outDir + "shiny.js",
|
||||
});
|
||||
build({
|
||||
...opts,
|
||||
outfile: outDir + "shiny.min.js",
|
||||
minify: true,
|
||||
});
|
||||
// Make sure all ts files contain jquery import statements before building
|
||||
verifyJqueryImport("srcts/src")
|
||||
.then(() => {
|
||||
Promise.all([
|
||||
build({
|
||||
...opts,
|
||||
outfile: outDir + "shiny.js",
|
||||
}),
|
||||
build({
|
||||
...opts,
|
||||
outfile: outDir + "shiny.min.js",
|
||||
minify: true,
|
||||
}),
|
||||
]);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Error:\n" + err);
|
||||
});
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# `yarn` Patch files
|
||||
|
||||
* `types-jquery.patch`
|
||||
* Do not export `$` as a globally available variable. When developing TS code, I like to have full control over the variables. It is good to have a record of where everything comes from. Shiny can not use the latest jQuery loaded onto the page and needs to use a scoped `jQuery` variable. In the end, we can shim the `jquery` import to be `window.jQuery`
|
||||
* `yarn_pnp.patch`
|
||||
* This file is currently not used and is outdated.
|
||||
* This provides a good game plan on how to use PnP with Yarn once esbuild can easily be integrated with Yarn PnP.
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
diff --git a/misc.d.ts b/misc.d.ts
|
||||
index 126d374477db459e1a251f5af548e88b46f43cdd..948cfb287b0bfa6057f3ccbcd013579aef07a29a 100644
|
||||
--- a/misc.d.ts
|
||||
+++ b/misc.d.ts
|
||||
@@ -6618,7 +6618,7 @@ $( "#checkMetaKey" ).click(function( event ) {
|
||||
}
|
||||
|
||||
declare const jQuery: JQueryStatic;
|
||||
-declare const $: JQueryStatic;
|
||||
+// declare const $: JQueryStatic;
|
||||
|
||||
type _Event = Event;
|
||||
type _UIEvent = UIEvent;
|
||||
@@ -6643,6 +6643,6 @@ interface SymbolConstructor {
|
||||
readonly toStringTag: symbol;
|
||||
}
|
||||
|
||||
-declare var Symbol: SymbolConstructor;
|
||||
+// declare var Symbol: SymbolConstructor;
|
||||
|
||||
// #endregion
|
||||
@@ -1,9 +1,8 @@
|
||||
import $ from "jquery";
|
||||
import { hasDefinedProperty } from "../../utils";
|
||||
import { InputBinding } from "./inputBinding";
|
||||
|
||||
import { hasOwnProperty } from "../../utils";
|
||||
|
||||
type ActionButtonReceiveMessageData = { label?: string; icon?: string };
|
||||
type ActionButtonReceiveMessageData = { label?: string; icon?: string | [] };
|
||||
|
||||
class ActionButtonInputBinding extends InputBinding {
|
||||
find(scope: HTMLElement): JQuery<HTMLElement> {
|
||||
@@ -40,7 +39,7 @@ class ActionButtonInputBinding extends InputBinding {
|
||||
const $el = $(el);
|
||||
|
||||
// retrieve current label and icon
|
||||
let label = $el.text();
|
||||
let label: string = $el.text();
|
||||
let icon = "";
|
||||
|
||||
// to check (and store) the previous icon, we look for a $el child
|
||||
@@ -57,16 +56,18 @@ class ActionButtonInputBinding extends InputBinding {
|
||||
}
|
||||
|
||||
// update the requested properties
|
||||
if (hasOwnProperty(data, "label")) label = data.label;
|
||||
if (hasOwnProperty(data, "icon")) {
|
||||
icon = data.icon;
|
||||
// if the user entered icon=character(0), remove the icon
|
||||
if (icon.length === 0) icon = "";
|
||||
if (hasDefinedProperty(data, "label")) {
|
||||
label = data.label;
|
||||
}
|
||||
if (hasDefinedProperty(data, "icon")) {
|
||||
// `data.icon` can be an [] if user gave `character(0)`.
|
||||
icon = Array.isArray(data.icon) ? "" : data.icon ?? "";
|
||||
}
|
||||
|
||||
// produce new html
|
||||
$el.html(icon + " " + label);
|
||||
}
|
||||
|
||||
unsubscribe(el: HTMLElement): void {
|
||||
$(el).off(".actionButtonInputBinding");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from "jquery";
|
||||
import { InputBinding } from "./inputBinding";
|
||||
import { hasOwnProperty } from "../../utils";
|
||||
import { hasDefinedProperty } from "../../utils";
|
||||
|
||||
type CheckedHTMLElement = HTMLInputElement;
|
||||
|
||||
@@ -35,12 +35,15 @@ class CheckboxInputBinding extends InputBinding {
|
||||
el: CheckedHTMLElement,
|
||||
data: CheckboxReceiveMessageData
|
||||
): void {
|
||||
if (hasOwnProperty(data, "value")) el.checked = data.value;
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
el.checked = data.value;
|
||||
}
|
||||
|
||||
// checkboxInput()'s label works different from other
|
||||
// input labels...the label container should always exist
|
||||
if (hasOwnProperty(data, "label"))
|
||||
if (hasDefinedProperty(data, "label")) {
|
||||
$(el).parent().find("span").text(data.label);
|
||||
}
|
||||
|
||||
$(el).trigger("change");
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import $ from "jquery";
|
||||
|
||||
import { InputBinding } from "./inputBinding";
|
||||
import { $escape, hasOwnProperty, updateLabel } from "../../utils";
|
||||
import { $escape, updateLabel, hasDefinedProperty } from "../../utils";
|
||||
import type { CheckedHTMLElement } from "./checkbox";
|
||||
|
||||
type CheckboxGroupHTMLElement = CheckedHTMLElement;
|
||||
@@ -24,9 +24,11 @@ function getLabelNode(el: CheckboxGroupHTMLElement): JQuery<HTMLElement> {
|
||||
// Given an input DOM object, get the associated label. Handles labels
|
||||
// that wrap the input as well as labels associated with 'for' attribute.
|
||||
function getLabel(obj: HTMLElement): string | null {
|
||||
const parentNode = obj.parentNode as HTMLElement;
|
||||
|
||||
// If <label><input /><span>label text</span></label>
|
||||
if ((obj.parentNode as HTMLElement).tagName === "LABEL") {
|
||||
return $(obj.parentNode).find("span").text().trim();
|
||||
if (parentNode.tagName === "LABEL") {
|
||||
return $(parentNode).find("span").text().trim();
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -35,9 +37,11 @@ function getLabel(obj: HTMLElement): string | null {
|
||||
// that wrap the input as well as labels associated with 'for' attribute.
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function setLabel(obj: HTMLElement, value: string): null {
|
||||
const parentNode = obj.parentNode as HTMLElement;
|
||||
|
||||
// If <label><input /><span>label text</span></label>
|
||||
if ((obj.parentNode as HTMLElement).tagName === "LABEL") {
|
||||
$(obj.parentNode).find("span").text(value);
|
||||
if (parentNode.tagName === "LABEL") {
|
||||
$(parentNode).find("span").text(value);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -58,7 +62,10 @@ class CheckboxGroupInputBinding extends InputBinding {
|
||||
}
|
||||
return values;
|
||||
}
|
||||
setValue(el: HTMLElement, value: string[] | string): void {
|
||||
setValue(el: HTMLElement, value: string[] | string | null): void {
|
||||
// Null value should be treated as empty array
|
||||
value = value ?? [];
|
||||
|
||||
// Clear all checkboxes
|
||||
$('input:checkbox[name="' + $escape(el.id) + '"]').prop("checked", false);
|
||||
|
||||
@@ -113,7 +120,7 @@ class CheckboxGroupInputBinding extends InputBinding {
|
||||
const $el = $(el);
|
||||
|
||||
// This will replace all the options
|
||||
if (hasOwnProperty(data, "options")) {
|
||||
if (hasDefinedProperty(data, "options")) {
|
||||
// Clear existing options and add each new one
|
||||
$el.find("div.shiny-options-group").remove();
|
||||
// Backward compatibility: for HTML generated by shinybootstrap2 package
|
||||
@@ -121,7 +128,9 @@ class CheckboxGroupInputBinding extends InputBinding {
|
||||
$el.append(data.options);
|
||||
}
|
||||
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
this.setValue(el, data.value);
|
||||
}
|
||||
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ import {
|
||||
updateLabel,
|
||||
$escape,
|
||||
parseDate,
|
||||
hasOwnProperty,
|
||||
hasDefinedProperty,
|
||||
} from "../../utils";
|
||||
import type { NotUndefined } from "../../utils/extraTypes";
|
||||
|
||||
declare global {
|
||||
interface JQuery {
|
||||
@@ -14,7 +15,9 @@ declare global {
|
||||
bsDatepicker(methodName: "getUTCDate"): Date;
|
||||
// Infinity is not allowed as a literal return type. Using `1e9999` as a placeholder that resolves to Infinity
|
||||
// https://github.com/microsoft/TypeScript/issues/32277
|
||||
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
||||
bsDatepicker(methodName: "getStartDate"): Date | -1e9999;
|
||||
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
||||
bsDatepicker(methodName: "getEndDate"): Date | 1e9999;
|
||||
bsDatepicker(methodName: string): void;
|
||||
bsDatepicker(methodName: string, params: Date | null): void;
|
||||
@@ -122,8 +125,7 @@ class DateInputBindingBase extends InputBinding {
|
||||
}
|
||||
// Given an unambiguous date string or a Date object, set the min (start) date.
|
||||
// null will unset. undefined will result in no change,
|
||||
protected _setMin(el: HTMLElement, date: Date | null | undefined): void {
|
||||
if (date === undefined) return;
|
||||
protected _setMin(el: HTMLElement, date: Date | null): void {
|
||||
if (date === null) {
|
||||
$(el).bsDatepicker("setStartDate", null);
|
||||
return;
|
||||
@@ -161,8 +163,7 @@ class DateInputBindingBase extends InputBinding {
|
||||
}
|
||||
// Given an unambiguous date string or a Date object, set the max (end) date
|
||||
// null will unset.
|
||||
protected _setMax(el: HTMLElement, date: Date): void {
|
||||
if (date === undefined) return;
|
||||
protected _setMax(el: HTMLElement, date: Date | null): void {
|
||||
if (date === null) {
|
||||
$(el).bsDatepicker("setEndDate", null);
|
||||
return;
|
||||
@@ -236,7 +237,7 @@ class DateInputBinding extends DateInputBindingBase {
|
||||
return formatDateUTC(date);
|
||||
}
|
||||
// value must be an unambiguous string like '2001-01-01', or a Date object.
|
||||
setValue(el: HTMLElement, value: Date): void {
|
||||
setValue(el: HTMLElement, value: Date | null): void {
|
||||
// R's NA, which is null here will remove current value
|
||||
if (value === null) {
|
||||
$(el).find("input").val("").bsDatepicker("update");
|
||||
@@ -286,7 +287,7 @@ class DateInputBinding extends DateInputBindingBase {
|
||||
return {
|
||||
label: this._getLabelNode(el).text(),
|
||||
value: this.getValue(el),
|
||||
valueString: $input.val(),
|
||||
valueString: $input.val() as NotUndefined<ReturnType<typeof $input.val>>,
|
||||
min: min,
|
||||
max: max,
|
||||
language: $input.data("datepicker").language,
|
||||
@@ -300,14 +301,14 @@ class DateInputBinding extends DateInputBindingBase {
|
||||
|
||||
updateLabel(data.label, this._getLabelNode(el));
|
||||
|
||||
if (hasOwnProperty(data, "min")) this._setMin($input[0], data.min);
|
||||
if (hasDefinedProperty(data, "min")) this._setMin($input[0], data.min);
|
||||
|
||||
if (hasOwnProperty(data, "max")) this._setMax($input[0], data.max);
|
||||
if (hasDefinedProperty(data, "max")) this._setMax($input[0], data.max);
|
||||
|
||||
// Must set value only after min and max have been set. If new value is
|
||||
// outside the bounds of the previous min/max, then the result will be a
|
||||
// blank input.
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) this.setValue(el, data.value);
|
||||
|
||||
$(el).trigger("change");
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import $ from "jquery";
|
||||
import {
|
||||
$escape,
|
||||
formatDateUTC,
|
||||
hasOwnProperty,
|
||||
hasDefinedProperty,
|
||||
updateLabel,
|
||||
} from "../../utils";
|
||||
import { DateInputBindingBase } from "./date";
|
||||
@@ -114,12 +114,12 @@ class DateRangeInputBinding extends DateInputBindingBase {
|
||||
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
if (hasOwnProperty(data, "min")) {
|
||||
if (hasDefinedProperty(data, "min")) {
|
||||
this._setMin($startinput[0], data.min);
|
||||
this._setMin($endinput[0], data.min);
|
||||
}
|
||||
|
||||
if (hasOwnProperty(data, "max")) {
|
||||
if (hasDefinedProperty(data, "max")) {
|
||||
this._setMax($startinput[0], data.max);
|
||||
this._setMax($endinput[0], data.max);
|
||||
}
|
||||
@@ -127,7 +127,9 @@ class DateRangeInputBinding extends DateInputBindingBase {
|
||||
// Must set value only after min and max have been set. If new value is
|
||||
// outside the bounds of the previous min/max, then the result will be a
|
||||
// blank input.
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
this.setValue(el, data.value);
|
||||
}
|
||||
|
||||
$el.trigger("change");
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ function enableDraghover(el: JQuery<HTMLElement>): JQuery<HTMLElement> {
|
||||
const $el = $(el);
|
||||
let childCounter = 0;
|
||||
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
$el.on({
|
||||
"dragenter.draghover": (e) => {
|
||||
if (childCounter++ === 0) {
|
||||
@@ -91,7 +92,7 @@ function canSetFiles(fileList: FileList): boolean {
|
||||
return true;
|
||||
}
|
||||
function handleDrop(e: JQuery.DragEventBase, el: HTMLInputElement): void {
|
||||
const files = e.originalEvent.dataTransfer.files,
|
||||
const files = e.originalEvent?.dataTransfer?.files,
|
||||
$el = $(el);
|
||||
|
||||
if (files === undefined || files === null) {
|
||||
@@ -109,7 +110,7 @@ function handleDrop(e: JQuery.DragEventBase, el: HTMLInputElement): void {
|
||||
// 3. The browser supports FileList and input.files assignment.
|
||||
// (Chrome, Safari)
|
||||
$el.val("");
|
||||
el.files = e.originalEvent.dataTransfer.files;
|
||||
el.files = files;
|
||||
// Recent versions of Firefox (57+, or "Quantum" and beyond) don't seem to
|
||||
// automatically trigger a change event, so we trigger one manually here.
|
||||
// On browsers that do trigger change, this operation appears to be
|
||||
@@ -188,7 +189,7 @@ function uploadFiles(evt: JQuery.DragEvent): void {
|
||||
// TODO-barret ; Should this be an internal class property?
|
||||
let $fileInputs = $();
|
||||
|
||||
function fileInputBindingGetId(el: HTMLInputElement): string {
|
||||
function fileInputBindingGetId(this: any, el: HTMLInputElement): string {
|
||||
return InputBinding.prototype.getId.call(this, el) || el.name;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,14 +2,13 @@ import type { RatePolicyModes } from "../../inputPolicies/inputRateDecorator";
|
||||
import type { BindScope } from "../../shiny/bind";
|
||||
|
||||
class InputBinding {
|
||||
name: string;
|
||||
name!: string;
|
||||
|
||||
// Returns a jQuery object or element array that contains the
|
||||
// descendants of scope that match this binding
|
||||
find(scope: BindScope): JQuery<HTMLElement> {
|
||||
throw "Not implemented";
|
||||
// add so that typescript isn't mad about an unused var
|
||||
scope;
|
||||
scope; // unused var
|
||||
}
|
||||
|
||||
getId(el: HTMLElement): string {
|
||||
@@ -18,9 +17,9 @@ class InputBinding {
|
||||
|
||||
// Gives the input a type in case the server needs to know it
|
||||
// to deserialize the JSON correctly
|
||||
getType(el: HTMLElement): string | false {
|
||||
return false;
|
||||
el;
|
||||
getType(el: HTMLElement): string | null {
|
||||
return null;
|
||||
el; // unused var
|
||||
}
|
||||
getValue(el: HTMLElement): any {
|
||||
throw "Not implemented";
|
||||
@@ -32,12 +31,12 @@ class InputBinding {
|
||||
// getRatePolicy. If false, send value immediately. Default behavior is `false`
|
||||
subscribe(el: HTMLElement, callback: (value: boolean) => void): void {
|
||||
// empty
|
||||
el;
|
||||
callback;
|
||||
el; // unused var
|
||||
callback; // unused var
|
||||
}
|
||||
unsubscribe(el: HTMLElement): void {
|
||||
// empty
|
||||
el;
|
||||
el; // unused var
|
||||
}
|
||||
|
||||
// This is used for receiving messages that tell the input object to do
|
||||
@@ -47,19 +46,19 @@ class InputBinding {
|
||||
// trigger a change event.
|
||||
receiveMessage(el: HTMLElement, data: unknown): void {
|
||||
throw "Not implemented";
|
||||
el;
|
||||
data;
|
||||
el; // unused var
|
||||
data; // unused var
|
||||
}
|
||||
getState(el: HTMLElement): unknown {
|
||||
throw "Not implemented";
|
||||
el;
|
||||
el; // unused var
|
||||
}
|
||||
|
||||
getRatePolicy(
|
||||
el: HTMLElement
|
||||
): { policy: RatePolicyModes; delay: number } | null {
|
||||
return null;
|
||||
el;
|
||||
el; // unused var
|
||||
}
|
||||
|
||||
// Some input objects need initialization before being bound. This is
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import $ from "jquery";
|
||||
import { $escape, hasOwnProperty, updateLabel } from "../../utils";
|
||||
import { $escape, hasDefinedProperty, updateLabel } from "../../utils";
|
||||
import { TextInputBindingBase } from "./text";
|
||||
|
||||
type NumberHTMLElement = HTMLInputElement;
|
||||
@@ -23,7 +23,9 @@ class NumberInputBinding extends TextInputBindingBase {
|
||||
return $(scope).find('input[type="number"]');
|
||||
}
|
||||
|
||||
getValue(el: NumberHTMLElement): string[] | number | string {
|
||||
getValue(
|
||||
el: NumberHTMLElement
|
||||
): string[] | number | string | null | undefined {
|
||||
const numberVal = $(el).val();
|
||||
|
||||
if (typeof numberVal == "string") {
|
||||
@@ -49,10 +51,12 @@ class NumberInputBinding extends TextInputBindingBase {
|
||||
el;
|
||||
}
|
||||
receiveMessage(el: NumberHTMLElement, data: NumberReceiveMessageData): void {
|
||||
if (hasOwnProperty(data, "value")) el.value = data.value;
|
||||
if (hasOwnProperty(data, "min")) el.min = data.min;
|
||||
if (hasOwnProperty(data, "max")) el.max = data.max;
|
||||
if (hasOwnProperty(data, "step")) el.step = data.step;
|
||||
// Setting values to `""` will remove the attribute value from the DOM element.
|
||||
// The attr key will still remain, but there is not value... ex: `<input id="foo" type="number" min max/>`
|
||||
if (hasDefinedProperty(data, "value")) el.value = data.value ?? "";
|
||||
if (hasDefinedProperty(data, "min")) el.min = data.min ?? "";
|
||||
if (hasDefinedProperty(data, "max")) el.max = data.max ?? "";
|
||||
if (hasDefinedProperty(data, "step")) el.step = data.step ?? "";
|
||||
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from "jquery";
|
||||
import { InputBinding } from "./inputBinding";
|
||||
import { $escape, hasOwnProperty, updateLabel } from "../../utils";
|
||||
import { $escape, hasDefinedProperty, updateLabel } from "../../utils";
|
||||
|
||||
type RadioHTMLElement = HTMLInputElement;
|
||||
|
||||
@@ -10,7 +10,7 @@ type ValueLabelObject = {
|
||||
};
|
||||
|
||||
type RadioReceiveMessageData = {
|
||||
value?: string;
|
||||
value?: string | [];
|
||||
options?: ValueLabelObject[];
|
||||
label: string;
|
||||
};
|
||||
@@ -24,9 +24,11 @@ function getLabelNode(el: RadioHTMLElement): JQuery<HTMLElement> {
|
||||
// Given an input DOM object, get the associated label. Handles labels
|
||||
// that wrap the input as well as labels associated with 'for' attribute.
|
||||
function getLabel(obj: HTMLElement): string | null {
|
||||
const parentNode = obj.parentNode as HTMLElement;
|
||||
|
||||
// If <label><input /><span>label text</span></label>
|
||||
if ((obj.parentNode as HTMLElement).tagName === "LABEL") {
|
||||
return $(obj.parentNode).find("span").text().trim();
|
||||
if (parentNode.tagName === "LABEL") {
|
||||
return $(parentNode).find("span").text().trim();
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -35,9 +37,11 @@ function getLabel(obj: HTMLElement): string | null {
|
||||
// that wrap the input as well as labels associated with 'for' attribute.
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function setLabel(obj: HTMLElement, value: string): null {
|
||||
const parentNode = obj.parentNode as HTMLElement;
|
||||
|
||||
// If <label><input /><span>label text</span></label>
|
||||
if ((obj.parentNode as HTMLElement).tagName === "LABEL") {
|
||||
$(obj.parentNode).find("span").text(value);
|
||||
if (parentNode.tagName === "LABEL") {
|
||||
$(parentNode).find("span").text(value);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -47,7 +51,9 @@ class RadioInputBinding extends InputBinding {
|
||||
find(scope: HTMLElement): JQuery<HTMLElement> {
|
||||
return $(scope).find(".shiny-input-radiogroup");
|
||||
}
|
||||
getValue(el: RadioHTMLElement): string[] | number | string | null {
|
||||
getValue(
|
||||
el: RadioHTMLElement
|
||||
): string[] | number | string | null | undefined {
|
||||
// Select the radio objects that have name equal to the grouping div's id
|
||||
const checkedItems = $(
|
||||
'input:radio[name="' + $escape(el.id) + '"]:checked'
|
||||
@@ -61,8 +67,8 @@ class RadioInputBinding extends InputBinding {
|
||||
|
||||
return checkedItems.val();
|
||||
}
|
||||
setValue(el: RadioHTMLElement, value: string): void {
|
||||
if ($.isArray(value) && value.length === 0) {
|
||||
setValue(el: RadioHTMLElement, value: string | []): void {
|
||||
if (Array.isArray(value) && value.length === 0) {
|
||||
// Removing all checked item if the sent data is empty
|
||||
$('input:radio[name="' + $escape(el.id) + '"]').prop("checked", false);
|
||||
} else {
|
||||
@@ -77,7 +83,7 @@ class RadioInputBinding extends InputBinding {
|
||||
}
|
||||
getState(el: RadioHTMLElement): {
|
||||
label: string;
|
||||
value: string[] | number | string;
|
||||
value: ReturnType<RadioInputBinding["getValue"]>;
|
||||
options: ValueLabelObject[];
|
||||
} {
|
||||
const $objs = $(
|
||||
@@ -101,16 +107,20 @@ class RadioInputBinding extends InputBinding {
|
||||
const $el = $(el);
|
||||
// This will replace all the options
|
||||
|
||||
if (hasOwnProperty(data, "options")) {
|
||||
if (hasDefinedProperty(data, "options")) {
|
||||
// Clear existing options and add each new one
|
||||
$el.find("div.shiny-options-group").remove();
|
||||
// Backward compatibility: for HTML generated by shinybootstrap2 package
|
||||
$el.find("label.radio").remove();
|
||||
// @ts-expect-error; TODO-barret; IDK what this line is doing
|
||||
// TODO-barret; Should this line be setting attributes instead?
|
||||
// `data.options` is an array of `{value, label}` objects
|
||||
$el.append(data.options);
|
||||
}
|
||||
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
this.setValue(el, data.value);
|
||||
}
|
||||
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import $ from "jquery";
|
||||
import { InputBinding } from "./inputBinding";
|
||||
import { $escape, hasOwnProperty, updateLabel } from "../../utils";
|
||||
import { $escape, hasDefinedProperty, updateLabel } from "../../utils";
|
||||
import { indirectEval } from "../../utils/eval";
|
||||
import type { NotUndefined } from "../../utils/extraTypes";
|
||||
|
||||
type SelectHTMLElement = HTMLSelectElement & { nonempty: boolean };
|
||||
|
||||
@@ -13,8 +14,9 @@ type SelectInputReceiveMessageData = {
|
||||
value?: string;
|
||||
};
|
||||
|
||||
type SelectizeOptions = Selectize.IOptions<string, unknown>;
|
||||
type SelectizeInfo = Selectize.IApi<string, unknown> & {
|
||||
settings: Selectize.IOptions<string, unknown>;
|
||||
settings: SelectizeOptions;
|
||||
};
|
||||
|
||||
function getLabelNode(el: SelectHTMLElement): JQuery<HTMLElement> {
|
||||
@@ -42,7 +44,7 @@ class SelectInputBinding extends InputBinding {
|
||||
find(scope: HTMLElement): JQuery<HTMLElement> {
|
||||
return $(scope).find("select");
|
||||
}
|
||||
getType(el: HTMLElement): string {
|
||||
getType(el: HTMLElement): string | null {
|
||||
const $el = $(el);
|
||||
|
||||
if (!$el.hasClass("symbol")) {
|
||||
@@ -58,8 +60,10 @@ class SelectInputBinding extends InputBinding {
|
||||
getId(el: SelectHTMLElement): string {
|
||||
return InputBinding.prototype.getId.call(this, el) || el.name;
|
||||
}
|
||||
getValue(el: HTMLElement): string[] | number | string {
|
||||
return $(el).val();
|
||||
getValue(
|
||||
el: HTMLElement
|
||||
): NotUndefined<ReturnType<JQuery<HTMLElement>["val"]>> {
|
||||
return $(el).val() as NotUndefined<ReturnType<JQuery<HTMLElement>["val"]>>;
|
||||
}
|
||||
setValue(el: SelectHTMLElement, value: string): void {
|
||||
if (!isSelectize(el)) {
|
||||
@@ -67,14 +71,12 @@ class SelectInputBinding extends InputBinding {
|
||||
} else {
|
||||
const selectize = this._selectize(el);
|
||||
|
||||
if (selectize) {
|
||||
selectize.setValue(value);
|
||||
}
|
||||
selectize.setValue(value);
|
||||
}
|
||||
}
|
||||
getState(el: SelectHTMLElement): {
|
||||
label: JQuery<HTMLElement>;
|
||||
value: string[] | number | string;
|
||||
value: ReturnType<SelectInputBinding["getValue"]>;
|
||||
options: Array<{ value: string; label: string }>;
|
||||
} {
|
||||
// Store options in an array of objects, each with with value and label
|
||||
@@ -101,13 +103,13 @@ class SelectInputBinding extends InputBinding {
|
||||
data: SelectInputReceiveMessageData
|
||||
): void {
|
||||
const $el = $(el);
|
||||
let selectize;
|
||||
|
||||
// This will replace all the options
|
||||
if (hasOwnProperty(data, "options")) {
|
||||
selectize = this._selectize(el);
|
||||
if (hasDefinedProperty(data, "options")) {
|
||||
const selectize = this._selectize(el);
|
||||
// Must destroy selectize before appending new options, otherwise
|
||||
// selectize will restore the original select
|
||||
|
||||
if (selectize) selectize.destroy();
|
||||
// Clear existing options and add each new one
|
||||
$el.empty().append(data.options);
|
||||
@@ -115,7 +117,7 @@ class SelectInputBinding extends InputBinding {
|
||||
}
|
||||
|
||||
// re-initialize selectize
|
||||
if (hasOwnProperty(data, "config")) {
|
||||
if (hasDefinedProperty(data, "config")) {
|
||||
$el
|
||||
.parent()
|
||||
.find('script[data-for="' + $escape(el.id) + '"]')
|
||||
@@ -124,12 +126,22 @@ class SelectInputBinding extends InputBinding {
|
||||
}
|
||||
|
||||
// use server-side processing for selectize
|
||||
if (hasOwnProperty(data, "url")) {
|
||||
selectize = this._selectize(el);
|
||||
if (hasDefinedProperty(data, "url")) {
|
||||
type CallbackFn = Parameters<
|
||||
NonNullable<SelectizeInfo["settings"]["load"]>
|
||||
>[1];
|
||||
const selectize = this._selectize(el) as ReturnType<
|
||||
SelectInputBinding["_selectize"]
|
||||
> & {
|
||||
settings: {
|
||||
load: (query: string, callback: CallbackFn) => any;
|
||||
};
|
||||
};
|
||||
|
||||
selectize.clearOptions();
|
||||
let loaded = false;
|
||||
|
||||
selectize.settings.load = function (query, callback) {
|
||||
selectize.settings.load = function (query: string, callback: CallbackFn) {
|
||||
const settings = selectize.settings;
|
||||
|
||||
$.ajax({
|
||||
@@ -155,7 +167,7 @@ class SelectInputBinding extends InputBinding {
|
||||
// the group's label and value. We use the current settings of
|
||||
// the selectize object to decide the fieldnames of that obj.
|
||||
const optgroupId = elem[settings.optgroupField || "optgroup"];
|
||||
const optgroup = {};
|
||||
const optgroup: { [key: string]: string } = {};
|
||||
|
||||
optgroup[settings.optgroupLabelField || "label"] = optgroupId;
|
||||
optgroup[settings.optgroupValueField || "value"] = optgroupId;
|
||||
@@ -163,8 +175,10 @@ class SelectInputBinding extends InputBinding {
|
||||
});
|
||||
callback(res);
|
||||
if (!loaded) {
|
||||
if (hasOwnProperty(data, "value")) {
|
||||
selectize.setValue(data.value);
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
if (typeof data.value === "string") {
|
||||
selectize.setValue(data.value);
|
||||
}
|
||||
} else if (settings.maxItems === 1) {
|
||||
// first item selected by default only for single-select
|
||||
selectize.setValue(res[0].value);
|
||||
@@ -178,7 +192,7 @@ class SelectInputBinding extends InputBinding {
|
||||
selectize.load(function (callback) {
|
||||
selectize.settings.load.apply(selectize, ["", callback]);
|
||||
});
|
||||
} else if (hasOwnProperty(data, "value")) {
|
||||
} else if (hasDefinedProperty(data, "value")) {
|
||||
this.setValue(el, data.value);
|
||||
}
|
||||
|
||||
@@ -208,21 +222,22 @@ class SelectInputBinding extends InputBinding {
|
||||
this._selectize(el);
|
||||
}
|
||||
protected _selectize(el: SelectHTMLElement, update = false): SelectizeInfo {
|
||||
if (!$.fn.selectize) return undefined;
|
||||
if (!$.fn.selectize) throw "selectize jquery is not defined";
|
||||
const $el = $(el);
|
||||
const config = $el
|
||||
.parent()
|
||||
.find('script[data-for="' + $escape(el.id) + '"]');
|
||||
|
||||
if (config.length === 0) return undefined;
|
||||
if (config.length === 0)
|
||||
throw "No config found for selectize with id:" + $escape(el.id);
|
||||
|
||||
let options: {
|
||||
let options: SelectizeOptions & {
|
||||
labelField: "label";
|
||||
valueField: "value";
|
||||
searchField: ["label"];
|
||||
onItemRemove?: (value: string) => void;
|
||||
onDropdownClose?: () => void;
|
||||
} & { [key: string]: unknown } = $.extend(
|
||||
} = $.extend(
|
||||
{
|
||||
labelField: "label",
|
||||
valueField: "value",
|
||||
@@ -235,7 +250,7 @@ class SelectInputBinding extends InputBinding {
|
||||
if (typeof config.data("nonempty") !== "undefined") {
|
||||
el.nonempty = true;
|
||||
options = $.extend(options, {
|
||||
onItemRemove: function (value) {
|
||||
onItemRemove: function (this: SelectizeInfo, value: string) {
|
||||
if (this.getValue() === "")
|
||||
$("select#" + $escape(el.id))
|
||||
.empty()
|
||||
@@ -249,9 +264,10 @@ class SelectInputBinding extends InputBinding {
|
||||
},
|
||||
onDropdownClose:
|
||||
// $dropdown: any
|
||||
function () {
|
||||
if (this.getValue() === "")
|
||||
this.setValue($("select#" + $escape(el.id)).val());
|
||||
function (this: SelectizeInfo) {
|
||||
if (this.getValue() === "") {
|
||||
this.setValue($("select#" + $escape(el.id)).val() as string);
|
||||
}
|
||||
},
|
||||
});
|
||||
} else {
|
||||
@@ -259,8 +275,9 @@ class SelectInputBinding extends InputBinding {
|
||||
}
|
||||
// options that should be eval()ed
|
||||
if (config.data("eval") instanceof Array)
|
||||
$.each(config.data("eval"), function (i, x) {
|
||||
$.each(config.data("eval"), function (i, x: string) {
|
||||
/*jshint evil: true*/
|
||||
// @ts-expect-error; Need to type `options` keys to know exactly which values are accessed.
|
||||
options[x] = indirectEval("(" + options[x] + ")");
|
||||
});
|
||||
let control = $el.selectize(options)[0].selectize as SelectizeInfo;
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
import type {
|
||||
IonRangeSliderEvent,
|
||||
IonRangeSliderOptions,
|
||||
} from "ion-rangeslider";
|
||||
import $ from "jquery";
|
||||
// import { NameValueHTMLElement } from ".";
|
||||
import {
|
||||
formatDateUTC,
|
||||
updateLabel,
|
||||
$escape,
|
||||
hasOwnProperty,
|
||||
hasDefinedProperty,
|
||||
} from "../../utils";
|
||||
|
||||
import type { TextHTMLElement } from "./text";
|
||||
@@ -28,6 +32,11 @@ type SliderReceiveMessageData = {
|
||||
min?: number;
|
||||
max?: number;
|
||||
step?: number;
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
"data-type"?: string;
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
"time-format"?: string;
|
||||
timezone?: string;
|
||||
};
|
||||
|
||||
// MUST use window.strftime as the javascript dependency is dynamic
|
||||
@@ -42,7 +51,7 @@ declare global {
|
||||
}
|
||||
|
||||
// Necessary to get hidden sliders to send their updated values
|
||||
function forceIonSliderUpdate(slider) {
|
||||
function forceIonSliderUpdate(slider: any) {
|
||||
if (slider.$cache && slider.$cache.input)
|
||||
slider.$cache.input.trigger("change");
|
||||
else console.log("Couldn't force ion slider to update");
|
||||
@@ -73,7 +82,7 @@ function getTypePrettifyer(
|
||||
// The default prettify function for ion.rangeSlider adds thousands
|
||||
// separators after the decimal mark, so we have our own version here.
|
||||
// (#1958)
|
||||
prettify = function (num) {
|
||||
prettify = function (this: IonRangeSliderOptions, num: number) {
|
||||
// When executed, `this` will refer to the `IonRangeSlider.options`
|
||||
// object.
|
||||
return formatNumber(num, this.prettify_separator);
|
||||
@@ -104,18 +113,18 @@ class SliderInputBinding extends TextInputBindingBase {
|
||||
return $(scope).find("input.js-range-slider");
|
||||
}
|
||||
|
||||
getType(el: HTMLElement): string | false {
|
||||
getType(el: HTMLElement): string | null {
|
||||
const dataType = $(el).data("data-type");
|
||||
|
||||
if (dataType === "date") return "shiny.date";
|
||||
else if (dataType === "datetime") return "shiny.datetime";
|
||||
else return false;
|
||||
else return null;
|
||||
}
|
||||
getValue(
|
||||
el: TextHTMLElement
|
||||
): number | string | [number | string, number | string] {
|
||||
const $el = $(el);
|
||||
const result = $(el).data("ionRangeSlider").result;
|
||||
const result = $(el).data("ionRangeSlider").result as IonRangeSliderEvent;
|
||||
|
||||
// Function for converting numeric value from slider to appropriate type.
|
||||
let convert: (val: unknown) => number | string;
|
||||
@@ -182,21 +191,28 @@ class SliderInputBinding extends TextInputBindingBase {
|
||||
prettify?: Prettify;
|
||||
} = {};
|
||||
|
||||
if (hasOwnProperty(data, "value")) {
|
||||
if (hasDefinedProperty(data, "value")) {
|
||||
if (numValues(el) === 2 && data.value instanceof Array) {
|
||||
msg.from = data.value[0];
|
||||
msg.to = data.value[1];
|
||||
} else {
|
||||
msg.from = data.value as number | string;
|
||||
if (Array.isArray(data.value)) {
|
||||
throw "Slider only contains a single value and cannot be updated with an array";
|
||||
}
|
||||
msg.from = data.value;
|
||||
}
|
||||
}
|
||||
|
||||
const sliderFeatures = ["min", "max", "step"];
|
||||
const sliderFeatures: Array<"max" | "min" | "step"> = [
|
||||
"min",
|
||||
"max",
|
||||
"step",
|
||||
];
|
||||
|
||||
for (let i = 0; i < sliderFeatures.length; i++) {
|
||||
const feats = sliderFeatures[i];
|
||||
|
||||
if (hasOwnProperty(data, feats)) {
|
||||
if (hasDefinedProperty(data, feats)) {
|
||||
msg[feats] = data[feats];
|
||||
}
|
||||
}
|
||||
@@ -204,12 +220,16 @@ class SliderInputBinding extends TextInputBindingBase {
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
// (maybe) update data elements
|
||||
const domElements = ["data-type", "time-format", "timezone"];
|
||||
const domElements: Array<"data-type" | "time-format" | "timezone"> = [
|
||||
"data-type",
|
||||
"time-format",
|
||||
"timezone",
|
||||
];
|
||||
|
||||
for (let i = 0; i < domElements.length; i++) {
|
||||
const elem = domElements[i];
|
||||
|
||||
if (hasOwnProperty(data, elem)) {
|
||||
if (hasDefinedProperty(data, elem)) {
|
||||
$el.data(elem, data[elem]);
|
||||
}
|
||||
}
|
||||
@@ -284,12 +304,12 @@ function formatNumber(
|
||||
$(document).on("click", ".slider-animate-button", function (evt: Event) {
|
||||
evt.preventDefault();
|
||||
const self = $(this);
|
||||
const target = $("#" + $escape(self.attr("data-target-id")));
|
||||
const target = $("#" + $escape(self.attr("data-target-id") as string));
|
||||
const startLabel = "Play";
|
||||
const stopLabel = "Pause";
|
||||
const loop =
|
||||
self.attr("data-loop") !== undefined &&
|
||||
!/^\s*false\s*$/i.test(self.attr("data-loop"));
|
||||
!/^\s*false\s*$/i.test(self.attr("data-loop") as string);
|
||||
let animInterval = self.attr("data-interval") as number | string;
|
||||
|
||||
if (isNaN(animInterval as number)) animInterval = 1500;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import $ from "jquery";
|
||||
import { InputBinding } from "./inputBinding";
|
||||
import { hasOwnProperty, isBS3 } from "../../utils";
|
||||
import { hasDefinedProperty, isBS3 } from "../../utils";
|
||||
|
||||
type TabInputReceiveMessageData = { value?: string };
|
||||
|
||||
@@ -25,7 +25,7 @@ class BootstrapTabInputBinding extends InputBinding {
|
||||
|
||||
return null;
|
||||
}
|
||||
setValue(el: HTMLElement, value: string): void {
|
||||
setValue(el: HTMLElement, value: string | undefined): void {
|
||||
let success = false;
|
||||
|
||||
if (value) {
|
||||
@@ -56,7 +56,7 @@ class BootstrapTabInputBinding extends InputBinding {
|
||||
return { value: this.getValue(el) };
|
||||
}
|
||||
receiveMessage(el: HTMLElement, data: TabInputReceiveMessageData): void {
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) this.setValue(el, data.value);
|
||||
$(el).trigger("change");
|
||||
}
|
||||
subscribe(el: HTMLElement, callback: (x: boolean) => void): void {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import $ from "jquery";
|
||||
import { $escape, updateLabel, hasOwnProperty } from "../../utils";
|
||||
import { $escape, updateLabel, hasDefinedProperty } from "../../utils";
|
||||
|
||||
import { InputBinding } from "./inputBinding";
|
||||
|
||||
@@ -109,11 +109,12 @@ class TextInputBinding extends TextInputBindingBase {
|
||||
};
|
||||
}
|
||||
receiveMessage(el: TextHTMLElement, data: TextReceiveMessageData): void {
|
||||
if (hasOwnProperty(data, "value")) this.setValue(el, data.value);
|
||||
if (hasDefinedProperty(data, "value")) this.setValue(el, data.value);
|
||||
|
||||
updateLabel(data.label, getLabelNode(el));
|
||||
|
||||
if (hasOwnProperty(data, "placeholder")) el.placeholder = data.placeholder;
|
||||
if (hasDefinedProperty(data, "placeholder"))
|
||||
el.placeholder = data.placeholder;
|
||||
|
||||
$(el).trigger("change");
|
||||
}
|
||||
|
||||
@@ -22,9 +22,12 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
options?: {
|
||||
searching?: boolean;
|
||||
search?: { caseInsensitive?: boolean };
|
||||
// To be sent to data table;
|
||||
// Will copy in R value to this location
|
||||
escape?: string;
|
||||
} | null;
|
||||
escape?: string; // Incoming from R
|
||||
action?: string;
|
||||
escape?: string;
|
||||
evalOptions?: string[];
|
||||
callback?: string;
|
||||
searchDelay?: number;
|
||||
@@ -42,7 +45,7 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
header = "<thead><tr>" + header + "</tr></thead>";
|
||||
let footer = "";
|
||||
|
||||
if (data.options === null || data.options.searching !== false) {
|
||||
if (data.options?.searching ?? true) {
|
||||
footer = $.map(colnames, function (x) {
|
||||
// placeholder needs to be escaped (and HTML tags are stripped off)
|
||||
return (
|
||||
@@ -62,17 +65,16 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
$el.append(content);
|
||||
|
||||
// options that should be eval()ed
|
||||
if (data.evalOptions)
|
||||
if (data.evalOptions) {
|
||||
$.each(data.evalOptions, function (i, x) {
|
||||
/*jshint evil: true */
|
||||
// @ts-expect-error; If `evalOptions` is defined, `data.options` should be defined
|
||||
data.options[x] = indirectEval("(" + data.options[x] + ")");
|
||||
});
|
||||
}
|
||||
|
||||
// caseInsensitive searching? default true
|
||||
const searchCI =
|
||||
data.options === null ||
|
||||
typeof data.options.search === "undefined" ||
|
||||
data.options.search.caseInsensitive !== false;
|
||||
const searchCI = data.options?.search?.caseInsensitive !== false;
|
||||
const oTable = $(el)
|
||||
.children("table")
|
||||
.DataTable(
|
||||
@@ -86,8 +88,14 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
ajax: {
|
||||
url: data.action,
|
||||
type: "POST",
|
||||
data: function (d) {
|
||||
data: function (d: NonNullable<typeof data.options>) {
|
||||
d.search || (d.search = {});
|
||||
d.search.caseInsensitive = searchCI;
|
||||
// Copy from the R value (`data.escape`) to the escape option
|
||||
// (`d.escape`) similar to `data.options.escape`;
|
||||
// Note: this logic may be wrong, but the method is strongly
|
||||
// deprecated in favor of DT package. So users should not
|
||||
// naturally run this line of code
|
||||
d.escape = data.escape;
|
||||
},
|
||||
},
|
||||
@@ -110,7 +118,7 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
.first()
|
||||
.unbind("keyup")
|
||||
.keyup(
|
||||
debounce(data.searchDelay, function () {
|
||||
debounce(data.searchDelay, function (this: HTMLInputElement) {
|
||||
oTable.search(this.value).draw();
|
||||
})
|
||||
);
|
||||
@@ -124,7 +132,7 @@ class DatatableOutputBinding extends OutputBinding {
|
||||
if (!x.bSearchable) searchInputs.eq(i as number).hide();
|
||||
});
|
||||
searchInputs.keyup(
|
||||
debounce(data.searchDelay, function () {
|
||||
debounce(data.searchDelay, function (this: HTMLInputElement) {
|
||||
oTable.column(searchInputs.index(this)).search(this.value).draw();
|
||||
})
|
||||
);
|
||||
|
||||
@@ -24,7 +24,7 @@ $(document).on(
|
||||
function (e: Event) {
|
||||
e;
|
||||
|
||||
const evt: FileDownloadEvent = jQuery.Event("shiny:filedownload");
|
||||
const evt: FileDownloadEvent = $.Event("shiny:filedownload");
|
||||
|
||||
evt.name = this.id;
|
||||
evt.href = this.href;
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
import { isIE, IEVersion } from "../../utils/browser";
|
||||
import type { CoordmapInit } from "../../imageutils/initCoordmap";
|
||||
import type { ErrorsMessageValue } from "../../shiny/shinyapp";
|
||||
import { ifUndefined } from "../../utils/object";
|
||||
|
||||
class ImageOutputBinding extends OutputBinding {
|
||||
find(scope: HTMLElement): JQuery<HTMLElement> {
|
||||
@@ -65,10 +66,6 @@ class ImageOutputBinding extends OutputBinding {
|
||||
|
||||
// If value is undefined, return alternate. Sort of like ||, except it won't
|
||||
// return alternate for other falsy values (0, false, null).
|
||||
function ifUndefined(value, alternate) {
|
||||
if (value === undefined) return alternate;
|
||||
return value;
|
||||
}
|
||||
|
||||
const opts = {
|
||||
clickId: $el.data("click-id"),
|
||||
|
||||
@@ -3,7 +3,7 @@ import { asArray } from "../../utils";
|
||||
import type { ErrorsMessageValue } from "../../shiny/shinyapp";
|
||||
|
||||
class OutputBinding {
|
||||
name: string;
|
||||
name!: string;
|
||||
|
||||
// Returns a jQuery object or element array that contains the
|
||||
// descendants of scope that match this binding
|
||||
|
||||
@@ -22,7 +22,8 @@ class OutputBindingAdapter {
|
||||
// onResize with a version that does a makeResizeFilter on the element.
|
||||
if (binding.resize) {
|
||||
this.onResize = makeResizeFilter(el, function (width, height) {
|
||||
binding.resize(el, width, height);
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
binding.resize!(el, width, height);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ interface BindingObj<Binding> {
|
||||
}
|
||||
|
||||
class BindingRegistry<Binding extends BindingBase> {
|
||||
name: string;
|
||||
name!: string;
|
||||
bindings: Array<BindingObj<Binding>> = [];
|
||||
bindingNames: { [key: string]: BindingObj<Binding> } = {};
|
||||
|
||||
|
||||
56
srcts/src/events/jQueryEvents.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
// Used to avoid isolated module warning
|
||||
import type { JQueryEventHandlerBase } from "bootstrap";
|
||||
import "jquery";
|
||||
|
||||
type EvtPrefix<T extends string> = `${T}.${string}`;
|
||||
type EvtFn<T extends JQuery.Event> = ((evt: T) => void) | null | undefined;
|
||||
|
||||
declare global {
|
||||
interface JQuery {
|
||||
on(events: EvtPrefix<"change">, handler: EvtFn<JQuery.DragEvent>): this;
|
||||
|
||||
on(
|
||||
events: EvtPrefix<"mousdown">,
|
||||
handler: EvtFn<JQuery.MouseDownEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"dblclick">,
|
||||
handler: EvtFn<JQuery.DoubleClickEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"dblclick2">,
|
||||
// Note: This may not be the _right type_, but it is how it is handled internally
|
||||
handler: EvtFn<JQuery.MouseDownEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"mousemove">,
|
||||
handler: EvtFn<JQuery.MouseMoveEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"mouseout">,
|
||||
handler: EvtFn<JQuery.MouseOutEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"mousedown">,
|
||||
handler: EvtFn<JQuery.MouseDownEvent>
|
||||
): this;
|
||||
on(
|
||||
events: EvtPrefix<"mousedown2">,
|
||||
handler: EvtFn<JQuery.MouseDownEvent>
|
||||
): this;
|
||||
on(events: EvtPrefix<"mouseup">, handler: EvtFn<JQuery.MouseUpEvent>): this;
|
||||
on(events: EvtPrefix<"resize">, handler: EvtFn<JQuery.ResizeEvent>): this;
|
||||
|
||||
on(
|
||||
events: `shown.bs.${string}.sendImageSize`,
|
||||
selector: string,
|
||||
handler: (
|
||||
this: HTMLElement,
|
||||
e: JQueryEventHandlerBase<HTMLElement, any>
|
||||
// e: JQuery.Event & {
|
||||
// namespace: string;
|
||||
// }
|
||||
) => void
|
||||
): this;
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ type UploadEndValue = never;
|
||||
// FileList object. Subclass/clone it and override the `on*` functions to
|
||||
// make it do something useful.
|
||||
class FileProcessor {
|
||||
files: FileList;
|
||||
files: File[];
|
||||
fileIndex = -1;
|
||||
// Currently need to use small chunk size because R-Websockets can't
|
||||
// handle continuation frames
|
||||
@@ -21,7 +21,7 @@ class FileProcessor {
|
||||
completed = false;
|
||||
|
||||
constructor(files: FileList, exec$run = true) {
|
||||
this.files = files;
|
||||
this.files = Array.from(files);
|
||||
|
||||
// TODO: Register error/abort callbacks
|
||||
if (exec$run) {
|
||||
@@ -30,7 +30,7 @@ class FileProcessor {
|
||||
}
|
||||
|
||||
// Begin callbacks. Subclassers/cloners may override any or all of these.
|
||||
onBegin(files: FileList, cont: () => void): void {
|
||||
onBegin(files: File[], cont: () => void): void {
|
||||
files;
|
||||
setTimeout(cont, 0);
|
||||
}
|
||||
@@ -99,10 +99,10 @@ class FileUploader extends FileProcessor {
|
||||
id: string;
|
||||
el: HTMLElement;
|
||||
|
||||
jobId: JobId;
|
||||
uploadUrl: UploadUrl;
|
||||
progressBytes: number;
|
||||
totalBytes: number;
|
||||
jobId!: JobId;
|
||||
uploadUrl!: UploadUrl;
|
||||
progressBytes!: number;
|
||||
totalBytes!: number;
|
||||
|
||||
constructor(
|
||||
shinyapp: ShinyApp,
|
||||
@@ -142,7 +142,7 @@ class FileUploader extends FileProcessor {
|
||||
): void {
|
||||
this.shinyapp.makeRequest(method, args, onSuccess, onFailure, blobs);
|
||||
}
|
||||
onBegin(files: FileList, cont: () => void): void {
|
||||
onBegin(files: File[], cont: () => void): void {
|
||||
// Reset progress bar
|
||||
this.$setError(null);
|
||||
this.$setActive(true);
|
||||
@@ -155,13 +155,12 @@ class FileUploader extends FileProcessor {
|
||||
this.totalBytes += file.size;
|
||||
});
|
||||
|
||||
const fileInfo = $.map(files, function (file: File, i) {
|
||||
const fileInfo = $.map(files, function (file: File) {
|
||||
return {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
type: file.type,
|
||||
};
|
||||
i;
|
||||
});
|
||||
|
||||
this.makeRequest(
|
||||
@@ -185,6 +184,9 @@ class FileUploader extends FileProcessor {
|
||||
type: "POST",
|
||||
cache: false,
|
||||
xhr: () => {
|
||||
if (typeof $.ajaxSettings.xhr !== "function")
|
||||
throw "jQuery's XHR is not a function";
|
||||
|
||||
const xhrVal = $.ajaxSettings.xhr();
|
||||
|
||||
if (xhrVal.upload) {
|
||||
@@ -243,7 +245,7 @@ class FileUploader extends FileProcessor {
|
||||
this.$bar().text("Upload complete");
|
||||
// Reset the file input's value to "". This allows the same file to be
|
||||
// uploaded again. https://stackoverflow.com/a/22521275
|
||||
$(evt.el).val("");
|
||||
$(evt.el as HTMLElement).val("");
|
||||
},
|
||||
(error) => {
|
||||
this.onError(error);
|
||||
|
||||
@@ -18,30 +18,30 @@ type BoundsCss = Bounds;
|
||||
type BoundsData = Bounds;
|
||||
|
||||
type ImageState = {
|
||||
brushing?: boolean;
|
||||
dragging?: boolean;
|
||||
resizing?: boolean;
|
||||
brushing: boolean;
|
||||
dragging: boolean;
|
||||
resizing: boolean;
|
||||
|
||||
// Offset of last mouse down and up events (in CSS pixels)
|
||||
down?: Offset;
|
||||
up?: Offset;
|
||||
down: Offset;
|
||||
up: Offset;
|
||||
|
||||
// Which side(s) we're currently resizing
|
||||
resizeSides?: {
|
||||
resizeSides: {
|
||||
left: boolean;
|
||||
right: boolean;
|
||||
top: boolean;
|
||||
bottom: boolean;
|
||||
};
|
||||
|
||||
boundsCss?: BoundsCss;
|
||||
boundsData?: BoundsData;
|
||||
boundsCss: BoundsCss;
|
||||
boundsData: BoundsData;
|
||||
|
||||
// Panel object that the brush is in
|
||||
panel?: Panel;
|
||||
panel: Panel | null;
|
||||
|
||||
// The bounds at the start of a drag/resize (in CSS pixels)
|
||||
changeStartBounds?: Bounds;
|
||||
changeStartBounds: Bounds;
|
||||
};
|
||||
|
||||
type BrushOpts = {
|
||||
@@ -66,9 +66,6 @@ type Brush = {
|
||||
// A callback when the wrapper div or img is resized.
|
||||
onResize: () => void;
|
||||
|
||||
// TODO define this type as both a getter and a setter interfaces.
|
||||
// boundsCss: (boxCss: BoundsCss) => void;
|
||||
// boundsCss: () => BoundsCss;
|
||||
boundsCss: {
|
||||
(boxCss: BoundsCss): void;
|
||||
(): BoundsCss;
|
||||
@@ -82,11 +79,11 @@ type Brush = {
|
||||
|
||||
down: {
|
||||
(): ImageState["down"];
|
||||
(offsetCss): void;
|
||||
(offsetCss: Offset): void;
|
||||
};
|
||||
up: {
|
||||
(): ImageState["up"];
|
||||
(offsetCss): void;
|
||||
(offsetCss: Offset): void;
|
||||
};
|
||||
|
||||
isBrushing: () => ImageState["brushing"];
|
||||
@@ -117,9 +114,9 @@ function createBrush(
|
||||
const resizeExpand = 10;
|
||||
|
||||
const el = $el[0];
|
||||
let $div = null; // The div representing the brush
|
||||
let $div: JQuery<HTMLElement> | null = null; // The div representing the brush
|
||||
|
||||
const state: ImageState = {};
|
||||
const state = {} as ImageState;
|
||||
|
||||
// Aliases for conciseness
|
||||
const cssToImg = coordmap.scaleCssToImg;
|
||||
@@ -225,8 +222,8 @@ function createBrush(
|
||||
const boundsDataVal = boundsData();
|
||||
// Check to see if we have valid boundsData
|
||||
|
||||
for (const val in boundsDataVal) {
|
||||
if (isnan(boundsDataVal[val])) return;
|
||||
for (const val in Object.values(boundsDataVal)) {
|
||||
if (isnan(val)) return;
|
||||
}
|
||||
|
||||
boundsData(boundsDataVal);
|
||||
@@ -234,7 +231,7 @@ function createBrush(
|
||||
}
|
||||
|
||||
// Return true if the offset is inside min/max coords
|
||||
function isInsideBrush(offsetCss) {
|
||||
function isInsideBrush(offsetCss: Offset) {
|
||||
const bounds = state.boundsCss;
|
||||
|
||||
return (
|
||||
@@ -246,14 +243,14 @@ function createBrush(
|
||||
}
|
||||
|
||||
// Return true if offset is inside a region to start a resize
|
||||
function isInResizeArea(offsetCss) {
|
||||
function isInResizeArea(offsetCss: Offset) {
|
||||
const sides = whichResizeSides(offsetCss);
|
||||
|
||||
return sides.left || sides.right || sides.top || sides.bottom;
|
||||
}
|
||||
|
||||
// Return an object representing which resize region(s) the cursor is in.
|
||||
function whichResizeSides(offsetCss) {
|
||||
function whichResizeSides(offsetCss: Offset) {
|
||||
const b = state.boundsCss;
|
||||
// Bounds with expansion
|
||||
const e = {
|
||||
@@ -299,13 +296,14 @@ function createBrush(
|
||||
function boundsCss(boxCss: BoundsCss): void;
|
||||
function boundsCss(boxCss?: BoundsCss) {
|
||||
if (boxCss === undefined) {
|
||||
return $.extend({}, state.boundsCss);
|
||||
return { ...state.boundsCss };
|
||||
}
|
||||
|
||||
let minCss = { x: boxCss.xmin, y: boxCss.ymin };
|
||||
let maxCss = { x: boxCss.xmax, y: boxCss.ymax };
|
||||
let minCss: Offset = { x: boxCss.xmin, y: boxCss.ymin };
|
||||
let maxCss: Offset = { x: boxCss.xmax, y: boxCss.ymax };
|
||||
|
||||
const panel = state.panel;
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const panel = state.panel!;
|
||||
const panelBoundsImg = panel.range;
|
||||
|
||||
if (opts.brushClip) {
|
||||
@@ -332,8 +330,8 @@ function createBrush(
|
||||
};
|
||||
|
||||
// Positions in data space
|
||||
const minData = state.panel.scaleImgToData(cssToImg(minCss));
|
||||
const maxData = state.panel.scaleImgToData(cssToImg(maxCss));
|
||||
const minData = panel.scaleImgToData(cssToImg(minCss));
|
||||
const maxData = panel.scaleImgToData(cssToImg(maxCss));
|
||||
// For reversed scales, the min and max can be reversed, so use findBox
|
||||
// to ensure correct order.
|
||||
|
||||
@@ -342,25 +340,28 @@ function createBrush(
|
||||
// (#1634).
|
||||
state.boundsData = mapValues(state.boundsData, (val) =>
|
||||
roundSignif(val, 14)
|
||||
) as BoundsData;
|
||||
);
|
||||
|
||||
// We also need to attach the data bounds and panel as data attributes, so
|
||||
// that if the image is re-sent, we can grab the data bounds to create a new
|
||||
// brush. This should be fast because it doesn't actually modify the DOM.
|
||||
$div.data("bounds-data", state.boundsData);
|
||||
$div.data("panel", state.panel);
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
$div!.data("bounds-data", state.boundsData);
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
$div!.data("panel", state.panel);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Get or set the bounds of the brush using coordinates in the data space.
|
||||
function boundsData(): ImageState["boundsData"];
|
||||
function boundsData(boxData: Parameters<Panel["scaleDataToImg"]>[0]): void;
|
||||
function boundsData(boxData?: Parameters<Panel["scaleDataToImg"]>[0]) {
|
||||
if (boxData === undefined) {
|
||||
return $.extend({}, state.boundsData);
|
||||
function boundsData(): BoundsData;
|
||||
function boundsData(boxData: BoundsData): void;
|
||||
function boundsData(boxData?: BoundsData | undefined): BoundsData | void {
|
||||
if (typeof boxData === "undefined") {
|
||||
return { ...state.boundsData };
|
||||
}
|
||||
|
||||
let boxCss = imgToCss(state.panel.scaleDataToImg(boxData));
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
let boxCss = imgToCss(state.panel!.scaleDataToImg(boxData));
|
||||
// Round to 13 significant digits to avoid spurious changes in FP values
|
||||
// (#2197).
|
||||
|
||||
@@ -383,6 +384,7 @@ function createBrush(
|
||||
|
||||
// Add a new div representing the brush.
|
||||
function addDiv() {
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
if ($div) $div.remove();
|
||||
|
||||
// Start hidden; we'll show it when movement occurs
|
||||
@@ -415,7 +417,13 @@ function createBrush(
|
||||
}
|
||||
|
||||
$el.append($div);
|
||||
$div.offset({ x: 0, y: 0 }).width(0).outerHeight(0);
|
||||
$div
|
||||
.offset(
|
||||
// @ts-expect-error; This is a jQuery Typing issue
|
||||
{ x: 0, y: 0 }
|
||||
)
|
||||
.width(0)
|
||||
.outerHeight(0);
|
||||
}
|
||||
|
||||
// Update the brush div to reflect the current brush bounds.
|
||||
@@ -425,7 +433,8 @@ function createBrush(
|
||||
const imgOffsetCss = findOrigin($el.find("img"));
|
||||
const b = state.boundsCss;
|
||||
|
||||
$div
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
$div!
|
||||
.offset({
|
||||
top: imgOffsetCss.y + b.ymin,
|
||||
left: imgOffsetCss.x + b.xmin,
|
||||
@@ -434,14 +443,18 @@ function createBrush(
|
||||
.outerHeight(b.ymax - b.ymin + 1);
|
||||
}
|
||||
|
||||
function down(offsetCss?: Offset) {
|
||||
function down(): ImageState["down"];
|
||||
function down(offsetCss: Offset): void;
|
||||
function down(offsetCss?: Offset | undefined) {
|
||||
if (offsetCss === undefined) return state.down;
|
||||
|
||||
state.down = offsetCss;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function up(offsetCss?: Offset) {
|
||||
function up(): ImageState["up"];
|
||||
function up(offsetCss: Offset): void;
|
||||
function up(offsetCss?: Offset | undefined) {
|
||||
if (offsetCss === undefined) return state.up;
|
||||
|
||||
state.up = offsetCss;
|
||||
@@ -463,7 +476,8 @@ function createBrush(
|
||||
|
||||
function brushTo(offsetCss: Offset) {
|
||||
boundsCss(findBox(state.down, offsetCss));
|
||||
$div.show();
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
$div!.show();
|
||||
updateDiv();
|
||||
}
|
||||
|
||||
@@ -479,7 +493,7 @@ function createBrush(
|
||||
|
||||
function startDragging() {
|
||||
state.dragging = true;
|
||||
state.changeStartBounds = $.extend({}, state.boundsCss);
|
||||
state.changeStartBounds = { ...state.boundsCss };
|
||||
}
|
||||
|
||||
function dragTo(offsetCss: Offset) {
|
||||
@@ -498,7 +512,8 @@ function createBrush(
|
||||
|
||||
// Clip to the plotting area
|
||||
if (opts.brushClip) {
|
||||
const panelBoundsImg = state.panel.range;
|
||||
const panel = state.panel as Panel;
|
||||
const panelBoundsImg = panel.range;
|
||||
const newBoundsImg = cssToImg(newBoundsCss);
|
||||
|
||||
// Convert to format for shiftToRange
|
||||
@@ -539,7 +554,7 @@ function createBrush(
|
||||
|
||||
function startResizing() {
|
||||
state.resizing = true;
|
||||
state.changeStartBounds = $.extend({}, state.boundsCss);
|
||||
state.changeStartBounds = { ...state.boundsCss };
|
||||
state.resizeSides = whichResizeSides(state.down);
|
||||
}
|
||||
|
||||
@@ -554,7 +569,8 @@ function createBrush(
|
||||
|
||||
// Calculate what new positions would be, before clipping.
|
||||
const bImg = cssToImg(state.changeStartBounds);
|
||||
const panelBoundsImg = state.panel.range;
|
||||
const panel = state.panel as Panel;
|
||||
const panelBoundsImg = panel.range;
|
||||
|
||||
if (state.resizeSides.left) {
|
||||
const xminImg = shiftToRange(
|
||||
|
||||
@@ -14,8 +14,8 @@ function createClickInfo(
|
||||
mousedown: (e: JQuery.MouseDownEvent) => void;
|
||||
dblclickIE8: (e: JQuery.DoubleClickEvent) => void;
|
||||
} {
|
||||
let clickTimer: ReturnType<typeof setTimeout> = null;
|
||||
let pendingE: JQuery.MouseDownEvent = null; // A pending mousedown2 event
|
||||
let clickTimer: number | undefined = undefined;
|
||||
let pendingE: JQuery.MouseDownEvent | null = null; // A pending mousedown2 event
|
||||
|
||||
// Create a new event of type eventType (like 'mousedown2'), and trigger
|
||||
// it with the information stored in this.e.
|
||||
@@ -49,7 +49,7 @@ function createClickInfo(
|
||||
function scheduleMousedown2(e: JQuery.MouseDownEvent) {
|
||||
pendingE = e;
|
||||
|
||||
clickTimer = setTimeout(function () {
|
||||
clickTimer = window.setTimeout(function () {
|
||||
triggerPendingMousedown2();
|
||||
}, dblclickDelay);
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ type CreateHandler = {
|
||||
mouseout?: (e: JQuery.MouseOutEvent) => void;
|
||||
mousedown?: (e: JQuery.MouseDownEvent) => void;
|
||||
onResetImg: () => void;
|
||||
onResize?: () => void;
|
||||
onResize: ((e: JQuery.ResizeEvent) => void) | null;
|
||||
};
|
||||
|
||||
type BrushInfo = {
|
||||
@@ -153,7 +153,17 @@ function createBrushHandler(
|
||||
// el instead of the brush div, because the brush div has
|
||||
// 'pointer-events:none' so that it won't intercept pointer events.
|
||||
// If `style` is null, don't add a cursor style.
|
||||
function setCursorStyle(style) {
|
||||
function setCursorStyle(
|
||||
style:
|
||||
| "crosshair"
|
||||
| "ew-resize"
|
||||
| "grabbable"
|
||||
| "grabbing"
|
||||
| "nesw-resize"
|
||||
| "ns-resize"
|
||||
| "nwse-resize"
|
||||
| null
|
||||
) {
|
||||
$el.removeClass(
|
||||
"crosshair grabbable grabbing ns-resize ew-resize nesw-resize nwse-resize"
|
||||
);
|
||||
@@ -177,7 +187,8 @@ function createBrushHandler(
|
||||
return;
|
||||
}
|
||||
|
||||
const panel = brush.getPanel();
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const panel = brush.getPanel()!;
|
||||
|
||||
// Add the panel (facet) variables, if present
|
||||
$.extend(coords, panel.panel_vars);
|
||||
@@ -212,7 +223,9 @@ function createBrushHandler(
|
||||
.trigger("shiny-internal:brushed", coords);
|
||||
}
|
||||
|
||||
let brushInfoSender;
|
||||
let brushInfoSender:
|
||||
| Debouncer<typeof sendBrushInfo>
|
||||
| Throttler<typeof sendBrushInfo>;
|
||||
|
||||
if (opts.brushDelayType === "throttle") {
|
||||
brushInfoSender = new Throttler(null, sendBrushInfo, opts.brushDelay);
|
||||
|
||||
@@ -3,7 +3,7 @@ import { shinySetInputValue } from "../shiny/initedMethods";
|
||||
import { mapValues } from "../utils";
|
||||
import type { Offset } from "./findbox";
|
||||
import type { Bounds } from "./createBrush";
|
||||
import type { Panel } from "./initPanelScales";
|
||||
import type { Panel, PanelInit } from "./initPanelScales";
|
||||
import { initPanelScales } from "./initPanelScales";
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
@@ -16,13 +16,16 @@ function findScalingRatio($el: JQuery<HTMLElement>) {
|
||||
const boundingRect = $el[0].getBoundingClientRect();
|
||||
|
||||
return {
|
||||
x: boundingRect.width / $el.outerWidth(),
|
||||
y: boundingRect.height / $el.outerHeight(),
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
x: boundingRect.width / $el.outerWidth()!,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
y: boundingRect.height / $el.outerHeight()!,
|
||||
};
|
||||
}
|
||||
|
||||
function findOrigin($el: JQuery<HTMLElement>): Offset {
|
||||
const offset = $el.offset();
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const offset = $el.offset()!;
|
||||
const scalingRatio = findScalingRatio($el);
|
||||
|
||||
// Find the size of the padding and border, for the top and left. This is
|
||||
@@ -50,8 +53,10 @@ function findDims($el: JQuery<HTMLElement>) {
|
||||
// If there's any padding/border, we need to find the ratio of the actual
|
||||
// element content compared to the element plus padding and border.
|
||||
const contentRatio = {
|
||||
x: $el.width() / $el.outerWidth(),
|
||||
y: $el.height() / $el.outerHeight(),
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
x: $el.width()! / $el.outerWidth()!,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
y: $el.height()! / $el.outerHeight()!,
|
||||
};
|
||||
|
||||
// Get the dimensions of the element _after_ any CSS transforms. This
|
||||
@@ -85,11 +90,13 @@ type Coords = {
|
||||
};
|
||||
|
||||
type CoordmapInit = {
|
||||
panels: Panel[];
|
||||
dims: {
|
||||
height: number;
|
||||
width: number;
|
||||
};
|
||||
panels: PanelInit[];
|
||||
dims:
|
||||
| {
|
||||
height: number;
|
||||
width: number;
|
||||
}
|
||||
| { height: null; width: null };
|
||||
};
|
||||
type Coordmap = {
|
||||
panels: Panel[];
|
||||
@@ -107,18 +114,19 @@ type Coordmap = {
|
||||
(offsetImg: Bounds): Bounds;
|
||||
(offsetImg: Offset): Offset;
|
||||
(offsetImg: OffsetImg): OffsetCss;
|
||||
(offsetImg: { [key: string]: number }): { [key: string]: number | null };
|
||||
};
|
||||
imgToCssScalingRatio: () => Offset;
|
||||
cssToImgScalingRatio: () => Offset;
|
||||
|
||||
getPanelCss: (offsetCss: OffsetCss, expand?: number) => Panel;
|
||||
getPanelCss: (offsetCss: OffsetCss, expand?: number) => Panel | null;
|
||||
isInPanelCss: (offsetCss: OffsetCss, expand?: number) => boolean;
|
||||
|
||||
mouseCoordinateSender: (
|
||||
inputId: string,
|
||||
clip?: boolean,
|
||||
nullOutside?: boolean
|
||||
) => (e: JQuery.MouseDownEvent | JQuery.MouseMoveEvent) => void;
|
||||
) => (e: JQuery.MouseDownEvent | JQuery.MouseMoveEvent | null) => void;
|
||||
};
|
||||
|
||||
// This adds functions to the coordmap object to handle various
|
||||
@@ -144,14 +152,13 @@ function initCoordmap(
|
||||
$el: JQuery<HTMLElement>,
|
||||
coordmap_: CoordmapInit
|
||||
): Coordmap {
|
||||
const coordmap = coordmap_ as Coordmap;
|
||||
const $img = $el.find("img");
|
||||
const img = $img[0];
|
||||
|
||||
// If we didn't get any panels, create a dummy one where the domain and range
|
||||
// are simply the pixel dimensions.
|
||||
// that we modify.
|
||||
if (coordmap.panels.length === 0) {
|
||||
if (coordmap_.panels.length === 0) {
|
||||
const bounds = {
|
||||
top: 0,
|
||||
left: 0,
|
||||
@@ -159,20 +166,23 @@ function initCoordmap(
|
||||
bottom: img.clientHeight - 1,
|
||||
};
|
||||
|
||||
coordmap.panels[0] = {
|
||||
coordmap_.panels[0] = {
|
||||
domain: bounds,
|
||||
range: bounds,
|
||||
mapping: {},
|
||||
};
|
||||
}
|
||||
|
||||
const coordmap = coordmap_ as Coordmap;
|
||||
// If no dim height and width values are found, set them to the raw image height and width
|
||||
// These values should be the same...
|
||||
// This is only done to initialize an image output, whose height and width are unknown until the image is retrieved
|
||||
|
||||
coordmap.dims.height = coordmap.dims.height || img.naturalHeight;
|
||||
coordmap.dims.width = coordmap.dims.width || img.naturalWidth;
|
||||
|
||||
// Add scaling functions to each panel
|
||||
initPanelScales(coordmap.panels);
|
||||
coordmap.panels = initPanelScales(coordmap_.panels);
|
||||
|
||||
// This returns the offset of the mouse in CSS pixels relative to the img,
|
||||
// but not including the padding or border, if present.
|
||||
@@ -195,7 +205,7 @@ function initCoordmap(
|
||||
function scaleCssToImg(offsetCss: Bounds): Bounds;
|
||||
function scaleCssToImg(offsetCss: Offset): Offset;
|
||||
function scaleCssToImg(offsetCss: OffsetCss): OffsetImg;
|
||||
function scaleCssToImg(offsetCss) {
|
||||
function scaleCssToImg(offsetCss: OffsetCss) {
|
||||
const pixelScaling = coordmap.imgToCssScalingRatio();
|
||||
|
||||
const result = mapValues(offsetCss, (value, key) => {
|
||||
@@ -221,7 +231,7 @@ function initCoordmap(
|
||||
function scaleImgToCss(offsetImg: Offset): Offset;
|
||||
function scaleImgToCss(offsetImg: OffsetImg): OffsetCss;
|
||||
function scaleImgToCss(offsetImg: { [key: string]: number }): {
|
||||
[key: string]: number;
|
||||
[key: string]: number | null;
|
||||
} {
|
||||
const pixelScaling = coordmap.imgToCssScalingRatio();
|
||||
|
||||
@@ -368,14 +378,15 @@ function initCoordmap(
|
||||
shinySetInputValue(inputId, coords, { priority: "event" });
|
||||
return;
|
||||
}
|
||||
const panel = coordmap.getPanelCss(coordsCss);
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const panel = coordmap.getPanelCss(coordsCss)!;
|
||||
|
||||
const coordsImg = coordmap.scaleCssToImg(coordsCss);
|
||||
const coordsData = panel.scaleImgToData(coordsImg);
|
||||
|
||||
const coords: Coords = {
|
||||
x: coordsData.x,
|
||||
y: coordsData.y,
|
||||
x: coordsData?.x,
|
||||
y: coordsData?.y,
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
coords_css: coordsCss,
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import type { Offset } from "./findbox";
|
||||
import { mapValues } from "../utils";
|
||||
import type { Bounds } from "./createBrush";
|
||||
|
||||
// range.
|
||||
function mapLinear(
|
||||
@@ -35,10 +36,10 @@ function scaler1D(
|
||||
domainMax: number,
|
||||
rangeMin: number,
|
||||
rangeMax: number,
|
||||
logbase: number
|
||||
logbase: number | null
|
||||
) {
|
||||
return {
|
||||
scale: function (val: number, clip: boolean) {
|
||||
scale: function (val: number, clip?: boolean) {
|
||||
if (logbase) val = Math.log(val) / Math.log(logbase);
|
||||
return mapLinear(val, domainMin, domainMax, rangeMin, rangeMax, clip);
|
||||
},
|
||||
@@ -52,7 +53,7 @@ function scaler1D(
|
||||
};
|
||||
}
|
||||
|
||||
type Panel = {
|
||||
type PanelInit = {
|
||||
domain: {
|
||||
top: number;
|
||||
bottom: number;
|
||||
@@ -72,22 +73,22 @@ type Panel = {
|
||||
mapping: { [key: string]: string };
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
panel_vars?: { [key: string]: number | string };
|
||||
|
||||
scaleDataToImg?: (
|
||||
val: { [key: string]: number },
|
||||
clip?: boolean
|
||||
) => { [key: string]: number };
|
||||
scaleImgToData?: {
|
||||
};
|
||||
type Panel = PanelInit & {
|
||||
scaleDataToImg: {
|
||||
(val: Bounds, clip?: boolean): Bounds;
|
||||
};
|
||||
scaleImgToData: {
|
||||
(val: Offset, clip?: boolean): Offset;
|
||||
(val: { [key: string]: number }, clip?: boolean): { [key: string]: number };
|
||||
};
|
||||
|
||||
clipImg?: (offsetImg: { x: number; y: number }) => { x: number; y: number };
|
||||
clipImg: (offsetImg: { x: number; y: number }) => { x: number; y: number };
|
||||
};
|
||||
|
||||
// Modify panel, adding scale and inverse-scale functions that take objects
|
||||
// like {x:1, y:3}, and also add clip function.
|
||||
function addScaleFuns(panel: Panel) {
|
||||
function addScaleFuns(panel_: PanelInit): Panel {
|
||||
const panel = panel_ as Panel;
|
||||
const d = panel.domain;
|
||||
const r = panel.range;
|
||||
const xlog = panel.log && panel.log.x ? panel.log.x : null;
|
||||
@@ -98,7 +99,16 @@ function addScaleFuns(panel: Panel) {
|
||||
// Given an object of form {x:1, y:2}, or {x:1, xmin:2:, ymax: 3}, convert
|
||||
// from data coordinates to img. Whether a value is converted as x or y
|
||||
// depends on the first character of the key.
|
||||
panel.scaleDataToImg = function (val, clip) {
|
||||
// (val: Offset, clip?: boolean): Offset;
|
||||
// (val: Bounds, clip?: boolean): Bounds;
|
||||
// (val: { [key: `${"x" | "y"}${string}`]: number }, clip?: boolean): { [key: `${"x" | "y"}${string}`]: number }
|
||||
// (val: { [key: string]: number | null }, clip?: boolean): {
|
||||
// [key: string]: number | null;
|
||||
// };
|
||||
function scaleDataToImg(
|
||||
val: Bounds,
|
||||
clip?: Parameters<typeof xscaler.scale>[1]
|
||||
): Bounds {
|
||||
return mapValues(val, (value, key) => {
|
||||
const prefix = key.substring(0, 1);
|
||||
|
||||
@@ -107,12 +117,13 @@ function addScaleFuns(panel: Panel) {
|
||||
} else if (prefix === "y") {
|
||||
return yscaler.scale(value, clip);
|
||||
}
|
||||
// TODO-future; If we know the input is a valid input (starts with x/y), why do we still have this value?
|
||||
return null;
|
||||
});
|
||||
};
|
||||
}) as Bounds;
|
||||
}
|
||||
panel.scaleDataToImg = scaleDataToImg;
|
||||
|
||||
function scaleImgToData(val: Offset, clip?: boolean);
|
||||
function scaleImgToData(val: { [key: string]: number }, clip?: boolean) {
|
||||
function scaleImgToData(val: Offset, clip?: boolean): Offset {
|
||||
return mapValues(val, (value, key) => {
|
||||
const prefix = key.substring(0, 1);
|
||||
|
||||
@@ -121,8 +132,9 @@ function addScaleFuns(panel: Panel) {
|
||||
} else if (prefix === "y") {
|
||||
return yscaler.scaleInv(value, clip);
|
||||
}
|
||||
// TODO-future; If we know the input is a valid input (starts with x/y), why do we still have this value?
|
||||
return null;
|
||||
});
|
||||
}) as Offset;
|
||||
}
|
||||
panel.scaleImgToData = scaleImgToData;
|
||||
|
||||
@@ -143,20 +155,18 @@ function addScaleFuns(panel: Panel) {
|
||||
|
||||
return newOffset;
|
||||
};
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
// Modifies the panel objects in a coordmap, adding scaleImgToData(),
|
||||
// scaleDataToImg(), and clipImg() functions to each one. The panel objects
|
||||
// use img and data coordinates only; they do not use css coordinates. The
|
||||
// domain is in data coordinates; the range is in img coordinates.
|
||||
function initPanelScales(panels: Panel[]): void {
|
||||
function initPanelScales(panels: PanelInit[]): Panel[] {
|
||||
// Add the functions to each panel object.
|
||||
for (let i = 0; i < panels.length; i++) {
|
||||
const panel = panels[i];
|
||||
|
||||
addScaleFuns(panel);
|
||||
}
|
||||
return panels.map((panel) => addScaleFuns(panel));
|
||||
}
|
||||
|
||||
export type { Panel };
|
||||
export type { Panel, PanelInit };
|
||||
export { initPanelScales };
|
||||
|
||||
@@ -4,8 +4,6 @@ import { determineBrowserInfo } from "./browser";
|
||||
|
||||
import { windowShiny } from "../window/libraries";
|
||||
import { setShiny } from "../shiny";
|
||||
import { setBlobBuilder } from "../utils/blob";
|
||||
import { windowBlobBuilder } from "../window/blobBuilder";
|
||||
import { setUserAgent } from "../utils/userAgent";
|
||||
import { windowUserAgent } from "../window/userAgent";
|
||||
|
||||
@@ -20,8 +18,6 @@ function init(): void {
|
||||
|
||||
disableFormSubmission();
|
||||
|
||||
setBlobBuilder(windowBlobBuilder());
|
||||
|
||||
initReactlog();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { EventPriority } from "./inputPolicy";
|
||||
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
|
||||
import { hasOwnProperty } from "../utils";
|
||||
import { hasDefinedProperty } from "../utils";
|
||||
|
||||
class InputDeferDecorator implements InputPolicy {
|
||||
pendingInput: {
|
||||
@@ -18,7 +18,7 @@ class InputDeferDecorator implements InputPolicy {
|
||||
}
|
||||
submit(): void {
|
||||
for (const nameType in this.pendingInput) {
|
||||
if (hasOwnProperty(this.pendingInput, nameType)) {
|
||||
if (hasDefinedProperty(this.pendingInput, nameType)) {
|
||||
const { value, opts } = this.pendingInput[nameType];
|
||||
|
||||
this.target.setInput(nameType, value, opts);
|
||||
|
||||
@@ -11,7 +11,7 @@ class InputEventDecorator implements InputPolicy {
|
||||
}
|
||||
|
||||
setInput(nameType: string, value: unknown, opts: InputPolicyOpts): void {
|
||||
const evt = jQuery.Event("shiny:inputchanged") as ShinyEventInputChanged;
|
||||
const evt = $.Event("shiny:inputchanged") as ShinyEventInputChanged;
|
||||
|
||||
const input = splitInputNameType(nameType);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { InputPolicy, InputPolicyOpts } from "./inputPolicy";
|
||||
import { hasOwnProperty } from "../utils";
|
||||
import { hasDefinedProperty } from "../utils";
|
||||
import { splitInputNameType } from "./splitInputNameType";
|
||||
|
||||
type LastSentValues = { [key: string]: { [key: string]: string } };
|
||||
@@ -40,7 +40,7 @@ class InputNoResendDecorator implements InputPolicy {
|
||||
} = {};
|
||||
|
||||
for (const inputName in values) {
|
||||
if (hasOwnProperty(values, inputName)) {
|
||||
if (hasDefinedProperty(values, inputName)) {
|
||||
const { name, inputType } = splitInputNameType(inputName);
|
||||
|
||||
cacheValues[name] = {
|
||||
|
||||