From a2d5c0c79d861e66f6110136370d0bc52db14a6d Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 6 Feb 2019 12:24:40 -0800 Subject: [PATCH 01/58] WIP createReactInput --- R/reacttools.R | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/R/reacttools.R b/R/reacttools.R index 915566c..0821075 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -92,3 +92,34 @@ reactMarkup <- function(tag) { list(tag = tag, class = "reactR_markup") } +#' Create a React-based input +#' +#' @param inputId The \code{input} slot that will be used to access the value. +#' @param class Space-delimited list of CSS class names that should identify this input type in the browser. +#' @param value Initial value. +#' @param configuration +#' @param container +#' @param dependencies +#' +#' @return +#' @export +#' +#' @examples +createReactInput <- function(inputId, + class, + value, + configuration = list(), + container = htmltools::tags$div, + dependencies = NULL) { + htmltools::tagList( + container(id = inputId, class = class), + htmltools::tags$script(id = sprintf("%s_value", inputId), + type = "application/json", + shiny:::toJSON(value)), + htmltools::tags$script(id = sprintf("%s_configuration", inputId), + type = "application/json", + shiny:::toJSON(configuration)), + html_dependency_react(), + html_dependency_reacttools() + ) +} From 3cfa77c585a8f0f9df9c88054a9ddcf5f0024096 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 7 Feb 2019 09:59:54 -0800 Subject: [PATCH 02/58] Improvements to createReactInput arg list --- R/reacttools.R | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/R/reacttools.R b/R/reacttools.R index 0821075..bf27f92 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -95,22 +95,26 @@ reactMarkup <- function(tag) { #' Create a React-based input #' #' @param inputId The \code{input} slot that will be used to access the value. -#' @param class Space-delimited list of CSS class names that should identify this input type in the browser. +#' @param class Space-delimited list of CSS class names that should identify +#' this input type in the browser. #' @param value Initial value. -#' @param configuration -#' @param container -#' @param dependencies +#' @param dependencies HTML dependencies to include in addition to those +#' supporting React. Must contain at least one dependency, that of the input's +#' implementation. +#' @param configuration Static configuration data. +#' @param container A function to generate an HTML element to contain the input. #' -#' @return +#' @return A Shiny input suitable for inclusion in a UI. #' @export #' #' @examples createReactInput <- function(inputId, class, value, + dependencies, configuration = list(), - container = htmltools::tags$div, - dependencies = NULL) { + container = htmltools::tags$div) { + if(length(dependencies) < 1) stop("Must include at least one HTML dependency.") htmltools::tagList( container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), @@ -120,6 +124,7 @@ createReactInput <- function(inputId, type = "application/json", shiny:::toJSON(configuration)), html_dependency_react(), - html_dependency_reacttools() + html_dependency_reacttools(), + dependencies ) } From 1617d34b6652c4be10b57f34b59b6b455024452a Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 12 Feb 2019 15:34:52 -0800 Subject: [PATCH 03/58] Import input code from test project --- man/createReactInput.Rd | 31 +++++++++++ srcjs/input.js | 111 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 man/createReactInput.Rd create mode 100644 srcjs/input.js diff --git a/man/createReactInput.Rd b/man/createReactInput.Rd new file mode 100644 index 0000000..cdb7b04 --- /dev/null +++ b/man/createReactInput.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reacttools.R +\name{createReactInput} +\alias{createReactInput} +\title{Create a React-based input} +\usage{ +createReactInput(inputId, class, dependencies, default = NULL, + configuration = list(), container = htmltools::tags$div) +} +\arguments{ +\item{inputId}{The \code{input} slot that will be used to access the value.} + +\item{class}{Space-delimited list of CSS class names that should identify +this input type in the browser.} + +\item{dependencies}{HTML dependencies to include in addition to those +supporting React. Must contain at least one dependency, that of the input's +implementation.} + +\item{configuration}{Static configuration data.} + +\item{container}{A function to generate an HTML element to contain the input.} + +\item{value}{Initial value.} +} +\value{ +A Shiny input suitable for inclusion in a UI. +} +\description{ +Create a React-based input +} diff --git a/srcjs/input.js b/srcjs/input.js new file mode 100644 index 0000000..1c19d50 --- /dev/null +++ b/srcjs/input.js @@ -0,0 +1,111 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import Shiny from 'shiny'; +import $ from 'jquery'; + +/* + * This default receiveMessage implementation expects data to contain whole + * configuration and value properties. If either is present, it will be set and + * the component will be re-rendered. Because receiveMessage is typically used + * by input authors to perform incremental updates, this default implementation + * can be overriden by the user with the receiveMessage arguments to + * reactInput. + */ +function defaultReceiveMessage(el, { configuration, value }) { + let dirty = false; + if (configuration !== undefined) { + this.setInputConfiguration(el, configuration); + dirty = true; + } + if (value !== undefined) { + this.setInputValue(el, value); + dirty = true; + } + if (dirty) { + this.getCallback(el)(); + this.render(el); + } +} + +const defaultOptions = { + receiveMessage: defaultReceiveMessage +}; + +/** + * Installs a new Shiny input binding based on a React component. + * + * @param {string} selector - jQuery selector that should identify the set of + * container elements within the scope argument of Shiny.InputBinding.find. + * @param {string} name - A name such as 'acme.FooInput' that should uniquely + * identify the component. + * @param {Object} component - React Component, either class or function. + * @param {Object} options - Additional configuration options. Supported + * options are: + * - receiveMessage: Implementation of Shiny.InputBinding to use in place of + * the default. Typically overridden as an optimization to perform + * incremental value updates. + */ +export function reactInput(selector, + name, + component, + options) { + options = Object.assign({}, defaultOptions, options); + Shiny.inputBindings.register(new class extends Shiny.InputBinding { + + /* + * Methods override those in Shiny.InputBinding + */ + + find(scope) { + return $(scope).find(selector); + } + getValue(el) { + return this.getInputValue(el); + } + setValue(el, value) { + this.setInputValue(el, value); + this.getCallback(el)(); + this.render(el); + } + subscribe(el, callback) { + $(el).data('callback', callback); + this.render(el); + } + unsubscribe(el, callback) { + // TODO + } + receiveMessage(el, data) { + options.receiveMessage.call(this, el, data); + } + + /* + * Methods not present in Shiny.InputBinding but accessible to users + * through `this` in receiveMessage + * */ + + getInputValue(el) { + return JSON.parse($(el).next().text()); + } + setInputValue(el, value) { + $(el).next().text(JSON.stringify(value)); + } + getInputConfiguration(el) { + return JSON.parse($(el).next().next().text()); + } + setInputConfiguration(el, value) { + $(el).next().next().text(JSON.stringify(value)); + } + getCallback(el) { + return $(el).data('callback'); + } + render(el) { + const element = React.createElement(component, { + configuration: this.getInputConfiguration(el), + value: this.getValue(el), + setValue: this.setValue.bind(this, el) + }); + ReactDOM.render(element, el); + } + }, name); +} + From f356b69532415df00e756e7af20a15977b5e1fce Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 13 Feb 2019 10:17:13 -0800 Subject: [PATCH 04/58] Reorganize JS: split into widget and input files --- srcjs/widget.js | 110 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 srcjs/widget.js diff --git a/srcjs/widget.js b/srcjs/widget.js new file mode 100644 index 0000000..432adb2 --- /dev/null +++ b/srcjs/widget.js @@ -0,0 +1,110 @@ +import HTMLWidgets from 'htmlwidgets'; + +/** + * Recursively transforms tag, a JSON representation of an instance of a + * React component and its children, into a React element suitable for + * passing to ReactDOM.render. + * @param {Object} components + * @param {Object} tag + */ +export function hydrate(components, tag) { + if (typeof tag === 'string') return tag; + if (tag.name[0] === tag.name[0].toUpperCase() + && !components.hasOwnProperty(tag.name)) { + throw new Error("Unknown component: " + tag.name); + } + var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, + args = [elem, tag.attribs]; + for (var i = 0; i < tag.children.length; i++) { + args.push(hydrate(components, tag.children[i])); + } + return React.createElement.apply(React, args); +} + +export const defaultOptions = { + // The name of the property on the root tag to use for the width, if + // it's updated. + widthProperty: "width", + // The name of the property on the root tag to use for the height, if + // it's updated. + heightProperty: "height", + // Whether or not to append the string 'px' to the width and height + // properties when they change. + appendPx: false, + // Whether or not to dynamically update the width and height properties + // of the last known tag when the computed width and height change in + // the browser. + renderOnResize: false +}; + +export function mergeOptions(options) { + var merged = {}; + for (var k in defaultOptions) { + merged[k] = defaultOptions[k]; + } + for (var k in options) { + if (!defaultOptions.hasOwnProperty(k)) { + throw new Error("Unrecognized option: " + k); + } + merged[k] = options[k]; + } + return merged; +} + +export function formatDimension(dim, options) { + if (options.appendPx) { + return dim + 'px'; + } else { + return dim; + } +} + +export function isTag(value) { + return (typeof value === 'object') + && value.hasOwnProperty('name') + && value.hasOwnProperty('attribs') + && value.hasOwnProperty('children'); +} + +/** + * Creates an HTMLWidget that is updated by rendering a React component. + * React component constructors are made available by specifying them by + * name in the components object. + * @param {string} name + * @param {string} type + * @param {Object} components + * @param {Object} options + */ +export function reactWidget(name, type, components, options) { + var actualOptions = mergeOptions(options); + HTMLWidgets.widget({ + name: name, + type: type, + factory: function (el, width, height) { + var lastValue, + renderValue = (function (value) { + if (actualOptions.renderOnResize) { + // value.tag might be a primitive string, in which + // case there is no attribs property. + if (typeof value.tag === 'object') { + value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); + value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); + } + lastValue = value; + } + ReactDOM.render(hydrate(components, value.tag), el); + }); + return { + renderValue: renderValue, + resize: function (newWidth, newHeight) { + if (actualOptions.renderOnResize) { + width = newWidth; + height = newHeight; + renderValue(lastValue); + } + } + }; + } + }) +} + From df7d933cdf233098ac44473a952c6aa80e5dc4fc Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 13 Feb 2019 12:29:13 -0800 Subject: [PATCH 05/58] Reorganize JS: split into widget and input files --- NAMESPACE | 1 + R/reacttools.R | 10 +- inst/www/react-tools/react-tools.js | 479 ++++++++++++++++++------ inst/www/react-tools/react-tools.js.map | 2 +- karma.conf.js | 19 +- man/createReactInput.Rd | 8 +- srcjs/react-tools.js | 128 +------ webpack.config.js | 3 +- 8 files changed, 403 insertions(+), 247 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 14a93f4..7051c2c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ S3method("[[<-",react_component_builder) export(React) export(babel_transform) export(component) +export(createReactInput) export(html_dependency_corejs) export(html_dependency_react) export(html_dependency_reacttools) diff --git a/R/reacttools.R b/R/reacttools.R index bf27f92..243fb6f 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -97,24 +97,24 @@ reactMarkup <- function(tag) { #' @param inputId The \code{input} slot that will be used to access the value. #' @param class Space-delimited list of CSS class names that should identify #' this input type in the browser. -#' @param value Initial value. #' @param dependencies HTML dependencies to include in addition to those #' supporting React. Must contain at least one dependency, that of the input's #' implementation. +#' @param default Initial value. #' @param configuration Static configuration data. -#' @param container A function to generate an HTML element to contain the input. +#' @param container Function to generate an HTML element to contain the input. #' -#' @return A Shiny input suitable for inclusion in a UI. +#' @return Shiny input suitable for inclusion in a UI. #' @export #' -#' @examples createReactInput <- function(inputId, class, - value, dependencies, + default = NULL, configuration = list(), container = htmltools::tags$div) { if(length(dependencies) < 1) stop("Must include at least one HTML dependency.") + value <- restoreInput(id = inputId, default = default) htmltools::tagList( container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index ef3cc39..fe6db44 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -86,143 +86,398 @@ /************************************************************************/ /******/ ({ +/***/ "./srcjs/input.js": +/*!************************!*\ + !*** ./srcjs/input.js ***! + \************************/ +/*! exports provided: reactInput */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactInput", function() { return reactInput; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var shiny__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! shiny */ "shiny"); +/* harmony import */ var shiny__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(shiny__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jquery */ "jquery"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_3__); +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + +/* + * This default receiveMessage implementation expects data to contain whole + * configuration and value properties. If either is present, it will be set and + * the component will be re-rendered. Because receiveMessage is typically used + * by input authors to perform incremental updates, this default implementation + * can be overriden by the user with the receiveMessage arguments to + * reactInput. + */ + +function defaultReceiveMessage(el, _ref) { + var configuration = _ref.configuration, + value = _ref.value; + var dirty = false; + + if (configuration !== undefined) { + this.setInputConfiguration(el, configuration); + dirty = true; + } + + if (value !== undefined) { + this.setInputValue(el, value); + dirty = true; + } + + if (dirty) { + this.getCallback(el)(); + this.render(el); + } +} + +var defaultOptions = { + receiveMessage: defaultReceiveMessage +}; +/** + * Installs a new Shiny input binding based on a React component. + * + * @param {string} selector - jQuery selector that should identify the set of + * container elements within the scope argument of Shiny.InputBinding.find. + * @param {string} name - A name such as 'acme.FooInput' that should uniquely + * identify the component. + * @param {Object} component - React Component, either class or function. + * @param {Object} options - Additional configuration options. Supported + * options are: + * - receiveMessage: Implementation of Shiny.InputBinding to use in place of + * the default. Typically overridden as an optimization to perform + * incremental value updates. + */ + +function reactInput(selector, name, component, options) { + options = Object.assign({}, defaultOptions, options); + shiny__WEBPACK_IMPORTED_MODULE_2___default.a.inputBindings.register(new ( + /*#__PURE__*/ + function (_Shiny$InputBinding) { + _inherits(_class, _Shiny$InputBinding); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "find", + + /* + * Methods override those in Shiny.InputBinding + */ + value: function find(scope) { + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(scope).find(selector); + } + }, { + key: "getValue", + value: function getValue(el) { + return this.getInputValue(el); + } + }, { + key: "setValue", + value: function setValue(el, value) { + this.setInputValue(el, value); + this.getCallback(el)(); + this.render(el); + } + }, { + key: "subscribe", + value: function subscribe(el, callback) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('callback', callback); + this.render(el); + } + }, { + key: "unsubscribe", + value: function unsubscribe(el, callback) {// TODO + } + }, { + key: "receiveMessage", + value: function receiveMessage(el, data) { + options.receiveMessage.call(this, el, data); + } + /* + * Methods not present in Shiny.InputBinding but accessible to users + * through `this` in receiveMessage + * */ + + }, { + key: "getInputValue", + value: function getInputValue(el) { + return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text()); + } + }, { + key: "setInputValue", + value: function setInputValue(el, value) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text(JSON.stringify(value)); + } + }, { + key: "getInputConfiguration", + value: function getInputConfiguration(el) { + return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text()); + } + }, { + key: "setInputConfiguration", + value: function setInputConfiguration(el, value) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text(JSON.stringify(value)); + } + }, { + key: "getCallback", + value: function getCallback(el) { + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('callback'); + } + }, { + key: "render", + value: function render(el) { + var element = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(component, { + configuration: this.getInputConfiguration(el), + value: this.getValue(el), + setValue: this.setValue.bind(this, el) + }); + react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render(element, el); + } + }]); + + return _class; + }(shiny__WEBPACK_IMPORTED_MODULE_2___default.a.InputBinding))(), name); +} + +/***/ }), + /***/ "./srcjs/react-tools.js": /*!******************************!*\ !*** ./srcjs/react-tools.js ***! \******************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _widget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./widget */ "./srcjs/widget.js"); +/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./input */ "./srcjs/input.js"); + + +window.reactR = { + reactInput: _input__WEBPACK_IMPORTED_MODULE_1__["reactInput"], + reactWidget: _widget__WEBPACK_IMPORTED_MODULE_0__["reactWidget"], + hydrate: hydrate +}; + +/***/ }), + +/***/ "./srcjs/widget.js": +/*!*************************!*\ + !*** ./srcjs/widget.js ***! + \*************************/ +/*! exports provided: hydrate, defaultOptions, mergeOptions, formatDimension, isTag, reactWidget */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hydrate", function() { return hydrate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultOptions", function() { return defaultOptions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeOptions", function() { return mergeOptions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatDimension", function() { return formatDimension; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTag", function() { return isTag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactWidget", function() { return reactWidget; }); +/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! htmlwidgets */ "htmlwidgets"); +/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -window.reactR = function () { - /** - * Recursively transforms tag, a JSON representation of an instance of a - * React component and its children, into a React element suitable for - * passing to ReactDOM.render. - * @param {Object} components - * @param {Object} tag - */ - function hydrate(components, tag) { - if (typeof tag === 'string') return tag; - - if (tag.name[0] === tag.name[0].toUpperCase() && !components.hasOwnProperty(tag.name)) { - throw new Error("Unknown component: " + tag.name); - } - var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, - args = [elem, tag.attribs]; +/** + * Recursively transforms tag, a JSON representation of an instance of a + * React component and its children, into a React element suitable for + * passing to ReactDOM.render. + * @param {Object} components + * @param {Object} tag + */ - for (var i = 0; i < tag.children.length; i++) { - args.push(hydrate(components, tag.children[i])); - } +function hydrate(components, tag) { + if (typeof tag === 'string') return tag; - return React.createElement.apply(React, args); + if (tag.name[0] === tag.name[0].toUpperCase() && !components.hasOwnProperty(tag.name)) { + throw new Error("Unknown component: " + tag.name); } - var defaultOptions = { - // The name of the property on the root tag to use for the width, if - // it's updated. - widthProperty: "width", - // The name of the property on the root tag to use for the height, if - // it's updated. - heightProperty: "height", - // Whether or not to append the string 'px' to the width and height - // properties when they change. - appendPx: false, - // Whether or not to dynamically update the width and height properties - // of the last known tag when the computed width and height change in - // the browser. - renderOnResize: false - }; - - function mergeOptions(options) { - var merged = {}; - - for (var k in defaultOptions) { - merged[k] = defaultOptions[k]; - } + var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, + args = [elem, tag.attribs]; - for (var k in options) { - if (!defaultOptions.hasOwnProperty(k)) { - throw new Error("Unrecognized option: " + k); - } + for (var i = 0; i < tag.children.length; i++) { + args.push(hydrate(components, tag.children[i])); + } - merged[k] = options[k]; - } + return React.createElement.apply(React, args); +} +var defaultOptions = { + // The name of the property on the root tag to use for the width, if + // it's updated. + widthProperty: "width", + // The name of the property on the root tag to use for the height, if + // it's updated. + heightProperty: "height", + // Whether or not to append the string 'px' to the width and height + // properties when they change. + appendPx: false, + // Whether or not to dynamically update the width and height properties + // of the last known tag when the computed width and height change in + // the browser. + renderOnResize: false +}; +function mergeOptions(options) { + var merged = {}; - return merged; + for (var k in defaultOptions) { + merged[k] = defaultOptions[k]; } - function formatDimension(dim, options) { - if (options.appendPx) { - return dim + 'px'; - } else { - return dim; + for (var k in options) { + if (!defaultOptions.hasOwnProperty(k)) { + throw new Error("Unrecognized option: " + k); } + + merged[k] = options[k]; } - function isTag(value) { - return _typeof(value) === 'object' && value.hasOwnProperty('name') && value.hasOwnProperty('attribs') && value.hasOwnProperty('children'); + return merged; +} +function formatDimension(dim, options) { + if (options.appendPx) { + return dim + 'px'; + } else { + return dim; } - /** - * Creates an HTMLWidget that is updated by rendering a React component. - * React component constructors are made available by specifying them by - * name in the components object. - * @param {string} name - * @param {string} type - * @param {Object} components - * @param {Object} options - */ - - - function reactWidget(name, type, components, options) { - var actualOptions = mergeOptions(options); - HTMLWidgets.widget({ - name: name, - type: type, - factory: function factory(el, width, height) { - var lastValue, - renderValue = function renderValue(value) { - if (actualOptions.renderOnResize) { - // value.tag might be a primitive string, in which - // case there is no attribs property. - if (_typeof(value.tag) === 'object') { - value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); - value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); - } - - lastValue = value; - } +} +function isTag(value) { + return _typeof(value) === 'object' && value.hasOwnProperty('name') && value.hasOwnProperty('attribs') && value.hasOwnProperty('children'); +} +/** + * Creates an HTMLWidget that is updated by rendering a React component. + * React component constructors are made available by specifying them by + * name in the components object. + * @param {string} name + * @param {string} type + * @param {Object} components + * @param {Object} options + */ - ReactDOM.render(hydrate(components, value.tag), el); - }; - - return { - renderValue: renderValue, - resize: function resize(newWidth, newHeight) { - if (actualOptions.renderOnResize) { - width = newWidth; - height = newHeight; - renderValue(lastValue); - } +function reactWidget(name, type, components, options) { + var actualOptions = mergeOptions(options); + Object(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__["widget"])({ + name: name, + type: type, + factory: function factory(el, width, height) { + var lastValue, + renderValue = function renderValue(value) { + if (actualOptions.renderOnResize) { + // value.tag might be a primitive string, in which + // case there is no attribs property. + if (_typeof(value.tag) === 'object') { + value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); + value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); } - }; - } - }); - } - return { - reactWidget: reactWidget, - hydrate: hydrate, - __internal: { - defaultOptions: defaultOptions, - mergeOptions: mergeOptions, - formatDimension: formatDimension, - isTag: isTag + lastValue = value; + } + + ReactDOM.render(hydrate(components, value.tag), el); + }; + + return { + renderValue: renderValue, + resize: function resize(newWidth, newHeight) { + if (actualOptions.renderOnResize) { + width = newWidth; + height = newHeight; + renderValue(lastValue); + } + } + }; } - }; -}(); + }); +} + +/***/ }), + +/***/ "htmlwidgets": +/*!*************************************!*\ + !*** external "window.HTMLWidgets" ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.HTMLWidgets; + +/***/ }), + +/***/ "jquery": +/*!********************************!*\ + !*** external "window.jQuery" ***! + \********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.jQuery; + +/***/ }), + +/***/ "react": +/*!*******************************!*\ + !*** external "window.React" ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.React; + +/***/ }), + +/***/ "react-dom": +/*!**********************************!*\ + !*** external "window.ReactDOM" ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.ReactDOM; + +/***/ }), + +/***/ "shiny": +/*!*******************************!*\ + !*** external "window.Shiny" ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.Shiny; /***/ }) diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index dff75c5..5cb1489 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/react-tools.js"],"names":["window","reactR","hydrate","components","tag","name","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","React","createElement","apply","defaultOptions","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","options","merged","k","formatDimension","dim","isTag","value","reactWidget","type","actualOptions","HTMLWidgets","widget","factory","el","width","height","lastValue","renderValue","ReactDOM","render","resize","newWidth","newHeight","__internal"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFAA,MAAM,CAACC,MAAP,GAAiB,YAAY;AACzB;;;;;;;AAOA,WAASC,OAAT,CAAiBC,UAAjB,EAA6BC,GAA7B,EAAkC;AAC9B,QAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B,OAAOA,GAAP;;AAC7B,QAAIA,GAAG,CAACC,IAAJ,CAAS,CAAT,MAAgBD,GAAG,CAACC,IAAJ,CAAS,CAAT,EAAYC,WAAZ,EAAhB,IACG,CAACH,UAAU,CAACI,cAAX,CAA0BH,GAAG,CAACC,IAA9B,CADR,EAC6C;AACzC,YAAM,IAAIG,KAAJ,CAAU,wBAAwBJ,GAAG,CAACC,IAAtC,CAAN;AACH;;AACD,QAAII,IAAI,GAAGN,UAAU,CAACI,cAAX,CAA0BH,GAAG,CAACC,IAA9B,IAAsCF,UAAU,CAACC,GAAG,CAACC,IAAL,CAAhD,GAA6DD,GAAG,CAACC,IAA5E;AAAA,QACIK,IAAI,GAAG,CAACD,IAAD,EAAOL,GAAG,CAACO,OAAX,CADX;;AAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,GAAG,CAACS,QAAJ,CAAaC,MAAjC,EAAyCF,CAAC,EAA1C,EAA8C;AAC1CF,UAAI,CAACK,IAAL,CAAUb,OAAO,CAACC,UAAD,EAAaC,GAAG,CAACS,QAAJ,CAAaD,CAAb,CAAb,CAAjB;AACH;;AACD,WAAOI,KAAK,CAACC,aAAN,CAAoBC,KAApB,CAA0BF,KAA1B,EAAiCN,IAAjC,CAAP;AACH;;AAED,MAAIS,cAAc,GAAG;AACjB;AACA;AACAC,iBAAa,EAAE,OAHE;AAIjB;AACA;AACAC,kBAAc,EAAE,QANC;AAOjB;AACA;AACAC,YAAQ,EAAE,KATO;AAUjB;AACA;AACA;AACAC,kBAAc,EAAE;AAbC,GAArB;;AAgBA,WAASC,YAAT,CAAsBC,OAAtB,EAA+B;AAC3B,QAAIC,MAAM,GAAG,EAAb;;AACA,SAAK,IAAIC,CAAT,IAAcR,cAAd,EAA8B;AAC1BO,YAAM,CAACC,CAAD,CAAN,GAAYR,cAAc,CAACQ,CAAD,CAA1B;AACH;;AACD,SAAK,IAAIA,CAAT,IAAcF,OAAd,EAAuB;AACnB,UAAI,CAACN,cAAc,CAACZ,cAAf,CAA8BoB,CAA9B,CAAL,EAAuC;AACnC,cAAM,IAAInB,KAAJ,CAAU,0BAA0BmB,CAApC,CAAN;AACH;;AACDD,YAAM,CAACC,CAAD,CAAN,GAAYF,OAAO,CAACE,CAAD,CAAnB;AACH;;AACD,WAAOD,MAAP;AACH;;AAED,WAASE,eAAT,CAAyBC,GAAzB,EAA8BJ,OAA9B,EAAuC;AACnC,QAAIA,OAAO,CAACH,QAAZ,EAAsB;AAClB,aAAOO,GAAG,GAAG,IAAb;AACH,KAFD,MAEO;AACH,aAAOA,GAAP;AACH;AACJ;;AAED,WAASC,KAAT,CAAeC,KAAf,EAAsB;AAClB,WAAQ,QAAOA,KAAP,MAAiB,QAAlB,IACAA,KAAK,CAACxB,cAAN,CAAqB,MAArB,CADA,IAEAwB,KAAK,CAACxB,cAAN,CAAqB,SAArB,CAFA,IAGAwB,KAAK,CAACxB,cAAN,CAAqB,UAArB,CAHP;AAIH;AAED;;;;;;;;;;;AASA,WAASyB,WAAT,CAAqB3B,IAArB,EAA2B4B,IAA3B,EAAiC9B,UAAjC,EAA6CsB,OAA7C,EAAsD;AAClD,QAAIS,aAAa,GAAGV,YAAY,CAACC,OAAD,CAAhC;AACAU,eAAW,CAACC,MAAZ,CAAmB;AACf/B,UAAI,EAAEA,IADS;AAEf4B,UAAI,EAAEA,IAFS;AAGfI,aAAO,EAAE,iBAAUC,EAAV,EAAcC,KAAd,EAAqBC,MAArB,EAA6B;AAClC,YAAIC,SAAJ;AAAA,YACIC,WAAW,GAAI,SAAfA,WAAe,CAAUX,KAAV,EAAiB;AAC5B,cAAIG,aAAa,CAACX,cAAlB,EAAkC;AAC9B;AACA;AACA,gBAAI,QAAOQ,KAAK,CAAC3B,GAAb,MAAqB,QAAzB,EAAmC;AAC/B2B,mBAAK,CAAC3B,GAAN,CAAUO,OAAV,CAAkBuB,aAAa,CAAC,eAAD,CAA/B,IAAoDN,eAAe,CAACW,KAAD,CAAnE;AACAR,mBAAK,CAAC3B,GAAN,CAAUO,OAAV,CAAkBuB,aAAa,CAAC,gBAAD,CAA/B,IAAqDN,eAAe,CAACY,MAAD,CAApE;AACH;;AACDC,qBAAS,GAAGV,KAAZ;AACH;;AACDY,kBAAQ,CAACC,MAAT,CAAgB1C,OAAO,CAACC,UAAD,EAAa4B,KAAK,CAAC3B,GAAnB,CAAvB,EAAgDkC,EAAhD;AACH,SAZL;;AAaA,eAAO;AACHI,qBAAW,EAAEA,WADV;AAEHG,gBAAM,EAAE,gBAAUC,QAAV,EAAoBC,SAApB,EAA+B;AACnC,gBAAIb,aAAa,CAACX,cAAlB,EAAkC;AAC9BgB,mBAAK,GAAGO,QAAR;AACAN,oBAAM,GAAGO,SAAT;AACAL,yBAAW,CAACD,SAAD,CAAX;AACH;AACJ;AARE,SAAP;AAUH;AA3Bc,KAAnB;AA6BH;;AAED,SAAO;AACHT,eAAW,EAAEA,WADV;AAEH9B,WAAO,EAAEA,OAFN;AAGH8C,cAAU,EAAE;AACR7B,oBAAc,EAAEA,cADR;AAERK,kBAAY,EAAEA,YAFN;AAGRI,qBAAe,EAAEA,eAHT;AAIRE,WAAK,EAAEA;AAJC;AAHT,GAAP;AAUH,CAvHe,EAAhB,C","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","window.reactR = (function () {\r\n /**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\n function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n }\r\n\r\n var defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n };\r\n\r\n function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n }\r\n\r\n function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n }\r\n\r\n function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n }\r\n\r\n /**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\n function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n }\r\n\r\n return {\r\n reactWidget: reactWidget,\r\n hydrate: hydrate,\r\n __internal: {\r\n defaultOptions: defaultOptions,\r\n mergeOptions: mergeOptions,\r\n formatDimension: formatDimension,\r\n isTag: isTag\r\n }\r\n };\r\n})()"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.HTMLWidgets\"","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/* \r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component. \r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component, \r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /* \r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /* \r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget } from './widget';\r\nimport { reactInput } from './input'; \r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","import { widget } from 'htmlwidgets';\r\n\r\n/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.HTMLWidgets;","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 6994c7a..c727f38 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,13 +3,24 @@ const webpackConfig = require('./webpack.config.js'); module.exports = function (config) { config.set({ frameworks: ['mocha', 'chai', 'source-map-support'], - files: ['inst/www/react-tools/react-tools.js', 'js-tests/js-tests.jsx'], + files: ['srcjs/react-tools.js', 'js-tests/js-tests.jsx'], preprocessors: { 'js-tests/*.js': ['webpack'], - 'js-tests/*.jsx': ['webpack'] + 'js-tests/*.jsx': ['webpack'], + 'srcjs/*.js': ['webpack'] }, webpack: { - module: webpackConfig.module + module: webpackConfig.module, + externals: { + /** + * In tests, react and react-dom are provided internally. + * The following libraries are not part of the testing environment, + * but are provided here as external so that webpack builds. + **/ + 'jquery': 'window.jQuery', + 'shiny': 'window.Shiny', + 'htmlwidgets': 'window.HTMLWidgets' + } }, webpackMiddleware: { stats: 'errors-only' @@ -23,4 +34,4 @@ module.exports = function (config) { // singleRun: false, // Karma captures browsers, runs the tests and exits concurrency: Infinity }) -} +} diff --git a/man/createReactInput.Rd b/man/createReactInput.Rd index cdb7b04..7cd81d0 100644 --- a/man/createReactInput.Rd +++ b/man/createReactInput.Rd @@ -17,14 +17,14 @@ this input type in the browser.} supporting React. Must contain at least one dependency, that of the input's implementation.} -\item{configuration}{Static configuration data.} +\item{default}{Initial value.} -\item{container}{A function to generate an HTML element to contain the input.} +\item{configuration}{Static configuration data.} -\item{value}{Initial value.} +\item{container}{Function to generate an HTML element to contain the input.} } \value{ -A Shiny input suitable for inclusion in a UI. +Shiny input suitable for inclusion in a UI. } \description{ Create a React-based input diff --git a/srcjs/react-tools.js b/srcjs/react-tools.js index aafdb66..04ed9e1 100644 --- a/srcjs/react-tools.js +++ b/srcjs/react-tools.js @@ -1,120 +1,8 @@ -window.reactR = (function () { - /** - * Recursively transforms tag, a JSON representation of an instance of a - * React component and its children, into a React element suitable for - * passing to ReactDOM.render. - * @param {Object} components - * @param {Object} tag - */ - function hydrate(components, tag) { - if (typeof tag === 'string') return tag; - if (tag.name[0] === tag.name[0].toUpperCase() - && !components.hasOwnProperty(tag.name)) { - throw new Error("Unknown component: " + tag.name); - } - var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, - args = [elem, tag.attribs]; - for (var i = 0; i < tag.children.length; i++) { - args.push(hydrate(components, tag.children[i])); - } - return React.createElement.apply(React, args); - } - - var defaultOptions = { - // The name of the property on the root tag to use for the width, if - // it's updated. - widthProperty: "width", - // The name of the property on the root tag to use for the height, if - // it's updated. - heightProperty: "height", - // Whether or not to append the string 'px' to the width and height - // properties when they change. - appendPx: false, - // Whether or not to dynamically update the width and height properties - // of the last known tag when the computed width and height change in - // the browser. - renderOnResize: false - }; - - function mergeOptions(options) { - var merged = {}; - for (var k in defaultOptions) { - merged[k] = defaultOptions[k]; - } - for (var k in options) { - if (!defaultOptions.hasOwnProperty(k)) { - throw new Error("Unrecognized option: " + k); - } - merged[k] = options[k]; - } - return merged; - } - - function formatDimension(dim, options) { - if (options.appendPx) { - return dim + 'px'; - } else { - return dim; - } - } - - function isTag(value) { - return (typeof value === 'object') - && value.hasOwnProperty('name') - && value.hasOwnProperty('attribs') - && value.hasOwnProperty('children'); - } - - /** - * Creates an HTMLWidget that is updated by rendering a React component. - * React component constructors are made available by specifying them by - * name in the components object. - * @param {string} name - * @param {string} type - * @param {Object} components - * @param {Object} options - */ - function reactWidget(name, type, components, options) { - var actualOptions = mergeOptions(options); - HTMLWidgets.widget({ - name: name, - type: type, - factory: function (el, width, height) { - var lastValue, - renderValue = (function (value) { - if (actualOptions.renderOnResize) { - // value.tag might be a primitive string, in which - // case there is no attribs property. - if (typeof value.tag === 'object') { - value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); - value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); - } - lastValue = value; - } - ReactDOM.render(hydrate(components, value.tag), el); - }); - return { - renderValue: renderValue, - resize: function (newWidth, newHeight) { - if (actualOptions.renderOnResize) { - width = newWidth; - height = newHeight; - renderValue(lastValue); - } - } - }; - } - }) - } - - return { - reactWidget: reactWidget, - hydrate: hydrate, - __internal: { - defaultOptions: defaultOptions, - mergeOptions: mergeOptions, - formatDimension: formatDimension, - isTag: isTag - } - }; -})() \ No newline at end of file +import { reactWidget, hydrate } from './widget'; +import { reactInput } from './input'; + +window.reactR = { + reactInput: reactInput, + reactWidget: reactWidget, + hydrate: hydrate +}; diff --git a/webpack.config.js b/webpack.config.js index f452d79..2ff17a1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -22,7 +22,8 @@ module.exports = { 'react': 'window.React', 'react-dom': 'window.ReactDOM', 'jquery': 'window.jQuery', - 'shiny': 'window.Shiny' + 'shiny': 'window.Shiny', + 'htmlwidgets': 'window.HTMLWidgets' }, stats: { colors: true From ada6743357c2ee405357d83877be0f2687ad015c Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 13 Feb 2019 12:29:13 -0800 Subject: [PATCH 06/58] Reorganize JS: split into widget and input files Remove trailing whitespace --- NAMESPACE | 1 + R/reacttools.R | 10 +- inst/www/react-tools/react-tools.js | 479 ++++++++++++++++++------ inst/www/react-tools/react-tools.js.map | 2 +- karma.conf.js | 19 +- man/createReactInput.Rd | 8 +- srcjs/input.js | 10 +- srcjs/react-tools.js | 128 +------ webpack.config.js | 3 +- 9 files changed, 408 insertions(+), 252 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 14a93f4..7051c2c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ S3method("[[<-",react_component_builder) export(React) export(babel_transform) export(component) +export(createReactInput) export(html_dependency_corejs) export(html_dependency_react) export(html_dependency_reacttools) diff --git a/R/reacttools.R b/R/reacttools.R index bf27f92..243fb6f 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -97,24 +97,24 @@ reactMarkup <- function(tag) { #' @param inputId The \code{input} slot that will be used to access the value. #' @param class Space-delimited list of CSS class names that should identify #' this input type in the browser. -#' @param value Initial value. #' @param dependencies HTML dependencies to include in addition to those #' supporting React. Must contain at least one dependency, that of the input's #' implementation. +#' @param default Initial value. #' @param configuration Static configuration data. -#' @param container A function to generate an HTML element to contain the input. +#' @param container Function to generate an HTML element to contain the input. #' -#' @return A Shiny input suitable for inclusion in a UI. +#' @return Shiny input suitable for inclusion in a UI. #' @export #' -#' @examples createReactInput <- function(inputId, class, - value, dependencies, + default = NULL, configuration = list(), container = htmltools::tags$div) { if(length(dependencies) < 1) stop("Must include at least one HTML dependency.") + value <- restoreInput(id = inputId, default = default) htmltools::tagList( container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index ef3cc39..fe6db44 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -86,143 +86,398 @@ /************************************************************************/ /******/ ({ +/***/ "./srcjs/input.js": +/*!************************!*\ + !*** ./srcjs/input.js ***! + \************************/ +/*! exports provided: reactInput */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactInput", function() { return reactInput; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var shiny__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! shiny */ "shiny"); +/* harmony import */ var shiny__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(shiny__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jquery */ "jquery"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_3__); +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + + + + +/* + * This default receiveMessage implementation expects data to contain whole + * configuration and value properties. If either is present, it will be set and + * the component will be re-rendered. Because receiveMessage is typically used + * by input authors to perform incremental updates, this default implementation + * can be overriden by the user with the receiveMessage arguments to + * reactInput. + */ + +function defaultReceiveMessage(el, _ref) { + var configuration = _ref.configuration, + value = _ref.value; + var dirty = false; + + if (configuration !== undefined) { + this.setInputConfiguration(el, configuration); + dirty = true; + } + + if (value !== undefined) { + this.setInputValue(el, value); + dirty = true; + } + + if (dirty) { + this.getCallback(el)(); + this.render(el); + } +} + +var defaultOptions = { + receiveMessage: defaultReceiveMessage +}; +/** + * Installs a new Shiny input binding based on a React component. + * + * @param {string} selector - jQuery selector that should identify the set of + * container elements within the scope argument of Shiny.InputBinding.find. + * @param {string} name - A name such as 'acme.FooInput' that should uniquely + * identify the component. + * @param {Object} component - React Component, either class or function. + * @param {Object} options - Additional configuration options. Supported + * options are: + * - receiveMessage: Implementation of Shiny.InputBinding to use in place of + * the default. Typically overridden as an optimization to perform + * incremental value updates. + */ + +function reactInput(selector, name, component, options) { + options = Object.assign({}, defaultOptions, options); + shiny__WEBPACK_IMPORTED_MODULE_2___default.a.inputBindings.register(new ( + /*#__PURE__*/ + function (_Shiny$InputBinding) { + _inherits(_class, _Shiny$InputBinding); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "find", + + /* + * Methods override those in Shiny.InputBinding + */ + value: function find(scope) { + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(scope).find(selector); + } + }, { + key: "getValue", + value: function getValue(el) { + return this.getInputValue(el); + } + }, { + key: "setValue", + value: function setValue(el, value) { + this.setInputValue(el, value); + this.getCallback(el)(); + this.render(el); + } + }, { + key: "subscribe", + value: function subscribe(el, callback) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('callback', callback); + this.render(el); + } + }, { + key: "unsubscribe", + value: function unsubscribe(el, callback) {// TODO + } + }, { + key: "receiveMessage", + value: function receiveMessage(el, data) { + options.receiveMessage.call(this, el, data); + } + /* + * Methods not present in Shiny.InputBinding but accessible to users + * through `this` in receiveMessage + * */ + + }, { + key: "getInputValue", + value: function getInputValue(el) { + return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text()); + } + }, { + key: "setInputValue", + value: function setInputValue(el, value) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text(JSON.stringify(value)); + } + }, { + key: "getInputConfiguration", + value: function getInputConfiguration(el) { + return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text()); + } + }, { + key: "setInputConfiguration", + value: function setInputConfiguration(el, value) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text(JSON.stringify(value)); + } + }, { + key: "getCallback", + value: function getCallback(el) { + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('callback'); + } + }, { + key: "render", + value: function render(el) { + var element = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(component, { + configuration: this.getInputConfiguration(el), + value: this.getValue(el), + setValue: this.setValue.bind(this, el) + }); + react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render(element, el); + } + }]); + + return _class; + }(shiny__WEBPACK_IMPORTED_MODULE_2___default.a.InputBinding))(), name); +} + +/***/ }), + /***/ "./srcjs/react-tools.js": /*!******************************!*\ !*** ./srcjs/react-tools.js ***! \******************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _widget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./widget */ "./srcjs/widget.js"); +/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./input */ "./srcjs/input.js"); + + +window.reactR = { + reactInput: _input__WEBPACK_IMPORTED_MODULE_1__["reactInput"], + reactWidget: _widget__WEBPACK_IMPORTED_MODULE_0__["reactWidget"], + hydrate: hydrate +}; + +/***/ }), + +/***/ "./srcjs/widget.js": +/*!*************************!*\ + !*** ./srcjs/widget.js ***! + \*************************/ +/*! exports provided: hydrate, defaultOptions, mergeOptions, formatDimension, isTag, reactWidget */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hydrate", function() { return hydrate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultOptions", function() { return defaultOptions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeOptions", function() { return mergeOptions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatDimension", function() { return formatDimension; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTag", function() { return isTag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactWidget", function() { return reactWidget; }); +/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! htmlwidgets */ "htmlwidgets"); +/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -window.reactR = function () { - /** - * Recursively transforms tag, a JSON representation of an instance of a - * React component and its children, into a React element suitable for - * passing to ReactDOM.render. - * @param {Object} components - * @param {Object} tag - */ - function hydrate(components, tag) { - if (typeof tag === 'string') return tag; - - if (tag.name[0] === tag.name[0].toUpperCase() && !components.hasOwnProperty(tag.name)) { - throw new Error("Unknown component: " + tag.name); - } - var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, - args = [elem, tag.attribs]; +/** + * Recursively transforms tag, a JSON representation of an instance of a + * React component and its children, into a React element suitable for + * passing to ReactDOM.render. + * @param {Object} components + * @param {Object} tag + */ - for (var i = 0; i < tag.children.length; i++) { - args.push(hydrate(components, tag.children[i])); - } +function hydrate(components, tag) { + if (typeof tag === 'string') return tag; - return React.createElement.apply(React, args); + if (tag.name[0] === tag.name[0].toUpperCase() && !components.hasOwnProperty(tag.name)) { + throw new Error("Unknown component: " + tag.name); } - var defaultOptions = { - // The name of the property on the root tag to use for the width, if - // it's updated. - widthProperty: "width", - // The name of the property on the root tag to use for the height, if - // it's updated. - heightProperty: "height", - // Whether or not to append the string 'px' to the width and height - // properties when they change. - appendPx: false, - // Whether or not to dynamically update the width and height properties - // of the last known tag when the computed width and height change in - // the browser. - renderOnResize: false - }; - - function mergeOptions(options) { - var merged = {}; - - for (var k in defaultOptions) { - merged[k] = defaultOptions[k]; - } + var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, + args = [elem, tag.attribs]; - for (var k in options) { - if (!defaultOptions.hasOwnProperty(k)) { - throw new Error("Unrecognized option: " + k); - } + for (var i = 0; i < tag.children.length; i++) { + args.push(hydrate(components, tag.children[i])); + } - merged[k] = options[k]; - } + return React.createElement.apply(React, args); +} +var defaultOptions = { + // The name of the property on the root tag to use for the width, if + // it's updated. + widthProperty: "width", + // The name of the property on the root tag to use for the height, if + // it's updated. + heightProperty: "height", + // Whether or not to append the string 'px' to the width and height + // properties when they change. + appendPx: false, + // Whether or not to dynamically update the width and height properties + // of the last known tag when the computed width and height change in + // the browser. + renderOnResize: false +}; +function mergeOptions(options) { + var merged = {}; - return merged; + for (var k in defaultOptions) { + merged[k] = defaultOptions[k]; } - function formatDimension(dim, options) { - if (options.appendPx) { - return dim + 'px'; - } else { - return dim; + for (var k in options) { + if (!defaultOptions.hasOwnProperty(k)) { + throw new Error("Unrecognized option: " + k); } + + merged[k] = options[k]; } - function isTag(value) { - return _typeof(value) === 'object' && value.hasOwnProperty('name') && value.hasOwnProperty('attribs') && value.hasOwnProperty('children'); + return merged; +} +function formatDimension(dim, options) { + if (options.appendPx) { + return dim + 'px'; + } else { + return dim; } - /** - * Creates an HTMLWidget that is updated by rendering a React component. - * React component constructors are made available by specifying them by - * name in the components object. - * @param {string} name - * @param {string} type - * @param {Object} components - * @param {Object} options - */ - - - function reactWidget(name, type, components, options) { - var actualOptions = mergeOptions(options); - HTMLWidgets.widget({ - name: name, - type: type, - factory: function factory(el, width, height) { - var lastValue, - renderValue = function renderValue(value) { - if (actualOptions.renderOnResize) { - // value.tag might be a primitive string, in which - // case there is no attribs property. - if (_typeof(value.tag) === 'object') { - value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); - value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); - } - - lastValue = value; - } +} +function isTag(value) { + return _typeof(value) === 'object' && value.hasOwnProperty('name') && value.hasOwnProperty('attribs') && value.hasOwnProperty('children'); +} +/** + * Creates an HTMLWidget that is updated by rendering a React component. + * React component constructors are made available by specifying them by + * name in the components object. + * @param {string} name + * @param {string} type + * @param {Object} components + * @param {Object} options + */ - ReactDOM.render(hydrate(components, value.tag), el); - }; - - return { - renderValue: renderValue, - resize: function resize(newWidth, newHeight) { - if (actualOptions.renderOnResize) { - width = newWidth; - height = newHeight; - renderValue(lastValue); - } +function reactWidget(name, type, components, options) { + var actualOptions = mergeOptions(options); + Object(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__["widget"])({ + name: name, + type: type, + factory: function factory(el, width, height) { + var lastValue, + renderValue = function renderValue(value) { + if (actualOptions.renderOnResize) { + // value.tag might be a primitive string, in which + // case there is no attribs property. + if (_typeof(value.tag) === 'object') { + value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); + value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); } - }; - } - }); - } - return { - reactWidget: reactWidget, - hydrate: hydrate, - __internal: { - defaultOptions: defaultOptions, - mergeOptions: mergeOptions, - formatDimension: formatDimension, - isTag: isTag + lastValue = value; + } + + ReactDOM.render(hydrate(components, value.tag), el); + }; + + return { + renderValue: renderValue, + resize: function resize(newWidth, newHeight) { + if (actualOptions.renderOnResize) { + width = newWidth; + height = newHeight; + renderValue(lastValue); + } + } + }; } - }; -}(); + }); +} + +/***/ }), + +/***/ "htmlwidgets": +/*!*************************************!*\ + !*** external "window.HTMLWidgets" ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.HTMLWidgets; + +/***/ }), + +/***/ "jquery": +/*!********************************!*\ + !*** external "window.jQuery" ***! + \********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.jQuery; + +/***/ }), + +/***/ "react": +/*!*******************************!*\ + !*** external "window.React" ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.React; + +/***/ }), + +/***/ "react-dom": +/*!**********************************!*\ + !*** external "window.ReactDOM" ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.ReactDOM; + +/***/ }), + +/***/ "shiny": +/*!*******************************!*\ + !*** external "window.Shiny" ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = window.Shiny; /***/ }) diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index dff75c5..5cb1489 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/react-tools.js"],"names":["window","reactR","hydrate","components","tag","name","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","React","createElement","apply","defaultOptions","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","options","merged","k","formatDimension","dim","isTag","value","reactWidget","type","actualOptions","HTMLWidgets","widget","factory","el","width","height","lastValue","renderValue","ReactDOM","render","resize","newWidth","newHeight","__internal"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","window.reactR = (function () {\r\n /**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\n function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n }\r\n\r\n var defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n };\r\n\r\n function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n }\r\n\r\n function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n }\r\n\r\n function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n }\r\n\r\n /**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\n function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n }\r\n\r\n return {\r\n reactWidget: reactWidget,\r\n hydrate: hydrate,\r\n __internal: {\r\n defaultOptions: defaultOptions,\r\n mergeOptions: mergeOptions,\r\n formatDimension: formatDimension,\r\n isTag: isTag\r\n }\r\n };\r\n})()"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.HTMLWidgets\"","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/* \r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component. \r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component, \r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /* \r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /* \r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget } from './widget';\r\nimport { reactInput } from './input'; \r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","import { widget } from 'htmlwidgets';\r\n\r\n/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.HTMLWidgets;","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 6994c7a..c727f38 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,13 +3,24 @@ const webpackConfig = require('./webpack.config.js'); module.exports = function (config) { config.set({ frameworks: ['mocha', 'chai', 'source-map-support'], - files: ['inst/www/react-tools/react-tools.js', 'js-tests/js-tests.jsx'], + files: ['srcjs/react-tools.js', 'js-tests/js-tests.jsx'], preprocessors: { 'js-tests/*.js': ['webpack'], - 'js-tests/*.jsx': ['webpack'] + 'js-tests/*.jsx': ['webpack'], + 'srcjs/*.js': ['webpack'] }, webpack: { - module: webpackConfig.module + module: webpackConfig.module, + externals: { + /** + * In tests, react and react-dom are provided internally. + * The following libraries are not part of the testing environment, + * but are provided here as external so that webpack builds. + **/ + 'jquery': 'window.jQuery', + 'shiny': 'window.Shiny', + 'htmlwidgets': 'window.HTMLWidgets' + } }, webpackMiddleware: { stats: 'errors-only' @@ -23,4 +34,4 @@ module.exports = function (config) { // singleRun: false, // Karma captures browsers, runs the tests and exits concurrency: Infinity }) -} +} diff --git a/man/createReactInput.Rd b/man/createReactInput.Rd index cdb7b04..7cd81d0 100644 --- a/man/createReactInput.Rd +++ b/man/createReactInput.Rd @@ -17,14 +17,14 @@ this input type in the browser.} supporting React. Must contain at least one dependency, that of the input's implementation.} -\item{configuration}{Static configuration data.} +\item{default}{Initial value.} -\item{container}{A function to generate an HTML element to contain the input.} +\item{configuration}{Static configuration data.} -\item{value}{Initial value.} +\item{container}{Function to generate an HTML element to contain the input.} } \value{ -A Shiny input suitable for inclusion in a UI. +Shiny input suitable for inclusion in a UI. } \description{ Create a React-based input diff --git a/srcjs/input.js b/srcjs/input.js index 1c19d50..59f5c10 100644 --- a/srcjs/input.js +++ b/srcjs/input.js @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom'; import Shiny from 'shiny'; import $ from 'jquery'; -/* +/* * This default receiveMessage implementation expects data to contain whole * configuration and value properties. If either is present, it will be set and * the component will be re-rendered. Because receiveMessage is typically used @@ -32,7 +32,7 @@ const defaultOptions = { }; /** - * Installs a new Shiny input binding based on a React component. + * Installs a new Shiny input binding based on a React component. * * @param {string} selector - jQuery selector that should identify the set of * container elements within the scope argument of Shiny.InputBinding.find. @@ -47,12 +47,12 @@ const defaultOptions = { */ export function reactInput(selector, name, - component, + component, options) { options = Object.assign({}, defaultOptions, options); Shiny.inputBindings.register(new class extends Shiny.InputBinding { - /* + /* * Methods override those in Shiny.InputBinding */ @@ -78,7 +78,7 @@ export function reactInput(selector, options.receiveMessage.call(this, el, data); } - /* + /* * Methods not present in Shiny.InputBinding but accessible to users * through `this` in receiveMessage * */ diff --git a/srcjs/react-tools.js b/srcjs/react-tools.js index aafdb66..04ed9e1 100644 --- a/srcjs/react-tools.js +++ b/srcjs/react-tools.js @@ -1,120 +1,8 @@ -window.reactR = (function () { - /** - * Recursively transforms tag, a JSON representation of an instance of a - * React component and its children, into a React element suitable for - * passing to ReactDOM.render. - * @param {Object} components - * @param {Object} tag - */ - function hydrate(components, tag) { - if (typeof tag === 'string') return tag; - if (tag.name[0] === tag.name[0].toUpperCase() - && !components.hasOwnProperty(tag.name)) { - throw new Error("Unknown component: " + tag.name); - } - var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name, - args = [elem, tag.attribs]; - for (var i = 0; i < tag.children.length; i++) { - args.push(hydrate(components, tag.children[i])); - } - return React.createElement.apply(React, args); - } - - var defaultOptions = { - // The name of the property on the root tag to use for the width, if - // it's updated. - widthProperty: "width", - // The name of the property on the root tag to use for the height, if - // it's updated. - heightProperty: "height", - // Whether or not to append the string 'px' to the width and height - // properties when they change. - appendPx: false, - // Whether or not to dynamically update the width and height properties - // of the last known tag when the computed width and height change in - // the browser. - renderOnResize: false - }; - - function mergeOptions(options) { - var merged = {}; - for (var k in defaultOptions) { - merged[k] = defaultOptions[k]; - } - for (var k in options) { - if (!defaultOptions.hasOwnProperty(k)) { - throw new Error("Unrecognized option: " + k); - } - merged[k] = options[k]; - } - return merged; - } - - function formatDimension(dim, options) { - if (options.appendPx) { - return dim + 'px'; - } else { - return dim; - } - } - - function isTag(value) { - return (typeof value === 'object') - && value.hasOwnProperty('name') - && value.hasOwnProperty('attribs') - && value.hasOwnProperty('children'); - } - - /** - * Creates an HTMLWidget that is updated by rendering a React component. - * React component constructors are made available by specifying them by - * name in the components object. - * @param {string} name - * @param {string} type - * @param {Object} components - * @param {Object} options - */ - function reactWidget(name, type, components, options) { - var actualOptions = mergeOptions(options); - HTMLWidgets.widget({ - name: name, - type: type, - factory: function (el, width, height) { - var lastValue, - renderValue = (function (value) { - if (actualOptions.renderOnResize) { - // value.tag might be a primitive string, in which - // case there is no attribs property. - if (typeof value.tag === 'object') { - value.tag.attribs[actualOptions["widthProperty"]] = formatDimension(width); - value.tag.attribs[actualOptions["heightProperty"]] = formatDimension(height); - } - lastValue = value; - } - ReactDOM.render(hydrate(components, value.tag), el); - }); - return { - renderValue: renderValue, - resize: function (newWidth, newHeight) { - if (actualOptions.renderOnResize) { - width = newWidth; - height = newHeight; - renderValue(lastValue); - } - } - }; - } - }) - } - - return { - reactWidget: reactWidget, - hydrate: hydrate, - __internal: { - defaultOptions: defaultOptions, - mergeOptions: mergeOptions, - formatDimension: formatDimension, - isTag: isTag - } - }; -})() \ No newline at end of file +import { reactWidget, hydrate } from './widget'; +import { reactInput } from './input'; + +window.reactR = { + reactInput: reactInput, + reactWidget: reactWidget, + hydrate: hydrate +}; diff --git a/webpack.config.js b/webpack.config.js index f452d79..2ff17a1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -22,7 +22,8 @@ module.exports = { 'react': 'window.React', 'react-dom': 'window.ReactDOM', 'jquery': 'window.jQuery', - 'shiny': 'window.Shiny' + 'shiny': 'window.Shiny', + 'htmlwidgets': 'window.HTMLWidgets' }, stats: { colors: true From f1d9963035ee8c7efa95fe62ab76e3bb0f493409 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Fri, 22 Feb 2019 14:31:12 -0800 Subject: [PATCH 07/58] Refactor scaffold code to prepare for input scaffold --- R/reacttools.R | 6 +- R/scaffold.R | 146 ++++++++++----------------------- R/scaffold_utils.R | 40 +++++++++ inst/templates/widget_yaml.txt | 7 ++ 4 files changed, 95 insertions(+), 104 deletions(-) create mode 100644 R/scaffold_utils.R create mode 100644 inst/templates/widget_yaml.txt diff --git a/R/reacttools.R b/R/reacttools.R index 243fb6f..49cb5aa 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -119,10 +119,12 @@ createReactInput <- function(inputId, container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), type = "application/json", - shiny:::toJSON(value)), + # TODO Determine right toJSON to use here. + jsonlite::toJSON(value, auto_unbox = TRUE)), htmltools::tags$script(id = sprintf("%s_configuration", inputId), type = "application/json", - shiny:::toJSON(configuration)), + # TODO Determine right toJSON to use here. + jsonlite::toJSON(configuration, auto_unbox = TRUE)), html_dependency_react(), html_dependency_reacttools(), dependencies diff --git a/R/scaffold.R b/R/scaffold.R index 1a98bcf..af71bb2 100644 --- a/R/scaffold.R +++ b/R/scaffold.R @@ -41,123 +41,65 @@ scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ message("To build JavaScript run: yarn run webpack --mode=development") } -toDepJSON <- function(npmPkgs) { - if (is.null(npmPkgs)) { - "" - } else if (!length(names(npmPkgs))) { - stop("Must specify npm package names in the names attributes of npmPkgs") - } else { - paste0(sprintf('"%s": "%s"', names(npmPkgs), npmPkgs), collapse = ",\n") - } -} - -slurp <- function(file) { - paste(readLines( - system.file(file, package = 'reactR') - ), collapse = "\n") -} - -# Perform a series of pattern replacements on str. -# Example: renderTemplate("foo ${x} bar ${y} baz ${x}", list(x = 1, y = 2)) -# Produces: "foo 1 bar 2 baz 1" -renderTemplate <- function(str, substitutions) { - Reduce(function(str, name) { - gsub(paste0("\\$\\{", name, "\\}"), substitutions[[name]], str) - }, names(substitutions), str) -} - -capName = function(name){ - paste0(toupper(substring(name, 1, 1)), substring(name, 2)) -} - addWidgetConstructor <- function(name, package, edit){ - tpl <- slurp('templates/widget_r.txt') - if (!file.exists(file_ <- sprintf("R/%s.R", name))){ - cat( - renderTemplate(tpl, list(name = name, package = package, capName = capName(name))), - file = file_ + file <- renderFile( + sprintf("R/%s.R", name), + "templates/widget_r.txt", + "boilerplate for widget constructor", + list( + name = name, + package = package, + capName = capitalize(name) ) - message('Created boilerplate for widget constructor ', file_) - } else { - message(file_, " already exists") - } - if (edit) fileEdit(file_) + ) + if (edit) file.edit(file) } addWidgetYAML <- function(name, edit){ - tpl <- "# (uncomment to add a dependency) -# dependencies: -# - name: -# version: -# src: -# script: -# stylesheet: -" - if (!file.exists('inst/htmlwidgets')){ - dir.create('inst/htmlwidgets') - } - if (!file.exists(file_ <- sprintf('inst/htmlwidgets/%s.yaml', name))){ - cat(tpl, file = file_) - message('Created boilerplate for widget dependencies at ', - sprintf('inst/htmlwidgets/%s.yaml', name) - ) - } else { - message(file_, " already exists") - } - if (edit) fileEdit(file_) + file <- renderFile( + sprintf('inst/htmlwidgets/%s.yaml', name), + "templates/widget_yaml.txt", + "boilerplate for widget dependencies" + ) + if (edit) file.edit(file) } addPackageJSON <- function(npmPkgs) { - tpl <- renderTemplate(slurp('templates/widget_package.json.txt'), list(npmPkgs = npmPkgs)) - if (!file.exists('package.json')) { - cat(tpl, file = 'package.json') - message('Created package.json') - } else { - message("package.json already exists") - } + renderFile( + 'package.json', + 'templates/widget_package.json.txt', + 'project metadata', + list(npmPkgs = npmPkgs) + ) } addWebpackConfig <- function(name) { - tpl <- renderTemplate(slurp('templates/widget_webpack.config.js.txt'), list(name = name)) - if (!file.exists('webpack.config.js')) { - cat(tpl, file = 'webpack.config.js') - message('Created webpack.config.js') - } else { - message("webpack.config.js already exists") - } + renderFile( + 'webpack.config.js', + 'templates/widget_webpack.config.js.txt', + 'webpack configuration', + list(name = name) + ) } addWidgetJS <- function(name, edit){ - tpl <- paste(readLines( - system.file('templates/widget_js.txt', package = 'reactR') - ), collapse = "\n") - if (!file.exists('srcjs')){ - dir.create('srcjs') - } - if (!file.exists(file_ <- sprintf('srcjs/%s.js', name))){ - cat(renderTemplate(tpl, list(name = name)), file = file_) - message('Created boilerplate for widget javascript bindings at ', - sprintf('srcjs/%s.js', name) - ) - } else { - message(file_, " already exists") - } - if (edit) fileEdit(file_) + file <- renderFile( + sprintf('srcjs/%s.js', name), + 'templates/widget_js.txt', + 'boilerplate for widget JavaScript bindings', + list(name = name) + ) + if (edit) file.edit(file) } addExampleApp <- function(name) { - tpl <- renderTemplate(slurp('templates/widget_app.R.txt'), list(name = name, capName = capName(name))) - if (!file.exists('app.R')) { - cat(tpl, file = 'app.R') - message('Created example app.R') - } else { - message("app.R already exists") - } -} - -# invoke file.edit in a way that will bind to the RStudio editor -# when running inside RStudio -fileEdit <- function(file) { - fileEditFunc <- eval(parse(text = "file.edit"), envir = globalenv()) - fileEditFunc(file) + renderFile( + 'app.R', + 'templates/widget_app.R.txt', + 'example app', + list( + name = name, + capName = capitalize(name) + ) + ) } diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R new file mode 100644 index 0000000..49146ce --- /dev/null +++ b/R/scaffold_utils.R @@ -0,0 +1,40 @@ + +slurp <- function(file) { + paste(readLines( + system.file(file, package = 'reactR') + ), collapse = "\n") +} + +# Perform a series of pattern replacements on str. +# Example: renderTemplate("foo ${x} bar ${y} baz ${x}", list(x = 1, y = 2)) +# Produces: "foo 1 bar 2 baz 1" +renderTemplate <- function(str, substitutions) { + Reduce(function(str, name) { + gsub(paste0("\\$\\{", name, "\\}"), substitutions[[name]], str) + }, names(substitutions), str) +} + +capitalize <- function(s) { + gsub("^(.)", perl = TRUE, replacement = '\\U\\1', s) +} + +toDepJSON <- function(npmPkgs) { + if (is.null(npmPkgs)) { + "" + } else if (!length(names(npmPkgs))) { + stop("Must specify npm package names in the names attributes of npmPkgs") + } else { + paste0(sprintf('"%s": "%s"', names(npmPkgs), npmPkgs), collapse = ",\n") + } +} + +renderFile <- function(outputFile, templateFile, description = '', substitutions = list()) { + if (!file.exists(outputFile)) { + dir.create(dirname(outputFile), recursive = TRUE) + cat(renderTemplate(slurp(templateFile), substitutions), file = outputFile) + message("Created ", description, " ", outputFile) + } else { + message(outputFile, " already exists") + } + outputFile +} diff --git a/inst/templates/widget_yaml.txt b/inst/templates/widget_yaml.txt new file mode 100644 index 0000000..a724f4a --- /dev/null +++ b/inst/templates/widget_yaml.txt @@ -0,0 +1,7 @@ +# (uncomment to add a dependency) +# dependencies: +# - name: +# version: +# src: +# script: +# stylesheet: From 3443182f752ec8ddd65ea228ba8b5e92ce5a4e79 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 06:17:25 -0800 Subject: [PATCH 08/58] Comment renderFile --- R/scaffold_utils.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 49146ce..1f1d774 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -28,6 +28,7 @@ toDepJSON <- function(npmPkgs) { } } +# Wraps renderTemplate for convenient use from scaffold functions. renderFile <- function(outputFile, templateFile, description = '', substitutions = list()) { if (!file.exists(outputFile)) { dir.create(dirname(outputFile), recursive = TRUE) From 79e9cf28a4e81dfef9f4ce1fc9a0f8fa59f16b6f Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 06:19:36 -0800 Subject: [PATCH 09/58] Depend formally on jsonlite via Suggests, dep should normally be provided by shiny --- DESCRIPTION | 3 ++- R/reacttools.R | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2672e03..07a879d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -39,6 +39,7 @@ Suggests: shiny, V8, knitr, - usethis + usethis, + jsonlite RoxygenNote: 6.1.1 VignetteBuilder: knitr diff --git a/R/reacttools.R b/R/reacttools.R index 49cb5aa..8fca9d0 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -119,12 +119,10 @@ createReactInput <- function(inputId, container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), type = "application/json", - # TODO Determine right toJSON to use here. - jsonlite::toJSON(value, auto_unbox = TRUE)), + jsonlite::toJSON(value, auto_unbox = FALSE)), htmltools::tags$script(id = sprintf("%s_configuration", inputId), type = "application/json", - # TODO Determine right toJSON to use here. - jsonlite::toJSON(configuration, auto_unbox = TRUE)), + jsonlite::toJSON(configuration, auto_unbox = FALSE)), html_dependency_react(), html_dependency_reacttools(), dependencies From 0315b2732b28162752af341f7a204bcfe1396f20 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 06:20:08 -0800 Subject: [PATCH 10/58] Qualify calls to file.edit and restoreInput to satisfy R CMD check --- R/reacttools.R | 2 +- R/scaffold.R | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/reacttools.R b/R/reacttools.R index 8fca9d0..b098049 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -114,7 +114,7 @@ createReactInput <- function(inputId, configuration = list(), container = htmltools::tags$div) { if(length(dependencies) < 1) stop("Must include at least one HTML dependency.") - value <- restoreInput(id = inputId, default = default) + value <- shiny::restoreInput(id = inputId, default = default) htmltools::tagList( container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), diff --git a/R/scaffold.R b/R/scaffold.R index af71bb2..3568b69 100644 --- a/R/scaffold.R +++ b/R/scaffold.R @@ -52,7 +52,7 @@ addWidgetConstructor <- function(name, package, edit){ capName = capitalize(name) ) ) - if (edit) file.edit(file) + if (edit) utils::file.edit(file) } addWidgetYAML <- function(name, edit){ @@ -61,7 +61,7 @@ addWidgetYAML <- function(name, edit){ "templates/widget_yaml.txt", "boilerplate for widget dependencies" ) - if (edit) file.edit(file) + if (edit) utils::file.edit(file) } addPackageJSON <- function(npmPkgs) { @@ -89,7 +89,7 @@ addWidgetJS <- function(name, edit){ 'boilerplate for widget JavaScript bindings', list(name = name) ) - if (edit) file.edit(file) + if (edit) utils::file.edit(file) } addExampleApp <- function(name) { From 7c632285d2b120994f46d68ded5695c2ac92b943 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 06:22:53 -0800 Subject: [PATCH 11/58] Sort, reorganize, fix .Rbuildignore and .gitignore --- .Rbuildignore | 25 ++++++++++++++----------- .gitignore | 2 ++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index 2d8f627..caf138c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,17 +1,20 @@ -^node_modules$ -^js-tests$ -^pkgdown$ -^assets$ +^Meta$ +^doc$ ^.*\.Rproj$ -^\.Rproj\.user$ -^\build ^CONDUCT\.md$ -^cran-comments\.md$ -^docs$ +^README\.Rmd$ +^\.Rproj\.user$ ^\.travis\.yml$ -^\assets +^assets +^build +^docs +^js-tests +^node_modules +^pkgdown +^srcjs +^cran-comments\.md$ ^karma\.conf\.js$ +^logo.svg$ ^package\.json$ +^webpack.config.js$ ^yarn\.lock$ -^README\.Rmd$ -logo.svg diff --git a/.gitignore b/.gitignore index 63e58fe..2797210 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +Meta +doc .Rproj.user .Rhistory .RData From 66d5dbba3af06ccc7ff67ec65cb0d09d3e294e9a Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 14:12:47 -0800 Subject: [PATCH 12/58] Complete scaffold refactor --- R/{scaffold.R => scaffold_widget.R} | 0 man/scaffoldReactWidget.Rd | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) rename R/{scaffold.R => scaffold_widget.R} (100%) diff --git a/R/scaffold.R b/R/scaffold_widget.R similarity index 100% rename from R/scaffold.R rename to R/scaffold_widget.R diff --git a/man/scaffoldReactWidget.Rd b/man/scaffoldReactWidget.Rd index 4b8fb1c..0017d9f 100644 --- a/man/scaffoldReactWidget.Rd +++ b/man/scaffoldReactWidget.Rd @@ -1,12 +1,24 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/scaffold.R +% Please edit documentation in R/scaffold_input.R, R/scaffold_widget.R \name{scaffoldReactWidget} \alias{scaffoldReactWidget} -\title{Create implementation scaffolding for a React.js-based HTML widget} +\title{Create implementation scaffolding for a React.js-based Shiny input.} \usage{ +scaffoldReactWidget(name, npmPkgs = NULL, edit = interactive()) + scaffoldReactWidget(name, npmPkgs = NULL, edit = interactive()) } \arguments{ +\item{name}{Name of input} + +\item{npmPkgs}{Optional \href{https://npmjs.com/}{NPM} packages upon which +this input is based which will be used to populate \code{package.json}. +Should be a named list of names to +\href{https://docs.npmjs.com/files/package.json#dependencies}{versions}.} + +\item{edit}{Automatically open the input's JavaScript source file after +creating the scaffolding.} + \item{name}{Name of widget} \item{npmPkgs}{Optional \href{https://npmjs.com/}{NPM} packages upon which @@ -18,10 +30,16 @@ Should be a named list of names to creating the scaffolding.} } \description{ +Add the minimal code required to implement a React.js-based Shiny input to an +R package. + Add the minimal code required to implement a React.js-based HTML widget to an R package. } \note{ +This function must be executed from the root directory of the package + you wish to add the input to. + This function must be executed from the root directory of the package you wish to add the widget to. } From 1034c7715b8c61a2fe24ba6846b9d9202ec11bb0 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 14:57:28 -0800 Subject: [PATCH 13/58] Small improvements to widgets vignette --- vignettes/intro_htmlwidgets.Rmd | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vignettes/intro_htmlwidgets.Rmd b/vignettes/intro_htmlwidgets.Rmd index 107033f..7a6d291 100644 --- a/vignettes/intro_htmlwidgets.Rmd +++ b/vignettes/intro_htmlwidgets.Rmd @@ -49,7 +49,7 @@ usethis::create_package("~/sparklines") # Inject the widget templating withr::with_dir( "~/sparklines", - reactR::scaffoldReactWidget("sparklines", list("react-sparklines" = "^1.7.0")) + reactR::scaffoldReactWidget("sparklines", list("react-sparklines" = "^1.7.0"), edit = FALSE) ) ``` @@ -101,6 +101,8 @@ At this point, we've built some scaffolding for an htmlwidget powered by React. ### First, outline an interface +> Note that the examples in this section are just to demonstrate API possibilities and need not be pasted into any file. + Consider the following example taken from the [react-sparklines documentation](http://borisyankov.github.io/react-sparklines/). ```js @@ -182,7 +184,7 @@ sparklines <- function(data, ..., width = NULL, height = NULL) { } ``` -At this point, we define functions that make it easy for the user to create the other components by adding these to `R/reactSparklines.R` +At this point, we define functions that make it easy for the user to create the other components by adding these to `R/sparklines.R` ```{r} #' @export From ec1ee1b8003eacb3c7c8fc95e1592f72662f08a8 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 14:57:49 -0800 Subject: [PATCH 14/58] Use development mode in webpack in scaffolded projects --- inst/templates/widget_webpack.config.js.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/inst/templates/widget_webpack.config.js.txt b/inst/templates/widget_webpack.config.js.txt index 4161d75..edb9e63 100644 --- a/inst/templates/widget_webpack.config.js.txt +++ b/inst/templates/widget_webpack.config.js.txt @@ -1,6 +1,7 @@ var path = require('path'); module.exports = { + mode: 'development', entry: path.join(__dirname, 'srcjs', '${name}.js'), output: { path: path.join(__dirname, 'inst', 'htmlwidgets'), From 523a59bdd42d8f27130a669b1de7c25beaca5e33 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 14:59:13 -0800 Subject: [PATCH 15/58] Bring back fileEdit to open files properly in RStudio --- R/scaffold_utils.R | 8 +++++++- R/scaffold_widget.R | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 1f1d774..d10fae9 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -1,10 +1,16 @@ - slurp <- function(file) { paste(readLines( system.file(file, package = 'reactR') ), collapse = "\n") } +# invoke file.edit in a way that will bind to the RStudio editor +# when running inside RStudio +fileEdit <- function(file) { + fileEditFunc <- eval(parse(text = "file.edit"), envir = globalenv()) + fileEditFunc(file) +} + # Perform a series of pattern replacements on str. # Example: renderTemplate("foo ${x} bar ${y} baz ${x}", list(x = 1, y = 2)) # Produces: "foo 1 bar 2 baz 1" diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 3568b69..3047e09 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -52,7 +52,7 @@ addWidgetConstructor <- function(name, package, edit){ capName = capitalize(name) ) ) - if (edit) utils::file.edit(file) + if (edit) fileEdit(file) } addWidgetYAML <- function(name, edit){ @@ -61,7 +61,7 @@ addWidgetYAML <- function(name, edit){ "templates/widget_yaml.txt", "boilerplate for widget dependencies" ) - if (edit) utils::file.edit(file) + if (edit) fileEdit(file) } addPackageJSON <- function(npmPkgs) { @@ -89,7 +89,7 @@ addWidgetJS <- function(name, edit){ 'boilerplate for widget JavaScript bindings', list(name = name) ) - if (edit) utils::file.edit(file) + if (edit) fileEdit(file) } addExampleApp <- function(name) { From 972bbe3b0ac63d283becbf599a97114e800aee75 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 15:00:31 -0800 Subject: [PATCH 16/58] Don't show warnings in scaffold when dir.create --- R/scaffold_utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index d10fae9..8055135 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -37,7 +37,7 @@ toDepJSON <- function(npmPkgs) { # Wraps renderTemplate for convenient use from scaffold functions. renderFile <- function(outputFile, templateFile, description = '', substitutions = list()) { if (!file.exists(outputFile)) { - dir.create(dirname(outputFile), recursive = TRUE) + dir.create(dirname(outputFile), recursive = TRUE, showWarnings = FALSE) cat(renderTemplate(slurp(templateFile), substitutions), file = outputFile) message("Created ", description, " ", outputFile) } else { From 0a0db7eca60227d702ffca6315847e007bd10c7c Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 15:00:58 -0800 Subject: [PATCH 17/58] Fix .Rbuildignore entry generation in scaffold --- R/scaffold_utils.R | 6 ++++++ R/scaffold_widget.R | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 8055135..9f3cbec 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -45,3 +45,9 @@ renderFile <- function(outputFile, templateFile, description = '', substitutions } outputFile } + +# Workaround for https://github.com/r-lib/usethis/issues/643, otherwise would +# use usethis::use_build_ignore +buildIgnoreDirs <- function(dirs) { + usethis::write_union(".Rbuildignore", paste0("^", dirs)) +} diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 3047e09..6e7a073 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -33,7 +33,7 @@ scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ addWidgetJS(name, edit) addExampleApp(name) - usethis::use_build_ignore(c("node_modules", "srcjs")) + buildIgnoreDirs(c("node_modules", "srcjs")) usethis::use_git_ignore(c("node_modules")) lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) From 0c2100b8e3455c862512699c05ba76e77c98d380 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 15:33:24 -0800 Subject: [PATCH 18/58] Bring back usethis::use_build_ignore --- R/scaffold_utils.R | 5 ----- R/scaffold_widget.R | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 9f3cbec..4159cbc 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -46,8 +46,3 @@ renderFile <- function(outputFile, templateFile, description = '', substitutions outputFile } -# Workaround for https://github.com/r-lib/usethis/issues/643, otherwise would -# use usethis::use_build_ignore -buildIgnoreDirs <- function(dirs) { - usethis::write_union(".Rbuildignore", paste0("^", dirs)) -} diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 6e7a073..3047e09 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -33,7 +33,7 @@ scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ addWidgetJS(name, edit) addExampleApp(name) - buildIgnoreDirs(c("node_modules", "srcjs")) + usethis::use_build_ignore(c("node_modules", "srcjs")) usethis::use_git_ignore(c("node_modules")) lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) From 6c2414c598841cbfdfba8bf2d06be26c296658e5 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 15:47:09 -0800 Subject: [PATCH 19/58] Remove unnecessary dir.create from widget scaffold --- R/scaffold_widget.R | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 3047e09..5395792 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -22,9 +22,7 @@ scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ call. = F ) } - if (!file.exists('inst')){ - dir.create('inst') - } + package <- read.dcf('DESCRIPTION')[[1,"Package"]] addWidgetConstructor(name, package, edit) addWidgetYAML(name, edit) From 6c7940c59a28963cd7b00b7068b14c1e027a765a Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Tue, 26 Feb 2019 16:00:32 -0800 Subject: [PATCH 20/58] WIP input scaffold --- R/scaffold_input.R | 52 ++++++++++++++++++++++++++++++++++++++ inst/templates/input_r.txt | 26 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 R/scaffold_input.R create mode 100644 inst/templates/input_r.txt diff --git a/R/scaffold_input.R b/R/scaffold_input.R new file mode 100644 index 0000000..bdc6cef --- /dev/null +++ b/R/scaffold_input.R @@ -0,0 +1,52 @@ +#' Create implementation scaffolding for a React.js-based Shiny input. +#' +#' Add the minimal code required to implement a React.js-based Shiny input to an +#' R package. +#' +#' @param name Name of input +#' @param npmPkgs Optional \href{https://npmjs.com/}{NPM} packages upon which +#' this input is based which will be used to populate \code{package.json}. +#' Should be a named list of names to +#' \href{https://docs.npmjs.com/files/package.json#dependencies}{versions}. +#' @param edit Automatically open the input's source files after creating the +#' scaffolding. +#' +#' @note This function must be executed from the root directory of the package +#' you wish to add the input to. +#' +#' @export +scaffoldReactInput <- function(name, npmPkgs = NULL, edit = interactive()) { + if (!file.exists('DESCRIPTION')){ + stop( + "You need to create a package to house your widget first!", + call. = F + ) + } + + package <- read.dcf('DESCRIPTION')[[1,"Package"]] + + # Add input constructor + renderFile( + sprintf("R/%s.R", name), + "templates/input_r.txt", + "boilerplate for input constructor", + list( + name = name, + package = package, + capName = capitalize(name) + ) + ) + # addInputConstructor(name, package, edit) + # addInputJSON(toDepJSON(npmPkgs)) + # addWebpackConfig(name) + # addWidgetJS(name, edit) + # addExampleApp(name) + # + # usethis::use_build_ignore(c("node_modules", "srcjs")) + # usethis::use_git_ignore(c("node_modules")) + # lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) + # + # message("To install dependencies from npm run: yarn install") + # message("To build JavaScript run: yarn run webpack --mode=development") +} + diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt new file mode 100644 index 0000000..7aa9d55 --- /dev/null +++ b/inst/templates/input_r.txt @@ -0,0 +1,26 @@ +#' +#' +#' +#' +#' @importFrom shiny restoreInput +#' @importFrom reactR createReactInput +#' @importFrom htmltools htmlDependency tags +#' +#' @export +${name}Input <- function(inputId, default = "") { + value <- restoreInput(id = inputId, default = default) + createReactInput( + inputId, + "${name}", + htmlDependency( + name = "${name}-input", + version = "1.0.0", + src = "www/${name}", + package = "${name}", + script = "${name}.js" + ), + value, + list(), + tags$span + ) +} From b48c208a3be3a05519630bc507d54afbaecdb559 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 27 Feb 2019 14:47:11 -0800 Subject: [PATCH 21/58] webpack --- inst/www/react-tools/react-tools.js | 12 ++++++------ inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index fe6db44..897457b 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -126,7 +126,7 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || func -/* +/* * This default receiveMessage implementation expects data to contain whole * configuration and value properties. If either is present, it will be set and * the component will be re-rendered. Because receiveMessage is typically used @@ -160,7 +160,7 @@ var defaultOptions = { receiveMessage: defaultReceiveMessage }; /** - * Installs a new Shiny input binding based on a React component. + * Installs a new Shiny input binding based on a React component. * * @param {string} selector - jQuery selector that should identify the set of * container elements within the scope argument of Shiny.InputBinding.find. @@ -190,7 +190,7 @@ function reactInput(selector, name, component, options) { _createClass(_class, [{ key: "find", - /* + /* * Methods override those in Shiny.InputBinding */ value: function find(scope) { @@ -223,7 +223,7 @@ function reactInput(selector, name, component, options) { value: function receiveMessage(el, data) { options.receiveMessage.call(this, el, data); } - /* + /* * Methods not present in Shiny.InputBinding but accessible to users * through `this` in receiveMessage * */ @@ -287,7 +287,7 @@ __webpack_require__.r(__webpack_exports__); window.reactR = { reactInput: _input__WEBPACK_IMPORTED_MODULE_1__["reactInput"], reactWidget: _widget__WEBPACK_IMPORTED_MODULE_0__["reactWidget"], - hydrate: hydrate + hydrate: _widget__WEBPACK_IMPORTED_MODULE_0__["hydrate"] }; /***/ }), @@ -390,7 +390,7 @@ function isTag(value) { function reactWidget(name, type, components, options) { var actualOptions = mergeOptions(options); - Object(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__["widget"])({ + htmlwidgets__WEBPACK_IMPORTED_MODULE_0___default.a.widget({ name: name, type: type, factory: function factory(el, width, height) { diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index 5cb1489..a83b341 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.HTMLWidgets\"","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/* \r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component. \r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component, \r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /* \r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /* \r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget } from './widget';\r\nimport { reactInput } from './input'; \r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","import { widget } from 'htmlwidgets';\r\n\r\n/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.HTMLWidgets;","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.HTMLWidgets\"","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","import HTMLWidgets from 'htmlwidgets';\r\n\r\n/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.HTMLWidgets;","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From 2602d414944d1ab8f64af5253c3c1793a020b3e6 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 27 Feb 2019 14:47:58 -0800 Subject: [PATCH 22/58] Working input scaffold; dedup package.json and webpack templates --- NAMESPACE | 1 + R/reacttools.R | 4 +- R/scaffold_input.R | 72 ++++++++++++------- R/scaffold_utils.R | 6 ++ R/scaffold_widget.R | 17 ++--- inst/templates/input_app.R.txt | 16 +++++ inst/templates/input_js.txt | 7 ++ inst/templates/input_r.txt | 4 +- ...dget_package.json.txt => package.json.txt} | 0 ...ck.config.js.txt => webpack.config.js.txt} | 7 +- man/scaffoldReactInput.Rd | 27 +++++++ man/scaffoldReactWidget.Rd | 22 +----- 12 files changed, 122 insertions(+), 61 deletions(-) create mode 100644 inst/templates/input_app.R.txt create mode 100644 inst/templates/input_js.txt rename inst/templates/{widget_package.json.txt => package.json.txt} (100%) rename inst/templates/{widget_webpack.config.js.txt => webpack.config.js.txt} (71%) create mode 100644 man/scaffoldReactInput.Rd diff --git a/NAMESPACE b/NAMESPACE index 7051c2c..d2e5d3a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -12,5 +12,6 @@ export(html_dependency_corejs) export(html_dependency_react) export(html_dependency_reacttools) export(reactMarkup) +export(scaffoldReactInput) export(scaffoldReactWidget) importFrom(htmltools,htmlDependency) diff --git a/R/reacttools.R b/R/reacttools.R index b098049..7feb472 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -119,10 +119,10 @@ createReactInput <- function(inputId, container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), type = "application/json", - jsonlite::toJSON(value, auto_unbox = FALSE)), + jsonlite::toJSON(value, auto_unbox = TRUE)), htmltools::tags$script(id = sprintf("%s_configuration", inputId), type = "application/json", - jsonlite::toJSON(configuration, auto_unbox = FALSE)), + jsonlite::toJSON(configuration, auto_unbox = TRUE)), html_dependency_react(), html_dependency_reacttools(), dependencies diff --git a/R/scaffold_input.R b/R/scaffold_input.R index bdc6cef..fb826fb 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -16,37 +16,61 @@ #' #' @export scaffoldReactInput <- function(name, npmPkgs = NULL, edit = interactive()) { - if (!file.exists('DESCRIPTION')){ - stop( - "You need to create a package to house your widget first!", - call. = F - ) - } - - package <- read.dcf('DESCRIPTION')[[1,"Package"]] + package <- getPackage() - # Add input constructor - renderFile( + file <- renderFile( sprintf("R/%s.R", name), "templates/input_r.txt", "boilerplate for input constructor", list( name = name, - package = package, - capName = capitalize(name) + package = package + ) + ) + if (edit) fileEdit(file) + + renderFile( + 'package.json', + 'templates/package.json.txt', + 'project metadata', + list(npmPkgs = toDepJSON(npmPkgs)) + ) + + renderFile( + 'webpack.config.js', + 'templates/webpack.config.js.txt', + 'webpack configuration', + list( + name = name, + outputPath = sprintf("inst/www/%s/%s", package, name) + ) + ) + + renderFile( + sprintf('srcjs/%s.jsx', name), + 'templates/input_js.txt', + 'JavaScript implementation', + list( + name = name, + package = package ) ) - # addInputConstructor(name, package, edit) - # addInputJSON(toDepJSON(npmPkgs)) - # addWebpackConfig(name) - # addWidgetJS(name, edit) - # addExampleApp(name) - # - # usethis::use_build_ignore(c("node_modules", "srcjs")) - # usethis::use_git_ignore(c("node_modules")) - # lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) - # - # message("To install dependencies from npm run: yarn install") - # message("To build JavaScript run: yarn run webpack --mode=development") + + renderFile( + 'app.R', + 'templates/input_app.R.txt', + 'example app', + list( + name = name, + package = package + ) + ) + + usethis::use_build_ignore(c("node_modules", "srcjs")) + usethis::use_git_ignore(c("node_modules")) + lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) + + message("To install dependencies from npm run: yarn install") + message("To build JavaScript run: yarn run webpack --mode=development") } diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 4159cbc..bdc78b4 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -46,3 +46,9 @@ renderFile <- function(outputFile, templateFile, description = '', substitutions outputFile } +getPackage <- function() { + if (!file.exists('DESCRIPTION')) { + stop("You need to create a package to house your widget first!", call. = FALSE) + } + read.dcf('DESCRIPTION')[[1,"Package"]] +} diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 5395792..4858e16 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -16,14 +16,8 @@ #' #' @export scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ - if (!file.exists('DESCRIPTION')){ - stop( - "You need to create a package to house your widget first!", - call. = F - ) - } + package <- getPackage() - package <- read.dcf('DESCRIPTION')[[1,"Package"]] addWidgetConstructor(name, package, edit) addWidgetYAML(name, edit) addPackageJSON(toDepJSON(npmPkgs)) @@ -65,7 +59,7 @@ addWidgetYAML <- function(name, edit){ addPackageJSON <- function(npmPkgs) { renderFile( 'package.json', - 'templates/widget_package.json.txt', + 'templates/package.json.txt', 'project metadata', list(npmPkgs = npmPkgs) ) @@ -74,9 +68,12 @@ addPackageJSON <- function(npmPkgs) { addWebpackConfig <- function(name) { renderFile( 'webpack.config.js', - 'templates/widget_webpack.config.js.txt', + 'templates/webpack.config.js.txt', 'webpack configuration', - list(name = name) + list( + name = name, + outputPath = 'inst/htmlwidgets' + ) ) } diff --git a/inst/templates/input_app.R.txt b/inst/templates/input_app.R.txt new file mode 100644 index 0000000..151ac55 --- /dev/null +++ b/inst/templates/input_app.R.txt @@ -0,0 +1,16 @@ +library(shiny) +library(${package}) + +ui <- fluidPage( + titlePanel("reactR Input Example"), + ${name}Input("textInput"), + textOutput("textOutput") +) + +server <- function(input, output, session) { + output$textOutput <- renderText({ + sprintf("You entered: %s", input$textInput) + }) +} + +shinyApp(ui, server) diff --git a/inst/templates/input_js.txt b/inst/templates/input_js.txt new file mode 100644 index 0000000..10ae774 --- /dev/null +++ b/inst/templates/input_js.txt @@ -0,0 +1,7 @@ +import { reactInput } from 'reactR'; + +const TextInput = ({ configuration, value, setValue }) => { + return setValue(e.target.value)}/>; +}; + +reactInput('.${name}', '${package}.${name}', TextInput); diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index 7aa9d55..521e140 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -15,8 +15,8 @@ ${name}Input <- function(inputId, default = "") { htmlDependency( name = "${name}-input", version = "1.0.0", - src = "www/${name}", - package = "${name}", + src = "www/${package}/${name}", + package = "${package}", script = "${name}.js" ), value, diff --git a/inst/templates/widget_package.json.txt b/inst/templates/package.json.txt similarity index 100% rename from inst/templates/widget_package.json.txt rename to inst/templates/package.json.txt diff --git a/inst/templates/widget_webpack.config.js.txt b/inst/templates/webpack.config.js.txt similarity index 71% rename from inst/templates/widget_webpack.config.js.txt rename to inst/templates/webpack.config.js.txt index edb9e63..bcfbb58 100644 --- a/inst/templates/widget_webpack.config.js.txt +++ b/inst/templates/webpack.config.js.txt @@ -2,15 +2,16 @@ var path = require('path'); module.exports = { mode: 'development', - entry: path.join(__dirname, 'srcjs', '${name}.js'), + entry: path.join(__dirname, 'srcjs', '${name}.jsx'), output: { - path: path.join(__dirname, 'inst', 'htmlwidgets'), + path: path.join(__dirname, 'inst', 'www', '${package}', '${name}'), + path: path.join(__dirname, '${outputPath}'), filename: '${name}.js' }, module: { rules: [ { - test: /\.js$/, + test: /\.jsx?$/, loader: 'babel-loader', options: { presets: ['@babel/preset-env', '@babel/preset-react'] diff --git a/man/scaffoldReactInput.Rd b/man/scaffoldReactInput.Rd new file mode 100644 index 0000000..28e83a2 --- /dev/null +++ b/man/scaffoldReactInput.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/scaffold_input.R +\name{scaffoldReactInput} +\alias{scaffoldReactInput} +\title{Create implementation scaffolding for a React.js-based Shiny input.} +\usage{ +scaffoldReactInput(name, npmPkgs = NULL, edit = interactive()) +} +\arguments{ +\item{name}{Name of input} + +\item{npmPkgs}{Optional \href{https://npmjs.com/}{NPM} packages upon which +this input is based which will be used to populate \code{package.json}. +Should be a named list of names to +\href{https://docs.npmjs.com/files/package.json#dependencies}{versions}.} + +\item{edit}{Automatically open the input's source files after creating the +scaffolding.} +} +\description{ +Add the minimal code required to implement a React.js-based Shiny input to an +R package. +} +\note{ +This function must be executed from the root directory of the package + you wish to add the input to. +} diff --git a/man/scaffoldReactWidget.Rd b/man/scaffoldReactWidget.Rd index 0017d9f..0ccd69b 100644 --- a/man/scaffoldReactWidget.Rd +++ b/man/scaffoldReactWidget.Rd @@ -1,24 +1,12 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/scaffold_input.R, R/scaffold_widget.R +% Please edit documentation in R/scaffold_widget.R \name{scaffoldReactWidget} \alias{scaffoldReactWidget} -\title{Create implementation scaffolding for a React.js-based Shiny input.} +\title{Create implementation scaffolding for a React.js-based HTML widget} \usage{ -scaffoldReactWidget(name, npmPkgs = NULL, edit = interactive()) - scaffoldReactWidget(name, npmPkgs = NULL, edit = interactive()) } \arguments{ -\item{name}{Name of input} - -\item{npmPkgs}{Optional \href{https://npmjs.com/}{NPM} packages upon which -this input is based which will be used to populate \code{package.json}. -Should be a named list of names to -\href{https://docs.npmjs.com/files/package.json#dependencies}{versions}.} - -\item{edit}{Automatically open the input's JavaScript source file after -creating the scaffolding.} - \item{name}{Name of widget} \item{npmPkgs}{Optional \href{https://npmjs.com/}{NPM} packages upon which @@ -30,16 +18,10 @@ Should be a named list of names to creating the scaffolding.} } \description{ -Add the minimal code required to implement a React.js-based Shiny input to an -R package. - Add the minimal code required to implement a React.js-based HTML widget to an R package. } \note{ -This function must be executed from the root directory of the package - you wish to add the input to. - This function must be executed from the root directory of the package you wish to add the widget to. } From 37a58a8bff148ae1aff883cc47a1aab2c64e3673 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 27 Feb 2019 23:43:14 -0800 Subject: [PATCH 23/58] Fix images in htmlwidgets vignette --- vignettes/intro_htmlwidgets.Rmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vignettes/intro_htmlwidgets.Rmd b/vignettes/intro_htmlwidgets.Rmd index 7a6d291..aab0dda 100644 --- a/vignettes/intro_htmlwidgets.Rmd +++ b/vignettes/intro_htmlwidgets.Rmd @@ -91,9 +91,7 @@ shiny::runApp() Alternatively, in RStudio, you can open `app.R` and press `Ctrl-Shift-Enter` (`Cmd-Shift-Enter` on macOS). You should see something like the following appear in the Viewer pane: -```{r echo=FALSE} -knitr::include_graphics('./widget_app.jpg') -``` +![](./widget_app.jpg) ## Authoring a React binding @@ -272,6 +270,8 @@ shinyApp(ui, server) Now, when you run `shiny::runApp()`, you should see your react-based htmlwidget rendering in **shiny** app! +![](./widget_app_improved.jpg) + ## Further learning This tutorial walked you through the steps taken you create an R interface to the react-sparklines library. The full example package is accessible at . Our intention is keep creating example packages under the organization, so head there if you'd like to see other examples of interfacing with React. From 30f81e51aea30d6614ad3e9d05f0355eaf504f16 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Wed, 27 Feb 2019 23:43:34 -0800 Subject: [PATCH 24/58] Add input vignette and screenshots --- vignettes/input_app.jpg | Bin 0 -> 16359 bytes vignettes/input_sketchpicker.jpg | Bin 0 -> 17134 bytes vignettes/input_sketchpicker_working.jpg | Bin 0 -> 32468 bytes vignettes/intro_inputs.Rmd | 256 +++++++++++++++++++++++ 4 files changed, 256 insertions(+) create mode 100644 vignettes/input_app.jpg create mode 100644 vignettes/input_sketchpicker.jpg create mode 100644 vignettes/input_sketchpicker_working.jpg create mode 100644 vignettes/intro_inputs.Rmd diff --git a/vignettes/input_app.jpg b/vignettes/input_app.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91398ab8363670f23f8d45615cdf3948eb7af606 GIT binary patch literal 16359 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 literal 0 HcmV?d00001 diff --git a/vignettes/input_sketchpicker.jpg b/vignettes/input_sketchpicker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fb2af4e338b8dd6740a27ed52ccdf23b8d9f5d0 GIT binary patch literal 17134 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 literal 0 HcmV?d00001 diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd new file mode 100644 index 0000000..00bdba7 --- /dev/null +++ b/vignettes/intro_inputs.Rmd @@ -0,0 +1,256 @@ +--- +title: "Authoring inputs powered by React with reactR" +author: + - Alan Dipert +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Shiny inputs with reactR} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, echo=FALSE, include=FALSE} +knitr::opts_chunk$set(eval = FALSE) +``` + +[Shiny](http://shiny.rstudio.com/) comes with a large library of input +[widgets](https://shiny.rstudio.com/gallery/widget-gallery.html) for collecting +input from the user and conveying input data to R. + +If you want a kind of input *not* provided by Shiny — like a color picker, +or a different kind of slider — you've always been able to build your own. +Shiny's input system is +[extensible](https://shiny.rstudio.com/articles/building-inputs.html). All +that's required is an understanding of certain conventions and a little custom +JavaScript. + +reactR provides additional tools to ease the creation of new Shiny inputs +implemented using React. In the following tutorial, we will demonstrate these +tools by implementing a new Shiny color picker input that wraps the +[react-color](https://github.com/casesandberg/react-color) library. + +## Software pre-requisites + +In order to develop a **reactR** Shiny input, you'll need to install R and +optionally RStudio. If you're on Windows, you should also install +[Rtools](https://cran.r-project.org/bin/windows/Rtools/). + +> For an excellent general introduction to R package concepts, check out the [R +> packages](http://r-pkgs.had.co.nz/) online book. + +In addition, you'll need to install the following JavaScript tools on your +machine: + +* [Node.js](https://nodejs.org): JavaScript engine and runtime for development + outside of browsers. Provides the `node` and `npm` commands. +* [Yarn](https://yarnpkg.com/en/): Command-line dependency management tool, + provides the `yarn` command. + +To follow along in this vignette, you'll also need the following R packages: + +```{r} +install.packages(c("shiny", "devtools", "usethis", "reactR")) +``` + +## Scaffolding + +To create a new widget you can call `scaffoldReactInput` to generate the basic +structure and build configuration. This function will: + +* Create the .R, .js, and .json files required by your input; +* If provided, take an [npm](https://www.npmjs.com/) package name and version as + a named list with `name` and `version` elements. For example, the npm package + `foo` at version `^1.2.0` would be expressed as `list(name = "foo", version = + "^1.2.0")`. The package, if provided, will be added to the new widget's + `package.json` as a build dependency. + +The following R code will create an R package named **colorpicker**, then +provide the templating for creating an input powered by the +`react-color` library on npm: + +```{r} +# Create the R package +usethis::create_package("~/colorpicker") +# Inject the widget templating +withr::with_dir( + "~/colorpicker", + reactR::scaffoldReactInput("colorpicker", list("react-color" = "^2.17.0"), edit = FALSE) +) +``` + +## Building and installing + +### Building the JavaScript + +The next step is to navigate to the newly-created `sparklines` project and run +the following commands in the terminal: + +``` +yarn install +yarn run webpack +``` + +* `yarn install` downloads all of the dependencies listed in `package.json` and + creates a new file, `yarn.lock`. You should add this file to revision control. + It will be updated whenever you change dependencies and run `yarn install`. + **Note: you only need to run it after modifying package.json**. For further + documentation on `yarn install`, see the [yarn + documentation](https://yarnpkg.com/lang/en/docs/cli/install/). + +* `yarn run webpack` compiles the [ES2015](https://babeljs.io/docs/en/learn/) + JavaScript source file at `srcjs/colorpicker.jsx` into + `www/colorpicker/colorpicker/colorpicker.js`. The latter file is the one + actually used by the R package and includes all the relevant JavaScript + dependencies in a dialect of JavaScript that most browsers understand. + +`yarn run webpack` is not strictly a `yarn` command. In fact, `yarn run` simply +delegates to the [webpack](https://webpack.js.org/) program. Webpack's +configuration is generated by `scaffoldReactInput` in the file +`webpack.config.js`, but you can always change this configuration and/or modify +the `yarn run webpack` command to suit your needs. + +### Installing the R package + +Now that the input's JavaScript is compiled, go ahead and install the R +package: + +```{r} +devtools::document() +devtools::install(quick = TRUE) +``` + +Alternatively, in RStudio, you can use the keyboard shortcuts `Ctrl+Shift+D` and +`Ctrl-Shift-B` to document and build the package. (On macOS, the shortcuts are +`Cmd+Shift+D` and `Cmd+Shift+B`) + +## Run the included demo + +Now that the input's JavaScript is compiled, and the R package is installed, +run `app.R` to see a demo in action: + +```{r} +shiny::runApp() +``` + +Alternatively, in RStudio, you can open `app.R` and press `Ctrl-Shift-Enter` +(`Cmd-Shift-Enter` on macOS). You should see something like the following appear +in the Viewer pane: + +![](./input_app.jpg) + +## Authoring a React input + +At this point, we've built some scaffolding for an input powered by React. +Let's modify it to create an interface to the `react-color` library. + +### Connecting Shiny with React + +Consider the following example taken from the [react-color +documentation](http://casesandberg.github.io/react-color/). + +```js +import React from 'react'; +import { SketchPicker } from 'react-color'; + +class Component extends React.Component { + + render() { + return ; + } +} +``` + +That JavaScript code produces a `SketchPicker`-type interface that looks like +this: + +![](./input_sketchpicker.jpg) + +However, that example doesn't demonstrate a way to default to a particular +color, or a way to cause something to happen when the color changes. To +accomplish these, `react-color` components can [optionally +take](http://casesandberg.github.io/react-color/#api) the following +[props](https://reactjs.org/docs/components-and-props.html): + +* `color`: accepts a string of a hex color like `'#333'` +* `onChangeComplete`: accepts a function taking a single argument, the new + color, that will be called when the new color is selected + +These operations are conceptually similar enough to the API expected of Shiny +inputs that `reactR` can assist with mapping components to inputs. + +It does so by introducing a convention for wrapping components like those +provided by `react-color` with an intermediate component that accepts these +props: + +* `configuration`: A configuration object containing data from R used to + parameterize the input's behavior +* `value`: The input's values over time, beginning with the default +* `setValue`: A function to call with the input's new value when one is created + +The `configuration` and `value` props are initially populated on the R side, as +arguments to the `createReactInput` function inside the input's constructor +function. In the case of our newly-scaffolded input, that happens in +`R/colorpicker.R`. + +The `setValue` function is what causes new values to be sent to R, and also what +triggers the "intermediate" component to repaint itself. + +So, in order to make the components delivered by `react-color` accessible on the +R side, we must create our own intermediate component that wraps one of +`react-color`'s pickers. + +### Create intermediate component + +Open `srcjs/colorpicker.jsx` and paste the following in: + +```js +import { reactInput } from 'reactR'; +import { SketchPicker } from 'react-color'; + +const PickerInput = ({ configuration, value, setValue }) => { + return ( + setValue(color.hex) } + /> + ); +}; + +reactInput('.colorpicker', 'colorpicker', PickerInput); +``` + +The above code creates a new [function +component](https://reactjs.org/docs/components-and-props.html#function-and-class-components) +called `PickerInput` that expects the props supplied by reactR and renders a +parameterized `SketchPicker` from `react-color`. The `configuration` value is +not yet used. + +After saving the file, run `yarn run webpack` in the terminal and rebuild the +package. + +## Trying it out + +After rebuilding the JavaScript and the package, try running `app.R` again. You +should see something like this: + +![](./input_sketchpicker_working.jpg) + +When you select new colors, you should see the `textOutput` update accordingly. + +You might have noticed that the input showed up initially without a color +selected. That's because in `app.R` we didn't supply a `default` argument to the +`colorpickerInput` function inside our `ui`. + +Try replacing the call to `colorpickerInput` with this: +`colorpickerInput("textInput", default = "#a76161")` + +Now when you run the app, the color should start as a shade of red. + +## Further learning + +This tutorial walked you through the steps taken to wrap the `react-color` +library in a Shiny input. The full example package is accessible at +. Our intention is keep creating +example packages under the organization, so head +there if you'd like to see other examples of interfacing with React. From 39961bd4a51ff0baa372f2fb1fbf62476cc61156 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 05:58:30 -0800 Subject: [PATCH 25/58] Use .jsx extension for scaffolded widget JS --- R/scaffold_widget.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 4858e16..4e360b2 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -79,7 +79,7 @@ addWebpackConfig <- function(name) { addWidgetJS <- function(name, edit){ file <- renderFile( - sprintf('srcjs/%s.js', name), + sprintf('srcjs/%s.jsx', name), 'templates/widget_js.txt', 'boilerplate for widget JavaScript bindings', list(name = name) From a3acd8fa029498642d496579dcf915cc8545e4ad Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 06:42:52 -0800 Subject: [PATCH 26/58] Add newline to widget yaml template --- inst/templates/widget_yaml.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/inst/templates/widget_yaml.txt b/inst/templates/widget_yaml.txt index a724f4a..82bc4da 100644 --- a/inst/templates/widget_yaml.txt +++ b/inst/templates/widget_yaml.txt @@ -5,3 +5,4 @@ # src: # script: # stylesheet: + From 4e22489897071df1c2eb46a6f06ec5542b0defd9 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 07:19:23 -0800 Subject: [PATCH 27/58] Workaround mysterious HTMLWidgets scaffold problem related to webpack externs --- srcjs/widget.js | 4 +--- webpack.config.js | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/srcjs/widget.js b/srcjs/widget.js index 432adb2..0484553 100644 --- a/srcjs/widget.js +++ b/srcjs/widget.js @@ -1,5 +1,3 @@ -import HTMLWidgets from 'htmlwidgets'; - /** * Recursively transforms tag, a JSON representation of an instance of a * React component and its children, into a React element suitable for @@ -77,7 +75,7 @@ export function isTag(value) { */ export function reactWidget(name, type, components, options) { var actualOptions = mergeOptions(options); - HTMLWidgets.widget({ + window.HTMLWidgets.widget({ name: name, type: type, factory: function (el, width, height) { diff --git a/webpack.config.js b/webpack.config.js index 2ff17a1..f452d79 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -22,8 +22,7 @@ module.exports = { 'react': 'window.React', 'react-dom': 'window.ReactDOM', 'jquery': 'window.jQuery', - 'shiny': 'window.Shiny', - 'htmlwidgets': 'window.HTMLWidgets' + 'shiny': 'window.Shiny' }, stats: { colors: true From a3dbcd2bc0ef6105283dc9386b036933cd0bc65d Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 07:19:29 -0800 Subject: [PATCH 28/58] webpack --- inst/www/react-tools/react-tools.js | 17 +---------------- inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index 897457b..26c4424 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -307,11 +307,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatDimension", function() { return formatDimension; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTag", function() { return isTag; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactWidget", function() { return reactWidget; }); -/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! htmlwidgets */ "htmlwidgets"); -/* harmony import */ var htmlwidgets__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(htmlwidgets__WEBPACK_IMPORTED_MODULE_0__); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - /** * Recursively transforms tag, a JSON representation of an instance of a * React component and its children, into a React element suitable for @@ -319,7 +316,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat * @param {Object} components * @param {Object} tag */ - function hydrate(components, tag) { if (typeof tag === 'string') return tag; @@ -390,7 +386,7 @@ function isTag(value) { function reactWidget(name, type, components, options) { var actualOptions = mergeOptions(options); - htmlwidgets__WEBPACK_IMPORTED_MODULE_0___default.a.widget({ + window.HTMLWidgets.widget({ name: name, type: type, factory: function factory(el, width, height) { @@ -426,17 +422,6 @@ function reactWidget(name, type, components, options) { /***/ }), -/***/ "htmlwidgets": -/*!*************************************!*\ - !*** external "window.HTMLWidgets" ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = window.HTMLWidgets; - -/***/ }), - /***/ "jquery": /*!********************************!*\ !*** external "window.jQuery" ***! diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index a83b341..b6e3bda 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.HTMLWidgets\"","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","import HTMLWidgets from 'htmlwidgets';\r\n\r\n/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.HTMLWidgets;","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From 5f26324a1edc03244e636faa9859be33123a04f2 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 07:34:02 -0800 Subject: [PATCH 29/58] Bring back changes from #18 'add render results to instance' that were lost --- srcjs/widget.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/srcjs/widget.js b/srcjs/widget.js index 0484553..fb23d42 100644 --- a/srcjs/widget.js +++ b/srcjs/widget.js @@ -80,6 +80,7 @@ export function reactWidget(name, type, components, options) { type: type, factory: function (el, width, height) { var lastValue, + instance = {}, renderValue = (function (value) { if (actualOptions.renderOnResize) { // value.tag might be a primitive string, in which @@ -90,9 +91,10 @@ export function reactWidget(name, type, components, options) { } lastValue = value; } - ReactDOM.render(hydrate(components, value.tag), el); + this.instance.component = ReactDOM.render(hydrate(components, value.tag), el); }); return { + instance: instance, renderValue: renderValue, resize: function (newWidth, newHeight) { if (actualOptions.renderOnResize) { From 50a594504996915ea264edf3a9588276ad09ab05 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 07:42:20 -0800 Subject: [PATCH 30/58] webpack --- inst/www/react-tools/react-tools.js | 4 +++- inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index 26c4424..44b2204 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -391,6 +391,7 @@ function reactWidget(name, type, components, options) { type: type, factory: function factory(el, width, height) { var lastValue, + instance = {}, renderValue = function renderValue(value) { if (actualOptions.renderOnResize) { // value.tag might be a primitive string, in which @@ -403,10 +404,11 @@ function reactWidget(name, type, components, options) { lastValue = value; } - ReactDOM.render(hydrate(components, value.tag), el); + this.instance.component = ReactDOM.render(hydrate(components, value.tag), el); }; return { + instance: instance, renderValue: renderValue, resize: function resize(newWidth, newHeight) { if (actualOptions.renderOnResize) { diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index b6e3bda..e4fa44b 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From 112ebb9f6ae11ecd28135dc70cbcd0ccfefd73a3 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 07:42:27 -0800 Subject: [PATCH 31/58] yarn --- yarn.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 324bee2..bba0957 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3758,15 +3758,15 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.7.0: - version "16.8.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4" - integrity sha512-N74IZUrPt6UiDjXaO7UbDDFXeUXnVhZzeRLy/6iqqN1ipfjrhR60Bp5NuBK+rv3GMdqdIuwIl22u1SYwf330bg== +react-dom@^16.8.1: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.3.tgz#ae236029e66210783ac81999d3015dfc475b9c32" + integrity sha512-ttMem9yJL4/lpItZAQ2NTFAbV7frotHk5DZEHXUOws2rMmrsvh1Na7ThGT0dTzUIl6pqTOi5tYREfL8AEna3lA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.1" + scheduler "^0.13.3" react-html-parser@^2.0.2: version "2.0.2" @@ -3780,15 +3780,15 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.1.tgz#a80141e246eb894824fb4f2901c0c50ef31d4cdb" integrity sha512-ioMCzVDWvCvKD8eeT+iukyWrBGrA3DiFYkXfBsVYIRdaREZuBjENG+KjrikavCLasozqRWTwFUagU/O4vPpRMA== -react@^16.7.0: - version "16.8.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a" - integrity sha512-wLw5CFGPdo7p/AgteFz7GblI2JPOos0+biSoxf1FPsGxWQZdN/pj6oToJs1crn61DL3Ln7mN86uZ4j74p31ELQ== +react@^16.8.1: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9" + integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.1" + scheduler "^0.13.3" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" @@ -4007,10 +4007,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591" - integrity sha512-VJKOkiKIN2/6NOoexuypwSrybx13MY7NSy9RNt8wPvZDMRT1CW6qlpF5jXRToXNHz3uWzbm2elNpZfXfGPqP9A== +scheduler@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.3.tgz#bed3c5850f62ea9c716a4d781f9daeb9b2a58896" + integrity sha512-UxN5QRYWtpR1egNWzJcVLk8jlegxAugswQc984lD3kU7NuobsO37/sRfbpTdBjtnD5TBNFA2Q2oLV5+UmPSmEQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" From 14aee08916549d77dcf8797a18be22a659c20df7 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Mon, 4 Mar 2019 15:11:44 -0800 Subject: [PATCH 32/58] Add default update*Input function to input scaffold --- R/scaffold_input.R | 1 + inst/templates/input_r.txt | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/R/scaffold_input.R b/R/scaffold_input.R index fb826fb..0afd5a7 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -24,6 +24,7 @@ scaffoldReactInput <- function(name, npmPkgs = NULL, edit = interactive()) { "boilerplate for input constructor", list( name = name, + capName = capitalize(name), package = package ) ) diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index 521e140..a33c286 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -24,3 +24,14 @@ ${name}Input <- function(inputId, default = "") { tags$span ) } + +#' +#' +#' +#' +#' @export +update${capName}Input <- function(session, inputId, value, configuration = NULL) { + message <- list(value = value) + if (!is.null(configuration)) message$configuration <- configuration + session$sendInputMessage(inputId, message); +} From c7501107712557e3fa216848a6e276d3af0b6ac8 Mon Sep 17 00:00:00 2001 From: timelyportfolio Date: Mon, 4 Mar 2019 19:46:15 -0600 Subject: [PATCH 33/58] add comment in JavaScript saying that component might be null --- srcjs/widget.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/srcjs/widget.js b/srcjs/widget.js index fb23d42..4f8df3d 100644 --- a/srcjs/widget.js +++ b/srcjs/widget.js @@ -91,6 +91,8 @@ export function reactWidget(name, type, components, options) { } lastValue = value; } + // with functional stateless components this will be null + // see https://reactjs.org/docs/react-dom.html#render for more details this.instance.component = ReactDOM.render(hydrate(components, value.tag), el); }); return { From b8a26aa3b5f037f3c77dba2f94c7727dfa0d5f25 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:15:21 -0700 Subject: [PATCH 34/58] No need for input scaffold to call restoreInput --- inst/templates/input_r.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index a33c286..b073a1d 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -8,7 +8,6 @@ #' #' @export ${name}Input <- function(inputId, default = "") { - value <- restoreInput(id = inputId, default = default) createReactInput( inputId, "${name}", @@ -19,7 +18,7 @@ ${name}Input <- function(inputId, default = "") { package = "${package}", script = "${name}.js" ), - value, + default, list(), tags$span ) From 885c035c63451440496b401d64b730ad5dcb3fe3 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:23:02 -0700 Subject: [PATCH 35/58] Add @example for createReactInput --- R/reacttools.R | 17 +++++++++++++++++ man/createReactInput.Rd | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/R/reacttools.R b/R/reacttools.R index 9cee3be..693c460 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -107,6 +107,23 @@ reactMarkup <- function(tag) { #' @return Shiny input suitable for inclusion in a UI. #' @export #' +#' @examples +#' myInput <- function(inputId, default = "") { +#' # The value of createReactInput should be returned from input constructor functions. +#' createReactInput( +#' inputId, +#' "myinput", +#' # At least one htmlDependency must be provided -- the JavaScript implementation of the input. +#' htmlDependency( +#' name = "my-input", +#' version = "1.0.0", +#' src = "www/mypackage/myinput", +#' package = "mypackage", +#' script = "myinput.js" +#' ), +#' default +#' ) +#' } createReactInput <- function(inputId, class, dependencies, diff --git a/man/createReactInput.Rd b/man/createReactInput.Rd index 7cd81d0..df3dc2c 100644 --- a/man/createReactInput.Rd +++ b/man/createReactInput.Rd @@ -29,3 +29,21 @@ Shiny input suitable for inclusion in a UI. \description{ Create a React-based input } +\examples{ +myInput <- function(inputId, default = "") { + # The value of createReactInput should be returned from input constructor functions. + createReactInput( + inputId, + "myinput", + # At least one htmlDependency must be provided -- the JavaScript implementation of the input. + htmlDependency( + name = "my-input", + version = "1.0.0", + src = "www/mypackage/myinput", + package = "mypackage", + script = "myinput.js" + ), + default + ) +} +} From 17b8994a0ef5b87a475b2c9b9beada867a95ff65 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:28:35 -0700 Subject: [PATCH 36/58] Add todos to JS --- srcjs/input.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/srcjs/input.js b/srcjs/input.js index 59f5c10..7758692 100644 --- a/srcjs/input.js +++ b/srcjs/input.js @@ -72,7 +72,8 @@ export function reactInput(selector, this.render(el); } unsubscribe(el, callback) { - // TODO + // TODO at a minimum, 'undo' subscribe() actions (remove callback from data) + // Figure out the right way to un-render the component } receiveMessage(el, data) { options.receiveMessage.call(this, el, data); @@ -83,6 +84,8 @@ export function reactInput(selector, * through `this` in receiveMessage * */ + // TODO Initialize value and config in initialize() method, don't sync back + // to DOM getInputValue(el) { return JSON.parse($(el).next().text()); } From 49c065b04b16627389ece12417b3911c1a6261ee Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:30:19 -0700 Subject: [PATCH 37/58] reactInput => reactShinyInput --- inst/templates/input_js.txt | 4 ++-- srcjs/input.js | 4 ++-- srcjs/react-tools.js | 4 ++-- vignettes/intro_inputs.Rmd | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/inst/templates/input_js.txt b/inst/templates/input_js.txt index 10ae774..14781a1 100644 --- a/inst/templates/input_js.txt +++ b/inst/templates/input_js.txt @@ -1,7 +1,7 @@ -import { reactInput } from 'reactR'; +import { reactShinyInput } from 'reactR'; const TextInput = ({ configuration, value, setValue }) => { return setValue(e.target.value)}/>; }; -reactInput('.${name}', '${package}.${name}', TextInput); +reactShinyInput('.${name}', '${package}.${name}', TextInput); diff --git a/srcjs/input.js b/srcjs/input.js index 7758692..7d26d45 100644 --- a/srcjs/input.js +++ b/srcjs/input.js @@ -9,7 +9,7 @@ import $ from 'jquery'; * the component will be re-rendered. Because receiveMessage is typically used * by input authors to perform incremental updates, this default implementation * can be overriden by the user with the receiveMessage arguments to - * reactInput. + * reactShinyInput. */ function defaultReceiveMessage(el, { configuration, value }) { let dirty = false; @@ -45,7 +45,7 @@ const defaultOptions = { * the default. Typically overridden as an optimization to perform * incremental value updates. */ -export function reactInput(selector, +export function reactShinyInput(selector, name, component, options) { diff --git a/srcjs/react-tools.js b/srcjs/react-tools.js index 04ed9e1..0c48508 100644 --- a/srcjs/react-tools.js +++ b/srcjs/react-tools.js @@ -1,8 +1,8 @@ import { reactWidget, hydrate } from './widget'; -import { reactInput } from './input'; +import { reactShinyInput } from './input'; window.reactR = { - reactInput: reactInput, + reactShinyInput: reactShinyInput, reactWidget: reactWidget, hydrate: hydrate }; diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd index 00bdba7..f8d9b33 100644 --- a/vignettes/intro_inputs.Rmd +++ b/vignettes/intro_inputs.Rmd @@ -205,7 +205,7 @@ R side, we must create our own intermediate component that wraps one of Open `srcjs/colorpicker.jsx` and paste the following in: ```js -import { reactInput } from 'reactR'; +import { reactShinyInput } from 'reactR'; import { SketchPicker } from 'react-color'; const PickerInput = ({ configuration, value, setValue }) => { @@ -217,7 +217,7 @@ const PickerInput = ({ configuration, value, setValue }) => { ); }; -reactInput('.colorpicker', 'colorpicker', PickerInput); +reactShinyInput('.colorpicker', 'colorpicker', PickerInput); ``` The above code creates a new [function From 9dcd497a859baf4aa067fc5c913360dbc5a74455 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:31:17 -0700 Subject: [PATCH 38/58] webpack --- inst/www/react-tools/react-tools.js | 15 +++++++++------ inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index 44b2204..ade2680 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -90,12 +90,12 @@ /*!************************!*\ !*** ./srcjs/input.js ***! \************************/ -/*! exports provided: reactInput */ +/*! exports provided: reactShinyInput */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactInput", function() { return reactInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactShinyInput", function() { return reactShinyInput; }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom"); @@ -132,7 +132,7 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || func * the component will be re-rendered. Because receiveMessage is typically used * by input authors to perform incremental updates, this default implementation * can be overriden by the user with the receiveMessage arguments to - * reactInput. + * reactShinyInput. */ function defaultReceiveMessage(el, _ref) { @@ -174,7 +174,7 @@ var defaultOptions = { * incremental value updates. */ -function reactInput(selector, name, component, options) { +function reactShinyInput(selector, name, component, options) { options = Object.assign({}, defaultOptions, options); shiny__WEBPACK_IMPORTED_MODULE_2___default.a.inputBindings.register(new ( /*#__PURE__*/ @@ -216,7 +216,8 @@ function reactInput(selector, name, component, options) { } }, { key: "unsubscribe", - value: function unsubscribe(el, callback) {// TODO + value: function unsubscribe(el, callback) {// TODO at a minimum, 'undo' subscribe() actions (remove callback from data) + // Figure out the right way to un-render the component } }, { key: "receiveMessage", @@ -227,6 +228,8 @@ function reactInput(selector, name, component, options) { * Methods not present in Shiny.InputBinding but accessible to users * through `this` in receiveMessage * */ + // TODO Initialize value and config in initialize() method, don't sync back + // to DOM }, { key: "getInputValue", @@ -285,7 +288,7 @@ __webpack_require__.r(__webpack_exports__); window.reactR = { - reactInput: _input__WEBPACK_IMPORTED_MODULE_1__["reactInput"], + reactShinyInput: _input__WEBPACK_IMPORTED_MODULE_1__["reactShinyInput"], reactWidget: _widget__WEBPACK_IMPORTED_MODULE_0__["reactWidget"], hydrate: _widget__WEBPACK_IMPORTED_MODULE_0__["hydrate"] }; diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index e4fa44b..45d51da 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactInput: reactInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO at a minimum, 'undo' subscribe() actions (remove callback from data)\r\n // Figure out the right way to un-render the component\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n // TODO Initialize value and config in initialize() method, don't sync back\r\n // to DOM\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From 361e7d2d4e525ee11c7493716629914bd12b783c Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 13:48:06 -0700 Subject: [PATCH 39/58] scaffoldReactInput => scaffoldReactShinyInput --- NAMESPACE | 2 +- R/scaffold_input.R | 2 +- man/{scaffoldReactInput.Rd => scaffoldReactShinyInput.Rd} | 6 +++--- vignettes/intro_inputs.Rmd | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) rename man/{scaffoldReactInput.Rd => scaffoldReactShinyInput.Rd} (85%) diff --git a/NAMESPACE b/NAMESPACE index d2e5d3a..588ddd1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -12,6 +12,6 @@ export(html_dependency_corejs) export(html_dependency_react) export(html_dependency_reacttools) export(reactMarkup) -export(scaffoldReactInput) +export(scaffoldReactShinyInput) export(scaffoldReactWidget) importFrom(htmltools,htmlDependency) diff --git a/R/scaffold_input.R b/R/scaffold_input.R index 0afd5a7..7880b7a 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -15,7 +15,7 @@ #' you wish to add the input to. #' #' @export -scaffoldReactInput <- function(name, npmPkgs = NULL, edit = interactive()) { +scaffoldReactShinyInput <- function(name, npmPkgs = NULL, edit = interactive()) { package <- getPackage() file <- renderFile( diff --git a/man/scaffoldReactInput.Rd b/man/scaffoldReactShinyInput.Rd similarity index 85% rename from man/scaffoldReactInput.Rd rename to man/scaffoldReactShinyInput.Rd index 28e83a2..b0e9490 100644 --- a/man/scaffoldReactInput.Rd +++ b/man/scaffoldReactShinyInput.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/scaffold_input.R -\name{scaffoldReactInput} -\alias{scaffoldReactInput} +\name{scaffoldReactShinyInput} +\alias{scaffoldReactShinyInput} \title{Create implementation scaffolding for a React.js-based Shiny input.} \usage{ -scaffoldReactInput(name, npmPkgs = NULL, edit = interactive()) +scaffoldReactShinyInput(name, npmPkgs = NULL, edit = interactive()) } \arguments{ \item{name}{Name of input} diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd index f8d9b33..3f492d3 100644 --- a/vignettes/intro_inputs.Rmd +++ b/vignettes/intro_inputs.Rmd @@ -55,7 +55,7 @@ install.packages(c("shiny", "devtools", "usethis", "reactR")) ## Scaffolding -To create a new widget you can call `scaffoldReactInput` to generate the basic +To create a new widget you can call `scaffoldReactShinyInput` to generate the basic structure and build configuration. This function will: * Create the .R, .js, and .json files required by your input; @@ -75,7 +75,7 @@ usethis::create_package("~/colorpicker") # Inject the widget templating withr::with_dir( "~/colorpicker", - reactR::scaffoldReactInput("colorpicker", list("react-color" = "^2.17.0"), edit = FALSE) + reactR::scaffoldReactShinyInput("colorpicker", list("react-color" = "^2.17.0"), edit = FALSE) ) ``` @@ -106,7 +106,7 @@ yarn run webpack `yarn run webpack` is not strictly a `yarn` command. In fact, `yarn run` simply delegates to the [webpack](https://webpack.js.org/) program. Webpack's -configuration is generated by `scaffoldReactInput` in the file +configuration is generated by `scaffoldReactShinyInput` in the file `webpack.config.js`, but you can always change this configuration and/or modify the `yarn run webpack` command to suit your needs. From 2d36b8f855b6f0e6e5b69c9b305f717ce6fbdfed Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 14:28:08 -0700 Subject: [PATCH 40/58] Constrain names allowed for scaffolded inputs and widgets --- R/scaffold_input.R | 1 + R/scaffold_utils.R | 13 +++++++++++++ R/scaffold_widget.R | 1 + 3 files changed, 15 insertions(+) diff --git a/R/scaffold_input.R b/R/scaffold_input.R index 7880b7a..b23e46f 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -16,6 +16,7 @@ #' #' @export scaffoldReactShinyInput <- function(name, npmPkgs = NULL, edit = interactive()) { + assertNameValid(name) package <- getPackage() file <- renderFile( diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index bdc78b4..fa0ea5d 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -52,3 +52,16 @@ getPackage <- function() { } read.dcf('DESCRIPTION')[[1,"Package"]] } + +validName <- function(name) { + grepl("^[[:alpha:]]+[[:alnum:]]*$", name) +} + +# Constraining names prevents the user from encountering obscure CSS problems +# and JavaScript errors after scaffolding. +assertNameValid <- function(name) { + if (!validName(name)) { + msg <- sprintf("Name '%s' is invalid, names must begin with an alphabetic character and must contain only alphabetic and numeric characters", name) + stop(msg, call. = FALSE) + } +} diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 4e360b2..4d54eb7 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -16,6 +16,7 @@ #' #' @export scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ + assertNameValid(name) package <- getPackage() addWidgetConstructor(name, package, edit) From 5f97dfaef0429eb66b128904fa674ceb2468aa2f Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 15:05:01 -0700 Subject: [PATCH 41/58] createReactInput => createReactShinyInput --- NAMESPACE | 2 +- R/reacttools.R | 6 +++--- inst/templates/input_r.txt | 4 ++-- man/{createReactInput.Rd => createReactShinyInput.Rd} | 10 +++++----- vignettes/intro_inputs.Rmd | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) rename man/{createReactInput.Rd => createReactShinyInput.Rd} (82%) diff --git a/NAMESPACE b/NAMESPACE index 588ddd1..a996be6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,7 +7,7 @@ S3method("[[<-",react_component_builder) export(React) export(babel_transform) export(component) -export(createReactInput) +export(createReactShinyInput) export(html_dependency_corejs) export(html_dependency_react) export(html_dependency_reacttools) diff --git a/R/reacttools.R b/R/reacttools.R index 693c460..f0210ed 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -109,8 +109,8 @@ reactMarkup <- function(tag) { #' #' @examples #' myInput <- function(inputId, default = "") { -#' # The value of createReactInput should be returned from input constructor functions. -#' createReactInput( +#' # The value of createReactShinyInput should be returned from input constructor functions. +#' createReactShinyInput( #' inputId, #' "myinput", #' # At least one htmlDependency must be provided -- the JavaScript implementation of the input. @@ -124,7 +124,7 @@ reactMarkup <- function(tag) { #' default #' ) #' } -createReactInput <- function(inputId, +createReactShinyInput <- function(inputId, class, dependencies, default = NULL, diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index b073a1d..a2e3deb 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -3,12 +3,12 @@ #' #' #' @importFrom shiny restoreInput -#' @importFrom reactR createReactInput +#' @importFrom reactR createReactShinyInput #' @importFrom htmltools htmlDependency tags #' #' @export ${name}Input <- function(inputId, default = "") { - createReactInput( + createReactShinyInput( inputId, "${name}", htmlDependency( diff --git a/man/createReactInput.Rd b/man/createReactShinyInput.Rd similarity index 82% rename from man/createReactInput.Rd rename to man/createReactShinyInput.Rd index df3dc2c..5bfdd52 100644 --- a/man/createReactInput.Rd +++ b/man/createReactShinyInput.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/reacttools.R -\name{createReactInput} -\alias{createReactInput} +\name{createReactShinyInput} +\alias{createReactShinyInput} \title{Create a React-based input} \usage{ -createReactInput(inputId, class, dependencies, default = NULL, +createReactShinyInput(inputId, class, dependencies, default = NULL, configuration = list(), container = htmltools::tags$div) } \arguments{ @@ -31,8 +31,8 @@ Create a React-based input } \examples{ myInput <- function(inputId, default = "") { - # The value of createReactInput should be returned from input constructor functions. - createReactInput( + # The value of createReactShinyInput should be returned from input constructor functions. + createReactShinyInput( inputId, "myinput", # At least one htmlDependency must be provided -- the JavaScript implementation of the input. diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd index 3f492d3..e83a779 100644 --- a/vignettes/intro_inputs.Rmd +++ b/vignettes/intro_inputs.Rmd @@ -189,7 +189,7 @@ props: * `setValue`: A function to call with the input's new value when one is created The `configuration` and `value` props are initially populated on the R side, as -arguments to the `createReactInput` function inside the input's constructor +arguments to the `createReactShinyInput` function inside the input's constructor function. In the case of our newly-scaffolded input, that happens in `R/colorpicker.R`. From 0e626074d93b2caa13cb881ce0838e2e826b7562 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:09:18 -0700 Subject: [PATCH 42/58] Allow underscores in name regex --- R/scaffold_utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index fa0ea5d..48254a8 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -54,7 +54,7 @@ getPackage <- function() { } validName <- function(name) { - grepl("^[[:alpha:]]+[[:alnum:]]*$", name) + grepl("^[[:alpha:]_][[:alnum:]_]*$", name) } # Constraining names prevents the user from encountering obscure CSS problems From 6262f061711e55c7fca97480b94a4c69b073e71e Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:10:06 -0700 Subject: [PATCH 43/58] Initialize input value from JSON but maintain it as jQuery data --- srcjs/input.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/srcjs/input.js b/srcjs/input.js index 7d26d45..4b02cc9 100644 --- a/srcjs/input.js +++ b/srcjs/input.js @@ -67,13 +67,17 @@ export function reactShinyInput(selector, this.getCallback(el)(); this.render(el); } + initialize(el) { + $(el).data('value', JSON.parse($(el).next().text())); + $(el).data('configuration', JSON.parse($(el).next().next().text())); + } subscribe(el, callback) { $(el).data('callback', callback); this.render(el); } unsubscribe(el, callback) { - // TODO at a minimum, 'undo' subscribe() actions (remove callback from data) - // Figure out the right way to un-render the component + $(el).removeData('callback'); + ReactDOM.render(null, el); } receiveMessage(el, data) { options.receiveMessage.call(this, el, data); @@ -84,19 +88,17 @@ export function reactShinyInput(selector, * through `this` in receiveMessage * */ - // TODO Initialize value and config in initialize() method, don't sync back - // to DOM getInputValue(el) { - return JSON.parse($(el).next().text()); + return $(el).data('value'); } setInputValue(el, value) { - $(el).next().text(JSON.stringify(value)); + $(el).data('value', value); } getInputConfiguration(el) { - return JSON.parse($(el).next().next().text()); + return $(el).data('configuration'); } - setInputConfiguration(el, value) { - $(el).next().next().text(JSON.stringify(value)); + setInputConfiguration(el, configuration) { + $(el).data('configuration', configuration); } getCallback(el) { return $(el).data('callback'); From 9dfa884505657c947ebdef0139d860d8df559349 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:12:53 -0700 Subject: [PATCH 44/58] webpack --- inst/www/react-tools/react-tools.js | 23 ++++++++++++++--------- inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index ade2680..f32c5a7 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -208,6 +208,12 @@ function reactShinyInput(selector, name, component, options) { this.getCallback(el)(); this.render(el); } + }, { + key: "initialize", + value: function initialize(el) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('value', JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text())); + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('configuration', JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text())); + } }, { key: "subscribe", value: function subscribe(el, callback) { @@ -216,8 +222,9 @@ function reactShinyInput(selector, name, component, options) { } }, { key: "unsubscribe", - value: function unsubscribe(el, callback) {// TODO at a minimum, 'undo' subscribe() actions (remove callback from data) - // Figure out the right way to un-render the component + value: function unsubscribe(el, callback) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).removeData('callback'); + react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render(null, el); } }, { key: "receiveMessage", @@ -228,28 +235,26 @@ function reactShinyInput(selector, name, component, options) { * Methods not present in Shiny.InputBinding but accessible to users * through `this` in receiveMessage * */ - // TODO Initialize value and config in initialize() method, don't sync back - // to DOM }, { key: "getInputValue", value: function getInputValue(el) { - return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text()); + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('value'); } }, { key: "setInputValue", value: function setInputValue(el, value) { - jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().text(JSON.stringify(value)); + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('value', value); } }, { key: "getInputConfiguration", value: function getInputConfiguration(el) { - return JSON.parse(jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text()); + return jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('configuration'); } }, { key: "setInputConfiguration", - value: function setInputConfiguration(el, value) { - jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).next().next().text(JSON.stringify(value)); + value: function setInputConfiguration(el, configuration) { + jquery__WEBPACK_IMPORTED_MODULE_3___default()(el).data('configuration', configuration); } }, { key: "getCallback", diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index 45d51da..b082e4f 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","callback","data","call","JSON","parse","next","text","stringify","element","React","createElement","getInputConfiguration","getValue","setValue","bind","ReactDOM","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n // TODO at a minimum, 'undo' subscribe() actions (remove callback from data)\r\n // Figure out the right way to un-render the component\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n // TODO Initialize value and config in initialize() method, don't sync back\r\n // to DOM\r\n getInputValue(el) {\r\n return JSON.parse($(el).next().text());\r\n }\r\n setInputValue(el, value) {\r\n $(el).next().text(JSON.stringify(value));\r\n }\r\n getInputConfiguration(el) {\r\n return JSON.parse($(el).next().next().text());\r\n }\r\n setInputConfiguration(el, value) {\r\n $(el).next().next().text(JSON.stringify(value));\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","data","JSON","parse","next","text","callback","removeData","ReactDOM","call","element","React","createElement","getInputConfiguration","getValue","setValue","bind","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n initialize(el) {\r\n $(el).data('value', JSON.parse($(el).next().text()));\r\n $(el).data('configuration', JSON.parse($(el).next().next().text()));\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n $(el).removeData('callback');\r\n ReactDOM.render(null, el);\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return $(el).data('value');\r\n }\r\n setInputValue(el, value) {\r\n $(el).data('value', value);\r\n }\r\n getInputConfiguration(el) {\r\n return $(el).data('configuration');\r\n }\r\n setInputConfiguration(el, configuration) {\r\n $(el).data('configuration', configuration);\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From 259bc32174dac6ea6e29935a459b42f183db21d5 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:15:40 -0700 Subject: [PATCH 45/58] Improve getPackage error message --- R/scaffold_utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 48254a8..5323f59 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -48,7 +48,7 @@ renderFile <- function(outputFile, templateFile, description = '', substitutions getPackage <- function() { if (!file.exists('DESCRIPTION')) { - stop("You need to create a package to house your widget first!", call. = FALSE) + stop("The current directory doesn't contain a package. You're either in the wrong directory, or need to create a package to house your widget.", call. = FALSE) } read.dcf('DESCRIPTION')[[1,"Package"]] } From 2b857dff8e8b83f6fb8786fce48544bb4bf3daab Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:38:45 -0700 Subject: [PATCH 46/58] Improve input vignette slightly --- vignettes/input_sketchpicker.gif | Bin 0 -> 239890 bytes vignettes/input_sketchpicker_working.jpg | Bin 32468 -> 0 bytes vignettes/intro_inputs.Rmd | 19 ++++++++++--------- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 vignettes/input_sketchpicker.gif delete mode 100644 vignettes/input_sketchpicker_working.jpg diff --git a/vignettes/input_sketchpicker.gif b/vignettes/input_sketchpicker.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5437bf4b8f3b21a27cb318477a6cdb2e0d5c185 GIT binary patch literal 239890 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

rhoy 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
yPa*Gs-R|zC0$&?m(^!D-OCPid+ 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 LW~cZVkk$VH$jCo1 literal 0 HcmV?d00001 diff --git a/vignettes/input_sketchpicker_working.jpg b/vignettes/input_sketchpicker_working.jpg deleted file mode 100644 index 6b0485acfcd4fad16bef11819f5b81d7832e7a07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32468 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 diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd index e83a779..7a15f28 100644 --- a/vignettes/intro_inputs.Rmd +++ b/vignettes/intro_inputs.Rmd @@ -72,7 +72,7 @@ provide the templating for creating an input powered by the ```{r} # Create the R package usethis::create_package("~/colorpicker") -# Inject the widget templating +# Scaffold initial input implementation files withr::with_dir( "~/colorpicker", reactR::scaffoldReactShinyInput("colorpicker", list("react-color" = "^2.17.0"), edit = FALSE) @@ -83,7 +83,7 @@ withr::with_dir( ### Building the JavaScript -The next step is to navigate to the newly-created `sparklines` project and run +The next step is to navigate to the newly-created `colorpicker` project and run the following commands in the terminal: ``` @@ -98,8 +98,8 @@ yarn run webpack documentation on `yarn install`, see the [yarn documentation](https://yarnpkg.com/lang/en/docs/cli/install/). -* `yarn run webpack` compiles the [ES2015](https://babeljs.io/docs/en/learn/) - JavaScript source file at `srcjs/colorpicker.jsx` into +* `yarn run webpack` compiles the [modern JavaScript](https://babeljs.io/docs/en/babel-preset-env) + with [JSX](https://babeljs.io/docs/en/babel-preset-react) source file at `srcjs/colorpicker.jsx` into `www/colorpicker/colorpicker/colorpicker.js`. The latter file is the one actually used by the R package and includes all the relevant JavaScript dependencies in a dialect of JavaScript that most browsers understand. @@ -120,7 +120,7 @@ devtools::document() devtools::install(quick = TRUE) ``` -Alternatively, in RStudio, you can use the keyboard shortcuts `Ctrl+Shift+D` and +In RStudio, you can use the keyboard shortcuts `Ctrl+Shift+D` and `Ctrl-Shift-B` to document and build the package. (On macOS, the shortcuts are `Cmd+Shift+D` and `Cmd+Shift+B`) @@ -133,7 +133,7 @@ run `app.R` to see a demo in action: shiny::runApp() ``` -Alternatively, in RStudio, you can open `app.R` and press `Ctrl-Shift-Enter` +In RStudio, you can open `app.R` and press `Ctrl-Shift-Enter` (`Cmd-Shift-Enter` on macOS). You should see something like the following appear in the Viewer pane: @@ -141,7 +141,7 @@ in the Viewer pane: ## Authoring a React input -At this point, we've built some scaffolding for an input powered by React. +At this point, we have a working (if simple) React-powered text input. Let's modify it to create an interface to the `react-color` library. ### Connecting Shiny with React @@ -177,7 +177,8 @@ take](http://casesandberg.github.io/react-color/#api) the following color, that will be called when the new color is selected These operations are conceptually similar enough to the API expected of Shiny -inputs that `reactR` can assist with mapping components to inputs. +inputs that `reactR` can assist with integrating React components into Shiny +as inputs. It does so by introducing a convention for wrapping components like those provided by `react-color` with an intermediate component that accepts these @@ -234,7 +235,7 @@ package. After rebuilding the JavaScript and the package, try running `app.R` again. You should see something like this: -![](./input_sketchpicker_working.jpg) +![](./input_sketchpicker.gif) When you select new colors, you should see the `textOutput` update accordingly. From 3e4563b8cd3981b92fdd1be335c8530a06924b96 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 14 Mar 2019 22:38:51 -0700 Subject: [PATCH 47/58] webpack --- inst/www/react-tools/react-tools.js | 4 +++- inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index f32c5a7..e9304ed 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -410,7 +410,9 @@ function reactWidget(name, type, components, options) { } lastValue = value; - } + } // with functional stateless components this will be null + // see https://reactjs.org/docs/react-dom.html#render for more details + this.instance.component = ReactDOM.render(hydrate(components, value.tag), el); }; diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index b082e4f..0d11f8a 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","data","JSON","parse","next","text","callback","removeData","ReactDOM","call","element","React","createElement","getInputConfiguration","getValue","setValue","bind","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n initialize(el) {\r\n $(el).data('value', JSON.parse($(el).next().text()));\r\n $(el).data('configuration', JSON.parse($(el).next().next().text()));\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n $(el).removeData('callback');\r\n ReactDOM.render(null, el);\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return $(el).data('value');\r\n }\r\n setInputValue(el, value) {\r\n $(el).data('value', value);\r\n }\r\n getInputConfiguration(el) {\r\n return $(el).data('configuration');\r\n }\r\n setInputConfiguration(el, configuration) {\r\n $(el).data('configuration', configuration);\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","data","JSON","parse","next","text","callback","removeData","ReactDOM","call","element","React","createElement","getInputConfiguration","getValue","setValue","bind","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AAEA;;;;;;;;;AAQA,SAASA,qBAAT,CAA+BC,EAA/B,QAA6D;AAAA,MAAxBC,aAAwB,QAAxBA,aAAwB;AAAA,MAATC,KAAS,QAATA,KAAS;AAC3D,MAAIC,KAAK,GAAG,KAAZ;;AACA,MAAIF,aAAa,KAAKG,SAAtB,EAAiC;AAC/B,SAAKC,qBAAL,CAA2BL,EAA3B,EAA+BC,aAA/B;AACAE,SAAK,GAAG,IAAR;AACD;;AACD,MAAID,KAAK,KAAKE,SAAd,EAAyB;AACvB,SAAKE,aAAL,CAAmBN,EAAnB,EAAuBE,KAAvB;AACAC,SAAK,GAAG,IAAR;AACD;;AACD,MAAIA,KAAJ,EAAW;AACT,SAAKI,WAAL,CAAiBP,EAAjB;AACA,SAAKQ,MAAL,CAAYR,EAAZ;AACD;AACF;;AAED,IAAMS,cAAc,GAAG;AACrBC,gBAAc,EAAEX;AADK,CAAvB;AAIA;;;;;;;;;;;;;;;AAcO,SAASY,eAAT,CAAyBC,QAAzB,EACoBC,IADpB,EAEoBC,SAFpB,EAGoBC,OAHpB,EAG6B;AAClCA,SAAO,GAAGC,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBR,cAAlB,EAAkCM,OAAlC,CAAV;AACAG,8CAAK,CAACC,aAAN,CAAoBC,QAApB,CAA6B;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAE3B;;;AAF2B,2BAMtBC,KANsB,EAMf;AACV,eAAOC,6CAAC,CAACD,KAAD,CAAD,CAASE,IAAT,CAAcX,QAAd,CAAP;AACD;AAR0B;AAAA;AAAA,+BASlBZ,EATkB,EASd;AACX,eAAO,KAAKwB,aAAL,CAAmBxB,EAAnB,CAAP;AACD;AAX0B;AAAA;AAAA,+BAYlBA,EAZkB,EAYdE,KAZc,EAYP;AAClB,aAAKI,aAAL,CAAmBN,EAAnB,EAAuBE,KAAvB;AACA,aAAKK,WAAL,CAAiBP,EAAjB;AACA,aAAKQ,MAAL,CAAYR,EAAZ;AACD;AAhB0B;AAAA;AAAA,iCAiBhBA,EAjBgB,EAiBZ;AACbsB,qDAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,OAAX,EAAoBC,IAAI,CAACC,KAAL,CAAWL,6CAAC,CAACtB,EAAD,CAAD,CAAM4B,IAAN,GAAaC,IAAb,EAAX,CAApB;AACAP,qDAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,eAAX,EAA4BC,IAAI,CAACC,KAAL,CAAWL,6CAAC,CAACtB,EAAD,CAAD,CAAM4B,IAAN,GAAaA,IAAb,GAAoBC,IAApB,EAAX,CAA5B;AACD;AApB0B;AAAA;AAAA,gCAqBjB7B,EArBiB,EAqBb8B,QArBa,EAqBH;AACtBR,qDAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,UAAX,EAAuBK,QAAvB;AACA,aAAKtB,MAAL,CAAYR,EAAZ;AACD;AAxB0B;AAAA;AAAA,kCAyBfA,EAzBe,EAyBX8B,QAzBW,EAyBD;AACxBR,qDAAC,CAACtB,EAAD,CAAD,CAAM+B,UAAN,CAAiB,UAAjB;AACAC,wDAAQ,CAACxB,MAAT,CAAgB,IAAhB,EAAsBR,EAAtB;AACD;AA5B0B;AAAA;AAAA,qCA6BZA,EA7BY,EA6BRyB,IA7BQ,EA6BF;AACvBV,eAAO,CAACL,cAAR,CAAuBuB,IAAvB,CAA4B,IAA5B,EAAkCjC,EAAlC,EAAsCyB,IAAtC;AACD;AAED;;;;;AAjC2B;AAAA;AAAA,oCAsCbzB,EAtCa,EAsCT;AAChB,eAAOsB,6CAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,OAAX,CAAP;AACD;AAxC0B;AAAA;AAAA,oCAyCbzB,EAzCa,EAyCTE,KAzCS,EAyCF;AACvBoB,qDAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,OAAX,EAAoBvB,KAApB;AACD;AA3C0B;AAAA;AAAA,4CA4CLF,EA5CK,EA4CD;AACxB,eAAOsB,6CAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,eAAX,CAAP;AACD;AA9C0B;AAAA;AAAA,4CA+CLzB,EA/CK,EA+CDC,aA/CC,EA+Cc;AACvCqB,qDAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,eAAX,EAA4BxB,aAA5B;AACD;AAjD0B;AAAA;AAAA,kCAkDfD,EAlDe,EAkDX;AACd,eAAOsB,6CAAC,CAACtB,EAAD,CAAD,CAAMyB,IAAN,CAAW,UAAX,CAAP;AACD;AApD0B;AAAA;AAAA,6BAqDpBzB,EArDoB,EAqDhB;AACT,YAAMkC,OAAO,GAAGC,4CAAK,CAACC,aAAN,CAAoBtB,SAApB,EAA+B;AAC7Cb,uBAAa,EAAE,KAAKoC,qBAAL,CAA2BrC,EAA3B,CAD8B;AAE7CE,eAAK,EAAE,KAAKoC,QAAL,CAActC,EAAd,CAFsC;AAG7CuC,kBAAQ,EAAE,KAAKA,QAAL,CAAcC,IAAd,CAAmB,IAAnB,EAAyBxC,EAAzB;AAHmC,SAA/B,CAAhB;AAKAgC,wDAAQ,CAACxB,MAAT,CAAgB0B,OAAhB,EAAyBlC,EAAzB;AACD;AA5D0B;;AAAA;AAAA,IAAkBkB,4CAAK,CAACuB,YAAxB,IAA7B,EA6DG5B,IA7DH;AA8DD,C;;;;;;;;;;;;AClHD;AAAA;AAAA;AAAA;AACA;AAEA6B,MAAM,CAACC,MAAP,GAAgB;AACdhC,iBAAe,EAAEA,sDADH;AAEdiC,aAAW,EAAEA,mDAFC;AAGdC,SAAO,EAAEA,+CAAOA;AAHF,CAAhB,C;;;;;;;;;;;;;;;;;;;;;ACHA;;;;;;;AAOO,SAASA,OAAT,CAAiBC,UAAjB,EAA6BC,GAA7B,EAAkC;AACrC,MAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B,OAAOA,GAAP;;AAC7B,MAAIA,GAAG,CAAClC,IAAJ,CAAS,CAAT,MAAgBkC,GAAG,CAAClC,IAAJ,CAAS,CAAT,EAAYmC,WAAZ,EAAhB,IACG,CAACF,UAAU,CAACG,cAAX,CAA0BF,GAAG,CAAClC,IAA9B,CADR,EAC6C;AACzC,UAAM,IAAIqC,KAAJ,CAAU,wBAAwBH,GAAG,CAAClC,IAAtC,CAAN;AACH;;AACD,MAAIsC,IAAI,GAAGL,UAAU,CAACG,cAAX,CAA0BF,GAAG,CAAClC,IAA9B,IAAsCiC,UAAU,CAACC,GAAG,CAAClC,IAAL,CAAhD,GAA6DkC,GAAG,CAAClC,IAA5E;AAAA,MACIuC,IAAI,GAAG,CAACD,IAAD,EAAOJ,GAAG,CAACM,OAAX,CADX;;AAEA,OAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGP,GAAG,CAACQ,QAAJ,CAAaC,MAAjC,EAAyCF,CAAC,EAA1C,EAA8C;AAC1CF,QAAI,CAACK,IAAL,CAAUZ,OAAO,CAACC,UAAD,EAAaC,GAAG,CAACQ,QAAJ,CAAaD,CAAb,CAAb,CAAjB;AACH;;AACD,SAAOnB,KAAK,CAACC,aAAN,CAAoBsB,KAApB,CAA0BvB,KAA1B,EAAiCiB,IAAjC,CAAP;AACH;AAEM,IAAM3C,cAAc,GAAG;AAC1B;AACA;AACAkD,eAAa,EAAE,OAHW;AAI1B;AACA;AACAC,gBAAc,EAAE,QANU;AAO1B;AACA;AACAC,UAAQ,EAAE,KATgB;AAU1B;AACA;AACA;AACAC,gBAAc,EAAE;AAbU,CAAvB;AAgBA,SAASC,YAAT,CAAsBhD,OAAtB,EAA+B;AAClC,MAAIiD,MAAM,GAAG,EAAb;;AACA,OAAK,IAAIC,CAAT,IAAcxD,cAAd,EAA8B;AAC1BuD,UAAM,CAACC,CAAD,CAAN,GAAYxD,cAAc,CAACwD,CAAD,CAA1B;AACH;;AACD,OAAK,IAAIA,CAAT,IAAclD,OAAd,EAAuB;AACnB,QAAI,CAACN,cAAc,CAACwC,cAAf,CAA8BgB,CAA9B,CAAL,EAAuC;AACnC,YAAM,IAAIf,KAAJ,CAAU,0BAA0Be,CAApC,CAAN;AACH;;AACDD,UAAM,CAACC,CAAD,CAAN,GAAYlD,OAAO,CAACkD,CAAD,CAAnB;AACH;;AACD,SAAOD,MAAP;AACH;AAEM,SAASE,eAAT,CAAyBC,GAAzB,EAA8BpD,OAA9B,EAAuC;AAC1C,MAAIA,OAAO,CAAC8C,QAAZ,EAAsB;AAClB,WAAOM,GAAG,GAAG,IAAb;AACH,GAFD,MAEO;AACH,WAAOA,GAAP;AACH;AACJ;AAEM,SAASC,KAAT,CAAelE,KAAf,EAAsB;AACzB,SAAQ,QAAOA,KAAP,MAAiB,QAAlB,IACAA,KAAK,CAAC+C,cAAN,CAAqB,MAArB,CADA,IAEA/C,KAAK,CAAC+C,cAAN,CAAqB,SAArB,CAFA,IAGA/C,KAAK,CAAC+C,cAAN,CAAqB,UAArB,CAHP;AAIH;AAED;;;;;;;;;;AASO,SAASL,WAAT,CAAqB/B,IAArB,EAA2BwD,IAA3B,EAAiCvB,UAAjC,EAA6C/B,OAA7C,EAAsD;AACzD,MAAIuD,aAAa,GAAGP,YAAY,CAAChD,OAAD,CAAhC;AACA2B,QAAM,CAAC6B,WAAP,CAAmBC,MAAnB,CAA0B;AACtB3D,QAAI,EAAEA,IADgB;AAEtBwD,QAAI,EAAEA,IAFgB;AAGtBI,WAAO,EAAE,iBAAUzE,EAAV,EAAc0E,KAAd,EAAqBC,MAArB,EAA6B;AAClC,UAAIC,SAAJ;AAAA,UACIC,QAAQ,GAAG,EADf;AAAA,UAEIC,WAAW,GAAI,SAAfA,WAAe,CAAU5E,KAAV,EAAiB;AAC5B,YAAIoE,aAAa,CAACR,cAAlB,EAAkC;AAC9B;AACA;AACA,cAAI,QAAO5D,KAAK,CAAC6C,GAAb,MAAqB,QAAzB,EAAmC;AAC/B7C,iBAAK,CAAC6C,GAAN,CAAUM,OAAV,CAAkBiB,aAAa,CAAC,eAAD,CAA/B,IAAoDJ,eAAe,CAACQ,KAAD,CAAnE;AACAxE,iBAAK,CAAC6C,GAAN,CAAUM,OAAV,CAAkBiB,aAAa,CAAC,gBAAD,CAA/B,IAAqDJ,eAAe,CAACS,MAAD,CAApE;AACH;;AACDC,mBAAS,GAAG1E,KAAZ;AACH,SAT2B,CAU5B;AACA;;;AACA,aAAK2E,QAAL,CAAc/D,SAAd,GAA0BkB,QAAQ,CAACxB,MAAT,CAAgBqC,OAAO,CAACC,UAAD,EAAa5C,KAAK,CAAC6C,GAAnB,CAAvB,EAAgD/C,EAAhD,CAA1B;AACH,OAfL;;AAgBA,aAAO;AACH6E,gBAAQ,EAAEA,QADP;AAEHC,mBAAW,EAAEA,WAFV;AAGHC,cAAM,EAAE,gBAAUC,QAAV,EAAoBC,SAApB,EAA+B;AACnC,cAAIX,aAAa,CAACR,cAAlB,EAAkC;AAC9BY,iBAAK,GAAGM,QAAR;AACAL,kBAAM,GAAGM,SAAT;AACAH,uBAAW,CAACF,SAAD,CAAX;AACH;AACJ;AATE,OAAP;AAWH;AA/BqB,GAA1B;AAiCH,C;;;;;;;;;;;AC9GD,+B;;;;;;;;;;;ACAA,8B;;;;;;;;;;;ACAA,iC;;;;;;;;;;;ACAA,8B","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n initialize(el) {\r\n $(el).data('value', JSON.parse($(el).next().text()));\r\n $(el).data('configuration', JSON.parse($(el).next().next().text()));\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n $(el).removeData('callback');\r\n ReactDOM.render(null, el);\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return $(el).data('value');\r\n }\r\n setInputValue(el, value) {\r\n $(el).data('value', value);\r\n }\r\n getInputConfiguration(el) {\r\n return $(el).data('configuration');\r\n }\r\n setInputConfiguration(el, configuration) {\r\n $(el).data('configuration', configuration);\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n // with functional stateless components this will be null\r\n // see https://reactjs.org/docs/react-dom.html#render for more details\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From eebdfda889243b4d1c40b46f90bf313730883705 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 11:15:12 -0700 Subject: [PATCH 48/58] Restrict name strings in scaffolding to avoid subsequent problems --- R/reacttools.R | 6 ++++++ R/scaffold_utils.R | 6 +----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/R/reacttools.R b/R/reacttools.R index f0210ed..167571a 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -1,3 +1,9 @@ +# A robust name string is a valid +# - CSS class +# - JavaScript variable name +# - R variable name +robustName <- "^[[:alpha:]_][[:alnum:]_]*$" + isUpper <- function(s) { grepl("^[[:upper:]]+$", s) } diff --git a/R/scaffold_utils.R b/R/scaffold_utils.R index 5323f59..3cfc628 100644 --- a/R/scaffold_utils.R +++ b/R/scaffold_utils.R @@ -53,14 +53,10 @@ getPackage <- function() { read.dcf('DESCRIPTION')[[1,"Package"]] } -validName <- function(name) { - grepl("^[[:alpha:]_][[:alnum:]_]*$", name) -} - # Constraining names prevents the user from encountering obscure CSS problems # and JavaScript errors after scaffolding. assertNameValid <- function(name) { - if (!validName(name)) { + if (!grepl(robustName, name)) { msg <- sprintf("Name '%s' is invalid, names must begin with an alphabetic character and must contain only alphabetic and numeric characters", name) stop(msg, call. = FALSE) } From d11dadbaecefc81da7452311218ba25400528ecf Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 11:16:39 -0700 Subject: [PATCH 49/58] Add .DS_Store to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2797210..569985b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ node_modules reactR.Rcheck reactR_*.tar.gz *.swp +.DS_Store From 7c6065a121cefb9f4ac9052f55309808462e0e51 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 11:18:03 -0700 Subject: [PATCH 50/58] In input scaffold, depend on shiny instead of htmlwidgets --- R/scaffold_input.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/scaffold_input.R b/R/scaffold_input.R index b23e46f..6dbb58b 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -70,7 +70,7 @@ scaffoldReactShinyInput <- function(name, npmPkgs = NULL, edit = interactive()) usethis::use_build_ignore(c("node_modules", "srcjs")) usethis::use_git_ignore(c("node_modules")) - lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) + lapply(c("htmltools", "shiny", "reactR"), usethis::use_package) message("To install dependencies from npm run: yarn install") message("To build JavaScript run: yarn run webpack --mode=development") From d82e6f27d06e51a552aa03b52d8747864d5c2ed8 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 11:45:02 -0700 Subject: [PATCH 51/58] Add app.R and assorted JS files to .Rbuildignore in scaffolded projects --- R/scaffold_input.R | 2 +- R/scaffold_widget.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/scaffold_input.R b/R/scaffold_input.R index 6dbb58b..fc9df6a 100644 --- a/R/scaffold_input.R +++ b/R/scaffold_input.R @@ -68,7 +68,7 @@ scaffoldReactShinyInput <- function(name, npmPkgs = NULL, edit = interactive()) ) ) - usethis::use_build_ignore(c("node_modules", "srcjs")) + usethis::use_build_ignore(c("node_modules", "srcjs", "app.R", "package.json", "webpack.config.js", "yarn.lock")) usethis::use_git_ignore(c("node_modules")) lapply(c("htmltools", "shiny", "reactR"), usethis::use_package) diff --git a/R/scaffold_widget.R b/R/scaffold_widget.R index 4d54eb7..4240f1b 100644 --- a/R/scaffold_widget.R +++ b/R/scaffold_widget.R @@ -26,7 +26,7 @@ scaffoldReactWidget <- function(name, npmPkgs = NULL, edit = interactive()){ addWidgetJS(name, edit) addExampleApp(name) - usethis::use_build_ignore(c("node_modules", "srcjs")) + usethis::use_build_ignore(c("node_modules", "srcjs", "app.R", "package.json", "webpack.config.js", "yarn.lock")) usethis::use_git_ignore(c("node_modules")) lapply(c("htmltools", "htmlwidgets", "reactR"), usethis::use_package) From 74514c8e581ac53d648b8ab5c446c75e71a0ada1 Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 11:55:29 -0700 Subject: [PATCH 52/58] Improve input vignette: fix typos, use video instead of gif --- vignettes/input_sketchpicker.gif | Bin 239890 -> 0 bytes vignettes/input_sketchpicker.mp4 | Bin 0 -> 63184 bytes vignettes/intro_inputs.Rmd | 8 +++++--- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 vignettes/input_sketchpicker.gif create mode 100644 vignettes/input_sketchpicker.mp4 diff --git a/vignettes/input_sketchpicker.gif b/vignettes/input_sketchpicker.gif deleted file mode 100644 index c5437bf4b8f3b21a27cb318477a6cdb2e0d5c185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239890 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

rhoy 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
yPa*Gs-R|zC0$&?m(^!D-OCPid+ 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 LW~cZVkk$VH$jCo1 diff --git a/vignettes/input_sketchpicker.mp4 b/vignettes/input_sketchpicker.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..97b06ddd08b628394ed9a0b5442fec7a32c00054 GIT binary patch literal 63184 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
Ph;P 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 literal 0 HcmV?d00001 diff --git a/vignettes/intro_inputs.Rmd b/vignettes/intro_inputs.Rmd index 7a15f28..6062cbb 100644 --- a/vignettes/intro_inputs.Rmd +++ b/vignettes/intro_inputs.Rmd @@ -120,9 +120,9 @@ devtools::document() devtools::install(quick = TRUE) ``` -In RStudio, you can use the keyboard shortcuts `Ctrl+Shift+D` and +In RStudio, you can use the keyboard shortcuts `Ctrl-Shift-D` and `Ctrl-Shift-B` to document and build the package. (On macOS, the shortcuts are -`Cmd+Shift+D` and `Cmd+Shift+B`) +`Cmd-Shift-D` and `Cmd-Shift-B`) ## Run the included demo @@ -235,7 +235,9 @@ package. After rebuilding the JavaScript and the package, try running `app.R` again. You should see something like this: -![](./input_sketchpicker.gif) + When you select new colors, you should see the `textOutput` update accordingly. From e3e5b355737bc62731c7ab42fc36e10091083e9f Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 28 Mar 2019 12:01:13 -0700 Subject: [PATCH 53/58] webpack --- inst/www/react-tools/react-tools.js | 78 ++++++++++++------------- inst/www/react-tools/react-tools.js.map | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/inst/www/react-tools/react-tools.js b/inst/www/react-tools/react-tools.js index e9304ed..c785223 100644 --- a/inst/www/react-tools/react-tools.js +++ b/inst/www/react-tools/react-tools.js @@ -126,13 +126,13 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || func -/* - * This default receiveMessage implementation expects data to contain whole - * configuration and value properties. If either is present, it will be set and - * the component will be re-rendered. Because receiveMessage is typically used - * by input authors to perform incremental updates, this default implementation - * can be overriden by the user with the receiveMessage arguments to - * reactShinyInput. +/* + * This default receiveMessage implementation expects data to contain whole + * configuration and value properties. If either is present, it will be set and + * the component will be re-rendered. Because receiveMessage is typically used + * by input authors to perform incremental updates, this default implementation + * can be overriden by the user with the receiveMessage arguments to + * reactShinyInput. */ function defaultReceiveMessage(el, _ref) { @@ -159,19 +159,19 @@ function defaultReceiveMessage(el, _ref) { var defaultOptions = { receiveMessage: defaultReceiveMessage }; -/** - * Installs a new Shiny input binding based on a React component. - * - * @param {string} selector - jQuery selector that should identify the set of - * container elements within the scope argument of Shiny.InputBinding.find. - * @param {string} name - A name such as 'acme.FooInput' that should uniquely - * identify the component. - * @param {Object} component - React Component, either class or function. - * @param {Object} options - Additional configuration options. Supported - * options are: - * - receiveMessage: Implementation of Shiny.InputBinding to use in place of - * the default. Typically overridden as an optimization to perform - * incremental value updates. +/** + * Installs a new Shiny input binding based on a React component. + * + * @param {string} selector - jQuery selector that should identify the set of + * container elements within the scope argument of Shiny.InputBinding.find. + * @param {string} name - A name such as 'acme.FooInput' that should uniquely + * identify the component. + * @param {Object} component - React Component, either class or function. + * @param {Object} options - Additional configuration options. Supported + * options are: + * - receiveMessage: Implementation of Shiny.InputBinding to use in place of + * the default. Typically overridden as an optimization to perform + * incremental value updates. */ function reactShinyInput(selector, name, component, options) { @@ -190,8 +190,8 @@ function reactShinyInput(selector, name, component, options) { _createClass(_class, [{ key: "find", - /* - * Methods override those in Shiny.InputBinding + /* + * Methods override those in Shiny.InputBinding */ value: function find(scope) { return jquery__WEBPACK_IMPORTED_MODULE_3___default()(scope).find(selector); @@ -231,9 +231,9 @@ function reactShinyInput(selector, name, component, options) { value: function receiveMessage(el, data) { options.receiveMessage.call(this, el, data); } - /* - * Methods not present in Shiny.InputBinding but accessible to users - * through `this` in receiveMessage + /* + * Methods not present in Shiny.InputBinding but accessible to users + * through `this` in receiveMessage * */ }, { @@ -317,12 +317,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reactWidget", function() { return reactWidget; }); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -/** - * Recursively transforms tag, a JSON representation of an instance of a - * React component and its children, into a React element suitable for - * passing to ReactDOM.render. - * @param {Object} components - * @param {Object} tag +/** + * Recursively transforms tag, a JSON representation of an instance of a + * React component and its children, into a React element suitable for + * passing to ReactDOM.render. + * @param {Object} components + * @param {Object} tag */ function hydrate(components, tag) { if (typeof tag === 'string') return tag; @@ -382,14 +382,14 @@ function formatDimension(dim, options) { function isTag(value) { return _typeof(value) === 'object' && value.hasOwnProperty('name') && value.hasOwnProperty('attribs') && value.hasOwnProperty('children'); } -/** - * Creates an HTMLWidget that is updated by rendering a React component. - * React component constructors are made available by specifying them by - * name in the components object. - * @param {string} name - * @param {string} type - * @param {Object} components - * @param {Object} options +/** + * Creates an HTMLWidget that is updated by rendering a React component. + * React component constructors are made available by specifying them by + * name in the components object. + * @param {string} name + * @param {string} type + * @param {Object} components + * @param {Object} options */ function reactWidget(name, type, components, options) { diff --git a/inst/www/react-tools/react-tools.js.map b/inst/www/react-tools/react-tools.js.map index 0d11f8a..b4e27bf 100644 --- a/inst/www/react-tools/react-tools.js.map +++ b/inst/www/react-tools/react-tools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","data","JSON","parse","next","text","callback","removeData","ReactDOM","call","element","React","createElement","getInputConfiguration","getValue","setValue","bind","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport Shiny from 'shiny';\r\nimport $ from 'jquery';\r\n\r\n/*\r\n * This default receiveMessage implementation expects data to contain whole\r\n * configuration and value properties. If either is present, it will be set and\r\n * the component will be re-rendered. Because receiveMessage is typically used\r\n * by input authors to perform incremental updates, this default implementation\r\n * can be overriden by the user with the receiveMessage arguments to\r\n * reactShinyInput.\r\n */\r\nfunction defaultReceiveMessage(el, { configuration, value }) {\r\n let dirty = false;\r\n if (configuration !== undefined) {\r\n this.setInputConfiguration(el, configuration);\r\n dirty = true;\r\n }\r\n if (value !== undefined) {\r\n this.setInputValue(el, value);\r\n dirty = true;\r\n }\r\n if (dirty) {\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n}\r\n\r\nconst defaultOptions = {\r\n receiveMessage: defaultReceiveMessage\r\n};\r\n\r\n/**\r\n * Installs a new Shiny input binding based on a React component.\r\n *\r\n * @param {string} selector - jQuery selector that should identify the set of\r\n * container elements within the scope argument of Shiny.InputBinding.find.\r\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\r\n * identify the component.\r\n * @param {Object} component - React Component, either class or function.\r\n * @param {Object} options - Additional configuration options. Supported\r\n * options are:\r\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\r\n * the default. Typically overridden as an optimization to perform\r\n * incremental value updates.\r\n */\r\nexport function reactShinyInput(selector,\r\n name,\r\n component,\r\n options) {\r\n options = Object.assign({}, defaultOptions, options);\r\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\r\n\r\n /*\r\n * Methods override those in Shiny.InputBinding\r\n */\r\n\r\n find(scope) {\r\n return $(scope).find(selector);\r\n }\r\n getValue(el) {\r\n return this.getInputValue(el);\r\n }\r\n setValue(el, value) {\r\n this.setInputValue(el, value);\r\n this.getCallback(el)();\r\n this.render(el);\r\n }\r\n initialize(el) {\r\n $(el).data('value', JSON.parse($(el).next().text()));\r\n $(el).data('configuration', JSON.parse($(el).next().next().text()));\r\n }\r\n subscribe(el, callback) {\r\n $(el).data('callback', callback);\r\n this.render(el);\r\n }\r\n unsubscribe(el, callback) {\r\n $(el).removeData('callback');\r\n ReactDOM.render(null, el);\r\n }\r\n receiveMessage(el, data) {\r\n options.receiveMessage.call(this, el, data);\r\n }\r\n\r\n /*\r\n * Methods not present in Shiny.InputBinding but accessible to users\r\n * through `this` in receiveMessage\r\n * */\r\n\r\n getInputValue(el) {\r\n return $(el).data('value');\r\n }\r\n setInputValue(el, value) {\r\n $(el).data('value', value);\r\n }\r\n getInputConfiguration(el) {\r\n return $(el).data('configuration');\r\n }\r\n setInputConfiguration(el, configuration) {\r\n $(el).data('configuration', configuration);\r\n }\r\n getCallback(el) {\r\n return $(el).data('callback');\r\n }\r\n render(el) {\r\n const element = React.createElement(component, {\r\n configuration: this.getInputConfiguration(el),\r\n value: this.getValue(el),\r\n setValue: this.setValue.bind(this, el)\r\n });\r\n ReactDOM.render(element, el);\r\n }\r\n }, name);\r\n}\r\n\r\n","import { reactWidget, hydrate } from './widget';\r\nimport { reactShinyInput } from './input';\r\n\r\nwindow.reactR = {\r\n reactShinyInput: reactShinyInput,\r\n reactWidget: reactWidget,\r\n hydrate: hydrate\r\n};\r\n","/**\r\n * Recursively transforms tag, a JSON representation of an instance of a\r\n * React component and its children, into a React element suitable for\r\n * passing to ReactDOM.render.\r\n * @param {Object} components\r\n * @param {Object} tag\r\n */\r\nexport function hydrate(components, tag) {\r\n if (typeof tag === 'string') return tag;\r\n if (tag.name[0] === tag.name[0].toUpperCase()\r\n && !components.hasOwnProperty(tag.name)) {\r\n throw new Error(\"Unknown component: \" + tag.name);\r\n }\r\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\r\n args = [elem, tag.attribs];\r\n for (var i = 0; i < tag.children.length; i++) {\r\n args.push(hydrate(components, tag.children[i]));\r\n }\r\n return React.createElement.apply(React, args);\r\n}\r\n\r\nexport const defaultOptions = {\r\n // The name of the property on the root tag to use for the width, if\r\n // it's updated.\r\n widthProperty: \"width\",\r\n // The name of the property on the root tag to use for the height, if\r\n // it's updated.\r\n heightProperty: \"height\",\r\n // Whether or not to append the string 'px' to the width and height\r\n // properties when they change.\r\n appendPx: false,\r\n // Whether or not to dynamically update the width and height properties\r\n // of the last known tag when the computed width and height change in\r\n // the browser.\r\n renderOnResize: false\r\n};\r\n\r\nexport function mergeOptions(options) {\r\n var merged = {};\r\n for (var k in defaultOptions) {\r\n merged[k] = defaultOptions[k];\r\n }\r\n for (var k in options) {\r\n if (!defaultOptions.hasOwnProperty(k)) {\r\n throw new Error(\"Unrecognized option: \" + k);\r\n }\r\n merged[k] = options[k];\r\n }\r\n return merged;\r\n}\r\n\r\nexport function formatDimension(dim, options) {\r\n if (options.appendPx) {\r\n return dim + 'px';\r\n } else {\r\n return dim;\r\n }\r\n}\r\n\r\nexport function isTag(value) {\r\n return (typeof value === 'object')\r\n && value.hasOwnProperty('name')\r\n && value.hasOwnProperty('attribs')\r\n && value.hasOwnProperty('children');\r\n}\r\n\r\n/**\r\n * Creates an HTMLWidget that is updated by rendering a React component.\r\n * React component constructors are made available by specifying them by\r\n * name in the components object.\r\n * @param {string} name\r\n * @param {string} type\r\n * @param {Object} components\r\n * @param {Object} options\r\n */\r\nexport function reactWidget(name, type, components, options) {\r\n var actualOptions = mergeOptions(options);\r\n window.HTMLWidgets.widget({\r\n name: name,\r\n type: type,\r\n factory: function (el, width, height) {\r\n var lastValue,\r\n instance = {},\r\n renderValue = (function (value) {\r\n if (actualOptions.renderOnResize) {\r\n // value.tag might be a primitive string, in which\r\n // case there is no attribs property.\r\n if (typeof value.tag === 'object') {\r\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\r\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\r\n }\r\n lastValue = value;\r\n }\r\n // with functional stateless components this will be null\r\n // see https://reactjs.org/docs/react-dom.html#render for more details\r\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\r\n });\r\n return {\r\n instance: instance,\r\n renderValue: renderValue,\r\n resize: function (newWidth, newHeight) {\r\n if (actualOptions.renderOnResize) {\r\n width = newWidth;\r\n height = newHeight;\r\n renderValue(lastValue);\r\n }\r\n }\r\n };\r\n }\r\n })\r\n}\r\n\r\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./srcjs/input.js","webpack:///./srcjs/react-tools.js","webpack:///./srcjs/widget.js","webpack:///external \"window.jQuery\"","webpack:///external \"window.React\"","webpack:///external \"window.ReactDOM\"","webpack:///external \"window.Shiny\""],"names":["defaultReceiveMessage","el","configuration","value","dirty","undefined","setInputConfiguration","setInputValue","getCallback","render","defaultOptions","receiveMessage","reactShinyInput","selector","name","component","options","Object","assign","Shiny","inputBindings","register","scope","$","find","getInputValue","data","JSON","parse","next","text","callback","removeData","ReactDOM","call","element","React","createElement","getInputConfiguration","getValue","setValue","bind","InputBinding","window","reactR","reactWidget","hydrate","components","tag","toUpperCase","hasOwnProperty","Error","elem","args","attribs","i","children","length","push","apply","widthProperty","heightProperty","appendPx","renderOnResize","mergeOptions","merged","k","formatDimension","dim","isTag","type","actualOptions","HTMLWidgets","widget","factory","width","height","lastValue","instance","renderValue","resize","newWidth","newHeight"],"mappings":"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","file":"react-tools.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./srcjs/react-tools.js\");\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Shiny from 'shiny';\nimport $ from 'jquery';\n\n/*\n * This default receiveMessage implementation expects data to contain whole\n * configuration and value properties. If either is present, it will be set and\n * the component will be re-rendered. Because receiveMessage is typically used\n * by input authors to perform incremental updates, this default implementation\n * can be overriden by the user with the receiveMessage arguments to\n * reactShinyInput.\n */\nfunction defaultReceiveMessage(el, { configuration, value }) {\n let dirty = false;\n if (configuration !== undefined) {\n this.setInputConfiguration(el, configuration);\n dirty = true;\n }\n if (value !== undefined) {\n this.setInputValue(el, value);\n dirty = true;\n }\n if (dirty) {\n this.getCallback(el)();\n this.render(el);\n }\n}\n\nconst defaultOptions = {\n receiveMessage: defaultReceiveMessage\n};\n\n/**\n * Installs a new Shiny input binding based on a React component.\n *\n * @param {string} selector - jQuery selector that should identify the set of\n * container elements within the scope argument of Shiny.InputBinding.find.\n * @param {string} name - A name such as 'acme.FooInput' that should uniquely\n * identify the component.\n * @param {Object} component - React Component, either class or function.\n * @param {Object} options - Additional configuration options. Supported\n * options are:\n * - receiveMessage: Implementation of Shiny.InputBinding to use in place of\n * the default. Typically overridden as an optimization to perform\n * incremental value updates.\n */\nexport function reactShinyInput(selector,\n name,\n component,\n options) {\n options = Object.assign({}, defaultOptions, options);\n Shiny.inputBindings.register(new class extends Shiny.InputBinding {\n\n /*\n * Methods override those in Shiny.InputBinding\n */\n\n find(scope) {\n return $(scope).find(selector);\n }\n getValue(el) {\n return this.getInputValue(el);\n }\n setValue(el, value) {\n this.setInputValue(el, value);\n this.getCallback(el)();\n this.render(el);\n }\n initialize(el) {\n $(el).data('value', JSON.parse($(el).next().text()));\n $(el).data('configuration', JSON.parse($(el).next().next().text()));\n }\n subscribe(el, callback) {\n $(el).data('callback', callback);\n this.render(el);\n }\n unsubscribe(el, callback) {\n $(el).removeData('callback');\n ReactDOM.render(null, el);\n }\n receiveMessage(el, data) {\n options.receiveMessage.call(this, el, data);\n }\n\n /*\n * Methods not present in Shiny.InputBinding but accessible to users\n * through `this` in receiveMessage\n * */\n\n getInputValue(el) {\n return $(el).data('value');\n }\n setInputValue(el, value) {\n $(el).data('value', value);\n }\n getInputConfiguration(el) {\n return $(el).data('configuration');\n }\n setInputConfiguration(el, configuration) {\n $(el).data('configuration', configuration);\n }\n getCallback(el) {\n return $(el).data('callback');\n }\n render(el) {\n const element = React.createElement(component, {\n configuration: this.getInputConfiguration(el),\n value: this.getValue(el),\n setValue: this.setValue.bind(this, el)\n });\n ReactDOM.render(element, el);\n }\n }, name);\n}\n\n","import { reactWidget, hydrate } from './widget';\nimport { reactShinyInput } from './input';\n\nwindow.reactR = {\n reactShinyInput: reactShinyInput,\n reactWidget: reactWidget,\n hydrate: hydrate\n};\n","/**\n * Recursively transforms tag, a JSON representation of an instance of a\n * React component and its children, into a React element suitable for\n * passing to ReactDOM.render.\n * @param {Object} components\n * @param {Object} tag\n */\nexport function hydrate(components, tag) {\n if (typeof tag === 'string') return tag;\n if (tag.name[0] === tag.name[0].toUpperCase()\n && !components.hasOwnProperty(tag.name)) {\n throw new Error(\"Unknown component: \" + tag.name);\n }\n var elem = components.hasOwnProperty(tag.name) ? components[tag.name] : tag.name,\n args = [elem, tag.attribs];\n for (var i = 0; i < tag.children.length; i++) {\n args.push(hydrate(components, tag.children[i]));\n }\n return React.createElement.apply(React, args);\n}\n\nexport const defaultOptions = {\n // The name of the property on the root tag to use for the width, if\n // it's updated.\n widthProperty: \"width\",\n // The name of the property on the root tag to use for the height, if\n // it's updated.\n heightProperty: \"height\",\n // Whether or not to append the string 'px' to the width and height\n // properties when they change.\n appendPx: false,\n // Whether or not to dynamically update the width and height properties\n // of the last known tag when the computed width and height change in\n // the browser.\n renderOnResize: false\n};\n\nexport function mergeOptions(options) {\n var merged = {};\n for (var k in defaultOptions) {\n merged[k] = defaultOptions[k];\n }\n for (var k in options) {\n if (!defaultOptions.hasOwnProperty(k)) {\n throw new Error(\"Unrecognized option: \" + k);\n }\n merged[k] = options[k];\n }\n return merged;\n}\n\nexport function formatDimension(dim, options) {\n if (options.appendPx) {\n return dim + 'px';\n } else {\n return dim;\n }\n}\n\nexport function isTag(value) {\n return (typeof value === 'object')\n && value.hasOwnProperty('name')\n && value.hasOwnProperty('attribs')\n && value.hasOwnProperty('children');\n}\n\n/**\n * Creates an HTMLWidget that is updated by rendering a React component.\n * React component constructors are made available by specifying them by\n * name in the components object.\n * @param {string} name\n * @param {string} type\n * @param {Object} components\n * @param {Object} options\n */\nexport function reactWidget(name, type, components, options) {\n var actualOptions = mergeOptions(options);\n window.HTMLWidgets.widget({\n name: name,\n type: type,\n factory: function (el, width, height) {\n var lastValue,\n instance = {},\n renderValue = (function (value) {\n if (actualOptions.renderOnResize) {\n // value.tag might be a primitive string, in which\n // case there is no attribs property.\n if (typeof value.tag === 'object') {\n value.tag.attribs[actualOptions[\"widthProperty\"]] = formatDimension(width);\n value.tag.attribs[actualOptions[\"heightProperty\"]] = formatDimension(height);\n }\n lastValue = value;\n }\n // with functional stateless components this will be null\n // see https://reactjs.org/docs/react-dom.html#render for more details\n this.instance.component = ReactDOM.render(hydrate(components, value.tag), el);\n });\n return {\n instance: instance,\n renderValue: renderValue,\n resize: function (newWidth, newHeight) {\n if (actualOptions.renderOnResize) {\n width = newWidth;\n height = newHeight;\n renderValue(lastValue);\n }\n }\n };\n }\n })\n}\n\n","module.exports = window.jQuery;","module.exports = window.React;","module.exports = window.ReactDOM;","module.exports = window.Shiny;"],"sourceRoot":""} \ No newline at end of file From da8986a90ac579d8f8bb0fea32a484859d82017d Mon Sep 17 00:00:00 2001 From: Alan Dipert Date: Thu, 4 Apr 2019 10:56:18 -0700 Subject: [PATCH 54/58] inputs: re-order html deps and include corejs for shinytest compat --- R/reacttools.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/reacttools.R b/R/reacttools.R index f0210ed..0e93037 100644 --- a/R/reacttools.R +++ b/R/reacttools.R @@ -133,6 +133,9 @@ createReactShinyInput <- function(inputId, if(length(dependencies) < 1) stop("Must include at least one HTML dependency.") value <- shiny::restoreInput(id = inputId, default = default) htmltools::tagList( + html_dependency_corejs(), + html_dependency_react(), + html_dependency_reacttools(), container(id = inputId, class = class), htmltools::tags$script(id = sprintf("%s_value", inputId), type = "application/json", @@ -140,8 +143,6 @@ createReactShinyInput <- function(inputId, htmltools::tags$script(id = sprintf("%s_configuration", inputId), type = "application/json", jsonlite::toJSON(configuration, auto_unbox = TRUE)), - html_dependency_react(), - html_dependency_reacttools(), dependencies ) } From 973394eaea3434f75b453cf67ac89f6cc454c02f Mon Sep 17 00:00:00 2001 From: timelyportfolio Date: Tue, 9 Apr 2019 05:58:38 -0500 Subject: [PATCH 55/58] increment version and update date in DESCRIPTION --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 07a879d..9417f93 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: reactR Type: Package Title: React Helpers -Version: 0.3.1 -Date: 2019-01-26 +Version: 0.4.0 +Date: 2019-04-10 Authors@R: c( person( "Facebook", "Inc" From f91656d43f7e668132522eb1e11e34ccf3e197f6 Mon Sep 17 00:00:00 2001 From: timelyportfolio Date: Tue, 9 Apr 2019 10:39:39 -0500 Subject: [PATCH 56/58] add reactR namespace to createReactShinyInput --- inst/templates/input_r.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index a2e3deb..3b762ba 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -8,7 +8,7 @@ #' #' @export ${name}Input <- function(inputId, default = "") { - createReactShinyInput( + reactR::createReactShinyInput( inputId, "${name}", htmlDependency( From d6febeaaff8b0438f66f668485b33217b99286ca Mon Sep 17 00:00:00 2001 From: timelyportfolio Date: Tue, 9 Apr 2019 11:00:52 -0500 Subject: [PATCH 57/58] add htmltools namespace to htmlDependency --- inst/templates/input_r.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index 3b762ba..83026eb 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -11,7 +11,7 @@ ${name}Input <- function(inputId, default = "") { reactR::createReactShinyInput( inputId, "${name}", - htmlDependency( + htmltools::htmlDependency( name = "${name}-input", version = "1.0.0", src = "www/${package}/${name}", From 38aca8b32a73c8c91b3c902c7e3e0adef422f293 Mon Sep 17 00:00:00 2001 From: timelyportfolio Date: Tue, 9 Apr 2019 11:01:55 -0500 Subject: [PATCH 58/58] add htmltools namespace to tags$span --- inst/templates/input_r.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/templates/input_r.txt b/inst/templates/input_r.txt index 83026eb..037ffa9 100644 --- a/inst/templates/input_r.txt +++ b/inst/templates/input_r.txt @@ -20,7 +20,7 @@ ${name}Input <- function(inputId, default = "") { ), default, list(), - tags$span + htmltools::tags$span ) }