This was the product of a long discussion between @wch, @alandipert, @bborgesr
and myself. The conflation of immediate (no throttle/debounce) and non-dedupe
in a single "immediate" flag was deemed unacceptable, because UI controls often
want immediacy but also dedupe. Introducing a second "dedupe" flag would work
but {immediate: false, dedupe: false} doesn't make much sense, and dedupe not
only implies that InputNoResendDecorator should behave differently but also
InputBatchSender (i.e. no deduplication AND no coalescing).
We decided to remove the "immediate" boolean option and replace it with a
string option that would have three possibilities at this time. The only con
to this approach is if anyone is calling onInputChange with immediate:true
today, and I can't imagine anyone is. The immediate flag only has any effect
if the input id that's being set has been put in debounce/throttle mode, and
I don't even think that is documented today, and I'm not even sure it's
possible to do it from custom JS (that's not part of a custom input binding).
We already had an `immediate` input option, which was used to override client side rate
limiting mechanisms (debounce/throttle). This commit extends the semantics of that option
to also mean that duplicate values should not be ignored on the client side.
Previous to this commit, circumventing the client side dedupe logic was not enough. The
server side ReactiveValues object was also subject to deduping. With this commit, the
low-level ReactiveValues class's constructor now has a `dedupe` option, which defaults
to TRUE; the ReactiveValues used for a session's input has it turned to FALSE. I figure
if I had to work this hard to get the client to stop sending duplicates, and the input
values are only expected to ever be updated by the client, then there's really no reason
for server side deduping to be performed for this particular ReactiveValues object.
It would make sense as a future feature to also make deduping optional for user-created
reactiveValues and reactiveVal objects.
* fix appendTab for empty tabsetPanels; use spread operator to avoid having to resort to apply; upgrade grunt.
* revert back to `Math.max.apply(null, existingTabIds) + 1;` there's no browser compatibility issues there
application/x-www-form-urlencoded;charset=UTF-8 is the default, which shinyapps.io
cares about for some reason and tries to parse the data as such. By setting the
content type to the more accurate application/octet-stream, no middleware should
be tempted to futz with the contents.
* trigger a new `shiny:invalidated` event when an output gets invalidated, at the same time that the `recalculating` CSS class is added (fixes#1688)
* add attribution to @andrewsali
* change event name from 'shiny:invalidated' to 'shiny:outputinvalidated'
* add binding and name to the new event 'shiny:outputinvalidated'
* added a shiny:sessionInit JS event that is triggered at the end of the session's initialize method
* new entry
* update NEWS
* correct version number in NEWS.md
* fix typo
* Remove unused 'immediate' arguments
* Add opts argument to setInput methods
* Extract input values without opts
* Consistent interface for setting initial values
* Update NEWS
* Add binding and el when fileInputBinding triggers shiny:inputchanged
* Revert "Consistent interface for setting initial values"
This reverts commit 12c0b6e72a.
* Move InputDeferDecorater function
The new placement properly reflects the decorator stack
* Fix indentation
* bindInputs: make sure value is set immediately
* Only use opts where necessary in input decorators
* Properly send initial values
* Move initial value of .clientdata_allowDataUriScheme to better place
* Fix indentation
* Add InputValidateDecorator
* Better variable name
* Add function for default input options
* Simplify code