From 143c91500d2768775102d52cc9eed0d8f3597abe Mon Sep 17 00:00:00 2001 From: olivroy Date: Wed, 14 Aug 2024 17:01:59 -0400 Subject: [PATCH 1/2] Add more support for interactive table stubhead styling. --- NEWS.md | 2 ++ R/render_as_i_html.R | 30 ++++++++++++++++++++++++++++-- tests/testthat/test-i_html.R | 11 +++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index a022aef846..ed7f71d504 100644 --- a/NEWS.md +++ b/NEWS.md @@ -17,6 +17,8 @@ * `opt_interactive()` now works when columns are substituted with `sub_*()` (@olivroy, #1759). +* More support for `cells_stubhead()` styling in interactive tables. + ## Bug fixes * Improved error messages for the `text_transform()` function if `locations` couldn't be resolved. (@olivroy, #1774) diff --git a/R/render_as_i_html.R b/R/render_as_i_html.R index ca711f43dc..462da5841e 100644 --- a/R/render_as_i_html.R +++ b/R/render_as_i_html.R @@ -63,6 +63,18 @@ render_as_ihtml <- function(data, id) { if (identical(column_groups, NA_character_)) { column_groups <- NULL } + + # Derive styling for the stubhead + stubhead_style <- dt_styles_get(data) + if (!is.null(stubhead_style)) { + stubhead_style <- stubhead_style[stubhead_style$locname == "stubhead"] + if (nrow(stubhead_style) == 0) { + stubhead_style <- NULL + } else { + stubhead_style <- stubhead_style$html_style + } + } + rownames_to_stub <- stub_rownames_has_column(data) # value to use for rowname_col or groupname_col title # Will use it for rowname_col only if groupname_col is undefined. @@ -81,6 +93,15 @@ render_as_ihtml <- function(data, id) { groupname_label <- NULL } + # Apply the stubhead styling to row group heading + if (is.null(column_groups)) { + rowname_header_style <- stubhead_style + rwo_group_header_style <- NULL + } else { + # Since row names don't appear under the row group column, style it (even if it is different in non-intereactive) + rowname_header_style <- stubhead_style + row_group_header_style <- stubhead_style + } # Obtain the underlying data table (including group rows) data_tbl0 <- dt_data_get(data = data) @@ -223,7 +244,9 @@ render_as_ihtml <- function(data, id) { name = rowname_label, style = list( fontWeight = stub_font_weight - ) + ), + # part of the stubhead + headerStyle = rowname_header_style # TODO pass on other attributes of row names column if necessary. )) names(row_name_col_def) <- ".rownames" @@ -338,9 +361,11 @@ render_as_ihtml <- function(data, id) { if (i == 1) { # Use the stubhead label for the first group group_label <- groupname_label + row_group_header_style <- stubhead_style } else { # by default, don't name groupname_col for consistency with non-interactive group_label <- "" + row_group_header_style <- stubhead_style } group_col_defs[[i]] <- @@ -349,6 +374,7 @@ render_as_ihtml <- function(data, id) { style = list( `font-weight` = row_group_font_weight ), + headerStyle = row_group_header_style, # The total number of rows is wrong in colGroup, possibly due to the JS fn grouped = grp_fn, # FIXME Should groups be sticky? (or provide a way to do this) @@ -520,7 +546,7 @@ render_as_ihtml <- function(data, id) { first_colgroups <- base::paste0(col_groups$built, collapse = "|") cli::cli_warn(c( - "When displaying an interactive gt table, there must not be more than 1 level of column groups (tab_spanners)", + "Interactive tables support a single spanner level.", "*" = "Currently there are {max(dt_spanners_get(data = data)$spanner_level)} levels of tab spanners.", "i" = "Only the first level will be used for the interactive table, that is: [{first_colgroups}]" )) diff --git a/tests/testthat/test-i_html.R b/tests/testthat/test-i_html.R index ffa9f5a38d..599f829cf2 100644 --- a/tests/testthat/test-i_html.R +++ b/tests/testthat/test-i_html.R @@ -104,6 +104,16 @@ test_that("Interactive tables won't fail when using different options", { gt() %>% sub_missing(rows = 1:7) %>% opt_interactive() + # Styling with `cells_stubhead()` works + tbl_gt_i_30 <- exibble %>% + gt::gt(rowname_col = "row", groupname_col = "group", row_group_as_column = TRUE) |> + tab_spanner("spanners", c(char, num)) %>% + tab_stubhead("Stub row") %>% + tab_style( + style = list(cell_fill("#f0f0f0"), cell_text(weight = "bold")), + cells_stubhead() + ) %>% opt_interactive() + capture_output(expect_no_error(tbl_gt_i_01)) capture_output(expect_no_error(tbl_gt_i_02)) @@ -134,5 +144,6 @@ test_that("Interactive tables won't fail when using different options", { capture_output(expect_no_error(tbl_gt_i_27)) capture_output(expect_no_error(tbl_gt_i_28)) capture_output(expect_no_error(tbl_gt_i_29)) + capture_output(expect_no_error(tbl_gt_i_30)) }) From fdbf80bcc0c7c85f79336d9d972142dcfb49c716 Mon Sep 17 00:00:00 2001 From: olivroy Date: Wed, 14 Aug 2024 17:04:04 -0400 Subject: [PATCH 2/2] Add a visual test + finetune error message. --- pkgdown/assets/gt-latex.pdf | Bin 25445 -> 31364 bytes pkgdown/assets/gt-latex.tex | 58 ++++++++++++++++++++++++++++++++++- scripts/visual-tests-latex.R | 4 +-- vignettes/gt-visual.qmd | 45 +++++++++++++++++++++++++-- 4 files changed, 102 insertions(+), 5 deletions(-) diff --git a/pkgdown/assets/gt-latex.pdf b/pkgdown/assets/gt-latex.pdf index 042fda515b50f3a73c743e582337fd14796dfeb8..49393edd6a659e0ab0f936fed06f9766486aa108 100644 GIT binary patch delta 23024 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 CBAI>w delta 17241 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 diff --git a/pkgdown/assets/gt-latex.tex b/pkgdown/assets/gt-latex.tex index e274ee8b0d..0ba6588858 100644 --- a/pkgdown/assets/gt-latex.tex +++ b/pkgdown/assets/gt-latex.tex @@ -202,7 +202,7 @@ \title{LaTeX Quarto test} \author{} -\date{2024-07-19} +\date{2024-08-14} \begin{document} \maketitle @@ -284,6 +284,62 @@ \end{table}% +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{tab }\OtherTok{\textless{}{-}}\NormalTok{ exibble }\SpecialCharTok{\%\textgreater{}\%} + \FunctionTok{gt}\NormalTok{(}\AttributeTok{rowname\_col =} \StringTok{"row"}\NormalTok{, }\AttributeTok{groupname\_col =} \StringTok{"group"}\NormalTok{, }\AttributeTok{row\_group\_as\_column =} \ConstantTok{TRUE}\NormalTok{) }\SpecialCharTok{|\textgreater{}} + \FunctionTok{tab\_spanner}\NormalTok{(}\StringTok{"spanners"}\NormalTok{, }\FunctionTok{c}\NormalTok{(char, num)) }\SpecialCharTok{\%\textgreater{}\%} + \FunctionTok{tab\_spanner}\NormalTok{(}\StringTok{"Second level spanners"}\NormalTok{, }\FunctionTok{c}\NormalTok{(char, num, fctr)) }\SpecialCharTok{\%\textgreater{}\%} + \FunctionTok{tab\_stubhead}\NormalTok{(}\StringTok{"Stubhead label"}\NormalTok{) }\SpecialCharTok{\%\textgreater{}\%} + \FunctionTok{tab\_style}\NormalTok{(} + \AttributeTok{style =} \FunctionTok{list}\NormalTok{(}\FunctionTok{cell\_fill}\NormalTok{(}\StringTok{"\#f0f0f0"}\NormalTok{), }\FunctionTok{cell\_text}\NormalTok{(}\AttributeTok{weight =} \StringTok{"bold"}\NormalTok{)),} + \FunctionTok{cells\_stubhead}\NormalTok{()} +\NormalTok{ ) }\SpecialCharTok{\%\textgreater{}\%} + \FunctionTok{tab\_header}\NormalTok{(}\AttributeTok{title =} \StringTok{"Stubhead styling and multiple spanner levels"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{table} + +\centering{ + +\caption*{ +{\large Stubhead styling and multiple spanner levels} +} +\fontsize{12.0pt}{14.4pt}\selectfont +\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}l|l|lrcrrrr} +\toprule +\multicolumn{2}{l}{} & \multicolumn{3}{c}{Second level spanners} & & & & \\ +\cmidrule(lr){3-5} +\multicolumn{2}{l}{} & \multicolumn{2}{c}{spanners} & & & & & \\ +\cmidrule(lr){3-4} +\multicolumn{2}{c}{{\bfseries \cellcolor[HTML]{F0F0F0}{Stubhead label}}} & char & num & fctr & date & time & datetime & currency \\ +\midrule\addlinespace[2.5pt] +\multirow{4}{*}{grp\_a} & row\_1 & apricot & 1.111e-01 & one & 2015-01-15 & 13:35 & 2018-01-01 02:22 & 49.950 \\ + & row\_2 & banana & 2.222e+00 & two & 2015-02-15 & 14:40 & 2018-02-02 14:33 & 17.950 \\ + & row\_3 & coconut & 3.333e+01 & three & 2015-03-15 & 15:45 & 2018-03-03 03:44 & 1.390 \\ + & row\_4 & durian & 4.444e+02 & four & 2015-04-15 & 16:50 & 2018-04-04 15:55 & 65100.000 \\ +\midrule\addlinespace[2.5pt] +\multirow{4}{*}{grp\_b} & row\_5 & NA & 5.550e+03 & five & 2015-05-15 & 17:55 & 2018-05-05 04:00 & 1325.810 \\ + & row\_6 & fig & NA & six & 2015-06-15 & NA & 2018-06-06 16:11 & 13.255 \\ + & row\_7 & grapefruit & 7.770e+05 & seven & NA & 19:10 & 2018-07-07 05:22 & NA \\ + & row\_8 & honeydew & 8.880e+06 & eight & 2015-08-15 & 20:20 & NA & 0.440 \\ +\bottomrule +\end{tabular*} + +} + +\caption{\label{tbl-spanner-stub}Stubhead styling and multiple spanner +levels} + +\end{table}% + +\begin{Shaded} +\begin{Highlighting}[] +\CommentTok{\# }\AlertTok{FIXME}\CommentTok{ Borders known not to be exact} +\end{Highlighting} +\end{Shaded} + \begin{Shaded} \begin{Highlighting}[] \NormalTok{tab }\OtherTok{\textless{}{-}}\NormalTok{ pizzaplace }\SpecialCharTok{\%\textgreater{}\%} diff --git a/scripts/visual-tests-latex.R b/scripts/visual-tests-latex.R index 79fbe77162..99cdaa60e1 100644 --- a/scripts/visual-tests-latex.R +++ b/scripts/visual-tests-latex.R @@ -58,8 +58,8 @@ header_latex <- c( if (length(table_titles) != n_chunks) { cli::cli_abort(c( - "The structure is not respected. We have {n_chunks} examples, but {length(table_titles)}.", - "Each table should be labelled with #| label: and have a tab_header(title = \"\") title" + "The structure is not respected. We have {n_chunks} examples, but {length(table_titles)} actually detected.", + i = "Each table should be labelled with #| label: and have a tab_header(title = \"\") title" )) } diff --git a/vignettes/gt-visual.qmd b/vignettes/gt-visual.qmd index a855c14186..943a424ac6 100644 --- a/vignettes/gt-visual.qmd +++ b/vignettes/gt-visual.qmd @@ -50,7 +50,45 @@ tab <- exibble |> ) |> tab_spanner(c(num, char), label = "A spanner") |> tab_header(title = "background color") +``` + +::: panel-tabset +### html +```{r} +#| echo: false +tab +``` + +### interactive + +```{r} +#| echo: false +opt_interactive(tab) +``` + +### plot + +```{r} +#| echo: false +plot(tab) +``` +::: + +## Spanner and Stubhead {#sec-spanners-stub} + +```{r} +#| label: spanner-stub +tab <- exibble %>% + gt(rowname_col = "row", groupname_col = "group", row_group_as_column = TRUE) |> + tab_spanner("spanners", c(char, num)) %>% + tab_spanner("Second level spanners", c(char, num, fctr)) %>% + tab_stubhead("Stubhead label") %>% + tab_style( + style = list(cell_fill("#f0f0f0"), cell_text(weight = "bold")), + cells_stubhead() + ) %>% + tab_header(title = "Stubhead styling and multiple spanner levels") ``` ::: panel-tabset @@ -59,19 +97,22 @@ tab <- exibble |> ```{r} #| echo: false tab +# FIXME #1827 ``` ### interactive ```{r} #| echo: false +#| warning: false opt_interactive(tab) +# FIXME Borders known not to be exact ``` ### plot ```{r} -#| echo: false +#| echo: false plot(tab) ``` ::: @@ -141,7 +182,7 @@ opt_interactive(tab) ### plot ```{r} -#| echo: false +#| echo: false plot(tab) ``` :::