@qoretechnologies/reqraft 0.10.20 → 0.10.26
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/.claude/CLAUDE.md +11 -8
- package/dist/components/composer/Composer.d.ts +108 -0
- package/dist/components/composer/Composer.d.ts.map +1 -0
- package/dist/components/composer/Composer.js +238 -0
- package/dist/components/composer/Composer.js.map +1 -0
- package/dist/components/composer/helpers.d.ts +21 -0
- package/dist/components/composer/helpers.d.ts.map +1 -0
- package/dist/components/composer/helpers.js +75 -0
- package/dist/components/composer/helpers.js.map +1 -0
- package/dist/components/composer/index.d.ts +3 -0
- package/dist/components/composer/index.d.ts.map +1 -0
- package/dist/components/composer/index.js +19 -0
- package/dist/components/composer/index.js.map +1 -0
- package/dist/components/form/engine/FormEngine.d.ts +1 -1
- package/dist/components/imageLightbox/ImageLightbox.d.ts +21 -0
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -0
- package/dist/components/imageLightbox/ImageLightbox.js +169 -0
- package/dist/components/imageLightbox/ImageLightbox.js.map +1 -0
- package/dist/components/imageLightbox/index.d.ts +2 -0
- package/dist/components/imageLightbox/index.d.ts.map +1 -0
- package/dist/components/imageLightbox/index.js +18 -0
- package/dist/components/imageLightbox/index.js.map +1 -0
- package/dist/components/searchFilterBar/SearchFilterBar.d.ts +33 -0
- package/dist/components/searchFilterBar/SearchFilterBar.d.ts.map +1 -0
- package/dist/components/searchFilterBar/SearchFilterBar.js +76 -0
- package/dist/components/searchFilterBar/SearchFilterBar.js.map +1 -0
- package/dist/components/searchFilterBar/index.d.ts +2 -0
- package/dist/components/searchFilterBar/index.d.ts.map +1 -0
- package/dist/components/searchFilterBar/index.js +18 -0
- package/dist/components/searchFilterBar/index.js.map +1 -0
- package/dist/components/supportTicket/AttachmentChips.d.ts +10 -0
- package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -0
- package/dist/components/supportTicket/AttachmentChips.js +122 -0
- package/dist/components/supportTicket/AttachmentChips.js.map +1 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +43 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.js +31 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -0
- package/dist/components/supportTicket/ReferencePicker.d.ts +87 -0
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -0
- package/dist/components/supportTicket/ReferencePicker.js +295 -0
- package/dist/components/supportTicket/ReferencePicker.js.map +1 -0
- package/dist/components/supportTicket/TicketHeader.d.ts +86 -0
- package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketHeader.js +149 -0
- package/dist/components/supportTicket/TicketHeader.js.map +1 -0
- package/dist/components/supportTicket/TicketMetaTags.d.ts +32 -0
- package/dist/components/supportTicket/TicketMetaTags.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketMetaTags.js +21 -0
- package/dist/components/supportTicket/TicketMetaTags.js.map +1 -0
- package/dist/components/supportTicket/TicketReplyBox.d.ts +63 -0
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketReplyBox.js +115 -0
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -0
- package/dist/components/supportTicket/attachmentAccess.d.ts +37 -0
- package/dist/components/supportTicket/attachmentAccess.d.ts.map +1 -0
- package/dist/components/supportTicket/attachmentAccess.js +132 -0
- package/dist/components/supportTicket/attachmentAccess.js.map +1 -0
- package/dist/components/supportTicket/fileToAttachment.d.ts +9 -0
- package/dist/components/supportTicket/fileToAttachment.d.ts.map +1 -0
- package/dist/components/supportTicket/fileToAttachment.js +28 -0
- package/dist/components/supportTicket/fileToAttachment.js.map +1 -0
- package/dist/components/supportTicket/index.d.ts +11 -0
- package/dist/components/supportTicket/index.d.ts.map +1 -0
- package/dist/components/supportTicket/index.js +27 -0
- package/dist/components/supportTicket/index.js.map +1 -0
- package/dist/components/supportTicket/meta.d.ts +71 -0
- package/dist/components/supportTicket/meta.d.ts.map +1 -0
- package/dist/components/supportTicket/meta.js +115 -0
- package/dist/components/supportTicket/meta.js.map +1 -0
- package/dist/components/supportTicket/ticketModel.d.ts +102 -0
- package/dist/components/supportTicket/ticketModel.d.ts.map +1 -0
- package/dist/components/supportTicket/ticketModel.js +3 -0
- package/dist/components/supportTicket/ticketModel.js.map +1 -0
- package/dist/components/ticketReferences/TicketReferences.d.ts +52 -0
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -0
- package/dist/components/ticketReferences/TicketReferences.js +492 -0
- package/dist/components/ticketReferences/TicketReferences.js.map +1 -0
- package/dist/components/ticketReferences/index.d.ts +3 -0
- package/dist/components/ticketReferences/index.d.ts.map +1 -0
- package/dist/components/ticketReferences/index.js +6 -0
- package/dist/components/ticketReferences/index.js.map +1 -0
- package/dist/components/ticketThread/TicketThread.d.ts +57 -0
- package/dist/components/ticketThread/TicketThread.d.ts.map +1 -0
- package/dist/components/ticketThread/TicketThread.js +299 -0
- package/dist/components/ticketThread/TicketThread.js.map +1 -0
- package/dist/components/ticketThread/index.d.ts +3 -0
- package/dist/components/ticketThread/index.d.ts.map +1 -0
- package/dist/components/ticketThread/index.js +7 -0
- package/dist/components/ticketThread/index.js.map +1 -0
- package/dist/helpers/common.d.ts +5 -0
- package/dist/helpers/common.d.ts.map +1 -1
- package/dist/helpers/common.js +20 -1
- package/dist/helpers/common.js.map +1 -1
- package/dist/helpers/scrollbar.d.ts +2 -0
- package/dist/helpers/scrollbar.d.ts.map +1 -0
- package/dist/helpers/scrollbar.js +25 -0
- package/dist/helpers/scrollbar.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/composer/Composer.stories.tsx +238 -0
- package/src/components/composer/Composer.tsx +545 -0
- package/src/components/composer/helpers.ts +74 -0
- package/src/components/composer/index.ts +2 -0
- package/src/components/imageLightbox/ImageLightbox.stories.tsx +238 -0
- package/src/components/imageLightbox/ImageLightbox.tsx +236 -0
- package/src/components/imageLightbox/index.ts +1 -0
- package/src/components/searchFilterBar/SearchFilterBar.tsx +131 -0
- package/src/components/searchFilterBar/index.ts +1 -0
- package/src/components/supportTicket/AttachmentChips.stories.tsx +171 -0
- package/src/components/supportTicket/AttachmentChips.tsx +147 -0
- package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +171 -0
- package/src/components/supportTicket/InterfaceReferenceTags.tsx +96 -0
- package/src/components/supportTicket/ReferencePicker.stories.tsx +519 -0
- package/src/components/supportTicket/ReferencePicker.tsx +563 -0
- package/src/components/supportTicket/TicketConversation.stories.tsx +121 -0
- package/src/components/supportTicket/TicketHeader.stories.tsx +183 -0
- package/src/components/supportTicket/TicketHeader.tsx +247 -0
- package/src/components/supportTicket/TicketMetaTags.stories.tsx +103 -0
- package/src/components/supportTicket/TicketMetaTags.tsx +85 -0
- package/src/components/supportTicket/TicketReplyBox.stories.tsx +351 -0
- package/src/components/supportTicket/TicketReplyBox.tsx +146 -0
- package/src/components/supportTicket/attachmentAccess.ts +97 -0
- package/src/components/supportTicket/fileToAttachment.ts +24 -0
- package/src/components/supportTicket/index.ts +10 -0
- package/src/components/supportTicket/meta.ts +185 -0
- package/src/components/supportTicket/ticketModel.ts +131 -0
- package/src/components/ticketReferences/TicketReferences.stories.tsx +315 -0
- package/src/components/ticketReferences/TicketReferences.tsx +886 -0
- package/src/components/ticketReferences/index.ts +2 -0
- package/src/components/ticketThread/TicketThread.stories.tsx +828 -0
- package/src/components/ticketThread/TicketThread.tsx +704 -0
- package/src/components/ticketThread/index.ts +6 -0
- package/src/helpers/common.ts +19 -0
- package/src/helpers/scrollbar.ts +32 -0
- package/src/index.tsx +8 -1
package/.claude/CLAUDE.md
CHANGED
|
@@ -44,7 +44,7 @@ ReQraft (`@qoretechnologies/reqraft`) is a **React hooks and components toolkit*
|
|
|
44
44
|
- **Styling:** styled-components (inherited from ReQore); no CSS modules
|
|
45
45
|
- **State Management:** zustand (stores) + React Context (`use-context-selector`)
|
|
46
46
|
- **Data Fetching:** `@tanstack/react-query` v4 (via `query()` util + `useFetch` hook)
|
|
47
|
-
- **Testing:**
|
|
47
|
+
- **Testing:** Vitest — a `unit` project (jsdom, tests in `__tests__/`) + a `storybook` project (every story run in a real Chromium browser via Playwright); React Testing Library for component assertions
|
|
48
48
|
- **Documentation:** Storybook (stories co-located in `src/` with `.stories.tsx` suffix)
|
|
49
49
|
- **Storybook port:** `6008` (not 6007 — that's reqore)
|
|
50
50
|
|
|
@@ -155,7 +155,9 @@ A generic `<Field>` component dispatches to the appropriate field by type.
|
|
|
155
155
|
```bash
|
|
156
156
|
yarn install
|
|
157
157
|
yarn storybook # Dev mode on http://localhost:6008
|
|
158
|
-
yarn test
|
|
158
|
+
yarn test # Vitest unit tests (jsdom)
|
|
159
|
+
yarn test:watch # Vitest unit watch mode
|
|
160
|
+
yarn test:stories # Story / interaction tests in a real browser (+ Qlip capture)
|
|
159
161
|
yarn lint # ESLint check
|
|
160
162
|
yarn build # TypeScript compilation (tsconfig.prod.json)
|
|
161
163
|
yarn build:test # Type-check without emit
|
|
@@ -177,16 +179,17 @@ yarn build:test # Type-check without emit
|
|
|
177
179
|
|
|
178
180
|
### Testing Patterns
|
|
179
181
|
|
|
180
|
-
-
|
|
181
|
-
- Wrap tests with `ReqraftProvider` (or at minimum `QueryClientProvider`)
|
|
182
|
+
- Two Vitest projects (see `vitest.config.ts`): **unit** (jsdom; tests in `__tests__/`, mirroring `src/`) and **storybook** (every `*.stories.tsx` run in a real Chromium browser via Playwright). There is no Jest.
|
|
183
|
+
- Wrap unit tests with `ReqraftProvider` (or at minimum `QueryClientProvider`)
|
|
182
184
|
- Use `mock-socket` for WebSocket testing
|
|
183
|
-
- Run:
|
|
185
|
+
- Run: `yarn test` (unit) · `yarn test:stories [file-substring]` (stories) · `yarn precheck` (lint + unit + `build:test:prod`)
|
|
184
186
|
|
|
185
|
-
### Storybook Stories
|
|
187
|
+
### Storybook Stories & visual testing
|
|
186
188
|
|
|
187
189
|
- Stories are co-located alongside source: `src/hooks/useFetch/useFetch.stories.tsx`
|
|
188
190
|
- Storybook port: **6008**
|
|
189
|
-
-
|
|
191
|
+
- Story + interaction tests run on **Vitest browser mode** (Playwright/Chromium): `yarn test:stories [file-substring]`. Run `yarn install-playwright` once first.
|
|
192
|
+
- **Visual regression via Qlip** (not Chromatic): the story run captures snapshots through the `qlip` Vitest plugin. Upload is gated on `QLIP_UPLOAD_TOKEN` (`vitest.config.ts`), so **local runs capture but never upload** — PNGs land in `qlip/screenshots/<ts>/stories/auto/<StoryId>.png` (gitignored); read the PNG to verify a visual change. CI (`.github/workflows/tests.yml`) sets the token and uploads a build for dashboard review. The full visual-change flow + the `qlip` MCP review skill live in the imported `stacks/frontend/FRONTEND.md`.
|
|
190
193
|
|
|
191
194
|
## Code Patterns & Conventions
|
|
192
195
|
|
|
@@ -268,7 +271,7 @@ yarn build:test # Type-check without emit
|
|
|
268
271
|
| `src/components/log/` | Log display component |
|
|
269
272
|
| `src/components/menu/` | Navigation menu component |
|
|
270
273
|
| `src/types/` | Shared TypeScript types |
|
|
271
|
-
| `__tests__/` |
|
|
274
|
+
| `__tests__/` | Vitest unit tests (jsdom) |
|
|
272
275
|
|
|
273
276
|
## Other
|
|
274
277
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ReqoreButton, ReqoreDropdown, ReqoreTextarea } from '@qoretechnologies/reqore';
|
|
2
|
+
import { StyledEffect } from '@qoretechnologies/reqore/dist/components/Effect';
|
|
3
|
+
import type { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
|
|
4
|
+
import { ComponentProps, KeyboardEvent as ReactKeyboardEvent, ReactNode } from 'react';
|
|
5
|
+
/** Reqore's intent / effect / theme unions, without guessing import paths. */
|
|
6
|
+
type TIntent = ComponentProps<typeof ReqoreButton>['intent'];
|
|
7
|
+
type TEffect = ComponentProps<typeof StyledEffect>['effect'];
|
|
8
|
+
type TCustomTheme = ComponentProps<typeof ReqoreButton>['customTheme'];
|
|
9
|
+
/** The exact `items` shape ReqoreDropdown accepts. */
|
|
10
|
+
type TDropdownItems = NonNullable<ComponentProps<typeof ReqoreDropdown>['items']>;
|
|
11
|
+
/** Which editor the composer renders. */
|
|
12
|
+
export type TComposerEditor = 'rich' | 'plain';
|
|
13
|
+
/** One send action. With more than one, the send button splits into a primary
|
|
14
|
+
* button (the first action) + a caret dropdown listing them all. `id` is echoed
|
|
15
|
+
* back to `onSend` so the caller knows which action fired. */
|
|
16
|
+
export interface IComposerSendAction {
|
|
17
|
+
id?: string;
|
|
18
|
+
/** button label; omit for an icon-only button (like the Qonsole send). */
|
|
19
|
+
label?: string;
|
|
20
|
+
icon?: IReqoreIconName;
|
|
21
|
+
intent?: TIntent;
|
|
22
|
+
/** per-button Reqore theme (e.g. `{ main: 'custom1' }` for the Qonsole accent). */
|
|
23
|
+
customTheme?: TCustomTheme;
|
|
24
|
+
/** render the button minimal (subtle, blends into the bar — the Qonsole style). */
|
|
25
|
+
minimal?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Imperative handle for consumers that drive the editor externally (e.g. the
|
|
28
|
+
* Qonsole input inserting a completion or navigating history). */
|
|
29
|
+
export interface IComposerHandle {
|
|
30
|
+
focus: () => void;
|
|
31
|
+
clear: () => void;
|
|
32
|
+
setText: (text: string) => void;
|
|
33
|
+
getText: () => string;
|
|
34
|
+
}
|
|
35
|
+
export interface IComposerProps {
|
|
36
|
+
/** Editor flavour. `rich` = ReqoreRichTextEditor (default), `plain` = ReqoreTextarea. */
|
|
37
|
+
editor?: TComposerEditor;
|
|
38
|
+
/** Initial draft text (also seeds the editor for a restored draft / a story). */
|
|
39
|
+
defaultText?: string;
|
|
40
|
+
/** Initial staged files (a restored draft's attachments, or a demo). */
|
|
41
|
+
defaultFiles?: File[];
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Submit the composed message. `text` is the plain-string body; `files` are the
|
|
45
|
+
* staged attachments (raw `File`s — the caller converts to its own upload shape);
|
|
46
|
+
* `action` is the chosen send action's `id` (undefined for the default button).
|
|
47
|
+
*/
|
|
48
|
+
onSend: (text: string, options: {
|
|
49
|
+
files: File[];
|
|
50
|
+
action?: string;
|
|
51
|
+
}) => void | Promise<void>;
|
|
52
|
+
/** Single-button label / icon / intent (ignored when `sendActions` is set). */
|
|
53
|
+
sendLabel?: string;
|
|
54
|
+
sendIcon?: IReqoreIconName;
|
|
55
|
+
sendIntent?: TIntent;
|
|
56
|
+
/** Default send button: minimal (subtle, Qonsole-style). Default `true`. */
|
|
57
|
+
sendMinimal?: boolean;
|
|
58
|
+
/** Default send button accent (Reqore `customTheme`). Default `{ main: 'custom1' }`
|
|
59
|
+
* — the Qorus accent, which each app's theme colours (gray in a bare reqore theme). */
|
|
60
|
+
sendCustomTheme?: TCustomTheme;
|
|
61
|
+
/** Multiple send actions → a split send button. The first is the primary. */
|
|
62
|
+
sendActions?: IComposerSendAction[];
|
|
63
|
+
/** className on the split-send caret dropdown (keeps consumer test hooks, e.g.
|
|
64
|
+
* the helpdesk `ticket-send-more`). */
|
|
65
|
+
sendMenuClassName?: string;
|
|
66
|
+
/** the send round-trip is in flight */
|
|
67
|
+
sending?: boolean;
|
|
68
|
+
/** disabled → renders a muted notice with `disabledReason` instead of the composer */
|
|
69
|
+
disabled?: boolean;
|
|
70
|
+
disabledReason?: string;
|
|
71
|
+
/** submit on plain Enter (Shift/Ctrl/Alt/Meta+Enter insert a newline). Default true. */
|
|
72
|
+
submitOnEnter?: boolean;
|
|
73
|
+
/** clear the editor + staged files after a resolved send. Default true. */
|
|
74
|
+
clearOnSend?: boolean;
|
|
75
|
+
/** allow sending with empty text (e.g. attachments only). Default false. */
|
|
76
|
+
allowEmptySend?: boolean;
|
|
77
|
+
/** Extra attach-menu entries beyond "Upload files" (receives `addFiles`). With any
|
|
78
|
+
* entry the attach control becomes a dropdown; otherwise a plain button. */
|
|
79
|
+
attachMenuItems?: (addFiles: (files: File[]) => void) => TDropdownItems;
|
|
80
|
+
/** the attach control icon (Qonsole uses `AddLine`). */
|
|
81
|
+
attachIcon?: IReqoreIconName;
|
|
82
|
+
/** hide the attach control entirely. */
|
|
83
|
+
hideAttach?: boolean;
|
|
84
|
+
/** Slots: `toolbarStart` sits after attach on the left (e.g. the Qonsole slash
|
|
85
|
+
* dropdown), `footerActions` after it (e.g. a reference toggle), `rightActions`
|
|
86
|
+
* left of send (e.g. the Qonsole design button), `aboveInput` on top of the
|
|
87
|
+
* editor inside the bar (e.g. reference chips), and `belowInput` under the bar. */
|
|
88
|
+
toolbarStart?: ReactNode;
|
|
89
|
+
footerActions?: ReactNode;
|
|
90
|
+
rightActions?: ReactNode;
|
|
91
|
+
aboveInput?: ReactNode;
|
|
92
|
+
belowInput?: ReactNode;
|
|
93
|
+
/** Hooks for consumers layering behaviour on the editor (completions, history). */
|
|
94
|
+
onChange?: (text: string) => void;
|
|
95
|
+
onEditorKeyDown?: (e: ReactKeyboardEvent) => void;
|
|
96
|
+
onFocus?: () => void;
|
|
97
|
+
onBlur?: () => void;
|
|
98
|
+
/** editor sizing */
|
|
99
|
+
size?: ComponentProps<typeof ReqoreTextarea>['size'];
|
|
100
|
+
/** drop the composer's outer margin (for tight embeds). */
|
|
101
|
+
minimal?: boolean;
|
|
102
|
+
/** override the bar's gradient / effect (qorus-ide passes its `custom1` accent to
|
|
103
|
+
* match the Qonsole floating bar exactly). */
|
|
104
|
+
effect?: TEffect;
|
|
105
|
+
}
|
|
106
|
+
export declare const Composer: import("react").ForwardRefExoticComponent<IComposerProps & import("react").RefAttributes<IComposerHandle>>;
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../src/components/composer/Composer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __assign = (this && this.__assign) || function () {
|
|
7
|
+
__assign = Object.assign || function(t) {
|
|
8
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
+
s = arguments[i];
|
|
10
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
11
|
+
t[p] = s[p];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
return __assign.apply(this, arguments);
|
|
16
|
+
};
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
54
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
55
|
+
if (ar || !(i in from)) {
|
|
56
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
57
|
+
ar[i] = from[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
61
|
+
};
|
|
62
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
63
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
64
|
+
};
|
|
65
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
+
exports.Composer = void 0;
|
|
67
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
68
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
69
|
+
// <Composer> — the shared Qorus message composer, a faithful lift of qorus-ide's
|
|
70
|
+
// Qonsole chat input: the same gradient-bordered `StyledEffect` bar, transparent
|
|
71
|
+
// editor, attachment preview strip, and control row (attach + toolbar on the left,
|
|
72
|
+
// actions + send on the right). Everything Qonsole-specific (slash completions,
|
|
73
|
+
// command history, design-mode, sendCommand) is replaced by slots + props, so the
|
|
74
|
+
// exact same input can back the Qonsole, the helpdesk reply box, and anything else.
|
|
75
|
+
var reqore_1 = require("@qoretechnologies/reqore");
|
|
76
|
+
var Effect_1 = require("@qoretechnologies/reqore/dist/components/Effect");
|
|
77
|
+
var react_1 = require("react");
|
|
78
|
+
var styled_components_1 = __importDefault(require("styled-components"));
|
|
79
|
+
var helpers_1 = require("./helpers");
|
|
80
|
+
// The Qonsole input chrome, lifted verbatim from qorus-ide's StyledInputWrapper.
|
|
81
|
+
// The border is 1px *transparent* — it only reserves the border-box so the
|
|
82
|
+
// `effect` gradient can paint the edge (that's how the Qonsole bar's accent glow
|
|
83
|
+
// is drawn — a gradient border, not a border-color). All colour comes from
|
|
84
|
+
// `effect` (+ the ambient theme), so the bar takes on whatever accent the app /
|
|
85
|
+
// story supplies.
|
|
86
|
+
var StyledComposer = (0, styled_components_1.default)(Effect_1.StyledEffect)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n margin: ", ";\n padding: 4px;\n border: 1px solid transparent;\n border-radius: 6px;\n"], ["\n margin: ", ";\n padding: 4px;\n border: 1px solid transparent;\n border-radius: 6px;\n"])), function (_a) {
|
|
87
|
+
var $minimal = _a.$minimal;
|
|
88
|
+
return ($minimal ? '0' : '2px');
|
|
89
|
+
});
|
|
90
|
+
// Layout-neutral ref holder: `display: contents` generates no box, so it gives the
|
|
91
|
+
// composer a wrapper element to target paste/drop against without perturbing flow.
|
|
92
|
+
var StyledContentsWrapper = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n display: contents;\n"], ["\n display: contents;\n"])));
|
|
93
|
+
var StyledAttachmentList = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n // 8px left inset (as in the IDE) so it lines up with the editor text; the 10px\n // bottom gives space before whatever follows (references / editor).\n padding: 8px 8px 10px;\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n // 8px left inset (as in the IDE) so it lines up with the editor text; the 10px\n // bottom gives space before whatever follows (references / editor).\n padding: 8px 8px 10px;\n"])));
|
|
94
|
+
// Content shown on top of the editor (e.g. reference chips) gets the same 8px left
|
|
95
|
+
// inset as the attachment strip so both line up with the editor text, not the bar edge.
|
|
96
|
+
var StyledAboveInput = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n padding-left: 8px;\n"], ["\n padding-left: 8px;\n"])));
|
|
97
|
+
var StyledAttachment = styled_components_1.default.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n position: relative;\n display: inline-block;\n"], ["\n position: relative;\n display: inline-block;\n"])));
|
|
98
|
+
var StyledAttachmentImage = styled_components_1.default.img(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: block;\n max-height: 80px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n"], ["\n display: block;\n max-height: 80px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n"])));
|
|
99
|
+
var StyledAttachmentFile = styled_components_1.default.div(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n gap: 6px;\n height: 40px;\n padding: 0 12px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n background: rgba(123, 104, 238, 0.08);\n max-width: 220px;\n"], ["\n display: flex;\n align-items: center;\n gap: 6px;\n height: 40px;\n padding: 0 12px;\n border-radius: 4px;\n border: 1px solid rgba(123, 104, 238, 0.3);\n background: rgba(123, 104, 238, 0.08);\n max-width: 220px;\n"])));
|
|
100
|
+
var StyledAttachmentFilename = (0, styled_components_1.default)(reqore_1.ReqoreSpan)(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n"], ["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n"])));
|
|
101
|
+
var StyledAttachmentRemoveWrapper = styled_components_1.default.div(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n position: absolute;\n top: -8px;\n right: -8px;\n"], ["\n position: absolute;\n top: -8px;\n right: -8px;\n"])));
|
|
102
|
+
/** The Qonsole bar effect — a `custom1` gradient border over a transparent fill,
|
|
103
|
+
* exactly like qorus-ide's QonsoleInput. `custom1` resolves per app theme (Qorus
|
|
104
|
+
* purple in qorus-ide / admin-portal, gray in a bare reqore theme). Override via
|
|
105
|
+
* the `effect` prop. */
|
|
106
|
+
var DEFAULT_EFFECT = {
|
|
107
|
+
gradient: { direction: 'to bottom right', colors: 'custom1:darken:1:0.9' },
|
|
108
|
+
};
|
|
109
|
+
exports.Composer = (0, react_1.forwardRef)(function Composer(_a, ref) {
|
|
110
|
+
var _this = this;
|
|
111
|
+
var _b = _a.editor, editor = _b === void 0 ? 'rich' : _b, defaultText = _a.defaultText, defaultFiles = _a.defaultFiles, _c = _a.placeholder, placeholder = _c === void 0 ? 'Write a message…' : _c, onSend = _a.onSend, _d = _a.sendLabel, sendLabel = _d === void 0 ? 'Send' : _d, _e = _a.sendIcon, sendIcon = _e === void 0 ? 'SendPlane2Line' : _e, sendIntent = _a.sendIntent, _f = _a.sendMinimal, sendMinimal = _f === void 0 ? true : _f, _g = _a.sendCustomTheme, sendCustomTheme = _g === void 0 ? { main: 'custom1' } : _g, sendActions = _a.sendActions, sendMenuClassName = _a.sendMenuClassName, sending = _a.sending, disabled = _a.disabled, _h = _a.disabledReason, disabledReason = _h === void 0 ? '' : _h, _j = _a.submitOnEnter, submitOnEnter = _j === void 0 ? true : _j, _k = _a.clearOnSend, clearOnSend = _k === void 0 ? true : _k, _l = _a.allowEmptySend, allowEmptySend = _l === void 0 ? false : _l, attachMenuItems = _a.attachMenuItems, _m = _a.attachIcon, attachIcon = _m === void 0 ? 'AddLine' : _m, hideAttach = _a.hideAttach, toolbarStart = _a.toolbarStart, footerActions = _a.footerActions, rightActions = _a.rightActions, aboveInput = _a.aboveInput, belowInput = _a.belowInput, onChange = _a.onChange, onEditorKeyDown = _a.onEditorKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, _o = _a.size, size = _o === void 0 ? 'small' : _o, minimal = _a.minimal, _p = _a.effect, effect = _p === void 0 ? DEFAULT_EFFECT : _p;
|
|
112
|
+
var theme = (0, reqore_1.useReqoreTheme)();
|
|
113
|
+
var _q = (0, react_1.useState)(function () {
|
|
114
|
+
return defaultText ? (0, helpers_1.richValueFromString)(defaultText) : helpers_1.EMPTY_RICH_VALUE;
|
|
115
|
+
}), richValue = _q[0], setRichValue = _q[1];
|
|
116
|
+
var _r = (0, react_1.useState)(defaultText !== null && defaultText !== void 0 ? defaultText : ''), plainValue = _r[0], setPlainValue = _r[1];
|
|
117
|
+
var _s = (0, react_1.useState)(function () { return defaultFiles !== null && defaultFiles !== void 0 ? defaultFiles : []; }), files = _s[0], setFiles = _s[1];
|
|
118
|
+
var _t = (0, react_1.useState)([]), previews = _t[0], setPreviews = _t[1];
|
|
119
|
+
var fileInput = (0, react_1.useRef)(null);
|
|
120
|
+
var wrapperRef = (0, react_1.useRef)(null);
|
|
121
|
+
// Image thumbnails for the preview strip; object URLs revoked on change/unmount.
|
|
122
|
+
(0, react_1.useEffect)(function () {
|
|
123
|
+
var urls = files.map(function (f) { return (f.type.startsWith('image/') ? URL.createObjectURL(f) : ''); });
|
|
124
|
+
setPreviews(urls);
|
|
125
|
+
return function () { return urls.forEach(function (u) { return u && URL.revokeObjectURL(u); }); };
|
|
126
|
+
}, [files]);
|
|
127
|
+
var getText = function () {
|
|
128
|
+
return editor === 'rich' ? (0, helpers_1.richValueToString)(richValue) : plainValue;
|
|
129
|
+
};
|
|
130
|
+
var setText = function (text) {
|
|
131
|
+
if (editor === 'rich') {
|
|
132
|
+
setRichValue((0, helpers_1.richValueFromString)(text));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
setPlainValue(text);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
(0, react_1.useImperativeHandle)(ref, function () { return ({
|
|
139
|
+
focus: function () {
|
|
140
|
+
var _a, _b;
|
|
141
|
+
return (_b = (_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('[contenteditable="true"], textarea')) === null || _b === void 0 ? void 0 : _b.focus();
|
|
142
|
+
},
|
|
143
|
+
clear: function () { return setText(''); },
|
|
144
|
+
setText: setText,
|
|
145
|
+
getText: getText,
|
|
146
|
+
}); }, [editor, richValue, plainValue]);
|
|
147
|
+
// Every send action inherits the composer's send style (the Qonsole look by
|
|
148
|
+
// default) so a split-send stays visually of a piece with the single button —
|
|
149
|
+
// unless the action picks its own. The accent is only defaulted when the action
|
|
150
|
+
// hasn't chosen an `intent`, since in Reqore an intent owns the colour and would
|
|
151
|
+
// otherwise fight the `customTheme`.
|
|
152
|
+
var withSendStyle = function (action) { return (__assign(__assign({ minimal: sendMinimal }, (action.intent ? undefined : { customTheme: sendCustomTheme })), action)); };
|
|
153
|
+
var actions = (sendActions === null || sendActions === void 0 ? void 0 : sendActions.length)
|
|
154
|
+
? sendActions.map(withSendStyle)
|
|
155
|
+
: [withSendStyle({ id: undefined, label: sendLabel, icon: sendIcon, intent: sendIntent })];
|
|
156
|
+
var primary = actions[0];
|
|
157
|
+
var isSplit = actions.length > 1;
|
|
158
|
+
var addFiles = function (incoming) {
|
|
159
|
+
if (incoming.length) {
|
|
160
|
+
setFiles(function (prev) { return __spreadArray(__spreadArray([], prev, true), incoming, true); });
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var removeFile = function (index) {
|
|
164
|
+
return setFiles(function (prev) { return prev.filter(function (_, j) { return j !== index; }); });
|
|
165
|
+
};
|
|
166
|
+
var handlePaste = function (event) {
|
|
167
|
+
var images = (0, helpers_1.clipboardImages)(event);
|
|
168
|
+
if (images.length) {
|
|
169
|
+
event.preventDefault();
|
|
170
|
+
addFiles(images);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
var text = getText();
|
|
174
|
+
var canSend = (allowEmptySend || !!text.trim() || files.length > 0) && !sending;
|
|
175
|
+
var handleSend = function (actionId) { return __awaiter(_this, void 0, void 0, function () {
|
|
176
|
+
var body;
|
|
177
|
+
return __generator(this, function (_a) {
|
|
178
|
+
switch (_a.label) {
|
|
179
|
+
case 0:
|
|
180
|
+
body = getText();
|
|
181
|
+
if (!canSend) {
|
|
182
|
+
return [2 /*return*/];
|
|
183
|
+
}
|
|
184
|
+
return [4 /*yield*/, onSend(clearOnSend ? body.trim() : body, { files: files, action: actionId })];
|
|
185
|
+
case 1:
|
|
186
|
+
_a.sent();
|
|
187
|
+
if (clearOnSend) {
|
|
188
|
+
setText('');
|
|
189
|
+
setFiles([]);
|
|
190
|
+
}
|
|
191
|
+
return [2 /*return*/];
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}); };
|
|
195
|
+
var handleKeyDown = function (e) {
|
|
196
|
+
onEditorKeyDown === null || onEditorKeyDown === void 0 ? void 0 : onEditorKeyDown(e);
|
|
197
|
+
if (submitOnEnter && (0, helpers_1.isPlainSubmitEnter)(e)) {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
void handleSend(primary.id);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
if (disabled) {
|
|
203
|
+
return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'muted', icon: 'LockLine', size: 'small', flat: true, children: disabledReason }));
|
|
204
|
+
}
|
|
205
|
+
var extraAttachItems = attachMenuItems ? attachMenuItems(addFiles) : [];
|
|
206
|
+
// Icon-only when `label` is omitted; `customTheme`/`minimal` let a caller match
|
|
207
|
+
// the Qonsole accent send (minimal, custom1-themed) or any other look.
|
|
208
|
+
var sendButton = function (action) { return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: action.icon, intent: action.intent, customTheme: action.customTheme, minimal: action.minimal, size: size, disabled: !canSend, loading: sending, flat: true, onClick: function () { return handleSend(action.id); }, fixed: !isSplit, children: action.label })); };
|
|
209
|
+
return ((0, jsx_runtime_1.jsxs)(StyledContentsWrapper, { ref: wrapperRef, children: [(0, jsx_runtime_1.jsxs)(StyledComposer, { as: 'div', theme: theme, "$minimal": minimal,
|
|
210
|
+
// transparent fill (like QonsoleInput) → the page shows through and only
|
|
211
|
+
// the effect's gradient *border* glows; `minimal` opts into a solid fill.
|
|
212
|
+
transparent: !minimal, effect: effect, onPaste: handlePaste, children: [(0, jsx_runtime_1.jsx)("input", { ref: fileInput, type: 'file', multiple: true, style: { display: 'none' }, onChange: function (e) {
|
|
213
|
+
if (e.target.files) {
|
|
214
|
+
addFiles(Array.from(e.target.files));
|
|
215
|
+
}
|
|
216
|
+
e.target.value = '';
|
|
217
|
+
} }), files.length > 0 && ((0, jsx_runtime_1.jsx)(StyledAttachmentList, { children: files.map(function (file, index) { return ((0, jsx_runtime_1.jsxs)(StyledAttachment, { children: [previews[index] ? ((0, jsx_runtime_1.jsx)(StyledAttachmentImage, { src: previews[index], alt: file.name })) : ((0, jsx_runtime_1.jsxs)(StyledAttachmentFile, { title: file.name, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'FileLine', size: 'small' }), (0, jsx_runtime_1.jsx)(StyledAttachmentFilename, { size: 'small', children: file.name })] })), (0, jsx_runtime_1.jsx)(StyledAttachmentRemoveWrapper, { children: (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'CloseLine', size: 'micro', leftIconProps: { size: 'tiny' }, circle: true, onClick: function () { return removeFile(index); }, tooltip: 'Remove attachment' }) })] }, "".concat(file.name, "-").concat(index))); }) })), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, children: [aboveInput && (0, jsx_runtime_1.jsx)(StyledAboveInput, { children: aboveInput }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreControlGroup, { fluid: true, verticalAlign: 'center', size: 'small', children: editor === 'rich' ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreRichTextEditor, { value: richValue, panelProps: { fluid: true }, onChange: function (value) {
|
|
218
|
+
setRichValue(value);
|
|
219
|
+
onChange === null || onChange === void 0 ? void 0 : onChange((0, helpers_1.richValueToString)(value));
|
|
220
|
+
}, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur, placeholder: placeholder, disabled: sending, transparent: true, flat: true, fluid: true, size: size, actions: { styling: false, undo: false, redo: false }, onClearClick: text ? function () { return setText(''); } : undefined })) : ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTextarea, { value: plainValue, scaleWithContent: true, fluid: true, transparent: true, flat: true, size: size, placeholder: placeholder, disabled: sending, onChange: function (e) {
|
|
221
|
+
setPlainValue(e.target.value);
|
|
222
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e.target.value);
|
|
223
|
+
}, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur })) }), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { fluid: true, size: 'small', spaceBetween: true, verticalAlign: 'center', children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, fluid: false, size: 'small', verticalAlign: 'center', children: [!hideAttach &&
|
|
224
|
+
(extraAttachItems.length ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreDropdown, { icon: attachIcon, flat: true, transparent: true, disabled: sending, tooltip: 'Attach', items: __spreadArray([
|
|
225
|
+
{
|
|
226
|
+
label: 'Upload files',
|
|
227
|
+
icon: 'Upload2Line',
|
|
228
|
+
onClick: function () { var _a; return (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click(); },
|
|
229
|
+
}
|
|
230
|
+
], extraAttachItems, true) })) : ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: attachIcon, flat: true, transparent: true, disabled: sending, tooltip: 'Attach files', onClick: function () { var _a; return (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click(); } }))), toolbarStart, footerActions] }), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, fluid: false, size: 'small', children: [rightActions, isSplit ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [sendButton(primary), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreDropdown, { className: sendMenuClassName, icon: 'ArrowDownSLine', intent: primary.intent, customTheme: primary.customTheme, minimal: primary.minimal, disabled: !canSend, tooltip: 'More send options', items: actions.map(function (action) { return ({
|
|
231
|
+
label: action.label,
|
|
232
|
+
icon: action.icon,
|
|
233
|
+
intent: action.intent,
|
|
234
|
+
onClick: function () { return handleSend(action.id); },
|
|
235
|
+
}); }) })] })) : (sendButton(primary))] })] })] })] }), belowInput] }));
|
|
236
|
+
});
|
|
237
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9;
|
|
238
|
+
//# sourceMappingURL=Composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../src/components/composer/Composer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ClipboardEvent, KeyboardEvent } from 'react';
|
|
2
|
+
import type { IReqoreRichTextEditorProps } from '@qoretechnologies/reqore/dist/components/RichTextEditor';
|
|
3
|
+
/** The Slate value for an empty rich editor — a single empty paragraph. */
|
|
4
|
+
export declare const EMPTY_RICH_VALUE: IReqoreRichTextEditorProps['value'];
|
|
5
|
+
/**
|
|
6
|
+
* Rich editor value → plain string. Top-level blocks join with `\n` so a
|
|
7
|
+
* multi-paragraph message (a support reply, a pasted log) survives as real
|
|
8
|
+
* newlines; within a block, text leaves and `tag` values concatenate. Mirrors
|
|
9
|
+
* qorus-ide's `richtextToString` but newline-preserving for multi-line composers.
|
|
10
|
+
*/
|
|
11
|
+
export declare const richValueToString: (value: IReqoreRichTextEditorProps['value']) => string;
|
|
12
|
+
/** Plain string → rich editor value: one paragraph per line, so `setText`
|
|
13
|
+
* round-trips with `richValueToString`. */
|
|
14
|
+
export declare const richValueFromString: (text: string) => IReqoreRichTextEditorProps['value'];
|
|
15
|
+
/** Image files present on a clipboard paste (a screenshot, a copied image), so
|
|
16
|
+
* pasting-to-attach works on any composer without an IDE dependency. */
|
|
17
|
+
export declare const clipboardImages: (event: ClipboardEvent) => File[];
|
|
18
|
+
/** Enter with no modifier — the "submit" chord (Shift/Ctrl/Alt/Meta+Enter insert
|
|
19
|
+
* a newline instead). */
|
|
20
|
+
export declare const isPlainSubmitEnter: (e: Pick<KeyboardEvent, 'key' | 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>) => boolean;
|
|
21
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/composer/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AAE1G,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,0BAA0B,CAAC,OAAO,CAEhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAW,0BAA0B,CAAC,OAAO,CAAC,KAAG,MAuB9E,CAAC;AAEF;4CAC4C;AAC5C,eAAO,MAAM,mBAAmB,SAAU,MAAM,KAAG,0BAA0B,CAAC,OAAO,CAQpF,CAAC;AAEF;yEACyE;AACzE,eAAO,MAAM,eAAe,UAAW,cAAc,KAAG,IAAI,EAW3D,CAAC;AAEF;0BAC0B;AAC1B,eAAO,MAAM,kBAAkB,MAC1B,KAAK,aAAa,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,KAC5E,OAAoF,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
3
|
+
// Pure helpers for the shared <Composer>. No DOM/app coupling — safe on any surface.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.isPlainSubmitEnter = exports.clipboardImages = exports.richValueFromString = exports.richValueToString = exports.EMPTY_RICH_VALUE = void 0;
|
|
6
|
+
/** The Slate value for an empty rich editor — a single empty paragraph. */
|
|
7
|
+
exports.EMPTY_RICH_VALUE = [
|
|
8
|
+
{ type: 'paragraph', children: [{ text: '' }] },
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Rich editor value → plain string. Top-level blocks join with `\n` so a
|
|
12
|
+
* multi-paragraph message (a support reply, a pasted log) survives as real
|
|
13
|
+
* newlines; within a block, text leaves and `tag` values concatenate. Mirrors
|
|
14
|
+
* qorus-ide's `richtextToString` but newline-preserving for multi-line composers.
|
|
15
|
+
*/
|
|
16
|
+
var richValueToString = function (value) {
|
|
17
|
+
if (!value) {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === 'string') {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
var nodeText = function (node) {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
if (node == null) {
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
if (typeof node.text === 'string') {
|
|
29
|
+
return node.text;
|
|
30
|
+
}
|
|
31
|
+
if (node.type === 'tag') {
|
|
32
|
+
return (_b = (_a = node.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(node.children)) {
|
|
35
|
+
return node.children.map(nodeText).join('');
|
|
36
|
+
}
|
|
37
|
+
return '';
|
|
38
|
+
};
|
|
39
|
+
return value.map(nodeText).join('\n');
|
|
40
|
+
};
|
|
41
|
+
exports.richValueToString = richValueToString;
|
|
42
|
+
/** Plain string → rich editor value: one paragraph per line, so `setText`
|
|
43
|
+
* round-trips with `richValueToString`. */
|
|
44
|
+
var richValueFromString = function (text) {
|
|
45
|
+
if (!text) {
|
|
46
|
+
return exports.EMPTY_RICH_VALUE;
|
|
47
|
+
}
|
|
48
|
+
return text.split('\n').map(function (line) { return ({
|
|
49
|
+
type: 'paragraph',
|
|
50
|
+
children: [{ text: line }],
|
|
51
|
+
}); });
|
|
52
|
+
};
|
|
53
|
+
exports.richValueFromString = richValueFromString;
|
|
54
|
+
/** Image files present on a clipboard paste (a screenshot, a copied image), so
|
|
55
|
+
* pasting-to-attach works on any composer without an IDE dependency. */
|
|
56
|
+
var clipboardImages = function (event) {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
var images = [];
|
|
59
|
+
for (var _i = 0, _c = Array.from((_b = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.items) !== null && _b !== void 0 ? _b : []); _i < _c.length; _i++) {
|
|
60
|
+
var item = _c[_i];
|
|
61
|
+
if (item.kind === 'file' && item.type.startsWith('image/')) {
|
|
62
|
+
var file = item.getAsFile();
|
|
63
|
+
if (file) {
|
|
64
|
+
images.push(file);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return images;
|
|
69
|
+
};
|
|
70
|
+
exports.clipboardImages = clipboardImages;
|
|
71
|
+
/** Enter with no modifier — the "submit" chord (Shift/Ctrl/Alt/Meta+Enter insert
|
|
72
|
+
* a newline instead). */
|
|
73
|
+
var isPlainSubmitEnter = function (e) { return e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey; };
|
|
74
|
+
exports.isPlainSubmitEnter = isPlainSubmitEnter;
|
|
75
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/composer/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/composer/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Composer"), exports);
|
|
18
|
+
__exportStar(require("./helpers"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/composer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,4CAA0B"}
|
|
@@ -53,7 +53,7 @@ export declare const flattenOptions: (options: TQorusForm) => TQorusFlatForm;
|
|
|
53
53
|
export declare const getTypeAndCanBeNull: (type?: TQorusType | TQorusType[], allowed_values?: any[], operatorData?: TOperatorValue, operators?: IOperatorsSchema) => {
|
|
54
54
|
type: TQorusType;
|
|
55
55
|
defaultType: TQorusType;
|
|
56
|
-
defaultInternalType: "string" | "number" | "boolean" | "function" | "
|
|
56
|
+
defaultInternalType: "string" | "number" | "boolean" | "function" | "type" | "file" | "data" | "date" | "email" | "range" | "url" | "group" | "list" | "step" | "richtext" | "fsm" | "errors" | "class" | "code-editor" | "processor-mappings" | "tool-catalog" | "mapper" | "workflow" | "service" | "job" | "connection" | "constant" | "mapper-code" | "queue" | "pipeline" | "sla" | "value-map" | "qog" | "ai-collection" | "ai-endpoint" | "ai-guardrail" | "binary" | "long-string" | "enum" | "int" | "integer" | "float" | "free-list" | "hash" | "rgbcolor" | "free-hash" | "null" | "nothing" | "bool" | "data-provider" | "context";
|
|
57
57
|
canBeNull: boolean;
|
|
58
58
|
};
|
|
59
59
|
/** Display metadata for a read-first group, keyed by the raw `group` string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface IImageLightboxImage {
|
|
2
|
+
attachment_id: string;
|
|
3
|
+
filename: string;
|
|
4
|
+
}
|
|
5
|
+
export interface IImageLightboxProps {
|
|
6
|
+
/** the set the viewer pages across — one image is a set of one (no paging chrome) */
|
|
7
|
+
images: IImageLightboxImage[];
|
|
8
|
+
/** which image is shown */
|
|
9
|
+
index: number;
|
|
10
|
+
onIndex: (index: number) => void;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
/** resolve an image's bytes as an object URL (the consumer's authed endpoint) */
|
|
13
|
+
fetchAttachmentUrl: (attachmentId: string) => Promise<string>;
|
|
14
|
+
onDownload?: (attachmentId: string, filename: string) => void;
|
|
15
|
+
/** Rename the shown image. Presence of the callback IS the permission — a staged
|
|
16
|
+
* (composer) set passes it, server-side attachment sets simply don't, so the
|
|
17
|
+
* thread / References viewers stay rename-free without any extra flag. */
|
|
18
|
+
onRename?: (attachmentId: string, newName: string) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare const ImageLightbox: ({ images, index, onIndex, onClose, fetchAttachmentUrl, onDownload, onRename, }: IImageLightboxProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=ImageLightbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageLightbox.d.ts","sourceRoot":"","sources":["../../../src/components/imageLightbox/ImageLightbox.tsx"],"names":[],"mappings":"AAiDA,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;+EAE2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,aAAa,mFAQvB,mBAAmB,4CA6JrB,CAAC"}
|