Kaynağa Gözat

feat: Add growi cloud link to ai integration settings

ryota-t 3 hafta önce
ebeveyn
işleme
e23e2ef933

+ 1 - 0
apps/app/public/static/locales/en_US/admin.json

@@ -1147,6 +1147,7 @@
   "ai_integration": {
     "ai_integration": "AI Integration",
     "disable_mode_explanation": "Currently, AI integration is disabled. To enable it, configure the <code>AI_ENABLED</code> environment variable along with the required additional variables.<br><br>For details, please refer to the <a target='blank' rel='noopener noreferrer' href={{documentationUrl}}en/guide/features/ai-knowledge-assistant.html>documentation</a>.",
+    "disable_mode_explanation_cloud": "Currently, AI integration is disabled. To enable it, please update the app settings from the GROWI.cloud management screen.",
     "ai_search_management": "AI search management"
   }
 }

+ 1 - 0
apps/app/public/static/locales/fr_FR/admin.json

@@ -1146,6 +1146,7 @@
   "ai_integration": {
     "ai_integration": "Intégration de l'IA",
     "disable_mode_explanation": "Actuellement, l'intégration AI est désactivée. Pour l'activer, configurez la variable d'environnement <code>AI_ENABLED</code> ainsi que les autres variables nécessaires.<br><br>Pour plus de détails, veuillez consulter la <a target='blank' rel='noopener noreferrer' href={{documentationUrl}}en/guide/features/ai-knowledge-assistant.html>documentation</a>.",
+    "disable_mode_explanation_cloud": "Actuellement, l'intégration AI est désactivée. Pour l'activer, veuillez modifier les paramètres de l'application depuis l'écran de gestion GROWI.cloud.",
     "ai_search_management": "Gestion de la recherche par l'IA"
   }
 }

+ 1 - 0
apps/app/public/static/locales/ja_JP/admin.json

@@ -1156,6 +1156,7 @@
   "ai_integration": {
     "ai_integration": "AI 連携",
     "disable_mode_explanation": "現在、AI 連携は無効になっています。有効にする場合は環境変数 <code>AI_ENABLED</code> の他、必要な環境変数を設定してください。<br><br>詳細は<a target='blank' rel='noopener noreferrer' href={{documentationUrl}}ja/guide/features/ai-knowledge-assistant.html>ドキュメント</a>を参照してください。",
+    "disable_mode_explanation_cloud": "現在、AI 連携は無効になっています。有効にするには、GROWI.cloud の管理画面からアプリの設定を変更してください。",
     "ai_search_management": "AI 検索管理"
   }
 }

+ 1 - 0
apps/app/public/static/locales/ko_KR/admin.json

@@ -1147,6 +1147,7 @@
   "ai_integration": {
     "ai_integration": "AI 통합",
     "disable_mode_explanation": "현재 AI 통합이 비활성화되어 있습니다. 활성화하려면 <code>AI_ENABLED</code> 환경 변수와 필요한 추가 변수를 구성하십시오.<br><br>자세한 내용은 <a target='blank' rel='noopener noreferrer' href={{documentationUrl}}en/guide/features/ai-knowledge-assistant.html>문서</a>를 참조하십시오.",
+    "disable_mode_explanation_cloud": "현재 AI 통합이 비활성화되어 있습니다. 활성화하려면 GROWI.cloud 관리 화면에서 앱 설정을 변경하십시오.",
     "ai_search_management": "AI 검색 관리"
   }
 }

+ 1 - 0
apps/app/public/static/locales/zh_CN/admin.json

@@ -1156,6 +1156,7 @@
   "ai_integration": {
     "ai_integration": "AI 集成",
     "disable_mode_explanation": "目前,AI 集成已被禁用。若要启用,请配置 <code>AI_ENABLED</code> 环境变量以及其他必要的变量。<br><br>详细信息请参考<a target='blank' rel='noopener noreferrer' href={{documentationUrl}}en/guide/features/ai-knowledge-assistant.html>文档</a>。",
+    "disable_mode_explanation_cloud": "目前,AI 集成已被禁用。要启用它,请从 GROWI.cloud 管理界面更改应用程序设置。",
     "ai_search_management": "AI 搜索管理"
   }
 }

+ 17 - 0
apps/app/src/features/openai/client/components/AiIntegration/AiIntegration.tsx

@@ -1,11 +1,28 @@
 import type { JSX } from 'react';
 import { useTranslation } from 'react-i18next';
 
+import { useGrowiAppIdForGrowiCloud, useGrowiCloudUri } from '~/states/global';
+
 export const AiIntegration = (): JSX.Element => {
   const { t } = useTranslation('admin');
 
+  const growiCloudUri = useGrowiCloudUri();
+  const growiAppIdForGrowiCloud = useGrowiAppIdForGrowiCloud();
+
+  const isCloud = growiCloudUri != null && growiAppIdForGrowiCloud != null;
+
   return (
     <div data-testid="admin-ai-integration">
+      {isCloud && (
+        <a
+          href={`${growiCloudUri}/my/apps/${growiAppIdForGrowiCloud}`}
+          className="btn btn-outline-secondary mb-4"
+        >
+          <span className="material-symbols-outlined me-1">share</span>
+          {t('cloud_setting_management.to_cloud_settings')}
+        </a>
+      )}
+
       <h2 className="admin-setting-header">
         {t('ai_integration.ai_search_management')}
       </h2>

+ 21 - 3
apps/app/src/features/openai/client/components/AiIntegration/AiIntegrationDisableMode.tsx

@@ -2,11 +2,17 @@ import type { FC } from 'react';
 import { useTranslation } from 'react-i18next';
 
 import { useGrowiDocumentationUrl } from '~/states/context';
+import { useGrowiAppIdForGrowiCloud, useGrowiCloudUri } from '~/states/global';
 
 export const AiIntegrationDisableMode: FC = () => {
   const { t } = useTranslation('admin');
   const documentationUrl = useGrowiDocumentationUrl();
 
+  const growiCloudUri = useGrowiCloudUri();
+  const growiAppIdForGrowiCloud = useGrowiAppIdForGrowiCloud();
+
+  const isCloud = growiCloudUri != null && growiAppIdForGrowiCloud != null;
+
   return (
     <div className="ccontainer-lg">
       <div className="container">
@@ -23,11 +29,23 @@ export const AiIntegrationDisableMode: FC = () => {
               <h3
                 // biome-ignore lint/security/noDangerouslySetInnerHtml: ignore
                 dangerouslySetInnerHTML={{
-                  __html: t('ai_integration.disable_mode_explanation', {
-                    documentationUrl,
-                  }),
+                  __html: t(
+                    isCloud
+                      ? 'ai_integration.disable_mode_explanation_cloud'
+                      : 'ai_integration.disable_mode_explanation',
+                    { documentationUrl },
+                  ),
                 }}
               />
+              {isCloud && (
+                <a
+                  href={`${growiCloudUri}/my/apps/${growiAppIdForGrowiCloud}`}
+                  className="btn btn-outline-secondary mt-3"
+                >
+                  <span className="material-symbols-outlined me-1">share</span>
+                  {t('cloud_setting_management.to_cloud_settings')}
+                </a>
+              )}
             </div>
           </div>
         </div>