.. _declarative_settings_section:

====================
Declarative Settings
====================

Starting from Nextcloud **29**, AppAPI provides the ability to display ex-application settings.
When admin or user changes some ex-app settings
they will be stored in the database and can be received using :doc:`preferences` or :doc:`appconfig` API.

.. note::

	Settings rendered only for enabled ExApps.

.. warning::

	``section_id`` from **scheme** should be already registered by any PHP application.

	**AppAPI** provides two sections for that: ``ai_integration_team`` and ``declarative_settings``, you can use them.

Register Settings
^^^^^^^^^^^^^^^^^

OCS endpoint: ``POST /apps/app_api/api/v1/ui/settings``

Params
******

Complete list of params (including optional):

.. code-block:: json

	{
		"formScheme": "settings scheme"
	}

Unregister Menu Entry
^^^^^^^^^^^^^^^^^^^^^

OCS endpoint: ``DELETE /apps/app_api/api/v1/ui/settings``

Params
******

.. code-block:: json

	{
		"formId": "formId from scheme"
	}

Example of settings scheme in Python:

.. code-block:: python

	{
		"id": "settings_example",
		"priority": 10,
		"section_type": "admin",
		"section_id": "ai_integration_team",
		"title": "AppAPI declarative settings",
		"description": "These fields are rendered dynamically from declarative schema",
		"fields": [
			{
				"id": "field1",
				"title": "Multi-selection",
				"description": "Select some option setting",
				"type": 'multi-select',
				"options": ["foo", "bar", "baz"],
				"placeholder": "Select some multiple options",
				"default": ["foo", "bar"],
			},
			{
				"id": "some_real_setting",
				'title': 'Choose init status check background job interval',
				'description': 'How often AppAPI should check for initialization status',
				'type': 'radio',
				'placeholder': 'Choose init status check background job interval',
				'default': '40m',
				'options': [
					{
						'name': 'Each 40 minutes',
						'value': '40m',
					},
					{
						'name': 'Each 60 minutes',
						'value': '60m',
					},
					{
						'name': 'Each 120 minutes',
						'value': '120m',
					},
					{
						'name': 'Each day',
						'value': f"{60 * 24}m",
					},
				],
			},
			{
				'id': 'test_ex_app_field_1',
				'title': 'Default text field',
				'description': 'Set some simple text setting',
				'type': 'text',
				'placeholder': 'Enter text setting',
				'default': 'foo',
			},
			{
				'id': 'test_ex_app_field_1_1',
				'title': 'Email field',
				'description': 'Set email config',
				'type': 'email',
				'placeholder': 'Enter email',
				'default': '',
			},
			{
				'id': 'test_ex_app_field_1_2',
				'title': 'Tel field',
				'description': 'Set tel config',
				'type': 'tel',
				'placeholder': 'Enter your tel',
				'default': '',
			},
			{
				'id': 'test_ex_app_field_1_3',
				'title': 'Url (website) field',
				'description': 'Set url config',
				'type': url',
				'placeholder': 'Enter url',
				'default': '',
			},
			{
				'id': 'test_ex_app_field_1_4',
				'title': 'Number field',
				'description': 'Set number config',
				'type': 'number',
				'placeholder': 'Enter number value',
				'default': 0,
			},
			{
				'id': 'test_ex_app_field_2',
				'title': 'Password',
				'description': 'Set some secure value setting',
				'type': password',
				'placeholder': 'Set secure value',
				'default': '',
			},
			{
				'id': 'test_ex_app_field_3',
				'title': 'Selection',
				'description': 'Select some option setting',
				'type': 'select',
				'options': ['foo', 'bar', 'baz'],
				'placeholder': 'Select some option setting',
				'default': 'foo',
			},
			{
				'id': 'test_ex_app_field_4',
				'title': 'Toggle something',
				'description': 'Select checkbox option setting',
				'type': 'checkbox',
				'label': 'Verify something if enabled',
				'default': False,
			},
			{
				'id': 'test_ex_app_field_5',
				'title': 'Multiple checkbox toggles, describing one setting, checked options are saved as an JSON object {foo: true, bar: false}',
				'description': 'Select checkbox option setting',
				'type': 'multi-checkbox',
				'default': {'foo': True, 'bar': True},
				'options': [
					{
						'name':'Foo',
						'value': 'foo',
					},
					{
						'name': 'Bar',
						'value': 'bar',
					},
					{
						'name': 'Baz',
						'value': 'baz',
					},
					{
						'name': 'Qux',
						'value': 'qux',
					},
				],
			},
			{
				'id': 'test_ex_app_field_6',
				'title': 'Radio toggles, describing one setting like single select',
				'description': 'Select radio option setting',
				'type': 'radio',
				'label': 'Select single toggle',
				'default': 'foo',
				'options': [
					{
						'name': 'First radio',
						'value': 'foo'
					},
					{
						'name': 'Second radio',
						'value': 'bar'
					},
					{
						'name': 'Second radio',
						'value': 'baz'
					},
				],
			},
		]
	}
