GroupedList {shiny.fluent} | R Documentation |
GroupedList
Description
A grouped list (GroupedList
) allows you to render a set of items as multiple lists with various grouping properties.
For more details and examples visit the official docs. The R package cannot handle each and every case, so for advanced use cases you need to work using the original docs to achieve the desired result.
Usage
GroupedList(...)
GroupHeader(...)
Arguments
... |
Props to pass to the component. The allowed props are listed below in the Details section. |
Details
-
className
string
Custom className -
compact
boolean
Boolean value to indicate if the component should render in compact mode. Set to false by default -
componentRef
IRefObject<{}>
-
expandButtonProps
React.HTMLAttributes<HTMLButtonElement>
Props for expand/collapse button -
footerText
string
Text to display for the group footer. -
group
IGroup
The group to be rendered by the header. -
groupIndex
number
The index of the group. -
groupLevel
number
The indent level of the group. -
groups
IGroup[]
Stores parent group's children. -
indentWidth
number
Width corresponding to a single level. This is multiplied by the groupLevel to get the full spacer width for the group. -
isCollapsedGroupSelectVisible
boolean
Determines if the group selection check box is shown for collapsed groups. -
isGroupLoading
(group: IGroup) => boolean
Callback to determine if a group has missing items and needs to load them from the server. -
isSelected
boolean
Deprecated at v.65.1 and will be removed by v 1.0. Useselected
instead. -
loadingText
string
Text shown on group headers to indicate the group is being loaded. -
onGroupHeaderClick
(group: IGroup) => void
Callback for when the group header is clicked. -
onRenderTitle
IRenderFunction<IGroupHeaderProps>
Override which allows the caller to provider a custom renderer for the GroupHeader title. -
onToggleCollapse
(group: IGroup) => void
Callback for when the group is expanded or collapsed. -
onToggleSelectGroup
(group: IGroup) => void
Callback for when the group is selected. -
onToggleSummarize
(group: IGroup) => void
Callback for when the group "Show All" link is clicked -
selected
boolean
If all items in the group are selected. -
selectionMode
SelectionMode
The selection mode of the list the group lives within. -
showAllLinkText
string
Text to display for the group "Show All" link. -
theme
ITheme
Theme provided by the Higher Order Component -
viewport
IViewport
A reference to the viewport in which the header is rendered. -
className
string
Optional class name to add to the root element. -
compact
boolean
Boolean value to indicate if the component should render in compact mode. Set to false by default -
componentRef
IRefObject<IGroupedList>
Optional callback to access the IGroupedList interface. Use this instead of ref for accessing the public methods and properties of the component. -
dragDropEvents
IDragDropEvents
Map of callback functions related to drag and drop functionality. -
dragDropHelper
IDragDropHelper
helper to manage drag/drop across item and groups -
eventsToRegister
{ eventName: string; callback: (context: IDragDropContext, event?: any) => void; }[]
Event names and corresponding callbacks that will be registered to groups and rendered elements -
focusZoneProps
IFocusZoneProps
Optional properties to pass through to the FocusZone. -
getGroupHeight
(group: IGroup, groupIndex: number) => number
Optional function to override default group height calculation used by list virtualization. -
groupProps
IGroupRenderProps
Optional override properties to render groups. -
groups
IGroup[]
Optional grouping instructions. -
items
any[]
List of items to render. -
listProps
IListProps
Optional properties to pass through to the list components being rendered. -
onGroupExpandStateChanged
(isSomeGroupExpanded: boolean) => void
Optional callback when the group expand state changes between all collapsed and at least one group is expanded. -
onRenderCell
(nestingDepth?: number, item?: any, index?: number) => React.ReactNode
Rendering callback to render the group items. -
onShouldVirtualize
(props: IListProps) => boolean
Optional callback to determine whether the list should be rendered in full, or virtualized. Virtualization will add and remove pages of items as the user scrolls them into the visible range. This benefits larger list scenarios by reducing the DOM on the screen, but can negatively affect performance for smaller lists. The default implementation will virtualize when this callback is not provided. -
selection
ISelection
Optional selection model to track selection state. -
selectionMode
SelectionMode
Controls how/if the list manages selection. -
styles
IStyleFunctionOrObject<IGroupedListStyleProps, IGroupedListStyles>
Style function to be passed in to override the themed or default styles -
theme
ITheme
Theme that is passed in from Higher Order Component -
usePageCache
boolean
boolean to control if pages containing unchanged items should be cached, this is a perf optimization The same property in List.Props -
viewport
IViewport
Optional Viewport, provided by the parent component. -
styles
IStyleFunctionOrObject<IGroupFooterStyleProps, IGroupFooterStyles>
Style function to be passed in to override the themed or default styles -
checked
boolean
-
theme
ITheme
-
ariaPosInSet
number
Defines an element's number or position in the current set of listitems or treeitems -
ariaSetSize
number
Defines the number of items in the current set of listitems or treeitems -
expandButtonIcon
string
Defines the name of a custom icon to be used for group headers. If not set, the default icon will be used -
expandButtonProps
React.HTMLAttributes<HTMLButtonElement>
Native props for the GroupHeader expand and collapse button -
groupedListId
string
GroupedList id for aria-controls -
onRenderGroupHeaderCheckbox
IRenderFunction<IGroupHeaderCheckboxProps>
If provided, can be used to render a custom checkbox -
selectAllButtonProps
React.HTMLAttributes<HTMLButtonElement>
Native props for the GroupHeader select all button -
styles
IStyleFunctionOrObject<IGroupHeaderStyleProps, IGroupHeaderStyles>
Style function to be passed in to override the themed or default styles -
useFastIcons
boolean
Whether to use fast icon and check components. The icons can't be targeted by customization but are still customizable via class names. -
collapseAllVisibility
CollapseAllVisibility
Flag to indicate whether to ignore the collapsing icon on header. -
footerProps
IGroupFooterProps
Information to pass in to the group footer. -
getGroupItemLimit
(group: IGroup) => number
Grouping item limit. -
headerProps
IGroupHeaderProps
Information to pass in to the group header. -
isAllGroupsCollapsed
boolean
Boolean indicating if all groups are in collapsed state. -
onRenderFooter
IRenderFunction<IGroupFooterProps>
Override which allows the caller to provide a custom footer. -
onRenderHeader
IRenderFunction<IGroupHeaderProps>
Override which allows the caller to provide a custom header. -
onRenderShowAll
IRenderFunction<IGroupShowAllProps>
Override which allows the caller to provide a custom Show All link. -
onToggleCollapseAll
(isAllCollapsed: boolean) => void
Callback for when all groups are expanded or collapsed. -
role
string
Override which allows the caller to provide a custom aria role -
showAllProps
IGroupShowAllProps
Information to pass in to the group Show all footer. -
showEmptyGroups
boolean
Boolean indicating if empty groups are shown -
showAllLinkText
string
The Show All link text. -
styles
IStyleFunctionOrObject<IGroupShowAllStyleProps, IGroupShowAllStyles>
Style function to be passed in to override the themed or default styles -
count
number
Count of spacer(s) -
indentWidth
number
How much to indent -
styles
IStyleFunctionOrObject<IGroupSpacerStyleProps, IGroupSpacerStyles>
Style function to be passed in to override the themed or default styles -
theme
ITheme
Theme from Higher Order Component
Value
Object with shiny.tag
class suitable for use in the UI of a Shiny app.
Best practices
FAQ
My List is not re-rendering when I mutate its items. What should I do?
To determine if the list within the grouped list should re-render its contents, the component performs a referential equality check within its shouldComponentUpdate
method.
This is done to minimize the performance overhead associating with re-rendering the virtualized List pages, as recommended by the React documentation.
As a result of this implementation, the inner list will not determine it should re-render if the array values are mutated.
To avoid this problem, we recommend re-creating the items array backing the grouped list by using a method such as Array.prototype.concat
or ES6 spread syntax shown below:
public appendItems(): void { const { items } = this.state; this.setState({ items: [...items, ...['Foo', 'Bar']] }) } public render(): JSX.Element { const { items } = this.state; return <GroupedList items={items} />; }
By re-creating the items array without mutating the values, the inner List will correctly determine its contents have changed and then it should re-render with the new values.
Examples
# Example 1
library(shiny)
library(shiny.fluent)
ui <- function(id) {
ns <- NS(id)
GroupedList(
items = list("Item A", "Item B", "Item C", "Item D", "Item E"),
groups = list(
list(key = "g1", name = "Some items", startIndex = 0, count = 2),
list(key = "g2", name = "More items", startIndex = 2, count = 3)
),
selectionMode = 0,
onRenderCell = JS("(depth, item) => (
jsmodule['react'].createElement('span', { style: { paddingLeft: 49 } }, item)
)")
)
}
server <- function(id) {
moduleServer(id, function(input, output, session) {})
}
if (interactive()) {
shinyApp(ui("app"), function(input, output) server("app"))
}
# Example 2
library(shiny)
library(shiny.fluent)
ui <- function(id) {
fluentPage(
GroupedList(
items = list("Item A", "Item B", "Item C", "Item D", "Item E"),
groups = list(
list(key = "g1", name = "Some items", startIndex = 0, count = 2),
list(key = "g2", name = "More items", startIndex = 2, count = 3)
),
selectionMode = 0,
onRenderCell = JS(
"(depth, item) => (
jsmodule['react'].createElement('span', { style: { paddingLeft: 50 } }, item)
)"
),
groupProps = list(
onRenderHeader = JS(
"(props) => (
jsmodule['react'].createElement(
jsmodule['@fluentui/react'].GroupHeader,
{ ...props, styles: { headerCount: { display: 'none' } } },
props
)
)"
)
)
)
)
}
server <- function(id) {
moduleServer(id, function(input, output, session) {})
}
if (interactive()) {
shinyApp(ui("app"), function(input, output) server("app"))
}