Compare commits
30 Commits
async-load
...
config-cle
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
281dffde10 | ||
|
|
0f714cff34 | ||
|
|
98f17e0cd2 | ||
|
|
9b2c04f298 | ||
|
|
ed4a97154d | ||
|
|
9dcd62f944 | ||
|
|
213c645524 | ||
|
|
f1c0ac2b30 | ||
|
|
16c6d55f60 | ||
|
|
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.9000
|
||||
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)
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
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,2 +1,2 @@
|
||||
/*! shiny 1.7.1.9003 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
/*! shiny 1.7.2.9000 | (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}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
/*! shiny 1.7.1.9003 | (c) 2012-2022 RStudio, PBC. | License: GPL-3 | file LICENSE */
|
||||
/*! shiny 1.7.2.9000 | (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)});})();
|
||||
//# sourceMappingURL=shiny-testmode.js.map
|
||||
|
||||
2
inst/www/shared/shiny.min.css
vendored
4
inst/www/shared/shiny.min.js
vendored
@@ -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}{
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
34
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.9000",
|
||||
"license": "GPL-3.0-only",
|
||||
"main": "",
|
||||
"browser": "",
|
||||
@@ -32,33 +32,33 @@
|
||||
"@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",
|
||||
"ion-rangeslider": "2.3.1",
|
||||
"jest": "^26.6.3",
|
||||
"jquery": "3.6.0",
|
||||
@@ -67,15 +67,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;
|
||||
@@ -69,13 +79,14 @@ async function build(
|
||||
return esbuildBuild({
|
||||
incremental: incremental,
|
||||
watch: watch,
|
||||
target: "es5",
|
||||
target: "es2020",
|
||||
format: "iife",
|
||||
preserveSymlinks: true,
|
||||
...opts,
|
||||
}).then((x) => {
|
||||
onRebuild();
|
||||
onRebuild(null);
|
||||
return x;
|
||||
});
|
||||
}
|
||||
|
||||
export { outDir, build, shinyDesc, banner };
|
||||
export { outDir, build, shinyDesc, banner, babelPlugin };
|
||||
|
||||
@@ -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,9 +3,8 @@
|
||||
// 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";
|
||||
|
||||
const opts: BuildOptions = {
|
||||
|
||||
@@ -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();
|
||||
})
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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] = {
|
||||
|
||||
@@ -2,7 +2,7 @@ import type { AnyVoidFunction } from "../utils/extraTypes";
|
||||
import type { InputPolicy } from "./inputPolicy";
|
||||
|
||||
interface InputRatePolicy<X extends AnyVoidFunction> {
|
||||
target: InputPolicy;
|
||||
target: InputPolicy | null;
|
||||
func: X;
|
||||
|
||||
normalCall(...args: Parameters<X>): void;
|
||||
|
||||
@@ -9,12 +9,19 @@ import type {
|
||||
import { shinyAppBindOutput, shinyAppUnbindOutput } from "./initedMethods";
|
||||
import { sendImageSizeFns } from "./sendImageSize";
|
||||
|
||||
const boundInputs = {};
|
||||
const boundInputs: {
|
||||
[key: string]: { binding: InputBinding; node: HTMLElement };
|
||||
} = {};
|
||||
|
||||
type BindScope = HTMLElement | JQuery<HTMLElement>;
|
||||
|
||||
// todo make sure allowDeferred can NOT be supplied and still work
|
||||
function valueChangeCallback(inputs, binding, el, allowDeferred) {
|
||||
function valueChangeCallback(
|
||||
inputs: InputValidateDecorator,
|
||||
binding: InputBinding,
|
||||
el: HTMLElement,
|
||||
allowDeferred: boolean
|
||||
) {
|
||||
let id = binding.getId(el);
|
||||
|
||||
if (id) {
|
||||
@@ -23,7 +30,11 @@ function valueChangeCallback(inputs, binding, el, allowDeferred) {
|
||||
|
||||
if (type) id = id + ":" + type;
|
||||
|
||||
const opts = {
|
||||
const opts: {
|
||||
priority: "deferred" | "immediate";
|
||||
binding: typeof binding;
|
||||
el: typeof el;
|
||||
} = {
|
||||
priority: allowDeferred ? "deferred" : "immediate",
|
||||
binding: binding,
|
||||
el: el,
|
||||
@@ -54,7 +65,16 @@ function bindInputs(
|
||||
const { inputs, inputsRate, inputBindings } = shinyCtx;
|
||||
const bindings = inputBindings.getBindings();
|
||||
|
||||
const inputItems = {};
|
||||
const inputItems: {
|
||||
[key: string]: {
|
||||
value: any;
|
||||
opts: {
|
||||
immediate: true;
|
||||
binding: InputBinding;
|
||||
el: HTMLElement;
|
||||
};
|
||||
};
|
||||
} = {};
|
||||
|
||||
for (let i = 0; i < bindings.length; i++) {
|
||||
const binding = bindings[i].binding;
|
||||
@@ -84,7 +104,7 @@ function bindInputs(
|
||||
const thisBinding = binding;
|
||||
const thisEl = el;
|
||||
|
||||
return function (allowDeferred) {
|
||||
return function (allowDeferred: boolean) {
|
||||
valueChangeCallback(inputs, thisBinding, thisEl, allowDeferred);
|
||||
};
|
||||
})();
|
||||
|
||||
@@ -14,7 +14,7 @@ import { debounce, Debouncer } from "../time";
|
||||
import {
|
||||
getComputedLinkColor,
|
||||
getStyle,
|
||||
hasOwnProperty,
|
||||
hasDefinedProperty,
|
||||
mapValues,
|
||||
pixelRatio,
|
||||
} from "../utils";
|
||||
@@ -164,13 +164,17 @@ function initShiny(windowShiny: Shiny): void {
|
||||
}
|
||||
);
|
||||
|
||||
function getComputedBgColor(el) {
|
||||
function getComputedBgColor(
|
||||
el: HTMLElement | null
|
||||
): string | null | undefined {
|
||||
if (!el) {
|
||||
// Top of document, can't recurse further
|
||||
return null;
|
||||
}
|
||||
|
||||
const bgColor = getStyle(el, "background-color");
|
||||
|
||||
if (!bgColor) return bgColor;
|
||||
const m = bgColor.match(
|
||||
/^rgba\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/
|
||||
);
|
||||
@@ -190,12 +194,12 @@ function initShiny(windowShiny: Shiny): void {
|
||||
return bgColor;
|
||||
}
|
||||
|
||||
function getComputedFont(el) {
|
||||
function getComputedFont(el: HTMLElement) {
|
||||
const fontFamily = getStyle(el, "font-family");
|
||||
const fontSize = getStyle(el, "font-size");
|
||||
|
||||
return {
|
||||
families: fontFamily.replace(/"/g, "").split(", "),
|
||||
families: fontFamily?.replace(/"/g, "").split(", "),
|
||||
size: fontSize,
|
||||
};
|
||||
}
|
||||
@@ -252,7 +256,7 @@ function initShiny(windowShiny: Shiny): void {
|
||||
$el.data("shiny-theme-observer", observer);
|
||||
}
|
||||
|
||||
function doSendTheme(el) {
|
||||
function doSendTheme(el: HTMLElement): void {
|
||||
// Sending theme info on error isn't necessary (it'd add an unnecessary additional round-trip)
|
||||
if (el.classList.contains("shiny-output-error")) {
|
||||
return;
|
||||
@@ -310,7 +314,7 @@ function initShiny(windowShiny: Shiny): void {
|
||||
|
||||
// Return true if the object or one of its ancestors in the DOM tree has
|
||||
// style='display:none'; otherwise return false.
|
||||
function isHidden(obj) {
|
||||
function isHidden(obj: HTMLElement | null): boolean {
|
||||
// null means we've hit the top of the tree. If width or height is
|
||||
// non-zero, then we know that no ancestor has display:none.
|
||||
if (obj === null || obj.offsetWidth !== 0 || obj.offsetHeight !== 0) {
|
||||
@@ -318,10 +322,10 @@ function initShiny(windowShiny: Shiny): void {
|
||||
} else if (getStyle(obj, "display") === "none") {
|
||||
return true;
|
||||
} else {
|
||||
return isHidden(obj.parentNode);
|
||||
return isHidden(obj.parentNode as HTMLElement | null);
|
||||
}
|
||||
}
|
||||
let lastKnownVisibleOutputs = {};
|
||||
let lastKnownVisibleOutputs: { [key: string]: boolean } = {};
|
||||
// Set initial state of outputs to hidden, if needed
|
||||
|
||||
$(".shiny-bound-output").each(function () {
|
||||
@@ -336,7 +340,7 @@ function initShiny(windowShiny: Shiny): void {
|
||||
});
|
||||
// Send update when hidden state changes
|
||||
function doSendOutputHiddenState() {
|
||||
const visibleOutputs = {};
|
||||
const visibleOutputs: { [key: string]: boolean } = {};
|
||||
|
||||
$(".shiny-bound-output").each(function () {
|
||||
const id = getIdFromEl(this);
|
||||
@@ -364,7 +368,7 @@ function initShiny(windowShiny: Shiny): void {
|
||||
});
|
||||
// Anything left in lastKnownVisibleOutputs is orphaned
|
||||
for (const name in lastKnownVisibleOutputs) {
|
||||
if (hasOwnProperty(lastKnownVisibleOutputs, name))
|
||||
if (hasDefinedProperty(lastKnownVisibleOutputs, name))
|
||||
inputs.setInput(".clientdata_output_" + name + "_hidden", true);
|
||||
}
|
||||
// Update the visible outputs for next time
|
||||
@@ -394,18 +398,22 @@ function initShiny(windowShiny: Shiny): void {
|
||||
// the handler only when e's namespace matches. For example, if the
|
||||
// namespace is "bs", it would match when e.namespace is "bs" or "bs.tab".
|
||||
// If the namespace is "bs.tab", it would match for "bs.tab", but not "bs".
|
||||
function filterEventsByNamespace(namespace, handler, ...args) {
|
||||
namespace = namespace.split(".");
|
||||
function filterEventsByNamespace(
|
||||
namespace: string,
|
||||
handler: (...handlerArgs: any[]) => void,
|
||||
...args: any[]
|
||||
) {
|
||||
const namespaceArr = namespace.split(".");
|
||||
|
||||
return function (e) {
|
||||
const eventNamespace = e.namespace.split(".");
|
||||
return function (this: HTMLElement, e: JQuery.TriggeredEvent) {
|
||||
const eventNamespace = e.namespace?.split(".") ?? [];
|
||||
|
||||
// If any of the namespace strings aren't present in this event, quit.
|
||||
for (let i = 0; i < namespace.length; i++) {
|
||||
if (eventNamespace.indexOf(namespace[i]) === -1) return;
|
||||
for (let i = 0; i < namespaceArr.length; i++) {
|
||||
if (eventNamespace.indexOf(namespaceArr[i]) === -1) return;
|
||||
}
|
||||
|
||||
handler.apply(this, [namespace, handler, ...args]);
|
||||
handler.apply(this, [namespaceArr, handler, ...args]);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -553,6 +561,7 @@ function initDeferredIframes(): void {
|
||||
const $el = $(el);
|
||||
|
||||
$el.removeClass("shiny-frame-deferred");
|
||||
// @ts-expect-error; If it is undefined, set using the undefined value
|
||||
$el.attr("src", $el.attr("data-deferred-src"));
|
||||
$el.attr("data-deferred-src", null);
|
||||
});
|
||||
|
||||
@@ -5,10 +5,33 @@ import type { EventPriority } from "../inputPolicies";
|
||||
import type { BindScope } from "./bind";
|
||||
import type { Handler, ShinyApp } from "./shinyapp";
|
||||
|
||||
let fullShinyObj: Shiny = null;
|
||||
let fullShinyObj: FullShinyDef;
|
||||
|
||||
// TODO-future; It would be nice to have a way to export this type value instead of / in addition to `Shiny`
|
||||
type FullShinyDef = Required<
|
||||
Pick<
|
||||
Shiny,
|
||||
| "bindAll"
|
||||
| "forgetLastInputValue"
|
||||
| "initializeInputs"
|
||||
| "oncustommessage"
|
||||
| "setInputValue"
|
||||
| "shinyapp"
|
||||
| "unbindAll"
|
||||
| "user"
|
||||
>
|
||||
> &
|
||||
Shiny;
|
||||
|
||||
function setShinyObj(shiny: Shiny): void {
|
||||
fullShinyObj = shiny;
|
||||
fullShinyObj = shiny as FullShinyDef;
|
||||
}
|
||||
|
||||
function validateShinyHasBeenSet(): FullShinyDef {
|
||||
if (typeof fullShinyObj === "undefined") {
|
||||
throw "Shiny has not finish initialization yet. Please wait for the 'shiny-initialized' event.";
|
||||
}
|
||||
return fullShinyObj;
|
||||
}
|
||||
|
||||
//// 2021/03: TypeScript Conversion note
|
||||
@@ -21,40 +44,40 @@ function shinySetInputValue(
|
||||
value: unknown,
|
||||
opts?: { priority?: EventPriority }
|
||||
): void {
|
||||
fullShinyObj.setInputValue(name, value, opts);
|
||||
validateShinyHasBeenSet().setInputValue(name, value, opts);
|
||||
}
|
||||
function shinyShinyApp(): ShinyApp {
|
||||
return fullShinyObj.shinyapp;
|
||||
return validateShinyHasBeenSet().shinyapp;
|
||||
}
|
||||
function setShinyUser(user: string): void {
|
||||
fullShinyObj.user = user;
|
||||
validateShinyHasBeenSet().user = user;
|
||||
}
|
||||
function shinyForgetLastInputValue(name: string): void {
|
||||
fullShinyObj.forgetLastInputValue(name);
|
||||
validateShinyHasBeenSet().forgetLastInputValue(name);
|
||||
}
|
||||
function shinyBindAll(scope: BindScope): void {
|
||||
fullShinyObj.bindAll(scope);
|
||||
validateShinyHasBeenSet().bindAll(scope);
|
||||
}
|
||||
function shinyUnbindAll(scope: BindScope, includeSelf = false): void {
|
||||
fullShinyObj.unbindAll(scope, includeSelf);
|
||||
validateShinyHasBeenSet().unbindAll(scope, includeSelf);
|
||||
}
|
||||
function shinyInitializeInputs(scope: BindScope): void {
|
||||
fullShinyObj.initializeInputs(scope);
|
||||
validateShinyHasBeenSet().initializeInputs(scope);
|
||||
}
|
||||
|
||||
function shinyAppBindOutput(id: string, binding: OutputBindingAdapter): void {
|
||||
fullShinyObj.shinyapp.bindOutput(id, binding);
|
||||
shinyShinyApp().bindOutput(id, binding);
|
||||
}
|
||||
|
||||
function shinyAppUnbindOutput(
|
||||
id: string,
|
||||
binding: OutputBindingAdapter
|
||||
): boolean {
|
||||
return fullShinyObj.shinyapp.unbindOutput(id, binding);
|
||||
return shinyShinyApp().unbindOutput(id, binding);
|
||||
}
|
||||
|
||||
function getShinyOnCustomMessage(): Handler | null {
|
||||
return fullShinyObj.oncustommessage;
|
||||
return validateShinyHasBeenSet().oncustommessage;
|
||||
}
|
||||
|
||||
let fileInputBinding: FileInputBinding;
|
||||
@@ -67,7 +90,7 @@ function setFileInputBinding(fileInputBinding_: FileInputBinding): void {
|
||||
}
|
||||
|
||||
function getShinyCreateWebsocket(): (() => WebSocket) | void {
|
||||
return fullShinyObj.createSocket;
|
||||
return validateShinyHasBeenSet().createSocket;
|
||||
}
|
||||
|
||||
export {
|
||||
|
||||
@@ -2,6 +2,7 @@ import $ from "jquery";
|
||||
|
||||
import { $escape, randomId } from "../utils";
|
||||
import { shinyUnbindAll } from "./initedMethods";
|
||||
import type { HtmlDep } from "./render";
|
||||
import { renderContent } from "./render";
|
||||
|
||||
// Milliseconds to fade in or out
|
||||
@@ -15,6 +16,14 @@ function show({
|
||||
id = null,
|
||||
closeButton = true,
|
||||
type = null,
|
||||
}: {
|
||||
html?: string;
|
||||
action?: string;
|
||||
deps?: HtmlDep[];
|
||||
duration?: number | null;
|
||||
id?: string | null;
|
||||
closeButton?: boolean;
|
||||
type?: string | null;
|
||||
} = {}): ReturnType<typeof randomId> {
|
||||
if (!id) id = randomId();
|
||||
|
||||
@@ -22,9 +31,10 @@ function show({
|
||||
createPanel();
|
||||
|
||||
// Get existing DOM element for this ID, or create if needed.
|
||||
let $notification = get(id);
|
||||
let $notificationInit = get(id);
|
||||
|
||||
if ($notification.length === 0) $notification = create(id);
|
||||
if ($notificationInit?.length === 0) $notificationInit = create(id);
|
||||
const $notification = $notificationInit as JQuery<HTMLElement>;
|
||||
|
||||
// Render html and dependencies
|
||||
const newHtml =
|
||||
@@ -36,13 +46,16 @@ function show({
|
||||
|
||||
// Remove any existing classes of the form 'shiny-notification-xxxx'.
|
||||
// The xxxx would be strings like 'warning'.
|
||||
const classes = $notification
|
||||
.attr("class")
|
||||
.split(/\s+/)
|
||||
.filter((cls) => cls.match(/^shiny-notification-/))
|
||||
.join(" ");
|
||||
const classes = $notification?.attr("class");
|
||||
|
||||
$notification.removeClass(classes);
|
||||
if (classes) {
|
||||
const classVal = classes
|
||||
.split(/\s+/)
|
||||
.filter((cls: string) => cls.match(/^shiny-notification-/))
|
||||
.join(" ");
|
||||
|
||||
$notification.removeClass(classVal);
|
||||
}
|
||||
|
||||
// Add class. 'default' means no additional CSS class.
|
||||
if (type && type !== "default")
|
||||
@@ -67,9 +80,8 @@ function show({
|
||||
return id;
|
||||
}
|
||||
|
||||
// TODO-barret - Should `id` be required? (some places do not supply one)
|
||||
function remove(id?: string): void {
|
||||
get(id).fadeOut(fadeDuration, function () {
|
||||
function remove(id: string): void {
|
||||
get(id)?.fadeOut(fadeDuration, function () {
|
||||
shinyUnbindAll(this);
|
||||
$(this).remove();
|
||||
|
||||
@@ -81,7 +93,7 @@ function remove(id?: string): void {
|
||||
}
|
||||
|
||||
// Returns an individual notification DOM object (wrapped in jQuery).
|
||||
function get(id?: string) {
|
||||
function get(id: string | null | undefined) {
|
||||
if (!id) return null;
|
||||
return getPanel().find("#shiny-notification-" + $escape(id));
|
||||
}
|
||||
@@ -115,10 +127,10 @@ function createPanel() {
|
||||
|
||||
// Create a notification DOM element and return the jQuery object. If the
|
||||
// DOM element already exists for the ID, just return it without creating.
|
||||
function create(id) {
|
||||
function create(id: string): JQuery<HTMLElement> {
|
||||
let $notification = get(id);
|
||||
|
||||
if ($notification.length === 0) {
|
||||
if ($notification?.length === 0) {
|
||||
$notification = $(
|
||||
`<div id="shiny-notification-${id}" class="shiny-notification">` +
|
||||
'<div class="shiny-notification-close">×</div>' +
|
||||
@@ -135,11 +147,11 @@ function create(id) {
|
||||
getPanel().append($notification);
|
||||
}
|
||||
|
||||
return $notification;
|
||||
return $notification as JQuery<HTMLElement>;
|
||||
}
|
||||
|
||||
// Add a callback to remove a notification after a delay in ms.
|
||||
function addRemovalCallback(id, delay) {
|
||||
function addRemovalCallback(id: string, delay: number) {
|
||||
// If there's an existing removalCallback, clear it before adding the new
|
||||
// one.
|
||||
clearRemovalCallback(id);
|
||||
@@ -149,14 +161,14 @@ function addRemovalCallback(id, delay) {
|
||||
remove(id);
|
||||
}, delay);
|
||||
|
||||
get(id).data("removalCallback", removalCallback);
|
||||
get(id)?.data("removalCallback", removalCallback);
|
||||
}
|
||||
|
||||
// Clear a removal callback from a notification, if present.
|
||||
function clearRemovalCallback(id) {
|
||||
function clearRemovalCallback(id: string) {
|
||||
const $notification = get(id);
|
||||
const oldRemovalCallback: ReturnType<typeof setTimeout> =
|
||||
$notification.data("removalCallback");
|
||||
$notification?.data("removalCallback");
|
||||
|
||||
if (oldRemovalCallback) {
|
||||
clearTimeout(oldRemovalCallback);
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
import $ from "jquery";
|
||||
import { shinyShinyApp } from "./initedMethods";
|
||||
import { showNotification } from "./notifications";
|
||||
import type { ShinyApp } from "./shinyapp";
|
||||
|
||||
// We can use this method as `shinyShinyApp()` will throw if not initialized
|
||||
function shinyAppConfig() {
|
||||
return shinyShinyApp().config as NonNullable<ShinyApp["config"]>;
|
||||
}
|
||||
|
||||
function initReactlog(): void {
|
||||
$(document).on("keydown", function (e) {
|
||||
@@ -8,9 +14,9 @@ function initReactlog(): void {
|
||||
return;
|
||||
const url =
|
||||
"reactlog?w=" +
|
||||
window.escape(shinyShinyApp().config.workerId) +
|
||||
window.escape(shinyAppConfig().workerId) +
|
||||
"&s=" +
|
||||
window.escape(shinyShinyApp().config.sessionId);
|
||||
window.escape(shinyAppConfig().sessionId);
|
||||
|
||||
window.open(url);
|
||||
e.preventDefault();
|
||||
@@ -39,9 +45,9 @@ function initReactlog(): void {
|
||||
|
||||
const url =
|
||||
"reactlog/mark?w=" +
|
||||
window.escape(shinyShinyApp().config.workerId) +
|
||||
window.escape(shinyAppConfig().workerId) +
|
||||
"&s=" +
|
||||
window.escape(shinyShinyApp().config.sessionId);
|
||||
window.escape(shinyAppConfig().sessionId);
|
||||
|
||||
// send notification
|
||||
$.get(url, function (result: "marked" | void) {
|
||||
|
||||
@@ -2,7 +2,7 @@ import $ from "jquery";
|
||||
|
||||
import { showNotification, removeNotification } from "./notifications";
|
||||
|
||||
function updateTime(reconnectTime): void {
|
||||
function updateTime(reconnectTime: number): void {
|
||||
const $time = $("#shiny-reconnect-time");
|
||||
// If the time has been removed, exit and don't reschedule this function.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import $ from "jquery";
|
||||
import { asArray, hasOwnProperty } from "../utils";
|
||||
import { asArray, hasDefinedProperty } from "../utils";
|
||||
import { isIE } from "../utils/browser";
|
||||
import type { BindScope } from "./bind";
|
||||
import {
|
||||
@@ -86,7 +86,8 @@ type MetaItem = {
|
||||
|
||||
type StylesheetItem = {
|
||||
href: string;
|
||||
[x: string]: string;
|
||||
rel?: string;
|
||||
type?: string;
|
||||
};
|
||||
|
||||
type ScriptItem = {
|
||||
@@ -154,14 +155,17 @@ function renderDependency(dep_: HtmlDep) {
|
||||
// pass them through to `addStylesheetsAndRestyle` below.
|
||||
const stylesheetLinks = dep.stylesheet.map((x) => {
|
||||
// Add "rel" and "type" fields if not already present.
|
||||
if (!hasOwnProperty(x, "rel")) x.rel = "stylesheet";
|
||||
if (!hasOwnProperty(x, "type")) x.type = "text/css";
|
||||
if (!hasDefinedProperty(x, "rel")) x.rel = "stylesheet";
|
||||
if (!hasDefinedProperty(x, "type")) x.type = "text/css";
|
||||
|
||||
const link = document.createElement("link");
|
||||
|
||||
Object.entries(x).forEach(function ([attr, val]) {
|
||||
Object.entries(x).forEach(function ([attr, val]: [
|
||||
string,
|
||||
string | undefined
|
||||
]) {
|
||||
if (attr === "href") {
|
||||
val = encodeURI(val);
|
||||
val = encodeURI(val as string);
|
||||
}
|
||||
// If val isn't truthy (e.g., null), consider it a boolean attribute
|
||||
link.setAttribute(attr, val ? val : "");
|
||||
@@ -178,7 +182,7 @@ function renderDependency(dep_: HtmlDep) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (hasOwnProperty(htmlDependencies, dep.name)) return false;
|
||||
if (hasDefinedProperty(htmlDependencies, dep.name)) return false;
|
||||
|
||||
registerDependency(dep.name, dep.version);
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ import { debounce, Debouncer } from "../time";
|
||||
class SendImageSize {
|
||||
// This function gets defined in initShiny() and 'hoisted' so it can be reused
|
||||
// (to send CSS info) inside of Shiny.renderDependencies()
|
||||
regular: () => void;
|
||||
transitioned: () => void;
|
||||
regular!: () => void;
|
||||
transitioned!: () => void;
|
||||
|
||||
setImageSend(
|
||||
inputBatchSender: InputBatchSender,
|
||||
|
||||
@@ -1,11 +1,5 @@
|
||||
import $ from "jquery";
|
||||
import {
|
||||
$escape,
|
||||
hasOwnProperty,
|
||||
makeBlob,
|
||||
randomId,
|
||||
scopeExprToFunc,
|
||||
} from "../utils";
|
||||
import { $escape, hasOwnProperty, randomId, scopeExprToFunc } from "../utils";
|
||||
import {
|
||||
getShinyCreateWebsocket,
|
||||
getShinyOnCustomMessage,
|
||||
@@ -49,6 +43,8 @@ type OnSuccessRequest = (value: ResponseValue) => void;
|
||||
type OnErrorRequest = (err: string) => void;
|
||||
type InputValues = { [key: string]: unknown };
|
||||
|
||||
type MessageValue = Parameters<WebSocket["send"]>[0];
|
||||
|
||||
//// 2021/03 - TypeScript conversion note:
|
||||
// These four variables were moved from being internally defined to being defined globally within the file.
|
||||
// Before the TypeScript conversion, the values where attached to `window.Shiny.addCustomMessageHandler()`.
|
||||
@@ -58,16 +54,16 @@ type InputValues = { [key: string]: unknown };
|
||||
// Records insertion order of handlers. Maps number to name. This is so
|
||||
// we can dispatch messages to handlers in the order that handlers were
|
||||
// added.
|
||||
const messageHandlerOrder = [];
|
||||
const messageHandlerOrder: string[] = [];
|
||||
// Keep track of handlers by name. Maps name to handler function.
|
||||
const messageHandlers = {};
|
||||
const messageHandlers: { [key: string]: Handler } = {};
|
||||
|
||||
// Two categories of message handlers: those that are from Shiny, and those
|
||||
// that are added by the user. The Shiny ones handle messages in
|
||||
// msgObj.values, msgObj.errors, and so on. The user ones handle messages
|
||||
// in msgObj.custom.foo and msgObj.custom.bar.
|
||||
const customMessageHandlerOrder = [];
|
||||
const customMessageHandlers = {};
|
||||
const customMessageHandlerOrder: string[] = [];
|
||||
const customMessageHandlers: { [key: string]: Handler } = {};
|
||||
|
||||
// Adds Shiny (internal) message handler
|
||||
function addMessageHandler(type: string, handler: Handler) {
|
||||
@@ -110,30 +106,30 @@ function addCustomMessageHandler(type: string, handler: Handler): void {
|
||||
//// End message handler variables
|
||||
|
||||
class ShinyApp {
|
||||
$socket: ShinyWebSocket = null;
|
||||
$socket: ShinyWebSocket | null = null;
|
||||
|
||||
config: {
|
||||
workerId: string;
|
||||
sessionId: string;
|
||||
} = null;
|
||||
} | null = null;
|
||||
|
||||
// Cached input values
|
||||
$inputValues: InputValues = {};
|
||||
|
||||
// Input values at initialization (and reconnect)
|
||||
$initialInput: InputValues;
|
||||
$initialInput: InputValues | null = null;
|
||||
|
||||
// Output bindings
|
||||
$bindings: { [key: string]: OutputBindingAdapter } = {};
|
||||
|
||||
// Cached values/errors
|
||||
$values = {};
|
||||
$values: { [key: string]: any } = {};
|
||||
$errors: { [key: string]: ErrorsMessageValue } = {};
|
||||
|
||||
// Conditional bindings (show/hide element based on expression)
|
||||
$conditionals = {};
|
||||
|
||||
$pendingMessages: string[] = [];
|
||||
$pendingMessages: MessageValue[] = [];
|
||||
$activeRequests: {
|
||||
[key: number]: { onSuccess: OnSuccessRequest; onError: OnErrorRequest };
|
||||
} = {};
|
||||
@@ -160,7 +156,7 @@ class ShinyApp {
|
||||
return !!this.$socket;
|
||||
}
|
||||
|
||||
private scheduledReconnect: ReturnType<typeof setTimeout> = null;
|
||||
private scheduledReconnect: number | undefined = undefined;
|
||||
|
||||
reconnect(): void {
|
||||
// This function can be invoked directly even if there's a scheduled
|
||||
@@ -230,7 +226,7 @@ class ShinyApp {
|
||||
while (this.$pendingMessages.length) {
|
||||
const msg = this.$pendingMessages.shift();
|
||||
|
||||
socket.send(msg);
|
||||
socket.send(msg as string);
|
||||
}
|
||||
};
|
||||
socket.onmessage = (e) => {
|
||||
@@ -280,7 +276,7 @@ class ShinyApp {
|
||||
}
|
||||
|
||||
$scheduleReconnect(delay: Parameters<typeof setTimeout>[1]): void {
|
||||
this.scheduledReconnect = setTimeout(() => {
|
||||
this.scheduledReconnect = window.setTimeout(() => {
|
||||
this.reconnect();
|
||||
}, delay);
|
||||
}
|
||||
@@ -327,7 +323,9 @@ class ShinyApp {
|
||||
// session$allowReconnect("force") was called. The "force" option should
|
||||
// only be used for testing.
|
||||
if (
|
||||
(this.$allowReconnect === true && this.$socket.allowReconnect === true) ||
|
||||
(this.$allowReconnect === true &&
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
this.$socket!.allowReconnect === true) ||
|
||||
this.$allowReconnect === "force"
|
||||
) {
|
||||
const delay = this.reconnectDelay.next();
|
||||
@@ -371,7 +369,7 @@ class ShinyApp {
|
||||
args: unknown[],
|
||||
onSuccess: OnSuccessRequest,
|
||||
onError: OnErrorRequest,
|
||||
blobs: Array<ArrayBuffer | Blob | string>
|
||||
blobs: Array<ArrayBuffer | Blob | string> | undefined
|
||||
): void {
|
||||
let requestId = this.$nextRequestId;
|
||||
|
||||
@@ -385,7 +383,7 @@ class ShinyApp {
|
||||
onError: onError,
|
||||
};
|
||||
|
||||
let msg = JSON.stringify({
|
||||
let msg: Blob | string = JSON.stringify({
|
||||
method: method,
|
||||
args: args,
|
||||
tag: requestId,
|
||||
@@ -397,7 +395,7 @@ class ShinyApp {
|
||||
// the length followed by the blob. The json payload is UTF-8 encoded
|
||||
// and used as the first blob.
|
||||
|
||||
const uint32ToBuf = function (val) {
|
||||
const uint32ToBuf = function (val: number) {
|
||||
const buffer = new ArrayBuffer(4);
|
||||
const view = new DataView(buffer);
|
||||
|
||||
@@ -409,7 +407,7 @@ class ShinyApp {
|
||||
|
||||
payload.push(uint32ToBuf(0x01020202)); // signature
|
||||
|
||||
const jsonBuf = makeBlob([msg]);
|
||||
const jsonBuf: Blob = new Blob([msg]);
|
||||
|
||||
payload.push(uint32ToBuf(jsonBuf.size));
|
||||
payload.push(jsonBuf);
|
||||
@@ -425,19 +423,21 @@ class ShinyApp {
|
||||
payload.push(blob);
|
||||
}
|
||||
|
||||
const blob = makeBlob(payload) as unknown;
|
||||
const blob: Blob = new Blob(payload);
|
||||
|
||||
msg = blob as string;
|
||||
msg = blob;
|
||||
}
|
||||
|
||||
this.$sendMsg(msg);
|
||||
}
|
||||
|
||||
$sendMsg(msg: string): void {
|
||||
if (!this.$socket.readyState) {
|
||||
$sendMsg(msg: MessageValue): void {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
if (!this.$socket!.readyState) {
|
||||
this.$pendingMessages.push(msg);
|
||||
} else {
|
||||
this.$socket.send(msg);
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
this.$socket!.send(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -459,7 +459,7 @@ class ShinyApp {
|
||||
}
|
||||
}
|
||||
|
||||
receiveOutput<T>(name: string, value: T): T {
|
||||
receiveOutput<T>(name: string, value: T): T | undefined {
|
||||
const binding = this.$bindings[name];
|
||||
const evt: ShinyEventValue = jQuery.Event("shiny:value");
|
||||
|
||||
@@ -510,7 +510,7 @@ class ShinyApp {
|
||||
// necessary.
|
||||
private _narrowScopeComponent<T>(
|
||||
scopeComponent: { [key: string]: T },
|
||||
nsPrefix: string | null
|
||||
nsPrefix: string
|
||||
) {
|
||||
return Object.keys(scopeComponent)
|
||||
.filter((k) => k.indexOf(nsPrefix) === 0)
|
||||
@@ -525,7 +525,13 @@ class ShinyApp {
|
||||
//
|
||||
// Otherwise, returns a new object with keys in subComponents removed and
|
||||
// renamed as necessary.
|
||||
private _narrowScope(scope, nsPrefix: string) {
|
||||
private _narrowScope(
|
||||
scope: {
|
||||
input: InputValues;
|
||||
output: { [key: string]: any };
|
||||
},
|
||||
nsPrefix: string
|
||||
) {
|
||||
if (nsPrefix) {
|
||||
return {
|
||||
input: this._narrowScopeComponent(scope.input, nsPrefix),
|
||||
@@ -541,7 +547,7 @@ class ShinyApp {
|
||||
type: "shiny:conditional",
|
||||
});
|
||||
|
||||
const inputs = {};
|
||||
const inputs: InputValues = {};
|
||||
|
||||
// Input keys use "name:type" format; we don't want the user to
|
||||
// have to know about the type suffix when referring to inputs.
|
||||
@@ -562,13 +568,13 @@ class ShinyApp {
|
||||
let condFunc = el.data("data-display-if-func");
|
||||
|
||||
if (!condFunc) {
|
||||
const condExpr = el.attr("data-display-if");
|
||||
const condExpr = el.attr("data-display-if") as string;
|
||||
|
||||
condFunc = scopeExprToFunc(condExpr);
|
||||
el.data("data-display-if-func", condFunc);
|
||||
}
|
||||
|
||||
const nsPrefix = el.attr("data-ns-prefix");
|
||||
const nsPrefix = el.attr("data-ns-prefix") as string;
|
||||
const nsScope = this._narrowScope(scope, nsPrefix);
|
||||
const show = condFunc(nsScope);
|
||||
const showing = el.css("display") !== "none";
|
||||
@@ -610,6 +616,7 @@ class ShinyApp {
|
||||
|
||||
data = data.slice(len + 1);
|
||||
msgObj.custom = {};
|
||||
// @ts-expect-error; `custom` value is of unknown type. So setting within it is not allowed
|
||||
msgObj.custom[type] = data;
|
||||
}
|
||||
|
||||
@@ -655,7 +662,7 @@ class ShinyApp {
|
||||
// * Use arrow functions to allow the Types to propagate.
|
||||
// * However, `_sendMessagesToHandlers()` will adjust the `this` context to the same _`this`_.
|
||||
|
||||
addMessageHandler("values", (message: { [key: string]: unknown }) => {
|
||||
addMessageHandler("values", (message: { [key: string]: any }) => {
|
||||
for (const name in this.$bindings) {
|
||||
if (hasOwnProperty(this.$bindings, name))
|
||||
this.$bindings[name].showProgress(false);
|
||||
@@ -670,7 +677,10 @@ class ShinyApp {
|
||||
|
||||
addMessageHandler(
|
||||
"errors",
|
||||
function (message: { [key: string]: ErrorsMessageValue }) {
|
||||
function (
|
||||
this: ShinyApp,
|
||||
message: { [key: string]: ErrorsMessageValue }
|
||||
) {
|
||||
for (const key in message) {
|
||||
if (hasOwnProperty(message, key))
|
||||
this.receiveError(key, message[key]);
|
||||
@@ -716,8 +726,12 @@ class ShinyApp {
|
||||
|
||||
addMessageHandler(
|
||||
"progress",
|
||||
(message: { type: string; message: { id: string } }) => {
|
||||
function (
|
||||
this: ShinyApp,
|
||||
message: { type: string; message: { id: string } }
|
||||
) {
|
||||
if (message.type && message.message) {
|
||||
// @ts-expect-error; Unknown values handled with followup if statement
|
||||
const handler = this.progressHandlers[message.type];
|
||||
|
||||
if (handler) handler.call(this, message.message);
|
||||
@@ -756,14 +770,15 @@ class ShinyApp {
|
||||
|
||||
addMessageHandler(
|
||||
"response",
|
||||
(message: { tag: string; value?: ResponseValue; error?: string }) => {
|
||||
(message: { tag: number; value?: ResponseValue; error?: string }) => {
|
||||
const requestId = message.tag;
|
||||
const request = this.$activeRequests[requestId];
|
||||
|
||||
if (request) {
|
||||
delete this.$activeRequests[requestId];
|
||||
if ("value" in message) request.onSuccess(message.value);
|
||||
else request.onError(message.error);
|
||||
if ("value" in message)
|
||||
request.onSuccess(message.value as UploadInitValue);
|
||||
else request.onError(message.error as string);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -827,12 +842,13 @@ class ShinyApp {
|
||||
hasOwnProperty(message, "name") &&
|
||||
hasOwnProperty(message, "status")
|
||||
) {
|
||||
const binding = this.$bindings[message.name];
|
||||
const binding = this.$bindings[message.name as string];
|
||||
|
||||
// @ts-expect-error; TODO-barret; Could this be transformed into `.trigger(TYPE)`?
|
||||
$(binding ? binding.el : null).trigger({
|
||||
type: "shiny:" + message.status,
|
||||
});
|
||||
if (binding) {
|
||||
$(binding.el).trigger("shiny:" + message.status);
|
||||
} else {
|
||||
$().trigger("shiny:" + message.status);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -908,7 +924,7 @@ class ShinyApp {
|
||||
}
|
||||
|
||||
function getTabContent($tabset: JQuery<HTMLElement>) {
|
||||
const tabsetId = $tabset.attr("data-tabsetid");
|
||||
const tabsetId = $tabset.attr("data-tabsetid") as string;
|
||||
const $tabContent = $(
|
||||
"div.tab-content[data-tabsetid='" + $escape(tabsetId) + "']"
|
||||
);
|
||||
@@ -933,13 +949,13 @@ class ShinyApp {
|
||||
"'"
|
||||
);
|
||||
}
|
||||
const $liTags = [];
|
||||
const $divTags = [];
|
||||
const $liTags: Array<JQuery<HTMLElement>> = [];
|
||||
const $divTags: Array<JQuery<HTMLElement>> = [];
|
||||
|
||||
if ($aTag.attr("data-toggle") === "dropdown") {
|
||||
// dropdown
|
||||
const $dropdownTabset = $aTag.find("+ ul.dropdown-menu");
|
||||
const dropdownId = $dropdownTabset.attr("data-tabsetid");
|
||||
const dropdownId = $dropdownTabset.attr("data-tabsetid") as string;
|
||||
|
||||
const $dropdownLiTags = $dropdownTabset
|
||||
.find("a[data-toggle='tab']")
|
||||
@@ -983,12 +999,16 @@ class ShinyApp {
|
||||
|
||||
// Unless the item is being prepended/appended, the target tab
|
||||
// must be provided
|
||||
let target = null;
|
||||
let $targetLiTag = null;
|
||||
let $targetLiTag: JQuery<HTMLElement> | null = null;
|
||||
|
||||
if (message.target !== null) {
|
||||
target = getTargetTabs($tabset, $tabContent, message.target);
|
||||
$targetLiTag = target.$liTag;
|
||||
const targetInfo = getTargetTabs(
|
||||
$tabset,
|
||||
$tabContent,
|
||||
message.target as string
|
||||
);
|
||||
|
||||
$targetLiTag = targetInfo.$liTag;
|
||||
}
|
||||
|
||||
// If the item is to be placed inside a navbarMenu (dropdown),
|
||||
@@ -1106,7 +1126,10 @@ class ShinyApp {
|
||||
fix the dummy id given to the tab in the R side -- there, we always
|
||||
set the tab id (counter dummy) to "id" and the tabset id to "tsid")
|
||||
*/
|
||||
function getTabIndex($tabset, tabsetId) {
|
||||
function getTabIndex(
|
||||
$tabset: JQuery<HTMLElement>,
|
||||
tabsetId: string | undefined
|
||||
) {
|
||||
// The 0 is to ensure this works for empty tabsetPanels as well
|
||||
const existingTabIds = [0];
|
||||
// loop through all existing tabs, find the one with highest id
|
||||
@@ -1117,9 +1140,11 @@ class ShinyApp {
|
||||
|
||||
if ($tab.length > 0) {
|
||||
// remove leading url if it exists. (copy of bootstrap url stripper)
|
||||
const href = $tab.attr("href").replace(/.*(?=#[^\s]+$)/, "");
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const href = $tab.attr("href")!.replace(/.*(?=#[^\s]+$)/, "");
|
||||
// remove tab id to get the index
|
||||
const index = href.replace("#tab-" + tabsetId + "-", "");
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const index = href!.replace("#tab-" + tabsetId + "-", "");
|
||||
|
||||
existingTabIds.push(Number(index));
|
||||
}
|
||||
@@ -1151,7 +1176,7 @@ class ShinyApp {
|
||||
const dropdownId = $dropdownTabset.attr("data-tabsetid");
|
||||
|
||||
return { $tabset: $dropdownTabset, id: dropdownId };
|
||||
} else if (message.target !== null) {
|
||||
} else if (message.target !== null && $targetLiTag !== null) {
|
||||
// if our item is to be placed next to a tab that is inside
|
||||
// a navbarMenu, our item will also be inside
|
||||
const $uncleTabset = $targetLiTag.parent("ul");
|
||||
@@ -1168,7 +1193,7 @@ class ShinyApp {
|
||||
);
|
||||
|
||||
// If the given tabset has no active tabs, select the first one
|
||||
function ensureTabsetHasVisibleTab($tabset) {
|
||||
function ensureTabsetHasVisibleTab($tabset: JQuery<HTMLElement>) {
|
||||
const inputBinding = $tabset.data("shiny-input-binding");
|
||||
|
||||
// Use the getValue() method to avoid duplicating the CSS selector
|
||||
@@ -1189,7 +1214,7 @@ class ShinyApp {
|
||||
|
||||
// Given a tabset ul jquery object, return the value of the first tab
|
||||
// (in document order) that's visible and able to be selected.
|
||||
function getFirstTab($ul) {
|
||||
function getFirstTab($ul: JQuery<HTMLElement>) {
|
||||
return (
|
||||
$ul
|
||||
.find("li:visible a[data-toggle='tab']")
|
||||
@@ -1198,21 +1223,31 @@ class ShinyApp {
|
||||
);
|
||||
}
|
||||
|
||||
function tabApplyFunction(target, func, liTags = false) {
|
||||
function tabApplyFunction(
|
||||
target: ReturnType<typeof getTargetTabs>,
|
||||
func: ($el: JQuery<HTMLElement>) => void,
|
||||
liTags = false
|
||||
) {
|
||||
$.each(target, function (key, el) {
|
||||
if (key === "$liTag") {
|
||||
// $liTag is always just one jQuery element
|
||||
func(el);
|
||||
func(el as ReturnType<typeof getTargetTabs>["$liTag"]);
|
||||
} else if (key === "$divTags") {
|
||||
// $divTags is always an array (even if length = 1)
|
||||
$.each(el, function (i, div) {
|
||||
func(div);
|
||||
});
|
||||
$.each(
|
||||
el as ReturnType<typeof getTargetTabs>["$divTags"],
|
||||
function (i, div) {
|
||||
func(div);
|
||||
}
|
||||
);
|
||||
} else if (liTags && key === "$liTags") {
|
||||
// $liTags is always an array (even if length = 0)
|
||||
$.each(el, function (i, div) {
|
||||
func(div);
|
||||
});
|
||||
$.each(
|
||||
el as ReturnType<typeof getTargetTabs>["$liTags"],
|
||||
function (i, div) {
|
||||
func(div);
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1228,7 +1263,7 @@ class ShinyApp {
|
||||
|
||||
ensureTabsetHasVisibleTab($tabset);
|
||||
|
||||
function removeEl($el) {
|
||||
function removeEl($el: JQuery<HTMLElement>) {
|
||||
shinyUnbindAll($el, true);
|
||||
$el.remove();
|
||||
}
|
||||
@@ -1250,7 +1285,7 @@ class ShinyApp {
|
||||
|
||||
ensureTabsetHasVisibleTab($tabset);
|
||||
|
||||
function changeVisibility($el) {
|
||||
function changeVisibility($el: JQuery<HTMLElement>) {
|
||||
if (message.type === "show") $el.css("display", "");
|
||||
else if (message.type === "hide") {
|
||||
$el.hide();
|
||||
@@ -1265,6 +1300,7 @@ class ShinyApp {
|
||||
(message: { mode: unknown | "replace"; queryString: string }) => {
|
||||
// leave the bookmarking code intact
|
||||
if (message.mode === "replace") {
|
||||
// @ts-expect-error; No title value being supplied
|
||||
window.history.replaceState(null, null, message.queryString);
|
||||
return;
|
||||
}
|
||||
@@ -1298,6 +1334,7 @@ class ShinyApp {
|
||||
|
||||
if (what === "query") relURL += message.queryString;
|
||||
else relURL += oldQS + message.queryString; // leave old QS if it exists
|
||||
// @ts-expect-error; No title value being supplied
|
||||
window.history.pushState(null, null, relURL);
|
||||
|
||||
// for the case when message.queryString has both a query string
|
||||
@@ -1327,7 +1364,7 @@ class ShinyApp {
|
||||
|
||||
progressHandlers = {
|
||||
// Progress for a particular object
|
||||
binding: function (message: { id: string }): void {
|
||||
binding: function (this: ShinyApp, message: { id: string }): void {
|
||||
const key = message.id;
|
||||
const binding = this.$bindings[key];
|
||||
|
||||
@@ -1395,17 +1432,24 @@ class ShinyApp {
|
||||
// Stack bars
|
||||
const $progressBar = $progress.find(".progress");
|
||||
|
||||
$progressBar.css("top", depth * $progressBar.height() + "px");
|
||||
if ($progressBar) {
|
||||
$progressBar.css(
|
||||
"top",
|
||||
depth * ($progressBar.height() as number) + "px"
|
||||
);
|
||||
|
||||
// Stack text objects
|
||||
const $progressText = $progress.find(".progress-text");
|
||||
// Stack text objects
|
||||
const $progressText = $progress.find(".progress-text");
|
||||
|
||||
$progressText.css(
|
||||
"top",
|
||||
3 * $progressBar.height() + depth * $progressText.outerHeight() + "px"
|
||||
);
|
||||
$progressText.css(
|
||||
"top",
|
||||
3 * ($progressBar.height() as number) +
|
||||
depth * ($progressText.outerHeight() as number) +
|
||||
"px"
|
||||
);
|
||||
|
||||
$progress.hide();
|
||||
$progress.hide();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1492,9 +1536,11 @@ class ShinyApp {
|
||||
}
|
||||
url +=
|
||||
"/session/" +
|
||||
encodeURIComponent(this.config.sessionId) +
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
encodeURIComponent(this.config!.sessionId) +
|
||||
"/dataobj/shinytest?w=" +
|
||||
encodeURIComponent(this.config.workerId) +
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
encodeURIComponent(this.config!.workerId) +
|
||||
"&nonce=" +
|
||||
randomId();
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ function renderHtml(
|
||||
}
|
||||
// Take an object where keys are names of singletons, and merges it into
|
||||
// knownSingletons
|
||||
function register(s) {
|
||||
function register(s: typeof knownSingletons) {
|
||||
$.extend(knownSingletons, s);
|
||||
}
|
||||
// Takes a string or array of strings and adds them to knownSingletons
|
||||
@@ -84,7 +84,12 @@ function processHtml(val: string): {
|
||||
const newSingletons: typeof knownSingletons = {};
|
||||
let newVal: string;
|
||||
|
||||
const findNewPayload = function (match, p1, sig, payload) {
|
||||
const findNewPayload = function (
|
||||
match: string,
|
||||
p1: string,
|
||||
sig: string,
|
||||
payload: string
|
||||
) {
|
||||
if (knownSingletons[sig] || newSingletons[sig]) return "";
|
||||
newSingletons[sig] = true;
|
||||
return payload;
|
||||
@@ -97,8 +102,8 @@ function processHtml(val: string): {
|
||||
val = newVal;
|
||||
}
|
||||
|
||||
const heads = [];
|
||||
const headAddPayload = function (match, payload) {
|
||||
const heads: string[] = [];
|
||||
const headAddPayload = function (match: string, payload: string) {
|
||||
heads.push(payload);
|
||||
return "";
|
||||
};
|
||||
|
||||
9
srcts/src/testing/extendJQuery.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
// Used to avoid isolated module warning
|
||||
import "jquery";
|
||||
|
||||
declare global {
|
||||
interface JQuery {
|
||||
// used for testing only
|
||||
internalTest: () => void;
|
||||
}
|
||||
}
|
||||
@@ -3,13 +3,17 @@ import type { InputRatePolicy } from "../inputPolicies/inputRatePolicy";
|
||||
import type { AnyVoidFunction } from "../utils/extraTypes";
|
||||
|
||||
class Debouncer<X extends AnyVoidFunction> implements InputRatePolicy<X> {
|
||||
target: InputPolicy;
|
||||
target: InputPolicy | null;
|
||||
func: X;
|
||||
delayMs: number | undefined;
|
||||
timerId: ReturnType<typeof setTimeout> | null;
|
||||
args: Parameters<X> | null;
|
||||
|
||||
constructor(target: InputPolicy, func: X, delayMs: number | undefined) {
|
||||
constructor(
|
||||
target: InputPolicy | null,
|
||||
func: X,
|
||||
delayMs: number | undefined
|
||||
) {
|
||||
this.target = target;
|
||||
this.func = func;
|
||||
this.delayMs = delayMs;
|
||||
|
||||
@@ -3,10 +3,10 @@ import type { InputRatePolicy } from "../inputPolicies/inputRatePolicy";
|
||||
import type { AnyVoidFunction } from "../utils/extraTypes";
|
||||
|
||||
class Invoker<X extends AnyVoidFunction> implements InputRatePolicy<X> {
|
||||
target: InputPolicy;
|
||||
target: InputPolicy | null;
|
||||
func: X;
|
||||
|
||||
constructor(target: InputPolicy, func: X) {
|
||||
constructor(target: InputPolicy | null, func: X) {
|
||||
this.target = target;
|
||||
this.func = func;
|
||||
}
|
||||
|
||||
@@ -4,13 +4,17 @@ import type { InputRatePolicy } from "../inputPolicies/inputRatePolicy";
|
||||
import type { AnyVoidFunction } from "../utils/extraTypes";
|
||||
|
||||
class Throttler<X extends AnyVoidFunction> implements InputRatePolicy<X> {
|
||||
target: InputPolicy;
|
||||
target: InputPolicy | null;
|
||||
func: X;
|
||||
delayMs: number | undefined;
|
||||
timerId: ReturnType<typeof setTimeout> | null;
|
||||
args: Parameters<X> | null;
|
||||
|
||||
constructor(target: InputPolicy, func: X, delayMs: number | undefined) {
|
||||
constructor(
|
||||
target: InputPolicy | null,
|
||||
func: X,
|
||||
delayMs: number | undefined
|
||||
) {
|
||||
this.target = target;
|
||||
this.func = func;
|
||||
this.delayMs = delayMs;
|
||||
|
||||
@@ -5,7 +5,7 @@ import $ from "jquery";
|
||||
import { getQueriesForElement } from "@testing-library/dom";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
|
||||
$.fn.internalTest = function countify() {
|
||||
$.fn.internalTest = function countify(this: JQuery<HTMLElement>) {
|
||||
this.html(`
|
||||
<div>
|
||||
<button>0</button>
|
||||
@@ -13,10 +13,13 @@ $.fn.internalTest = function countify() {
|
||||
`);
|
||||
const $button = this.find("button");
|
||||
|
||||
$button._count = 0;
|
||||
// JQuery<HTMLButtonElement>
|
||||
|
||||
let count = 0;
|
||||
|
||||
$button.click(() => {
|
||||
$button._count++;
|
||||
$button.text($button._count);
|
||||
count++;
|
||||
$button.text(count);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
import $ from "jquery";
|
||||
|
||||
type BlobBuilderConstructor = typeof window.MSBlobBuilder;
|
||||
|
||||
let blobBuilderClass: BlobBuilderConstructor;
|
||||
|
||||
function setBlobBuilder(blobBuilderClass_: BlobBuilderConstructor): void {
|
||||
blobBuilderClass = blobBuilderClass_;
|
||||
return;
|
||||
}
|
||||
|
||||
function makeBlob(parts: BlobPart[]): Blob {
|
||||
// Browser compatibility is a mess right now. The code as written works in
|
||||
// a variety of modern browsers, but sadly gives a deprecation warning
|
||||
// message on the console in current versions (as of this writing) of
|
||||
// Chrome.
|
||||
|
||||
// Safari 6.0 (8536.25) on Mac OS X 10.8.1:
|
||||
// Has Blob constructor but it doesn't work with ArrayBufferView args
|
||||
|
||||
// Google Chrome 21.0.1180.81 on Xubuntu 12.04:
|
||||
// Has Blob constructor, accepts ArrayBufferView args, accepts ArrayBuffer
|
||||
// but with a deprecation warning message
|
||||
|
||||
// Firefox 15.0 on Xubuntu 12.04:
|
||||
// Has Blob constructor, accepts both ArrayBuffer and ArrayBufferView args
|
||||
|
||||
// Chromium 18.0.1025.168 (Developer Build 134367 Linux) on Xubuntu 12.04:
|
||||
// No Blob constructor. Has WebKitBlobBuilder.
|
||||
|
||||
try {
|
||||
return new Blob(parts);
|
||||
} catch (e) {
|
||||
const blobBuilder = new blobBuilderClass();
|
||||
|
||||
$.each(parts, function (i, part) {
|
||||
blobBuilder.append(part);
|
||||
});
|
||||
return blobBuilder.getBlob();
|
||||
}
|
||||
}
|
||||
|
||||
export { makeBlob, setBlobBuilder };
|
||||
export type { BlobBuilderConstructor };
|
||||