From 262a2c2da82f314de2ebd1731f7db946663d6b61 Mon Sep 17 00:00:00 2001 From: Swechhya Date: Wed, 8 Sep 2021 15:05:46 +0545 Subject: [PATCH 1/5] Add functionality to get the table data --- DESCRIPTION | 2 +- NAMESPACE | 1 + R/get_table_data.R | 26 ++++++++++++++++++++++++++ inst/htmlwidgets/jexcel.js | 19 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 R/get_table_data.R diff --git a/DESCRIPTION b/DESCRIPTION index 367714a..d2e3cb1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,4 +20,4 @@ URL: https://github.com/Swechhya/excelR BugReports: https://github.com/Swechhya/excelR/issues Encoding: UTF-8 LazyData: true -RoxygenNote: 6.1.1 +RoxygenNote: 7.1.1 diff --git a/NAMESPACE b/NAMESPACE index 075eae7..e2fb024 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ export(excelOutput) export(excelTable) export(excel_to_R) export(getComments) +export(getTableData) export(get_selected_data) export(get_selected_data_boundary) export(renderExcel) diff --git a/R/get_table_data.R b/R/get_table_data.R new file mode 100644 index 0000000..fc34a7d --- /dev/null +++ b/R/get_table_data.R @@ -0,0 +1,26 @@ +#' +#' This function is used to get data from excel table +#' @export +#' @param tableId the id of the table from which the comment is to be fetched +#' @examples +#' if(interactive()) { +#' library(excelR) +#' library(shiny) +#' shinyApp( +#' ui = fluidPage(actionButton('get', 'Get table data'), +#' tableOutput("fetchedData"), +#' excelOutput("table", height = 175)), +#' server = function(input, output, session) { +#' output$table <- renderExcel(excelTable(data = head(iris))) +#' +#' observeEvent(input$get,{getTableData("table")}) +#' +#' observeEvent(input$table,{ +#' output$fetchedData <- renderTable(excel_to_R(input$table)) +#' }) +#' }) +#' +getTableData <- function(tableId) { + session <- shiny::getDefaultReactiveDomain() + session$sendCustomMessage("excelR:getTableData", message=list(tableId)) +} diff --git a/inst/htmlwidgets/jexcel.js b/inst/htmlwidgets/jexcel.js index dd58b43..ecd44ae 100644 --- a/inst/htmlwidgets/jexcel.js +++ b/inst/htmlwidgets/jexcel.js @@ -288,6 +288,25 @@ }); } }); + + Shiny.addCustomMessageHandler("excelR:getTableData", function(message){ + var el = document.getElementById(message[0]); + if (el) { + + var excel = el.excel + + var data = getOnChangeData(excel.getData(), excel.getConfig().columns, excel.getHeaders()) + + Shiny.setInputValue(message[0], + { + data:data.data, + colHeaders: data.colHeaders, + colType: data.colType, + forSelectedVals: false, + }) + } + }); + } From fb2bd0c9649ca67c5ae17b7928e6ab8bca6b9212 Mon Sep 17 00:00:00 2001 From: Swechhya Date: Wed, 8 Sep 2021 17:55:46 +0545 Subject: [PATCH 2/5] Add test and documentation --- man/getTableData.Rd | 14 ++++++++++++++ tests/testthat/test_getTableData.R | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 man/getTableData.Rd create mode 100644 tests/testthat/test_getTableData.R diff --git a/man/getTableData.Rd b/man/getTableData.Rd new file mode 100644 index 0000000..e6d0b35 --- /dev/null +++ b/man/getTableData.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_table_data.R +\name{getTableData} +\alias{getTableData} +\title{This function is used to get data from excel table} +\usage{ +getTableData(tableId) +} +\arguments{ +\item{tableId}{the id of the table from which the comment is to be fetched} +} +\description{ +This function is used to get data from excel table +} diff --git a/tests/testthat/test_getTableData.R b/tests/testthat/test_getTableData.R new file mode 100644 index 0000000..ea161cd --- /dev/null +++ b/tests/testthat/test_getTableData.R @@ -0,0 +1,12 @@ +context("'getTableData' function") + +test_that("'getTableData' return null when excelObj is null ", { + + testthat::expect_null(excel_to_R(getTableData(NULL))) +}) + + +test_that("'getTableData' does not work outside shiny", { + testthat::expect_error(getTableData("table")) +}) + From b700ac8c852823b56af3c381515e210eb19c2a45 Mon Sep 17 00:00:00 2001 From: Swechhya Date: Wed, 8 Sep 2021 17:56:15 +0545 Subject: [PATCH 3/5] Fix test --- tests/testthat/test_getTableData.R | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/testthat/test_getTableData.R b/tests/testthat/test_getTableData.R index ea161cd..d0d7e99 100644 --- a/tests/testthat/test_getTableData.R +++ b/tests/testthat/test_getTableData.R @@ -1,11 +1,5 @@ context("'getTableData' function") -test_that("'getTableData' return null when excelObj is null ", { - - testthat::expect_null(excel_to_R(getTableData(NULL))) -}) - - test_that("'getTableData' does not work outside shiny", { testthat::expect_error(getTableData("table")) }) From 2fe6facfdc7a56ca7c78e052d022582d1e9193f4 Mon Sep 17 00:00:00 2001 From: Swechhya Date: Thu, 9 Sep 2021 09:29:55 +0545 Subject: [PATCH 4/5] Update docs --- LICENSE | 2 +- docs/404.html | 148 +++++ docs/BS3/bootstrap-toc.css | 60 ++ docs/BS3/bootstrap-toc.js | 159 +++++ docs/BS3/docsearch.css | 148 +++++ docs/BS3/docsearch.js | 85 +++ docs/BS3/link.svg | 12 + docs/BS3/pkgdown.css | 361 +++++++++++ docs/BS3/pkgdown.js | 108 ++++ docs/BS4/link.svg | 12 + docs/BS4/pkgdown.css | 498 +++++++++++++++ docs/BS4/pkgdown.js | 154 +++++ docs/BS4/syntax-highlighting.css | 69 ++ docs/CODE_OF_CONDUCT.html | 47 +- docs/LICENSE-text.html | 49 +- docs/authors.html | 41 +- docs/bootstrap-toc.css | 60 ++ docs/bootstrap-toc.js | 159 +++++ docs/index.html | 602 ++++++++++-------- docs/inst/images/get_data.gif | Bin 0 -> 45449 bytes docs/news/index.html | 71 ++- docs/pkgdown.css | 165 ++++- docs/pkgdown.js | 15 +- docs/pkgdown.yml | 7 +- docs/reference/Rplot001.png | Bin 0 -> 1011 bytes docs/reference/excelOutput.html | 89 +-- docs/reference/excelTable.html | 234 +++---- docs/reference/excel_to_R.html | 92 +-- docs/reference/getComments.html | 98 +-- docs/reference/getTableData.html | 162 +++++ docs/reference/get_selected_data.html | 92 +-- .../reference/get_selected_data_boundary.html | 92 +-- docs/reference/index.html | 61 +- docs/reference/renderExcel.html | 89 +-- docs/reference/setComments.html | 92 +-- index.Rmd => index.md | 40 +- inst/images/get_data.gif | Bin 0 -> 45449 bytes 37 files changed, 3364 insertions(+), 809 deletions(-) create mode 100644 docs/404.html create mode 100644 docs/BS3/bootstrap-toc.css create mode 100644 docs/BS3/bootstrap-toc.js create mode 100644 docs/BS3/docsearch.css create mode 100644 docs/BS3/docsearch.js create mode 100644 docs/BS3/link.svg create mode 100644 docs/BS3/pkgdown.css create mode 100644 docs/BS3/pkgdown.js create mode 100644 docs/BS4/link.svg create mode 100644 docs/BS4/pkgdown.css create mode 100644 docs/BS4/pkgdown.js create mode 100644 docs/BS4/syntax-highlighting.css create mode 100644 docs/bootstrap-toc.css create mode 100644 docs/bootstrap-toc.js create mode 100644 docs/inst/images/get_data.gif create mode 100644 docs/reference/Rplot001.png create mode 100644 docs/reference/getTableData.html rename index.Rmd => index.md (95%) create mode 100644 inst/images/get_data.gif diff --git a/LICENSE b/LICENSE index ae02907..d1a28a2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,2 +1,2 @@ -YEAR: 2019 +YEAR: 2021 COPYRIGHT HOLDER: Swechhya Bista \ No newline at end of file diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..8e6a28d --- /dev/null +++ b/docs/404.html @@ -0,0 +1,148 @@ + + + + + + + + +Page not found (404) • excelR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +Content not found. Please use links in the navbar. + +
+ + + +
+ + + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/BS3/bootstrap-toc.css b/docs/BS3/bootstrap-toc.css new file mode 100644 index 0000000..5a85941 --- /dev/null +++ b/docs/BS3/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ +nav[data-toggle='toc'] .nav > .active > ul { + display: block; +} diff --git a/docs/BS3/bootstrap-toc.js b/docs/BS3/bootstrap-toc.js new file mode 100644 index 0000000..1cdd573 --- /dev/null +++ b/docs/BS3/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function() { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function(el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function(el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function(el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function() { + return $(''); + }, + + createChildNavList: function($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function(anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function(headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function(el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function(i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function(arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function(opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function() { + $('nav[data-toggle="toc"]').each(function(i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(); diff --git a/docs/BS3/docsearch.css b/docs/BS3/docsearch.css new file mode 100644 index 0000000..e5f1fe1 --- /dev/null +++ b/docs/BS3/docsearch.css @@ -0,0 +1,148 @@ +/* Docsearch -------------------------------------------------------------- */ +/* + Source: https://github.com/algolia/docsearch/ + License: MIT +*/ + +.algolia-autocomplete { + display: block; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.algolia-autocomplete .ds-dropdown-menu { + width: 100%; + min-width: none; + max-width: none; + padding: .75rem 0; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175); +} + +@media (min-width:768px) { + .algolia-autocomplete .ds-dropdown-menu { + width: 175% + } +} + +.algolia-autocomplete .ds-dropdown-menu::before { + display: none +} + +.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] { + padding: 0; + background-color: rgb(255,255,255); + border: 0; + max-height: 80vh; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + margin-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + padding: 0; + overflow: visible +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + padding: .125rem 1rem; + margin-top: 0; + font-size: 1.3em; + font-weight: 500; + color: #00008B; + border-bottom: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + float: none; + padding-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: none; + width: auto; + padding: 0; + text-align: left +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + float: none; + width: auto; + padding: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content::before { + display: none +} + +.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header { + padding-top: .75rem; + margin-top: .75rem; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: block; + padding: .1rem 1rem; + margin-bottom: 0.1; + font-size: 1.0em; + font-weight: 400 + /* display: none */ +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + display: block; + padding: .25rem 1rem; + margin-bottom: 0; + font-size: 0.9em; + font-weight: 400 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + padding: 0 1rem .5rem; + margin-top: -.25rem; + font-size: 0.8em; + font-weight: 400; + line-height: 1.25 +} + +.algolia-autocomplete .algolia-docsearch-footer { + width: 110px; + height: 20px; + z-index: 3; + margin-top: 10.66667px; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + width: 100%; + height: 100%; + display: block; + transform: translate(-8px); +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #FF8C00; + background: rgba(232, 189, 54, 0.1) +} + + +.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5) +} + +.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content { + background-color: rgba(192, 192, 192, .15) +} diff --git a/docs/BS3/docsearch.js b/docs/BS3/docsearch.js new file mode 100644 index 0000000..b35504c --- /dev/null +++ b/docs/BS3/docsearch.js @@ -0,0 +1,85 @@ +$(function() { + + // register a handler to move the focus to the search bar + // upon pressing shift + "/" (i.e. "?") + $(document).on('keydown', function(e) { + if (e.shiftKey && e.keyCode == 191) { + e.preventDefault(); + $("#search-input").focus(); + } + }); + + $(document).ready(function() { + // do keyword highlighting + /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */ + var mark = function() { + + var referrer = document.URL ; + var paramKey = "q" ; + + if (referrer.indexOf("?") !== -1) { + var qs = referrer.substr(referrer.indexOf('?') + 1); + var qs_noanchor = qs.split('#')[0]; + var qsa = qs_noanchor.split('&'); + var keyword = ""; + + for (var i = 0; i < qsa.length; i++) { + var currentParam = qsa[i].split('='); + + if (currentParam.length !== 2) { + continue; + } + + if (currentParam[0] == paramKey) { + keyword = decodeURIComponent(currentParam[1].replace(/\+/g, "%20")); + } + } + + if (keyword !== "") { + $(".contents").unmark({ + done: function() { + $(".contents").mark(keyword); + } + }); + } + } + }; + + mark(); + }); +}); + +/* Search term highlighting ------------------------------*/ + +function matchedWords(hit) { + var words = []; + + var hierarchy = hit._highlightResult.hierarchy; + // loop to fetch from lvl0, lvl1, etc. + for (var idx in hierarchy) { + words = words.concat(hierarchy[idx].matchedWords); + } + + var content = hit._highlightResult.content; + if (content) { + words = words.concat(content.matchedWords); + } + + // return unique words + var words_uniq = [...new Set(words)]; + return words_uniq; +} + +function updateHitURL(hit) { + + var words = matchedWords(hit); + var url = ""; + + if (hit.anchor) { + url = hit.url_without_anchor + '?q=' + escape(words.join(" ")) + '#' + hit.anchor; + } else { + url = hit.url + '?q=' + escape(words.join(" ")); + } + + return url; +} diff --git a/docs/BS3/link.svg b/docs/BS3/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/BS3/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/BS3/pkgdown.css b/docs/BS3/pkgdown.css new file mode 100644 index 0000000..e788b18 --- /dev/null +++ b/docs/BS3/pkgdown.css @@ -0,0 +1,361 @@ +/* Sticky footer */ + +/** + * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ + * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css + * + * .Site -> body > .container + * .Site-content -> body > .container .row + * .footer -> footer + * + * Key idea seems to be to ensure that .container and __all its parents__ + * have height set to 100% + * + */ + +html, body { + height: 100%; +} + +body { + position: relative; +} + +body > .container { + display: flex; + height: 100%; + flex-direction: column; +} + +body > .container .row { + flex: 1 0 auto; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; + flex-shrink: 0; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown { + text-align: right; +} +footer p { + margin-bottom: 0; +} + +img.icon { + float: right; +} + +img { + max-width: 100%; +} + +/* Fix bug in bootstrap (only seen in firefox) */ +summary { + display: list-item; +} + +/* Typographic tweaking ---------------------------------*/ + +.contents .page-header { + margin-top: calc(-60px + 1em); +} + +dd { + margin-left: 3em; +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + margin-left: -30px; + display:inline-block; + width: 30px; + height: 30px; + visibility: hidden; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +.hasAnchor:hover a.anchor { + visibility: visible; +} + +@media (max-width: 767px) { + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/* Fixes for fixed navbar --------------------------*/ + +.contents h1, .contents h2, .contents h3, .contents h4 { + padding-top: 60px; + margin-top: -40px; +} + +/* Navbar submenu --------------------------*/ + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + border-radius: 6px 0 6px 6px; +} + +/* Sidebar --------------------------*/ + +#pkgdown-sidebar { + margin-top: 30px; + position: -webkit-sticky; + position: sticky; + top: 70px; +} + +#pkgdown-sidebar h2 { + font-size: 1.5em; + margin-top: 1em; +} + +#pkgdown-sidebar h2:first-child { + margin-top: 0; +} + +#pkgdown-sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +/* bootstrap-toc tweaks ------------------------------------------------------*/ + +/* All levels of nav */ + +nav[data-toggle='toc'] .nav > li > a { + padding: 4px 20px 4px 6px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; +} + +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 5px; + color: inherit; + border-left: 1px solid #878787; +} + +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 5px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; + border-left: 2px solid #878787; +} + +/* Nav: second level (shown on .active) */ + +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} + +nav[data-toggle='toc'] .nav .nav > li > a { + padding-left: 16px; + font-size: 1.35rem; +} + +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 15px; +} + +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 15px; + font-weight: 500; + font-size: 1.35rem; +} + +/* orcid ------------------------------------------------------------------- */ + +.orcid { + font-size: 16px; + color: #A6CE39; + /* margins are required by official ORCID trademark and display guidelines */ + margin-left:4px; + margin-right:4px; + vertical-align: middle; +} + +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} + +.ref-index td {vertical-align: top; min-width: 100px} +.ref-index .icon {width: 40px;} +.ref-index .alias {width: 40%;} +.ref-index-icons .alias {width: calc(40% - 40px);} +.ref-index .title {width: 60%;} + +.ref-arguments th {text-align: right; padding-right: 10px;} +.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px} +.ref-arguments .name {width: 20%;} +.ref-arguments .desc {width: 80%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* Syntax highlighting ---------------------------------------------------- */ + +pre, pre code { + background-color: #f8f8f8; + color: #333; + white-space: pre-wrap; + word-break: break-all; + overflow-wrap: break-word; +} + +pre { + border: 1px solid #eee; +} + +pre .img { + margin: 5px 0; +} + +pre .img img { + background-color: #fff; + display: block; + height: auto; +} + +code a, pre a { + color: #375f84; +} + +a.sourceLine:hover { + text-decoration: none; +} + +.fl {color: #1514b5;} +.fu {color: #000000;} /* function */ +.ch,.st {color: #036a07;} /* string */ +.kw {color: #264D66;} /* keyword */ +.co {color: #888888;} /* comment */ + +.error {font-weight: bolder;} +.warning {font-weight: bolder;} + +/* Clipboard --------------------------*/ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + +/* headroom.js ------------------------ */ + +.headroom { + will-change: transform; + transition: transform 200ms linear; +} +.headroom--pinned { + transform: translateY(0%); +} +.headroom--unpinned { + transform: translateY(-100%); +} + +/* mark.js ----------------------------*/ + +mark { + background-color: rgba(255, 255, 51, 0.5); + border-bottom: 2px solid rgba(255, 153, 51, 0.3); + padding: 1px; +} + +/* vertical spacing after htmlwidgets */ +.html-widget { + margin-bottom: 10px; +} + +/* fontawesome ------------------------ */ + +.fab { + font-family: "Font Awesome 5 Brands" !important; +} + +/* don't display links in code chunks when printing */ +/* source: https://stackoverflow.com/a/10781533 */ +@media print { + code a:link:after, code a:visited:after { + content: ""; + } +} diff --git a/docs/BS3/pkgdown.js b/docs/BS3/pkgdown.js new file mode 100644 index 0000000..956ef70 --- /dev/null +++ b/docs/BS3/pkgdown.js @@ -0,0 +1,108 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('.navbar-fixed-top').headroom(); + + $('body').css('padding-top', $('.navbar').height() + 10); + $(window).resize(function(){ + $('body').css('padding-top', $('.navbar').height() + 10); + }); + + $('[data-toggle="tooltip"]').tooltip(); + + var cur_path = paths(location.pathname); + var links = $("#navbar ul li a"); + var max_length = -1; + var pos = -1; + for (var i = 0; i < links.length; i++) { + if (links[i].getAttribute("href") === "#") + continue; + // Ignore external links + if (links[i].host !== location.host) + continue; + + var nav_path = paths(links[i].pathname); + + var length = prefix_length(nav_path, cur_path); + if (length > max_length) { + max_length = length; + pos = i; + } + } + + // Add class to parent
  • , and enclosing
  • if in dropdown + if (pos >= 0) { + var menu_anchor = $(links[pos]); + menu_anchor.parent().addClass("active"); + menu_anchor.closest("li.dropdown").addClass("active"); + } + }); + + function paths(pathname) { + var pieces = pathname.split("/"); + pieces.shift(); // always starts with / + + var end = pieces[pieces.length - 1]; + if (end === "index.html" || end === "") + pieces.pop(); + return(pieces); + } + + // Returns -1 if not found + function prefix_length(needle, haystack) { + if (needle.length > haystack.length) + return(-1); + + // Special case for length-0 haystack, since for loop won't run + if (haystack.length === 0) { + return(needle.length === 0 ? 0 : -1); + } + + for (var i = 0; i < haystack.length; i++) { + if (needle[i] != haystack[i]) + return(i); + } + + return(haystack.length); + } + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-original-title'); + element.setAttribute('data-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent; + } + }); + + clipboardBtnCopies.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboardBtnCopies.on('error', function() { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + }); + } +})(window.jQuery || window.$) diff --git a/docs/BS4/link.svg b/docs/BS4/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/BS4/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/BS4/pkgdown.css b/docs/BS4/pkgdown.css new file mode 100644 index 0000000..9e125fe --- /dev/null +++ b/docs/BS4/pkgdown.css @@ -0,0 +1,498 @@ +/* Sticky footer */ + +/** + * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ + * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css + * + * .Site -> body > .container + * .Site-content -> body > .container .row + * .footer -> footer + * + * Key idea seems to be to ensure that .container and __all its parents__ + * have height set to 100% + * + */ + +html, body { + height: 100%; +} + +body { + position: relative; +} + +body > .container { + display: flex; + height: 100%; + flex-direction: column; +} + +body > .container .row { + flex: 1 0 auto; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; + flex-shrink: 0; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown-footer-right { + text-align: right; +} + +img.icon { + float: right; +} + +img { + max-width: 100%; +} + +dd { + margin-left: 3em; +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + margin-left: -30px; + display:inline-block; + width: 30px; + height: 30px; + visibility: hidden; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +.hasAnchor:hover a.anchor { + visibility: visible; +} + +@media (max-width: 767px) { + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/* Fixes for fixed navbar --------------------------*/ + +.contents { + margin-top: 4em; +} + +.contents h1 { + padding-top: 40px; + margin-top: -40px; +} + +.contents h2, .contents h3, .contents h4 { + padding-top: 40px; + padding-top: 0px; +} + +/* Navbar submenu --------------------------*/ +.dropdown-menu { + padding: .5rem 0 .5rem 0; +} + +h6.dropdown-header { + margin-top: 0; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + border-radius: 6px 0 6px 6px; +} + +/* Sidebar --------------------------*/ + +#pkgdown-sidebar { + margin-top: 30px; +} + +/* navbar is 56px + 30px of margin-top */ +.sticky-top { + top: 86px; +} + +#pkgdown-sidebar h2 { + font-size: 2em; + margin-top: 1em; +} + +#pkgdown-sidebar h2:first-child { + margin-top: 2.5rem; +} + +#pkgdown-sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +/* don't display links in code chunks when printing */ +/* source: https://stackoverflow.com/a/10781533 */ +@media print { + code a:link:after, code a:visited:after { + content: ""; + } +} + +.orcid { + font-size: 16px; + color: #A6CE39; + margin-left: 4px; + margin-right: 4px; + vertical-align: middle; +} + +/* Clipboard --------------------------*/ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + +/* headroom.js ------------------------ */ + +/* from quillt https://github.com/rstudio/quillt/blob/c2c826dfa21070e3a2a0308f569255d6be950134/inst/pkgdown/assets/rmd.css#L423 +/* tweak headroom.js to not disappear as aggressively at the top of the page */ +.headroom { + will-change: transform; + transition: transform 400ms ease; +} + +.page-header { + padding-bottom: 10px; +} + +.headroom--pinned { + transform: translateY(0%); +} +.headroom--unpinned { + transform: translateY(-100%); +} + +/* mark.js ----------------------------*/ + +mark { + background-color: rgba(255, 255, 51, 0.5); + border-bottom: 2px solid rgba(255, 153, 51, 0.3); + padding: 1px; +} + +/* vertical spacing after htmlwidgets */ +.html-widget { + margin-bottom: 10px; +} + + + +/* TOC heading */ +h2[data-toc-skip], #pkgdown-sidebar h2[data-toc-skip] { + font-size: x-large; +} + +/* bootstrap-toc tweaks */ +.nav { +flex-direction: column; +} + + +/* Base TOC item */ +nav[data-toggle="toc"] .nav > li > a { + color: inherit; + padding-left: 0.5rem; + margin-left: -0.5rem; + border-radius: 1rem; + border: white solid; +} + +/* Under hover */ +nav[data-toggle="toc"] .nav > li > a:hover, +nav[data-toggle="toc"] .nav > li > a:focus, +/* Current */ +nav[data-toggle="toc"] .nav-link.active, +nav[data-toggle="toc"] .nav-link.active:hover, +nav[data-toggle="toc"] .nav-link.active:focus +{ + background-color: #eee; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle="toc"] .nav-link + ul { + display: none; +} +nav[data-toggle="toc"] .nav-link.active + ul { + display: block; +} +nav[data-toggle="toc"] .nav .nav > li > a { + margin-left: 0.5rem; +} + +/* version badge */ +#version-badge { + border: none; +} + +/* h1 */ + +h1.display-4 { + font-size: 2.5rem; +} + +/* Links color contrast */ + +a { + color: #0054AD; +} + +a:hover { + color: #0054AD; +} + + +/* navbar active link */ +.navbar-light .navbar-nav .active > .nav-link { + background: #e9ecef; + border-radius: 1rem; + } +.navbar-nav .nav-link { + padding-left: 0.5rem; + } + +@include media-breakpoint-up(md) { + .navbar-nav .nav-link { + padding-left: 0rem; + } +} + + +/* Footnotes --------------------------------------------- */ + +.popover { + max-width: min(100vw, 32rem); + font-size: 0.9rem; + box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.3); +} +.popover-body { + padding: 0.75rem; +} +.popover-body p:last-child { + margin-bottom: 0; +} + +a.footnote-ref { + cursor: pointer; +} +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} + +.ref-index td {vertical-align: top; min-width: 100px} +.ref-index .icon {width: 40px;} +.ref-index .alias {width: 40%;} +.ref-index-icons .alias {width: calc(40% - 40px);} +.ref-index .title {width: 60%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* fontawesome ------------------------ */ + +.fab { + font-family: "Font Awesome 5 Brands" !important; +} + +/* logo homepage */ +.pkg-logo { + float: right; + width: 100px; + margin-left: 30px; + margin-top: 25px; +} + +@media (max-width: 767px) { + .pkg-logo { + float: none; + width: 100px; +} +} + +div.pb-2.mt-4.mb-2.border-bottom { + min-height: 129px; +} + +/* tweak headroom.js to not disappear as aggressively at the top of the page */ +/* https://github.com/rstudio/quillt/blob/57ba0ce7aa850e42165a8993d4b493c44917b7a8/inst/pkgdown/assets/rmd.css#L452 */ +.headroom { + will-change: transform; + transition: transform 400ms ease; +} + +/* blockquote ---------------------------------------------- */ + +blockquote, .line-block { + border-left: .5rem solid #eee; + padding-left: .5rem; + margin-left: -.5rem; +} + +/* Search ---------------------------------------------- */ + +mark { + background: linear-gradient(-100deg, + hsla(48,92%,75%,.3), + hsla(48,92%,75%,.7) 95%, + hsla(48,92%,75%,.1) + ) +} + +.algolia-autocomplete .aa-hint { + color: #999; +} +.algolia-autocomplete .aa-dropdown-menu { + width: max(100%, 20rem); + background-color: #fff; + border: 1px solid var(--gray); + border-radius: 0.2rem; + margin-top: 2px; + + max-height: 50vh; + overflow-y: auto; +} +.algolia-autocomplete .aa-dropdown-menu .aa-suggestion { + cursor: pointer; + padding: 5px 4px; + border-bottom: 1px #ddd solid; + font-size: 0.9rem; + color: #5E5E5E; + +} + +.search-details { + font-size: 0.9rem; + color: #0054AD; + display: inline; + font-weight: bolder; +} +.algolia-autocomplete .aa-dropdown-menu .aa-suggestion.aa-cursor { + background-color: #B2D7FF; +} + +/* Compromise to avoid flash of invisible text + flash of unstyled text */ +body { + font-display: fallback; +} + +/* Navbar constrast */ +.navbar-light .navbar-nav .nav-link { + color: rgba(0,0,0,0.7); +} +.navbar-light .navbar-nav .nav-link:hover { + color: rgba(0,0,0,0.9); +} + +/* Details margin */ +summary { + margin-bottom: 1rem; +} + +details p { + margin-top: -.5rem; +} + +/* tabsets */ +.nav-row { + flex-direction: row; +} + +.tab-content { + padding: 1rem; +} + +.tabset-pills .tab-content { + border: solid 1px #e5e5e5; +} + +/* https://observablehq.com/@rkaravia/css-trick-tabs-with-consistent-height */ +/* Make tab height consistent */ + +.tab-content { + display: flex; +} + +.tab-content > .tab-pane { + display: block; /* undo "display: none;" */ + visibility: hidden; + margin-right: -100%; + width: 100%; +} + +.tab-content > .active { + visibility: visible; +} diff --git a/docs/BS4/pkgdown.js b/docs/BS4/pkgdown.js new file mode 100644 index 0000000..10abdc7 --- /dev/null +++ b/docs/BS4/pkgdown.js @@ -0,0 +1,154 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('nav.navbar').headroom(); + + Toc.init({ + $nav: $("#toc"), + $scope: $("h2, h3, h4, h5, h6") + }); + + $('body').scrollspy({ + target: '#pkgdown-sidebar', + offset: 60 + }); + + // Activate popovers + $('[data-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); + + $('[data-toggle="tooltip"]').tooltip(); + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-original-title'); + element.setAttribute('data-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboard = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent; + } + }); + + clipboard.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboard.on('error', function() { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + + }); + } + + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("div.col-md-9"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], + } + }); + } + + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function(e) { + if (fuse) { + return; + } + + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); + }); + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; +async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; + } + } + callback(items); +} + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function(event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); +})(window.jQuery || window.$) + + diff --git a/docs/BS4/syntax-highlighting.css b/docs/BS4/syntax-highlighting.css new file mode 100644 index 0000000..0fe4f32 --- /dev/null +++ b/docs/BS4/syntax-highlighting.css @@ -0,0 +1,69 @@ +/* Syntax highlighting ---------------------------------------------------- */ + +pre, pre code { + white-space: pre-wrap; + word-break: break-all; + overflow-wrap: break-word; +} + +pre { + background-color: #f8f8f8; + color: #333; + padding: 9.5px; + border-radius: 4px; + border: 1px solid rgba(0,0,0,0.1); +} + +pre .img { + margin: 5px 0; +} + +pre .img img { + background-color: #fff; + display: block; + height: auto; +} + +code a, pre a { + color: #375f84; +} + +pre code { + padding: 0; +} + +a.sourceLine:hover { + text-decoration: none; +} + +span.ot {color:#007BA5} +span.at {color:#20794D} +span.ss {color:#20794D} +span.an {color:#5E5E5E} +span.fu {color:#4758AB} +span.st {color:#20794D} +span.cf {color:#007BA5} +span.op {color:#5E5E5E} +span.er {color:#AD0000} +span.bn {color:#AD0000} +span.al {color:#AD0000} +span.va {color:#111111} +span.bu {} +span.ex {} +span.pp {color:#AD0000} +span.in {color:#5E5E5E} +span.vs {color:#20794D} +span.wa {color:#5E5E5E; font-style: italic} +span.do {color:#5E5E5E; font-style: italic} +span.im {} +span.ch {color:#20794D} +span.dt {color:#AD0000} +span.fl {color:#AD0000} +span.co {color:#5E5E5E} +span.cv {color:#5E5E5E; font-style: italic} +span.cn {color:#8f5902} +span.sc {color:#20794D} +span.dv {color:#AD0000} +span.kw {color:#007BA5} +span.error {font-weight: bolder;} +span.warning {font-weight: bolder;} diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index e94ac6a..a8bb930 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -8,21 +8,29 @@ Contributor Covenant Code of Conduct • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,12 @@ + + @@ -44,9 +54,10 @@ + - +
    +
    @@ -156,22 +167,32 @@

    + +
    +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 015ea2f..75a289d 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -8,21 +8,29 @@ License • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,12 @@ + + @@ -44,9 +54,10 @@ + - +
    +
    @@ -102,28 +113,38 @@

    License

    -
    YEAR: 2019
    +
    YEAR: 2021
     COPYRIGHT HOLDER: Swechhya Bista
     
    + + +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/authors.html b/docs/authors.html index cb0b36f..6e317e7 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -8,21 +8,29 @@ Authors • excelR + - + - + + + + - + + + - + + - + - - + + + @@ -30,10 +38,12 @@ + + @@ -44,9 +54,10 @@ + - +
    +
    @@ -122,19 +133,23 @@

    Authors

    +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/bootstrap-toc.css b/docs/bootstrap-toc.css new file mode 100644 index 0000000..5a85941 --- /dev/null +++ b/docs/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ +nav[data-toggle='toc'] .nav > .active > ul { + display: block; +} diff --git a/docs/bootstrap-toc.js b/docs/bootstrap-toc.js new file mode 100644 index 0000000..1cdd573 --- /dev/null +++ b/docs/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function() { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function(el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function(el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function(el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function() { + return $(''); + }, + + createChildNavList: function($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function(anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function(headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function(el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function(i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function(arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function(opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function() { + $('nav[data-toggle="toc"]').each(function(i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(); diff --git a/docs/index.html b/docs/index.html index 11a837b..a323828 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,20 +5,21 @@ -A Wrapper of the 'JavaScript' Library 'jExcel' • excelR - - - - - - +A Wrapper of the JavaScript Library jExcel • excelR + + + + + + + - -
    + +
    -
    - - - - +
    +
    +

    An R interface to jExcel library to create web-based interactive tables and spreadsheets compatible with Excel or any other spreadsheet software.

    To install the stable CRAN version:

    - +
    +install.packages('excelR')

    To install the latest development version from GitHub:

    -
    library(devtools)
    -install_github('Swechhya/excelR')
    +
    +library(devtools)
    +install_github('Swechhya/excelR')

    Usage

    @@ -88,26 +88,28 @@

    Getting Started

    Excel tables can be created using excelTable function as shown below:

    -
    library(excelR)
    -
    -data = data.frame(A =c (1:5), B = c(LETTERS[1:5]))
    -
    -excelTable(data=data)
    +
    +library(excelR)
    +
    +data = data.frame(A =c (1:5), B = c(LETTERS[1:5]))
    +
    +excelTable(data=data)

    Basic Usage

    -
    library(excelR)
    -
    - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    -                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    -                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    -
    - columns = data.frame(title=c('Model', 'Date', 'Availability'),
    -                      width= c(300, 300, 300),
    -                      type=c('text', 'calendar', 'checkbox')) 
    - excelTable(data=data, columns = columns)
    +
    +library(excelR)
    +
    + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    +                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    +                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    +
    + columns = data.frame(title=c('Model', 'Date', 'Availability'),
    +                      width= c(300, 300, 300),
    +                      type=c('text', 'calendar', 'checkbox')) 
    + excelTable(data=data, columns = columns)

    @@ -115,7 +117,7 @@

    Features

    This documentation gives example for following features:

    -
      +
      1. Different types of columns
      2. Row and column resizing
      3. Drag and drop rows and columns
      4. @@ -135,230 +137,247 @@

        • Calendar
        -
        library(excelR)
        -
        -data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        -                  Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ))
        -
        -columns = data.frame(title=c('Model', 'Date' ),
        -                     width= c(300, 300),
        -                     type=c('text', 'calendar')) 
        -excelTable(data=data, columns = columns)
        +
        +library(excelR)
        +
        +data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        +                  Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ))
        +
        +columns = data.frame(title=c('Model', 'Date' ),
        +                     width= c(300, 300),
        +                     type=c('text', 'calendar')) 
        +excelTable(data=data, columns = columns)

        • Checkbox
        -
        library(excelR)
        -
        - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        -                   Availability = c(TRUE, FALSE, TRUE, TRUE))
        -
        - columns = data.frame(title=c('Model', 'Availability'),
        -                      width= c(300, 300),
        -                      type=c('text', 'checkbox')) 
        - excelTable(data=data, columns = columns)
        +
        +library(excelR)
        +
        + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        +                   Availability = c(TRUE, FALSE, TRUE, TRUE))
        +
        + columns = data.frame(title=c('Model', 'Availability'),
        +                      width= c(300, 300),
        +                      type=c('text', 'checkbox')) 
        + excelTable(data=data, columns = columns)

        • Dropdown
        -
        library(excelR)
        -
        - data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'), 
        -          Car = c('Civic', 'City', 'Polo'))
        -
        - columns = data.frame(title=c('Make', 'Car'),
        -                      width= c(300, 300),
        -                      type=c('text', 'dropdown'),
        -                      source=I(list(0,c('Civic', 'City',  'Polo', 'Creta', 'Santro'))))
        - excelTable(data=data, columns = columns)
        +
        +library(excelR)
        +
        + data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'), 
        +          Car = c('Civic', 'City', 'Polo'))
        +
        + columns = data.frame(title=c('Make', 'Car'),
        +                      width= c(300, 300),
        +                      type=c('text', 'dropdown'),
        +                      source=I(list(0,c('Civic', 'City',  'Polo', 'Creta', 'Santro'))))
        + excelTable(data=data, columns = columns)

        • Radio
        -
        library(excelR)
        -
        - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        -                   Choice = c(FALSE, FALSE, FALSE, TRUE))
        -
        - columns = data.frame(title=c('Model', 'Choice'),
        -                      width= c(300, 300),
        -                      type=c('text', 'radio')) 
        - excelTable(data=data, columns = columns)
        +
        +library(excelR)
        +
        + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        +                   Choice = c(FALSE, FALSE, FALSE, TRUE))
        +
        + columns = data.frame(title=c('Model', 'Choice'),
        +                      width= c(300, 300),
        +                      type=c('text', 'radio')) 
        + excelTable(data=data, columns = columns)

        • Color
        -
        library(excelR)
        -
        - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        -                   Color= c('red', 'blue', 'yellow', 'black'))
        -
        - columns = data.frame(title=c('Model', 'Color'),
        -                      width= c(300, 300),
        -                      type=c('text', 'color'),
        -                      render=c(0, 'square')) 
        - excelTable(data=data, columns = columns)
        +
        +library(excelR)
        +
        + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
        +                   Color= c('red', 'blue', 'yellow', 'black'))
        +
        + columns = data.frame(title=c('Model', 'Color'),
        +                      width= c(300, 300),
        +                      type=c('text', 'color'),
        +                      render=c(0, 'square')) 
        + excelTable(data=data, columns = columns)

        • Image
        -
        library(excelR)
        -
        -data <- data.frame(Title = c("Paul Parker", "Mark Ellen"),
        -                   Cover =  c("https://marketplace.canva.com/MACcZp2p4po/2/0/thumbnail_large/canva-black-white-acoustic-album-cover-MACcZp2p4po.jpg",                          "https://marketplace.canva.com/MACcY55adP4/1/0/thumbnail_large/canva-black-and-white-masculine-acoustic-modern-album-cover-MACcY55adP4.jpg"))
        -
        -columns <- data.frame(title = colnames(data),
        -                      type = c("text", "image"),
        -                      width = c(120, 200))
        -
        -excelTable(data = data, columns = columns)
        +
        +library(excelR)
        +
        +data <- data.frame(Title = c("Paul Parker", "Mark Ellen"),
        +                   Cover =  c("https://marketplace.canva.com/MACcZp2p4po/2/0/thumbnail_large/canva-black-white-acoustic-album-cover-MACcZp2p4po.jpg",                          "https://marketplace.canva.com/MACcY55adP4/1/0/thumbnail_large/canva-black-and-white-masculine-acoustic-modern-album-cover-MACcY55adP4.jpg"))
        +
        +columns <- data.frame(title = colnames(data),
        +                      type = c("text", "image"),
        +                      width = c(120, 200))
        +
        +excelTable(data = data, columns = columns)

    Row and Column Resizing

    -
    library(excelR)
    -
    - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    -                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    -                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    -
    - columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    -                      width= c(300, 300, 300),
    -                      type=c('text', 'calendar', 'checkbox')) 
    - excelTable(data=data, columns = columns, rowResize = TRUE)
    +
    +library(excelR)
    +
    + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    +                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    +                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    +
    + columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    +                      width= c(300, 300, 300),
    +                      type=c('text', 'calendar', 'checkbox')) 
    + excelTable(data=data, columns = columns, rowResize = TRUE)

    Drag and Drop Rows and Columns

    -
    library(excelR)
    -
    - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    -                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    -                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    -
    - columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    -                      width= c(300, 300, 300),
    -                      type=c('text', 'calendar', 'checkbox')) 
    - excelTable(data=data, columns = columns, rowDrag = TRUE, columnDrag = TRUE)
    +
    +library(excelR)
    +
    + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    +                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ),
    +                   Availability = c(TRUE, FALSE, TRUE, TRUE))
    +
    + columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    +                      width= c(300, 300, 300),
    +                      type=c('text', 'calendar', 'checkbox')) 
    + excelTable(data=data, columns = columns, rowDrag = TRUE, columnDrag = TRUE)

    Merge Rows and Columns

    -
    library(excelR)
    -
    -data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    -                   Car = c('Civic', 'City', 'Creta'))
    -
    - columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    -                      
    -excelTable(data=data, columns = columns,  mergeCells = list(A1=c(1,2)))
    +
    +library(excelR)
    +
    +data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    +                   Car = c('Civic', 'City', 'Creta'))
    +
    + columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    +                      
    +excelTable(data=data, columns = columns,  mergeCells = list(A1=c(1,2)))

    Nested Headers

    -
    library(excelR)
    -
    - columns = data.frame(title=c('Sepal Length', 'Sepal Width', 'Petal Length','Petal Width', 'Species'),
    -                      width= c(200, 200, 200, 200, 200))
    -                      
    - nestedHeaders = list( data.frame(title=c("Plant Attribute"), colspan=c(5)), 
    -                       data.frame(title=c("Sepal Attributes", "Petal Attributes", "Species"), 
    -                                  colspan=c(2, 2, 1)))
    - excelTable(data=head(iris), columns = columns, nestedHeaders = nestedHeaders)
    +
    +library(excelR)
    +
    + columns = data.frame(title=c('Sepal Length', 'Sepal Width', 'Petal Length','Petal Width', 'Species'),
    +                      width= c(200, 200, 200, 200, 200))
    +                      
    + nestedHeaders = list( data.frame(title=c("Plant Attribute"), colspan=c(5)), 
    +                       data.frame(title=c("Sepal Attributes", "Petal Attributes", "Species"), 
    +                                  colspan=c(2, 2, 1)))
    + excelTable(data=head(iris), columns = columns, nestedHeaders = nestedHeaders)

    Excel formulas

    -
    library(excelR)
    -
    - columns = data.frame(title=c('Sepal Length', 'Sepal Width', 'Petal Length','Petal Width', 'Species'),
    -                      width= c(200, 200, 200, 200, 200))
    -                      
    - excelTable(data=head(iris), columns = columns, minDimension = c(5, 7))
    +
    +library(excelR)
    +
    + columns = data.frame(title=c('Sepal Length', 'Sepal Width', 'Petal Length','Petal Width', 'Species'),
    +                      width= c(200, 200, 200, 200, 200))
    +                      
    + excelTable(data=head(iris), columns = columns, minDimension = c(5, 7))

    Style

    Styling in version 0.1.0:

    -
     library(excelR)
    -
    - data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    -                   Car = c('Civic', 'City', 'Creta'))
    -
    - columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    -  
    - style = list(A1=c('background-color:orange', 'color:green'), 
    -              B1=c('background-color:orange', 'color:green'))
    -                      
    - excelTable(data=data, columns = columns, style = style)
    +
    + library(excelR)
    +
    + data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    +                   Car = c('Civic', 'City', 'Creta'))
    +
    + columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    +  
    + style = list(A1=c('background-color:orange', 'color:green'), 
    +              B1=c('background-color:orange', 'color:green'))
    +                      
    + excelTable(data=data, columns = columns, style = style)

    Styling from version 0.2.0 onwards:

    -
     library(excelR)
    -
    - data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    -                   Car = c('Civic', 'City', 'Creta'))
    -
    - columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    -  
    - style = list(A1='background-color:orange; color:green;', 
    -              B1='background-color:orange; color:green;')
    -                      
    - excelTable(data=data, columns = columns, style = style)
    +
    + library(excelR)
    +
    + data = data.frame( Make = c('Honda', 'Honda', 'Hyundai'),
    +                   Car = c('Civic', 'City', 'Creta'))
    +
    + columns = data.frame(title=c('Make', 'Car'), width= c(300, 300))
    +  
    + style = list(A1='background-color:orange; color:green;', 
    +              B1='background-color:orange; color:green;')
    +                      
    + excelTable(data=data, columns = columns, style = style)

    Automated Column Types

    -
    library(excelR)
    -
    - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    -                   Date=c(as.Date('2006-01-01'), as.Date('2005-01-01'), as.Date('2004-01-01'), as.Date('2003-01-01') ),
    -                   Availability = c(TRUE, FALSE, TRUE, TRUE), stringsAsFactors = FALSE)
    -
    - columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    -                      width= c(300, 300, 300)) 
    - excelTable(data=data, columns = columns)
    +
    +library(excelR)
    +
    + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    +                   Date=c(as.Date('2006-01-01'), as.Date('2005-01-01'), as.Date('2004-01-01'), as.Date('2003-01-01') ),
    +                   Availability = c(TRUE, FALSE, TRUE, TRUE), stringsAsFactors = FALSE)
    +
    + columns = data.frame(title=c('Model', 'Date', 'Availability' ),
    +                      width= c(300, 300, 300)) 
    + excelTable(data=data, columns = columns)

    Toolbar

    -
    library(excelR)
    -
    - data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    -                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ))
    -
    - columns = data.frame(title=c('Model', 'Date'),
    -                      width= c(200, 200),
    -                      type=c('text', 'calendar')) 
    - excelTable(data=data, columns = columns, showToolbar=TRUE)
    +
    +library(excelR)
    +
    + data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'),
    +                   Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ))
    +
    + columns = data.frame(title=c('Model', 'Date'),
    +                      width= c(200, 200),
    +                      type=c('text', 'calendar')) 
    + excelTable(data=data, columns = columns, showToolbar=TRUE)

    @@ -367,96 +386,130 @@

    Creating excel table in Shiny

    -
      library(shiny)
    -  library(excelR)
    -
    -   shinyApp(
    -     ui = fluidPage(excelOutput("table")),
    -     server = function(input, output, session) {
    -       output$table <-
    -      renderExcel(excelTable(data = head(iris)))
    -      }
    -    )
    +
    +  library(shiny)
    +  library(excelR)
    +
    +   shinyApp(
    +     ui = fluidPage(excelOutput("table")),
    +     server = function(input, output, session) {
    +       output$table <-
    +      renderExcel(excelTable(data = head(iris)))
    +      }
    +    )

    Reading changed data from excel table in Shiny

    -
      library(shiny)
    -  library(excelR)
    -
    -   shinyApp(
    -     ui = fluidPage(excelOutput("table")),
    -     server = function(input, output, session) {
    -       output$table <-
    -      renderExcel(excelTable(data = head(iris)))
    -      observeEvent(input$table,{
    -        table_data <- excel_to_R(input$table)
    -        if(!is.null(table_data)){
    -        print(table_data)
    -        }
    -        
    -      })
    -      }
    -    )
    +
    +  library(shiny)
    +  library(excelR)
    +
    +   shinyApp(
    +     ui = fluidPage(excelOutput("table")),
    +     server = function(input, output, session) {
    +       output$table <-
    +      renderExcel(excelTable(data = head(iris)))
    +      observeEvent(input$table,{
    +        table_data <- excel_to_R(input$table)
    +        if(!is.null(table_data)){
    +        print(table_data)
    +        }
    +        
    +      })
    +      }
    +    )

    Getting/Setting comment in Shiny

    -
    library(excelR)
    -library(shiny)
    -
    -shinyApp(
    -  
    -  ui = fluidPage(actionButton('set', 'Set Comments to cell A1'),
    -                 actionButton('get', 'Get Comments from cell A1'),
    -                 textAreaInput("fetchedComment", "Comments from A1:"),
    -                 excelOutput("table", height = 175)),
    -                 
    -  server = function(input, output, session) {
    -  
    -      output$table <- renderExcel(excelTable(data = head(iris), allowComments = TRUE))
    -      
    -      # Set the comment
    -      observeEvent(input$set,{
    -        setComments("table", "A1", "This is a comment")
    -      })
    -      
    -      # Get the comment
    -      observeEvent(input$get,{
    -          getComments("table", "A1")
    -      })
    -      
    -      # Print the comment to the text area
    -      observeEvent(input$table,{
    -        updateTextAreaInput(session, 'fetchedComment', value = input$table$comment )
    -      })
    -    }
    -  )
    +
    +library(excelR)
    +library(shiny)
    +
    +shinyApp(
    +  
    +  ui = fluidPage(actionButton('set', 'Set Comments to cell A1'),
    +                 actionButton('get', 'Get Comments from cell A1'),
    +                 textAreaInput("fetchedComment", "Comments from A1:"),
    +                 excelOutput("table", height = 175)),
    +                 
    +  server = function(input, output, session) {
    +  
    +      output$table <- renderExcel(excelTable(data = head(iris), allowComments = TRUE))
    +      
    +      # Set the comment
    +      observeEvent(input$set,{
    +        setComments("table", "A1", "This is a comment")
    +      })
    +      
    +      # Get the comment
    +      observeEvent(input$get,{
    +          getComments("table", "A1")
    +      })
    +      
    +      # Print the comment to the text area
    +      observeEvent(input$table,{
    +        updateTextAreaInput(session, 'fetchedComment', value = input$table$comment )
    +      })
    +    }
    +  )

    +
    +

    +Getting table data in Shiny

    +
    +library(excelR)
    +library(shiny)
    +
    +shinyApp(
    +  
    +  ui = fluidPage(actionButton('get', 'Get table data'),
    +                 tableOutput("fetchedData"),
    +                 excelOutput("table", height = 175)),
    +  
    +  server = function(input, output, session) {
    +    
    +    output$table <- renderExcel(excelTable(data = head(iris)))
    +    
    +    # Get the table data
    +    observeEvent(input$get,{
    +      getTableData("table")
    +    })
    +    
    +    # Print the table
    +    observeEvent(input$table,{
    +      output$fetchedData <- renderTable(excel_to_R(input$table))
    +    })
    +  }
    +)
    +

    +

    Getting selected data in Shiny

    -
    library(excelR)
    -library(shiny)
    -
    -shinyApp(
    -  
    -  ui = fluidPage( tags$h6("Selected Data:"),
    -                  tableOutput("selectedData"),
    -                  tags$h6("Excel Table:"),
    -                 excelOutput("table", height = 175)),
    -  
    -  server = function(input, output, session) {
    -    
    -    output$table <- renderExcel(excelTable(data = head(iris), getSelectedData = TRUE))
    -    
    -    # Print the selected data in table
    -    observeEvent(input$table,{
    -      output$selectedData <- renderTable(get_selected_data(input$table))
    -    })
    -  }
    -)
    +
    +library(excelR)
    +library(shiny)
    +
    +shinyApp(
    +  
    +  ui = fluidPage( tags$h6("Selected Data:"),
    +                  tableOutput("selectedData"),
    +                  tags$h6("Excel Table:"),
    +                 excelOutput("table", height = 175)),
    +  
    +  server = function(input, output, session) {
    +    
    +    output$table <- renderExcel(excelTable(data = head(iris), getSelectedData = TRUE))
    +    
    +    # Print the selected data in table
    +    observeEvent(input$table,{
    +      output$selectedData <- renderTable(get_selected_data(input$table))
    +    })
    +  }
    +)

    @@ -464,13 +517,13 @@

    -
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + diff --git a/docs/inst/images/get_data.gif b/docs/inst/images/get_data.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea3136119f59e03ad9efed663517d7e16bdfdf25 GIT binary patch literal 45449 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 VPX%LYin8^32rs`LfC2=N`(I@L_o@H@ literal 0 HcmV?d00001 diff --git a/docs/news/index.html b/docs/news/index.html index afd6dfd..a166de1 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -8,21 +8,29 @@ Changelog • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,12 @@ + + @@ -44,9 +54,10 @@ + - +
    +
    -

    +

    excelR 0.4.0 2020-03-09

      @@ -119,7 +130,7 @@

    -

    +

    excelR 0.3.1 2019-10-01

      @@ -128,7 +139,7 @@

    -

    +

    excelR 0.3.0 2019-09-07

      @@ -137,7 +148,7 @@

    -

    +

    excelR 0.2.1 2019-08-19

      @@ -148,7 +159,7 @@

    -

    +

    excelR 0.2.0 2019-07-26

      @@ -161,7 +172,7 @@

    -

    +

    excelR 0.1.0 2019-07-18

      @@ -170,35 +181,31 @@

    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/pkgdown.css b/docs/pkgdown.css index c03fb08..1273238 100644 --- a/docs/pkgdown.css +++ b/docs/pkgdown.css @@ -17,12 +17,14 @@ html, body { height: 100%; } +body { + position: relative; +} + body > .container { display: flex; height: 100%; flex-direction: column; - - padding-top: 60px; } body > .container .row { @@ -69,6 +71,10 @@ summary { margin-top: calc(-60px + 1em); } +dd { + margin-left: 3em; +} + /* Section anchors ---------------------------------*/ a.anchor { @@ -102,37 +108,135 @@ a.anchor { margin-top: -40px; } -/* Static header placement on mobile devices */ -@media (max-width: 767px) { - .navbar-fixed-top { - position: absolute; - } - .navbar { - padding: 0; - } +/* Navbar submenu --------------------------*/ + +.dropdown-submenu { + position: relative; } +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + border-radius: 6px 0 6px 6px; +} /* Sidebar --------------------------*/ -#sidebar { +#pkgdown-sidebar { margin-top: 30px; + position: -webkit-sticky; + position: sticky; + top: 70px; } -#sidebar h2 { + +#pkgdown-sidebar h2 { font-size: 1.5em; margin-top: 1em; } -#sidebar h2:first-child { +#pkgdown-sidebar h2:first-child { margin-top: 0; } -#sidebar .list-unstyled li { +#pkgdown-sidebar .list-unstyled li { margin-bottom: 0.5em; } +/* bootstrap-toc tweaks ------------------------------------------------------*/ + +/* All levels of nav */ + +nav[data-toggle='toc'] .nav > li > a { + padding: 4px 20px 4px 6px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; +} + +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 5px; + color: inherit; + border-left: 1px solid #878787; +} + +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 5px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; + border-left: 2px solid #878787; +} + +/* Nav: second level (shown on .active) */ + +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} + +nav[data-toggle='toc'] .nav .nav > li > a { + padding-left: 16px; + font-size: 1.35rem; +} + +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 15px; +} + +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 15px; + font-weight: 500; + font-size: 1.35rem; +} + +/* orcid ------------------------------------------------------------------- */ + .orcid { - height: 16px; + font-size: 16px; + color: #A6CE39; + /* margins are required by official ORCID trademark and display guidelines */ + margin-left:4px; + margin-right:4px; vertical-align: middle; } @@ -140,14 +244,14 @@ a.anchor { .ref-index th {font-weight: normal;} -.ref-index td {vertical-align: top;} +.ref-index td {vertical-align: top; min-width: 100px} .ref-index .icon {width: 40px;} .ref-index .alias {width: 40%;} .ref-index-icons .alias {width: calc(40% - 40px);} .ref-index .title {width: 60%;} .ref-arguments th {text-align: right; padding-right: 10px;} -.ref-arguments th, .ref-arguments td {vertical-align: top;} +.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px} .ref-arguments .name {width: 20%;} .ref-arguments .desc {width: 80%;} @@ -222,6 +326,19 @@ a.sourceLine:hover { visibility: visible; } +/* headroom.js ------------------------ */ + +.headroom { + will-change: transform; + transition: transform 200ms linear; +} +.headroom--pinned { + transform: translateY(0%); +} +.headroom--unpinned { + transform: translateY(-100%); +} + /* mark.js ----------------------------*/ mark { @@ -234,3 +351,17 @@ mark { .html-widget { margin-bottom: 10px; } + +/* fontawesome ------------------------ */ + +.fab { + font-family: "Font Awesome 5 Brands" !important; +} + +/* don't display links in code chunks when printing */ +/* source: https://stackoverflow.com/a/10781533 */ +@media print { + code a:link:after, code a:visited:after { + content: ""; + } +} diff --git a/docs/pkgdown.js b/docs/pkgdown.js index eb7e83d..7e7048f 100644 --- a/docs/pkgdown.js +++ b/docs/pkgdown.js @@ -2,18 +2,11 @@ (function($) { $(function() { - $("#sidebar") - .stick_in_parent({offset_top: 40}) - .on('sticky_kit:bottom', function(e) { - $(this).parent().css('position', 'static'); - }) - .on('sticky_kit:unbottom', function(e) { - $(this).parent().css('position', 'relative'); - }); + $('.navbar-fixed-top').headroom(); - $('body').scrollspy({ - target: '#sidebar', - offset: 60 + $('body').css('padding-top', $('.navbar').height() + 10); + $(window).resize(function(){ + $('body').css('padding-top', $('.navbar').height() + 10); }); $('[data-toggle="tooltip"]').tooltip(); diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 3e37494..c6b44df 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,6 @@ -pandoc: 2.7.3 -pkgdown: 1.3.0 +pandoc: 2.11.4 +pkgdown: 1.6.1 pkgdown_sha: ~ -articles: [] +articles: {} +last_built: 2021-09-09T03:41Z diff --git a/docs/reference/Rplot001.png b/docs/reference/Rplot001.png new file mode 100644 index 0000000000000000000000000000000000000000..17a358060aed2a86950757bbd25c6f92c08c458f GIT binary patch literal 1011 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|=9Be?5+AI5}0x7m6Z+90U4Fo@(ch>_c&H|6f zVg?3oArNM~bhqvg0|WD9PZ!6KiaBo&GBN^{G%5UFpXcEKVvd5*5Eu=C0SJK)8A6*F U7`aXvEC5;V>FVdQ&MBb@00SN#Z2$lO literal 0 HcmV?d00001 diff --git a/docs/reference/excelOutput.html b/docs/reference/excelOutput.html index 22c126b..6d945e4 100644 --- a/docs/reference/excelOutput.html +++ b/docs/reference/excelOutput.html @@ -8,21 +8,29 @@ Helper function for using jexcel table in Shiny — excelOutput • excelR + - + - + + + + - + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Helper function for using jexcel table in Shiny

    -

    Shiny bindings for excel table

    -
    -
    excelOutput(outputId, width = "100%", height = "400px")
    - +
    excelOutput(outputId, width = "100%", height = "400px")
    +

    Arguments

    @@ -127,51 +134,49 @@

    Arg

    must be a valid CSS unit in pixel or a number, which will be coerced to a string and "px" appended.

    - +

    See also

    -

    Examples

    -
    if(interactive()) { - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table")), - server = function(input, output, session) { - output$table <- - renderExcel(excelTable(data = head(iris))) - } - ) -}
    +
    if(interactive()) { + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table")), + server = function(input, output, session) { + output$table <- + renderExcel(excelTable(data = head(iris))) + } + ) +} +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/excelTable.html b/docs/reference/excelTable.html index daed7cc..4c75cb7 100644 --- a/docs/reference/excelTable.html +++ b/docs/reference/excelTable.html @@ -8,21 +8,29 @@ Create excel table using jexcel library — excelTable • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,24 +117,22 @@

    Create excel table using jexcel library

    -

    This function is used to create excel like table

    -
    -
    excelTable(data = NULL, columns = NULL, colHeaders = NULL,
    -  rowHeight = NULL, nestedHeaders = NULL, defaultColWidth = NULL,
    -  minDimensions = NULL, columnSorting = TRUE, columnDrag = FALSE,
    -  columnResize = TRUE, rowResize = FALSE, rowDrag = TRUE,
    -  editable = TRUE, allowInsertRow = TRUE, allowInsertColumn = TRUE,
    -  allowDeleteRow = TRUE, allowDeleteColumn = TRUE,
    -  allowRenameColumn = TRUE, allowComments = FALSE, wordWrap = FALSE,
    -  selectionCopy = TRUE, mergeCells = NULL, search = FALSE,
    -  pagination = NULL, fullscreen = FALSE, lazyLoading = FALSE,
    -  loadingSpin = FALSE, style = NULL, autoColTypes = TRUE,
    -  showToolbar = FALSE, dateFormat = "DD/MM/YYYY", digits = 4,
    -  autoWidth = TRUE, autoFill = FALSE, getSelectedData = FALSE, ...)
    - +
    excelTable(data = NULL, columns = NULL, colHeaders = NULL,
    +  rowHeight = NULL, nestedHeaders = NULL, defaultColWidth = NULL,
    +  minDimensions = NULL, columnSorting = TRUE, columnDrag = FALSE,
    +  columnResize = TRUE, rowResize = FALSE, rowDrag = TRUE,
    +  editable = TRUE, allowInsertRow = TRUE, allowInsertColumn = TRUE,
    +  allowDeleteRow = TRUE, allowDeleteColumn = TRUE,
    +  allowRenameColumn = TRUE, allowComments = FALSE, wordWrap = FALSE,
    +  selectionCopy = TRUE, mergeCells = NULL, search = FALSE,
    +  pagination = NULL, fullscreen = FALSE, lazyLoading = FALSE,
    +  loadingSpin = FALSE, style = NULL, autoColTypes = TRUE,
    +  showToolbar = FALSE, dateFormat = "DD/MM/YYYY", digits = 4,
    +  autoWidth = TRUE, autoFill = FALSE, getSelectedData = FALSE, ...)
    +

    Arguments

    @@ -270,7 +277,7 @@

    Arg

    - + @@ -292,94 +299,97 @@

    Arg

    digits

    number of decimal digits passed to jsonlite::toJSON. By default it is set to 4, use NA for max precision.

    number of decimal digits passed to jsonlite::toJSON. By default it is set to 4, use NA for max precision.

    autoWidth

    other jexcel parameters, e.g., updateTable

    - +

    Examples

    ### table example --- -library(excelR) +library(excelR) -data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'), - Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ), - Availability = c(TRUE, FALSE, TRUE, TRUE)) +data = data.frame(Model = c('Mazda', 'Pegeout', 'Honda Fit', 'Honda CRV'), + Date=c('2006-01-01', '2005-01-01','2004-01-01', '2003-01-01' ), + Availability = c(TRUE, FALSE, TRUE, TRUE)) -columns = data.frame(title=c('Model', 'Date', 'Availability'), - width= c(300, 300, 300), - type=c('text', 'calendar', 'checkbox')) +columns = data.frame(title=c('Model', 'Date', 'Availability'), + width= c(300, 300, 300), + type=c('text', 'calendar', 'checkbox')) -excelTable(data=data, columns = columns) +excelTable(data=data, columns = columns) ### columns parameter ---- # https://bossanova.uk/jexcel/v3/examples/column-types -data <- data.frame(Car = c("Jazz", "Civic"), - Make = c("Honda", "Honda" ), - Photo = c("https://images.unsplash.com/photo-1535498730771-e735b998cd64?ixlib=rb +data <- data.frame(Car = c("Jazz", "Civic"), + Make = c("Honda", "Honda" ), + Photo = c("https://images.unsplash.com/photo-1535498730771-e735b998cd64?ixlib=rb -1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=634&q=80", "https://images.unsplash.com/photo-1533106497176-45ae19e68ba2?ixlib=rb - -1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1950&q=80"), - Available = as.Date(c("2019-02-12", "2018-07-11")), - Stock = c(TRUE, TRUE), - Price = c(2000, 4000.01), - Color = c("#777700", "#007777")) - -columns <- data.frame(title = colnames(data), - type = c("hidden", "dropdown", "image", "calendar", - "checkbox", "numeric", "color"), - width = c(120, 200, 200, 80, 100, 100, 100), - source = I(list(NA, c("Honda", "Alfa Romeo", "Audi", "Bmw"), - NA, NA, NA, NA, NA)), - mask = c(NA, NA, NA, NA, NA, "$ #.##,00", NA), - decimal = c(NA, NA, NA, NA, NA, ",", NA), - render = c(NA, NA, NA, NA, NA, NA, "square")) - -excelTable(data = data, columns = columns) + -1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1950&q=80"), + Available = as.Date(c("2019-02-12", "2018-07-11")), + Stock = c(TRUE, TRUE), + Price = c(2000, 4000.01), + Color = c("#777700", "#007777")) + +columns <- data.frame(title = colnames(data), + type = c("hidden", "dropdown", "image", "calendar", + "checkbox", "numeric", "color"), + width = c(120, 200, 200, 80, 100, 100, 100), + source = I(list(NA, c("Honda", "Alfa Romeo", "Audi", "Bmw"), + NA, NA, NA, NA, NA)), + mask = c(NA, NA, NA, NA, NA, "$ #.##,00", NA), + decimal = c(NA, NA, NA, NA, NA, ",", NA), + render = c(NA, NA, NA, NA, NA, NA, "square")) + +excelTable(data = data, columns = columns) ### no arguments with matrix ---- -excelTable(matrix(1:20, ncol=4))
    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    +excelTable(matrix(1:20, ncol=4)) +
    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    ### some additional arguments with mtcars ---- -library(excelR) +library(excelR) # for now we need to manipulate a data.frame with rownames -mtcars2 <- cbind(name = rownames(mtcars), mtcars, stringsAsFactors = FALSE) -mtcars2$name <- rownames(mtcars) +mtcars2 <- cbind(name = rownames(mtcars), mtcars, stringsAsFactors = FALSE) +mtcars2$name <- rownames(mtcars) # change rownames so jsonlite will not convert to a column -rownames(mtcars2) <- seq_len(nrow(mtcars2)) - -excelTable( - data = mtcars2, - colHeaders = toupper(colnames(mtcars2)), # upper case the column names - fullscreen = TRUE, # fill screen with table - columnDrag = TRUE, # allow dragging (reordering) of columns - rowDrag = FALSE, # disallow dragging (reordering) of rows - wordWrap = TRUE, # wrap text in a cell if is longer than cell width -)
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    +rownames(mtcars2) <- seq_len(nrow(mtcars2)) + +excelTable( + data = mtcars2, + colHeaders = toupper(colnames(mtcars2)), # upper case the column names + fullscreen = TRUE, # fill screen with table + columnDrag = TRUE, # allow dragging (reordering) of columns + rowDrag = FALSE, # disallow dragging (reordering) of rows + wordWrap = TRUE, # wrap text in a cell if is longer than cell width +) +
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    # an empty table -excelTable( - data = NULL, - minDimensions = c(5,20) # columns, rows -) +excelTable( + data = NULL, + minDimensions = c(5,20) # columns, rows +) ### styling cells ---- -library(excelR) - -excelTable( - data = matrix(1:100, ncol = 10), - style = list( - "A1" = 'background-color: orange; fontWeight: bold; color: white;', - "B1" = 'background-color: orange;', - "C1" = 'background-color: orange;', - "D1" = 'background-color: orange;' - ) -)
    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    +library(excelR) + +excelTable( + data = matrix(1:100, ncol = 10), + style = list( + "A1" = 'background-color: orange; fontWeight: bold; color: white;', + "B1" = 'background-color: orange;', + "C1" = 'background-color: orange;', + "D1" = 'background-color: orange;' + ) +) +
    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    ### custom formating ---- # conditional formats -library(excelR) +library(excelR) -set.seed(1) -data <- matrix(sample(c(-1:1), size = 25, replace = TRUE), nrow = 5) +set.seed(1) +data <- matrix(sample(c(-1:1), size = 25, replace = TRUE), nrow = 5) -updateTable <- "function(instance, cell, col, row, val, label, cellName) { +updateTable <- "function(instance, cell, col, row, val, label, cellName) { val = cell.innerText; if (val < 0) { cell.style.color = 'red'; @@ -390,11 +400,12 @@

    Examp } }" -excelTable(data = data, updateTable = htmlwidgets::JS(updateTable))

    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    +excelTable(data = data, updateTable = htmlwidgets::JS(updateTable)) +
    #> Warning: Since both column title and colHeaders are not specified 'data' column name will be used as column headers
    #> Since 'type' attribute is not specified and autoColTypes is true, detecting type from 'data'
    # example from https://bossanova.uk/jexcel/v3/examples/table-scripting -library(excelR) +library(excelR) -data <- jsonlite::fromJSON('[ +data <- jsonlite::fromJSON('[ ["BR", "Cheese", 1, 3.99], ["CA", "Apples", 0, 1.00], ["US", "Carrots", 1, 0.90], @@ -405,21 +416,21 @@

    Examp ["BR", "Oranges", 1, 0.95], ["BR", "Pears", 1, 0.90], ["", "", "", "=ROUND(SUM(D1:D8), 2)"] -]') +]') -columns <- jsonlite::fromJSON('[ +columns <- jsonlite::fromJSON('[ { "type": "autocomplete", "title":"Country", "width":"250", "url":"/jexcel/countries" }, { "type": "autocomplete", "title":"Food", "width":"150", "source":["Apples","Bananas","Carrots","Oranges","Cheese","Kiwi","Chocolats","Pears"] }, { "type": "checkbox", "title":"Stock", "width":"100" }, { "type": "number", "title":"Price", "width":"100" } - ]') + ]') # url option to source in excelTable param columns -columns$source[1] <- list(jsonlite::fromJSON(paste0('https://bossanova.uk', columns$url[1]))) -columns$url <- NULL +columns$source[1] <- list(jsonlite::fromJSON(paste0('https://bossanova.uk', columns$url[1]))) +columns$url <- NULL -updateTable <- "function(instance, cell, col, row, val, label, cellName) { +updateTable <- "function(instance, cell, col, row, val, label, cellName) { // Number formating if (col == 3) { // Get text @@ -454,32 +465,33 @@

    Examp } }" -excelTable(data = data, columns = columns, updateTable = htmlwidgets::JS(updateTable))

    +excelTable(data = data, columns = columns, updateTable = htmlwidgets::JS(updateTable)) +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/excel_to_R.html b/docs/reference/excel_to_R.html index 60d732a..4b45ee4 100644 --- a/docs/reference/excel_to_R.html +++ b/docs/reference/excel_to_R.html @@ -8,21 +8,29 @@ Convert excel object to data.frame — excel_to_R • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Convert excel object to data.frame

    -

    This function is used to excel data to data.frame. Can be used in shiny app to convert input json to data.frame

    -
    -
    excel_to_R(excelObj)
    - +
    excel_to_R(excelObj)
    +

    Arguments

    @@ -123,48 +130,49 @@

    Arg

    the json data retuned from excel table

    - +

    Examples

    -
    if(interactive()){ - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table")), - server = function(input, output, session) { - output$table <- - renderExcel(excelTable(data = head(iris))) - observeEvent(input$table,{ - print(excel_to_R(input$table)) - }) - } - ) -}
    +
    if(interactive()){ + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table")), + server = function(input, output, session) { + output$table <- + renderExcel(excelTable(data = head(iris))) + observeEvent(input$table,{ + print(excel_to_R(input$table)) + }) + } + ) +} +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/getComments.html b/docs/reference/getComments.html index c2d0ca1..412580d 100644 --- a/docs/reference/getComments.html +++ b/docs/reference/getComments.html @@ -8,21 +8,29 @@ This function is used to get comment from specified cell — getComments • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    This function is used to get comment from specified cell

    -

    This function is used to get comment from specified cell

    -
    -
    getComments(tableId, cellId)
    - +
    getComments(tableId, cellId)
    +

    Arguments

    @@ -127,51 +134,52 @@

    Arg

    the id of the cell from which the comment is to be fetched

    - +

    Examples

    -
    if(interactive()) { - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table", height = 175), - actionButton('comment', 'Get Comments from cell A1')), - server = function(input, output, session) { - output$table <- renderExcel(excelTable(data = head(iris))) - observeEvent(input$comment, { - getComments("table", "A1") - }) - observeEvent(input$table, { - print(input$table$comment) - }) - } - ) - }
    +
    if(interactive()) { + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table", height = 175), + actionButton('comment', 'Get Comments from cell A1')), + server = function(input, output, session) { + output$table <- renderExcel(excelTable(data = head(iris))) + observeEvent(input$comment, { + getComments("table", "A1") + }) + observeEvent(input$table, { + print(input$table$comment) + }) + } + ) + } +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/getTableData.html b/docs/reference/getTableData.html new file mode 100644 index 0000000..4fe0084 --- /dev/null +++ b/docs/reference/getTableData.html @@ -0,0 +1,162 @@ + + + + + + + + +This function is used to get data from excel table — getTableData • excelR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    This function is used to get data from excel table

    +
    + +
    getTableData(tableId)
    + +

    Arguments

    + + + + + + +
    tableId

    the id of the table from which the comment is to be fetched

    + + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/get_selected_data.html b/docs/reference/get_selected_data.html index 5667bdd..b7ad139 100644 --- a/docs/reference/get_selected_data.html +++ b/docs/reference/get_selected_data.html @@ -8,21 +8,29 @@ Get selected cells from excel table — get_selected_data • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Get selected cells from excel table

    -

    This function is used to get the data selected in excel table

    -
    -
    get_selected_data(excelObj)
    - +
    get_selected_data(excelObj)
    +

    Arguments

    @@ -123,48 +130,49 @@

    Arg

    the json data retuned from excel table

    - +

    Examples

    -
    if(interactive()){ - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table")), - server = function(input, output, session) { - output$table <- - renderExcel(excelTable(data = head(iris), getSelectedData = TRUE)) - observeEvent(input$table,{ - print(get_selected_data(input$table)) - }) - } - ) -}
    +
    if(interactive()){ + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table")), + server = function(input, output, session) { + output$table <- + renderExcel(excelTable(data = head(iris), getSelectedData = TRUE)) + observeEvent(input$table,{ + print(get_selected_data(input$table)) + }) + } + ) +} +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/get_selected_data_boundary.html b/docs/reference/get_selected_data_boundary.html index 34622ee..e5621e8 100644 --- a/docs/reference/get_selected_data_boundary.html +++ b/docs/reference/get_selected_data_boundary.html @@ -8,21 +8,29 @@ Get selected cells boundary from excel table — get_selected_data_boundary • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Get selected cells boundary from excel table

    -

    This function is used to the boundary points of data selected in excel table

    -
    -
    get_selected_data_boundary(excelObj)
    - +
    get_selected_data_boundary(excelObj)
    +

    Arguments

    @@ -123,48 +130,49 @@

    Arg

    the json data retuned from excel table

    - +

    Examples

    -
    if(interactive()){ - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table")), - server = function(input, output, session) { - output$table <- - renderExcel(excelTable(data = head(iris), getSelectedData = TRUE)) - observeEvent(input$table,{ - print(get_selected_data_boundary(input$table)) - }) - } - ) -}
    +
    if(interactive()){ + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table")), + server = function(input, output, session) { + output$table <- + renderExcel(excelTable(data = head(iris), getSelectedData = TRUE)) + observeEvent(input$table,{ + print(get_selected_data_boundary(input$table)) + }) + } + ) +} +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/index.html b/docs/reference/index.html index 995116e..a25ab14 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -8,21 +8,29 @@ Function reference • excelR + - + - + + + + - + + + - + + - + - - + + + @@ -30,10 +38,12 @@ + + @@ -44,9 +54,10 @@ + - +
    +
    @@ -117,6 +128,11 @@

    + + + + + @@ -143,6 +159,12 @@

    getTableData()

    + +

    This function is used to get data from excel table

    + +

    get_selected_data()

    @@ -170,27 +192,30 @@

    -

    Contents

    -
    +

    +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/renderExcel.html b/docs/reference/renderExcel.html index 79ac400..f77434d 100644 --- a/docs/reference/renderExcel.html +++ b/docs/reference/renderExcel.html @@ -8,21 +8,29 @@ Helper function for using jexcel table in Shiny — renderExcel • excelR + - + - + + + + - + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Helper function for using jexcel table in Shiny

    -

    Shiny bindings for excel table

    -
    -
    renderExcel(expr, env = parent.frame(), quoted = FALSE)
    - +
    renderExcel(expr, env = parent.frame(), quoted = FALSE)
    +

    Arguments

    @@ -131,51 +138,49 @@

    Arg

    is expr a quoted expression(with quote())? This is useful if you want to save an expression in a variable.

    - +

    See also

    -

    Examples

    -
    if(interactive()) { - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table")), - server = function(input, output, session) { - output$table <- - renderExcel(excelTable(data = head(iris))) - } - ) -}
    +
    if(interactive()) { + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table")), + server = function(input, output, session) { + output$table <- + renderExcel(excelTable(data = head(iris))) + } + ) +} +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/docs/reference/setComments.html b/docs/reference/setComments.html index 68629a3..8ecd34e 100644 --- a/docs/reference/setComments.html +++ b/docs/reference/setComments.html @@ -8,21 +8,29 @@ Add comment to a specified cell — setComments • excelR + - + - + + - + + + + + - + + - + - - + + + @@ -30,10 +38,10 @@ - + - + @@ -47,9 +55,10 @@ + - +
    +
    @@ -108,13 +117,11 @@

    Add comment to a specified cell

    -

    This function is used to add comment to the specified cell

    -
    -
    setComments(tableId, cellId, comment)
    - +
    setComments(tableId, cellId, comment)
    +

    Arguments

    @@ -131,48 +138,49 @@

    Arg

    the comment that is to be added to the cell

    - +

    Examples

    -
    if(interactive()) { - library(shiny) - library(excelR) - shinyApp( - ui = fluidPage(excelOutput("table", height = 175), - actionButton('comment', 'Set Comments to cell A1')), - server = function(input, output, session) { - output$table <- renderExcel(excelTable(data = head(iris))) - observeEvent(input$comment,{ - setComments("table", "A1", "This is a comment") - }) - } - ) - }
    +
    if(interactive()) { + library(shiny) + library(excelR) + shinyApp( + ui = fluidPage(excelOutput("table", height = 175), + actionButton('comment', 'Set Comments to cell A1')), + server = function(input, output, session) { + output$table <- renderExcel(excelTable(data = head(iris))) + observeEvent(input$comment,{ + setComments("table", "A1", "This is a comment") + }) + } + ) + } +
    - +
    -

    Site built with pkgdown 1.3.0.

    +

    Site built with pkgdown 1.6.1.

    +
    + + diff --git a/index.Rmd b/index.md similarity index 95% rename from index.Rmd rename to index.md index 880fd98..154c0db 100644 --- a/index.Rmd +++ b/index.md @@ -1,18 +1,11 @@ ---- -title: "excelR" -output: github_document ---- -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` +# excelR [![version](http://www.r-pkg.org/badges/version/excelR)](https://CRAN.R-project.org/package=excelR) [![CRAN_Download_Badge](http://cranlogs.r-pkg.org/badges/grand-total/excelR)](http://cran.r-project.org/package=excelR) [![Travis-CI Build Status](https://travis-ci.org/Swechhya/excelR.svg?branch=master)](https://travis-ci.org/Swechhya/excelR) [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/Swechhya/excelR?branch=master&svg=true)](https://ci.appveyor.com/project/Swechhya/excelR) [![codecov](https://codecov.io/gh/Swechhya/excelR/branch/master/graph/badge.svg)](https://codecov.io/gh/Swechhya/excelR) -# excelR An R interface to [jExcel](https://bossanova.uk/jexcel/v3/) library to create web-based interactive tables and spreadsheets compatible with Excel or any other spreadsheet software. @@ -391,6 +384,37 @@ shinyApp( ``` ![](inst/images/getSetComment.gif) +#### Getting table data in Shiny + +```r +library(excelR) +library(shiny) + +shinyApp( + + ui = fluidPage(actionButton('get', 'Get table data'), + tableOutput("fetchedData"), + excelOutput("table", height = 175)), + + server = function(input, output, session) { + + output$table <- renderExcel(excelTable(data = head(iris))) + + # Get the table data + observeEvent(input$get,{ + getTableData("table") + }) + + # Print the table + observeEvent(input$table,{ + output$fetchedData <- renderTable(excel_to_R(input$table)) + }) + } +) + +``` +![](inst/images/get_data.gif) + #### Getting selected data in Shiny ```r diff --git a/inst/images/get_data.gif b/inst/images/get_data.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea3136119f59e03ad9efed663517d7e16bdfdf25 GIT binary patch literal 45449 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 VPX%LYin8^32rs`LfC2=N`(I@L_o@H@ literal 0 HcmV?d00001 From f48f2fa25bde2529bae89f7cc297bfc1079d78fc Mon Sep 17 00:00:00 2001 From: Swechhya Date: Sat, 2 Oct 2021 17:29:34 +0545 Subject: [PATCH 5/5] Update yml --- docs/pkgdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index c6b44df..9f26134 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,5 +2,5 @@ pandoc: 2.11.4 pkgdown: 1.6.1 pkgdown_sha: ~ articles: {} -last_built: 2021-09-09T03:41Z +last_built: 2021-10-02T11:22Z