@primereact/mcp 11.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +45 -0
- package/README.md +94 -0
- package/data/llms/headless/add-ons/introduction.md +16 -0
- package/data/llms/headless/components/accordion/api.json +252 -0
- package/data/llms/headless/components/accordion.md +196 -0
- package/data/llms/headless/components/animateonscroll/api.json +88 -0
- package/data/llms/headless/components/animateonscroll.md +141 -0
- package/data/llms/headless/components/autocomplete/api.json +787 -0
- package/data/llms/headless/components/autocomplete.md +249 -0
- package/data/llms/headless/components/avatar/api.json +154 -0
- package/data/llms/headless/components/avatar.md +149 -0
- package/data/llms/headless/components/badge/api.json +68 -0
- package/data/llms/headless/components/badge.md +150 -0
- package/data/llms/headless/components/breadcrumb/api.json +142 -0
- package/data/llms/headless/components/breadcrumb.md +149 -0
- package/data/llms/headless/components/button/api.json +62 -0
- package/data/llms/headless/components/button.md +73 -0
- package/data/llms/headless/components/card/api.json +36 -0
- package/data/llms/headless/components/card.md +96 -0
- package/data/llms/headless/components/carousel/api.json +793 -0
- package/data/llms/headless/components/carousel.md +196 -0
- package/data/llms/headless/components/checkbox/api.json +593 -0
- package/data/llms/headless/components/checkbox.md +184 -0
- package/data/llms/headless/components/chip/api.json +107 -0
- package/data/llms/headless/components/chip.md +141 -0
- package/data/llms/headless/components/collapsible/api.json +301 -0
- package/data/llms/headless/components/collapsible.md +136 -0
- package/data/llms/headless/components/compare/api.json +533 -0
- package/data/llms/headless/components/compare.md +142 -0
- package/data/llms/headless/components/contextmenu/api.json +495 -0
- package/data/llms/headless/components/contextmenu.md +282 -0
- package/data/llms/headless/components/datatable/api.json +1680 -0
- package/data/llms/headless/components/datatable.md +258 -0
- package/data/llms/headless/components/dataview/api.json +199 -0
- package/data/llms/headless/components/dataview.md +147 -0
- package/data/llms/headless/components/datepicker/api.json +2796 -0
- package/data/llms/headless/components/datepicker.md +456 -0
- package/data/llms/headless/components/dialog/api.json +626 -0
- package/data/llms/headless/components/dialog.md +280 -0
- package/data/llms/headless/components/divider/api.json +130 -0
- package/data/llms/headless/components/divider.md +92 -0
- package/data/llms/headless/components/drawer/api.json +425 -0
- package/data/llms/headless/components/drawer.md +220 -0
- package/data/llms/headless/components/fieldset/api.json +195 -0
- package/data/llms/headless/components/fieldset.md +154 -0
- package/data/llms/headless/components/fileupload/api.json +905 -0
- package/data/llms/headless/components/fileupload.md +323 -0
- package/data/llms/headless/components/floatlabel/api.json +36 -0
- package/data/llms/headless/components/floatlabel.md +19 -0
- package/data/llms/headless/components/fluid/api.json +36 -0
- package/data/llms/headless/components/fluid.md +19 -0
- package/data/llms/headless/components/focustrap/api.json +135 -0
- package/data/llms/headless/components/focustrap.md +125 -0
- package/data/llms/headless/components/gallery/api.json +1349 -0
- package/data/llms/headless/components/gallery.md +355 -0
- package/data/llms/headless/components/iconfield/api.json +62 -0
- package/data/llms/headless/components/iconfield.md +19 -0
- package/data/llms/headless/components/iftalabel/api.json +62 -0
- package/data/llms/headless/components/iftalabel.md +19 -0
- package/data/llms/headless/components/inplace/api.json +340 -0
- package/data/llms/headless/components/inplace.md +153 -0
- package/data/llms/headless/components/inputcolor/api.json +469 -0
- package/data/llms/headless/components/inputcolor.md +253 -0
- package/data/llms/headless/components/inputgroup/api.json +62 -0
- package/data/llms/headless/components/inputgroup.md +19 -0
- package/data/llms/headless/components/inputnumber/api.json +554 -0
- package/data/llms/headless/components/inputnumber.md +167 -0
- package/data/llms/headless/components/inputotp/api.json +276 -0
- package/data/llms/headless/components/inputotp.md +130 -0
- package/data/llms/headless/components/inputpassword/api.json +180 -0
- package/data/llms/headless/components/inputpassword.md +117 -0
- package/data/llms/headless/components/inputtags/api.json +497 -0
- package/data/llms/headless/components/inputtags.md +298 -0
- package/data/llms/headless/components/inputtext/api.json +81 -0
- package/data/llms/headless/components/inputtext.md +109 -0
- package/data/llms/headless/components/knob/api.json +429 -0
- package/data/llms/headless/components/knob.md +151 -0
- package/data/llms/headless/components/label/api.json +62 -0
- package/data/llms/headless/components/label.md +19 -0
- package/data/llms/headless/components/listbox/api.json +814 -0
- package/data/llms/headless/components/listbox.md +194 -0
- package/data/llms/headless/components/menu/api.json +1247 -0
- package/data/llms/headless/components/menu.md +283 -0
- package/data/llms/headless/components/message/api.json +131 -0
- package/data/llms/headless/components/message.md +143 -0
- package/data/llms/headless/components/metergroup/api.json +266 -0
- package/data/llms/headless/components/metergroup.md +129 -0
- package/data/llms/headless/components/motion/api.json +237 -0
- package/data/llms/headless/components/motion.md +160 -0
- package/data/llms/headless/components/navigationmenu/api.json +220 -0
- package/data/llms/headless/components/navigationmenu.md +166 -0
- package/data/llms/headless/components/orderlist/api.json +196 -0
- package/data/llms/headless/components/orderlist.md +221 -0
- package/data/llms/headless/components/organizationchart/api.json +372 -0
- package/data/llms/headless/components/organizationchart.md +254 -0
- package/data/llms/headless/components/paginator/api.json +311 -0
- package/data/llms/headless/components/paginator.md +187 -0
- package/data/llms/headless/components/panel/api.json +195 -0
- package/data/llms/headless/components/panel.md +150 -0
- package/data/llms/headless/components/picklist/api.json +293 -0
- package/data/llms/headless/components/picklist.md +270 -0
- package/data/llms/headless/components/popover/api.json +405 -0
- package/data/llms/headless/components/popover.md +301 -0
- package/data/llms/headless/components/portal/api.json +56 -0
- package/data/llms/headless/components/portal.md +102 -0
- package/data/llms/headless/components/positioner/api.json +165 -0
- package/data/llms/headless/components/positioner.md +181 -0
- package/data/llms/headless/components/progressbar/api.json +87 -0
- package/data/llms/headless/components/progressbar.md +122 -0
- package/data/llms/headless/components/progressspinner/api.json +337 -0
- package/data/llms/headless/components/progressspinner.md +128 -0
- package/data/llms/headless/components/radiobutton/api.json +569 -0
- package/data/llms/headless/components/radiobutton.md +195 -0
- package/data/llms/headless/components/rating/api.json +347 -0
- package/data/llms/headless/components/rating.md +181 -0
- package/data/llms/headless/components/scrollarea/api.json +730 -0
- package/data/llms/headless/components/scrollarea.md +232 -0
- package/data/llms/headless/components/select/api.json +829 -0
- package/data/llms/headless/components/select.md +262 -0
- package/data/llms/headless/components/sidebar/api.json +433 -0
- package/data/llms/headless/components/sidebar.md +266 -0
- package/data/llms/headless/components/skeleton/api.json +68 -0
- package/data/llms/headless/components/skeleton.md +95 -0
- package/data/llms/headless/components/slider/api.json +559 -0
- package/data/llms/headless/components/slider.md +158 -0
- package/data/llms/headless/components/speeddial/api.json +459 -0
- package/data/llms/headless/components/speeddial.md +181 -0
- package/data/llms/headless/components/splitter/api.json +582 -0
- package/data/llms/headless/components/splitter.md +159 -0
- package/data/llms/headless/components/stepper/api.json +385 -0
- package/data/llms/headless/components/stepper.md +183 -0
- package/data/llms/headless/components/styleclass/api.json +134 -0
- package/data/llms/headless/components/styleclass.md +129 -0
- package/data/llms/headless/components/tabs/api.json +336 -0
- package/data/llms/headless/components/tabs.md +158 -0
- package/data/llms/headless/components/tag/api.json +62 -0
- package/data/llms/headless/components/tag.md +121 -0
- package/data/llms/headless/components/terminal/api.json +117 -0
- package/data/llms/headless/components/terminal.md +183 -0
- package/data/llms/headless/components/textarea/api.json +81 -0
- package/data/llms/headless/components/textarea.md +110 -0
- package/data/llms/headless/components/timeline/api.json +270 -0
- package/data/llms/headless/components/timeline.md +117 -0
- package/data/llms/headless/components/toast/api.json +455 -0
- package/data/llms/headless/components/toast.md +277 -0
- package/data/llms/headless/components/togglebutton/api.json +357 -0
- package/data/llms/headless/components/togglebutton.md +183 -0
- package/data/llms/headless/components/toggleswitch/api.json +326 -0
- package/data/llms/headless/components/toggleswitch.md +164 -0
- package/data/llms/headless/components/toolbar/api.json +68 -0
- package/data/llms/headless/components/toolbar.md +96 -0
- package/data/llms/headless/components/tooltip/api.json +478 -0
- package/data/llms/headless/components/tooltip.md +233 -0
- package/data/llms/headless/components/tree/api.json +1297 -0
- package/data/llms/headless/components/tree.md +297 -0
- package/data/llms/headless/components/treetable/api.json +1680 -0
- package/data/llms/headless/components/treetable.md +177 -0
- package/data/llms/headless/guides/ai/llms.md +25 -0
- package/data/llms/headless/guides/installation.md +126 -0
- package/data/llms/headless/guides/introduction.md +20 -0
- package/data/llms/headless/guides/misc/accessibility.md +228 -0
- package/data/llms/headless/llms.md +25 -0
- package/data/llms/headless/resources/introduction.md +15 -0
- package/data/llms/hooks/gettingstarted/introduction.md +34 -0
- package/data/llms/hooks/gettingstarted/setup.md +54 -0
- package/data/llms/hooks/use-attr-selector.md +25 -0
- package/data/llms/hooks/use-controlled-state.md +31 -0
- package/data/llms/hooks/use-event-listener.md +37 -0
- package/data/llms/hooks/use-filter.md +312 -0
- package/data/llms/hooks/use-hot-key.md +40 -0
- package/data/llms/hooks/use-id.md +24 -0
- package/data/llms/hooks/use-intersection-observer.md +42 -0
- package/data/llms/hooks/use-is-mobile.md +24 -0
- package/data/llms/hooks/use-key-filter.md +139 -0
- package/data/llms/hooks/use-local-storage.md +28 -0
- package/data/llms/hooks/use-mask.md +53 -0
- package/data/llms/hooks/use-match-media.md +28 -0
- package/data/llms/hooks/use-mount-effect.md +25 -0
- package/data/llms/hooks/use-mounted.md +36 -0
- package/data/llms/hooks/use-number-formatter.md +48 -0
- package/data/llms/hooks/use-presence.md +44 -0
- package/data/llms/hooks/use-previous.md +28 -0
- package/data/llms/hooks/use-props.md +37 -0
- package/data/llms/hooks/use-queue-task.md +29 -0
- package/data/llms/hooks/use-scrolltop.md +87 -0
- package/data/llms/hooks/use-sortable-list.md +226 -0
- package/data/llms/hooks/use-tree-filter.md +216 -0
- package/data/llms/hooks/use-unmount-effect.md +23 -0
- package/data/llms/hooks/use-update-effect.md +27 -0
- package/data/llms/hooks/use-view-transition.md +31 -0
- package/data/llms/hooks/use-visibility-change.md +30 -0
- package/data/llms/llms-full.txt +125291 -0
- package/data/llms/llms.txt +379 -0
- package/data/llms/manifest.json +12409 -0
- package/data/llms/mcp-data.json +14481 -0
- package/data/llms/primitive/add-ons/introduction.md +16 -0
- package/data/llms/primitive/components/accordion/api.json +1411 -0
- package/data/llms/primitive/components/accordion.md +231 -0
- package/data/llms/primitive/components/animateonscroll/api.json +193 -0
- package/data/llms/primitive/components/animateonscroll.md +91 -0
- package/data/llms/primitive/components/autocomplete/api.json +3167 -0
- package/data/llms/primitive/components/autocomplete.md +344 -0
- package/data/llms/primitive/components/avatar/api.json +703 -0
- package/data/llms/primitive/components/avatar.md +134 -0
- package/data/llms/primitive/components/badge/api.json +363 -0
- package/data/llms/primitive/components/badge.md +118 -0
- package/data/llms/primitive/components/breadcrumb/api.json +1162 -0
- package/data/llms/primitive/components/breadcrumb.md +196 -0
- package/data/llms/primitive/components/button/api.json +246 -0
- package/data/llms/primitive/components/button.md +114 -0
- package/data/llms/primitive/components/buttongroup/api.json +168 -0
- package/data/llms/primitive/components/buttongroup.md +43 -0
- package/data/llms/primitive/components/card/api.json +1252 -0
- package/data/llms/primitive/components/card.md +159 -0
- package/data/llms/primitive/components/carousel/api.json +1374 -0
- package/data/llms/primitive/components/carousel.md +220 -0
- package/data/llms/primitive/components/checkbox/api.json +697 -0
- package/data/llms/primitive/components/checkbox.md +160 -0
- package/data/llms/primitive/components/checkboxgroup/api.json +252 -0
- package/data/llms/primitive/components/checkboxgroup.md +58 -0
- package/data/llms/primitive/components/chip/api.json +853 -0
- package/data/llms/primitive/components/chip.md +135 -0
- package/data/llms/primitive/components/collapsible/api.json +581 -0
- package/data/llms/primitive/components/collapsible.md +133 -0
- package/data/llms/primitive/components/compare/api.json +909 -0
- package/data/llms/primitive/components/compare.md +156 -0
- package/data/llms/primitive/components/contextmenu/api.json +3454 -0
- package/data/llms/primitive/components/contextmenu.md +483 -0
- package/data/llms/primitive/components/datatable/api.json +7832 -0
- package/data/llms/primitive/components/datatable.md +561 -0
- package/data/llms/primitive/components/dataview/api.json +819 -0
- package/data/llms/primitive/components/dataview.md +163 -0
- package/data/llms/primitive/components/datepicker/api.json +9055 -0
- package/data/llms/primitive/components/datepicker.md +760 -0
- package/data/llms/primitive/components/dialog/api.json +2491 -0
- package/data/llms/primitive/components/dialog.md +276 -0
- package/data/llms/primitive/components/divider/api.json +214 -0
- package/data/llms/primitive/components/divider.md +96 -0
- package/data/llms/primitive/components/drawer/api.json +1879 -0
- package/data/llms/primitive/components/drawer.md +220 -0
- package/data/llms/primitive/components/fieldset/api.json +1116 -0
- package/data/llms/primitive/components/fieldset.md +183 -0
- package/data/llms/primitive/components/fileupload/api.json +2445 -0
- package/data/llms/primitive/components/fileupload.md +282 -0
- package/data/llms/primitive/components/floatlabel/api.json +176 -0
- package/data/llms/primitive/components/floatlabel.md +47 -0
- package/data/llms/primitive/components/focustrap/api.json +241 -0
- package/data/llms/primitive/components/focustrap.md +93 -0
- package/data/llms/primitive/components/gallery/api.json +3622 -0
- package/data/llms/primitive/components/gallery.md +387 -0
- package/data/llms/primitive/components/iconfield/api.json +322 -0
- package/data/llms/primitive/components/iconfield.md +53 -0
- package/data/llms/primitive/components/iftalabel/api.json +177 -0
- package/data/llms/primitive/components/iftalabel.md +47 -0
- package/data/llms/primitive/components/inplace/api.json +783 -0
- package/data/llms/primitive/components/inplace.md +141 -0
- package/data/llms/primitive/components/inputcolor/api.json +2211 -0
- package/data/llms/primitive/components/inputcolor.md +295 -0
- package/data/llms/primitive/components/inputnumber/api.json +469 -0
- package/data/llms/primitive/components/inputnumber.md +99 -0
- package/data/llms/primitive/components/inputotp/api.json +469 -0
- package/data/llms/primitive/components/inputotp.md +121 -0
- package/data/llms/primitive/components/inputpassword/api.json +278 -0
- package/data/llms/primitive/components/inputpassword.md +84 -0
- package/data/llms/primitive/components/inputtags/api.json +407 -0
- package/data/llms/primitive/components/inputtags.md +243 -0
- package/data/llms/primitive/components/inputtext/api.json +207 -0
- package/data/llms/primitive/components/inputtext.md +81 -0
- package/data/llms/primitive/components/knob/api.json +841 -0
- package/data/llms/primitive/components/knob.md +148 -0
- package/data/llms/primitive/components/label/api.json +177 -0
- package/data/llms/primitive/components/label.md +44 -0
- package/data/llms/primitive/components/listbox/api.json +1741 -0
- package/data/llms/primitive/components/listbox.md +206 -0
- package/data/llms/primitive/components/menu/api.json +3836 -0
- package/data/llms/primitive/components/menu.md +479 -0
- package/data/llms/primitive/components/message/api.json +863 -0
- package/data/llms/primitive/components/message.md +151 -0
- package/data/llms/primitive/components/metergroup/api.json +1222 -0
- package/data/llms/primitive/components/metergroup.md +209 -0
- package/data/llms/primitive/components/motion.md +112 -0
- package/data/llms/primitive/components/navigationmenu/api.json +298 -0
- package/data/llms/primitive/components/navigationmenu.md +184 -0
- package/data/llms/primitive/components/organizationchart.md +133 -0
- package/data/llms/primitive/components/paginator/api.json +1637 -0
- package/data/llms/primitive/components/paginator.md +223 -0
- package/data/llms/primitive/components/panel/api.json +1270 -0
- package/data/llms/primitive/components/panel.md +186 -0
- package/data/llms/primitive/components/popover/api.json +2281 -0
- package/data/llms/primitive/components/popover.md +277 -0
- package/data/llms/primitive/components/portal/api.json +176 -0
- package/data/llms/primitive/components/portal.md +79 -0
- package/data/llms/primitive/components/progressbar/api.json +857 -0
- package/data/llms/primitive/components/progressbar.md +153 -0
- package/data/llms/primitive/components/progressspinner/api.json +725 -0
- package/data/llms/primitive/components/progressspinner.md +133 -0
- package/data/llms/primitive/components/radiobutton/api.json +929 -0
- package/data/llms/primitive/components/radiobutton.md +201 -0
- package/data/llms/primitive/components/rating/api.json +878 -0
- package/data/llms/primitive/components/rating.md +160 -0
- package/data/llms/primitive/components/scrollarea/api.json +1187 -0
- package/data/llms/primitive/components/scrollarea.md +255 -0
- package/data/llms/primitive/components/select/api.json +3167 -0
- package/data/llms/primitive/components/select.md +351 -0
- package/data/llms/primitive/components/sidebar/api.json +3699 -0
- package/data/llms/primitive/components/sidebar.md +444 -0
- package/data/llms/primitive/components/skeleton/api.json +213 -0
- package/data/llms/primitive/components/skeleton.md +80 -0
- package/data/llms/primitive/components/slider/api.json +1066 -0
- package/data/llms/primitive/components/slider.md +161 -0
- package/data/llms/primitive/components/speeddial/api.json +1002 -0
- package/data/llms/primitive/components/speeddial.md +197 -0
- package/data/llms/primitive/components/splitter/api.json +901 -0
- package/data/llms/primitive/components/splitter.md +137 -0
- package/data/llms/primitive/components/stepper/api.json +2102 -0
- package/data/llms/primitive/components/stepper.md +253 -0
- package/data/llms/primitive/components/styleclass.md +399 -0
- package/data/llms/primitive/components/tabs/api.json +1705 -0
- package/data/llms/primitive/components/tabs.md +200 -0
- package/data/llms/primitive/components/tag/api.json +189 -0
- package/data/llms/primitive/components/tag.md +100 -0
- package/data/llms/primitive/components/terminal/api.json +1709 -0
- package/data/llms/primitive/components/terminal.md +227 -0
- package/data/llms/primitive/components/textarea/api.json +213 -0
- package/data/llms/primitive/components/textarea.md +83 -0
- package/data/llms/primitive/components/timeline/api.json +1180 -0
- package/data/llms/primitive/components/timeline.md +185 -0
- package/data/llms/primitive/components/toast/api.json +2102 -0
- package/data/llms/primitive/components/toast.md +291 -0
- package/data/llms/primitive/components/togglebutton/api.json +433 -0
- package/data/llms/primitive/components/togglebutton.md +161 -0
- package/data/llms/primitive/components/togglebuttongroup/api.json +276 -0
- package/data/llms/primitive/components/togglebuttongroup.md +61 -0
- package/data/llms/primitive/components/toggleswitch/api.json +681 -0
- package/data/llms/primitive/components/toggleswitch.md +149 -0
- package/data/llms/primitive/components/toolbar/api.json +646 -0
- package/data/llms/primitive/components/toolbar.md +126 -0
- package/data/llms/primitive/components/tooltip/api.json +1534 -0
- package/data/llms/primitive/components/tooltip.md +202 -0
- package/data/llms/primitive/components/tree/api.json +2952 -0
- package/data/llms/primitive/components/tree.md +292 -0
- package/data/llms/primitive/components/treetable.md +187 -0
- package/data/llms/primitive/components/visuallyhidden/api.json +186 -0
- package/data/llms/primitive/components/visuallyhidden.md +87 -0
- package/data/llms/primitive/guides/ai/llms.md +25 -0
- package/data/llms/primitive/guides/icons/customicons.md +47 -0
- package/data/llms/primitive/guides/icons/primeicons.md +112 -0
- package/data/llms/primitive/guides/installation.md +115 -0
- package/data/llms/primitive/guides/introduction.md +20 -0
- package/data/llms/primitive/guides/misc/accessibility.md +215 -0
- package/data/llms/primitive/guides/misc/passthrough.md +95 -0
- package/data/llms/primitive/guides/misc/rtl.md +27 -0
- package/data/llms/primitive/llms.md +25 -0
- package/data/llms/primitive/resources/introduction.md +15 -0
- package/data/llms/styled/add-ons/introduction.md +16 -0
- package/data/llms/styled/components/accordion.md +735 -0
- package/data/llms/styled/components/animateonscroll.md +264 -0
- package/data/llms/styled/components/autocomplete.md +1597 -0
- package/data/llms/styled/components/avatar.md +313 -0
- package/data/llms/styled/components/badge.md +213 -0
- package/data/llms/styled/components/breadcrumb.md +461 -0
- package/data/llms/styled/components/button/api.json +246 -0
- package/data/llms/styled/components/button.md +641 -0
- package/data/llms/styled/components/buttongroup.md +614 -0
- package/data/llms/styled/components/card.md +228 -0
- package/data/llms/styled/components/carousel.md +388 -0
- package/data/llms/styled/components/checkbox.md +329 -0
- package/data/llms/styled/components/checkboxgroup.md +619 -0
- package/data/llms/styled/components/chip.md +300 -0
- package/data/llms/styled/components/compare.md +271 -0
- package/data/llms/styled/components/contextmenu.md +550 -0
- package/data/llms/styled/components/datatable.md +8259 -0
- package/data/llms/styled/components/dataview.md +907 -0
- package/data/llms/styled/components/datepicker.md +2807 -0
- package/data/llms/styled/components/dialog.md +1047 -0
- package/data/llms/styled/components/divider.md +207 -0
- package/data/llms/styled/components/drawer.md +470 -0
- package/data/llms/styled/components/fieldset.md +334 -0
- package/data/llms/styled/components/fileupload.md +747 -0
- package/data/llms/styled/components/floatlabel/api.json +210 -0
- package/data/llms/styled/components/floatlabel.md +231 -0
- package/data/llms/styled/components/fluid/api.json +204 -0
- package/data/llms/styled/components/fluid.md +177 -0
- package/data/llms/styled/components/focustrap.md +203 -0
- package/data/llms/styled/components/gallery.md +553 -0
- package/data/llms/styled/components/iconfield/api.json +382 -0
- package/data/llms/styled/components/iconfield.md +385 -0
- package/data/llms/styled/components/iftalabel/api.json +237 -0
- package/data/llms/styled/components/iftalabel.md +158 -0
- package/data/llms/styled/components/inplace.md +312 -0
- package/data/llms/styled/components/inputcolor.md +674 -0
- package/data/llms/styled/components/inputgroup/api.json +399 -0
- package/data/llms/styled/components/inputgroup.md +604 -0
- package/data/llms/styled/components/inputmask.md +282 -0
- package/data/llms/styled/components/inputnumber.md +563 -0
- package/data/llms/styled/components/inputotp.md +335 -0
- package/data/llms/styled/components/inputpassword.md +630 -0
- package/data/llms/styled/components/inputtags.md +727 -0
- package/data/llms/styled/components/inputtext.md +190 -0
- package/data/llms/styled/components/keyfilter.md +289 -0
- package/data/llms/styled/components/knob.md +305 -0
- package/data/llms/styled/components/label/api.json +237 -0
- package/data/llms/styled/components/label.md +224 -0
- package/data/llms/styled/components/listbox.md +807 -0
- package/data/llms/styled/components/menu.md +1175 -0
- package/data/llms/styled/components/message.md +570 -0
- package/data/llms/styled/components/metergroup.md +449 -0
- package/data/llms/styled/components/navigationmenu.md +926 -0
- package/data/llms/styled/components/orderlist.md +519 -0
- package/data/llms/styled/components/organizationchart/api.json +1457 -0
- package/data/llms/styled/components/organizationchart.md +791 -0
- package/data/llms/styled/components/overlaymanager.md +519 -0
- package/data/llms/styled/components/paginator.md +506 -0
- package/data/llms/styled/components/panel.md +394 -0
- package/data/llms/styled/components/picklist.md +1004 -0
- package/data/llms/styled/components/popover.md +372 -0
- package/data/llms/styled/components/progressbar.md +438 -0
- package/data/llms/styled/components/progressspinner.md +128 -0
- package/data/llms/styled/components/radiobutton.md +488 -0
- package/data/llms/styled/components/rating/api.json +766 -0
- package/data/llms/styled/components/rating.md +518 -0
- package/data/llms/styled/components/scrollarea.md +627 -0
- package/data/llms/styled/components/select.md +2122 -0
- package/data/llms/styled/components/sidebar.md +1587 -0
- package/data/llms/styled/components/skeleton.md +226 -0
- package/data/llms/styled/components/slider.md +453 -0
- package/data/llms/styled/components/speeddial.md +723 -0
- package/data/llms/styled/components/splitter.md +536 -0
- package/data/llms/styled/components/stepper.md +614 -0
- package/data/llms/styled/components/tabs.md +543 -0
- package/data/llms/styled/components/tag.md +263 -0
- package/data/llms/styled/components/terminal.md +543 -0
- package/data/llms/styled/components/textarea.md +257 -0
- package/data/llms/styled/components/timeline.md +620 -0
- package/data/llms/styled/components/toast.md +1013 -0
- package/data/llms/styled/components/togglebutton.md +287 -0
- package/data/llms/styled/components/togglebuttongroup.md +328 -0
- package/data/llms/styled/components/toggleswitch.md +262 -0
- package/data/llms/styled/components/toolbar.md +187 -0
- package/data/llms/styled/components/tooltip.md +430 -0
- package/data/llms/styled/components/tree.md +1386 -0
- package/data/llms/styled/components/treetable.md +6842 -0
- package/data/llms/styled/guides/ai/llms.md +25 -0
- package/data/llms/styled/guides/configuration.md +151 -0
- package/data/llms/styled/guides/icons/customicons.md +47 -0
- package/data/llms/styled/guides/icons/primeicons.md +112 -0
- package/data/llms/styled/guides/installation/astro.md +97 -0
- package/data/llms/styled/guides/installation/manual.md +3 -0
- package/data/llms/styled/guides/installation/nextjs.md +129 -0
- package/data/llms/styled/guides/installation/react-router.md +88 -0
- package/data/llms/styled/guides/installation/tanstack.md +92 -0
- package/data/llms/styled/guides/installation/vite.md +91 -0
- package/data/llms/styled/guides/installation.md +42 -0
- package/data/llms/styled/guides/introduction.md +20 -0
- package/data/llms/styled/guides/misc/accessibility.md +211 -0
- package/data/llms/styled/guides/misc/animations.md +389 -0
- package/data/llms/styled/guides/misc/passthrough.md +95 -0
- package/data/llms/styled/guides/misc/rtl.md +27 -0
- package/data/llms/styled/guides/theming/styled.md +779 -0
- package/data/llms/styled/guides/theming/tailwind.md +473 -0
- package/data/llms/styled/guides/theming/unstyled.md +115 -0
- package/data/llms/styled/resources/introduction.md +15 -0
- package/data/llms/tailwind/add-ons/introduction.md +16 -0
- package/data/llms/tailwind/components/accordion.md +383 -0
- package/data/llms/tailwind/components/autocomplete.md +1346 -0
- package/data/llms/tailwind/components/avatar.md +305 -0
- package/data/llms/tailwind/components/badge.md +207 -0
- package/data/llms/tailwind/components/breadcrumb.md +387 -0
- package/data/llms/tailwind/components/button/api.json +246 -0
- package/data/llms/tailwind/components/button.md +617 -0
- package/data/llms/tailwind/components/buttongroup.md +599 -0
- package/data/llms/tailwind/components/card.md +224 -0
- package/data/llms/tailwind/components/carousel.md +329 -0
- package/data/llms/tailwind/components/checkbox.md +179 -0
- package/data/llms/tailwind/components/checkboxgroup.md +279 -0
- package/data/llms/tailwind/components/chip.md +304 -0
- package/data/llms/tailwind/components/compare.md +295 -0
- package/data/llms/tailwind/components/contextmenu.md +415 -0
- package/data/llms/tailwind/components/datatable.md +4062 -0
- package/data/llms/tailwind/components/dataview.md +864 -0
- package/data/llms/tailwind/components/datepicker.md +823 -0
- package/data/llms/tailwind/components/dialog.md +1216 -0
- package/data/llms/tailwind/components/divider.md +205 -0
- package/data/llms/tailwind/components/drawer.md +500 -0
- package/data/llms/tailwind/components/fieldset.md +326 -0
- package/data/llms/tailwind/components/fluid.md +117 -0
- package/data/llms/tailwind/components/iconfield.md +197 -0
- package/data/llms/tailwind/components/inplace.md +324 -0
- package/data/llms/tailwind/components/inputcolor.md +493 -0
- package/data/llms/tailwind/components/inputgroup.md +375 -0
- package/data/llms/tailwind/components/inputnumber.md +463 -0
- package/data/llms/tailwind/components/inputotp.md +255 -0
- package/data/llms/tailwind/components/inputpassword.md +543 -0
- package/data/llms/tailwind/components/inputtext.md +141 -0
- package/data/llms/tailwind/components/label.md +100 -0
- package/data/llms/tailwind/components/listbox.md +886 -0
- package/data/llms/tailwind/components/menu.md +1049 -0
- package/data/llms/tailwind/components/message.md +575 -0
- package/data/llms/tailwind/components/metergroup.md +510 -0
- package/data/llms/tailwind/components/navigationmenu.md +528 -0
- package/data/llms/tailwind/components/overlaymanager.md +567 -0
- package/data/llms/tailwind/components/paginator.md +306 -0
- package/data/llms/tailwind/components/panel.md +395 -0
- package/data/llms/tailwind/components/popover.md +424 -0
- package/data/llms/tailwind/components/progressbar.md +313 -0
- package/data/llms/tailwind/components/radiobutton.md +366 -0
- package/data/llms/tailwind/components/rating.md +300 -0
- package/data/llms/tailwind/components/scrollarea.md +638 -0
- package/data/llms/tailwind/components/select.md +1220 -0
- package/data/llms/tailwind/components/sidebar.md +1511 -0
- package/data/llms/tailwind/components/skeleton.md +236 -0
- package/data/llms/tailwind/components/slider.md +291 -0
- package/data/llms/tailwind/components/splitter.md +546 -0
- package/data/llms/tailwind/components/tabs.md +462 -0
- package/data/llms/tailwind/components/tag.md +255 -0
- package/data/llms/tailwind/components/textarea.md +170 -0
- package/data/llms/tailwind/components/timeline.md +656 -0
- package/data/llms/tailwind/components/toast.md +246 -0
- package/data/llms/tailwind/components/togglebutton.md +264 -0
- package/data/llms/tailwind/components/togglebuttongroup.md +262 -0
- package/data/llms/tailwind/components/toggleswitch.md +203 -0
- package/data/llms/tailwind/components/toolbar.md +192 -0
- package/data/llms/tailwind/components/tooltip.md +449 -0
- package/data/llms/tailwind/guides/ai/llms.md +25 -0
- package/data/llms/tailwind/guides/icons/customicons.md +47 -0
- package/data/llms/tailwind/guides/icons/primeicons.md +112 -0
- package/data/llms/tailwind/guides/installation/astro.md +165 -0
- package/data/llms/tailwind/guides/installation/manual.md +3 -0
- package/data/llms/tailwind/guides/installation/nextjs.md +169 -0
- package/data/llms/tailwind/guides/installation/react-router.md +157 -0
- package/data/llms/tailwind/guides/installation/tanstack.md +161 -0
- package/data/llms/tailwind/guides/installation/vite.md +160 -0
- package/data/llms/tailwind/guides/installation.md +42 -0
- package/data/llms/tailwind/guides/introduction.md +20 -0
- package/data/llms/tailwind/guides/misc/accessibility.md +205 -0
- package/data/llms/tailwind/guides/misc/passthrough.md +95 -0
- package/data/llms/tailwind/guides/misc/rtl.md +27 -0
- package/data/llms/tailwind/guides/theming/guide.md +179 -0
- package/data/llms/tailwind/guides/theming.md +191 -0
- package/data/llms/tailwind/llms.md +25 -0
- package/data/llms/tailwind/resources/introduction.md +15 -0
- package/data/manifest.json +12409 -0
- package/data/mcp-data.json +14481 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +2 -0
- package/package.json +61 -0
|
@@ -0,0 +1,1386 @@
|
|
|
1
|
+
# Tree
|
|
2
|
+
|
|
3
|
+
Tree is used to display hierarchical data.
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
'use client';
|
|
7
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
8
|
+
import { Check } from '@primeicons/react/check';
|
|
9
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
10
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
11
|
+
import { File } from '@primeicons/react/file';
|
|
12
|
+
import { Folder } from '@primeicons/react/folder';
|
|
13
|
+
import { FolderOpen } from '@primeicons/react/folder-open';
|
|
14
|
+
import { Minus } from '@primeicons/react/minus';
|
|
15
|
+
import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
|
|
16
|
+
import {
|
|
17
|
+
Tree,
|
|
18
|
+
type TreeCheckboxSelectionKeys,
|
|
19
|
+
type TreeNodeData,
|
|
20
|
+
type TreeRootSelectionChangeEvent,
|
|
21
|
+
type TreeSelectionInstance
|
|
22
|
+
} from '@primereact/ui/tree';
|
|
23
|
+
import * as React from 'react';
|
|
24
|
+
|
|
25
|
+
export default function Preview() {
|
|
26
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
27
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
|
|
28
|
+
|
|
29
|
+
React.useEffect(() => {
|
|
30
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Tree.Root
|
|
35
|
+
value={nodes}
|
|
36
|
+
selectionMode="checkbox"
|
|
37
|
+
selectionKeys={selectionKeys}
|
|
38
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
|
|
39
|
+
defaultExpandedKeys={{ '0': true }}
|
|
40
|
+
className="w-full md:w-120"
|
|
41
|
+
>
|
|
42
|
+
<Tree.Nodes>
|
|
43
|
+
{({ node, leaf, expanded }) => (
|
|
44
|
+
<Tree.Node uKey={node.key}>
|
|
45
|
+
<Tree.Content>
|
|
46
|
+
<Tree.Toggle>
|
|
47
|
+
<Tree.ToggleIndicator match="expanded">
|
|
48
|
+
<ChevronDown />
|
|
49
|
+
</Tree.ToggleIndicator>
|
|
50
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
51
|
+
<ChevronRight />
|
|
52
|
+
</Tree.ToggleIndicator>
|
|
53
|
+
</Tree.Toggle>
|
|
54
|
+
<Tree.Selection>
|
|
55
|
+
{({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
|
|
56
|
+
<Checkbox.Root
|
|
57
|
+
checked={isSelected}
|
|
58
|
+
indeterminate={isPartiallySelected}
|
|
59
|
+
onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
|
|
60
|
+
tabIndex={-1}
|
|
61
|
+
>
|
|
62
|
+
<Checkbox.Box>
|
|
63
|
+
<Checkbox.Indicator match="checked">
|
|
64
|
+
<Check />
|
|
65
|
+
</Checkbox.Indicator>
|
|
66
|
+
<Checkbox.Indicator match="indeterminate">
|
|
67
|
+
<Minus />
|
|
68
|
+
</Checkbox.Indicator>
|
|
69
|
+
</Checkbox.Box>
|
|
70
|
+
</Checkbox.Root>
|
|
71
|
+
)}
|
|
72
|
+
</Tree.Selection>
|
|
73
|
+
{leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
|
|
74
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
75
|
+
</Tree.Content>
|
|
76
|
+
</Tree.Node>
|
|
77
|
+
)}
|
|
78
|
+
</Tree.Nodes>
|
|
79
|
+
</Tree.Root>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Usage
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
import { Tree } from '@primereact/ui/tree';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Tree requires a collection of _TreeNode_ instances as its _value_. Each visible row is produced by _Tree.Nodes_ through its render function and identified by _uKey_.
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
<Tree.Root value={nodes}>
|
|
94
|
+
<Tree.Nodes>
|
|
95
|
+
{({ node }) => (
|
|
96
|
+
<Tree.Node uKey={node.key}>
|
|
97
|
+
<Tree.Content>
|
|
98
|
+
<Tree.Toggle>
|
|
99
|
+
<Tree.ToggleIndicator />
|
|
100
|
+
</Tree.Toggle>
|
|
101
|
+
<Tree.Label />
|
|
102
|
+
</Tree.Content>
|
|
103
|
+
</Tree.Node>
|
|
104
|
+
)}
|
|
105
|
+
</Tree.Nodes>
|
|
106
|
+
</Tree.Root>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Examples
|
|
110
|
+
|
|
111
|
+
### Basic
|
|
112
|
+
|
|
113
|
+
A basic Tree displays a collection of _TreeNode_ instances.
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
'use client';
|
|
117
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
118
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
119
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
120
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
121
|
+
import * as React from 'react';
|
|
122
|
+
|
|
123
|
+
export default function BasicDemo() {
|
|
124
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
125
|
+
|
|
126
|
+
React.useEffect(() => {
|
|
127
|
+
NodeService.getTreeNodes().then((data) => setNodes(data));
|
|
128
|
+
}, []);
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
<Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
|
|
132
|
+
<Tree.Nodes>
|
|
133
|
+
{({ node }) => (
|
|
134
|
+
<Tree.Node uKey={node.key}>
|
|
135
|
+
<Tree.Content>
|
|
136
|
+
<Tree.Toggle>
|
|
137
|
+
<Tree.ToggleIndicator match="expanded">
|
|
138
|
+
<ChevronDown />
|
|
139
|
+
</Tree.ToggleIndicator>
|
|
140
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
141
|
+
<ChevronRight />
|
|
142
|
+
</Tree.ToggleIndicator>
|
|
143
|
+
</Tree.Toggle>
|
|
144
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
145
|
+
</Tree.Content>
|
|
146
|
+
</Tree.Node>
|
|
147
|
+
)}
|
|
148
|
+
</Tree.Nodes>
|
|
149
|
+
</Tree.Root>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Content
|
|
155
|
+
|
|
156
|
+
Custom node content is rendered inside _Tree.Content_; the row payload exposes _leaf_ and _expanded_ so the right icon can be chosen.
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
'use client';
|
|
160
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
161
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
162
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
163
|
+
import { File } from '@primeicons/react/file';
|
|
164
|
+
import { Folder } from '@primeicons/react/folder';
|
|
165
|
+
import { FolderOpen } from '@primeicons/react/folder-open';
|
|
166
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
167
|
+
import * as React from 'react';
|
|
168
|
+
|
|
169
|
+
export default function NodeDemo() {
|
|
170
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
171
|
+
|
|
172
|
+
React.useEffect(() => {
|
|
173
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
174
|
+
}, []);
|
|
175
|
+
|
|
176
|
+
return (
|
|
177
|
+
<Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
|
|
178
|
+
<Tree.Nodes>
|
|
179
|
+
{({ node, leaf, expanded }) => (
|
|
180
|
+
<Tree.Node uKey={node.key}>
|
|
181
|
+
<Tree.Content>
|
|
182
|
+
<Tree.Toggle>
|
|
183
|
+
<Tree.ToggleIndicator match="expanded">
|
|
184
|
+
<ChevronDown />
|
|
185
|
+
</Tree.ToggleIndicator>
|
|
186
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
187
|
+
<ChevronRight />
|
|
188
|
+
</Tree.ToggleIndicator>
|
|
189
|
+
</Tree.Toggle>
|
|
190
|
+
{leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
|
|
191
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
192
|
+
</Tree.Content>
|
|
193
|
+
</Tree.Node>
|
|
194
|
+
)}
|
|
195
|
+
</Tree.Nodes>
|
|
196
|
+
</Tree.Root>
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Toggle Indicator
|
|
202
|
+
|
|
203
|
+
Toggle indicators are customized with _Tree.ToggleIndicator_ and its _match_ property of _expanded_, _collapsed_ or _always_.
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
'use client';
|
|
207
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
208
|
+
import { MinusCircle } from '@primeicons/react/minus-circle';
|
|
209
|
+
import { PlusCircle } from '@primeicons/react/plus-circle';
|
|
210
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
211
|
+
import * as React from 'react';
|
|
212
|
+
|
|
213
|
+
export default function PlusMinusToggleDemo() {
|
|
214
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
215
|
+
|
|
216
|
+
React.useEffect(() => {
|
|
217
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
218
|
+
}, []);
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
|
|
222
|
+
<Tree.Nodes>
|
|
223
|
+
{({ node }) => (
|
|
224
|
+
<Tree.Node uKey={node.key}>
|
|
225
|
+
<Tree.Content>
|
|
226
|
+
<Tree.Toggle>
|
|
227
|
+
<Tree.ToggleIndicator match="expanded">
|
|
228
|
+
<MinusCircle />
|
|
229
|
+
</Tree.ToggleIndicator>
|
|
230
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
231
|
+
<PlusCircle />
|
|
232
|
+
</Tree.ToggleIndicator>
|
|
233
|
+
</Tree.Toggle>
|
|
234
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
235
|
+
</Tree.Content>
|
|
236
|
+
</Tree.Node>
|
|
237
|
+
)}
|
|
238
|
+
</Tree.Nodes>
|
|
239
|
+
</Tree.Root>
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Controlled
|
|
245
|
+
|
|
246
|
+
Expansion state is managed programmatically with _expandedKeys_ and _onExpandedChange_ properties.
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
'use client';
|
|
250
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
251
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
252
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
253
|
+
import { Minus } from '@primeicons/react/minus';
|
|
254
|
+
import { Plus } from '@primeicons/react/plus';
|
|
255
|
+
import { Button } from '@primereact/ui/button';
|
|
256
|
+
import { Tree, type TreeExpandedKeys, type TreeNodeData, type TreeRootExpandedChangeEvent } from '@primereact/ui/tree';
|
|
257
|
+
import * as React from 'react';
|
|
258
|
+
|
|
259
|
+
function collectExpandableKeys(list: TreeNodeData[], acc: TreeExpandedKeys = {}): TreeExpandedKeys {
|
|
260
|
+
for (const node of list) {
|
|
261
|
+
if (node.children?.length) {
|
|
262
|
+
acc[node.key] = true;
|
|
263
|
+
collectExpandableKeys(node.children, acc);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return acc;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export default function ExpandCollapseAllDemo() {
|
|
271
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
272
|
+
const [expandedKeys, setExpandedKeys] = React.useState<TreeExpandedKeys>({});
|
|
273
|
+
|
|
274
|
+
React.useEffect(() => {
|
|
275
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
276
|
+
}, []);
|
|
277
|
+
|
|
278
|
+
const expandAll = () => setExpandedKeys(collectExpandableKeys(nodes));
|
|
279
|
+
const collapseAll = () => setExpandedKeys({});
|
|
280
|
+
|
|
281
|
+
return (
|
|
282
|
+
<div className="flex flex-col gap-3 w-full md:w-120">
|
|
283
|
+
<div className="flex gap-2">
|
|
284
|
+
<Button onClick={expandAll}>
|
|
285
|
+
<Plus />
|
|
286
|
+
Expand All
|
|
287
|
+
</Button>
|
|
288
|
+
<Button onClick={collapseAll} variant="outlined">
|
|
289
|
+
<Minus />
|
|
290
|
+
Collapse All
|
|
291
|
+
</Button>
|
|
292
|
+
</div>
|
|
293
|
+
<Tree.Root value={nodes} expandedKeys={expandedKeys} onExpandedChange={(e: TreeRootExpandedChangeEvent) => setExpandedKeys(e.value)}>
|
|
294
|
+
<Tree.Nodes>
|
|
295
|
+
{({ node }) => (
|
|
296
|
+
<Tree.Node uKey={node.key}>
|
|
297
|
+
<Tree.Content>
|
|
298
|
+
<Tree.Toggle>
|
|
299
|
+
<Tree.ToggleIndicator match="expanded">
|
|
300
|
+
<ChevronDown />
|
|
301
|
+
</Tree.ToggleIndicator>
|
|
302
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
303
|
+
<ChevronRight />
|
|
304
|
+
</Tree.ToggleIndicator>
|
|
305
|
+
</Tree.Toggle>
|
|
306
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
307
|
+
</Tree.Content>
|
|
308
|
+
</Tree.Node>
|
|
309
|
+
)}
|
|
310
|
+
</Tree.Nodes>
|
|
311
|
+
</Tree.Root>
|
|
312
|
+
</div>
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Selection
|
|
318
|
+
|
|
319
|
+
#### Single
|
|
320
|
+
|
|
321
|
+
Single node selection is configured by setting _selectionMode_ as _single_ along with _selectionKeys_ and _onSelectionChange_ properties to manage the selection value binding.
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
'use client';
|
|
325
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
326
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
327
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
328
|
+
import { File } from '@primeicons/react/file';
|
|
329
|
+
import { Folder } from '@primeicons/react/folder';
|
|
330
|
+
import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
|
|
331
|
+
import * as React from 'react';
|
|
332
|
+
|
|
333
|
+
export default function SingleSelectionDemo() {
|
|
334
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
335
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
|
|
336
|
+
|
|
337
|
+
React.useEffect(() => {
|
|
338
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
339
|
+
}, []);
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<Tree.Root
|
|
343
|
+
value={nodes}
|
|
344
|
+
selectionMode="single"
|
|
345
|
+
selectionKeys={selectionKeys}
|
|
346
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
|
|
347
|
+
defaultExpandedKeys={{ '0': true }}
|
|
348
|
+
className="w-full md:w-120"
|
|
349
|
+
>
|
|
350
|
+
<Tree.Nodes>
|
|
351
|
+
{({ node, leaf }) => (
|
|
352
|
+
<Tree.Node uKey={node.key}>
|
|
353
|
+
<Tree.Content>
|
|
354
|
+
<Tree.Toggle>
|
|
355
|
+
<Tree.ToggleIndicator match="expanded">
|
|
356
|
+
<ChevronDown />
|
|
357
|
+
</Tree.ToggleIndicator>
|
|
358
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
359
|
+
<ChevronRight />
|
|
360
|
+
</Tree.ToggleIndicator>
|
|
361
|
+
</Tree.Toggle>
|
|
362
|
+
{leaf ? <File /> : <Folder />}
|
|
363
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
364
|
+
</Tree.Content>
|
|
365
|
+
</Tree.Node>
|
|
366
|
+
)}
|
|
367
|
+
</Tree.Nodes>
|
|
368
|
+
</Tree.Root>
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
#### Multiple
|
|
374
|
+
|
|
375
|
+
More than one node is selectable by setting _selectionMode_ to _multiple_. By default in multiple selection mode, metaKey press (e.g. ⌘) is necessary to add to existing selections, however this can be configured with the _metaKeySelection_ property.
|
|
376
|
+
|
|
377
|
+
```tsx
|
|
378
|
+
'use client';
|
|
379
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
380
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
381
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
382
|
+
import { File } from '@primeicons/react/file';
|
|
383
|
+
import { Folder } from '@primeicons/react/folder';
|
|
384
|
+
import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
|
|
385
|
+
import * as React from 'react';
|
|
386
|
+
|
|
387
|
+
export default function MultipleSelectionDemo() {
|
|
388
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
389
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
|
|
390
|
+
|
|
391
|
+
React.useEffect(() => {
|
|
392
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
393
|
+
}, []);
|
|
394
|
+
|
|
395
|
+
return (
|
|
396
|
+
<Tree.Root
|
|
397
|
+
value={nodes}
|
|
398
|
+
selectionMode="multiple"
|
|
399
|
+
metaKeySelection
|
|
400
|
+
selectionKeys={selectionKeys}
|
|
401
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
|
|
402
|
+
defaultExpandedKeys={{ '0': true }}
|
|
403
|
+
className="w-full md:w-120"
|
|
404
|
+
>
|
|
405
|
+
<Tree.Nodes>
|
|
406
|
+
{({ node, leaf }) => (
|
|
407
|
+
<Tree.Node uKey={node.key}>
|
|
408
|
+
<Tree.Content>
|
|
409
|
+
<Tree.Toggle>
|
|
410
|
+
<Tree.ToggleIndicator match="expanded">
|
|
411
|
+
<ChevronDown />
|
|
412
|
+
</Tree.ToggleIndicator>
|
|
413
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
414
|
+
<ChevronRight />
|
|
415
|
+
</Tree.ToggleIndicator>
|
|
416
|
+
</Tree.Toggle>
|
|
417
|
+
{leaf ? <File /> : <Folder />}
|
|
418
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
419
|
+
</Tree.Content>
|
|
420
|
+
</Tree.Node>
|
|
421
|
+
)}
|
|
422
|
+
</Tree.Nodes>
|
|
423
|
+
</Tree.Root>
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
#### Checkbox
|
|
429
|
+
|
|
430
|
+
Selection of multiple nodes via checkboxes is composed with _Tree.Selection_ inside _Tree.Node_. The render prop exposes _isSelected_, _isPartiallySelected_ and _toggle_; the down/up tri-state cascade runs in the headless layer.
|
|
431
|
+
|
|
432
|
+
```tsx
|
|
433
|
+
'use client';
|
|
434
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
435
|
+
import { Check } from '@primeicons/react/check';
|
|
436
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
437
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
438
|
+
import { Minus } from '@primeicons/react/minus';
|
|
439
|
+
import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
|
|
440
|
+
import {
|
|
441
|
+
Tree,
|
|
442
|
+
type TreeCheckboxSelectionKeys,
|
|
443
|
+
type TreeNodeData,
|
|
444
|
+
type TreeRootSelectionChangeEvent,
|
|
445
|
+
type TreeSelectionInstance
|
|
446
|
+
} from '@primereact/ui/tree';
|
|
447
|
+
import * as React from 'react';
|
|
448
|
+
|
|
449
|
+
export default function CheckboxSelectionDemo() {
|
|
450
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
451
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
|
|
452
|
+
|
|
453
|
+
React.useEffect(() => {
|
|
454
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
455
|
+
}, []);
|
|
456
|
+
|
|
457
|
+
return (
|
|
458
|
+
<Tree.Root
|
|
459
|
+
value={nodes}
|
|
460
|
+
selectionMode="checkbox"
|
|
461
|
+
selectionKeys={selectionKeys}
|
|
462
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
|
|
463
|
+
defaultExpandedKeys={{ '0': true }}
|
|
464
|
+
className="w-full md:w-120"
|
|
465
|
+
>
|
|
466
|
+
<Tree.Nodes>
|
|
467
|
+
{({ node }) => (
|
|
468
|
+
<Tree.Node uKey={node.key}>
|
|
469
|
+
<Tree.Content>
|
|
470
|
+
<Tree.Toggle>
|
|
471
|
+
<Tree.ToggleIndicator match="expanded">
|
|
472
|
+
<ChevronDown />
|
|
473
|
+
</Tree.ToggleIndicator>
|
|
474
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
475
|
+
<ChevronRight />
|
|
476
|
+
</Tree.ToggleIndicator>
|
|
477
|
+
</Tree.Toggle>
|
|
478
|
+
<Tree.Selection>
|
|
479
|
+
{({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
|
|
480
|
+
<Checkbox.Root
|
|
481
|
+
checked={isSelected}
|
|
482
|
+
indeterminate={isPartiallySelected}
|
|
483
|
+
onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
|
|
484
|
+
tabIndex={-1}
|
|
485
|
+
>
|
|
486
|
+
<Checkbox.Box>
|
|
487
|
+
<Checkbox.Indicator match="checked">
|
|
488
|
+
<Check />
|
|
489
|
+
</Checkbox.Indicator>
|
|
490
|
+
<Checkbox.Indicator match="indeterminate">
|
|
491
|
+
<Minus />
|
|
492
|
+
</Checkbox.Indicator>
|
|
493
|
+
</Checkbox.Box>
|
|
494
|
+
</Checkbox.Root>
|
|
495
|
+
)}
|
|
496
|
+
</Tree.Selection>
|
|
497
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
498
|
+
</Tree.Content>
|
|
499
|
+
</Tree.Node>
|
|
500
|
+
)}
|
|
501
|
+
</Tree.Nodes>
|
|
502
|
+
</Tree.Root>
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
#### Radio
|
|
508
|
+
|
|
509
|
+
Use _Tree.Selection_ with _mode="radio"_ to keep a single selection sticky. Re-clicking the selected node does not deselect it.
|
|
510
|
+
|
|
511
|
+
```tsx
|
|
512
|
+
'use client';
|
|
513
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
514
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
515
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
516
|
+
import type { RadioButtonRootChangeEvent } from '@primereact/ui/radiobutton';
|
|
517
|
+
import { RadioButton } from '@primereact/ui/radiobutton';
|
|
518
|
+
import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionInstance, type TreeSelectionKeys } from '@primereact/ui/tree';
|
|
519
|
+
import * as React from 'react';
|
|
520
|
+
|
|
521
|
+
export default function RadioSelectionDemo() {
|
|
522
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
523
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
|
|
524
|
+
|
|
525
|
+
React.useEffect(() => {
|
|
526
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
527
|
+
}, []);
|
|
528
|
+
|
|
529
|
+
return (
|
|
530
|
+
<Tree.Root
|
|
531
|
+
value={nodes}
|
|
532
|
+
selectionMode="single"
|
|
533
|
+
selectionKeys={selectionKeys}
|
|
534
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
|
|
535
|
+
defaultExpandedKeys={{ '0': true }}
|
|
536
|
+
className="w-full md:w-120"
|
|
537
|
+
>
|
|
538
|
+
<Tree.Nodes>
|
|
539
|
+
{({ node }) => (
|
|
540
|
+
<Tree.Node uKey={node.key}>
|
|
541
|
+
<Tree.Content>
|
|
542
|
+
<Tree.Toggle>
|
|
543
|
+
<Tree.ToggleIndicator match="expanded">
|
|
544
|
+
<ChevronDown />
|
|
545
|
+
</Tree.ToggleIndicator>
|
|
546
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
547
|
+
<ChevronRight />
|
|
548
|
+
</Tree.ToggleIndicator>
|
|
549
|
+
</Tree.Toggle>
|
|
550
|
+
<Tree.Selection mode="radio">
|
|
551
|
+
{({ isSelected, toggle }: TreeSelectionInstance) => (
|
|
552
|
+
<RadioButton.Root
|
|
553
|
+
checked={isSelected}
|
|
554
|
+
onCheckedChange={(e: RadioButtonRootChangeEvent) => toggle(e.originalEvent)}
|
|
555
|
+
tabIndex={-1}
|
|
556
|
+
>
|
|
557
|
+
<RadioButton.Box>
|
|
558
|
+
<RadioButton.Indicator match="checked" />
|
|
559
|
+
</RadioButton.Box>
|
|
560
|
+
</RadioButton.Root>
|
|
561
|
+
)}
|
|
562
|
+
</Tree.Selection>
|
|
563
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
564
|
+
</Tree.Content>
|
|
565
|
+
</Tree.Node>
|
|
566
|
+
)}
|
|
567
|
+
</Tree.Nodes>
|
|
568
|
+
</Tree.Root>
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
#### Select All
|
|
574
|
+
|
|
575
|
+
Outside a _Tree.Node_, _Tree.Selection_ exposes _isAllSelected_, _isSomeSelected_ and _toggleAll_ for an aggregate checkbox in _Tree.Header_.
|
|
576
|
+
|
|
577
|
+
```tsx
|
|
578
|
+
'use client';
|
|
579
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
580
|
+
import { Check } from '@primeicons/react/check';
|
|
581
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
582
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
583
|
+
import { Minus } from '@primeicons/react/minus';
|
|
584
|
+
import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
|
|
585
|
+
import {
|
|
586
|
+
Tree,
|
|
587
|
+
type TreeCheckboxSelectionKeys,
|
|
588
|
+
type TreeNodeData,
|
|
589
|
+
type TreeRootSelectionChangeEvent,
|
|
590
|
+
type TreeSelectionInstance
|
|
591
|
+
} from '@primereact/ui/tree';
|
|
592
|
+
import * as React from 'react';
|
|
593
|
+
|
|
594
|
+
export default function SelectAllDemo() {
|
|
595
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
596
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
|
|
597
|
+
|
|
598
|
+
React.useEffect(() => {
|
|
599
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
600
|
+
}, []);
|
|
601
|
+
|
|
602
|
+
return (
|
|
603
|
+
<Tree.Root
|
|
604
|
+
value={nodes}
|
|
605
|
+
selectionMode="checkbox"
|
|
606
|
+
selectionKeys={selectionKeys}
|
|
607
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
|
|
608
|
+
defaultExpandedKeys={{ '0': true }}
|
|
609
|
+
className="w-full md:w-120"
|
|
610
|
+
>
|
|
611
|
+
<Tree.Header className="flex items-center gap-2 mb-2 px-2">
|
|
612
|
+
<Tree.Selection>
|
|
613
|
+
{({ isAllSelected, isSomeSelected, toggleAll }: TreeSelectionInstance) => (
|
|
614
|
+
<Checkbox.Root
|
|
615
|
+
checked={isAllSelected}
|
|
616
|
+
indeterminate={isSomeSelected && !isAllSelected}
|
|
617
|
+
onCheckedChange={(e: CheckboxRootChangeEvent) => toggleAll(e.originalEvent)}
|
|
618
|
+
>
|
|
619
|
+
<Checkbox.Box>
|
|
620
|
+
<Checkbox.Indicator match="checked">
|
|
621
|
+
<Check />
|
|
622
|
+
</Checkbox.Indicator>
|
|
623
|
+
<Checkbox.Indicator match="indeterminate">
|
|
624
|
+
<Minus />
|
|
625
|
+
</Checkbox.Indicator>
|
|
626
|
+
</Checkbox.Box>
|
|
627
|
+
</Checkbox.Root>
|
|
628
|
+
)}
|
|
629
|
+
</Tree.Selection>
|
|
630
|
+
<span className="font-medium">Select All</span>
|
|
631
|
+
</Tree.Header>
|
|
632
|
+
<Tree.Nodes>
|
|
633
|
+
{({ node }) => (
|
|
634
|
+
<Tree.Node uKey={node.key}>
|
|
635
|
+
<Tree.Content>
|
|
636
|
+
<Tree.Toggle>
|
|
637
|
+
<Tree.ToggleIndicator match="expanded">
|
|
638
|
+
<ChevronDown />
|
|
639
|
+
</Tree.ToggleIndicator>
|
|
640
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
641
|
+
<ChevronRight />
|
|
642
|
+
</Tree.ToggleIndicator>
|
|
643
|
+
</Tree.Toggle>
|
|
644
|
+
<Tree.Selection>
|
|
645
|
+
{({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
|
|
646
|
+
<Checkbox.Root
|
|
647
|
+
checked={isSelected}
|
|
648
|
+
indeterminate={isPartiallySelected}
|
|
649
|
+
onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
|
|
650
|
+
tabIndex={-1}
|
|
651
|
+
>
|
|
652
|
+
<Checkbox.Box>
|
|
653
|
+
<Checkbox.Indicator match="checked">
|
|
654
|
+
<Check />
|
|
655
|
+
</Checkbox.Indicator>
|
|
656
|
+
<Checkbox.Indicator match="indeterminate">
|
|
657
|
+
<Minus />
|
|
658
|
+
</Checkbox.Indicator>
|
|
659
|
+
</Checkbox.Box>
|
|
660
|
+
</Checkbox.Root>
|
|
661
|
+
)}
|
|
662
|
+
</Tree.Selection>
|
|
663
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
664
|
+
</Tree.Content>
|
|
665
|
+
</Tree.Node>
|
|
666
|
+
)}
|
|
667
|
+
</Tree.Nodes>
|
|
668
|
+
</Tree.Root>
|
|
669
|
+
);
|
|
670
|
+
}
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
#### Keyboard
|
|
674
|
+
|
|
675
|
+
Tree fully supports keyboard navigation. Arrow keys move focus across visible rows, Right and Left expand and collapse, Space and Enter toggle selection on the focused node.
|
|
676
|
+
|
|
677
|
+
```tsx
|
|
678
|
+
'use client';
|
|
679
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
680
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
681
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
682
|
+
import { File } from '@primeicons/react/file';
|
|
683
|
+
import { Folder } from '@primeicons/react/folder';
|
|
684
|
+
import { Badge } from '@primereact/ui/badge';
|
|
685
|
+
import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
|
|
686
|
+
import * as React from 'react';
|
|
687
|
+
|
|
688
|
+
export default function KeyboardDemo() {
|
|
689
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
690
|
+
const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
|
|
691
|
+
|
|
692
|
+
React.useEffect(() => {
|
|
693
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
694
|
+
}, []);
|
|
695
|
+
|
|
696
|
+
const selectedCount = Object.values(selectionKeys).filter(Boolean).length;
|
|
697
|
+
|
|
698
|
+
return (
|
|
699
|
+
<div className="flex flex-col gap-3 w-full md:w-120">
|
|
700
|
+
<div className="flex items-center justify-between gap-3 p-3 rounded-md border border-surface-200 dark:border-surface-700 bg-surface-50 dark:bg-surface-900">
|
|
701
|
+
<span className="text-sm text-surface-500 dark:text-surface-400">
|
|
702
|
+
<kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">↑</kbd>{' '}
|
|
703
|
+
<kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">↓</kbd> navigate,{' '}
|
|
704
|
+
<kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">→</kbd> expand,{' '}
|
|
705
|
+
<kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">←</kbd> collapse,{' '}
|
|
706
|
+
<kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">Space</kbd> select
|
|
707
|
+
</span>
|
|
708
|
+
<div className="flex items-center gap-2">
|
|
709
|
+
<span className="text-sm font-medium">Selected</span>
|
|
710
|
+
<Badge severity={selectedCount ? 'info' : 'secondary'}>{selectedCount}</Badge>
|
|
711
|
+
</div>
|
|
712
|
+
</div>
|
|
713
|
+
<Tree.Root
|
|
714
|
+
value={nodes}
|
|
715
|
+
selectionMode="multiple"
|
|
716
|
+
metaKeySelection
|
|
717
|
+
selectionKeys={selectionKeys}
|
|
718
|
+
onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
|
|
719
|
+
defaultExpandedKeys={{ '0': true }}
|
|
720
|
+
>
|
|
721
|
+
<Tree.Nodes>
|
|
722
|
+
{({ node, leaf }) => (
|
|
723
|
+
<Tree.Node uKey={node.key}>
|
|
724
|
+
<Tree.Content>
|
|
725
|
+
<Tree.Toggle>
|
|
726
|
+
<Tree.ToggleIndicator match="expanded">
|
|
727
|
+
<ChevronDown />
|
|
728
|
+
</Tree.ToggleIndicator>
|
|
729
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
730
|
+
<ChevronRight />
|
|
731
|
+
</Tree.ToggleIndicator>
|
|
732
|
+
</Tree.Toggle>
|
|
733
|
+
{leaf ? <File /> : <Folder />}
|
|
734
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
735
|
+
</Tree.Content>
|
|
736
|
+
</Tree.Node>
|
|
737
|
+
)}
|
|
738
|
+
</Tree.Nodes>
|
|
739
|
+
</Tree.Root>
|
|
740
|
+
</div>
|
|
741
|
+
);
|
|
742
|
+
}
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
### Filter
|
|
746
|
+
|
|
747
|
+
Filtering is composed with the _Tree.Filter_ input and a derived _value_. The [_useTreeFilter_](/docs/hooks/use-tree-filter) hook covers the common case of label-based search and exposes the filtered nodes along with an _expandedKeys_ map.
|
|
748
|
+
|
|
749
|
+
```tsx
|
|
750
|
+
'use client';
|
|
751
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
752
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
753
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
754
|
+
import { Search } from '@primeicons/react/search';
|
|
755
|
+
import { useTreeFilter } from '@primereact/hooks/use-tree-filter';
|
|
756
|
+
import { Fluid } from '@primereact/ui/fluid';
|
|
757
|
+
import { IconField } from '@primereact/ui/iconfield';
|
|
758
|
+
import { InputText } from '@primereact/ui/inputtext';
|
|
759
|
+
import { Tree, type TreeExpandedKeys, type TreeNodeData, type TreeRootExpandedChangeEvent } from '@primereact/ui/tree';
|
|
760
|
+
import * as React from 'react';
|
|
761
|
+
|
|
762
|
+
function collectKeys(list: TreeNodeData[], acc: TreeExpandedKeys = {}): TreeExpandedKeys {
|
|
763
|
+
for (const node of list) {
|
|
764
|
+
if (node.children?.length) {
|
|
765
|
+
acc[node.key] = true;
|
|
766
|
+
collectKeys(node.children, acc);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
return acc;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
export default function FilterDemo() {
|
|
774
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
775
|
+
const [query, setQuery] = React.useState('');
|
|
776
|
+
const [expandedKeys, setExpandedKeys] = React.useState<TreeExpandedKeys>({ '0': true });
|
|
777
|
+
|
|
778
|
+
React.useEffect(() => {
|
|
779
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
780
|
+
}, []);
|
|
781
|
+
|
|
782
|
+
const { filteredNodes, isFiltered } = useTreeFilter<TreeNodeData>({
|
|
783
|
+
nodes,
|
|
784
|
+
field: 'label',
|
|
785
|
+
value: query,
|
|
786
|
+
matchMode: 'contains'
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
React.useEffect(() => {
|
|
790
|
+
if (isFiltered) setExpandedKeys(collectKeys(filteredNodes));
|
|
791
|
+
}, [isFiltered, filteredNodes]);
|
|
792
|
+
|
|
793
|
+
return (
|
|
794
|
+
<Tree.Root
|
|
795
|
+
value={filteredNodes}
|
|
796
|
+
expandedKeys={expandedKeys}
|
|
797
|
+
onExpandedChange={(e: TreeRootExpandedChangeEvent) => setExpandedKeys(e.value)}
|
|
798
|
+
className="w-full md:w-120"
|
|
799
|
+
>
|
|
800
|
+
<Tree.Header>
|
|
801
|
+
<IconField.Root as={Fluid}>
|
|
802
|
+
<InputText
|
|
803
|
+
value={query}
|
|
804
|
+
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setQuery(e.target.value)}
|
|
805
|
+
placeholder="Search..."
|
|
806
|
+
/>
|
|
807
|
+
<IconField.Inset>
|
|
808
|
+
<Search />
|
|
809
|
+
</IconField.Inset>
|
|
810
|
+
</IconField.Root>
|
|
811
|
+
</Tree.Header>
|
|
812
|
+
<Tree.Nodes>
|
|
813
|
+
{({ node }) => (
|
|
814
|
+
<Tree.Node uKey={node.key}>
|
|
815
|
+
<Tree.Content>
|
|
816
|
+
<Tree.Toggle>
|
|
817
|
+
<Tree.ToggleIndicator match="expanded">
|
|
818
|
+
<ChevronDown />
|
|
819
|
+
</Tree.ToggleIndicator>
|
|
820
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
821
|
+
<ChevronRight />
|
|
822
|
+
</Tree.ToggleIndicator>
|
|
823
|
+
</Tree.Toggle>
|
|
824
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
825
|
+
</Tree.Content>
|
|
826
|
+
</Tree.Node>
|
|
827
|
+
)}
|
|
828
|
+
</Tree.Nodes>
|
|
829
|
+
<Tree.Empty className="mt-4 text-center text-sm text-surface-500">No nodes match "{query}"</Tree.Empty>
|
|
830
|
+
</Tree.Root>
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
### Lazy
|
|
836
|
+
|
|
837
|
+
Lazy loading is useful when dealing with huge datasets. Placeholder nodes are marked with _leaf: false_ and children are loaded on demand using the _onExpand_ event. The _loading_ flag on the node toggles a spinner inside _Tree.Toggle_.
|
|
838
|
+
|
|
839
|
+
```tsx
|
|
840
|
+
'use client';
|
|
841
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
842
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
843
|
+
import { File } from '@primeicons/react/file';
|
|
844
|
+
import { Folder } from '@primeicons/react/folder';
|
|
845
|
+
import { FolderOpen } from '@primeicons/react/folder-open';
|
|
846
|
+
import { Spinner } from '@primeicons/react/spinner';
|
|
847
|
+
import { Tree, type TreeNodeData, type TreeRootExpandEvent } from '@primereact/ui/tree';
|
|
848
|
+
import * as React from 'react';
|
|
849
|
+
|
|
850
|
+
const INITIAL_NODES: TreeNodeData[] = [
|
|
851
|
+
{ key: '0', label: 'Documents', leaf: false },
|
|
852
|
+
{ key: '1', label: 'Pictures', leaf: false },
|
|
853
|
+
{ key: '2', label: 'Videos', leaf: false }
|
|
854
|
+
];
|
|
855
|
+
|
|
856
|
+
function fetchChildren(parent: TreeNodeData): Promise<TreeNodeData[]> {
|
|
857
|
+
return new Promise((resolve) => {
|
|
858
|
+
setTimeout(() => {
|
|
859
|
+
const depth = parent.key.split('-').length;
|
|
860
|
+
const leaf = depth >= 3;
|
|
861
|
+
|
|
862
|
+
resolve([
|
|
863
|
+
{ key: `${parent.key}-0`, label: leaf ? `${parent.label} - file.txt` : `${parent.label} / folder A`, leaf },
|
|
864
|
+
{ key: `${parent.key}-1`, label: leaf ? `${parent.label} - readme.md` : `${parent.label} / folder B`, leaf },
|
|
865
|
+
{ key: `${parent.key}-2`, label: `${parent.label} - notes.txt`, leaf: true }
|
|
866
|
+
]);
|
|
867
|
+
}, 800);
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function setChildren(list: TreeNodeData[], key: string, children: TreeNodeData[]): TreeNodeData[] {
|
|
872
|
+
return list.map((n) => {
|
|
873
|
+
if (n.key === key) return { ...n, children, loading: false };
|
|
874
|
+
if (n.children?.length) return { ...n, children: setChildren(n.children, key, children) };
|
|
875
|
+
|
|
876
|
+
return n;
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
function setLoading(list: TreeNodeData[], key: string, loading: boolean): TreeNodeData[] {
|
|
881
|
+
return list.map((n) => {
|
|
882
|
+
if (n.key === key) return { ...n, loading };
|
|
883
|
+
if (n.children?.length) return { ...n, children: setLoading(n.children, key, loading) };
|
|
884
|
+
|
|
885
|
+
return n;
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
export default function LazyDemo() {
|
|
890
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>(INITIAL_NODES);
|
|
891
|
+
|
|
892
|
+
const pendingRef = React.useRef<Set<string>>(new Set());
|
|
893
|
+
|
|
894
|
+
const onExpand = async (event: TreeRootExpandEvent) => {
|
|
895
|
+
const node = event.node;
|
|
896
|
+
|
|
897
|
+
if (node.children || pendingRef.current.has(node.key)) return;
|
|
898
|
+
|
|
899
|
+
pendingRef.current.add(node.key);
|
|
900
|
+
setNodes((prev) => setLoading(prev, node.key, true));
|
|
901
|
+
|
|
902
|
+
try {
|
|
903
|
+
const children = await fetchChildren(node);
|
|
904
|
+
|
|
905
|
+
setNodes((prev) => setChildren(prev, node.key, children));
|
|
906
|
+
} catch {
|
|
907
|
+
setNodes((prev) => setLoading(prev, node.key, false));
|
|
908
|
+
} finally {
|
|
909
|
+
pendingRef.current.delete(node.key);
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
|
|
913
|
+
return (
|
|
914
|
+
<Tree.Root value={nodes} onExpand={onExpand} className="w-full md:w-120">
|
|
915
|
+
<Tree.Nodes>
|
|
916
|
+
{({ node, loading, leaf, expanded }) => (
|
|
917
|
+
<Tree.Node uKey={node.key}>
|
|
918
|
+
<Tree.Content>
|
|
919
|
+
<Tree.Toggle>
|
|
920
|
+
{loading ? (
|
|
921
|
+
<Spinner className="animate-spin" />
|
|
922
|
+
) : (
|
|
923
|
+
<>
|
|
924
|
+
<Tree.ToggleIndicator match="expanded">
|
|
925
|
+
<ChevronDown />
|
|
926
|
+
</Tree.ToggleIndicator>
|
|
927
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
928
|
+
<ChevronRight />
|
|
929
|
+
</Tree.ToggleIndicator>
|
|
930
|
+
</>
|
|
931
|
+
)}
|
|
932
|
+
</Tree.Toggle>
|
|
933
|
+
{leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
|
|
934
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
935
|
+
</Tree.Content>
|
|
936
|
+
</Tree.Node>
|
|
937
|
+
)}
|
|
938
|
+
</Tree.Nodes>
|
|
939
|
+
</Tree.Root>
|
|
940
|
+
);
|
|
941
|
+
}
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
### Loading
|
|
945
|
+
|
|
946
|
+
#### Overlay
|
|
947
|
+
|
|
948
|
+
Setting the _loading_ property displays a mask over the tree. The mask content is provided through _Tree.Loading_.
|
|
949
|
+
|
|
950
|
+
```tsx
|
|
951
|
+
'use client';
|
|
952
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
953
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
954
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
955
|
+
import { File } from '@primeicons/react/file';
|
|
956
|
+
import { Folder } from '@primeicons/react/folder';
|
|
957
|
+
import { Refresh } from '@primeicons/react/refresh';
|
|
958
|
+
import { Spinner } from '@primeicons/react/spinner';
|
|
959
|
+
import { Button } from '@primereact/ui/button';
|
|
960
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
961
|
+
import * as React from 'react';
|
|
962
|
+
|
|
963
|
+
export default function LoadingOverlayDemo() {
|
|
964
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
965
|
+
const [loading, setLoading] = React.useState(false);
|
|
966
|
+
|
|
967
|
+
React.useEffect(() => {
|
|
968
|
+
NodeService.getTreeNodes().then(setNodes);
|
|
969
|
+
}, []);
|
|
970
|
+
|
|
971
|
+
const refresh = React.useCallback(() => {
|
|
972
|
+
setLoading(true);
|
|
973
|
+
setTimeout(async () => {
|
|
974
|
+
const data = await NodeService.getTreeNodes();
|
|
975
|
+
setNodes(data);
|
|
976
|
+
setLoading(false);
|
|
977
|
+
}, 1500);
|
|
978
|
+
}, []);
|
|
979
|
+
|
|
980
|
+
return (
|
|
981
|
+
<div className="w-full md:w-120 flex flex-col gap-3">
|
|
982
|
+
<Button size="small" onClick={refresh} disabled={loading} className="self-end">
|
|
983
|
+
<Refresh />
|
|
984
|
+
Refresh
|
|
985
|
+
</Button>
|
|
986
|
+
<Tree.Root value={nodes} loading={loading} defaultExpandedKeys={{ '0': true }}>
|
|
987
|
+
<Tree.Nodes>
|
|
988
|
+
{({ node, leaf }) => (
|
|
989
|
+
<Tree.Node uKey={node.key}>
|
|
990
|
+
<Tree.Content>
|
|
991
|
+
<Tree.Toggle>
|
|
992
|
+
<Tree.ToggleIndicator match="expanded">
|
|
993
|
+
<ChevronDown />
|
|
994
|
+
</Tree.ToggleIndicator>
|
|
995
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
996
|
+
<ChevronRight />
|
|
997
|
+
</Tree.ToggleIndicator>
|
|
998
|
+
</Tree.Toggle>
|
|
999
|
+
{leaf ? <File /> : <Folder />}
|
|
1000
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
1001
|
+
</Tree.Content>
|
|
1002
|
+
</Tree.Node>
|
|
1003
|
+
)}
|
|
1004
|
+
</Tree.Nodes>
|
|
1005
|
+
<Tree.Loading>
|
|
1006
|
+
<Spinner className="w-8! h-8! animate-spin text-primary" />
|
|
1007
|
+
</Tree.Loading>
|
|
1008
|
+
</Tree.Root>
|
|
1009
|
+
</div>
|
|
1010
|
+
);
|
|
1011
|
+
}
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
#### Skeleton
|
|
1015
|
+
|
|
1016
|
+
Placeholder _Skeleton_ primitives are rendered inside _Tree.Content_ while the dataset loads.
|
|
1017
|
+
|
|
1018
|
+
```tsx
|
|
1019
|
+
'use client';
|
|
1020
|
+
import { NodeService } from '@/shared/services/node.service';
|
|
1021
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
1022
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
1023
|
+
import { File } from '@primeicons/react/file';
|
|
1024
|
+
import { Folder } from '@primeicons/react/folder';
|
|
1025
|
+
import { Refresh } from '@primeicons/react/refresh';
|
|
1026
|
+
import { Button } from '@primereact/ui/button';
|
|
1027
|
+
import { Skeleton } from '@primereact/ui/skeleton';
|
|
1028
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
1029
|
+
import * as React from 'react';
|
|
1030
|
+
|
|
1031
|
+
const PLACEHOLDERS: TreeNodeData[] = Array.from({ length: 6 }, (_, i) => ({
|
|
1032
|
+
key: `skeleton-${i}`,
|
|
1033
|
+
label: '',
|
|
1034
|
+
leaf: true
|
|
1035
|
+
}));
|
|
1036
|
+
|
|
1037
|
+
export default function LoadingSkeletonDemo() {
|
|
1038
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
1039
|
+
const [loading, setLoading] = React.useState(true);
|
|
1040
|
+
|
|
1041
|
+
const refresh = React.useCallback(() => {
|
|
1042
|
+
setLoading(true);
|
|
1043
|
+
setTimeout(async () => {
|
|
1044
|
+
const data = await NodeService.getTreeNodes();
|
|
1045
|
+
setNodes(data);
|
|
1046
|
+
setLoading(false);
|
|
1047
|
+
}, 1500);
|
|
1048
|
+
}, []);
|
|
1049
|
+
|
|
1050
|
+
React.useEffect(() => {
|
|
1051
|
+
refresh();
|
|
1052
|
+
}, [refresh]);
|
|
1053
|
+
|
|
1054
|
+
return (
|
|
1055
|
+
<div className="w-full md:w-120 flex flex-col gap-3">
|
|
1056
|
+
<Button size="small" onClick={refresh} disabled={loading} className="self-end">
|
|
1057
|
+
<Refresh />
|
|
1058
|
+
Refresh
|
|
1059
|
+
</Button>
|
|
1060
|
+
<Tree.Root value={loading ? PLACEHOLDERS : nodes} defaultExpandedKeys={{ '0': true }}>
|
|
1061
|
+
<Tree.Nodes>
|
|
1062
|
+
{({ node, leaf }) =>
|
|
1063
|
+
loading ? (
|
|
1064
|
+
<Tree.Node uKey={node.key}>
|
|
1065
|
+
<Tree.Content>
|
|
1066
|
+
<Skeleton shape="circle" size="1rem" />
|
|
1067
|
+
<Skeleton width="40%" height="0.75rem" borderRadius="4px" />
|
|
1068
|
+
</Tree.Content>
|
|
1069
|
+
</Tree.Node>
|
|
1070
|
+
) : (
|
|
1071
|
+
<Tree.Node uKey={node.key}>
|
|
1072
|
+
<Tree.Content>
|
|
1073
|
+
<Tree.Toggle>
|
|
1074
|
+
<Tree.ToggleIndicator match="expanded">
|
|
1075
|
+
<ChevronDown />
|
|
1076
|
+
</Tree.ToggleIndicator>
|
|
1077
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
1078
|
+
<ChevronRight />
|
|
1079
|
+
</Tree.ToggleIndicator>
|
|
1080
|
+
</Tree.Toggle>
|
|
1081
|
+
{leaf ? <File /> : <Folder />}
|
|
1082
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
1083
|
+
</Tree.Content>
|
|
1084
|
+
</Tree.Node>
|
|
1085
|
+
)
|
|
1086
|
+
}
|
|
1087
|
+
</Tree.Nodes>
|
|
1088
|
+
</Tree.Root>
|
|
1089
|
+
</div>
|
|
1090
|
+
);
|
|
1091
|
+
}
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
### Empty
|
|
1095
|
+
|
|
1096
|
+
When _value_ is empty, _Tree.Empty_ is rendered in place of the rows.
|
|
1097
|
+
|
|
1098
|
+
```tsx
|
|
1099
|
+
'use client';
|
|
1100
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
1101
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
1102
|
+
import { Folder } from '@primeicons/react/folder';
|
|
1103
|
+
import { Plus } from '@primeicons/react/plus';
|
|
1104
|
+
import { Button } from '@primereact/ui/button';
|
|
1105
|
+
import { Tree, type TreeNodeData } from '@primereact/ui/tree';
|
|
1106
|
+
import * as React from 'react';
|
|
1107
|
+
|
|
1108
|
+
export default function EmptyDemo() {
|
|
1109
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
|
|
1110
|
+
|
|
1111
|
+
const addNode = () => {
|
|
1112
|
+
const next: TreeNodeData = { key: `root-${nodes.length}`, label: `New Folder ${nodes.length + 1}` };
|
|
1113
|
+
setNodes((prev) => [...prev, next]);
|
|
1114
|
+
};
|
|
1115
|
+
|
|
1116
|
+
return (
|
|
1117
|
+
<Tree.Root value={nodes} className="w-full md:w-120">
|
|
1118
|
+
<Tree.Nodes>
|
|
1119
|
+
{({ node }) => (
|
|
1120
|
+
<Tree.Node uKey={node.key}>
|
|
1121
|
+
<Tree.Content>
|
|
1122
|
+
<Tree.Toggle>
|
|
1123
|
+
<Tree.ToggleIndicator match="expanded">
|
|
1124
|
+
<ChevronDown />
|
|
1125
|
+
</Tree.ToggleIndicator>
|
|
1126
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
1127
|
+
<ChevronRight />
|
|
1128
|
+
</Tree.ToggleIndicator>
|
|
1129
|
+
</Tree.Toggle>
|
|
1130
|
+
<Folder />
|
|
1131
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
1132
|
+
</Tree.Content>
|
|
1133
|
+
</Tree.Node>
|
|
1134
|
+
)}
|
|
1135
|
+
</Tree.Nodes>
|
|
1136
|
+
<Tree.Empty>
|
|
1137
|
+
<div className="flex flex-col items-center justify-center gap-3 py-10 text-center">
|
|
1138
|
+
<div className="w-14 h-14 rounded-full bg-surface-100 dark:bg-surface-800 flex items-center justify-center">
|
|
1139
|
+
<Folder className="w-7 h-7 text-surface-400 dark:text-surface-500" />
|
|
1140
|
+
</div>
|
|
1141
|
+
<div>
|
|
1142
|
+
<p className="m-0 font-semibold text-surface-900 dark:text-surface-0">No folders yet</p>
|
|
1143
|
+
<p className="mt-1 text-sm text-surface-500 dark:text-surface-400">Create your first folder to start building a tree.</p>
|
|
1144
|
+
</div>
|
|
1145
|
+
<Button size="small" onClick={addNode}>
|
|
1146
|
+
<Plus />
|
|
1147
|
+
New Folder
|
|
1148
|
+
</Button>
|
|
1149
|
+
</div>
|
|
1150
|
+
</Tree.Empty>
|
|
1151
|
+
</Tree.Root>
|
|
1152
|
+
);
|
|
1153
|
+
}
|
|
1154
|
+
```
|
|
1155
|
+
|
|
1156
|
+
### Drag and Drop
|
|
1157
|
+
|
|
1158
|
+
#### Single
|
|
1159
|
+
|
|
1160
|
+
Nodes can be reordered within a tree by setting _draggable_ and _droppable_. The _onMove_ callback receives the updated tree value along with _dragNode_, _dropNode_, _dropIndex_ and _dropPosition_. Drop targets render _Tree.DropIndicator_ with _position="before"_ and _position="after"_ around _Tree.Content_.
|
|
1161
|
+
|
|
1162
|
+
```tsx
|
|
1163
|
+
'use client';
|
|
1164
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
1165
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
1166
|
+
import { Tree, type TreeNodeData, type TreeRootMoveEvent } from '@primereact/ui/tree';
|
|
1167
|
+
import * as React from 'react';
|
|
1168
|
+
|
|
1169
|
+
const INITIAL: TreeNodeData[] = [
|
|
1170
|
+
{
|
|
1171
|
+
key: '0',
|
|
1172
|
+
label: 'app',
|
|
1173
|
+
children: [
|
|
1174
|
+
{
|
|
1175
|
+
key: '0-0',
|
|
1176
|
+
label: 'api',
|
|
1177
|
+
children: [{ key: '0-0-0', label: 'route.ts' }]
|
|
1178
|
+
},
|
|
1179
|
+
{ key: '0-1', label: 'layout.tsx' },
|
|
1180
|
+
{ key: '0-2', label: 'page.tsx' }
|
|
1181
|
+
]
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
key: '1',
|
|
1185
|
+
label: 'components',
|
|
1186
|
+
children: [
|
|
1187
|
+
{ key: '1-0', label: 'Header.tsx' },
|
|
1188
|
+
{ key: '1-1', label: 'Footer.tsx' }
|
|
1189
|
+
]
|
|
1190
|
+
},
|
|
1191
|
+
{ key: '2', label: 'package.json' },
|
|
1192
|
+
{ key: '3', label: 'README.md' }
|
|
1193
|
+
];
|
|
1194
|
+
|
|
1195
|
+
export default function DragDropSingleDemo() {
|
|
1196
|
+
const [nodes, setNodes] = React.useState<TreeNodeData[]>(INITIAL);
|
|
1197
|
+
|
|
1198
|
+
return (
|
|
1199
|
+
<Tree.Root
|
|
1200
|
+
value={nodes}
|
|
1201
|
+
draggable
|
|
1202
|
+
droppable
|
|
1203
|
+
onMove={(e: TreeRootMoveEvent) => setNodes(e.value)}
|
|
1204
|
+
defaultExpandedKeys={{ '0': true, '1': true }}
|
|
1205
|
+
className="w-full md:w-120"
|
|
1206
|
+
>
|
|
1207
|
+
<Tree.Nodes>
|
|
1208
|
+
{({ node }) => (
|
|
1209
|
+
<Tree.Node uKey={node.key}>
|
|
1210
|
+
<Tree.DropIndicator position="before" />
|
|
1211
|
+
<Tree.Content>
|
|
1212
|
+
<Tree.Toggle>
|
|
1213
|
+
<Tree.ToggleIndicator match="expanded">
|
|
1214
|
+
<ChevronDown />
|
|
1215
|
+
</Tree.ToggleIndicator>
|
|
1216
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
1217
|
+
<ChevronRight />
|
|
1218
|
+
</Tree.ToggleIndicator>
|
|
1219
|
+
</Tree.Toggle>
|
|
1220
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
1221
|
+
</Tree.Content>
|
|
1222
|
+
<Tree.DropIndicator position="after" />
|
|
1223
|
+
</Tree.Node>
|
|
1224
|
+
)}
|
|
1225
|
+
</Tree.Nodes>
|
|
1226
|
+
</Tree.Root>
|
|
1227
|
+
);
|
|
1228
|
+
}
|
|
1229
|
+
```
|
|
1230
|
+
|
|
1231
|
+
#### Multiple
|
|
1232
|
+
|
|
1233
|
+
Nodes can be transferred between trees with _draggableScope_ and _droppableScope_. The _draggableScope_ tags the nodes that leave a tree; _droppableScope_ declares which scopes a tree accepts. Both accept a string or an array of strings.
|
|
1234
|
+
|
|
1235
|
+
```tsx
|
|
1236
|
+
'use client';
|
|
1237
|
+
import { ChevronDown } from '@primeicons/react/chevron-down';
|
|
1238
|
+
import { ChevronRight } from '@primeicons/react/chevron-right';
|
|
1239
|
+
import { Tree, type TreeNodeData, type TreeRootMoveEvent } from '@primereact/ui/tree';
|
|
1240
|
+
import * as React from 'react';
|
|
1241
|
+
|
|
1242
|
+
const INITIAL_A: TreeNodeData[] = [
|
|
1243
|
+
{
|
|
1244
|
+
key: '0',
|
|
1245
|
+
label: 'app',
|
|
1246
|
+
children: [
|
|
1247
|
+
{ key: '0-0', label: 'api', children: [{ key: '0-0-0', label: 'route.ts' }] },
|
|
1248
|
+
{ key: '0-1', label: 'layout.tsx' },
|
|
1249
|
+
{ key: '0-2', label: 'page.tsx' }
|
|
1250
|
+
]
|
|
1251
|
+
},
|
|
1252
|
+
{
|
|
1253
|
+
key: '1',
|
|
1254
|
+
label: 'components',
|
|
1255
|
+
children: [
|
|
1256
|
+
{ key: '1-0', label: 'Header.tsx' },
|
|
1257
|
+
{ key: '1-1', label: 'Footer.tsx' }
|
|
1258
|
+
]
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
key: '2',
|
|
1262
|
+
label: 'public',
|
|
1263
|
+
children: [{ key: '2-0', label: 'favicon.ico' }]
|
|
1264
|
+
},
|
|
1265
|
+
{ key: '3', label: '.env.local' },
|
|
1266
|
+
{ key: '4', label: 'next.config.js' },
|
|
1267
|
+
{ key: '5', label: 'package.json' },
|
|
1268
|
+
{ key: '6', label: 'README.md' }
|
|
1269
|
+
];
|
|
1270
|
+
|
|
1271
|
+
const INITIAL_B: TreeNodeData[] = [{ key: 'etc', label: '/etc' }];
|
|
1272
|
+
|
|
1273
|
+
function renderNode({ node }: { node: TreeNodeData }) {
|
|
1274
|
+
return (
|
|
1275
|
+
<Tree.Node uKey={node.key}>
|
|
1276
|
+
<Tree.Content>
|
|
1277
|
+
<Tree.Toggle>
|
|
1278
|
+
<Tree.ToggleIndicator match="expanded">
|
|
1279
|
+
<ChevronDown />
|
|
1280
|
+
</Tree.ToggleIndicator>
|
|
1281
|
+
<Tree.ToggleIndicator match="collapsed">
|
|
1282
|
+
<ChevronRight />
|
|
1283
|
+
</Tree.ToggleIndicator>
|
|
1284
|
+
</Tree.Toggle>
|
|
1285
|
+
<Tree.Label>{node.label}</Tree.Label>
|
|
1286
|
+
</Tree.Content>
|
|
1287
|
+
</Tree.Node>
|
|
1288
|
+
);
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
export default function DragDropMultipleDemo() {
|
|
1292
|
+
const [a, setA] = React.useState<TreeNodeData[]>(INITIAL_A);
|
|
1293
|
+
const [b, setB] = React.useState<TreeNodeData[]>(INITIAL_B);
|
|
1294
|
+
const [c, setC] = React.useState<TreeNodeData[]>([]);
|
|
1295
|
+
|
|
1296
|
+
return (
|
|
1297
|
+
<div className="flex flex-col md:flex-row gap-4">
|
|
1298
|
+
<Tree.Root
|
|
1299
|
+
value={a}
|
|
1300
|
+
draggable
|
|
1301
|
+
droppable
|
|
1302
|
+
draggableScope="first"
|
|
1303
|
+
droppableScope="none"
|
|
1304
|
+
onMove={(e: TreeRootMoveEvent) => setA(e.value)}
|
|
1305
|
+
defaultExpandedKeys={{ '0': true }}
|
|
1306
|
+
className="flex-1 border border-surface rounded-lg p-2"
|
|
1307
|
+
>
|
|
1308
|
+
<Tree.Nodes>{renderNode}</Tree.Nodes>
|
|
1309
|
+
</Tree.Root>
|
|
1310
|
+
<Tree.Root
|
|
1311
|
+
value={b}
|
|
1312
|
+
draggable
|
|
1313
|
+
droppable
|
|
1314
|
+
draggableScope="second"
|
|
1315
|
+
droppableScope="first"
|
|
1316
|
+
onMove={(e: TreeRootMoveEvent) => setB(e.value)}
|
|
1317
|
+
className="flex-1 border border-surface rounded-lg p-2"
|
|
1318
|
+
>
|
|
1319
|
+
<Tree.Nodes>{renderNode}</Tree.Nodes>
|
|
1320
|
+
</Tree.Root>
|
|
1321
|
+
<Tree.Root
|
|
1322
|
+
value={c}
|
|
1323
|
+
droppable
|
|
1324
|
+
droppableScope={['first', 'second']}
|
|
1325
|
+
onMove={(e: TreeRootMoveEvent) => setC(e.value)}
|
|
1326
|
+
className="flex-1 border border-surface rounded-lg p-2 min-h-40"
|
|
1327
|
+
>
|
|
1328
|
+
<Tree.Nodes>{renderNode}</Tree.Nodes>
|
|
1329
|
+
<Tree.Empty className="text-center text-sm text-surface-500 py-12">Drop here</Tree.Empty>
|
|
1330
|
+
</Tree.Root>
|
|
1331
|
+
</div>
|
|
1332
|
+
);
|
|
1333
|
+
}
|
|
1334
|
+
```
|
|
1335
|
+
|
|
1336
|
+
## Related
|
|
1337
|
+
|
|
1338
|
+
### Sub-Components
|
|
1339
|
+
|
|
1340
|
+
See the [Primitive API](/docs/primitive/components/tree#api) for _Tree.Root_, _Tree.Nodes_, _Tree.Node_, _Tree.Content_, _Tree.Toggle_, _Tree.ToggleIndicator_, _Tree.Selection_, _Tree.DropIndicator_, _Tree.Label_, _Tree.Filter_, _Tree.Header_, _Tree.Footer_, _Tree.Empty_ and _Tree.Loading_.
|
|
1341
|
+
|
|
1342
|
+
### Hooks
|
|
1343
|
+
|
|
1344
|
+
See the [Headless API](/docs/headless/components/tree#api) for _useTree_ and _useTreeNode_.
|
|
1345
|
+
|
|
1346
|
+
### Accessibility
|
|
1347
|
+
|
|
1348
|
+
See [Tree Primitive](/docs/primitive/components/tree#accessibility) for WAI-ARIA compliance details and keyboard support.
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
# Tree Theming
|
|
1352
|
+
|
|
1353
|
+
Theming documentation for Tree component
|
|
1354
|
+
|
|
1355
|
+
## Styled
|
|
1356
|
+
|
|
1357
|
+
### CSS Classes
|
|
1358
|
+
|
|
1359
|
+
The class names emitted in styled mode:
|
|
1360
|
+
|
|
1361
|
+
<DocTable name="Tree" category="style" />
|
|
1362
|
+
|
|
1363
|
+
### Design Tokens
|
|
1364
|
+
|
|
1365
|
+
The design tokens Tree reads:
|
|
1366
|
+
|
|
1367
|
+
<DocTable name="Tree" category="token" />
|
|
1368
|
+
|
|
1369
|
+
## Unstyled
|
|
1370
|
+
|
|
1371
|
+
In unstyled mode there are no built-in classes. Style each part through the pass-through (`pt`) prop.
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
## Theming
|
|
1375
|
+
|
|
1376
|
+
### CSS Classes
|
|
1377
|
+
|
|
1378
|
+
List of class names used in the styled mode.
|
|
1379
|
+
|
|
1380
|
+
<DocTable name="Tree" category="style" />
|
|
1381
|
+
|
|
1382
|
+
### Design Tokens
|
|
1383
|
+
|
|
1384
|
+
List of design tokens.
|
|
1385
|
+
|
|
1386
|
+
<DocTable name="Tree" category="token" />
|