diff --git a/cooppilot/apps/cooppilot-front/index.html b/cooppilot/apps/cooppilot-front/index.html index 42af82b..855c538 100644 --- a/cooppilot/apps/cooppilot-front/index.html +++ b/cooppilot/apps/cooppilot-front/index.html @@ -6,7 +6,7 @@ - CoopIA + Chat Coop
diff --git a/cooppilot/apps/cooppilot-front/src/assets/i18n/en.json b/cooppilot/apps/cooppilot-front/src/assets/i18n/en.json index 52967a2..d6a6606 100644 --- a/cooppilot/apps/cooppilot-front/src/assets/i18n/en.json +++ b/cooppilot/apps/cooppilot-front/src/assets/i18n/en.json @@ -1,105 +1,24 @@ { - "Sidebar": { - "talkWith": "Talk with CoopIA", - "Categories": { - "more": "More", - "whatsNew": "What's new ?", - "help": "Help" - } - }, - "Welcome": { - "title": "Hi", - "subTitle": "What do you want to do?", - "selectAgent": "Select a field" - }, - "NewChatHeader": { - "title": "Hello {{name}}", - "subtitle": "Ask me anything!", - "Fragments": { - "FirstSteps": { - "title": "First steps with CoopIA", - "Steps": { - "1": "Find out how CoopIA works and how questions are generated.", - "2": "Find out more about the documents in the database.", - "3": "Ask CoopIA a question and get a response." - } - }, - "Questions": { - "title": "You can ask whatever you want!", - "Orders": { - "title": "About orders", - "Examples": { - "1": "What are the CVI3 cables delivered quantites from my customer Airbus Nantes order of last month?", - "2": "What is the confirmed delivery date for my customer order 4513131010?" - } - }, - "Tools": { - "title": "About tools", - "Examples": { - "1": "What should I do when i have an error code I205 on my ELB?", - "2": "How many cycles with the eBlueTork can I get on one battery charge?", - "3": "I need to thighten at 0.7Nm, which ELB model fit my needs?", - "4": "What is the compatibility of this spare part 61153968375 with other tools?", - "5": "What is the best replacing tool for SH70-LR1100-S90-A4S?" - } - }, - "Stocks": { - "title": "About stocks", - "Examples": { - "1": "Can you give me lastest stock status for DR300 and when is planned the phase out?", - "2": "Which items by customer Airbus Atlantic bought the last 2 years are going to be phase out in the next 6 months?" - } - }, - "People": { - "title": "About people", - "Examples": { - "1": "Who is the Global Key Account Manager that can help me with quoting at Forvia?", - "2": "Who has sold ATEX tools to an Oil and Gas plant in the last 12 months and can help me for quoting?" - } - }, - "Documents": { - "title": "About documents", - "Examples": { - "1": "Make a summary of this document", - "2": "Is it the latest version of this document?" - } - } - } - } - }, - "ChatPromptInput": { - "typeYourMessage": "Type your message or “/” to see suggestions", - "uploadTooltip": "Upload a file", - "micTooltip": "Use your microphone" - }, "Chat": { - "answerError": "Something went wrong", - "answerLoading": "I'm gathering all the tools at my disposal...", - "clearConversation": "Clear conversation", - "clearConversationDesc": "In a few cases, reset conversation history may improve response quality", - "inspireMe": "Inspire me", - "conversationClearSuccess": "Conversation history cleared", - "conversationClearError": "Something went wrong", - "tools": "Tools", - "sources": "Sources", - "details": "Details", "Feedback": { - "title": "Share feedback", - "POSITIVE": { - "desc": "Tell us why you think this answer was helpful", - "submit": "Submit positive feedback" - }, "NEGATIVE": { "desc": "Tell us why you think this answer was not helpful", "submit": "Submit negative feedback" }, - "commentPlaceholder": "Enter your comment", + "POSITIVE": { + "desc": "Tell us why you think this answer was helpful", + "submit": "Submit positive feedback" + }, "comment": "Comment", - "sentDesc": "Thank you for your feedback!", + "commentPlaceholder": "Enter your comment", "createdSuccessfully": "Feedback created successfully", + "sentDesc": "Thank you for your feedback!", + "title": "Share feedback", "updatedSuccessfully": "Feedback updated successfully" }, "Reasoning": { + "get_competitor_alternative": "I’m looking for a competitor product alternative within our product catalog", + "get_competitor_products": "I’m looking for a competitor product matching the provided data", "get_order_by_reference": "I’m searching for an order with this reference", "get_partnumber_from_serialnumber": "I’m retrieving the part number of this serial number", "order_search": "I’m searching for an order based on the provided data", @@ -107,12 +26,12 @@ "product_documents": "I’m looking for a document matching the criteria", "product_maintenance": "I’m looking for maintenance information about this product", "product_search": "Im looking for a product based on the provided data", - "rag_search": "I’m looking for an answer within the knowledge base based on the provided data", - "slt_search": "I’m gathering information about leadtime, stock and price information for this product", - "get_competitor_alternative": "I’m looking for a competitor product alternative within our product catalog", - "get_competitor_products": "I’m looking for a competitor product matching the provided data" + "rag_search": "I’m looking for an answer within the knowledge base", + "slt_search": "I’m gathering information about leadtime, stock and price information for this product" }, "Tools": { + "get_competitor_alternative": "Competitor Alternative", + "get_competitor_products": "Get Competitor Products", "get_order_by_reference": "Order by Reference", "get_partnumber_from_serialnumber": "Partnumber From Serialnumber", "order_search": "Order Search", @@ -121,115 +40,196 @@ "product_maintenance": "Maintenance Information", "product_search": "Product Search", "rag_search": "Document Search (RAG)", - "slt_search": "Stock, Lead Time and Price Information", - "get_competitor_alternative": "Competitor Alternative", - "get_competitor_products": "Get Competitor Products" - } + "slt_search": "Stock, Lead Time and Price Information" + }, + "answerError": "Something went wrong", + "answerLoading": "I'm gathering all the tools at my disposal...", + "clearConversation": "Clear conversation", + "clearConversationDesc": "In a few cases, reset conversation history may improve response quality", + "conversationClearError": "Something went wrong", + "conversationClearSuccess": "Conversation history cleared", + "details": "Details", + "inspireMe": "Inspire me", + "sources": "Sources", + "tools": "Tools" }, - "Toast": { - "successTitle": "Success", - "errorTitle": "Error", - "errorDesc": "Something went wrong" + "ChatPromptInput": { + "micTooltip": "Use your microphone", + "typeYourMessage": "Type your message or “/” to see suggestions", + "uploadTooltip": "Upload a file" }, "Help": { - "title": "Help", - "desc": "Find all the information you need to use CoopIA", - "Questions": { - "title": "Question exemples", - "desc": "Discover what kind of questions you can ask CoopIA" - }, - "Usecases": { - "title": "Usecases", - "desc": "Discover how CoopIA can help you", + "ExpMode": { "Examples": { "1": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "2": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "3": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "4": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" } - } + }, + "desc": "Discover how to improve your overall experience", + "title": "Experimental mode" }, "Features": { - "title": "Features", - "desc": "Discover what you can do with CoopIA", "Examples": { "1": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "2": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "3": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "4": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" } - } + }, + "desc": "Discover what you can do with CoopIA", + "title": "Features" }, "Privacy": { - "title": "Privacy", - "desc": "Learn how your data is protected", "Examples": { "1": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "2": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "3": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "4": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" } - } + }, + "desc": "Learn how your data is protected", + "title": "Privacy" }, - "ExpMode": { - "title": "Experimental mode", - "desc": "Discover how to improve your overall experience", + "Questions": { + "desc": "Discover what kind of questions you can ask CoopIA", + "title": "Question exemples" + }, + "Usecases": { "Examples": { "1": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "2": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "3": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" }, "4": { - "title": "This is a kind of question user could ask himself?", - "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it." + "desc": "Here is the answer and revelant information that can help user to understand what CoopIA can do and when it can use it.", + "title": "This is a kind of question user could ask himself?" } + }, + "desc": "Discover how CoopIA can help you", + "title": "Usecases" + }, + "desc": "Find all the information you need to use CoopIA", + "title": "Help" + }, + "NewChatHeader": { + "Fragments": { + "FirstSteps": { + "Steps": { + "1": "Find out how CoopIA works and how questions are generated.", + "2": "Find out more about the documents in the database.", + "3": "Ask CoopIA a question and get a response." + }, + "title": "First steps with CoopIA" + }, + "Questions": { + "Documents": { + "Examples": { + "1": "Make a summary of this document", + "2": "Is it the latest version of this document?" + }, + "title": "About documents" + }, + "Orders": { + "Examples": { + "1": "What are the CVI3 cables delivered quantites from my customer Airbus Nantes order of last month?", + "2": "What is the confirmed delivery date for my customer order 4513131010?" + }, + "title": "About orders" + }, + "People": { + "Examples": { + "1": "Who is the Global Key Account Manager that can help me with quoting at Forvia?", + "2": "Who has sold ATEX tools to an Oil and Gas plant in the last 12 months and can help me for quoting?" + }, + "title": "About people" + }, + "Stocks": { + "Examples": { + "1": "Can you give me lastest stock status for DR300 and when is planned the phase out?", + "2": "Which items by customer Airbus Atlantic bought the last 2 years are going to be phase out in the next 6 months?" + }, + "title": "About stocks" + }, + "Tools": { + "Examples": { + "1": "What should I do when i have an error code I205 on my ELB?", + "2": "How many cycles with the eBlueTork can I get on one battery charge?", + "3": "I need to thighten at 0.7Nm, which ELB model fit my needs?", + "4": "What is the compatibility of this spare part 61153968375 with other tools?", + "5": "What is the best replacing tool for SH70-LR1100-S90-A4S?" + }, + "title": "About tools" + }, + "title": "You can ask whatever you want!" } - } + }, + "subtitle": "Ask me anything!", + "title": "Hello {{name}}" }, "News": { - "title": "What's new?", "desc": "Latest CoopIA updates", - "released": "Released on {{date}}" + "released": "Released on {{date}}", + "title": "What's new?" + }, + "Sidebar": { + "Categories": { + "help": "Help", + "more": "More", + "whatsNew": "What's new ?" + }, + "talkWith": "Talk with CoopIA" + }, + "Toast": { + "errorDesc": "Something went wrong", + "errorTitle": "Error", + "successTitle": "Success" + }, + "Welcome": { + "selectAgent": "Select a field", + "subTitle": "What do you want to do?", + "title": "Hi" } -} \ No newline at end of file +} diff --git a/cooppilot/apps/cooppilot-front/src/assets/i18n/fr.json b/cooppilot/apps/cooppilot-front/src/assets/i18n/fr.json index 11425ca..0b6bf42 100644 --- a/cooppilot/apps/cooppilot-front/src/assets/i18n/fr.json +++ b/cooppilot/apps/cooppilot-front/src/assets/i18n/fr.json @@ -1,149 +1,24 @@ { - "Sidebar": { - "talkWith": "Discuter avec CoopIA", - "Categories": { - "more": "Plus d'informations", - "whatsNew": "Quoi de neuf ?", - "help": "Aide" - } - }, - "Welcome": { - "title": "Bonjour !", - "subTitle": "Comment puis-je être utile aujourd’hui ?", - "selectAgent": "Sélectionnez un assistant métier", - "selectQuestion": "Sélectionnez une question", - "orTypeYourQuestion": "ou tapez directement votre question", - "agents": { - "agent-tc": { - "description": "Technico-Commercial", - "questions": [ - "Quelles sont les principales méthodes d'évaluation de la fertilité physique des sols ?", - "Propose-moi un argumentaire pour un agriculteur dont la priorité est l'efficacité commerciale", - "Comment convaincre un agriculteur de mettre en place des pratiques agroécologiques ?", - "Que faire si un agriculteur hésite à investir à cause de l’inflation ?", - "Quels sont les impacts des digestats sur la fertilité des sols ?" - ] - }, - "agent-hse": { - "description": "HSE", - "questions": [ - "Quel est le classement ICPE d'un silo ?", - "Quelles sont les précautions à prendre avant d'intervenir en silo ?", - "Quelles sont les recommandations pour un local de stockage de produit phyto ?", - "Peux-tu m'aider à rédiger ma procédure d'inertage engrais ?", - "Qu'est-ce que les précurseurs d'explosifs ?" - ] - }, - "agent-manager": { - "description": "Management", - "questions": [ - "Comment structurer ma prochaine réunion d’équipe pour qu’elle soit efficace ?", - "Quels indicateurs dois-je suivre pour mesurer la performance de mon équipe ?", - "Aide-moi à préparer l’entretien annuel de mes collaborateurs", - "Comment gérer une situation conflictuelle entre deux collaborateurs ?", - "Quelles sont les meilleures pratiques pour déléguer efficacement ?" - ] - }, - "agent-marketing": { - "description": "Marketing", - "questions": [ - "Quels canaux privilégier pour promouvoir nos offres auprès des jeunes agriculteurs ?", - "Rédige-moi un post LinkedIn engageant sur nos dernières innovations", - "Quelles sont les tendances marketing actuelles dans le secteur agricole ?", - "Construis-moi une stratégie marketing pour notre participation à un salon agricole", - "Quels contenus je dois prioriser pour attirer des visiteurs sur notre site web ?" - ] - } - } - }, - "NewChatHeader": { - "title": "Bonjour {{name}}", - "subtitle": "Demandez-moi tout ce que vous voulez !", - "Fragments": { - "FirstSteps": { - "title": "Premiers pas avec CoopIA", - "Steps": { - "1": "Découvrez comment CoopIA fonctionne et comment les questions sont générées.", - "2": "En savoir plus sur les documents de la base de données.", - "3": "Posez une question à CoopIA et obtenez une réponse." - } - }, - "Questions": { - "title": "Vous pouvez poser toutes les questions que vous voulez !", - "Orders": { - "title": "À propos des commandes", - "Examples": { - "1": "Quelles sont les quantités de câbles CVI3 livrées dans le cadre de la commande passée le mois dernier par mon client Airbus Nantes ?", - "2": "Quelle est la date de livraison confirmée pour la commande de mon client 4513131010 ?" - } - }, - "Tools": { - "title": "A propos des outils", - "Examples": { - "1": "Que dois-je faire lorsque j'ai un code d'erreur I205 sur mon ELB ?", - "2": "Combien de cycles avec l'eBlueTork puis-je obtenir avec une charge de batterie ?", - "3": "J'ai besoin de serrer à 0,7Nm, quel modèle d'ELB correspond à mes besoins ?", - "4": "Quelle est la compatibilité de cette pièce de rechange 61153968375 avec d'autres outils ?", - "5": "Quel est le meilleur outil de remplacement pour SH70-LR1100-S90-A4S ?" - } - }, - "Stocks": { - "title": "A propos des stocks", - "Examples": { - "1": "Pouvez-vous m'indiquer le dernier état des stocks de DR300 et la date prévue pour son retrait progressif ?", - "2": "Quels sont les articles achetés par Airbus Atlantic au cours des deux dernières années qui vont être retirés du marché dans les six prochains mois ?" - } - }, - "People": { - "title": "A propos du personnel", - "Examples": { - "1": "Qui est le Global Key Account Manager qui peut m'aider à établir un devis chez Forvia ?", - "2": "Qui a vendu des outils ATEX à une usine pétrolière et gazière au cours des 12 derniers mois et peut m'aider à établir un devis ?" - } - }, - "Documents": { - "title": "A propos des documents", - "Examples": { - "1": "Faire un résumé de ce document", - "2": "S'agit-il de la dernière version de ce document ?" - } - } - } - } - }, - "ChatPromptInput": { - "typeYourMessage": "Tapez votre message ou \"/\" pour voir les suggestions", - "uploadTooltip": "Télécharger un fichier", - "micTooltip": "Utiliser votre microphone" - }, "Chat": { - "answerError": "Quelque chose n'a pas fonctionné", - "answerLoading": "Je rassemble tous les outils à ma disposition...", - "clearConversation": "Effacer la conversation", - "clearConversationDesc": "Dans certains cas, la réinitialisation de l'historique des conversations peut améliorer la qualité des réponses.", - "inspireMe": "Inspire moi", - "conversationClearSuccess": "Historique de la conversation effacé", - "conversationClearError": "Quelque chose s'est mal passé", - "tools": "Outils", - "sources": "Sources", - "details": "Détails", "Feedback": { - "title": "Partager les commentaires", - "POSITIVE": { - "desc": "Dites-nous pourquoi vous pensez que cette réponse est utile", - "submit": "Soumettre un commentaire positif" - }, "NEGATIVE": { "desc": "Dites-nous pourquoi vous pensez que cette réponse n'est pas utile", "submit": "Soumettre un commentaire négatif" }, - "commentPlaceholder": "Entrez votre commentaire", + "POSITIVE": { + "desc": "Dites-nous pourquoi vous pensez que cette réponse est utile", + "submit": "Soumettre un commentaire positif" + }, "comment": "Commentaire", - "sentDesc": "Merci pour votre commentaire !", + "commentPlaceholder": "Entrez votre commentaire", "createdSuccessfully": "Les commentaires ont été créés avec succès", + "sentDesc": "Merci pour votre commentaire !", + "title": "Partager les commentaires", "updatedSuccessfully": "Les commentaires ont été mis à jour avec succès" }, "Reasoning": { + "get_competitor_alternative": "Je recherche une alternative à un produit concurrent dans notre catalogue de produits", + "get_competitor_products": "Je recherche un produit concurrent correspondant aux données fournies.", "get_order_by_reference": "Je recherche une commande avec cette référence", "get_partnumber_from_serialnumber": "Je recherche la référence de ce numéro de série", "order_search": "Je recherche une commande sur la base des données fournies", @@ -151,12 +26,12 @@ "product_documents": "Je recherche un document correspondant aux critères", "product_maintenance": "Je recherche des informations sur la maintenance de ce produit", "product_search": "Je recherche un produit sur la base des données fournies", - "rag_search": "Je recherche une réponse dans la base de connaissances sur la base des données fournies", - "slt_search": "Je recherche des informations sur les délais, les stocks et les prix de ce produit", - "get_competitor_alternative": "Je recherche une alternative à un produit concurrent dans notre catalogue de produits", - "get_competitor_products": "Je recherche un produit concurrent correspondant aux données fournies." + "rag_search": "Je recherche une réponse dans ma base de connaissances", + "slt_search": "Je recherche des informations sur les délais, les stocks et les prix de ce produit" }, "Tools": { + "get_competitor_alternative": "Concurrents", + "get_competitor_products": "Obtenir des produits concurrents", "get_order_by_reference": "Commande par référence", "get_partnumber_from_serialnumber": "Numéro de pièce à partir du numéro de série", "order_search": "Recherche de commande", @@ -165,115 +40,240 @@ "product_maintenance": "Informations sur la maintenance", "product_search": "Recherche de produit", "rag_search": "Recherche de documents (RAG)", - "slt_search": "Informations sur les stocks, les délais et les prix", - "get_competitor_alternative": "Concurrents", - "get_competitor_products": "Obtenir des produits concurrents" - } + "slt_search": "Informations sur les stocks, les délais et les prix" + }, + "answerError": "Quelque chose n'a pas fonctionné", + "answerLoading": "Je rassemble tous les outils à ma disposition...", + "clearConversation": "Effacer la conversation", + "clearConversationDesc": "Dans certains cas, la réinitialisation de l'historique des conversations peut améliorer la qualité des réponses.", + "conversationClearError": "Quelque chose s'est mal passé", + "conversationClearSuccess": "Historique de la conversation effacé", + "details": "Détails", + "inspireMe": "Inspire moi", + "sources": "Sources", + "tools": "Outils" }, - "Toast": { - "successTitle": "Succès", - "errorTitle": "Erreur", - "errorDesc": "Quelque chose n'a pas fonctionné" + "ChatPromptInput": { + "micTooltip": "Utiliser votre microphone", + "typeYourMessage": "Tapez votre message ou \"/\" pour voir les suggestions", + "uploadTooltip": "Télécharger un fichier" }, "Help": { - "title": "Aide", - "desc": "Retrouvez toutes les informations nécessaires à l'utilisation de CoopIA", - "Questions": { - "title": "Exemples de questions", - "desc": "Découvrez le type de questions que vous pouvez poser à CoopIA." - }, - "Usecases": { - "title": "Cas d'utilisation", - "desc": "Découvrez comment CoopIA peut vous aider", + "ExpMode": { "Examples": { "1": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est le genre de question que l'utilisateur peut se poser ?" }, "2": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "3": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "4": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" } - } + }, + "desc": "Découvrez comment améliorer votre expérience globale", + "title": "Mode expérimental" }, "Features": { - "title": "Fonctionnalités", - "desc": "Découvrez ce que vous pouvez faire avec CoopIA", "Examples": { "1": { - "title": "C'est le genre de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est le genre de question que l'utilisateur peut se poser ?" }, "2": { - "title": "C'est le genre de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est le genre de question que l'utilisateur peut se poser ?" }, "3": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "4": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et des informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et des informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" } - } + }, + "desc": "Découvrez ce que vous pouvez faire avec CoopIA", + "title": "Fonctionnalités" }, "Privacy": { - "title": "Confidentialité", - "desc": "Découvrez comment vos données sont protégées", "Examples": { "1": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand elle peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand elle peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "2": { - "title": "C'est le genre de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est le genre de question que l'utilisateur peut se poser ?" }, "3": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "4": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand elle peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand elle peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" } - } + }, + "desc": "Découvrez comment vos données sont protégées", + "title": "Confidentialité" }, - "ExpMode": { - "title": "Mode expérimental", - "desc": "Découvrez comment améliorer votre expérience globale", + "Questions": { + "desc": "Découvrez le type de questions que vous pouvez poser à CoopIA.", + "title": "Exemples de questions" + }, + "Usecases": { "Examples": { "1": { - "title": "C'est le genre de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "2": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "3": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" }, "4": { - "title": "C'est un type de question que l'utilisateur peut se poser ?", - "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser." + "desc": "Voici la réponse et les informations révélatrices qui peuvent aider l'utilisateur à comprendre ce que CoopIA peut faire et quand il peut l'utiliser.", + "title": "C'est un type de question que l'utilisateur peut se poser ?" } + }, + "desc": "Découvrez comment CoopIA peut vous aider", + "title": "Cas d'utilisation" + }, + "desc": "Retrouvez toutes les informations nécessaires à l'utilisation de CoopIA", + "title": "Aide" + }, + "NewChatHeader": { + "Fragments": { + "FirstSteps": { + "Steps": { + "1": "Découvrez comment CoopIA fonctionne et comment les questions sont générées.", + "2": "En savoir plus sur les documents de la base de données.", + "3": "Posez une question à CoopIA et obtenez une réponse." + }, + "title": "Premiers pas avec CoopIA" + }, + "Questions": { + "Documents": { + "Examples": { + "1": "Faire un résumé de ce document", + "2": "S'agit-il de la dernière version de ce document ?" + }, + "title": "A propos des documents" + }, + "Orders": { + "Examples": { + "1": "Quelles sont les quantités de câbles CVI3 livrées dans le cadre de la commande passée le mois dernier par mon client Airbus Nantes ?", + "2": "Quelle est la date de livraison confirmée pour la commande de mon client 4513131010 ?" + }, + "title": "À propos des commandes" + }, + "People": { + "Examples": { + "1": "Qui est le Global Key Account Manager qui peut m'aider à établir un devis chez Forvia ?", + "2": "Qui a vendu des outils ATEX à une usine pétrolière et gazière au cours des 12 derniers mois et peut m'aider à établir un devis ?" + }, + "title": "A propos du personnel" + }, + "Stocks": { + "Examples": { + "1": "Pouvez-vous m'indiquer le dernier état des stocks de DR300 et la date prévue pour son retrait progressif ?", + "2": "Quels sont les articles achetés par Airbus Atlantic au cours des deux dernières années qui vont être retirés du marché dans les six prochains mois ?" + }, + "title": "A propos des stocks" + }, + "Tools": { + "Examples": { + "1": "Que dois-je faire lorsque j'ai un code d'erreur I205 sur mon ELB ?", + "2": "Combien de cycles avec l'eBlueTork puis-je obtenir avec une charge de batterie ?", + "3": "J'ai besoin de serrer à 0,7Nm, quel modèle d'ELB correspond à mes besoins ?", + "4": "Quelle est la compatibilité de cette pièce de rechange 61153968375 avec d'autres outils ?", + "5": "Quel est le meilleur outil de remplacement pour SH70-LR1100-S90-A4S ?" + }, + "title": "A propos des outils" + }, + "title": "Vous pouvez poser toutes les questions que vous voulez !" } - } + }, + "subtitle": "Demandez-moi tout ce que vous voulez !", + "title": "Bonjour {{name}}" }, "News": { - "title": "Quoi de neuf ?", "desc": "Dernières mises à jour de CoopIA", - "released": "Publié le {{date}}" + "released": "Publié le {{date}}", + "title": "Quoi de neuf ?" + }, + "Sidebar": { + "Categories": { + "help": "Aide", + "more": "Plus d'informations", + "whatsNew": "Quoi de neuf ?" + }, + "talkWith": "Discuter avec CoopIA" + }, + "Toast": { + "errorDesc": "Quelque chose n'a pas fonctionné", + "errorTitle": "Erreur", + "successTitle": "Succès" + }, + "Welcome": { + "agents": { + "agent-hse": { + "description": "HSE", + "questions": [ + "Quel est le classement ICPE d'un silo ?", + "Quelles sont les précautions à prendre avant d'intervenir en silo ?", + "Quelles sont les recommandations pour un local de stockage de produit phyto ?", + "Peux-tu m'aider à rédiger ma procédure d'inertage engrais ?", + "Qu'est-ce que les précurseurs d'explosifs ?" + ] + }, + "agent-manager": { + "description": "Management", + "questions": [ + "Comment structurer ma prochaine réunion d’équipe pour qu’elle soit efficace ?", + "Quels indicateurs dois-je suivre pour mesurer la performance de mon équipe ?", + "Aide-moi à préparer l’entretien annuel de mes collaborateurs", + "Comment gérer une situation conflictuelle entre deux collaborateurs ?", + "Quelles sont les meilleures pratiques pour déléguer efficacement ?" + ] + }, + "agent-marketing": { + "description": "Marketing", + "questions": [ + "Quels canaux privilégier pour promouvoir nos offres auprès des jeunes agriculteurs ?", + "Rédige-moi un post LinkedIn engageant sur nos dernières innovations", + "Quelles sont les tendances marketing actuelles dans le secteur agricole ?", + "Construis-moi une stratégie marketing pour notre participation à un salon agricole", + "Quels contenus je dois prioriser pour attirer des visiteurs sur notre site web ?" + ] + }, + "agent-tc": { + "description": "Technico-Commercial", + "questions": [ + "Quelles sont les principales méthodes d'évaluation de la fertilité physique des sols ?", + "Propose-moi un argumentaire pour un agriculteur dont la priorité est l'efficacité commerciale", + "Comment convaincre un agriculteur de mettre en place des pratiques agroécologiques ?", + "Que faire si un agriculteur hésite à investir à cause de l’inflation ?", + "Quels sont les impacts des digestats sur la fertilité des sols ?" + ] + } + }, + "orTypeYourQuestion": "ou tapez directement votre question", + "selectAgent": "Sélectionnez un assistant métier", + "selectQuestion": "Sélectionnez une question", + "subTitle": "Comment puis-je être utile aujourd’hui ?", + "title": "Bonjour !" } -} \ No newline at end of file +} diff --git a/cooppilot/apps/cooppilot-front/src/components/molecules/ChatAnswer.tsx b/cooppilot/apps/cooppilot-front/src/components/molecules/ChatAnswer.tsx index beb7f3c..32ed663 100644 --- a/cooppilot/apps/cooppilot-front/src/components/molecules/ChatAnswer.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/molecules/ChatAnswer.tsx @@ -1,21 +1,21 @@ -import logo from "@/assets/logo.png"; -import ChatEntryFeedback from "@/components/molecules/ChatEntryFeedback"; -import ChatReasoningLoader from "@/components/molecules/ChatReasoningLoader"; -import ChatAnswerDetails from "@/components/organisms/ChatAnswerDetails"; -import { useChatEntryPolling } from "@/hooks/useChatEntry"; -import { ChatEntry } from "@common/types/back/chat"; -import { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import Markdown from "react-markdown"; -import remarkGfm from "remark-gfm"; +import logo from '@/assets/logo.png' +import ChatEntryFeedback from '@/components/molecules/ChatEntryFeedback' +import ChatReasoningLoader from '@/components/molecules/ChatReasoningLoader' +import ChatAnswerDetails from '@/components/organisms/ChatAnswerDetails' +import { useChatEntryPolling } from '@/hooks/useChatEntry' +import { ChatEntry } from '@common/types/back/chat' +import { useEffect, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import Markdown from 'react-markdown' +import remarkGfm from 'remark-gfm' type ChatAnswerProps = { - projectId: string; - chatEntryId: number; - onChatEntryUpdated: () => void; - onLoaded: () => void; - isActive: boolean; -}; + projectId: string + chatEntryId: number + onChatEntryUpdated: () => void + onLoaded: () => void + isActive: boolean +} const ChatAnswer = ({ projectId, @@ -29,41 +29,41 @@ const ChatAnswer = ({ cachedChatEntry: {} as ChatEntry, projectId, chatId: chatEntryId, - }); - const { t } = useTranslation(); - const [isLoaded, setIsLoaded] = useState(false); + }) + const { t } = useTranslation() + const [isLoaded, setIsLoaded] = useState(false) useEffect(() => { if (chatEntry?.queryStatus !== undefined && !isLoaded) { - setIsLoaded(true); - onLoaded(); + setIsLoaded(true) + onLoaded() } - }, [chatEntry, chatEntry?.queryStatus, isLoaded, onLoaded]); + }, [chatEntry, chatEntry?.queryStatus, isLoaded, onLoaded]) useEffect(() => { - onChatEntryUpdated(); - }, [chatEntry?.queryStatus, onChatEntryUpdated]); + onChatEntryUpdated() + }, [chatEntry?.queryStatus, onChatEntryUpdated]) const Comp = useMemo(() => { - if (chatEntry?.queryStatus === "DONE") { + if (chatEntry?.queryStatus === 'DONE') { return ( {chatEntry.response.answer} - ); - } else if (chatEntry?.queryStatus === "ERROR") { - return
{t("Chat.answerError")}
; + ) + } else if (chatEntry?.queryStatus === 'ERROR') { + return
{t('Chat.answerError')}
} else if ( - chatEntry?.queryStatus === "PENDING" || - chatEntry?.queryStatus === "RUNNING" || - chatEntry?.queryStatus === "CREATING" + chatEntry?.queryStatus === 'PENDING' || + chatEntry?.queryStatus === 'RUNNING' || + chatEntry?.queryStatus === 'CREATING' ) { - return ; + return } else { // return ; - return null; + return null } - }, [chatEntry, t]); + }, [chatEntry, t]) return (
@@ -74,15 +74,15 @@ const ChatAnswer = ({
{Comp}
- {chatEntry?.queryStatus === "DONE" && isActive && ( + {/* {chatEntry?.queryStatus === "DONE" && isActive && ( - )} - {chatEntry?.queryStatus === "DONE" && isActive && ( + )} */} + {chatEntry?.queryStatus === 'DONE' && isActive && ( )} - ); -}; + ) +} -export default ChatAnswer; +export default ChatAnswer diff --git a/cooppilot/apps/cooppilot-front/src/components/organisms/ChatPromptInput.tsx b/cooppilot/apps/cooppilot-front/src/components/organisms/ChatPromptInput.tsx index b113f51..047ae67 100644 --- a/cooppilot/apps/cooppilot-front/src/components/organisms/ChatPromptInput.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/organisms/ChatPromptInput.tsx @@ -1,49 +1,49 @@ -import ChatInput from "@/components/molecules/ChatInput"; -import { Button } from "@/components/ui/button"; -import { Send } from "lucide-react"; -import { ChangeEvent, useCallback, useState } from "react"; -import { useTranslation } from "react-i18next"; +import ChatInput from '@/components/molecules/ChatInput' +import { Button } from '@/components/ui/button' +import { Send } from 'lucide-react' +import { ChangeEvent, useCallback, useState } from 'react' +import { useTranslation } from 'react-i18next' type ChatPromptInputProps = { - sendMessage: (message: string) => Promise; -}; + sendMessage: (message: string) => Promise +} const ChatPromptInput = ({ sendMessage }: ChatPromptInputProps) => { - const { t } = useTranslation("translation", { - keyPrefix: "ChatPromptInput", - }); - const [message, setMessage] = useState(""); + const { t } = useTranslation('translation', { + keyPrefix: 'ChatPromptInput', + }) + const [message, setMessage] = useState('') const onSubmit = async () => { - if (message.trim() === "" || message.length < 2) return; + if (message.trim() === '' || message.length < 2) return - await sendMessage(message); - setMessage(""); - }; + await sendMessage(message) + setMessage('') + } const onKeyDown = (e: React.KeyboardEvent) => { - if (e.key === "Enter" && !e.shiftKey) { - e.preventDefault(); - onSubmit(); + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault() + onSubmit() } - }; + } const onTranscriptionReady = (q?: string) => { - if (!q) return; - setMessage(q); - }; + if (!q) return + setMessage(q) + } const handleChange = useCallback( (e: ChangeEvent) => { - setMessage(e.target.value); + setMessage(e.target.value) }, [setMessage] - ); + ) return (
{
- ); -}; + ) +} -export default ChatPromptInput; +export default ChatPromptInput diff --git a/cooppilot/apps/cooppilot-front/src/components/organisms/Sidebar.tsx b/cooppilot/apps/cooppilot-front/src/components/organisms/Sidebar.tsx index defb81b..560cd3b 100644 --- a/cooppilot/apps/cooppilot-front/src/components/organisms/Sidebar.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/organisms/Sidebar.tsx @@ -1,30 +1,30 @@ -import logo from "@/assets/logo.svg"; -import AccountCard from "@/components/molecules/AccountCard"; -import SidebarNavCategory from "@/components/molecules/SidebarNavCategory"; -import useNavBarCategories from "@/hooks/useNavBarCategories"; -import { Bot } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import logo from '@/assets/logo.svg' +import AccountCard from '@/components/molecules/AccountCard' +import SidebarNavCategory from '@/components/molecules/SidebarNavCategory' +import useNavBarCategories from '@/hooks/useNavBarCategories' +import { Bot } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { Link } from 'react-router-dom' const Sidebar = () => { - const { t } = useTranslation("translation", { - keyPrefix: "Sidebar", - }); - const { unnamedCategories } = useNavBarCategories(); + const { t } = useTranslation('translation', { + keyPrefix: 'Sidebar', + }) + const { unnamedCategories } = useNavBarCategories() return (
Logo - CoopIA + Chat Coop
- {t("talkWith")} + {t('talkWith')}
{unnamedCategories.map((category, index) => ( @@ -35,7 +35,7 @@ const Sidebar = () => {
- ); -}; + ) +} -export default Sidebar; +export default Sidebar diff --git a/cooppilot/apps/cooppilot-front/src/components/organisms/TopBar.tsx b/cooppilot/apps/cooppilot-front/src/components/organisms/TopBar.tsx index 6ea4fa3..ff62b49 100644 --- a/cooppilot/apps/cooppilot-front/src/components/organisms/TopBar.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/organisms/TopBar.tsx @@ -1,5 +1,5 @@ -import logo from "@/assets/logo.png"; -import { Link } from "react-router-dom"; +import logo from '@/assets/logo.png' +import { Link } from 'react-router-dom' const TopBar = () => { // const [drawerOpen, setDrawerOpen] = useState(false); @@ -16,7 +16,10 @@ const TopBar = () => {
- Logo +
+ Logo + hat Coop +
@@ -51,7 +54,7 @@ const TopBar = () => { */}
- ); -}; + ) +} -export default TopBar; +export default TopBar diff --git a/cooppilot/apps/cooppilot-front/src/components/organisms/WelcomePanel.tsx b/cooppilot/apps/cooppilot-front/src/components/organisms/WelcomePanel.tsx index 832eb2c..abf3f62 100644 --- a/cooppilot/apps/cooppilot-front/src/components/organisms/WelcomePanel.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/organisms/WelcomePanel.tsx @@ -1,15 +1,10 @@ -import { Button } from "@/components/ui/button"; -import { - Carousel, - CarouselContent, - CarouselItem, -} from "@/components/ui/carousel"; -import { useDebounceValue } from "@/hooks/useDebounceValue"; -import { cn } from "@/lib/utils"; -import { ChevronLeftIcon, HomeIcon, PointerIcon } from "lucide-react"; -import { useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { z } from "zod"; +import { Button } from '@/components/ui/button' +import { useDebounceValue } from '@/hooks/useDebounceValue' +import { cn } from '@/lib/utils' +import { ChevronLeftIcon, HomeIcon, PointerIcon } from 'lucide-react' +import { useEffect, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { z } from 'zod' export function WelcomePanel({ agentId, @@ -18,15 +13,15 @@ export function WelcomePanel({ onAgentClear, onQuestionSelect, }: { - agentId: string | undefined; - hidden: boolean; - onAgentSelect: (agentId: string) => void; - onAgentClear: () => void; - onQuestionSelect: (question: string) => void; + agentId: string | undefined + hidden: boolean + onAgentSelect: (agentId: string) => void + onAgentClear: () => void + onQuestionSelect: (question: string) => void }) { - const { t } = useTranslation("translation", { - keyPrefix: "Welcome", - }); + const { t } = useTranslation('translation', { + keyPrefix: 'Welcome', + }) const agents = useMemo(() => { const data = z @@ -34,42 +29,42 @@ export function WelcomePanel({ z.string(), z.object({ description: z.string(), questions: z.array(z.string()) }) ) - .parse(t("agents", { returnObjects: true })); + .parse(t('agents', { returnObjects: true })) return Object.entries(data).map(([agentId, info]) => ({ agentId, ...info, - })); - }, [t]); + })) + }, [t]) const agent = useMemo(() => { - if (agentId == null) return null; - return agents.find((ai) => ai.agentId === agentId); - }, [agentId, agents]); + if (agentId == null) return null + return agents.find((ai) => ai.agentId === agentId) + }, [agentId, agents]) - const debouncedAgentLabel = useDebounceValue(agent?.description, 0, 500); + const debouncedAgentLabel = useDebounceValue(agent?.description, 0, 500) const questions: string[] | null = useMemo(() => { - if (agent == null) return null; - return agent?.questions ?? []; - }, [agent]); + if (agent == null) return null + return agent?.questions ?? [] + }, [agent]) - const debouncedQuestions = useDebounceValue(questions, 0, 500); + const debouncedQuestions = useDebounceValue(questions, 0, 500) - const [question, setQuestion] = useState(); - useEffect(() => setQuestion(undefined), [agentId]); + const [question, setQuestion] = useState() + useEffect(() => setQuestion(undefined), [agentId]) return (
- {t("selectAgent")} + */} + {t('selectAgent')}
- - {t("selectAgent")} + */} + {t('selectAgent')}
- {t("selectQuestion")} + {t('selectQuestion')}
-
+
div]:flex-[0_0_100%]" + 'flex flex-col [&>div]:flex-[0_0_100%]' )} > - - - {agents.map((agentInfo) => ( - - onAgentSelect(agentInfo.agentId)} - className="text-lg font-semibold" - /> - - ))} - - +
+ {agents.map((agentInfo) => ( + onAgentSelect(agentInfo.agentId)} + className="text-lg font-semibold" + /> + ))} +
- - - {debouncedQuestions && - debouncedQuestions.map((question, index) => ( - - onQuestionSelect(question)} - /> - - ))} - - +
+ {debouncedQuestions && + debouncedQuestions?.map((question, index) => ( + onQuestionSelect(question)} + /> + ))} +
- {t("orTypeYourQuestion")} + {t('orTypeYourQuestion')}
- ); + ) } export function WelcomeButton({ @@ -214,23 +199,25 @@ export function WelcomeButton({ onClick, className, }: { - label: string; - onClick: () => void; - className?: string; + label: string + onClick: () => void + className?: string }) { return ( - ); + ) } diff --git a/cooppilot/apps/cooppilot-front/src/components/ui/autosize-textarea.tsx b/cooppilot/apps/cooppilot-front/src/components/ui/autosize-textarea.tsx index 28031bc..400aff0 100644 --- a/cooppilot/apps/cooppilot-front/src/components/ui/autosize-textarea.tsx +++ b/cooppilot/apps/cooppilot-front/src/components/ui/autosize-textarea.tsx @@ -1,12 +1,12 @@ -import { cn } from "@/lib/utils"; -import * as React from "react"; -import { useImperativeHandle } from "react"; +import { cn } from '@/lib/utils' +import * as React from 'react' +import { useImperativeHandle } from 'react' interface UseAutosizeTextAreaProps { - textAreaRef: HTMLTextAreaElement | null; - minHeight?: number; - maxHeight?: number; - triggerAutoSize: string; + textAreaRef: HTMLTextAreaElement | null + minHeight?: number + maxHeight?: number + triggerAutoSize: string } export const useAutosizeTextArea = ({ @@ -15,41 +15,41 @@ export const useAutosizeTextArea = ({ maxHeight = Number.MAX_SAFE_INTEGER, minHeight = 0, }: UseAutosizeTextAreaProps) => { - const [init, setInit] = React.useState(true); + const [init, setInit] = React.useState(true) React.useEffect(() => { // We need to reset the height momentarily to get the correct scrollHeight for the textarea - const offsetBorder = 2; + const offsetBorder = 2 if (textAreaRef) { if (init) { - textAreaRef.style.minHeight = `${minHeight + offsetBorder}px`; + textAreaRef.style.minHeight = `${minHeight + offsetBorder}px` if (maxHeight > minHeight) { - textAreaRef.style.maxHeight = `${maxHeight}px`; + textAreaRef.style.maxHeight = `${maxHeight}px` } - setInit(false); + setInit(false) } - textAreaRef.style.height = `${minHeight + offsetBorder}px`; - const scrollHeight = textAreaRef.scrollHeight; + textAreaRef.style.height = `${minHeight + offsetBorder}px` + const scrollHeight = textAreaRef.scrollHeight // We then set the height directly, outside of the render loop // Trying to set this with state or a ref will product an incorrect value. if (scrollHeight > maxHeight) { - textAreaRef.style.height = `${maxHeight}px`; + textAreaRef.style.height = `${maxHeight}px` } else { - textAreaRef.style.height = `${scrollHeight + offsetBorder}px`; + textAreaRef.style.height = `${scrollHeight + offsetBorder}px` } } - }, [init, maxHeight, minHeight, textAreaRef, triggerAutoSize]); -}; + }, [init, maxHeight, minHeight, textAreaRef, triggerAutoSize]) +} export type AutosizeTextAreaRef = { - textArea: HTMLTextAreaElement; - maxHeight: number; - minHeight: number; -}; + textArea: HTMLTextAreaElement + maxHeight: number + minHeight: number +} type AutosizeTextAreaProps = { - maxHeight?: number; - minHeight?: number; -} & React.TextareaHTMLAttributes; + maxHeight?: number + minHeight?: number +} & React.TextareaHTMLAttributes export const AutosizeTextarea = React.forwardRef< AutosizeTextAreaRef, @@ -66,26 +66,26 @@ export const AutosizeTextarea = React.forwardRef< }: AutosizeTextAreaProps, ref: React.Ref ) => { - const textAreaRef = React.useRef(null); - const [triggerAutoSize, setTriggerAutoSize] = React.useState(""); + const textAreaRef = React.useRef(null) + const [triggerAutoSize, setTriggerAutoSize] = React.useState('') useAutosizeTextArea({ textAreaRef: textAreaRef.current, triggerAutoSize: triggerAutoSize, maxHeight, minHeight, - }); + }) useImperativeHandle(ref, () => ({ textArea: textAreaRef.current as HTMLTextAreaElement, focus: () => textAreaRef.current?.focus(), maxHeight, minHeight, - })); + })) React.useEffect(() => { - setTriggerAutoSize(value as string); - }, [props?.defaultValue, value]); + setTriggerAutoSize(value as string) + }, [props?.defaultValue, value]) return (