Răsfoiți Sursa

[WEB] Add AI generator items to the Insert menu (#33967)

* adding  abstract generator in the dropdown

* add abstract generator to Insert menu dropdown

* add Keywords generator to Insert menu

* adding title generator and removing some unused code

* adding spanish translations

* adding buildOpenGeneratorHandler

* changing the approach to slots approach

* removing the feature flag

* niptick

* rename the file

* adding tests

* [WEB] Style changes for Writefull pop-up component   (#34067)

GitOrigin-RevId: 0bc97c2c1f3dc458a2ca30e8cc54dddfd5bc9b3b
Davinder Singh 4 luni în urmă
părinte
comite
dceb766db0

+ 1 - 0
services/web/config/settings.defaults.js

@@ -1050,6 +1050,7 @@ module.exports = {
     editorLeftMenuSync: [],
     editorLeftMenuSync: [],
     editorLeftMenuManageTemplate: [],
     editorLeftMenuManageTemplate: [],
     menubarExtraComponents: [],
     menubarExtraComponents: [],
+    insertMenuSections: [],
     oauth2Server: [],
     oauth2Server: [],
     managedGroupSubscriptionEnrollmentNotification: [],
     managedGroupSubscriptionEnrollmentNotification: [],
     managedGroupEnrollmentInvite: [],
     managedGroupEnrollmentInvite: [],

+ 1 - 0
services/web/frontend/js/features/ide-react/components/toolbar/command-dropdown.tsx

@@ -127,6 +127,7 @@ const CommandDropdownChild = ({ item }: { item: Entry<TaggedCommand> }) => {
         onClick={onClickHandler}
         onClick={onClickHandler}
         href={item.href}
         href={item.href}
         disabled={item.disabled}
         disabled={item.disabled}
+        leadingIcon={item.leadingIcon}
         trailingIcon={
         trailingIcon={
           item.shortcuts && <span>{formatShortcut(item.shortcuts[0])}</span>
           item.shortcuts && <span>{formatShortcut(item.shortcuts[0])}</span>
         }
         }

+ 7 - 0
services/web/frontend/js/features/ide-react/components/toolbar/menu-bar.tsx

@@ -33,6 +33,10 @@ const menubarExtraComponents = importOverleafModules(
   import: { default: ElementType }
   import: { default: ElementType }
 }[]
 }[]
 
 
+const insertMenuSections = importOverleafModules('insertMenuSections') as {
+  import: { default: MenuSectionStructure[] }
+}[]
+
 export const ToolbarMenuBar = () => {
 export const ToolbarMenuBar = () => {
   const { t } = useTranslation()
   const { t } = useTranslation()
 
 
@@ -157,6 +161,9 @@ export const ToolbarMenuBar = () => {
         id: 'insert-comment',
         id: 'insert-comment',
         children: ['comment'],
         children: ['comment'],
       },
       },
+      ...insertMenuSections.flatMap(
+        ({ import: { default: sections } }) => sections
+      ),
     ],
     ],
     [t]
     [t]
   )
   )

+ 2 - 0
services/web/frontend/js/features/ide-react/context/command-registry-context.tsx

@@ -5,6 +5,7 @@ import {
   useContext,
   useContext,
   useMemo,
   useMemo,
   useState,
   useState,
+  ReactNode,
 } from 'react'
 } from 'react'
 
 
 type CommandInvocationContext = {
 type CommandInvocationContext = {
@@ -19,6 +20,7 @@ export type Command = {
   handler?: (context: CommandInvocationContext) => void
   handler?: (context: CommandInvocationContext) => void
   href?: string
   href?: string
   disabled?: boolean
   disabled?: boolean
+  leadingIcon?: ReactNode
 }
 }
 
 
 const CommandRegistryContext = createContext<CommandRegistry | undefined>(
 const CommandRegistryContext = createContext<CommandRegistry | undefined>(

+ 6 - 0
services/web/frontend/js/i18n-resources/writefull.ts

@@ -216,6 +216,9 @@ const en = {
     'errors.error-hit-limit-freemium.body':
     'errors.error-hit-limit-freemium.body':
       'You’ve hit your daily AI limit. Upgrade now for unlimited language suggestions and LaTeX support, and early access to upcoming features like TikZ generation.',
       'You’ve hit your daily AI limit. Upgrade now for unlimited language suggestions and LaTeX support, and early access to upcoming features like TikZ generation.',
     'toolbar.abstract-generator.name': 'Abstract generator',
     'toolbar.abstract-generator.name': 'Abstract generator',
+    'insert-menu.abstract-generator': 'Abstract',
+    'insert-menu.keywords-generator': 'Keywords',
+    'insert-menu.title-generator': 'Title',
     'toolbar.abstract-generator.disabled_non_english':
     'toolbar.abstract-generator.disabled_non_english':
       'You need to be writing in English to generate an abstract',
       'You need to be writing in English to generate an abstract',
     'toolbar.keywords-generator.name': 'Keywords generator',
     'toolbar.keywords-generator.name': 'Keywords generator',
@@ -750,6 +753,9 @@ const es = {
     'errors.error-hit-limit-freemium.body':
     'errors.error-hit-limit-freemium.body':
       'Has agotado tu cuota de Writefull. Actualiza ahora para obtener sugerencias de lenguaje ilimitadas y soporte en LaTeX, y acceso anticipado a las próximas funciones de generación como TikZ.',
       'Has agotado tu cuota de Writefull. Actualiza ahora para obtener sugerencias de lenguaje ilimitadas y soporte en LaTeX, y acceso anticipado a las próximas funciones de generación como TikZ.',
     'toolbar.abstract-generator.name': 'Generar Abstract',
     'toolbar.abstract-generator.name': 'Generar Abstract',
+    'insert-menu.abstract-generator': 'Abstract',
+    'insert-menu.keywords-generator': 'Palabras clave',
+    'insert-menu.title-generator': 'Título',
     'toolbar.abstract-generator.disabled_non_english':
     'toolbar.abstract-generator.disabled_non_english':
       'Necesitas estar en un documento en inglés para generar un abstract',
       'Necesitas estar en un documento en inglés para generar un abstract',
     'toolbar.keywords-generator.name': 'Generar Palabras Clave',
     'toolbar.keywords-generator.name': 'Generar Palabras Clave',