Просмотр исходного кода

fix non-autofixable biome errors

Futa Arai 5 месяцев назад
Родитель
Сommit
2dcdf3c115
16 измененных файлов с 145 добавлено и 121 удалено
  1. 1 1
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditInstruction.tsx
  2. 1 1
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditPages.tsx
  3. 1 1
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditShare.tsx
  4. 2 2
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementKeywordSearch.tsx
  5. 0 1
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementModal.tsx
  6. 26 18
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementPageTreeSelection.tsx
  7. 4 3
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/SelectablePageList.tsx
  8. 1 1
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/ShareScopeWarningModal.tsx
  9. 2 2
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/AiAssistantSidebar.tsx
  10. 4 4
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/MessageCard/MessageCard.tsx
  11. 19 10
      apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/ThreadList.tsx
  12. 58 50
      apps/app/src/features/openai/client/components/AiAssistant/Sidebar/AiAssistantList.tsx
  13. 14 11
      apps/app/src/features/openai/client/components/AiAssistant/Sidebar/ThreadList.tsx
  14. 1 1
      apps/app/src/features/openai/client/components/AiIntegration/AiIntegrationDisableMode.tsx
  15. 1 7
      apps/app/src/features/openai/client/services/editor-assistant/use-editor-assistant.tsx
  16. 10 8
      apps/app/src/features/openai/client/services/knowledge-assistant.tsx

+ 1 - 1
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditInstruction.tsx

@@ -39,7 +39,7 @@ export const AiAssistantManagementEditInstruction = (
       <ModalBody className="p-4">
         <p
           className="text-secondary py-1"
-          // eslint-disable-next-line react/no-danger
+          // biome-ignore lint/security/noDangerouslySetInnerHtml: ignore
           dangerouslySetInnerHTML={{
             __html: t('modal_ai_assistant.instructions.description'),
           }}

+ 1 - 1
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditPages.tsx

@@ -37,7 +37,7 @@ export const AiAssistantManagementEditPages = (props: Props): JSX.Element => {
         <div className="px-4">
           <p
             className="text-secondary"
-            // eslint-disable-next-line react/no-danger
+            // biome-ignore lint/security/noDangerouslySetInnerHtml: ignore
             dangerouslySetInnerHTML={{
               __html: t('modal_ai_assistant.edit_page_description', {
                 limitLearnablePageCountPerAssistant,

+ 1 - 1
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementEditShare.tsx

@@ -66,7 +66,7 @@ export const AiAssistantManagementEditShare = (props: Props): JSX.Element => {
         selectedAccessScope !== AiAssistantAccessScope.OWNER
       );
     });
-  }, [isShared, selectedAccessScope, selectedShareScope]);
+  }, [selectedAccessScope, selectedShareScope]);
 
   const changeShareToggleHandler = useCallback(() => {
     setIsShared((prev) => {

+ 2 - 2
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementKeywordSearch.tsx

@@ -251,9 +251,9 @@ export const AiAssistantKeywordSearch = (props: Props): JSX.Element => {
               onClickMethodButton={removePage}
             />
           </SimpleBar>
-          <label className="form-text text-muted mt-2">
+          <span className="form-text text-muted mt-2">
             {t('modal_ai_assistant.can_add_later')}
-          </label>
+          </span>
         </div>
 
         <div className="d-flex justify-content-center mt-4">

+ 0 - 1
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementModal.tsx

@@ -153,7 +153,6 @@ const AiAssistantManagementModalSubstance = (): JSX.Element => {
     aiAssistant?.grantedGroupsForAccessScope,
     aiAssistant?.grantedGroupsForShareScope,
     aiAssistant?.name,
-    aiAssistant?.pagePathPatterns,
     aiAssistant?.shareScope,
     shouldEdit,
   ]);

+ 26 - 18
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementPageTreeSelection.tsx

@@ -45,11 +45,8 @@ const SelectablePageTree = memo(
       [onClickAddPageButton],
     );
 
-    const PageTreeItem = (props: TreeItemProps) => {
-      const { itemNode } = props;
-      const { page } = itemNode;
-
-      const SelectPageButton = () => {
+    const SelectPageButton = useCallback(
+      ({ page }: { page: IPageForItem }) => {
         return (
           <button
             type="button"
@@ -64,17 +61,28 @@ const SelectablePageTree = memo(
             </span>
           </button>
         );
-      };
-
-      return (
-        <TreeItemLayout
-          {...props}
-          itemClass={PageTreeItem}
-          className="text-muted"
-          customHoveredEndComponents={[SelectPageButton]}
-        />
-      );
-    };
+      },
+      [pageTreeItemClickHandler],
+    );
+
+    const PageTreeItem = useCallback(
+      (props: TreeItemProps) => {
+        const { itemNode } = props;
+        const { page } = itemNode;
+
+        return (
+          <TreeItemLayout
+            {...props}
+            itemClass={PageTreeItem}
+            className="text-muted"
+            customHoveredEndComponents={[
+              () => <SelectPageButton page={page} />,
+            ]}
+          />
+        );
+      },
+      [SelectPageButton],
+    );
 
     return (
       <div className="page-tree-item">
@@ -193,9 +201,9 @@ export const AiAssistantManagementPageTreeSelection = (
               onClickMethodButton={removePage}
             />
           </SimpleBar>
-          <label className="form-text text-muted mt-2">
+          <span className="form-text text-muted mt-2">
             {t('modal_ai_assistant.can_add_later')}
-          </label>
+          </span>
         </div>
 
         <div className="d-flex justify-content-center mt-4">

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

@@ -151,13 +151,14 @@ const EditablePagePath = memo((props: EditablePagePathProps): JSX.Element => {
           inputStyle={{ maxWidth: (editingContainerRect?.width ?? 0) - 10 }}
         />
       ) : (
-        <span
-          className={`page-path ${isEditable && !disablePagePaths.includes(page.path) ? 'page-path-editable' : ''}`}
+        <button
+          type="button"
+          className={`btn btn-link p-0 page-path ${isEditable && !disablePagePaths.includes(page.path) ? 'page-path-editable' : ''}`}
           onClick={() => handlePagePathClick(page)}
           title={page.path}
         >
           {page.path}
-        </span>
+        </button>
       )}
     </div>
   );

+ 1 - 1
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/ShareScopeWarningModal.tsx

@@ -37,7 +37,7 @@ export const ShareScopeWarningModal = (props: Props): JSX.Element => {
       <ModalBody className="py-4 px-4">
         <p
           className="mb-4"
-          // eslint-disable-next-line react/no-danger
+          // biome-ignore lint/security/noDangerouslySetInnerHtml: ignore
           dangerouslySetInnerHTML={{
             __html: t('share_scope_warning_modal.warning_message'),
           }}

+ 2 - 2
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/AiAssistantSidebar.tsx

@@ -553,7 +553,7 @@ const AiAssistantSidebarSubstance: React.FC<
                     {messageLogs.map((message) => (
                       <>
                         <MessageCard
-                          role={message.isUserMessage ? 'user' : 'assistant'}
+                          sender={message.isUserMessage ? 'user' : 'assistant'}
                           additionalItem={messageCardAdditionalItemForGeneratedMessage(
                             message.id,
                           )}
@@ -564,7 +564,7 @@ const AiAssistantSidebarSubstance: React.FC<
                     ))}
                     {generatingAnswerMessage != null && (
                       <MessageCard
-                        role="assistant"
+                        sender="assistant"
                         additionalItem={
                           messageCardAdditionalItemForGeneratingMessage
                         }

+ 4 - 4
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/MessageCard/MessageCard.tsx

@@ -72,18 +72,18 @@ const AssistantMessageCard = ({
   );
 };
 
-type MessageCardRole = 'user' | 'assistant';
+type MessageSender = 'user' | 'assistant';
 
 type Props = {
-  role: MessageCardRole;
+  sender: MessageSender;
   children: string;
   additionalItem?: JSX.Element;
 };
 
 export const MessageCard = (props: Props): JSX.Element => {
-  const { role, children, additionalItem } = props;
+  const { sender, children, additionalItem } = props;
 
-  return role === 'user' ? (
+  return sender === 'user' ? (
     <UserMessageCard>{children}</UserMessageCard>
   ) : (
     <AssistantMessageCard additionalItem={additionalItem}>

+ 19 - 10
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/ThreadList.tsx

@@ -43,18 +43,27 @@ export const ThreadList: React.FC = () => {
       <ul className={`list-group ${moduleClass}`}>
         {threads.map((thread) => (
           <li
-            onClick={() => {
-              openChatHandler(thread);
-            }}
             key={thread._id}
-            role="button"
-            tabIndex={0}
-            className="d-flex align-items-center list-group-item list-group-item-action border-0 rounded-1 bg-body-tertiary mb-2"
+            className="list-group-item border-0 rounded-1 bg-body-tertiary mb-2"
           >
-            <div className="text-body-secondary">
-              <span className="material-symbols-outlined fs-5 me-2">chat</span>
-              <span className="flex-grow-1">{thread.title}</span>
-            </div>
+            <button
+              type="button"
+              className="btn btn-link d-flex align-items-center list-group-item-action border-0 rounded-1 p-0"
+              onClick={() => {
+                openChatHandler(thread);
+              }}
+              onMouseDown={(e) => {
+                // Prevent focus when clicking with mouse, but allow keyboard focus
+                e.preventDefault();
+              }}
+            >
+              <div className="text-body-secondary">
+                <span className="material-symbols-outlined fs-5 me-2">
+                  chat
+                </span>
+                <span className="flex-grow-1">{thread.title}</span>
+              </div>
+            </button>
           </li>
         ))}
       </ul>

+ 58 - 50
apps/app/src/features/openai/client/components/AiAssistant/Sidebar/AiAssistantList.tsx

@@ -88,66 +88,74 @@ const AiAssistantItem: React.FC<AiAssistantItemProps> = ({
 
   return (
     <>
-      <li
-        onClick={(e) => {
-          e.stopPropagation();
-          openChatHandler(aiAssistant);
-        }}
-        role="button"
-        className="list-group-item list-group-item-action border-0 d-flex align-items-center rounded-1"
-      >
-        <div className="d-flex justify-content-center">
-          <span className="material-symbols-outlined fs-5">
-            {getShareScopeIcon(aiAssistant.shareScope, aiAssistant.accessScope)}
-          </span>
-        </div>
+      <li className="list-group-item border-0 p-0">
+        <button
+          type="button"
+          className="btn btn-link list-group-item-action border-0 d-flex align-items-center rounded-1"
+          onClick={(e) => {
+            e.stopPropagation();
+            openChatHandler(aiAssistant);
+          }}
+          onMouseDown={(e) => {
+            e.preventDefault();
+          }}
+        >
+          <div className="d-flex justify-content-center">
+            <span className="material-symbols-outlined fs-5">
+              {getShareScopeIcon(
+                aiAssistant.shareScope,
+                aiAssistant.accessScope,
+              )}
+            </span>
+          </div>
 
-        <div className="grw-item-title ps-1">
-          <p className="text-truncate m-auto">{aiAssistant.name}</p>
-        </div>
+          <div className="grw-item-title ps-1">
+            <p className="text-truncate m-auto">{aiAssistant.name}</p>
+          </div>
 
-        <div className="grw-btn-actions opacity-0 d-flex justify-content-center">
-          {isPublicAiAssistantOperable && (
-            <button
-              type="button"
-              className="btn btn-link text-secondary p-0"
-              onClick={(e) => {
-                e.stopPropagation();
-                setDefaultAiAssistantHandler();
-              }}
-            >
-              <span
-                className={`material-symbols-outlined fs-5 ${aiAssistant.isDefault ? 'fill' : ''}`}
-              >
-                star
-              </span>
-            </button>
-          )}
-          {isOperable && (
-            <>
-              <button
-                type="button"
-                className="btn btn-link text-secondary p-0"
-                onClick={(e) => {
-                  e.stopPropagation();
-                  openManagementModalHandler(aiAssistant);
-                }}
-              >
-                <span className="material-symbols-outlined fs-5">edit</span>
-              </button>
+          <div className="grw-btn-actions opacity-0 d-flex justify-content-center">
+            {isPublicAiAssistantOperable && (
               <button
                 type="button"
                 className="btn btn-link text-secondary p-0"
                 onClick={(e) => {
                   e.stopPropagation();
-                  onDeleteClick(aiAssistant);
+                  setDefaultAiAssistantHandler();
                 }}
               >
-                <span className="material-symbols-outlined fs-5">delete</span>
+                <span
+                  className={`material-symbols-outlined fs-5 ${aiAssistant.isDefault ? 'fill' : ''}`}
+                >
+                  star
+                </span>
               </button>
-            </>
-          )}
-        </div>
+            )}
+            {isOperable && (
+              <>
+                <button
+                  type="button"
+                  className="btn btn-link text-secondary p-0"
+                  onClick={(e) => {
+                    e.stopPropagation();
+                    openManagementModalHandler(aiAssistant);
+                  }}
+                >
+                  <span className="material-symbols-outlined fs-5">edit</span>
+                </button>
+                <button
+                  type="button"
+                  className="btn btn-link text-secondary p-0"
+                  onClick={(e) => {
+                    e.stopPropagation();
+                    onDeleteClick(aiAssistant);
+                  }}
+                >
+                  <span className="material-symbols-outlined fs-5">delete</span>
+                </button>
+              </>
+            )}
+          </div>
+        </button>
       </li>
     </>
   );

+ 14 - 11
apps/app/src/features/openai/client/components/AiAssistant/Sidebar/ThreadList.tsx

@@ -74,18 +74,20 @@ export const ThreadList: React.FC = () => {
           swrInifiniteResponse={swrInifiniteThreads}
           isReachingEnd={isReachingEnd}
         >
-          {data != null &&
-            data
-              .flatMap((thread) => thread.paginateResult.docs)
-              .map((thread) => (
-                <li
-                  key={thread._id}
-                  role="button"
-                  className="list-group-item list-group-item-action border-0 d-flex align-items-center rounded-1"
+          {data
+            ?.flatMap((thread) => thread.paginateResult.docs)
+            .map((thread) => (
+              <li key={thread._id} className="list-group-item border-0 p-0">
+                <button
+                  type="button"
+                  className="btn btn-link list-group-item-action border-0 d-flex align-items-center rounded-1"
                   onClick={(e) => {
                     e.stopPropagation();
                     openChat(thread.aiAssistant, thread);
                   }}
+                  onMouseDown={(e) => {
+                    e.preventDefault();
+                  }}
                 >
                   <div>
                     <span className="material-symbols-outlined fs-5">chat</span>
@@ -97,7 +99,7 @@ export const ThreadList: React.FC = () => {
                     </p>
                   </div>
 
-                  <div className="grw-btn-actions opacity-0 d-flex justify-content-center ">
+                  <div className="grw-btn-actions opacity-0 d-flex justify-content-center">
                     <button
                       type="button"
                       className="btn btn-link text-secondary p-0"
@@ -114,8 +116,9 @@ export const ThreadList: React.FC = () => {
                       </span>
                     </button>
                   </div>
-                </li>
-              ))}
+                </button>
+              </li>
+            ))}
         </InfiniteScroll>
       </ul>
     </>

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

@@ -22,7 +22,7 @@ export const AiIntegrationDisableMode: FC = () => {
                 {t('ai_integration.ai_integration')}
               </h1>
               <h3
-                // eslint-disable-next-line react/no-danger
+                // biome-ignore lint/security/noDangerouslySetInnerHtml: ignore
                 dangerouslySetInnerHTML={{
                   __html: t('ai_integration.disable_mode_explanation', {
                     documentationUrl,

+ 1 - 7
apps/app/src/features/openai/client/services/editor-assistant/use-editor-assistant.tsx

@@ -431,13 +431,7 @@ export const useEditorAssistant: UseEditorAssistant = () => {
         });
       });
     }
-  }, [
-    codeMirrorEditor,
-    detectedDiff,
-    isTextSelected,
-    selectedText,
-    yDocs?.secondaryDoc,
-  ]);
+  }, [detectedDiff, isTextSelected, yDocs?.secondaryDoc]);
 
   // Set detectedDiff to undefined after applying all detectedDiff to secondaryDoc
   useEffect(() => {

+ 10 - 8
apps/app/src/features/openai/client/services/knowledge-assistant.tsx

@@ -211,6 +211,7 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                     id="swSummaryMode"
                     type="checkbox"
                     role="switch"
+                    aria-checked={form.watch('summaryMode')}
                     className="form-check-input"
                     {...form.register('summaryMode')}
                     disabled={form.formState.isSubmitting || isGenerating}
@@ -218,10 +219,10 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                   <label className="form-check-label" htmlFor="swSummaryMode">
                     {t('sidebar_ai_assistant.summary_mode_label')}
                   </label>
-                  <a
+                  <button
+                    type="button"
                     id="tooltipForHelpOfSummaryMode"
-                    role="button"
-                    className="ms-1"
+                    className="btn btn-link p-0 ms-1"
                   >
                     <span
                       className="material-symbols-outlined fs-6"
@@ -229,7 +230,7 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                     >
                       help
                     </span>
-                  </a>
+                  </button>
                   <UncontrolledTooltip target="tooltipForHelpOfSummaryMode">
                     {t('sidebar_ai_assistant.summary_mode_help')}
                   </UncontrolledTooltip>
@@ -241,6 +242,7 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                     id="swExtendedThinkingMode"
                     type="checkbox"
                     role="switch"
+                    aria-checked={form.watch('extendedThinkingMode')}
                     className="form-check-input"
                     {...form.register('extendedThinkingMode')}
                     disabled={form.formState.isSubmitting || isGenerating}
@@ -251,10 +253,10 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                   >
                     {t('sidebar_ai_assistant.extended_thinking_mode_label')}
                   </label>
-                  <a
+                  <button
+                    type="button"
                     id="tooltipForHelpOfExtendedThinkingMode"
-                    role="button"
-                    className="ms-1"
+                    className="btn btn-link p-0 ms-1"
                   >
                     <span
                       className="material-symbols-outlined fs-6"
@@ -262,7 +264,7 @@ export const useKnowledgeAssistant: UseKnowledgeAssistant = () => {
                     >
                       help
                     </span>
-                  </a>
+                  </button>
                   <UncontrolledTooltip target="tooltipForHelpOfExtendedThinkingMode">
                     {t('sidebar_ai_assistant.extended_thinking_mode_help')}
                   </UncontrolledTooltip>