
.. include:: /Includes.rst.txt

.. _feature-76108:

=============================================================
Feature: #76108 - Replace ExtJS category tree with D3 and SVG
=============================================================

See :issue:`76108`

Description
===========

The Backend ExtJS category tree (renderType `selectTree`) has been replaced with one based on D3.js_ and SVG.
Tree implements a 'virtual scroll' pattern, meaning that it renders only as many nodes as fit in the viewport.

.. _D3.js: https://d3js.org/

Additionally the tree now display icon overlay (e.g. for disabled categories).

Structure
---------

There are three RequireJS modules:

- SvgTree.js - this is a base JS object able to render a SVG based tree. It can expand and collapse child nodes, render icons for each node, and keep track of the select nodes.
- SelectTree.js - extends the SvgTree object (prototype inheritance) with checkboxes
- SvgTreeToolbar.js - toolbar for SvgTree which allows to search, collapse all and expand all tree nodes

Visual Scroll
-------------

SvgTree renders only as many nodes as fit in the wrapping container. This requires that the wrapping container has a fixed height set.
So e.g. if one node takes 20px height, and the wrapper has 200px, only 10 nodes will be rendered at the time.

Data binding
------------

Thanks to D3, each SVG node representing tree item is bound to the data object. The general idea is that all operations (like showing/hiding/selecting...) are first performed on the dataset, and then the view (SVG) is refreshed.
In the :js:`initialize` function SvgTree loads the whole tree as json


Impact
======

- New tree is faster.
- A new 'indeterminate' state for the category has been introduced introduced. The category is in the  'indeterminate'  state if at last one of its descendants  is selected (checked).
- Tree data is not rendered inline in HTML any more but fetched via Ajax

.. index:: JavaScript, Backend
