diff --git a/NAMESPACE b/NAMESPACE index 10b9475..6933b0d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -46,6 +46,7 @@ export(navbar_item) export(navbar_toggle) export(nextui_page) export(numeric_input) +export(pagination) export(popover) export(popover_content) export(popover_trigger) @@ -79,6 +80,7 @@ export(update_date_input) export(update_dropdown) export(update_listbox) export(update_numeric_input) +export(update_pagination) export(update_radio_input) export(update_select_input) export(update_slider_input) diff --git a/R/components.R b/R/components.R index 00b6840..d3e643b 100644 --- a/R/components.R +++ b/R/components.R @@ -13,7 +13,6 @@ component <- function(name) { avatar <- component("Avatar") #' @rdname avatar -#' @inherit component params return #' @export avatar_group <- component("AvatarGroup") @@ -33,17 +32,14 @@ button <- component("Button") card <- component("Card") #' @rdname card -#' @inherit component params return #' @export card_body <- component("CardBody") #' @rdname card -#' @inherit component params return #' @export card_header <- component("CardHeader") #' @rdname card -#' @inherit component params return #' @export card_footer <- component("CardFooter") diff --git a/R/inputs.R b/R/inputs.R index a5b76fa..9f39f29 100644 --- a/R/inputs.R +++ b/R/inputs.R @@ -250,11 +250,12 @@ update_checkboxgroup_input <- function( } #' @rdname accordion -#' @inherit component params return +#' @inherit shinyInput params return #' @export accordion <- input("Accordion") #' @rdname accordion +#' @inherit component params return #' @export accordion_item <- component("AccordionItem") @@ -290,10 +291,12 @@ dropdown_section <- component("DropdownSection") update_dropdown <- shiny.react::updateReactInput #' @rdname listbox +#' @inherit shinyInput params return #' @export listbox <- input("Listbox") #' @rdname listbox +#' @inherit component params return #' @export listbox_section <- component("ListboxSection") @@ -305,11 +308,22 @@ listbox_item <- component("ListboxItem") #' @export update_listbox <- shiny.react::updateReactInput +#' @rdname pagination +#' @inherit shinyInput params return +#' @export +pagination <- input("Pagination", 1) + +#' @rdname pagination +#' @export +update_pagination <- shiny.react::updateReactInput + #' @rdname select +#' @inherit shinyInput params return #' @export select_input <- input("Select", "") #' @rdname select +#' @inherit component params return #' @export select_section <- component("SelectSection") @@ -317,11 +331,12 @@ select_section <- component("SelectSection") #' @export select_item <- component("SelectItem") -#' @rdname sselect +#' @rdname select #' @export update_select_input <- shiny.react::updateReactInput #' @rdname slider +#' @inherit shinyInput params return #' @export slider_input <- input("Slider", numeric()) @@ -330,6 +345,7 @@ slider_input <- input("Slider", numeric()) update_slider_input <- shiny.react::updateReactInput #' @rdname tabs +#' @inherit shinyInput params return #' @export tabs <- input("Tabs", "1") @@ -338,5 +354,6 @@ tabs <- input("Tabs", "1") update_tabs <- shiny.react::updateReactInput #' @rdname tabs +#' @inherit component params return #' @export tab <- component("Tab") diff --git a/R/layout.R b/R/layout.R index e41847c..cae3164 100644 --- a/R/layout.R +++ b/R/layout.R @@ -51,21 +51,17 @@ spacer <- component("Spacer") navbar <- component("Navbar") #' @rdname navbar -#' @inherit component params return #' @export navbar_brand <- component("NavbarBrand") #' @rdname navbar -#' @inherit component params return #' @export navbar_content <- component("NavbarContent") #' @rdname navbar -#' @inherit component params return #' @export navbar_item <- component("NavbarItem") #' @rdname navbar -#' @inherit component params return #' @export navbar_toggle <- component("NavbarToggle") diff --git a/inst/examples/pagination/app.R b/inst/examples/pagination/app.R new file mode 100644 index 0000000..9111318 --- /dev/null +++ b/inst/examples/pagination/app.R @@ -0,0 +1,59 @@ +library(shiny) +library(shinyNextUI) +library(shiny.react) +library(thematic) + +thematic_shiny() + +max <- 10 +cards <- lapply(seq_len(max), function(i) { + tagList( + spacer(y = 2), + card( + id = sprintf("mycard-%s", i), + card_header(sprintf("Card %s", i)), + card_body( + sprintf("Card content %s", i), + slider_input(sprintf("obs-%s", i), "Obs", minValue = 0, maxValue = 1000, value = 500), + plotOutput(sprintf("distPlot-%s", i)) + ) + ) + ) +}) + +ui <- nextui_page( + pagination( + inputId = "pagination", + loop = TRUE, + size = "lg", + variant = "bordered", + showControls = TRUE, + page = 1, + total = max + ) +) + +server <- function(input, output, session) { + + history <- reactiveVal(NULL) + + # Dynamically insert cards with the pagination. + observeEvent(input$pagination, { + if (!is.null(history())) removeUI(sprintf("#mycard-%s", history()), multiple = TRUE) + insertUI( + selector = "#pagination", + where = "afterEnd", + ui = cards[[input$pagination]] + ) + history(input$pagination) + + output[[sprintf("distPlot-%s", history())]] <- renderPlot({ + hist( + rnorm(input[[sprintf("obs-%s", history())]]), + main = sprintf("Super plot %s", history()) + ) + }) + }) +} + +if (interactive() || is_testing()) shinyApp(ui, server) diff --git a/inst/helpers/doc/generate-doc.R b/inst/helpers/doc/generate-doc.R index d0c1074..8ea0ae4 100644 --- a/inst/helpers/doc/generate-doc.R +++ b/inst/helpers/doc/generate-doc.R @@ -93,6 +93,7 @@ items <- list( "listbox", "modal", "navbar", + "pagination", "popover", "progress", "radio", diff --git a/inst/nextui-2.0.0/nextui.js b/inst/nextui-2.0.0/nextui.js index 0139b9c..51c7364 100644 --- a/inst/nextui-2.0.0/nextui.js +++ b/inst/nextui-2.0.0/nextui.js @@ -2009,7 +2009,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _out /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Accordion\": () => (/* binding */ Accordion),\n/* harmony export */ \"Autocomplete\": () => (/* binding */ Autocomplete),\n/* harmony export */ \"Button\": () => (/* binding */ Button),\n/* harmony export */ \"Checkbox\": () => (/* binding */ Checkbox),\n/* harmony export */ \"DropdownMenu\": () => (/* binding */ DropdownMenu),\n/* harmony export */ \"Input\": () => (/* binding */ Input),\n/* harmony export */ \"Listbox\": () => (/* binding */ Listbox),\n/* harmony export */ \"Select\": () => (/* binding */ Select),\n/* harmony export */ \"Slider\": () => (/* binding */ Slider),\n/* harmony export */ \"Switch\": () => (/* binding */ Switch),\n/* harmony export */ \"Tabs\": () => (/* binding */ Tabs),\n/* harmony export */ \"Textarea\": () => (/* binding */ Textarea),\n/* harmony export */ \"ThemeSwitcher\": () => (/* binding */ ThemeSwitcher),\n/* harmony export */ \"setTheme\": () => (/* binding */ setTheme)\n/* harmony export */ });\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/button/dist/chunk-NXTXE2B3.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/switch/dist/chunk-N4MZXI4F.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/input/dist/chunk-HXP4WOPN.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/input/dist/chunk-TC4QW7OA.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/checkbox/dist/chunk-AMSULWPV.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/accordion/dist/chunk-VEGXQLVL.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/autocomplete/dist/chunk-N2FRZORR.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/dropdown/dist/chunk-SXHEBZUY.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/listbox/dist/chunk-5UXUPTLW.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/select/dist/chunk-QHKZQCIM.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/avatar/dist/chunk-XBMXQVV7.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/slider/dist/chunk-E5JQEZUR.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/tabs/dist/chunk-Q33IKVZ4.mjs\");\n/* harmony import */ var _shiny_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/shiny.react */ \"@/shiny.react\");\n/* harmony import */ var _shiny_react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_shiny_react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\nvar setTheme = function setTheme() {\n var theme;\n if ($('html').hasClass('dark')) {\n theme = 'light';\n $('html').removeClass('dark').addClass('light');\n } else {\n $('html').removeClass('light').addClass('dark');\n theme = 'dark';\n }\n Shiny.setInputValue('theme', theme, {\n priority: 'event'\n });\n};\nvar Button = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.ButtonAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_2__.button_default);\nvar ThemeSwitcher = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_3__.switch_default, function (value, setValue) {\n return {\n isSelected: $('html').hasClass('light') ? true : false,\n onChange: function onChange(event) {\n setTheme();\n setValue(event.target.checked);\n }\n };\n});\nvar Switch = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_3__.switch_default, function (value, setValue, props) {\n return {\n isSelected: value,\n onChange: function onChange(event) {\n setValue(event.target.checked);\n }\n };\n});\nvar Textarea = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_4__.textarea_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(event) {\n setValue(event.target.value);\n }\n };\n});\nvar Input = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_5__.input_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(event) {\n var val = event.target.value;\n // For numeric input\n if (event.target.type === \"number\") {\n val = Number(val);\n }\n setValue(val);\n }\n };\n}, {\n policy: _shiny_react__WEBPACK_IMPORTED_MODULE_0__.debounce,\n delay: 250\n});\nvar Checkbox = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_6__.checkbox_default, function (value, setValue, props) {\n return {\n isSelected: value,\n onChange: function onChange(e) {\n setValue(e.target.checked);\n }\n };\n});\n\n//export const CheckboxGroup = InputAdapter(NextUI.CheckboxGroup, (value, setValue, props) => {\n// console.log(props);\n// return({\n// value: value,\n// onValueChange: (value) => {\n// setValue(value)\n// }\n// });\n//});\n\n//export const RadioGroup = InputAdapter(NextUI.RadioGroup, (value, setValue, props) => {\n// console.log(props);\n// return({\n// value: value,\n// onValueChange: (value) => {\n// setValue(value);\n// }\n// });\n//});\n\nvar Accordion = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_7__.accordion_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Autocomplete = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_8__.autocomplete_default, function (value, setValue, props) {\n var _React$useState = react__WEBPACK_IMPORTED_MODULE_1___default().useState(true),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n touched = _React$useState2[0],\n setTouched = _React$useState2[1];\n var isValid = value !== null;\n return {\n isInvalid: isValid || !touched ? false : true,\n errorMessage: isValid || !touched ? \"\" : \"You must select a value\",\n selectedKey: value,\n onSelectionChange: function onSelectionChange(key) {\n setValue(key);\n },\n onClose: function onClose() {\n return setTouched(true);\n }\n };\n});\nvar DropdownMenu = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_9__.dropdown_menu_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Listbox = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_10__.listbox_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Select = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_11__.select_default, function (value, setValue, props) {\n var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_1___default().useState(true),\n _React$useState4 = _slicedToArray(_React$useState3, 2),\n touched = _React$useState4[0],\n setTouched = _React$useState4[1];\n var renderValue;\n if (props.items !== undefined) {\n renderValue = function renderValue(items) {\n var Avatar = _nextui_org_react__WEBPACK_IMPORTED_MODULE_12__.avatar_default;\n return items.map(function (item) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: item.key,\n className: \"flex items-center gap-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(Avatar, {\n alt: item.key,\n className: \"flex-shrink-0\",\n size: \"sm\",\n src: item.props.startContent.props.src\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"flex flex-col\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", null, item.textValue), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", {\n className: \"text-default-500 text-tiny\"\n }, \"Description\")));\n });\n };\n }\n var isValid = value !== '';\n return {\n isInvalid: isValid || !touched ? false : true,\n errorMessage: isValid || !touched ? \"\" : \"You must select a value\",\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n if (vals.length === 0) isValid = false;\n },\n onClose: function onClose() {\n return setTouched(true);\n },\n renderValue: renderValue\n };\n});\nvar Slider = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_13__.slider_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(value) {\n setValue(value);\n }\n };\n}, {\n policy: _shiny_react__WEBPACK_IMPORTED_MODULE_0__.debounce,\n delay: 250\n});\nvar Tabs = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_14__.tabs_default, function (value, setValue, props) {\n return {\n selectedKey: value,\n onSelectionChange: function onSelectionChange(key) {\n setValue(key);\n }\n };\n});\n\n//# sourceURL=webpack://js/./src/inputs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Accordion\": () => (/* binding */ Accordion),\n/* harmony export */ \"Autocomplete\": () => (/* binding */ Autocomplete),\n/* harmony export */ \"Button\": () => (/* binding */ Button),\n/* harmony export */ \"Checkbox\": () => (/* binding */ Checkbox),\n/* harmony export */ \"DropdownMenu\": () => (/* binding */ DropdownMenu),\n/* harmony export */ \"Input\": () => (/* binding */ Input),\n/* harmony export */ \"Listbox\": () => (/* binding */ Listbox),\n/* harmony export */ \"Pagination\": () => (/* binding */ Pagination),\n/* harmony export */ \"Select\": () => (/* binding */ Select),\n/* harmony export */ \"Slider\": () => (/* binding */ Slider),\n/* harmony export */ \"Switch\": () => (/* binding */ Switch),\n/* harmony export */ \"Tabs\": () => (/* binding */ Tabs),\n/* harmony export */ \"Textarea\": () => (/* binding */ Textarea),\n/* harmony export */ \"ThemeSwitcher\": () => (/* binding */ ThemeSwitcher),\n/* harmony export */ \"setTheme\": () => (/* binding */ setTheme)\n/* harmony export */ });\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/button/dist/chunk-NXTXE2B3.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/switch/dist/chunk-N4MZXI4F.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/input/dist/chunk-HXP4WOPN.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/input/dist/chunk-TC4QW7OA.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/checkbox/dist/chunk-AMSULWPV.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/accordion/dist/chunk-VEGXQLVL.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/autocomplete/dist/chunk-N2FRZORR.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/dropdown/dist/chunk-SXHEBZUY.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/listbox/dist/chunk-5UXUPTLW.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/pagination/dist/chunk-BIN3WWJN.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/select/dist/chunk-QHKZQCIM.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/avatar/dist/chunk-XBMXQVV7.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/slider/dist/chunk-E5JQEZUR.mjs\");\n/* harmony import */ var _nextui_org_react__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @nextui-org/react */ \"./node_modules/@nextui-org/tabs/dist/chunk-Q33IKVZ4.mjs\");\n/* harmony import */ var _shiny_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/shiny.react */ \"@/shiny.react\");\n/* harmony import */ var _shiny_react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_shiny_react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\nvar setTheme = function setTheme() {\n var theme;\n if ($('html').hasClass('dark')) {\n theme = 'light';\n $('html').removeClass('dark').addClass('light');\n } else {\n $('html').removeClass('light').addClass('dark');\n theme = 'dark';\n }\n Shiny.setInputValue('theme', theme, {\n priority: 'event'\n });\n};\nvar Button = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.ButtonAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_2__.button_default);\nvar ThemeSwitcher = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_3__.switch_default, function (value, setValue) {\n return {\n isSelected: $('html').hasClass('light') ? true : false,\n onChange: function onChange(event) {\n setTheme();\n setValue(event.target.checked);\n }\n };\n});\nvar Switch = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_3__.switch_default, function (value, setValue, props) {\n return {\n isSelected: value,\n onChange: function onChange(event) {\n setValue(event.target.checked);\n }\n };\n});\nvar Textarea = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_4__.textarea_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(event) {\n setValue(event.target.value);\n }\n };\n});\nvar Input = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_5__.input_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(event) {\n var val = event.target.value;\n // For numeric input\n if (event.target.type === \"number\") {\n val = Number(val);\n }\n setValue(val);\n }\n };\n}, {\n policy: _shiny_react__WEBPACK_IMPORTED_MODULE_0__.debounce,\n delay: 250\n});\nvar Checkbox = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_6__.checkbox_default, function (value, setValue, props) {\n return {\n isSelected: value,\n onChange: function onChange(e) {\n setValue(e.target.checked);\n }\n };\n});\n\n//export const CheckboxGroup = InputAdapter(NextUI.CheckboxGroup, (value, setValue, props) => {\n// console.log(props);\n// return({\n// value: value,\n// onValueChange: (value) => {\n// setValue(value)\n// }\n// });\n//});\n\n//export const RadioGroup = InputAdapter(NextUI.RadioGroup, (value, setValue, props) => {\n// console.log(props);\n// return({\n// value: value,\n// onValueChange: (value) => {\n// setValue(value);\n// }\n// });\n//});\n\nvar Accordion = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_7__.accordion_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Autocomplete = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_8__.autocomplete_default, function (value, setValue, props) {\n var _React$useState = react__WEBPACK_IMPORTED_MODULE_1___default().useState(true),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n touched = _React$useState2[0],\n setTouched = _React$useState2[1];\n var isValid = value !== null;\n return {\n isInvalid: isValid || !touched ? false : true,\n errorMessage: isValid || !touched ? \"\" : \"You must select a value\",\n selectedKey: value,\n onSelectionChange: function onSelectionChange(key) {\n setValue(key);\n },\n onClose: function onClose() {\n return setTouched(true);\n }\n };\n});\nvar DropdownMenu = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_9__.dropdown_menu_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Listbox = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_10__.listbox_default, function (value, setValue, props) {\n return {\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n }\n };\n});\nvar Pagination = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_11__.pagination_default, function (value, setValue, props) {\n return {\n page: value,\n onChange: function onChange(page) {\n setValue(page);\n }\n };\n});\nvar Select = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_12__.select_default, function (value, setValue, props) {\n var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_1___default().useState(true),\n _React$useState4 = _slicedToArray(_React$useState3, 2),\n touched = _React$useState4[0],\n setTouched = _React$useState4[1];\n var renderValue;\n if (props.items !== undefined) {\n renderValue = function renderValue(items) {\n var Avatar = _nextui_org_react__WEBPACK_IMPORTED_MODULE_13__.avatar_default;\n return items.map(function (item) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n key: item.key,\n className: \"flex items-center gap-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(Avatar, {\n alt: item.key,\n className: \"flex-shrink-0\",\n size: \"sm\",\n src: item.props.startContent.props.src\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", {\n className: \"flex flex-col\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", null, item.textValue), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", {\n className: \"text-default-500 text-tiny\"\n }, \"Description\")));\n });\n };\n }\n var isValid = value !== '';\n return {\n isInvalid: isValid || !touched ? false : true,\n errorMessage: isValid || !touched ? \"\" : \"You must select a value\",\n selectedKeys: value,\n onSelectionChange: function onSelectionChange(keys) {\n var vals = [];\n keys.forEach(function (key) {\n vals.push(key);\n });\n // So values appear in the right order\n // regardless of selection\n setValue(vals.sort());\n if (vals.length === 0) isValid = false;\n },\n onClose: function onClose() {\n return setTouched(true);\n },\n renderValue: renderValue\n };\n});\nvar Slider = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_14__.slider_default, function (value, setValue, props) {\n return {\n value: value,\n onChange: function onChange(value) {\n setValue(value);\n }\n };\n}, {\n policy: _shiny_react__WEBPACK_IMPORTED_MODULE_0__.debounce,\n delay: 250\n});\nvar Tabs = (0,_shiny_react__WEBPACK_IMPORTED_MODULE_0__.InputAdapter)(_nextui_org_react__WEBPACK_IMPORTED_MODULE_15__.tabs_default, function (value, setValue, props) {\n return {\n selectedKey: value,\n onSelectionChange: function onSelectionChange(key) {\n setValue(key);\n }\n };\n});\n\n//# sourceURL=webpack://js/./src/inputs.js?"); /***/ }), diff --git a/js/src/inputs.js b/js/src/inputs.js index 4e8396a..7bd76fb 100644 --- a/js/src/inputs.js +++ b/js/src/inputs.js @@ -133,6 +133,13 @@ export const Listbox = InputAdapter(NextUI.Listbox, (value, setValue, props) => } })); +export const Pagination = InputAdapter(NextUI.Pagination, (value, setValue, props) => ({ + page: value, + onChange: (page) => { + setValue(page); + }, +})); + export const Select = InputAdapter(NextUI.Select, (value, setValue, props) => { const [touched, setTouched] = React.useState(true); diff --git a/man/checkbox-group.Rd b/man/checkbox-group.Rd index 9e8b6c7..df2c04a 100644 --- a/man/checkbox-group.Rd +++ b/man/checkbox-group.Rd @@ -79,7 +79,6 @@ ui <- nextui_page( "select", label = "Tab to select:", value = JS("['sydney']"), - disallowEmptySelection = TRUE, selectionMode = "multiple", select_item(key = "buenos-aires", value = "buenos-aires", "Buenos Aires"), select_item(key = "sydney", value = "sydney", "Sydney") @@ -100,9 +99,8 @@ ui <- nextui_page( server <- function(input, output, session) { observeEvent(input$select, { - print(input$select) update_checkboxgroup_input(session, "checkbox_group", selected = input$select) - }) + }, ignoreNULL = FALSE) output$checkbox_group_val <- renderText(input$checkbox_group) } diff --git a/man/radio.Rd b/man/radio.Rd index 966a257..0398fcb 100644 --- a/man/radio.Rd +++ b/man/radio.Rd @@ -106,7 +106,8 @@ library(shinyNextUI) ui <- nextui_page( debug_react = TRUE, div( - class = "flex gap-1", + class = "flex flex-col gap-1", + spacer(y = 2), select_input( "select", label = "Tab to select:", diff --git a/tests/testthat/test-pagination.R b/tests/testthat/test-pagination.R new file mode 100644 index 0000000..4af2083 --- /dev/null +++ b/tests/testthat/test-pagination.R @@ -0,0 +1,13 @@ +library(shinytest2) +test_that("pagination works as expected", { + # Don't run these tests on the CRAN build servers + skip_on_cran() + shiny_app_path <- + system.file("examples/pagination/app.R", package = "shinyNextUI") + app <- AppDriver$new( + shiny_app_path, + name = "pagination-app", + variant = platform_variant() + ) + app$expect_values() +})