@qoretechnologies/reqraft 0.10.53 → 0.10.54-pr.115.ge2d364c

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 (215) hide show
  1. package/.claude/CLAUDE.md +25 -0
  2. package/.tasks/INDEX.md +1 -0
  3. package/.tasks/STORY_NETWORK_ISOLATION.md +98 -0
  4. package/README.md +1 -1
  5. package/design/FORM_ENGINE_EXPRESSIONS.md +110 -0
  6. package/design/RENDER_EXPRESSION_TRANSPORT.md +18 -0
  7. package/dist/components/dpqlEditor/dpqlProbe.d.ts +37 -0
  8. package/dist/components/dpqlEditor/dpqlProbe.d.ts.map +1 -0
  9. package/dist/components/dpqlEditor/dpqlProbe.js +203 -0
  10. package/dist/components/dpqlEditor/dpqlProbe.js.map +1 -0
  11. package/dist/components/dpqlEditor/index.d.ts +4 -0
  12. package/dist/components/dpqlEditor/index.d.ts.map +1 -1
  13. package/dist/components/dpqlEditor/index.js +5 -1
  14. package/dist/components/dpqlEditor/index.js.map +1 -1
  15. package/dist/components/dpqlEditor/types.d.ts +29 -2
  16. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  17. package/dist/components/dpqlEditor/useDpqlProbe.d.ts +4 -0
  18. package/dist/components/dpqlEditor/useDpqlProbe.d.ts.map +1 -0
  19. package/dist/components/dpqlEditor/useDpqlProbe.js +29 -0
  20. package/dist/components/dpqlEditor/useDpqlProbe.js.map +1 -0
  21. package/dist/components/dpqlEditor/useDpqlSession.d.ts +5 -2
  22. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  23. package/dist/components/dpqlEditor/useDpqlSession.js +8 -2
  24. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  25. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  26. package/dist/components/form/engine/CompactRow.js +186 -21
  27. package/dist/components/form/engine/CompactRow.js.map +1 -1
  28. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  29. package/dist/components/form/engine/CompactToolbar.js +5 -2
  30. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  31. package/dist/components/form/engine/FormEngine.d.ts +159 -11
  32. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  33. package/dist/components/form/engine/FormEngine.js +376 -75
  34. package/dist/components/form/engine/FormEngine.js.map +1 -1
  35. package/dist/components/form/engine/FormFieldsSkeleton.d.ts +48 -0
  36. package/dist/components/form/engine/FormFieldsSkeleton.d.ts.map +1 -0
  37. package/dist/components/form/engine/FormFieldsSkeleton.js +38 -0
  38. package/dist/components/form/engine/FormFieldsSkeleton.js.map +1 -0
  39. package/dist/components/form/engine/OptionFieldMessages.d.ts +17 -2
  40. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  41. package/dist/components/form/engine/OptionFieldMessages.js +61 -11
  42. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  43. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  44. package/dist/components/form/engine/_structuredData/SchemaDataView.js +7 -1
  45. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  46. package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
  47. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  48. package/dist/components/form/engine/readFirst.d.ts +42 -1
  49. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  50. package/dist/components/form/engine/readFirst.js +74 -7
  51. package/dist/components/form/engine/readFirst.js.map +1 -1
  52. package/dist/components/form/engine/rendererTypes.d.ts +13 -0
  53. package/dist/components/form/engine/rendererTypes.d.ts.map +1 -1
  54. package/dist/components/form/engine/rendererTypes.js.map +1 -1
  55. package/dist/components/form/engine/rowMenuContext.d.ts +78 -0
  56. package/dist/components/form/engine/rowMenuContext.d.ts.map +1 -0
  57. package/dist/components/form/engine/rowMenuContext.js +103 -0
  58. package/dist/components/form/engine/rowMenuContext.js.map +1 -0
  59. package/dist/components/form/engine/typeChoices.d.ts +37 -0
  60. package/dist/components/form/engine/typeChoices.d.ts.map +1 -0
  61. package/dist/components/form/engine/typeChoices.js +25 -0
  62. package/dist/components/form/engine/typeChoices.js.map +1 -0
  63. package/dist/components/form/expressions/ExpressionField.d.ts +7 -1
  64. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  65. package/dist/components/form/expressions/ExpressionField.js +181 -33
  66. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  67. package/dist/components/form/expressions/argumentPresence.d.ts +97 -0
  68. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -0
  69. package/dist/components/form/expressions/argumentPresence.js +203 -0
  70. package/dist/components/form/expressions/argumentPresence.js.map +1 -0
  71. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  72. package/dist/components/form/expressions/builder/argumentLabel.js +9 -4
  73. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  74. package/dist/components/form/expressions/builder/index.d.ts +15 -2
  75. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  76. package/dist/components/form/expressions/builder/index.js +19 -57
  77. package/dist/components/form/expressions/builder/index.js.map +1 -1
  78. package/dist/components/form/expressions/dpqlMockLsp.d.ts +17 -0
  79. package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +1 -1
  80. package/dist/components/form/expressions/dpqlMockLsp.js +75 -9
  81. package/dist/components/form/expressions/dpqlMockLsp.js.map +1 -1
  82. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  83. package/dist/components/form/expressions/renderExpressionToText.js +94 -19
  84. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  85. package/dist/components/form/fields/Field.d.ts.map +1 -1
  86. package/dist/components/form/fields/Field.js +3 -1
  87. package/dist/components/form/fields/Field.js.map +1 -1
  88. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +11 -1
  89. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  90. package/dist/components/form/fields/allowed-values/AllowedValues.js +14 -2
  91. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  92. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  93. package/dist/components/form/fields/auto/AutoFormField.js +13 -2
  94. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  95. package/dist/components/form/fields/rich-text/RichText.d.ts +11 -0
  96. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  97. package/dist/components/form/fields/rich-text/RichText.js +84 -5
  98. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  99. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
  100. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  101. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
  102. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  103. package/dist/components/form/fields/template/TemplateField.d.ts +31 -1
  104. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  105. package/dist/components/form/fields/template/TemplateField.js +507 -40
  106. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  107. package/dist/components/form/index.d.ts +1 -0
  108. package/dist/components/form/index.d.ts.map +1 -1
  109. package/dist/components/form/index.js +1 -0
  110. package/dist/components/form/index.js.map +1 -1
  111. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +1 -0
  112. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +1 -1
  113. package/dist/components/smartEditor/__fixtures__/mockLspServer.js +6 -1
  114. package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +1 -1
  115. package/dist/helpers/dpqlDetection.d.ts +58 -0
  116. package/dist/helpers/dpqlDetection.d.ts.map +1 -0
  117. package/dist/helpers/dpqlDetection.js +164 -0
  118. package/dist/helpers/dpqlDetection.js.map +1 -0
  119. package/dist/helpers/optionUiTypes.d.ts +1 -1
  120. package/dist/helpers/options.d.ts +37 -0
  121. package/dist/helpers/options.d.ts.map +1 -1
  122. package/dist/helpers/options.js +78 -1
  123. package/dist/helpers/options.js.map +1 -1
  124. package/dist/helpers/templateItems.d.ts +47 -0
  125. package/dist/helpers/templateItems.d.ts.map +1 -0
  126. package/dist/helpers/templateItems.js +88 -0
  127. package/dist/helpers/templateItems.js.map +1 -0
  128. package/dist/helpers/templates.d.ts +21 -0
  129. package/dist/helpers/templates.d.ts.map +1 -1
  130. package/dist/helpers/templates.js +49 -3
  131. package/dist/helpers/templates.js.map +1 -1
  132. package/dist/helpers/validations.d.ts.map +1 -1
  133. package/dist/helpers/validations.js +56 -9
  134. package/dist/helpers/validations.js.map +1 -1
  135. package/dist/hooks/useArgSchema.d.ts +2 -1
  136. package/dist/hooks/useArgSchema.d.ts.map +1 -1
  137. package/dist/hooks/useFetch/useFetch.d.ts +3 -1
  138. package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
  139. package/dist/hooks/useFetch/useFetch.js +47 -9
  140. package/dist/hooks/useFetch/useFetch.js.map +1 -1
  141. package/dist/hooks/useTemplates.d.ts +20 -0
  142. package/dist/hooks/useTemplates.d.ts.map +1 -1
  143. package/dist/hooks/useTemplates.js +34 -2
  144. package/dist/hooks/useTemplates.js.map +1 -1
  145. package/dist/index.d.ts +2 -1
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +5 -1
  148. package/dist/index.js.map +1 -1
  149. package/dist/stories/storyNetwork.d.ts +36 -0
  150. package/dist/stories/storyNetwork.d.ts.map +1 -0
  151. package/dist/stories/storyNetwork.js +82 -0
  152. package/dist/stories/storyNetwork.js.map +1 -0
  153. package/dist/utils/fetch.d.ts +151 -1
  154. package/dist/utils/fetch.d.ts.map +1 -1
  155. package/dist/utils/fetch.js +256 -44
  156. package/dist/utils/fetch.js.map +1 -1
  157. package/dist/utils/lspClient.d.ts +6 -0
  158. package/dist/utils/lspClient.d.ts.map +1 -1
  159. package/dist/utils/lspClient.js +62 -11
  160. package/dist/utils/lspClient.js.map +1 -1
  161. package/dist/utils/websocket.d.ts +6 -0
  162. package/dist/utils/websocket.d.ts.map +1 -1
  163. package/dist/utils/websocket.js +15 -7
  164. package/dist/utils/websocket.js.map +1 -1
  165. package/package.json +2 -2
  166. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -2
  167. package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
  168. package/src/components/dpqlEditor/index.ts +4 -0
  169. package/src/components/dpqlEditor/types.ts +26 -2
  170. package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
  171. package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
  172. package/src/components/form/engine/CompactRow.tsx +231 -11
  173. package/src/components/form/engine/CompactToolbar.tsx +10 -3
  174. package/src/components/form/engine/FormEngine.stories.tsx +331 -30
  175. package/src/components/form/engine/FormEngine.tsx +504 -87
  176. package/src/components/form/engine/FormFieldsSkeleton.tsx +76 -0
  177. package/src/components/form/engine/OptionFieldMessages.tsx +89 -11
  178. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +11 -0
  179. package/src/components/form/engine/compactToolbarContext.ts +1 -1
  180. package/src/components/form/engine/readFirst.ts +86 -7
  181. package/src/components/form/engine/rendererTypes.ts +12 -0
  182. package/src/components/form/engine/rowMenuContext.ts +159 -0
  183. package/src/components/form/engine/typeChoices.ts +55 -0
  184. package/src/components/form/expressions/ExpressionField.stories.tsx +828 -31
  185. package/src/components/form/expressions/ExpressionField.tsx +234 -29
  186. package/src/components/form/expressions/argumentPresence.ts +200 -0
  187. package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
  188. package/src/components/form/expressions/builder/index.tsx +31 -75
  189. package/src/components/form/expressions/dpqlMockLsp.ts +81 -1
  190. package/src/components/form/expressions/renderExpressionToText.ts +106 -17
  191. package/src/components/form/fields/Field.tsx +3 -2
  192. package/src/components/form/fields/allowed-values/AllowedValues.tsx +13 -2
  193. package/src/components/form/fields/auto/AutoFormField.tsx +12 -2
  194. package/src/components/form/fields/rich-text/RichText.tsx +112 -19
  195. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
  196. package/src/components/form/fields/template/TemplateField.tsx +667 -95
  197. package/src/components/form/index.tsx +1 -0
  198. package/src/components/log/Log.stories.tsx +2 -1
  199. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +6 -1
  200. package/src/helpers/dpqlDetection.ts +209 -0
  201. package/src/helpers/options.ts +70 -0
  202. package/src/helpers/templateItems.ts +81 -0
  203. package/src/helpers/templates.ts +51 -2
  204. package/src/helpers/validations.ts +59 -9
  205. package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
  206. package/src/hooks/useFetch/useFetch.tsx +53 -7
  207. package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
  208. package/src/hooks/useTemplates.ts +41 -0
  209. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
  210. package/src/index.tsx +14 -1
  211. package/src/stores/currentUser/currentUser.stories.tsx +2 -1
  212. package/src/stories/storyNetwork.ts +92 -0
  213. package/src/utils/fetch.ts +311 -21
  214. package/src/utils/lspClient.ts +68 -11
  215. package/src/utils/websocket.ts +20 -9
@@ -4,10 +4,16 @@ import {
4
4
  } from '@qoretechnologies/reqore/dist/components/RichTextEditor';
5
5
  import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
6
6
  import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
7
+ import { IReqoreTooltip } from '@qoretechnologies/reqore/dist/types/global';
7
8
  import { isEqual, size } from 'lodash';
8
9
  import { memo, useCallback, useEffect, useMemo, useState } from 'react';
9
10
  import { useDebounce } from 'react-use';
11
+ import {
12
+ renderTemplateItemDescriptions,
13
+ templateItemsToShow,
14
+ } from '../../../../helpers/templateItems';
10
15
  import { getTemplateTagStyle } from '../../../../helpers/templates';
16
+ import { useMarkdownRenderer } from '../../../Description/markdownRendererContext';
11
17
 
12
18
  export interface IRichTextFormFieldProps extends Omit<
13
19
  IReqoreRichTextEditorProps,
@@ -19,6 +25,46 @@ export interface IRichTextFormFieldProps extends Omit<
19
25
  templates?: IReqoreFormTemplates;
20
26
  }
21
27
 
28
+ /**
29
+ * What each offered template value is FOR, keyed by the value itself.
30
+ *
31
+ * Built from the templates a field was already given rather than from the
32
+ * chip's metadata, which carries only `image` / `displayName` / style flags —
33
+ * putting a description there would mean threading one through every producer
34
+ * of a template list.
35
+ *
36
+ * Exported so the mapping is assertable without rendering a Slate editor.
37
+ */
38
+ export const getChipTooltipDescriptions = (
39
+ templates?: IReqoreFormTemplates
40
+ ): Record<string, string> => {
41
+ const out: Record<string, string> = {};
42
+
43
+ /* BOTH shapes, because this list arrives in either one. A picker's items are
44
+ normally grouped by category, but a LONE category is opened onto its values
45
+ where the templates are resolved (`templateItemsToShow`), so a field with
46
+ one category hands down a FLAT list of leaves. Walking only groups made
47
+ that the common case and silently lost every tooltip on it — one category
48
+ is the ordinary shape for a field, not the exception.
49
+
50
+ Recursive rather than two-level: a leaf is recognised by carrying a value
51
+ rather than by its depth, so a deeper catalogue works too. */
52
+ const collect = (items: any[] | undefined): void => {
53
+ items?.forEach((item: any) => {
54
+ const value = typeof item?.value === 'object' ? item?.value?.value : item?.value;
55
+ const description = item?.description ?? item?.short_desc;
56
+ if (typeof value === 'string' && typeof description === 'string' && description) {
57
+ out[value] = description;
58
+ }
59
+ collect(item?.items);
60
+ });
61
+ };
62
+
63
+ collect((templates as any)?.items);
64
+
65
+ return out;
66
+ };
67
+
22
68
  export const RichTextFormField = memo(({
23
69
  value,
24
70
  onChange,
@@ -57,26 +103,65 @@ export const RichTextFormField = memo(({
57
103
  setLocalValue(val);
58
104
  };
59
105
 
60
- const handleGetTagProps = useCallback((tag: any): IReqoreTagProps => {
61
- const tagValue = tag.value?.toString();
106
+ // One renderer for both surfaces below — the chip's hover and the picker rows
107
+ // show the same strings, so they must be drawn the same way.
108
+ const renderMarkdown = useMarkdownRenderer();
62
109
 
63
- if (!tagValue) {
64
- return {};
65
- }
110
+ const descriptionByValue = useMemo(() => getChipTooltipDescriptions(templates), [
111
+ JSON.stringify(templates),
112
+ ]);
66
113
 
67
- if (tagValue.startsWith('$')) {
68
- return {
69
- icon: 'ExchangeDollarLine',
70
- leftIconProps: {
71
- image: tag.metadata?.image,
72
- },
73
- labelKey: tag.metadata?.displayName,
74
- ...getTemplateTagStyle(tag.metadata),
75
- };
76
- }
114
+ const handleGetTagProps = useCallback(
115
+ (tag: any): IReqoreTagProps => {
116
+ const tagValue = tag.value?.toString();
117
+
118
+ if (!tagValue) {
119
+ return {};
120
+ }
77
121
 
78
- return {};
79
- }, []);
122
+ if (tagValue.startsWith('$')) {
123
+ return {
124
+ icon: 'ExchangeDollarLine',
125
+ leftIconProps: {
126
+ image: tag.metadata?.image,
127
+ },
128
+ labelKey: tag.metadata?.displayName,
129
+ /* Hovering a chip says what the value IS, not how it is spelled.
130
+ Reqore otherwise falls back to the tag's own value, so a chip
131
+ reading "result" reported `$.result` on hover — the reference the
132
+ author already chose, restating the label in engine syntax instead
133
+ of telling them anything. The path stays discoverable in the
134
+ field's help and in the picker row for an unlabelled value. */
135
+ /* Drawn, for the same reason the picker row is: this description is
136
+ the SAME string the row shows, so leaving it raw here would print
137
+ the punctuation the row no longer prints. A tooltip's `content`
138
+ takes a node, and without a host renderer it stays the plain
139
+ string it always was. */
140
+ /* Drawn, for the same reason the picker row is: this is the SAME
141
+ string the row shows, so leaving it raw here would print the
142
+ punctuation the row no longer prints. A drawn description travels
143
+ as the tooltip's `content` — the prop itself is `string |
144
+ IReqoreTooltip`, and only the object form takes a node. Without a
145
+ host renderer it stays the plain string it always was. */
146
+ tooltip:
147
+ descriptionByValue[tagValue] ?
148
+ renderMarkdown ?
149
+ {
150
+ content: renderMarkdown({
151
+ value: descriptionByValue[tagValue],
152
+ compact: true,
153
+ }) as IReqoreTooltip['content'],
154
+ }
155
+ : descriptionByValue[tagValue]
156
+ : undefined,
157
+ ...getTemplateTagStyle(tag.metadata),
158
+ };
159
+ }
160
+
161
+ return {};
162
+ },
163
+ [descriptionByValue, renderMarkdown]
164
+ );
80
165
 
81
166
  const tags = useMemo<IReqoreRichTextEditorProps['tags']>((): IReqoreRichTextEditorProps['tags'] => {
82
167
  const _tags: IReqoreRichTextEditorProps['tags'] = {};
@@ -87,12 +172,20 @@ export const RichTextFormField = memo(({
87
172
  label: 'Templates',
88
173
  flat: false,
89
174
  description: 'Universal values that can be used in multiple places',
90
- items: templates?.items,
175
+ /* The in-editor list already nests everything under "Templates", so a
176
+ lone category makes the author drill through TWO headers to reach
177
+ the only values on offer. Hoist it. */
178
+ /* Drawn here, at the hand-off to Reqore. A description is prose written
179
+ in the same markdown as every other description this package shows,
180
+ and printing its punctuation at the reader was the last surface still
181
+ doing that. Never made further up: the list is a `JSON.stringify`
182
+ memo key in `TemplateField`. */
183
+ items: renderTemplateItemDescriptions(templateItemsToShow(templates?.items), renderMarkdown),
91
184
  };
92
185
  }
93
186
 
94
187
  return _tags;
95
- }, [allowTemplates, templates]);
188
+ }, [allowTemplates, templates, renderMarkdown]);
96
189
 
97
190
  const formattedValue: IReqoreRichTextEditorProps['value'] =
98
191
  typeof localValue !== 'object' ? [{ type: 'paragraph', children: [{ text: String(localValue ?? '') }] }]
@@ -5,6 +5,7 @@ import { memo } from 'react';
5
5
  import {
6
6
  getTemplateTagStyle,
7
7
  describeTemplateReference,
8
+ templateTooltip,
8
9
  TTemplateMeta,
9
10
  } from '../../../../helpers/templates';
10
11
 
@@ -18,7 +19,8 @@ export interface IReadOnlyTemplateTagProps {
18
19
 
19
20
  /**
20
21
  * The read-only representation of a selected template — a picker-shaped chip:
21
- * the `$`-dollar icon, the resolved display name (raw value in the tooltip), the
22
+ * the `$`-dollar icon, the resolved display name (and what the value IS in the
23
+ * tooltip, not the reference that names it), the
22
24
  * app image when present, coloured by qorus-ide's scheme (info / qorus purple /
23
25
  * success — see `getTemplateTagStyle`). Shared by `TemplateField`'s disabled
24
26
  * branch and the compact read-first row so a template reads identically wherever
@@ -34,7 +36,7 @@ export const ReadOnlyTemplateTag = memo(
34
36
  icon='ExchangeDollarLine'
35
37
  leftIconProps={{ image: metadata?.image }}
36
38
  label={label}
37
- tooltip={value}
39
+ tooltip={templateTooltip(templates, value)}
38
40
  {...getTemplateTagStyle(metadata)}
39
41
  />
40
42
  </ReqoreTagGroup>