.. _faq: Frequent Asked Questions ======================== How to change the Supvisors Web UI ? ------------------------------------ If the user is considering structural updates of the |Supvisors| Web UI, such as: * adding/removing information, * changing the ``XHTML`` elements structure, * adding ``Javascript`` code, the recommended way to proceed is obviously to work on a fork and update the ``XHTML``, ``CSS`` and ``Python`` code as needed. However, if the updates under consideration are involving ``CSS`` only, such as: * updating resources (colors, fonts, font sizes, bitmaps), * updating object feedbacks (hover, active, focus), * reorganizing HTML elements (``div`` sizes and positions), * hiding some existing parts, the following hint will provide a way to do it without updating |Supvisors|, based on a simple bootstrap and monkeypatch. Every Supvisors ``XHTML`` page include a style instruction that can be used to inject user ``CSS`` by code. It is placed after the inclusion of all ``CSS`` files, so that the user ``CSS`` may overwrite anything. .. code-block:: html The bootstrap consists in inserting some user code between the |Supervisor| plugin factory and the |Supvisors| plugin creation. The code will create the |Supvisors| plugin and monkeypatch the ``ViewHandler.write_style`` method, so that the style instruction above is filled with ``CSS`` instructions that can be hardcoded as shown below or simply read from a file. .. code-block:: python from supvisors.plugin import make_supvisors_rpcinterface from supvisors.web.viewhandler import ViewHandler USER_CSS = """ div { background-color: black; } """ def write_style(self, root): """ Insert additional CSS instructions into the pages. """ root.findmeld('style_mid').content(USER_CSS) def make_user_rpcinterface(supervisord, **config): """ Create the Supvisors plugin and monkeypatch the write_style method. """ intf = make_supvisors_rpcinterface(supervisord, **config) ViewHandler.write_style = write_style return inf Finally, in the |Supervisor| configuration file, the |Supvisors| plugin has to be configured using the bootstrap instead of the |Supvisors| usual function. .. code-block:: ini [rpcinterface:supvisors] ;supervisor.rpcinterface_factory = supvisors.plugin:make_supvisors_rpcinterface supervisor.rpcinterface_factory = :make_user_rpcinterface .. important:: Before starting the |Supervisor| daemon, ensure that the bootstrap is visible in the :command:`Python` context. It can be part of an installed :command:`Python` package or just set in the ``PYTHONPATH`` environment variable. .. code-block:: bash [bash] > export PYTHONPATH=:${PYTHONPATH} [bash] > supervisord .. include:: common.rst