diff --git a/changelog.md b/changelog.md
index e67d3332..b916ac44 100644
--- a/changelog.md
+++ b/changelog.md
@@ -13,7 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Table to display all secrets.
* Add action to create a secret.
* Add action to edit a secret.
- * Add action to remove a secret.
+ * Add action to remove a secret.
+ * Add actions and card to create/edit/delete a generic or custom configuration.
## [1.0.0] - 2024/10/15
diff --git a/package.json b/package.json
index af0b201f..1cf9f363 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"dependencies": {
"@quasar/extras": "=1.16.11",
"axios": "=1.7.2",
+ "nunjucks": "=3.2.4",
"pinia": "=2.1.7",
"quasar": "=2.16.4",
"v-viewer": "=3.0.13",
@@ -47,7 +48,6 @@
"eslint-plugin-vue": "=9.26.0",
"gherkin-lint": "=4.2.4",
"jsdoc": "=4.0.3",
- "nunjucks": "=3.2.4",
"vitest": "=1.6.0"
},
"engines": {
diff --git a/src/components/card/CustomAIConfigurationCard.vue b/src/components/card/CustomAIConfigurationCard.vue
new file mode 100644
index 00000000..ad32750b
--- /dev/null
+++ b/src/components/card/CustomAIConfigurationCard.vue
@@ -0,0 +1,270 @@
+
+
+
+ {{ $t('CustomAIConfigurationCard.text.title', { handler }) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/card/DefaultAIConfigurationCard.vue b/src/components/card/DefaultAIConfigurationCard.vue
new file mode 100644
index 00000000..db41b3bf
--- /dev/null
+++ b/src/components/card/DefaultAIConfigurationCard.vue
@@ -0,0 +1,265 @@
+
+
+
+ {{ $t('DefaultAIConfigurationCard.text.title') }}
+
+
+
+ {{ $t('DefaultAIConfigurationCard.text.addPlugin') }}
+
+
+
+
+
+
+
+ {{ opt }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('DefaultAIConfigurationCard.text.editPlugin') }}
+
+
+
+
+
+
+ {{ opt }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tab-panel/ConfigurationsTabPanel.vue b/src/components/tab-panel/ConfigurationsTabPanel.vue
index e50aaff7..bfce1ca5 100644
--- a/src/components/tab-panel/ConfigurationsTabPanel.vue
+++ b/src/components/tab-panel/ConfigurationsTabPanel.vue
@@ -3,11 +3,117 @@
name="configurations"
data-cy="configurations_tab_panel"
>
+
+
{{ $t('ConfigurationsTabPanel.text.title') }}
+
+
+
+
+
+
+
+
diff --git a/src/composables/events/ReloadConfigurationsEvent.js b/src/composables/events/ReloadConfigurationsEvent.js
new file mode 100644
index 00000000..238703d2
--- /dev/null
+++ b/src/composables/events/ReloadConfigurationsEvent.js
@@ -0,0 +1,10 @@
+import { Subject } from 'rxjs';
+
+/**
+ * Represent a rxjs Event object to emit and to receive events to force reloading
+ * the configurations.
+ * @typedef {Subject} ReloadConfigurationsEvent
+ */
+const ReloadConfigurationsEvent = new Subject();
+
+export default ReloadConfigurationsEvent;
diff --git a/src/i18n/en-US/index.js b/src/i18n/en-US/index.js
index b4aca51e..26c03cd6 100644
--- a/src/i18n/en-US/index.js
+++ b/src/i18n/en-US/index.js
@@ -643,6 +643,37 @@ export default {
warning: 'fa-solid fa-triangle-exclamation',
},
},
+ DefaultAIConfigurationCard: {
+ text: {
+ title: 'Global configuration',
+ addPlugin: 'Add AI model for a new plugin',
+ editPlugin: 'Update AI model for existing plugin',
+ newPluginNameLabel: 'Plugin name',
+ newPluginNameHint: '"default" for all unlisted plugin',
+ newPluginHandler: 'Select AI model for plugin',
+ save: 'Save',
+ update: 'Update',
+ notEmpty: 'Field is required.',
+ notifyDeleteSuccess: 'Configuration is deleted.',
+ notifySaveSuccess: 'Configuration is added.',
+ notifyUpdateSuccess: 'Configuration(s) is updated.',
+ },
+ icon: {
+ delete: 'fa-solid fa-trash',
+ },
+ },
+ CustomAIConfigurationCard: {
+ text: {
+ title: 'AI configuration: {handler}',
+ pluginTitle: 'Plugin configuration: { plugin }',
+ save: 'Save',
+ notEmpty: 'Field is required.',
+ notifySaveSuccess: 'Configuration is saved.',
+ },
+ icon: {
+ delete: 'fa-solid fa-trash',
+ },
+ },
TablePaginationCard: {
text: {
content: '{current}/{max} of {total}',
diff --git a/src/services/ConfigurationService.js b/src/services/ConfigurationService.js
new file mode 100644
index 00000000..f96cfe1f
--- /dev/null
+++ b/src/services/ConfigurationService.js
@@ -0,0 +1,92 @@
+import {
+ prepareQueryParameters,
+ prepareRequest,
+ makeFilterRequest,
+} from 'boot/axios';
+
+/**
+ * Get all configurations paginated.
+ * @param {object} filters - API filters.
+ * @returns {Promise