Shun Miyazawa 1 год назад
Родитель
Сommit
d7fbee9fa4

+ 7 - 0
apps/app/public/static/locales/en_US/translation.json

@@ -488,6 +488,13 @@
     "latest_revision": "theirs",
     "selected_editable_revision": "Selected Page Body (Editable)"
   },
+  "modal_ai_assistant": {
+    "access_scope": {
+      "owner": "All pages accessible by {{username}}",
+      "groups": "Specify groups",
+      "publicOnly": "Public pages only"
+    }
+  },
   "modal_aichat": {
     "title": "Knowledge Assistant",
     "title_beta_label": "(Beta)",

+ 7 - 0
apps/app/public/static/locales/fr_FR/translation.json

@@ -483,6 +483,13 @@
     "latest_revision": "les autres",
     "selected_editable_revision": "Corps de page sélectionné (Modifiable)"
   },
+  "modal_ai_assistant": {
+    "access_scope": {
+      "owner": "Toutes les pages accessibles par {{username}}",
+      "groups": "Spécifier les groupes",
+      "publicOnly": "Pages publiques uniquement"
+    }
+  },
   "modal_aichat": {
     "title": "Assistant de Connaissance",
     "title_beta_label": "(Bêta)",

+ 7 - 0
apps/app/public/static/locales/ja_JP/translation.json

@@ -535,6 +535,13 @@
     "error_message": "エラーが発生しました",
     "show_error_detail": "詳細を表示"
   },
+  "modal_ai_assistant": {
+    "access_scope": {
+      "owner": "{{username}} がアクセス可能な全てのページ",
+      "groups": "グループを指定",
+      "publicOnly": "公開ページのみ"
+    }
+  },
   "link_edit": {
     "edit_link": "リンク編集",
     "set_link_and_label": "リンク情報",

+ 7 - 0
apps/app/public/static/locales/zh_CN/translation.json

@@ -477,6 +477,13 @@
     "latest_revision": "最新页面正文",
     "selected_editable_revision": "选定的可编辑页面正文"
   },
+  "modal_ai_assistant": {
+    "access_scope": {
+      "owner": "{{username}} 可访问的所有页面",
+      "groups": "指定群组",
+      "publicOnly": "仅公开页面"
+    }
+  },
   "modal_aichat": {
     "title": "知识助手",
     "title_beta_label": "(测试版)",

+ 51 - 0
apps/app/src/features/openai/client/components/AiAssistant/AccessScopeDropdown.tsx

@@ -0,0 +1,51 @@
+import React, { useState, useCallback } from 'react';
+
+import { useTranslation } from 'react-i18next';
+import {
+  UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,
+} from 'reactstrap';
+
+import { useCurrentUser } from '~/stores-universal/context';
+import { useSWRxUserRelatedGroups } from '~/stores/user';
+
+import { AiAssistantAccessScope } from '../../../interfaces/ai-assistant';
+
+export const AccessScopeDropdown: React.FC = () => {
+  const { t } = useTranslation();
+  const { data: currentUser } = useCurrentUser();
+  const { data: userRelatedGroups } = useSWRxUserRelatedGroups();
+
+  const [selectedAccessScope, setSelectedAccessScope] = useState<AiAssistantAccessScope>(AiAssistantAccessScope.OWNER);
+
+  const getAccessScopeLabel = useCallback((accessScope: AiAssistantAccessScope) => {
+    const baseLabel = `modal_ai_assistant.access_scope.${accessScope}`;
+    return accessScope === AiAssistantAccessScope.OWNER
+      ? t(baseLabel, { username: currentUser?.username })
+      : t(baseLabel);
+
+  }, [currentUser?.username, t]);
+
+  return (
+    <UncontrolledDropdown>
+      <DropdownToggle
+        caret
+        className="btn-outline-secondary"
+      >
+        {getAccessScopeLabel(selectedAccessScope)}
+      </DropdownToggle>
+      <DropdownMenu>
+        <DropdownItem onClick={() => setSelectedAccessScope(AiAssistantAccessScope.OWNER)}>
+          {getAccessScopeLabel(AiAssistantAccessScope.OWNER)}
+        </DropdownItem>
+
+        <DropdownItem onClick={() => setSelectedAccessScope(AiAssistantAccessScope.GROUPS)}>
+          {getAccessScopeLabel(AiAssistantAccessScope.GROUPS)}
+        </DropdownItem>
+
+        <DropdownItem onClick={() => setSelectedAccessScope(AiAssistantAccessScope.PUBLIC_ONLY)}>
+          {getAccessScopeLabel(AiAssistantAccessScope.PUBLIC_ONLY)}
+        </DropdownItem>
+      </DropdownMenu>
+    </UncontrolledDropdown>
+  );
+};

+ 4 - 3
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManegementModal.tsx

@@ -15,6 +15,8 @@ import { createAiAssistant } from '../../services/ai-assistant';
 import { useAiAssistantManegementModal } from '../../stores/ai-assistant';
 import { SelectedPageList } from '../Common/SelectedPageList';
 
+import { AccessScopeDropdown } from './AccessScopeDropdown';
+
 
 import styles from './AiAssistantManegementModal.module.scss';
 
@@ -24,6 +26,7 @@ const logger = loggerFactory('growi:openai:client:components:AiAssistantManegeme
 
 const AiAssistantManegementModalSubstance = (): JSX.Element => {
   const { open: openPageSelectModal } = usePageSelectModal();
+
   const [selectedPages, setSelectedPages] = useState<SelectedPage[]>([]);
 
   const clickOpenPageSelectModalHandler = useCallback(() => {
@@ -103,9 +106,7 @@ const AiAssistantManegementModalSubstance = (): JSX.Element => {
               <Label className="mb-0">共有範囲</Label>
               <span className="ms-1 fs-5 material-symbols-outlined text-secondary">help</span>
             </div>
-            <Input type="select" className="border rounded w-50">
-              <option>自分のみ</option>
-            </Input>
+            <AccessScopeDropdown />
           </FormGroup>
 
           <FormGroup className="mb-4">