@red-hat-developer-hub/backstage-plugin-lightspeed 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +1 -0
  3. package/dist/alpha.d.ts +38 -7
  4. package/dist/api/LightspeedApiClient.esm.js +19 -0
  5. package/dist/api/LightspeedApiClient.esm.js.map +1 -1
  6. package/dist/api/api.esm.js.map +1 -1
  7. package/dist/components/DeleteModal.esm.js +86 -10
  8. package/dist/components/DeleteModal.esm.js.map +1 -1
  9. package/dist/components/LightSpeedChat.esm.js +146 -56
  10. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  11. package/dist/components/LightspeedChatBox.esm.js +4 -0
  12. package/dist/components/LightspeedChatBox.esm.js.map +1 -1
  13. package/dist/components/LightspeedChatBoxHeader.esm.js +88 -23
  14. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  15. package/dist/components/PermissionRequiredState.esm.js +2 -1
  16. package/dist/components/PermissionRequiredState.esm.js.map +1 -1
  17. package/dist/components/RenameConversationModal.esm.js +139 -0
  18. package/dist/components/RenameConversationModal.esm.js.map +1 -0
  19. package/dist/hooks/useLightspeedUpdatePermission.esm.js +12 -0
  20. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -0
  21. package/dist/hooks/useRenameConversation.esm.js +44 -0
  22. package/dist/hooks/useRenameConversation.esm.js.map +1 -0
  23. package/dist/translations/de.esm.js +40 -8
  24. package/dist/translations/de.esm.js.map +1 -1
  25. package/dist/translations/es.esm.js +40 -8
  26. package/dist/translations/es.esm.js.map +1 -1
  27. package/dist/translations/fr.esm.js +40 -8
  28. package/dist/translations/fr.esm.js.map +1 -1
  29. package/dist/translations/ref.esm.js +40 -8
  30. package/dist/translations/ref.esm.js.map +1 -1
  31. package/dist/utils/lightspeed-chatbox-utils.esm.js +24 -45
  32. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
  33. package/package.json +11 -12
@@ -1,8 +1,10 @@
1
- import { jsx } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useState, useMemo } from 'react';
3
3
  import { makeStyles, createStyles } from '@material-ui/core';
4
- import { ChatbotHeaderActions } from '@patternfly/chatbot';
5
- import { Dropdown, DropdownList, DropdownGroup, DropdownItem, MenuToggle } from '@patternfly/react-core';
4
+ import ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';
5
+ import ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';
6
+ import { ChatbotHeaderActions, ChatbotHeaderOptionsDropdown } from '@patternfly/chatbot';
7
+ import { Dropdown, DropdownList, DropdownGroup, DropdownItem, Divider, MenuToggle } from '@patternfly/react-core';
6
8
  import { useTranslation } from '../hooks/useTranslation.esm.js';
7
9
 
8
10
  const useStyles = makeStyles(
@@ -12,13 +14,23 @@ const useStyles = makeStyles(
12
14
  padding: 0,
13
15
  margin: 0
14
16
  }
17
+ },
18
+ optionsToggle: {
19
+ "& svg": {
20
+ transform: "none !important"
21
+ }
22
+ },
23
+ groupTitle: {
24
+ fontWeight: "bold"
15
25
  }
16
26
  })
17
27
  );
18
28
  const LightspeedChatBoxHeader = ({
19
29
  selectedModel,
20
30
  handleSelectedModel,
21
- models
31
+ models,
32
+ isPinningChatsEnabled,
33
+ onPinnedChatsToggle
22
34
  }) => {
23
35
  const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);
24
36
  const { t } = useTranslation();
@@ -26,14 +38,14 @@ const LightspeedChatBoxHeader = ({
26
38
  const groupedModels = useMemo(() => {
27
39
  const groups = {};
28
40
  models.forEach((model) => {
29
- const provider = model.provider || "Other";
41
+ const provider = model.provider || t("chatbox.provider.other");
30
42
  if (!groups[provider]) {
31
43
  groups[provider] = [];
32
44
  }
33
45
  groups[provider].push(model);
34
46
  });
35
47
  return groups;
36
- }, [models]);
48
+ }, [models, t]);
37
49
  const toggle = (toggleRef) => /* @__PURE__ */ jsx(
38
50
  MenuToggle,
39
51
  {
@@ -45,23 +57,76 @@ const LightspeedChatBoxHeader = ({
45
57
  children: selectedModel
46
58
  }
47
59
  );
48
- return /* @__PURE__ */ jsx(ChatbotHeaderActions, { children: /* @__PURE__ */ jsx(
49
- Dropdown,
50
- {
51
- className: styles.dropdown,
52
- isOpen: isOptionsMenuOpen,
53
- onSelect: (_e, value) => {
54
- handleSelectedModel(value);
55
- setIsOptionsMenuOpen(false);
56
- },
57
- onOpenChange: (isOpen) => setIsOptionsMenuOpen(isOpen),
58
- popperProps: { position: "right" },
59
- shouldFocusToggleOnSelect: true,
60
- shouldFocusFirstItemOnOpen: false,
61
- toggle,
62
- children: /* @__PURE__ */ jsx(DropdownList, { children: Object.entries(groupedModels).map(([provider, providerModels]) => /* @__PURE__ */ jsx(DropdownGroup, { label: provider, children: providerModels.map((model) => /* @__PURE__ */ jsx(DropdownItem, { value: model.value, children: model.label }, model.value)) }, provider)) })
63
- }
64
- ) });
60
+ const handlePinningChatsToggle = (state) => {
61
+ onPinnedChatsToggle(state);
62
+ };
63
+ return /* @__PURE__ */ jsxs(ChatbotHeaderActions, { children: [
64
+ /* @__PURE__ */ jsx(
65
+ Dropdown,
66
+ {
67
+ className: styles.dropdown,
68
+ isOpen: isOptionsMenuOpen,
69
+ onSelect: (_e, value) => {
70
+ handleSelectedModel(value);
71
+ setIsOptionsMenuOpen(false);
72
+ },
73
+ onOpenChange: (isOpen) => setIsOptionsMenuOpen(isOpen),
74
+ popperProps: { position: "right" },
75
+ shouldFocusToggleOnSelect: true,
76
+ shouldFocusFirstItemOnOpen: false,
77
+ toggle,
78
+ children: /* @__PURE__ */ jsx(DropdownList, { children: Object.entries(groupedModels).map(
79
+ ([provider, providerModels], index) => /* @__PURE__ */ jsxs(Fragment, { children: [
80
+ /* @__PURE__ */ jsx(
81
+ DropdownGroup,
82
+ {
83
+ className: styles.groupTitle,
84
+ label: provider,
85
+ labelHeadingLevel: "h1",
86
+ children: providerModels.map((model) => /* @__PURE__ */ jsx(DropdownItem, { value: model.value, children: model.label }, model.value))
87
+ },
88
+ provider
89
+ ),
90
+ index < Object.entries(groupedModels).length - 1 && /* @__PURE__ */ jsx(Divider, { component: "li" })
91
+ ] })
92
+ ) })
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsx(
96
+ ChatbotHeaderOptionsDropdown,
97
+ {
98
+ isCompact: true,
99
+ toggleProps: {
100
+ "aria-label": t("aria.settings.label"),
101
+ className: styles.optionsToggle
102
+ },
103
+ tooltipProps: {
104
+ content: t("tooltip.settings")
105
+ },
106
+ children: /* @__PURE__ */ jsx(DropdownGroup, { children: /* @__PURE__ */ jsx(DropdownList, { children: isPinningChatsEnabled ? /* @__PURE__ */ jsx(
107
+ DropdownItem,
108
+ {
109
+ value: "disablePinningChats",
110
+ icon: /* @__PURE__ */ jsx(ToggleOnOutlinedIcon, { sx: { marginTop: "8px" } }),
111
+ description: t("settings.pinned.enabled.description"),
112
+ onClick: () => handlePinningChatsToggle(false),
113
+ children: t("settings.pinned.disable")
114
+ },
115
+ "disablePinningChat"
116
+ ) : /* @__PURE__ */ jsx(
117
+ DropdownItem,
118
+ {
119
+ value: "enablePinningChats",
120
+ icon: /* @__PURE__ */ jsx(ToggleOffOutlinedIcon, { sx: { marginTop: "8px" } }),
121
+ description: t("settings.pinned.disabled.description"),
122
+ onClick: () => handlePinningChatsToggle(true),
123
+ children: t("settings.pinned.enable")
124
+ },
125
+ "enablePinningChats"
126
+ ) }) })
127
+ }
128
+ )
129
+ ] });
65
130
  };
66
131
 
67
132
  export { LightspeedChatBoxHeader };
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useMemo, useState } from 'react';\n\nimport { createStyles, makeStyles } from '@material-ui/core';\nimport { ChatbotHeaderActions } from '@patternfly/chatbot';\nimport {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype LightspeedChatBoxHeaderProps = {\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n};\n\nconst useStyles = makeStyles(() =>\n createStyles({\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n }),\n);\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n handleSelectedModel,\n models,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const styles = useStyles();\n\n // Group models by provider\n const groupedModels = useMemo(() => {\n const groups: {\n [key: string]: { label: string; value: string; provider: string }[];\n } = {};\n\n models.forEach(model => {\n const provider = model.provider || 'Other';\n if (!groups[provider]) {\n groups[provider] = [];\n }\n groups[provider].push(model);\n });\n\n return groups;\n }, [models]);\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n >\n {selectedModel}\n </MenuToggle>\n );\n\n return (\n <ChatbotHeaderActions>\n <Dropdown\n className={styles.dropdown}\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n >\n <DropdownList>\n {Object.entries(groupedModels).map(([provider, providerModels]) => (\n <DropdownGroup key={provider} label={provider}>\n {providerModels.map(model => (\n <DropdownItem value={model.value} key={model.value}>\n {model.label}\n </DropdownItem>\n ))}\n </DropdownGroup>\n ))}\n </DropdownList>\n </Dropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAqCA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,MAC3B,YAAa,CAAA;AAAA,IACX,QAAU,EAAA;AAAA,MACR,YAAc,EAAA;AAAA,QACZ,OAAS,EAAA,CAAA;AAAA,QACT,MAAQ,EAAA;AAAA;AACV;AACF,GACD;AACH,CAAA;AAEO,MAAM,0BAA0B,CAAC;AAAA,EACtC,aAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAoC,KAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAChE,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,MAAM,SAAS,SAAU,EAAA;AAGzB,EAAM,MAAA,aAAA,GAAgB,QAAQ,MAAM;AAClC,IAAA,MAAM,SAEF,EAAC;AAEL,IAAA,MAAA,CAAO,QAAQ,CAAS,KAAA,KAAA;AACtB,MAAM,MAAA,QAAA,GAAW,MAAM,QAAY,IAAA,OAAA;AACnC,MAAI,IAAA,CAAC,MAAO,CAAA,QAAQ,CAAG,EAAA;AACrB,QAAO,MAAA,CAAA,QAAQ,IAAI,EAAC;AAAA;AAEtB,MAAO,MAAA,CAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,KAC5B,CAAA;AAED,IAAO,OAAA,MAAA;AAAA,GACT,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAM,MAAA,MAAA,GAAS,CAAC,SACd,qBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,MACpC,GAAK,EAAA,SAAA;AAAA,MACL,UAAY,EAAA,iBAAA;AAAA,MACZ,OAAS,EAAA,MAAM,oBAAqB,CAAA,CAAC,iBAAiB,CAAA;AAAA,MAErD,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,2BACG,oBACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,QAAA;AAAA,MAClB,MAAQ,EAAA,iBAAA;AAAA,MACR,QAAA,EAAU,CAAC,EAAA,EAAI,KAAU,KAAA;AACvB,QAAA,mBAAA,CAAoB,KAAe,CAAA;AACnC,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,OAC5B;AAAA,MACA,YAAA,EAAc,CAAU,MAAA,KAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,MACnD,WAAA,EAAa,EAAE,QAAA,EAAU,OAAQ,EAAA;AAAA,MACjC,yBAAyB,EAAA,IAAA;AAAA,MACzB,0BAA4B,EAAA,KAAA;AAAA,MAC5B,MAAA;AAAA,MAEA,QAAC,kBAAA,GAAA,CAAA,YAAA,EAAA,EACE,QAAO,EAAA,MAAA,CAAA,OAAA,CAAQ,aAAa,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,QAAU,EAAA,cAAc,CAC3D,qBAAA,GAAA,CAAC,iBAA6B,KAAO,EAAA,QAAA,EAClC,QAAe,EAAA,cAAA,CAAA,GAAA,CAAI,CAClB,KAAA,qBAAA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAO,MAAM,KACxB,EAAA,QAAA,EAAA,KAAA,CAAM,KAD8B,EAAA,EAAA,KAAA,CAAM,KAE7C,CACD,CALiB,EAAA,EAAA,QAMpB,CACD,CACH,EAAA;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useMemo, useState } from 'react';\n\nimport { createStyles, makeStyles } from '@material-ui/core';\nimport ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';\nimport ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';\nimport {\n ChatbotHeaderActions,\n ChatbotHeaderOptionsDropdown,\n} from '@patternfly/chatbot';\nimport {\n Divider,\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\n\nimport { useTranslation } from '../hooks/useTranslation';\n\ntype LightspeedChatBoxHeaderProps = {\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n isPinningChatsEnabled: boolean;\n onPinnedChatsToggle: (state: boolean) => void;\n};\n\nconst useStyles = makeStyles(() =>\n createStyles({\n dropdown: {\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n },\n optionsToggle: {\n '& svg': {\n transform: 'none !important',\n },\n },\n groupTitle: {\n fontWeight: 'bold',\n },\n }),\n);\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n handleSelectedModel,\n models,\n isPinningChatsEnabled,\n onPinnedChatsToggle,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const styles = useStyles();\n\n // Group models by provider\n const groupedModels = useMemo(() => {\n const groups: {\n [key: string]: { label: string; value: string; provider: string }[];\n } = {};\n\n models.forEach(model => {\n const provider = model.provider || t('chatbox.provider.other');\n if (!groups[provider]) {\n groups[provider] = [];\n }\n groups[provider].push(model);\n });\n\n return groups;\n }, [models, t]);\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <MenuToggle\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n >\n {selectedModel}\n </MenuToggle>\n );\n\n const handlePinningChatsToggle = (state: boolean) => {\n onPinnedChatsToggle(state);\n };\n\n return (\n <ChatbotHeaderActions>\n <Dropdown\n className={styles.dropdown}\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n >\n <DropdownList>\n {Object.entries(groupedModels).map(\n ([provider, providerModels], index) => (\n <>\n <DropdownGroup\n className={styles.groupTitle}\n key={provider}\n label={provider}\n labelHeadingLevel=\"h1\"\n >\n {providerModels.map(model => (\n <DropdownItem value={model.value} key={model.value}>\n {model.label}\n </DropdownItem>\n ))}\n </DropdownGroup>\n {index < Object.entries(groupedModels).length - 1 && (\n <Divider component=\"li\" />\n )}\n </>\n ),\n )}\n </DropdownList>\n </Dropdown>\n <ChatbotHeaderOptionsDropdown\n isCompact\n toggleProps={{\n 'aria-label': t('aria.settings.label'),\n className: styles.optionsToggle,\n }}\n tooltipProps={{\n content: t('tooltip.settings'),\n }}\n >\n <DropdownGroup>\n <DropdownList>\n {isPinningChatsEnabled ? (\n <DropdownItem\n value=\"disablePinningChats\"\n key=\"disablePinningChat\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.enabled.description')}\n onClick={() => handlePinningChatsToggle(false)}\n >\n {t('settings.pinned.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enablePinningChats\"\n key=\"enablePinningChats\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.disabled.description')}\n onClick={() => handlePinningChatsToggle(true)}\n >\n {t('settings.pinned.enable')}\n </DropdownItem>\n )}\n </DropdownList>\n </DropdownGroup>\n </ChatbotHeaderOptionsDropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -43,7 +43,8 @@ const PermissionRequiredState = () => {
43
43
  target: "_blank",
44
44
  href: "https://github.com/redhat-developer/rhdh-plugins/blob/main/workspaces/lightspeed/plugins/lightspeed/README.md#permission-framework-support",
45
45
  children: [
46
- "Read more \xA0 ",
46
+ t("common.readMore"),
47
+ " \xA0 ",
47
48
  /* @__PURE__ */ jsx(OpenInNewIcon, {})
48
49
  ]
49
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionRequiredState.esm.js","sources":["../../src/components/PermissionRequiredState.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EmptyState } from '@backstage/core-components';\n\nimport { Button, Typography } from '@material-ui/core';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { PermissionRequiredIcon } from './PermissionRequiredIcon';\nimport { Trans } from './Trans';\n\nconst useStyles = makeStyles(() =>\n createStyles({\n permissionError: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n padding: '100px',\n },\n }),\n);\n\nconst PermissionRequiredState = () => {\n const classes = useStyles();\n const { t } = useTranslation();\n\n return (\n <div className={classes.permissionError}>\n <EmptyState\n title={t('permission.required.title')}\n description={\n <Typography variant=\"subtitle1\">\n <Trans\n message=\"permission.required.description\"\n components={{\n '<b>lightspeed.chat.read</b>': <b>lightspeed.chat.read</b>,\n '<b>lightspeed.chat.create</b>': <b>lightspeed.chat.create</b>,\n }}\n />\n </Typography>\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://github.com/redhat-developer/rhdh-plugins/blob/main/workspaces/lightspeed/plugins/lightspeed/README.md#permission-framework-support\"\n >\n Read more &nbsp; <OpenInNewIcon />\n </Button>\n }\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":[],"mappings":";;;;;;;;;AA0BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,MAC3B,YAAa,CAAA;AAAA,IACX,eAAiB,EAAA;AAAA,MACf,OAAS,EAAA,MAAA;AAAA,MACT,MAAQ,EAAA,MAAA;AAAA,MACR,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA;AAAA;AACX,GACD;AACH,CAAA;AAEA,MAAM,0BAA0B,MAAM;AACpC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,eACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,iCAAA;AAAA,UACR,UAAY,EAAA;AAAA,YACV,6BAAA,kBAAgC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAoB,EAAA,sBAAA,EAAA,CAAA;AAAA,YACtD,+BAAA,kBAAkC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAsB,EAAA,wBAAA,EAAA;AAAA;AAC5D;AAAA,OAEJ,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,EAAE,WAAa,kBAAA,GAAA,CAAC,0BAAuB,CAAG,EAAA;AAAA,MACnD,MACE,kBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,SAAA;AAAA,UACN,MAAO,EAAA,QAAA;AAAA,UACP,IAAK,EAAA,4IAAA;AAAA,UACN,QAAA,EAAA;AAAA,YAAA,iBAAA;AAAA,gCACmB,aAAc,EAAA,EAAA;AAAA;AAAA;AAAA;AAClC;AAAA,GAGN,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PermissionRequiredState.esm.js","sources":["../../src/components/PermissionRequiredState.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EmptyState } from '@backstage/core-components';\n\nimport { Button, Typography } from '@material-ui/core';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { PermissionRequiredIcon } from './PermissionRequiredIcon';\nimport { Trans } from './Trans';\n\nconst useStyles = makeStyles(() =>\n createStyles({\n permissionError: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n padding: '100px',\n },\n }),\n);\n\nconst PermissionRequiredState = () => {\n const classes = useStyles();\n const { t } = useTranslation();\n\n return (\n <div className={classes.permissionError}>\n <EmptyState\n title={t('permission.required.title')}\n description={\n <Typography variant=\"subtitle1\">\n <Trans\n message=\"permission.required.description\"\n components={{\n '<b>lightspeed.chat.read</b>': <b>lightspeed.chat.read</b>,\n '<b>lightspeed.chat.create</b>': <b>lightspeed.chat.create</b>,\n }}\n />\n </Typography>\n }\n missing={{ customImage: <PermissionRequiredIcon /> }}\n action={\n <Button\n variant=\"outlined\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://github.com/redhat-developer/rhdh-plugins/blob/main/workspaces/lightspeed/plugins/lightspeed/README.md#permission-framework-support\"\n >\n {t('common.readMore')} &nbsp; <OpenInNewIcon />\n </Button>\n }\n />\n </div>\n );\n};\nexport default PermissionRequiredState;\n"],"names":[],"mappings":";;;;;;;;;AA0BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,MAC3B,YAAa,CAAA;AAAA,IACX,eAAiB,EAAA;AAAA,MACf,OAAS,EAAA,MAAA;AAAA,MACT,MAAQ,EAAA,MAAA;AAAA,MACR,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA;AAAA;AACX,GACD;AACH,CAAA;AAEA,MAAM,0BAA0B,MAAM;AACpC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAE7B,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,eACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,MACpC,WACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,iCAAA;AAAA,UACR,UAAY,EAAA;AAAA,YACV,6BAAA,kBAAgC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAoB,EAAA,sBAAA,EAAA,CAAA;AAAA,YACtD,+BAAA,kBAAkC,GAAA,CAAA,GAAA,EAAA,EAAE,QAAsB,EAAA,wBAAA,EAAA;AAAA;AAC5D;AAAA,OAEJ,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,EAAE,WAAa,kBAAA,GAAA,CAAC,0BAAuB,CAAG,EAAA;AAAA,MACnD,MACE,kBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,SAAA;AAAA,UACN,MAAO,EAAA,QAAA;AAAA,UACP,IAAK,EAAA,4IAAA;AAAA,UAEJ,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,YAAE,QAAA;AAAA,gCAAS,aAAc,EAAA,EAAA;AAAA;AAAA;AAAA;AAC/C;AAAA,GAGN,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,139 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { TextField } from '@material-ui/core';
4
+ import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
5
+ import CloseIcon from '@mui/icons-material/Close';
6
+ import Alert from '@mui/material/Alert';
7
+ import Box from '@mui/material/Box';
8
+ import Button from '@mui/material/Button';
9
+ import Dialog from '@mui/material/Dialog';
10
+ import DialogActions from '@mui/material/DialogActions';
11
+ import DialogContent from '@mui/material/DialogContent';
12
+ import DialogTitle from '@mui/material/DialogTitle';
13
+ import IconButton from '@mui/material/IconButton';
14
+ import Typography from '@mui/material/Typography';
15
+ import { useRenameConversation } from '../hooks/useRenameConversation.esm.js';
16
+ import { useTranslation } from '../hooks/useTranslation.esm.js';
17
+
18
+ const RenameConversationModal = ({
19
+ isOpen,
20
+ onClose,
21
+ conversationId
22
+ }) => {
23
+ const { t } = useTranslation();
24
+ const {
25
+ mutateAsync: renameConversation,
26
+ isError,
27
+ error
28
+ } = useRenameConversation();
29
+ const [chatName, setChatName] = useState("");
30
+ const handleChatNameChange = (event) => {
31
+ setChatName(event.target.value);
32
+ };
33
+ const handleRename = () => {
34
+ (async () => {
35
+ await renameConversation({
36
+ conversation_id: conversationId,
37
+ newName: chatName,
38
+ invalidateCache: false
39
+ });
40
+ onClose();
41
+ })();
42
+ };
43
+ return /* @__PURE__ */ jsxs(
44
+ Dialog,
45
+ {
46
+ open: isOpen,
47
+ onClose,
48
+ "aria-labelledby": "rename-modal",
49
+ "aria-describedby": "rename-modal-confirmation",
50
+ fullWidth: true,
51
+ children: [
52
+ /* @__PURE__ */ jsx(DialogTitle, { sx: { p: "16px 20px", fontStyle: "inherit" }, children: /* @__PURE__ */ jsxs(
53
+ Box,
54
+ {
55
+ sx: {
56
+ display: "flex",
57
+ alignItems: "center",
58
+ gap: 1
59
+ },
60
+ children: [
61
+ /* @__PURE__ */ jsx(Typography, { component: "span", sx: { fontWeight: "bold" }, children: t("conversation.rename.confirm.title") }),
62
+ /* @__PURE__ */ jsx(
63
+ IconButton,
64
+ {
65
+ "aria-label": "close",
66
+ onClick: onClose,
67
+ title: t("common.close"),
68
+ size: "large",
69
+ sx: {
70
+ position: "absolute",
71
+ right: 1,
72
+ top: 1,
73
+ color: "grey.700"
74
+ },
75
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
76
+ }
77
+ )
78
+ ]
79
+ }
80
+ ) }),
81
+ /* @__PURE__ */ jsx(DialogContent, { id: "rename-modal-body-input", children: /* @__PURE__ */ jsx(
82
+ TextField,
83
+ {
84
+ id: "outlined-chat-name-input",
85
+ label: t("conversation.rename.placeholder"),
86
+ onChange: handleChatNameChange,
87
+ fullWidth: true,
88
+ value: chatName,
89
+ style: { marginTop: "10px" },
90
+ variant: "outlined",
91
+ InputProps: {
92
+ endAdornment: /* @__PURE__ */ jsx(
93
+ IconButton,
94
+ {
95
+ "aria-label": "clear-input",
96
+ onClick: () => setChatName(""),
97
+ edge: "end",
98
+ children: /* @__PURE__ */ jsx(CancelOutlinedIcon, {})
99
+ }
100
+ )
101
+ }
102
+ }
103
+ ) }),
104
+ isError && /* @__PURE__ */ jsx(Box, { maxWidth: "650px", marginLeft: "20px", children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: t("conversation.action.error", {
105
+ error: String(error)
106
+ }) }) }),
107
+ /* @__PURE__ */ jsxs(DialogActions, { style: { justifyContent: "left", padding: "20px" }, children: [
108
+ /* @__PURE__ */ jsx(
109
+ Button,
110
+ {
111
+ variant: "contained",
112
+ sx: {
113
+ textTransform: "none"
114
+ },
115
+ disabled: chatName.trim() === "",
116
+ onClick: handleRename,
117
+ children: t("conversation.rename.confirm.action")
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsx(
121
+ Button,
122
+ {
123
+ variant: "outlined",
124
+ sx: {
125
+ textTransform: "none"
126
+ },
127
+ onClick: onClose,
128
+ children: t("common.cancel")
129
+ },
130
+ "cancel"
131
+ )
132
+ ] })
133
+ ]
134
+ }
135
+ );
136
+ };
137
+
138
+ export { RenameConversationModal };
139
+ //# sourceMappingURL=RenameConversationModal.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenameConversationModal.esm.js","sources":["../../src/components/RenameConversationModal.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useState } from 'react';\n\nimport { TextField } from '@material-ui/core';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\n\nimport { useRenameConversation } from '../hooks/useRenameConversation';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport const RenameConversationModal = ({\n isOpen,\n onClose,\n conversationId,\n}: {\n isOpen: boolean;\n onClose: () => void;\n conversationId: string;\n}) => {\n const { t } = useTranslation();\n const {\n mutateAsync: renameConversation,\n isError,\n error,\n } = useRenameConversation();\n const [chatName, setChatName] = useState<string>('');\n\n const handleChatNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setChatName(event.target.value);\n };\n\n const handleRename = () => {\n (async () => {\n await renameConversation({\n conversation_id: conversationId,\n newName: chatName,\n invalidateCache: false,\n });\n onClose();\n })();\n };\n\n return (\n <Dialog\n open={isOpen}\n onClose={onClose}\n aria-labelledby=\"rename-modal\"\n aria-describedby=\"rename-modal-confirmation\"\n fullWidth\n >\n <DialogTitle sx={{ p: '16px 20px', fontStyle: 'inherit' }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <Typography component=\"span\" sx={{ fontWeight: 'bold' }}>\n {t('conversation.rename.confirm.title')}\n </Typography>\n\n <IconButton\n aria-label=\"close\"\n onClick={onClose}\n title={t('common.close')}\n size=\"large\"\n sx={{\n position: 'absolute',\n right: 1,\n top: 1,\n color: 'grey.700',\n }}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent id=\"rename-modal-body-input\">\n <TextField\n id=\"outlined-chat-name-input\"\n label={t('conversation.rename.placeholder')}\n onChange={handleChatNameChange}\n fullWidth\n value={chatName}\n style={{ marginTop: '10px' }}\n variant=\"outlined\"\n InputProps={{\n endAdornment: (\n <IconButton\n aria-label=\"clear-input\"\n onClick={() => setChatName('')}\n edge=\"end\"\n >\n <CancelOutlinedIcon />\n </IconButton>\n ),\n }}\n />\n </DialogContent>\n {isError && (\n <Box maxWidth=\"650px\" marginLeft=\"20px\">\n <Alert severity=\"error\">\n {t('conversation.action.error' as any, {\n error: String(error),\n })}\n </Alert>\n </Box>\n )}\n <DialogActions style={{ justifyContent: 'left', padding: '20px' }}>\n <Button\n variant=\"contained\"\n sx={{\n textTransform: 'none',\n }}\n disabled={chatName.trim() === ''}\n onClick={handleRename}\n >\n {t('conversation.rename.confirm.action')}\n </Button>\n <Button\n key=\"cancel\"\n variant=\"outlined\"\n sx={{\n textTransform: 'none',\n }}\n onClick={onClose}\n >\n {t('common.cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { usePermission } from '@backstage/plugin-permission-react';
2
+ import { lightspeedChatUpdatePermission } from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';
3
+
4
+ const useLightspeedUpdatePermission = () => {
5
+ const lightspeedUpdatePermissionResult = usePermission({
6
+ permission: lightspeedChatUpdatePermission
7
+ });
8
+ return lightspeedUpdatePermissionResult;
9
+ };
10
+
11
+ export { useLightspeedUpdatePermission };
12
+ //# sourceMappingURL=useLightspeedUpdatePermission.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLightspeedUpdatePermission.esm.js","sources":["../../src/hooks/useLightspeedUpdatePermission.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { lightspeedChatUpdatePermission } from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';\n\nexport const useLightspeedUpdatePermission = () => {\n const lightspeedUpdatePermissionResult = usePermission({\n permission: lightspeedChatUpdatePermission,\n });\n\n return lightspeedUpdatePermissionResult;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,mCAAmC,aAAc,CAAA;AAAA,IACrD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAO,OAAA,gCAAA;AACT;;;;"}
@@ -0,0 +1,44 @@
1
+ import { useApi } from '@backstage/core-plugin-api';
2
+ import { useQueryClient, useMutation } from '@tanstack/react-query';
3
+ import { lightspeedApiRef } from '../api/api.esm.js';
4
+
5
+ const useRenameConversation = () => {
6
+ const lightspeedApi = useApi(lightspeedApiRef);
7
+ const queryClient = useQueryClient();
8
+ return useMutation({
9
+ mutationFn: async (props) => {
10
+ await lightspeedApi.renameConversation(
11
+ props.conversation_id,
12
+ props.newName
13
+ );
14
+ },
15
+ onMutate: async (props) => {
16
+ await queryClient.cancelQueries({ queryKey: ["conversations"] });
17
+ const previousConversations = queryClient.getQueryData([
18
+ "conversations"
19
+ ]);
20
+ queryClient.setQueryData(
21
+ ["conversations"],
22
+ (old) => old.map(
23
+ (c) => c.conversation_id === props.conversation_id ? { ...c, topic_summary: props.newName } : c
24
+ )
25
+ );
26
+ return { previousConversations };
27
+ },
28
+ onSuccess: (_, props) => {
29
+ if (props.invalidateCache) {
30
+ queryClient.invalidateQueries({ queryKey: ["conversations"] });
31
+ }
32
+ },
33
+ onError: (_, __, context) => {
34
+ queryClient.setQueryData(
35
+ ["conversations"],
36
+ context?.previousConversations
37
+ );
38
+ return { success: false };
39
+ }
40
+ });
41
+ };
42
+
43
+ export { useRenameConversation };
44
+ //# sourceMappingURL=useRenameConversation.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRenameConversation.esm.js","sources":["../../src/hooks/useRenameConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\nexport const useRenameConversation = () => {\n const lightspeedApi = useApi(lightspeedApiRef);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (props: {\n conversation_id: string;\n newName: string;\n invalidateCache?: boolean;\n }) => {\n await lightspeedApi.renameConversation(\n props.conversation_id,\n props.newName,\n );\n },\n onMutate: async props => {\n await queryClient.cancelQueries({ queryKey: ['conversations'] });\n\n const previousConversations = queryClient.getQueryData<ConversationList>([\n 'conversations',\n ]);\n\n queryClient.setQueryData(['conversations'], (old: ConversationList) =>\n old.map(c =>\n c.conversation_id === props.conversation_id\n ? { ...c, topic_summary: props.newName }\n : c,\n ),\n );\n\n return { previousConversations };\n },\n onSuccess: (_, props) => {\n if (props.invalidateCache) {\n queryClient.invalidateQueries({ queryKey: ['conversations'] });\n }\n },\n onError: (_, __, context) => {\n queryClient.setQueryData(\n ['conversations'],\n context?.previousConversations,\n );\n return { success: false };\n },\n });\n};\n"],"names":[],"mappings":";;;;AAuBO,MAAM,wBAAwB,MAAM;AACzC,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,cAAc,cAAe,EAAA;AAEnC,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,UAAA,EAAY,OAAO,KAIb,KAAA;AACJ,MAAA,MAAM,aAAc,CAAA,kBAAA;AAAA,QAClB,KAAM,CAAA,eAAA;AAAA,QACN,KAAM,CAAA;AAAA,OACR;AAAA,KACF;AAAA,IACA,QAAA,EAAU,OAAM,KAAS,KAAA;AACvB,MAAA,MAAM,YAAY,aAAc,CAAA,EAAE,UAAU,CAAC,eAAe,GAAG,CAAA;AAE/D,MAAM,MAAA,qBAAA,GAAwB,YAAY,YAA+B,CAAA;AAAA,QACvE;AAAA,OACD,CAAA;AAED,MAAY,WAAA,CAAA,YAAA;AAAA,QAAa,CAAC,eAAe,CAAA;AAAA,QAAG,CAAC,QAC3C,GAAI,CAAA,GAAA;AAAA,UAAI,CAAA,CAAA,KACN,CAAE,CAAA,eAAA,KAAoB,KAAM,CAAA,eAAA,GACxB,EAAE,GAAG,CAAG,EAAA,aAAA,EAAe,KAAM,CAAA,OAAA,EAC7B,GAAA;AAAA;AACN,OACF;AAEA,MAAA,OAAO,EAAE,qBAAsB,EAAA;AAAA,KACjC;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,KAAU,KAAA;AACvB,MAAA,IAAI,MAAM,eAAiB,EAAA;AACzB,QAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,eAAe,GAAG,CAAA;AAAA;AAC/D,KACF;AAAA,IACA,OAAS,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,OAAY,KAAA;AAC3B,MAAY,WAAA,CAAA,YAAA;AAAA,QACV,CAAC,eAAe,CAAA;AAAA,QAChB,OAAS,EAAA;AAAA,OACX;AACA,MAAO,OAAA,EAAE,SAAS,KAAM,EAAA;AAAA;AAC1B,GACD,CAAA;AACH;;;;"}
@@ -34,9 +34,13 @@ const lightspeedTranslationDe = createTranslationMessages({
34
34
  "prompts.rhdh.title": "Erste Schritte mit Red Hat Developer Hub",
35
35
  "prompts.rhdh.message": "K\xF6nnen Sie mich durch die ersten Schritte f\xFChren, um Developer Hub als Entwickler zu nutzen, wie das Erkunden des Software-Katalogs und das Hinzuf\xFCgen meines Dienstes?",
36
36
  // Conversation history
37
- "conversation.history.confirm.title": "Chat l\xF6schen?",
38
- "conversation.history.confirm.message": "Sie werden diesen Chat hier nicht mehr sehen. Dies l\xF6scht auch verwandte Aktivit\xE4ten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivit\xE4t.",
39
- "conversation.history.confirm.delete": "L\xF6schen",
37
+ "conversation.delete.confirm.title": "Chat l\xF6schen?",
38
+ "conversation.delete.confirm.message": "Sie werden diesen Chat hier nicht mehr sehen. Dies l\xF6scht auch verwandte Aktivit\xE4ten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivit\xE4t.",
39
+ "conversation.delete.confirm.action": "L\xF6schen",
40
+ "conversation.rename.confirm.title": "Chat umbenennen?",
41
+ "conversation.rename.confirm.action": "Umbenennen",
42
+ "conversation.rename.placeholder": "Chat-Name",
43
+ "conversation.action.error": "Fehler aufgetreten: {{error}}",
40
44
  // Permissions
41
45
  "permission.required.title": "Fehlende Berechtigungen",
42
46
  "permission.required.description": "Um das Lightspeed-Plugin zu sehen, wenden Sie sich an Ihren Administrator, um die Berechtigungen <b>lightspeed.chat.read</b> und <b>lightspeed.chat.create</b> zu erhalten.",
@@ -52,11 +56,19 @@ const lightspeedTranslationDe = createTranslationMessages({
52
56
  "footer.accuracy.popover.link.label": "Mehr erfahren",
53
57
  // Common actions
54
58
  "common.cancel": "Abbrechen",
59
+ "common.close": "Schlie\xDFen",
60
+ "common.readMore": "Mehr erfahren",
61
+ "common.noSearchResults": "Kein Ergebnis entspricht der Suche",
55
62
  // Menu items
56
63
  "menu.newConversation": "Neuer Chat",
57
64
  // Chat-specific UI elements
58
65
  "chatbox.header.title": "Developer Lightspeed",
59
- "chatbox.search.placeholder": "Fr\xFChere Chats durchsuchen...",
66
+ "chatbox.search.placeholder": "Suchen",
67
+ "chatbox.provider.other": "Andere",
68
+ "chatbox.emptyState.noPinnedChats": "Keine angehefteten Chats",
69
+ "chatbox.emptyState.noRecentChats": "Keine k\xFCrzlichen Chats",
70
+ "chatbox.emptyState.noResults.title": "Keine Ergebnisse gefunden",
71
+ "chatbox.emptyState.noResults.body": "Passen Sie Ihre Suchanfrage an und versuchen Sie es erneut. \xDCberpr\xFCfen Sie Ihre Rechtschreibung oder versuchen Sie einen allgemeineren Begriff.",
60
72
  "chatbox.welcome.greeting": "Hallo, {{userName}}",
61
73
  "chatbox.welcome.description": "Wie kann ich Ihnen heute helfen?",
62
74
  "chatbox.message.placeholder": "Senden Sie eine Nachricht und laden Sie optional eine JSON-, YAML-, oder TXT-Datei hoch...",
@@ -65,6 +77,15 @@ const lightspeedTranslationDe = createTranslationMessages({
65
77
  // Accessibility and ARIA labels
66
78
  "aria.chatbotSelector": "Chatbot-Auswahl",
67
79
  "aria.important": "Wichtig",
80
+ "aria.chatHistoryMenu": "Chat-Verlauf-Men\xFC",
81
+ "aria.closeDrawerPanel": "Seitenleiste schlie\xDFen",
82
+ "aria.search.placeholder": "Suchen",
83
+ "aria.searchPreviousConversations": "Fr\xFChere Chats durchsuchen",
84
+ "aria.resize": "Gr\xF6\xDFe \xE4ndern",
85
+ "aria.options.label": "Optionen",
86
+ "aria.scroll.down": "Nach unten",
87
+ "aria.scroll.up": "Nach oben",
88
+ "aria.settings.label": "Chatbot-Optionen",
68
89
  // Modal actions
69
90
  "modal.edit": "Bearbeiten",
70
91
  "modal.save": "Speichern",
@@ -72,6 +93,9 @@ const lightspeedTranslationDe = createTranslationMessages({
72
93
  "modal.cancel": "Abbrechen",
73
94
  // Conversation actions
74
95
  "conversation.delete": "L\xF6schen",
96
+ "conversation.rename": "Umbenennen",
97
+ "conversation.addToPinnedChats": "Anheften",
98
+ "conversation.removeFromPinnedChats": "Losl\xF6sen",
75
99
  "conversation.announcement.userMessage": "Nachricht vom Benutzer: {{prompt}}. Nachricht vom Bot wird geladen.",
76
100
  // User states
77
101
  "user.guest": "Gast",
@@ -82,6 +106,11 @@ const lightspeedTranslationDe = createTranslationMessages({
82
106
  "tooltip.microphone.active": "Aufh\xF6ren zu h\xF6ren",
83
107
  "tooltip.microphone.inactive": "Mikrofon verwenden",
84
108
  "button.newChat": "Neuer Chat",
109
+ "tooltip.chatHistoryMenu": "Chat-Verlauf-Men\xFC",
110
+ "tooltip.responseRecorded": "Antwort aufgezeichnet",
111
+ "tooltip.backToTop": "Nach oben",
112
+ "tooltip.backToBottom": "Nach unten",
113
+ "tooltip.settings": "Chatbot-Optionen",
85
114
  // Modal titles
86
115
  "modal.title.preview": "Anhang-Vorschau",
87
116
  "modal.title.edit": "Anhang bearbeiten",
@@ -117,10 +146,13 @@ const lightspeedTranslationDe = createTranslationMessages({
117
146
  "feedback.completion.title": "Feedback \xFCbermittelt",
118
147
  "feedback.completion.body": "Wir haben Ihre Antwort erhalten. Vielen Dank f\xFCr Ihr Feedback!",
119
148
  // Conversation categorization
120
- "conversation.category.today": "Heute",
121
- "conversation.category.yesterday": "Gestern",
122
- "conversation.category.previous7Days": "Letzte 7 Tage",
123
- "conversation.category.previous30Days": "Letzte 30 Tage"
149
+ "conversation.category.pinnedChats": "Angeheftet",
150
+ "conversation.category.recent": "K\xFCrzlich",
151
+ // lightspeed settings
152
+ "settings.pinned.enable": "Angeheftete Chats aktivieren",
153
+ "settings.pinned.disable": "Angeheftete Chats deaktivieren",
154
+ "settings.pinned.enabled.description": "Angeheftete Chats sind derzeit aktiviert",
155
+ "settings.pinned.disabled.description": "Angeheftete Chats sind derzeit deaktiviert"
124
156
  }
125
157
  });
126
158
 
@@ -1 +1 @@
1
- {"version":3,"file":"de.esm.js","sources":["../../src/translations/de.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createTranslationMessages } from '@backstage/core-plugin-api/alpha';\n\nimport { lightspeedTranslationRef } from './ref';\n\n/**\n * Deutsch translation for Developer Lightspeed.\n * @public\n */\nconst lightspeedTranslationDe = createTranslationMessages({\n ref: lightspeedTranslationRef,\n messages: {\n // Page titles and headers\n 'page.title': 'Lightspeed',\n 'page.subtitle': 'KI-gestützter Entwicklungsassistent',\n\n // Sample prompts - General Development\n 'prompts.codeReadability.title': 'Hilfe zur Code-Lesbarkeit',\n 'prompts.codeReadability.message':\n 'Können Sie Techniken vorschlagen, die ich verwenden kann, um meinen Code lesbarer und wartbarer zu machen?',\n 'prompts.debugging.title': 'Hilfe beim Debugging',\n 'prompts.debugging.message':\n 'Meine Anwendung wirft einen Fehler beim Versuch, sich mit der Datenbank zu verbinden. Können Sie mir helfen, das Problem zu identifizieren?',\n 'prompts.developmentConcept.title': 'Entwicklungskonzept erklären',\n 'prompts.developmentConcept.message':\n 'Können Sie erklären, wie Microservices-Architektur funktioniert und welche Vorteile sie gegenüber einem monolithischen Design hat?',\n 'prompts.codeOptimization.title': 'Code-Optimierungen vorschlagen',\n 'prompts.codeOptimization.message':\n 'Können Sie gängige Möglichkeiten vorschlagen, Code zu optimieren, um bessere Leistung zu erzielen?',\n 'prompts.documentation.title': 'Dokumentationszusammenfassung',\n 'prompts.documentation.message':\n 'Können Sie die Dokumentation für die Implementierung von OAuth 2.0-Authentifizierung in einer Web-App zusammenfassen?',\n 'prompts.gitWorkflows.title': 'Arbeitsabläufe mit Git',\n 'prompts.gitWorkflows.message':\n 'Ich möchte Änderungen am Code in einem anderen Branch vornehmen, ohne meine bestehende Arbeit zu verlieren. Was ist das Verfahren, um dies mit Git zu tun?',\n 'prompts.testingStrategies.title': 'Teststrategien vorschlagen',\n 'prompts.testingStrategies.message':\n 'Können Sie gängige Teststrategien empfehlen, die meine Anwendung robust und fehlerfrei machen?',\n 'prompts.sortingAlgorithms.title': 'Sortieralgorithmen entmystifizieren',\n 'prompts.sortingAlgorithms.message':\n 'Können Sie den Unterschied zwischen einem Quicksort- und einem Mergesort-Algorithmus erklären und wann man welchen verwendet?',\n 'prompts.eventDriven.title': 'Event-getriebene Architektur verstehen',\n 'prompts.eventDriven.message':\n 'Können Sie erklären, was event-getriebene Architektur ist und wann es vorteilhaft ist, sie in der Softwareentwicklung zu verwenden?',\n\n // Sample prompts - RHDH Specific\n 'prompts.tekton.title': 'Mit Tekton bereitstellen',\n 'prompts.tekton.message':\n 'Können Sie mir helfen, die Bereitstellung meiner Anwendung mit Tekton-Pipelines zu automatisieren?',\n 'prompts.openshift.title': 'OpenShift-Bereitstellung erstellen',\n 'prompts.openshift.message':\n 'Können Sie mich durch die Erstellung einer neuen Bereitstellung in OpenShift für eine containerisierte Anwendung führen?',\n 'prompts.rhdh.title': 'Erste Schritte mit Red Hat Developer Hub',\n 'prompts.rhdh.message':\n 'Können Sie mich durch die ersten Schritte führen, um Developer Hub als Entwickler zu nutzen, wie das Erkunden des Software-Katalogs und das Hinzufügen meines Dienstes?',\n\n // Conversation history\n 'conversation.history.confirm.title': 'Chat löschen?',\n 'conversation.history.confirm.message':\n 'Sie werden diesen Chat hier nicht mehr sehen. Dies löscht auch verwandte Aktivitäten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivität.',\n 'conversation.history.confirm.delete': 'Löschen',\n\n // Permissions\n 'permission.required.title': 'Fehlende Berechtigungen',\n 'permission.required.description':\n 'Um das Lightspeed-Plugin zu sehen, wenden Sie sich an Ihren Administrator, um die Berechtigungen <b>lightspeed.chat.read</b> und <b>lightspeed.chat.create</b> zu erhalten.',\n\n // Disclaimers\n 'disclaimer.withValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n 'disclaimer.withoutValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n\n // Footer and feedback\n 'footer.accuracy.label':\n 'Überprüfen Sie KI-generierte Inhalte immer vor der Verwendung.',\n 'footer.accuracy.popover.title': 'Genauigkeit überprüfen',\n 'footer.accuracy.popover.description':\n 'Obwohl Developer Lightspeed sich um Genauigkeit bemüht, besteht immer die Möglichkeit von Fehlern. Es ist eine gute Praxis, kritische Informationen aus zuverlässigen Quellen zu überprüfen, besonders wenn sie für Entscheidungsfindung oder Handlungen entscheidend sind.',\n 'footer.accuracy.popover.image.alt': 'Beispielbild für Fußnoten-Popover',\n 'footer.accuracy.popover.cta.label': 'Verstanden',\n 'footer.accuracy.popover.link.label': 'Mehr erfahren',\n\n // Common actions\n 'common.cancel': 'Abbrechen',\n\n // Menu items\n 'menu.newConversation': 'Neuer Chat',\n\n // Chat-specific UI elements\n 'chatbox.header.title': 'Developer Lightspeed',\n 'chatbox.search.placeholder': 'Frühere Chats durchsuchen...',\n 'chatbox.welcome.greeting': 'Hallo, {{userName}}',\n 'chatbox.welcome.description': 'Wie kann ich Ihnen heute helfen?',\n 'chatbox.message.placeholder':\n 'Senden Sie eine Nachricht und laden Sie optional eine JSON-, YAML-, oder TXT-Datei hoch...',\n 'chatbox.fileUpload.failed': 'Datei-Upload fehlgeschlagen',\n 'chatbox.fileUpload.infoText':\n 'Unterstützte Dateitypen sind: .txt, .yaml, und .json. Die maximale Dateigröße beträgt 25 MB.',\n\n // Accessibility and ARIA labels\n 'aria.chatbotSelector': 'Chatbot-Auswahl',\n 'aria.important': 'Wichtig',\n\n // Modal actions\n 'modal.edit': 'Bearbeiten',\n 'modal.save': 'Speichern',\n 'modal.close': 'Schließen',\n 'modal.cancel': 'Abbrechen',\n\n // Conversation actions\n 'conversation.delete': 'Löschen',\n 'conversation.announcement.userMessage':\n 'Nachricht vom Benutzer: {{prompt}}. Nachricht vom Bot wird geladen.',\n\n // User states\n 'user.guest': 'Gast',\n 'user.loading': '...',\n\n // Button tooltips and labels\n 'tooltip.attach': 'Anhängen',\n 'tooltip.send': 'Senden',\n 'tooltip.microphone.active': 'Aufhören zu hören',\n 'tooltip.microphone.inactive': 'Mikrofon verwenden',\n 'button.newChat': 'Neuer Chat',\n\n // Modal titles\n 'modal.title.preview': 'Anhang-Vorschau',\n 'modal.title.edit': 'Anhang bearbeiten',\n\n // Alt texts for icons\n 'icon.lightspeed.alt': 'Lightspeed-Icon',\n 'icon.permissionRequired.alt': 'Berechtigung erforderlich Icon',\n\n // Message utilities\n 'message.options.label': 'Optionen',\n\n // File attachment errors\n 'file.upload.error.alreadyExists': 'Die Datei existiert bereits.',\n 'file.upload.error.multipleFiles': 'Mehr als eine Datei hochgeladen.',\n 'file.upload.error.unsupportedType':\n 'Nicht unterstützter Dateityp. Unterstützte Typen sind: .txt, .yaml, und .json.',\n 'file.upload.error.fileTooLarge':\n 'Ihre Dateigröße ist zu groß. Bitte stellen Sie sicher, dass Ihre Datei kleiner als 25 MB ist.',\n 'file.upload.error.readFailed':\n 'Fehler beim Lesen der Datei: {{errorMessage}}',\n\n // Developer error messages\n 'error.context.fileAttachment':\n 'useFileAttachmentContext muss innerhalb eines FileAttachmentContextProvider sein',\n\n // Feedback actions\n 'feedback.form.title': 'Warum haben Sie diese Bewertung gewählt?',\n 'feedback.form.textAreaPlaceholder':\n 'Geben Sie optionale zusätzliche Kommentare',\n 'feedback.form.submitWord': 'Absenden',\n 'feedback.tooltips.goodResponse': 'Gute Antwort',\n 'feedback.tooltips.badResponse': 'Schlechte Antwort',\n 'feedback.tooltips.copied': 'Kopiert',\n 'feedback.tooltips.copy': 'Kopieren',\n 'feedback.tooltips.listening': 'Höre zu',\n 'feedback.tooltips.listen': 'Zuhören',\n 'feedback.quickResponses.positive.helpful': 'Hilfreiche Informationen',\n 'feedback.quickResponses.positive.easyToUnderstand': 'Einfach zu verstehen',\n 'feedback.quickResponses.positive.resolvedIssue': 'Hat mein Problem gelöst',\n 'feedback.quickResponses.negative.didntAnswer':\n 'Hat meine Frage nicht beantwortet',\n 'feedback.quickResponses.negative.hardToUnderstand': 'Schwer zu verstehen',\n 'feedback.quickResponses.negative.notHelpful': 'Nicht hilfreich',\n 'feedback.completion.title': 'Feedback übermittelt',\n 'feedback.completion.body':\n 'Wir haben Ihre Antwort erhalten. Vielen Dank für Ihr Feedback!',\n\n // Conversation categorization\n 'conversation.category.today': 'Heute',\n 'conversation.category.yesterday': 'Gestern',\n 'conversation.category.previous7Days': 'Letzte 7 Tage',\n 'conversation.category.previous30Days': 'Letzte 30 Tage',\n },\n});\n\nexport default lightspeedTranslationDe;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"de.esm.js","sources":["../../src/translations/de.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createTranslationMessages } from '@backstage/core-plugin-api/alpha';\n\nimport { lightspeedTranslationRef } from './ref';\n\n/**\n * Deutsch translation for Developer Lightspeed.\n * @public\n */\nconst lightspeedTranslationDe = createTranslationMessages({\n ref: lightspeedTranslationRef,\n messages: {\n // Page titles and headers\n 'page.title': 'Lightspeed',\n 'page.subtitle': 'KI-gestützter Entwicklungsassistent',\n\n // Sample prompts - General Development\n 'prompts.codeReadability.title': 'Hilfe zur Code-Lesbarkeit',\n 'prompts.codeReadability.message':\n 'Können Sie Techniken vorschlagen, die ich verwenden kann, um meinen Code lesbarer und wartbarer zu machen?',\n 'prompts.debugging.title': 'Hilfe beim Debugging',\n 'prompts.debugging.message':\n 'Meine Anwendung wirft einen Fehler beim Versuch, sich mit der Datenbank zu verbinden. Können Sie mir helfen, das Problem zu identifizieren?',\n 'prompts.developmentConcept.title': 'Entwicklungskonzept erklären',\n 'prompts.developmentConcept.message':\n 'Können Sie erklären, wie Microservices-Architektur funktioniert und welche Vorteile sie gegenüber einem monolithischen Design hat?',\n 'prompts.codeOptimization.title': 'Code-Optimierungen vorschlagen',\n 'prompts.codeOptimization.message':\n 'Können Sie gängige Möglichkeiten vorschlagen, Code zu optimieren, um bessere Leistung zu erzielen?',\n 'prompts.documentation.title': 'Dokumentationszusammenfassung',\n 'prompts.documentation.message':\n 'Können Sie die Dokumentation für die Implementierung von OAuth 2.0-Authentifizierung in einer Web-App zusammenfassen?',\n 'prompts.gitWorkflows.title': 'Arbeitsabläufe mit Git',\n 'prompts.gitWorkflows.message':\n 'Ich möchte Änderungen am Code in einem anderen Branch vornehmen, ohne meine bestehende Arbeit zu verlieren. Was ist das Verfahren, um dies mit Git zu tun?',\n 'prompts.testingStrategies.title': 'Teststrategien vorschlagen',\n 'prompts.testingStrategies.message':\n 'Können Sie gängige Teststrategien empfehlen, die meine Anwendung robust und fehlerfrei machen?',\n 'prompts.sortingAlgorithms.title': 'Sortieralgorithmen entmystifizieren',\n 'prompts.sortingAlgorithms.message':\n 'Können Sie den Unterschied zwischen einem Quicksort- und einem Mergesort-Algorithmus erklären und wann man welchen verwendet?',\n 'prompts.eventDriven.title': 'Event-getriebene Architektur verstehen',\n 'prompts.eventDriven.message':\n 'Können Sie erklären, was event-getriebene Architektur ist und wann es vorteilhaft ist, sie in der Softwareentwicklung zu verwenden?',\n\n // Sample prompts - RHDH Specific\n 'prompts.tekton.title': 'Mit Tekton bereitstellen',\n 'prompts.tekton.message':\n 'Können Sie mir helfen, die Bereitstellung meiner Anwendung mit Tekton-Pipelines zu automatisieren?',\n 'prompts.openshift.title': 'OpenShift-Bereitstellung erstellen',\n 'prompts.openshift.message':\n 'Können Sie mich durch die Erstellung einer neuen Bereitstellung in OpenShift für eine containerisierte Anwendung führen?',\n 'prompts.rhdh.title': 'Erste Schritte mit Red Hat Developer Hub',\n 'prompts.rhdh.message':\n 'Können Sie mich durch die ersten Schritte führen, um Developer Hub als Entwickler zu nutzen, wie das Erkunden des Software-Katalogs und das Hinzufügen meines Dienstes?',\n\n // Conversation history\n 'conversation.delete.confirm.title': 'Chat löschen?',\n 'conversation.delete.confirm.message':\n 'Sie werden diesen Chat hier nicht mehr sehen. Dies löscht auch verwandte Aktivitäten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivität.',\n 'conversation.delete.confirm.action': 'Löschen',\n 'conversation.rename.confirm.title': 'Chat umbenennen?',\n 'conversation.rename.confirm.action': 'Umbenennen',\n 'conversation.rename.placeholder': 'Chat-Name',\n 'conversation.action.error': 'Fehler aufgetreten: {{error}}',\n\n // Permissions\n 'permission.required.title': 'Fehlende Berechtigungen',\n 'permission.required.description':\n 'Um das Lightspeed-Plugin zu sehen, wenden Sie sich an Ihren Administrator, um die Berechtigungen <b>lightspeed.chat.read</b> und <b>lightspeed.chat.create</b> zu erhalten.',\n\n // Disclaimers\n 'disclaimer.withValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n 'disclaimer.withoutValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n\n // Footer and feedback\n 'footer.accuracy.label':\n 'Überprüfen Sie KI-generierte Inhalte immer vor der Verwendung.',\n 'footer.accuracy.popover.title': 'Genauigkeit überprüfen',\n 'footer.accuracy.popover.description':\n 'Obwohl Developer Lightspeed sich um Genauigkeit bemüht, besteht immer die Möglichkeit von Fehlern. Es ist eine gute Praxis, kritische Informationen aus zuverlässigen Quellen zu überprüfen, besonders wenn sie für Entscheidungsfindung oder Handlungen entscheidend sind.',\n 'footer.accuracy.popover.image.alt': 'Beispielbild für Fußnoten-Popover',\n 'footer.accuracy.popover.cta.label': 'Verstanden',\n 'footer.accuracy.popover.link.label': 'Mehr erfahren',\n\n // Common actions\n 'common.cancel': 'Abbrechen',\n 'common.close': 'Schließen',\n 'common.readMore': 'Mehr erfahren',\n 'common.noSearchResults': 'Kein Ergebnis entspricht der Suche',\n\n // Menu items\n 'menu.newConversation': 'Neuer Chat',\n\n // Chat-specific UI elements\n 'chatbox.header.title': 'Developer Lightspeed',\n 'chatbox.search.placeholder': 'Suchen',\n 'chatbox.provider.other': 'Andere',\n 'chatbox.emptyState.noPinnedChats': 'Keine angehefteten Chats',\n 'chatbox.emptyState.noRecentChats': 'Keine kürzlichen Chats',\n 'chatbox.emptyState.noResults.title': 'Keine Ergebnisse gefunden',\n 'chatbox.emptyState.noResults.body':\n 'Passen Sie Ihre Suchanfrage an und versuchen Sie es erneut. Überprüfen Sie Ihre Rechtschreibung oder versuchen Sie einen allgemeineren Begriff.',\n 'chatbox.welcome.greeting': 'Hallo, {{userName}}',\n 'chatbox.welcome.description': 'Wie kann ich Ihnen heute helfen?',\n 'chatbox.message.placeholder':\n 'Senden Sie eine Nachricht und laden Sie optional eine JSON-, YAML-, oder TXT-Datei hoch...',\n 'chatbox.fileUpload.failed': 'Datei-Upload fehlgeschlagen',\n 'chatbox.fileUpload.infoText':\n 'Unterstützte Dateitypen sind: .txt, .yaml, und .json. Die maximale Dateigröße beträgt 25 MB.',\n\n // Accessibility and ARIA labels\n 'aria.chatbotSelector': 'Chatbot-Auswahl',\n 'aria.important': 'Wichtig',\n 'aria.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'aria.closeDrawerPanel': 'Seitenleiste schließen',\n 'aria.search.placeholder': 'Suchen',\n 'aria.searchPreviousConversations': 'Frühere Chats durchsuchen',\n 'aria.resize': 'Größe ändern',\n 'aria.options.label': 'Optionen',\n 'aria.scroll.down': 'Nach unten',\n 'aria.scroll.up': 'Nach oben',\n 'aria.settings.label': 'Chatbot-Optionen',\n\n // Modal actions\n 'modal.edit': 'Bearbeiten',\n 'modal.save': 'Speichern',\n 'modal.close': 'Schließen',\n 'modal.cancel': 'Abbrechen',\n\n // Conversation actions\n 'conversation.delete': 'Löschen',\n 'conversation.rename': 'Umbenennen',\n 'conversation.addToPinnedChats': 'Anheften',\n 'conversation.removeFromPinnedChats': 'Loslösen',\n 'conversation.announcement.userMessage':\n 'Nachricht vom Benutzer: {{prompt}}. Nachricht vom Bot wird geladen.',\n\n // User states\n 'user.guest': 'Gast',\n 'user.loading': '...',\n\n // Button tooltips and labels\n 'tooltip.attach': 'Anhängen',\n 'tooltip.send': 'Senden',\n 'tooltip.microphone.active': 'Aufhören zu hören',\n 'tooltip.microphone.inactive': 'Mikrofon verwenden',\n 'button.newChat': 'Neuer Chat',\n 'tooltip.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'tooltip.responseRecorded': 'Antwort aufgezeichnet',\n 'tooltip.backToTop': 'Nach oben',\n 'tooltip.backToBottom': 'Nach unten',\n 'tooltip.settings': 'Chatbot-Optionen',\n\n // Modal titles\n 'modal.title.preview': 'Anhang-Vorschau',\n 'modal.title.edit': 'Anhang bearbeiten',\n\n // Alt texts for icons\n 'icon.lightspeed.alt': 'Lightspeed-Icon',\n 'icon.permissionRequired.alt': 'Berechtigung erforderlich Icon',\n\n // Message utilities\n 'message.options.label': 'Optionen',\n\n // File attachment errors\n 'file.upload.error.alreadyExists': 'Die Datei existiert bereits.',\n 'file.upload.error.multipleFiles': 'Mehr als eine Datei hochgeladen.',\n 'file.upload.error.unsupportedType':\n 'Nicht unterstützter Dateityp. Unterstützte Typen sind: .txt, .yaml, und .json.',\n 'file.upload.error.fileTooLarge':\n 'Ihre Dateigröße ist zu groß. Bitte stellen Sie sicher, dass Ihre Datei kleiner als 25 MB ist.',\n 'file.upload.error.readFailed':\n 'Fehler beim Lesen der Datei: {{errorMessage}}',\n\n // Developer error messages\n 'error.context.fileAttachment':\n 'useFileAttachmentContext muss innerhalb eines FileAttachmentContextProvider sein',\n\n // Feedback actions\n 'feedback.form.title': 'Warum haben Sie diese Bewertung gewählt?',\n 'feedback.form.textAreaPlaceholder':\n 'Geben Sie optionale zusätzliche Kommentare',\n 'feedback.form.submitWord': 'Absenden',\n 'feedback.tooltips.goodResponse': 'Gute Antwort',\n 'feedback.tooltips.badResponse': 'Schlechte Antwort',\n 'feedback.tooltips.copied': 'Kopiert',\n 'feedback.tooltips.copy': 'Kopieren',\n 'feedback.tooltips.listening': 'Höre zu',\n 'feedback.tooltips.listen': 'Zuhören',\n 'feedback.quickResponses.positive.helpful': 'Hilfreiche Informationen',\n 'feedback.quickResponses.positive.easyToUnderstand': 'Einfach zu verstehen',\n 'feedback.quickResponses.positive.resolvedIssue': 'Hat mein Problem gelöst',\n 'feedback.quickResponses.negative.didntAnswer':\n 'Hat meine Frage nicht beantwortet',\n 'feedback.quickResponses.negative.hardToUnderstand': 'Schwer zu verstehen',\n 'feedback.quickResponses.negative.notHelpful': 'Nicht hilfreich',\n 'feedback.completion.title': 'Feedback übermittelt',\n 'feedback.completion.body':\n 'Wir haben Ihre Antwort erhalten. Vielen Dank für Ihr Feedback!',\n\n // Conversation categorization\n 'conversation.category.pinnedChats': 'Angeheftet',\n 'conversation.category.recent': 'Kürzlich',\n\n // lightspeed settings\n 'settings.pinned.enable': 'Angeheftete Chats aktivieren',\n 'settings.pinned.disable': 'Angeheftete Chats deaktivieren',\n 'settings.pinned.enabled.description':\n 'Angeheftete Chats sind derzeit aktiviert',\n 'settings.pinned.disabled.description':\n 'Angeheftete Chats sind derzeit deaktiviert',\n },\n});\n\nexport default lightspeedTranslationDe;\n"],"names":[],"mappings":"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"}