Introduce the full UI layer for creating, editing, and assigning custom
variables (DirectorProperties) to Icinga objects:
- CustomvarController: CRUD for global custom variable definitions
- VariablesController: per-object variable assignment
- HostController: host-specific dictionary member management
- SuggestionsController: datalist suggestions with PostgreSQL support
- CustomVariableForm / CustomVariablesForm / DeleteCustomVariableForm:
forms for managing variables on objects with multipart update support
- DictionaryElements (Dictionary, DictionaryItem, NestedDictionary,
NestedDictionaryItem): composable form elements for structured types
- ArrayElement, IplBoolean: new reusable form elements
- DatalistEntryValidator: validates datalist-constrained variable values
- ObjectController: fetchNestedDictionaryKeys, multipart reload handling
- IcingaObjectHandler (REST API): expose and accept structured custom
variables in PUT/POST requests; support PostgreSQL UUID binaries
- ObjectTabs: add Variables tab to all object types
- CSS / JS: styles for item lists, action lists, custom variable forms,
and host-service deactivation; JS fix for multipart form reloads
- configuration.php: register new routes and the Custom Variables dashlet