@qoretechnologies/reqraft 0.10.65 → 0.10.66-pr.145.g26dce00
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.
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +130 -25
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +78 -15
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +48 -1
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +260 -99
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.d.ts +18 -2
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +22 -3
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js +27 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +5 -0
- package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowContext.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts +12 -0
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +72 -39
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.d.ts +3 -0
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
- package/dist/components/form/engine/formAppearance.d.ts +48 -0
- package/dist/components/form/engine/formAppearance.d.ts.map +1 -0
- package/dist/components/form/engine/formAppearance.js +50 -0
- package/dist/components/form/engine/formAppearance.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +14 -2
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +6 -2
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/rowFocus.d.ts +9 -1
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
- package/dist/components/form/engine/rowFocus.js +17 -5
- package/dist/components/form/engine/rowFocus.js.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.js +21 -0
- package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
- package/dist/components/form/fields/ChoiceGroupHeading.d.ts +21 -0
- package/dist/components/form/fields/ChoiceGroupHeading.d.ts.map +1 -0
- package/dist/components/form/fields/ChoiceGroupHeading.js +33 -0
- package/dist/components/form/fields/ChoiceGroupHeading.js.map +1 -0
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +13 -11
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +20 -7
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/allowed-values/savedValues.d.ts +30 -0
- package/dist/components/form/fields/allowed-values/savedValues.d.ts.map +1 -0
- package/dist/components/form/fields/allowed-values/savedValues.js +39 -0
- package/dist/components/form/fields/allowed-values/savedValues.js.map +1 -0
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +18 -8
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/long-string/LongString.d.ts +7 -1
- package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +9 -5
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +6 -5
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/number/Number.d.ts +4 -1
- package/dist/components/form/fields/number/Number.d.ts.map +1 -1
- package/dist/components/form/fields/number/Number.js +13 -5
- package/dist/components/form/fields/number/Number.js.map +1 -1
- package/dist/components/form/fields/radio-group/RadioGroup.d.ts.map +1 -1
- package/dist/components/form/fields/radio-group/RadioGroup.js +13 -7
- package/dist/components/form/fields/radio-group/RadioGroup.js.map +1 -1
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +86 -53
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +2 -0
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.js +2 -0
- package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +3 -2
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -1
- package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.d.ts +2 -1
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.js +19 -13
- package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
- package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketHeader.js +4 -1
- package/dist/components/supportTicket/TicketHeader.js.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.js +29 -10
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
- package/dist/components/supportTicket/useLoadedImages.d.ts +10 -0
- package/dist/components/supportTicket/useLoadedImages.d.ts.map +1 -1
- package/dist/components/supportTicket/useLoadedImages.js +63 -1
- package/dist/components/supportTicket/useLoadedImages.js.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.js +6 -2
- package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
- package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
- package/dist/components/ticketThread/TicketThread.js +10 -16
- package/dist/components/ticketThread/TicketThread.js.map +1 -1
- package/dist/helpers/allowedValues.d.ts +12 -0
- package/dist/helpers/allowedValues.d.ts.map +1 -1
- package/dist/helpers/allowedValues.js +20 -1
- package/dist/helpers/allowedValues.js.map +1 -1
- package/dist/helpers/fieldDescription.d.ts +16 -0
- package/dist/helpers/fieldDescription.d.ts.map +1 -0
- package/dist/helpers/fieldDescription.js +40 -0
- package/dist/helpers/fieldDescription.js.map +1 -0
- package/dist/helpers/singleLineString.d.ts.map +1 -1
- package/dist/helpers/singleLineString.js +1 -0
- package/dist/helpers/singleLineString.js.map +1 -1
- package/package.json +1 -1
- package/src/components/form/engine/CompactRow.tsx +143 -23
- package/src/components/form/engine/CompactToolbar.tsx +85 -16
- package/src/components/form/engine/FormEngine.stories.tsx +25 -13
- package/src/components/form/engine/FormEngine.tsx +367 -81
- package/src/components/form/engine/FormEngineAppearance.stories.tsx +540 -0
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +5 -1
- package/src/components/form/engine/OptionFieldMessages.tsx +73 -2
- package/src/components/form/engine/_structuredData/SchemaDataView.tsx +17 -4
- package/src/components/form/engine/compactRowContext.ts +5 -0
- package/src/components/form/engine/compactRowStyles.ts +218 -38
- package/src/components/form/engine/compactToolbarContext.ts +3 -0
- package/src/components/form/engine/formAppearance.ts +78 -0
- package/src/components/form/engine/readFirst.ts +16 -3
- package/src/components/form/engine/rowFocus.ts +17 -6
- package/src/components/form/expressions/renderExpressionToText.ts +15 -0
- package/src/components/form/fields/ChoiceGroupHeading.tsx +38 -0
- package/src/components/form/fields/Field.tsx +11 -9
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +21 -9
- package/src/components/form/fields/allowed-values/savedValues.ts +64 -0
- package/src/components/form/fields/auto/AutoFormField.tsx +17 -4
- package/src/components/form/fields/long-string/LongString.stories.tsx +27 -0
- package/src/components/form/fields/long-string/LongString.tsx +14 -3
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +5 -4
- package/src/components/form/fields/number/Number.tsx +19 -4
- package/src/components/form/fields/radio-group/RadioGroup.tsx +13 -7
- package/src/components/form/fields/template/TemplateField.tsx +49 -17
- package/src/components/form/index.tsx +2 -0
- package/src/components/imageLightbox/ImageLightbox.tsx +2 -0
- package/src/components/supportTicket/InterfaceReferenceTags.tsx +3 -2
- package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -4
- package/src/components/supportTicket/ReferencePicker.tsx +22 -12
- package/src/components/supportTicket/TicketConversation.stories.tsx +0 -1
- package/src/components/supportTicket/TicketHeader.tsx +2 -1
- package/src/components/supportTicket/TicketReplyBox.stories.tsx +24 -21
- package/src/components/supportTicket/TicketReplyBox.tsx +27 -5
- package/src/components/supportTicket/useLoadedImages.ts +20 -0
- package/src/components/ticketReferences/TicketReferences.stories.tsx +26 -0
- package/src/components/ticketReferences/TicketReferences.tsx +12 -4
- package/src/components/ticketThread/TicketThread.stories.tsx +71 -2
- package/src/components/ticketThread/TicketThread.tsx +15 -28
- package/src/helpers/allowedValues.ts +19 -0
- package/src/helpers/fieldDescription.ts +39 -0
- package/src/helpers/singleLineString.ts +1 -0
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import { getReadableColor } from '@qoretechnologies/reqore/dist/helpers/colors';
|
|
14
14
|
import { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
|
|
15
15
|
import { rgba } from 'polished';
|
|
16
|
-
import {
|
|
16
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
17
17
|
import ReactMarkdown from 'react-markdown';
|
|
18
18
|
import styled from 'styled-components';
|
|
19
19
|
import { formatBytes, isImage } from '../../helpers/common';
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
TTicketMessageAuthor,
|
|
26
26
|
TTicketViewerRole,
|
|
27
27
|
} from '../supportTicket';
|
|
28
|
+
import { loadedImageUrl } from '../supportTicket/useLoadedImages';
|
|
28
29
|
|
|
29
30
|
/*
|
|
30
31
|
* Shared support-ticket conversation thread, used by every Qorus surface that
|
|
@@ -32,12 +33,11 @@ import {
|
|
|
32
33
|
* the Qonsole `support-ticket` renderer. Presentational — data in, callbacks out
|
|
33
34
|
* — so each consumer keeps its own fetch/websocket wiring.
|
|
34
35
|
*
|
|
35
|
-
* Rendered as a comment feed: an avatar beside a bordered,
|
|
36
|
+
* Rendered as a comment feed: an avatar beside a bordered, neutral card per
|
|
36
37
|
* message, each hugging its own side. Built on Reqore's `ReqoreBubble` (which
|
|
37
|
-
* supplies the avatar, the bold author label
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* `InterfaceReferenceTags`; the status/priority/category vocabularies live in
|
|
38
|
+
* supplies the avatar, the bold author label and the alignment). Interface
|
|
39
|
+
* references render via the shared `InterfaceReferenceTags`, as quiet tags with
|
|
40
|
+
* the kind's icon; the status/priority/category vocabularies live in
|
|
41
41
|
* `../supportTicket/meta`.
|
|
42
42
|
*
|
|
43
43
|
* Runs of consecutive messages are wrapped in a `ReqoreBubbleGroup`, which prints
|
|
@@ -114,10 +114,11 @@ const AUTHOR_META: Record<TTicketMessageAuthor, IAuthorMeta> = {
|
|
|
114
114
|
system: { icon: 'InformationLine' },
|
|
115
115
|
};
|
|
116
116
|
|
|
117
|
-
//
|
|
118
|
-
// carry who is speaking, which
|
|
119
|
-
//
|
|
120
|
-
|
|
117
|
+
// No side is tinted: the side, the avatar and the author label ("You", "Qorus
|
|
118
|
+
// Support") already carry who is speaking, which leaves colour one job here —
|
|
119
|
+
// amber for an internal note. Never the product's purple, which a support thread
|
|
120
|
+
// does not wear (instruction-files decision 002: purple marks where you are, a
|
|
121
|
+
// chart's accent, and Qonsole).
|
|
121
122
|
|
|
122
123
|
/** Avatar glyph; an internal note carries the "not visible to the customer" eye. */
|
|
123
124
|
const authorIcon = (message: ITicketThreadMessage): IReqoreIconName =>
|
|
@@ -444,6 +445,7 @@ const ImageThumb = ({
|
|
|
444
445
|
useEffect(() => {
|
|
445
446
|
let alive = true;
|
|
446
447
|
fetchAttachmentUrl(attachment.attachment_id)
|
|
448
|
+
.then(loadedImageUrl)
|
|
447
449
|
.then((resolved) => alive && setUrl(resolved))
|
|
448
450
|
.catch(() => alive && setFailed(true));
|
|
449
451
|
return () => {
|
|
@@ -666,23 +668,9 @@ export const TicketThread = ({
|
|
|
666
668
|
avatar={{ icon: authorIcon(message) }}
|
|
667
669
|
label={authorLabel(message, viewerRole)}
|
|
668
670
|
timestamp={message.created ? <ReqoreTimeAgo time={message.created} /> : undefined}
|
|
669
|
-
//
|
|
670
|
-
//
|
|
671
|
-
|
|
672
|
-
// answerable at a glance. Deliberately keyed off `viewerRole`, so it
|
|
673
|
-
// stays correct on the staff surface too (staff replies are the blue
|
|
674
|
-
// ones there). Internal notes keep their warning intent and are not
|
|
675
|
-
// re-tinted — they are neither side of the conversation.
|
|
676
|
-
intent={
|
|
677
|
-
message.internal
|
|
678
|
-
? 'warning'
|
|
679
|
-
: message.author_type === viewerRole
|
|
680
|
-
? 'info'
|
|
681
|
-
: undefined
|
|
682
|
-
}
|
|
683
|
-
customTheme={
|
|
684
|
-
message.internal || message.author_type === viewerRole ? undefined : ACCENT
|
|
685
|
-
}
|
|
671
|
+
// Both sides are neutral cards; an internal note is amber, so it can
|
|
672
|
+
// never be mistaken for a reply the customer sees.
|
|
673
|
+
intent={message.internal ? 'warning' : undefined}
|
|
686
674
|
flat={false}
|
|
687
675
|
minimal
|
|
688
676
|
>
|
|
@@ -698,7 +686,6 @@ export const TicketThread = ({
|
|
|
698
686
|
<div style={{ marginTop: 8 }}>
|
|
699
687
|
<InterfaceReferenceTags
|
|
700
688
|
size='tiny'
|
|
701
|
-
customTheme={ACCENT}
|
|
702
689
|
references={refsFor(message)}
|
|
703
690
|
resolveInterfaceIcon={resolveInterfaceIcon}
|
|
704
691
|
preferKindImage={preferKindImage}
|
|
@@ -79,6 +79,25 @@ export const findAllowedValueOption = (
|
|
|
79
79
|
);
|
|
80
80
|
};
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* The value a choice stands for, whichever of the three ways its entry is
|
|
84
|
+
* written (see `findAllowedValueOption`): the envelope's `value`, a bare
|
|
85
|
+
* `value`, or the entry's `name`.
|
|
86
|
+
*
|
|
87
|
+
* The row that names a stored choice and the validator that accepts it have
|
|
88
|
+
* always read all three. The pickers that WRITE a choice read only the
|
|
89
|
+
* envelope, so a list written bare showed nothing selected for the stored value
|
|
90
|
+
* and stored `undefined` when a choice was clicked: picking a pipeline
|
|
91
|
+
* processor's class cleared the field instead of setting it.
|
|
92
|
+
*/
|
|
93
|
+
export const allowedValueOf = (option: any): unknown => {
|
|
94
|
+
const value = option?.value;
|
|
95
|
+
if (value && typeof value === 'object' && !Array.isArray(value) && 'value' in value) {
|
|
96
|
+
return value.value;
|
|
97
|
+
}
|
|
98
|
+
return value !== undefined ? value : option?.name;
|
|
99
|
+
};
|
|
100
|
+
|
|
82
101
|
/**
|
|
83
102
|
* A Slate rich-text document: a non-empty array of element nodes, each with
|
|
84
103
|
* `children`. Told apart from a LIST value, which is an array of elements.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does a field's long description say more than its one-line summary?
|
|
3
|
+
*
|
|
4
|
+
* The Qorus server copies a field's plain-text `short_desc` into its markdown
|
|
5
|
+
* `desc` whenever the field declares no `desc` of its own
|
|
6
|
+
* (`QorusMapManager::getUiFieldInfo()`), so a `desc` alone does not mean there
|
|
7
|
+
* is anything more to read. Offering help on every field meant most help opened
|
|
8
|
+
* a dialog repeating the line already under the field, which teaches people the
|
|
9
|
+
* affordance is worth nothing. qorus-ide answers the same question the same way
|
|
10
|
+
* (`getFieldLongDescription` in its `helpers/descriptions.ts`).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Whitespace-, case- and trailing-full-stop-insensitive. */
|
|
14
|
+
const comparisonKey = (value: string): string =>
|
|
15
|
+
value
|
|
16
|
+
.replace(/\s+/g, ' ')
|
|
17
|
+
.trim()
|
|
18
|
+
.replace(/[.\s]+$/, '')
|
|
19
|
+
.toLowerCase();
|
|
20
|
+
|
|
21
|
+
/** Enough of markdown removed that `**Webhooks**` reads as the word it styles. */
|
|
22
|
+
const plainText = (markdown: string): string =>
|
|
23
|
+
markdown
|
|
24
|
+
.replace(/`([^`\n]+)`/g, '$1')
|
|
25
|
+
.replace(/!?\[([^\]]+)\]\([^)]*\)/g, '$1')
|
|
26
|
+
.replace(/^\s{0,3}#{1,6}\s+/gm, '')
|
|
27
|
+
.replace(/(\*\*|__|\*|_)(.+?)\1/g, '$2');
|
|
28
|
+
|
|
29
|
+
export const fieldHasLongDescription = (field?: {
|
|
30
|
+
desc?: unknown;
|
|
31
|
+
short_desc?: unknown;
|
|
32
|
+
}): boolean => {
|
|
33
|
+
const long = typeof field?.desc === 'string' ? field.desc.trim() : '';
|
|
34
|
+
if (!long) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const short = typeof field?.short_desc === 'string' ? field.short_desc.trim() : '';
|
|
38
|
+
return !short || comparisonKey(short) !== comparisonKey(plainText(long));
|
|
39
|
+
};
|