diff --git a/DSL/Resql/users/POST/get-customer-support-activity-by-id-code.sql b/DSL/Resql/users/POST/get-customer-support-activity-by-id-code.sql new file mode 100644 index 0000000..b8f2438 --- /dev/null +++ b/DSL/Resql/users/POST/get-customer-support-activity-by-id-code.sql @@ -0,0 +1,4 @@ +SELECT id_code, active, status, status_comment +FROM customer_support_agent_activity +WHERE id_code = :customerSupportId + AND id IN (SELECT max(id) FROM customer_support_agent_activity WHERE id_code = :customerSupportId) diff --git a/DSL/Resql/users/POST/get-user-domains.sql b/DSL/Resql/users/POST/get-user-domains.sql new file mode 100644 index 0000000..b8b42cc --- /dev/null +++ b/DSL/Resql/users/POST/get-user-domains.sql @@ -0,0 +1,7 @@ +SELECT DISTINCT ON (user_login) + user_login, + domain_id AS domains, + selected_domains as selected +FROM user_widget_domains +WHERE user_login = :user_login +ORDER BY user_login, created DESC \ No newline at end of file diff --git a/DSL/Resql/users/POST/get-user-profile-settings.sql b/DSL/Resql/users/POST/get-user-profile-settings.sql new file mode 100644 index 0000000..2da6ef6 --- /dev/null +++ b/DSL/Resql/users/POST/get-user-profile-settings.sql @@ -0,0 +1,13 @@ +SELECT + user_id, + forwarded_chat_popup_notifications, + forwarded_chat_sound_notifications, + forwarded_chat_email_notifications, + new_chat_popup_notifications, + new_chat_sound_notifications, + new_chat_email_notifications, + use_autocorrect +FROM user_profile_settings +WHERE user_id=:userId +ORDER BY id DESC +LIMIT 1; diff --git a/DSL/Resql/users/POST/get-widget-domains.sql b/DSL/Resql/users/POST/get-widget-domains.sql new file mode 100644 index 0000000..432b8b2 --- /dev/null +++ b/DSL/Resql/users/POST/get-widget-domains.sql @@ -0,0 +1,17 @@ +SELECT name, + url, + domain_id, + active +FROM ( + SELECT DISTINCT ON (domain_id) + name, + url, + domain_id, + active + FROM widget_domains + ORDER BY + domain_id, + created DESC, + id DESC + ) AS latest_per_domain +WHERE active = TRUE; \ No newline at end of file diff --git a/DSL/Ruuter/ckb/GET/accounts/customer-support-activity.yml b/DSL/Ruuter/ckb/GET/accounts/customer-support-activity.yml new file mode 100644 index 0000000..42d7137 --- /dev/null +++ b/DSL/Ruuter/ckb/GET/accounts/customer-support-activity.yml @@ -0,0 +1,52 @@ +declaration: + call: declare + version: 0.1 + description: "Decription placeholder for 'CUSTOMER-SUPPORT-ACTIVITY'" + method: get + accepts: json + returns: json + namespace: backoffice + allowlist: + header: + - field: cookie + type: string + description: "Cookie field" + +get_user_info: + call: http.post + args: + url: "[#CKB_TIM]/jwt/custom-jwt-userinfo" + contentType: plaintext + headers: + cookie: ${incoming.headers.cookie} + plaintext: + "customJwtCookie" + result: res + next: check_user_info_response + +check_user_info_response: + switch: + - condition: ${200 <= res.response.statusCodeValue && res.response.statusCodeValue < 300} + next: assignIdCode + next: return_bad_request + +assignIdCode: + assign: + idCode: ${res.response.body.idCode} + next: getCustomerSupportActivity + +getCustomerSupportActivity: + call: http.post + args: + url: "[#CKB_USERS_RESQL]/get-customer-support-activity-by-id-code" + body: + customerSupportId: ${idCode} + result: res + +return_result: + return: ${res.response.body[0]} + next: end + +return_bad_request: + return: "bad_request" + next: end diff --git a/DSL/Ruuter/ckb/GET/accounts/settings.yml b/DSL/Ruuter/ckb/GET/accounts/settings.yml new file mode 100644 index 0000000..9a4414e --- /dev/null +++ b/DSL/Ruuter/ckb/GET/accounts/settings.yml @@ -0,0 +1,63 @@ +declaration: + call: declare + version: 0.1 + description: "Decription placeholder for 'USER-PROFILE-SETTINGS'" + method: get + accepts: json + returns: json + namespace: backoffice + allowlist: + header: + - field: cookie + type: string + description: "Cookie field" + +get_user_info: + call: http.post + args: + url: "[#CKB_TIM]/jwt/custom-jwt-userinfo" + contentType: plaintext + headers: + cookie: ${incoming.headers.cookie} + plaintext: + "customJwtCookie" + result: res + next: check_user_info_response + +check_user_info_response: + switch: + - condition: ${200 <= res.response.statusCodeValue && res.response.statusCodeValue < 300} + next: assignIdCode + next: return_bad_request + +assignIdCode: + assign: + idCode: ${res.response.body.idCode} + next: getUserSettings + +getUserSettings: + call: http.post + args: + url: "[#CKB_USERS_RESQL]/get-user-profile-settings" + body: + userId: ${idCode} + result: getUserSettingsResult + next: validateUserSettingsResultExists + +validateUserSettingsResultExists: + switch: + - condition: "${getUserSettingsResult.response.body.length > 0}" + next: returnSuccess + next: return_not_found + +returnSuccess: + return: ${getUserSettingsResult.response.body} + next: end + +return_bad_request: + return: "bad_request" + next: end + +return_not_found: + return: "user_not_found" + next: end diff --git a/DSL/Ruuter/ckb/GET/accounts/user-role.yml b/DSL/Ruuter/ckb/GET/accounts/user-role.yml new file mode 100644 index 0000000..381f69f --- /dev/null +++ b/DSL/Ruuter/ckb/GET/accounts/user-role.yml @@ -0,0 +1,38 @@ +declaration: + call: declare + version: 0.1 + description: "Get user roles dynamically from TIM" + method: get + accepts: json + returns: json + namespace: backoffice + allowlist: + headers: + - field: cookie + type: string + description: "Cookie field" + +get_user_info: + call: http.post + args: + url: "[#CKB_TIM]/jwt/custom-jwt-userinfo" + contentType: plaintext + headers: + cookie: ${incoming.headers.cookie} + plaintext: "customJwtCookie" + result: res + next: check_user_info_response + +check_user_info_response: + switch: + - condition: ${200 <= res.response.statusCodeValue && res.response.statusCodeValue < 300} + next: return_result + next: return_empty_array + +return_result: + return: ${res.response.body.authorities} + next: end + +return_empty_array: + return: success + next: end diff --git a/DSL/Ruuter/ckb/GET/accounts/widget-data.yml b/DSL/Ruuter/ckb/GET/accounts/widget-data.yml new file mode 100644 index 0000000..dbc99b6 --- /dev/null +++ b/DSL/Ruuter/ckb/GET/accounts/widget-data.yml @@ -0,0 +1,49 @@ +declaration: + call: declare + version: 0.1 + description: "Decription placeholder for 'WIDGET-DATA'" + method: get + accepts: json + returns: json + namespace: backoffice + allowlist: + params: + - field: user_id + type: string + description: "Body field 'user_id'" + +checkV: + log: ${incoming.params} + +extractRequestData: + assign: + user_id: ${incoming.params.user_id} + +getDomains: + call: http.post + args: + url: "[#CKB_USERS_RESQL]/get-widget-domains" + result: domains + +getUserDomains: + call: http.post + args: + url: "[#CKB_USERS_RESQL]/get-user-domains" + body: + user_login: ${user_id} + result: user_domains + +mapDomainsData: + call: http.post + args: + url: "[#CKB_DMAPPER]/utils/map-domains-data" + body: + domains: ${domains.response.body} + userDomains: ${user_domains.response.body[0]} + result: mappedDomains + +returnSuccess: + return: ${mappedDomains.response.body} + wrapper: false + next: end + diff --git a/GUI/.env.development b/GUI/.env.development index d5ddfc9..3f3201a 100644 --- a/GUI/.env.development +++ b/GUI/.env.development @@ -1,4 +1,5 @@ REACT_APP_RUUTER_API_URL=http://localhost:8086/ckb +REACT_APP_RUUTER_PRIVATE_API_URL: http://localhost:8086/ckb REACT_APP_BUEROKRATT_CHATBOT_URL=http://buerokratt-chat:8086/backoffice REACT_APP_MENU_URL=https://admin.dev.buerokratt.ee REACT_APP_MENU_PATH=/chat/menu.json @@ -13,7 +14,8 @@ REACT_APP_SHOW_HISTORY_EMAIL=false REACT_APP_SHOW_HISTORY_SORTING=false REACT_APP_SERVICE_ID=conversations,settings,monitoring REACT_APP_NOTIFICATION_NODE_URL=http://localhost:4040 -REACT_APP_CSP="upgrade-insecure-requests; default-src 'self'; font-src 'self' data:; img-src * data:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; object-src 'none'; connect-src 'self' http://localhost:8086 http://localhost:8085 http://localhost:4040 https://admin.dev.buerokratt.ee/chat/menu.json https://*.s3.amazonaws.com;" +REACT_APP_CSP="default-src 'self'; font-src 'self' data:; img-src * data:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; object-src 'none'; connect-src 'self' http://localhost:8086 http://localhost:8085 http://localhost:4040 http://localhost:9000 http://host.docker.internal:9000 https://host.docker.internal:9000 https://admin.dev.buerokratt.ee/chat/menu.json https://*.s3.amazonaws.com;" REACT_APP_ENABLE_HIDDEN_FEATURES=TRUE REACT_APP_VALIDATIONS_ENABLED=FALSE -REACT_APP_MENU_JSON=[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"},{"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Nõustajad","en":"Advisors"},"path":"/advisors"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"}]},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"Vestluse Kustutamine","en":"Delete Conversations"},"path":"/delete-conversations"}]},{"id":"monitoring","label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}] +REACT_APP_MENU_JSON='[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"},{"label":{"et":"Valideerimised","en":"Validations"},"path":"/validations"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"hidden":true,"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"hidden":true,"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"hidden":true,"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"hidden":true,"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","hidden":true,"label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"knowledge-center","label":{"et":"Teadmuskeskus","en":"Knowledge Center"},"path":"/knowledge-center","children":[{"id":"rag-search","label":{"et":"Mudelid ja seadistused","en":"Models management"},"path":"/rag-search","children":[{"label":{"et":"Mudelite ühendused","en":"LLM connections"},"path":"/rag-search/llm-connections"},{"label":{"et":"Viiba Seaded","en":"Prompt Configurations"},"path":"/rag-search/prompt-configurations"},{"label":{"et":"Testi mudelit","en":"Test LLM"},"path":"/rag-search/test-llm"}]},{"id":"ckb","label":{"et":"Teadmusbaas","en":"Knowledge Base"},"path":"/ckb","children":[{"label":{"et":"Agentuur","en":"Agency"},"path":"/agency"},{"label":{"et":"Aruanded","en":"Reports"},"path":"/reports"},{"label":{"et":"API Integratsioonid","en":"API Integrations"},"path":"/api"}]}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/chatbot/feedback"}]},{"label":{"et":"Vestluste analüüs","en":"Chat analysis"},"path":"/chat-analysis"},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Vestluse Kustutamine","en":"Delete Conversations"},"path":"/delete-conversations"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"SKMi konfiguratsioon","en":"SKM Configuration"},"path":"/skm-configuration"},{"label":{"et":"Anonümiseerija","en":"Anonymizer"},"path":"/anonymizer"}]},{"id":"monitoring","hidden":true,"label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}]' +REACT_APP_ENABLE_MULTI_DOMAIN=FALSE \ No newline at end of file diff --git a/GUI/package-lock.json b/GUI/package-lock.json index beff26f..3770d72 100644 --- a/GUI/package-lock.json +++ b/GUI/package-lock.json @@ -9,8 +9,8 @@ "version": "0.0.0", "dependencies": { "@buerokratt-ria/common-gui-components": "^0.0.17", - "@buerokratt-ria/header": "^0.1.35", - "@buerokratt-ria/menu": "^0.2.6", + "@buerokratt-ria/header": "^0.1.52", + "@buerokratt-ria/menu": "^0.2.15", "@buerokratt-ria/styles": "^0.0.1", "@fontsource/roboto": "^4.5.8", "@formkit/auto-animate": "^1.0.0-beta.5", @@ -2015,9 +2015,9 @@ } }, "node_modules/@buerokratt-ria/header": { - "version": "0.1.47", - "resolved": "https://registry.npmjs.org/@buerokratt-ria/header/-/header-0.1.47.tgz", - "integrity": "sha512-O937+HVqsVJTC5PLDbHadWiUxEvrqGiSeY7RVNPNm4H5R3wvkPOzd52J0fUvs0CjZlPFkMnrOSdRvkRbr19cEg==", + "version": "0.1.52", + "resolved": "https://registry.npmjs.org/@buerokratt-ria/header/-/header-0.1.52.tgz", + "integrity": "sha512-4k9Ekym6UqQpyF2nEIIT0n3wdp6Ax9sTvWK4HeZ7xuwf9YdgYnYRARRnZxcfsJCMm54JUQ8IKV9Y5i5ULVk1Bg==", "license": "ISC", "dependencies": { "@buerokratt-ria/styles": "^0.0.1", @@ -2055,9 +2055,10 @@ } }, "node_modules/@buerokratt-ria/menu": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@buerokratt-ria/menu/-/menu-0.2.7.tgz", - "integrity": "sha512-b5Qs/voXy2VAKQJ3jIQ85wgF8sQkuiJWZDZWR3zSiMX1EZtexxnOdZjLk180QoehZbIG5SLAB+eLY38qiRXOYw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/@buerokratt-ria/menu/-/menu-0.2.15.tgz", + "integrity": "sha512-xtjIyD/3Mdg2UZ7A6Yv/3ZsZX8LGUFGpYtr3LaYeyfhv5FsLWfDwXNPL2ViooOdpPJaD4hmKURrBF2VgpmBfUw==", + "license": "ISC", "dependencies": { "@buerokratt-ria/styles": "^0.0.1", "@types/react": "^18.2.21", diff --git a/GUI/package.json b/GUI/package.json index eb30418..b8d8df9 100644 --- a/GUI/package.json +++ b/GUI/package.json @@ -11,8 +11,8 @@ "prettier": "prettier --write \"{,!(node_modules)/**/}*.{ts,tsx,js,json,css,less,scss}\"" }, "dependencies": { - "@buerokratt-ria/header": "^0.1.35", - "@buerokratt-ria/menu": "^0.2.6", + "@buerokratt-ria/header": "^0.1.52", + "@buerokratt-ria/menu": "^0.2.15", "@buerokratt-ria/styles": "^0.0.1", "@buerokratt-ria/common-gui-components": "^0.0.17", "@fontsource/roboto": "^4.5.8", diff --git a/GUI/src/components/CKBHeader/Header.scss b/GUI/src/components/CKBHeader/Header.scss deleted file mode 100644 index fb0cdbd..0000000 --- a/GUI/src/components/CKBHeader/Header.scss +++ /dev/null @@ -1,26 +0,0 @@ -.header { - background: white; - border-bottom: 1px solid #e5e7eb; - padding: 0 24px; - position: sticky; - top: 0; - z-index: 100; - min-width: 1000px; - - &__container { - display: flex; - align-items: center; - justify-content: space-between; - height: 80px; - margin: 0 auto; - } - - &__logout { - text-decoration: underline; - color: #005AA3; - - &:hover { - color: #003662; - } - } - } \ No newline at end of file diff --git a/GUI/src/components/CKBHeader/index.tsx b/GUI/src/components/CKBHeader/index.tsx deleted file mode 100644 index a721fcc..0000000 --- a/GUI/src/components/CKBHeader/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { FC } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { Button } from 'components'; -import { useToast } from 'hooks/useToast'; -import { ReactComponent as BykLogo } from 'assets/logo.svg'; -import { apiDev } from 'services/api'; -import { AxiosError } from 'axios'; -import './Header.scss'; - -const Header: FC = () => { - const { t } = useTranslation(); - const toast = useToast(); - - const logoutMutation = useMutation({ - mutationFn: () => apiDev.get('accounts/logout'), - onSuccess(_: any) { - window.location.href = import.meta.env.REACT_APP_CUSTOMER_SERVICE_LOGIN; - }, - onError: async (error: AxiosError) => { - toast.open({ - type: 'error', - title: t('global.notificationError'), - message: error.message, - }); - }, - }); - - const handleLogout = () => { - // Clear any stored tokens/session data - localStorage.clear(); - sessionStorage.clear(); - - // Redirect to login page - window.location.href = import.meta.env.REACT_APP_LOGIN_URL || '/login'; - }; - - return ( -
-
- - -
-
- ); -}; - -export default Header; diff --git a/GUI/src/components/CKBLayout/index.tsx b/GUI/src/components/CKBLayout/index.tsx index cf35920..bb83d06 100644 --- a/GUI/src/components/CKBLayout/index.tsx +++ b/GUI/src/components/CKBLayout/index.tsx @@ -1,14 +1,18 @@ import React, { FC } from 'react'; import useStore from 'store'; import { Outlet } from 'react-router-dom'; -import { NavigationSidebar, Header } from 'components'; +import { NavigationSidebar} from 'components'; import { useToast } from '../../hooks/useToast'; import './Layout.scss'; import { MdOutlineStorage, MdOutlineAssessment, MdApi } from 'react-icons/md'; import { useTranslation } from 'react-i18next'; +import { MainNavigation } from '@buerokratt-ria/menu'; +import { Header, useMenuCountConf } from '@buerokratt-ria/header'; const Layout: FC = () => { const { t } = useTranslation(); + const domainBarShowing = import.meta.env.REACT_APP_ENABLE_MULTI_DOMAIN?.toLowerCase() === 'true'; + const menuItems = [ { id: 'data', @@ -31,11 +35,20 @@ const Layout: FC = () => { icon: , }, ]; + + const menuCountConf = useMenuCountConf(); + return (
- + {/* */} +
-
+
diff --git a/GUI/src/components/Drawer/Drawer.scss b/GUI/src/components/Drawer/Drawer.scss index df7bc71..fb5cc97 100644 --- a/GUI/src/components/Drawer/Drawer.scss +++ b/GUI/src/components/Drawer/Drawer.scss @@ -21,7 +21,7 @@ display: flex; align-items: center; gap: get-spacing(haapsalu); - padding: get-spacing(haapsalu); + padding: get-spacing(haapsalu) !important; border-bottom: 1px solid get-color(black-coral-2); .icon { diff --git a/GUI/src/components/Section/Section.scss b/GUI/src/components/Section/Section.scss index cdbb136..c48ae73 100644 --- a/GUI/src/components/Section/Section.scss +++ b/GUI/src/components/Section/Section.scss @@ -3,7 +3,7 @@ @import 'src/styles/settings/variables/typography'; .section { - padding: get-spacing(haapsalu); + padding: get-spacing(haapsalu) !important; &:not(:last-child) { border-bottom: 1px solid get-color(black-coral-2); diff --git a/GUI/src/components/index.tsx b/GUI/src/components/index.tsx index 4de7581..42466b4 100644 --- a/GUI/src/components/index.tsx +++ b/GUI/src/components/index.tsx @@ -33,7 +33,6 @@ import Editor from './Editor'; import FileUploader from './FileUploader/FileUploader'; import NavigationSidebar from './NavigationSidebar'; import CKBLayout from './CKBLayout'; -import Header from './CKBHeader'; export { // Layout, @@ -69,7 +68,6 @@ export { Editor, NavigationSidebar, CKBLayout, - Header, }; // Export types that might be needed diff --git a/GUI/src/store/index.ts b/GUI/src/store/index.ts index eeffd1c..cd363bc 100644 --- a/GUI/src/store/index.ts +++ b/GUI/src/store/index.ts @@ -31,6 +31,8 @@ interface StoreState { getGroupedUnansweredChats: () => GroupedChat; loadPendingChats: () => Promise; getGroupedPendingChats: () => GroupedPendingChat; + userDomains: string[]; + setUserDomains: (domains: string[]) => void; } const useStore = create((set, get, store) => ({ @@ -73,6 +75,8 @@ const useStore = create((set, get, store) => ({ }, unansweredChatsLength: () => get().unansweredChats().length, forwordedChatsLength: () => get().forwordedChats().length, + userDomains: [], + setUserDomains: (domains: string[]) => set({ userDomains: domains }), loadActiveChats: async () => { const res = await apiDev.get('agents/chats/active'); diff --git a/GUI/translations/en/common.json b/GUI/translations/en/common.json index 490f65f..3bfff3e 100644 --- a/GUI/translations/en/common.json +++ b/GUI/translations/en/common.json @@ -94,6 +94,16 @@ "reports": "Reports", "apiIntegrations": "API integrations" }, + "multiDomains": { + "addNew": "Add new", + "title": "Multidomains", + "domains": "Domains", + "domainName": "Domain name", + "selectDomains": "Select Domains", + "chooseDomain": "Select domain:", + "allDomains": "All", + "noDomains": "No domains available. Please contact your system administrator." + }, "chat": { "userTyping": "User Typing", "chatForwardedTo": "Chat forwarded to", diff --git a/GUI/translations/et/common.json b/GUI/translations/et/common.json index 63449cb..7f1cbcc 100644 --- a/GUI/translations/et/common.json +++ b/GUI/translations/et/common.json @@ -94,6 +94,16 @@ "reports": "Aruanded", "apiIntegrations": "API integratsioonid" }, + "multiDomains": { + "addNew": "Lisa uus", + "title": "Multidomeenid", + "domains": "Domeenid", + "domainName": "Domeeni nimi", + "selectDomains": "Vali Domeenid", + "chooseDomain": "Vali domeen:", + "allDomains": "Kõik", + "noDomains": "Domeene ei ole saadaval. Palun võtke ühendust süsteemiadministraatoriga." + }, "chat": { "userTyping": "Kasutaja kirjutab", "chatForwardedTo": "Vestlus edastati aadressile", diff --git a/README.md b/README.md index 3816827..f295a79 100644 --- a/README.md +++ b/README.md @@ -465,9 +465,10 @@ Resql provides type-safe database operations: ```bash # Login to get JWT token -curl -X POST http://localhost:8080/ckb/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username": "user", "password": "pass"}' +curl -X POST -H "Content-Type: application/json" -d '{ + "login": "EE30303039914", + "password": "OK" +}' http://localhost:8086/ckb/auth/login # Use token in subsequent requests curl -H "Authorization: Bearer " \ diff --git a/docker-compose.yml b/docker-compose.yml index 5e6dce6..8fa1ea3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -267,6 +267,7 @@ services: NODE_ENV: development BASE_URL: http://localhost:8080/ckb REACT_APP_RUUTER_API_URL: http://localhost:8086/ckb + REACT_APP_RUUTER_PRIVATE_API_URL: http://localhost:8086/ckb REACT_APP_CUSTOMER_SERVICE_LOGIN: http://localhost:3004/et/dev-auth REACT_APP_CSP: "upgrade-insecure-requests; default-src 'self'; font-src 'self' data:; img-src * data:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; object-src 'none'; connect-src 'self' http://localhost:8086 http://localhost:8085 http://localhost:4040 https://admin.dev.buerokratt.ee/chat/menu.json https://*.s3.amazonaws.com;" DEBUG_ENABLED: true @@ -276,9 +277,10 @@ services: REACT_APP_SERVICE_ID: ckb REACT_APP_ENABLE_HIDDEN_FEATURES: true REACT_APP_VALIDATIONS_ENABLED: FALSE - # - REACT_APP_MENU_JSON=[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"},{"label":{"et":"Valideerimised","en":"Validations"},"path":"/validations"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"},{"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Nõustajad","en":"Advisors"},"path":"/advisors"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"}]},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Vestluse Kustutamine","en":"Delete Conversations"},"path":"/delete-conversations"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"SKMi konfiguratsioon","en":"SKM Configuration"},"path":"/skm-configuration"}]},{"id":"monitoring","label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}] + REACT_APP_ENABLE_MULTI_DOMAIN: FALSE + REACT_APP_MENU_JSON: '[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"},{"label":{"et":"Valideerimised","en":"Validations"},"path":"/validations"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"hidden":true,"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"hidden":true,"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"hidden":true,"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"hidden":true,"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","hidden":true,"label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"knowledge-center","label":{"et":"Teadmuskeskus","en":"Knowledge Center"},"path":"/knowledge-center","children":[{"id":"rag-search","label":{"et":"Mudelid ja seadistused","en":"Models management"},"path":"/rag-search","children":[{"label":{"et":"Mudelite ühendused","en":"LLM connections"},"path":"/rag-search/llm-connections"},{"label":{"et":"Viiba Seaded","en":"Prompt Configurations"},"path":"/rag-search/prompt-configurations"},{"label":{"et":"Testi mudelit","en":"Test LLM"},"path":"/rag-search/test-llm"}]},{"id":"ckb","label":{"et":"Teadmusbaas","en":"Knowledge Base"},"path":"/ckb","children":[{"label":{"et":"Agentuur","en":"Agency"},"path":"/agency"},{"label":{"et":"Aruanded","en":"Reports"},"path":"/reports"},{"label":{"et":"API Integratsioonid","en":"API Integrations"},"path":"/api"}]}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/chatbot/feedback"}]},{"label":{"et":"Vestluste analüüs","en":"Chat analysis"},"path":"/chat-analysis"},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Vestluse Kustutamine","en":"Delete Conversations"},"path":"/delete-conversations"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"SKMi konfiguratsioon","en":"SKM Configuration"},"path":"/skm-configuration"},{"label":{"et":"Anonümiseerija","en":"Anonymizer"},"path":"/anonymizer"}]},{"id":"monitoring","hidden":true,"label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}]' # # for production use this one: - # - REACT_APP_MENU_JSON=[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"},{"label":{"et":"Valideerimised","en":"Validations"},"path":"/validations"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"hidden":true,"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"hidden":true,"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"},{"hidden":true,"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"hidden":true,"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"hidden":true,"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Nõustajad","en":"Advisors"},"path":"/advisors"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","hidden":true,"label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Automatic Teenused","en":"Automatic Services"},"path":"/auto-services"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"}]},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"SKMi konfiguratsioon","en":"SKM Configuration"},"path":"/skm-configuration"}]},{"id":"monitoring","hidden":true,"label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}] + # REACT_APP_MENU_JSON: '[{"id":"conversations","label":{"et":"Vestlused","en":"Conversations"},"path":"/chat","children":[{"label":{"et":"Vastamata","en":"Unanswered"},"path":"/unanswered"},{"label":{"et":"Aktiivsed","en":"Active"},"path":"/active"},{"label":{"et":"Ootel","en":"Pending"},"path":"/pending"},{"label":{"et":"Ajalugu","en":"History"},"path":"/history"},{"label":{"et":"Valideerimised","en":"Validations"},"path":"/validations"}]},{"id":"training","label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Treening","en":"Training"},"path":"/training","children":[{"label":{"et":"Teemad","en":"Themes"},"path":"/training/intents"},{"hidden":true,"label":{"et":"Avalikud teemad","en":"Public themes"},"path":"/training/common-intents"},{"label":{"et":"Teemade järeltreenimine","en":"Post training themes"},"path":"/training/intents-followup-training"},{"label":{"et":"Vastused","en":"Answers"},"path":"/training/responses"},{"label":{"et":"Reeglid","en":"Rules"},"path":"/training/rules"},{"hidden":true,"label":{"et":"Konfiguratsioon","en":"Configuration"},"path":"/training/configuration"},{"label":{"et":"Vormid","en":"Forms"},"path":"/training/forms"},{"label":{"et":"Mälukohad","en":"Slots"},"path":"/training/slots"}]},{"label":{"et":"Ajaloolised vestlused","en":"Historical conversations"},"path":"/history","children":[{"label":{"et":"Ajalugu","en":"History"},"path":"/history/history"},{"hidden":true,"label":{"et":"Pöördumised","en":"Appeals"},"path":"/history/appeal"}]},{"label":{"et":"Mudelipank ja analüütika","en":"Modelbank and analytics"},"path":"/analytics","children":[{"label":{"et":"Teemade ülevaade","en":"Overview of topics"},"path":"/analytics/overview"},{"label":{"et":"Mudelite võrdlus","en":"Comparison of models"},"path":"/analytics/models"},{"hidden":true,"label":{"et":"Testlood","en":"testTracks"},"path":"/analytics/testcases"}]},{"label":{"et":"Treeni uus mudel","en":"Train new model"},"path":"/train-new-model"}]},{"id":"analytics","label":{"et":"Analüütika","en":"Analytics"},"path":"/analytics","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Vestlused","en":"Chats"},"path":"/chats"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/feedback"},{"label":{"et":"Avaandmed","en":"Reports"},"path":"/reports"}]},{"id":"services","hidden":true,"label":{"et":"Teenused","en":"Services"},"path":"/services","children":[{"label":{"et":"Ülevaade","en":"Overview"},"path":"/overview"},{"label":{"et":"Uus teenus","en":"New Service"},"path":"/newService"},{"label":{"et":"Probleemsed teenused","en":"Faulty Services"},"path":"/faultyServices"}]},{"id":"knowledge-center","label":{"et":"Teadmuskeskus","en":"Knowledge Center"},"path":"/knowledge-center","children":[{"id":"rag-search","label":{"et":"Mudelid ja seadistused","en":"Models management"},"path":"/rag-search","children":[{"label":{"et":"Mudelite ühendused","en":"LLM connections"},"path":"/rag-search/llm-connections"},{"label":{"et":"Viiba Seaded","en":"Prompt Configurations"},"path":"/rag-search/prompt-configurations"},{"label":{"et":"Testi mudelit","en":"Test LLM"},"path":"/rag-search/test-llm"}]},{"id":"ckb","label":{"et":"Teadmusbaas","en":"Knowledge Base"},"path":"/ckb","children":[{"label":{"et":"Agentuur","en":"Agency"},"path":"/agency"},{"label":{"et":"Aruanded","en":"Reports"},"path":"/reports"},{"label":{"et":"API Integratsioonid","en":"API Integrations"},"path":"/api"}]}]},{"id":"settings","label":{"et":"Haldus","en":"Administration"},"path":"/settings","children":[{"label":{"et":"Kasutajad","en":"Users"},"path":"/users"},{"label":{"et":"Vestlusbot","en":"Chatbot"},"path":"/chatbot","children":[{"label":{"et":"Seaded","en":"Settings"},"path":"/chatbot/settings"},{"label":{"et":"Tervitussõnum","en":"Welcome message"},"path":"/chatbot/welcome-message"},{"label":{"et":"Välimus ja käitumine","en":"Appearance and behavior"},"path":"/chatbot/appearance"},{"label":{"et":"Erakorralised teated","en":"Emergency notices"},"path":"/chatbot/emergency-notices"},{"label":{"et":"Tagasiside","en":"Feedback"},"path":"/chatbot/feedback"}]},{"label":{"et":"Vestluste analüüs","en":"Chat analysis"},"path":"/chat-analysis"},{"label":{"et":"Asutuse tööaeg","en":"Office opening hours"},"path":"/working-time"},{"label":{"et":"Sessiooni pikkus","en":"Session length"},"path":"/session-length"},{"label":{"et":"SKMi konfiguratsioon","en":"SKM Configuration"},"path":"/skm-configuration"},{"label":{"et":"Anonümiseerija","en":"Anonymizer"},"path":"/anonymizer"}]},{"id":"monitoring","hidden":true,"label":{"et":"Seire","en":"Monitoring"},"path":"/monitoring","children":[{"label":{"et":"Aktiivaeg","en":"Working hours"},"path":"/uptime"}]}]' build: context: ./GUI dockerfile: Dockerfile.dev