anton-bakker-feedback 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -0
- package/dist/react/admin/FeedbackDetailPage.d.ts +30 -0
- package/dist/react/admin/FeedbackDetailPage.d.ts.map +1 -0
- package/dist/react/admin/FeedbackUpdatePage.d.ts +34 -0
- package/dist/react/admin/FeedbackUpdatePage.d.ts.map +1 -0
- package/dist/react/admin/__tests__/FeedbackDetailPage.test.d.ts +2 -0
- package/dist/react/admin/__tests__/FeedbackDetailPage.test.d.ts.map +1 -0
- package/dist/react/admin/__tests__/FeedbackUpdatePage.integration.test.d.ts +2 -0
- package/dist/react/admin/__tests__/FeedbackUpdatePage.integration.test.d.ts.map +1 -0
- package/dist/react/admin/__tests__/FeedbackUpdatePage.test.d.ts +2 -0
- package/dist/react/admin/__tests__/FeedbackUpdatePage.test.d.ts.map +1 -0
- package/dist/react/admin/components/BrowserContext.d.ts +32 -0
- package/dist/react/admin/components/BrowserContext.d.ts.map +1 -0
- package/dist/react/admin/components/DataTable.d.ts +55 -0
- package/dist/react/admin/components/DataTable.d.ts.map +1 -0
- package/dist/react/admin/components/DialogueHistory.d.ts +27 -0
- package/dist/react/admin/components/DialogueHistory.d.ts.map +1 -0
- package/dist/react/admin/components/EditableFields.d.ts +126 -0
- package/dist/react/admin/components/EditableFields.d.ts.map +1 -0
- package/dist/react/admin/components/FeedbackListPage.d.ts +19 -0
- package/dist/react/admin/components/FeedbackListPage.d.ts.map +1 -0
- package/dist/react/admin/components/FeedbackListPage.test.d.ts +2 -0
- package/dist/react/admin/components/FeedbackListPage.test.d.ts.map +1 -0
- package/dist/react/admin/components/FilterControls.d.ts +28 -0
- package/dist/react/admin/components/FilterControls.d.ts.map +1 -0
- package/dist/react/admin/components/NavigationLink.d.ts +31 -0
- package/dist/react/admin/components/NavigationLink.d.ts.map +1 -0
- package/dist/react/admin/components/QuickActions.d.ts +43 -0
- package/dist/react/admin/components/QuickActions.d.ts.map +1 -0
- package/dist/react/admin/components/ScreenshotViewer.d.ts +38 -0
- package/dist/react/admin/components/ScreenshotViewer.d.ts.map +1 -0
- package/dist/react/admin/components/SortControls.d.ts +29 -0
- package/dist/react/admin/components/SortControls.d.ts.map +1 -0
- package/dist/react/admin/components/StatusBadge.d.ts +23 -0
- package/dist/react/admin/components/StatusBadge.d.ts.map +1 -0
- package/dist/react/admin/components/TypeBadge.d.ts +23 -0
- package/dist/react/admin/components/TypeBadge.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/BrowserContext.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/BrowserContext.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/DialogueHistory.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/DialogueHistory.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/EditableFields.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/EditableFields.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/QuickActions.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/QuickActions.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/ScreenshotViewer.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/ScreenshotViewer.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/badges.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/badges.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/controls.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/controls.test.d.ts.map +1 -0
- package/dist/react/admin/components/__tests__/table-navigation.test.d.ts +2 -0
- package/dist/react/admin/components/__tests__/table-navigation.test.d.ts.map +1 -0
- package/dist/react/admin/components/index.d.ts +13 -0
- package/dist/react/admin/components/index.d.ts.map +1 -0
- package/dist/react/admin/hooks/useFeedbackFilters.d.ts +31 -0
- package/dist/react/admin/hooks/useFeedbackFilters.d.ts.map +1 -0
- package/dist/react/admin/hooks/useFeedbackSort.d.ts +42 -0
- package/dist/react/admin/hooks/useFeedbackSort.d.ts.map +1 -0
- package/dist/react/admin/hooks/useStatusTransition.d.ts +18 -0
- package/dist/react/admin/hooks/useStatusTransition.d.ts.map +1 -0
- package/dist/react/admin/index.d.ts +6 -0
- package/dist/react/admin/index.d.ts.map +1 -0
- package/dist/react/admin/index.js +1313 -0
- package/dist/react/admin/index.js.map +1 -0
- package/dist/react/admin/types.d.ts +38 -0
- package/dist/react/admin/types.d.ts.map +1 -0
- package/package.json +8 -1
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# anton-bakker-feedback
|
|
2
|
+
|
|
3
|
+
Zero-dependency feedback collection package with LLM-powered dialogue intake, auto-capture, classification, and observability.
|
|
4
|
+
|
|
5
|
+
## Exports
|
|
6
|
+
|
|
7
|
+
| Entry point | Purpose |
|
|
8
|
+
|-------------|---------|
|
|
9
|
+
| `anton-bakker-feedback` | Core: types, capture, transport, config, i18n, observability |
|
|
10
|
+
| `anton-bakker-feedback/react` | Widget: FeedbackProvider, FeedbackPanel, FeedbackButton, etc. |
|
|
11
|
+
| `anton-bakker-feedback/react/admin` | Admin pages: List, Detail, Update |
|
|
12
|
+
| `anton-bakker-feedback/server` | Server handlers: DynamoDB + Bedrock factories |
|
|
13
|
+
| `anton-bakker-feedback/manifest` | Package manifest for plugin discovery |
|
|
14
|
+
|
|
15
|
+
## Admin Pages
|
|
16
|
+
|
|
17
|
+
The `./react/admin` entry point provides three headless page-level components for managing submitted feedback. Components are unstyled — pass `className` props to integrate with Tailwind CSS or any other CSS framework.
|
|
18
|
+
|
|
19
|
+
### Import
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import {
|
|
23
|
+
FeedbackListPage,
|
|
24
|
+
FeedbackDetailPage,
|
|
25
|
+
FeedbackUpdatePage,
|
|
26
|
+
} from 'anton-bakker-feedback/react/admin';
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Admin pages are tree-shakeable. Apps that import only from `./react` (the widget) do not bundle admin page code.
|
|
30
|
+
|
|
31
|
+
### Props contract
|
|
32
|
+
|
|
33
|
+
All three pages use **Inversion of Control** — you provide the data and navigation functions; the component provides the UI structure.
|
|
34
|
+
|
|
35
|
+
| Prop | Type | Used by | Description |
|
|
36
|
+
|------|------|---------|-------------|
|
|
37
|
+
| `items` | `StoredFeedbackItem[]` | List | Feedback items to display |
|
|
38
|
+
| `loading` | `boolean` | List | Show loading state |
|
|
39
|
+
| `fetchItem` | `(id: string) => Promise<StoredFeedbackItem>` | Detail, Update | Load a single item |
|
|
40
|
+
| `updateItem` | `(id: string, patch: Partial<StoredFeedbackItem>) => Promise<void>` | Update | Persist changes |
|
|
41
|
+
| `onNavigate` | `(path: string) => void` | All | Consumer-owned routing |
|
|
42
|
+
| `currentUser` | `{ userId: string; name?: string }` | All (optional) | For assignee display |
|
|
43
|
+
| `className` | `string` | All (optional) | Root element class |
|
|
44
|
+
| `feedbackId` | `string` | Detail, Update | Item to load/edit |
|
|
45
|
+
|
|
46
|
+
### Minimal example
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import { FeedbackListPage } from 'anton-bakker-feedback/react/admin';
|
|
50
|
+
|
|
51
|
+
export function AdminFeedbackRoute({ items, loading }) {
|
|
52
|
+
return (
|
|
53
|
+
<FeedbackListPage
|
|
54
|
+
items={items}
|
|
55
|
+
loading={loading}
|
|
56
|
+
onNavigate={(path) => router.push(path)}
|
|
57
|
+
className="my-admin-list"
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Error handling
|
|
64
|
+
|
|
65
|
+
Components handle loading and empty-state UI internally. Data fetch errors should be caught in your `fetchItem`/`updateItem` implementations and surfaced via your consumer-level error boundary.
|
|
66
|
+
|
|
67
|
+
## Development
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install
|
|
71
|
+
npm run build # Build all entry points
|
|
72
|
+
npx vitest run # Run tests
|
|
73
|
+
npx tsc --noEmit # Type check
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { FeedbackDetailPageProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* FeedbackDetailPage — headless single-item feedback detail component.
|
|
6
|
+
*
|
|
7
|
+
* Uses Inversion of Control: consumer provides data fetching and navigation
|
|
8
|
+
* via props. The component owns loading/error state and rendering logic only.
|
|
9
|
+
*
|
|
10
|
+
* Renders:
|
|
11
|
+
* - Header: title (content truncated), type badge, status badge, priority
|
|
12
|
+
* - Metadata grid: environment, submitted date, reporter count, assignee
|
|
13
|
+
* - Description / full content
|
|
14
|
+
* - Dialogue history (conversation turns)
|
|
15
|
+
* - Screenshot viewer
|
|
16
|
+
* - Browser context
|
|
17
|
+
* - Quick actions (status transitions, edit, back to list)
|
|
18
|
+
*
|
|
19
|
+
* No styling applied — consumer provides CSS via `className` prop.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* <FeedbackDetailPage
|
|
23
|
+
* feedbackId="FB-2026-07-28-abc12345"
|
|
24
|
+
* fetchItem={(id) => api.getFeedback(id)}
|
|
25
|
+
* onNavigate={(path) => router.push(path)}
|
|
26
|
+
* currentUser={{ userId: 'user-1', name: 'Alice' }}
|
|
27
|
+
* />
|
|
28
|
+
*/
|
|
29
|
+
export declare function FeedbackDetailPage({ feedbackId, fetchItem, onNavigate, currentUser, className, generateScreenshotUrl, }: FeedbackDetailPageProps): React.JSX.Element;
|
|
30
|
+
//# sourceMappingURL=FeedbackDetailPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackDetailPage.d.ts","sourceRoot":"","sources":["../../../src/react/admin/FeedbackDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAQ1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,qBAAqB,GACtB,EAAE,uBAAuB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiP7C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { StoredFeedbackItem } from '../../core/types.js';
|
|
3
|
+
|
|
4
|
+
export interface FeedbackUpdatePageProps {
|
|
5
|
+
/** The ID of the feedback item to edit */
|
|
6
|
+
feedbackId: string;
|
|
7
|
+
/** Fetches the item by ID; result populates the form */
|
|
8
|
+
fetchItem: (id: string) => Promise<StoredFeedbackItem>;
|
|
9
|
+
/** Persists the changed fields; receives only the diff-patch */
|
|
10
|
+
updateItem: (id: string, patch: Partial<StoredFeedbackItem>) => Promise<void>;
|
|
11
|
+
/** Called to navigate (back to detail, cancel, after save) */
|
|
12
|
+
onNavigate: (path: string) => void;
|
|
13
|
+
/** Optional current user for "Assign to me" and correction tracking */
|
|
14
|
+
currentUser?: {
|
|
15
|
+
userId: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
};
|
|
18
|
+
/** Optional CSS class on the root element */
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* FeedbackUpdatePage — edit the mutable fields of a feedback item.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <FeedbackUpdatePage
|
|
26
|
+
* feedbackId="FB-2026-07-28-abc12345"
|
|
27
|
+
* fetchItem={api.getItem}
|
|
28
|
+
* updateItem={api.updateItem}
|
|
29
|
+
* onNavigate={navigate}
|
|
30
|
+
* currentUser={{ userId: 'user-123' }}
|
|
31
|
+
* />
|
|
32
|
+
*/
|
|
33
|
+
export declare function FeedbackUpdatePage({ feedbackId, fetchItem, updateItem, onNavigate, currentUser, className, }: FeedbackUpdatePageProps): React.JSX.Element;
|
|
34
|
+
//# sourceMappingURL=FeedbackUpdatePage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackUpdatePage.d.ts","sourceRoot":"","sources":["../../../src/react/admin/FeedbackUpdatePage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EACV,kBAAkB,EAMnB,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,gEAAgE;IAChE,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,8DAA8D;IAC9D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uEAAuE;IACvE,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,GACV,EAAE,uBAAuB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqQ7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackDetailPage.test.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/__tests__/FeedbackDetailPage.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackUpdatePage.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/__tests__/FeedbackUpdatePage.integration.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackUpdatePage.test.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/__tests__/FeedbackUpdatePage.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { FeedbackContext } from '../../../core/types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the BrowserContext component.
|
|
6
|
+
*/
|
|
7
|
+
export interface BrowserContextProps {
|
|
8
|
+
/**
|
|
9
|
+
* The feedback context object captured at submission time.
|
|
10
|
+
* May be undefined, null, or partial — component handles all missing fields
|
|
11
|
+
* gracefully.
|
|
12
|
+
*
|
|
13
|
+
* Accept both `null` and `undefined` so consumers can pass either without
|
|
14
|
+
* TypeScript errors (with exactOptionalPropertyTypes enabled).
|
|
15
|
+
*/
|
|
16
|
+
context?: FeedbackContext | null;
|
|
17
|
+
/** Additional CSS class names applied to the root element */
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* BrowserContext — headless browser context display component.
|
|
22
|
+
*
|
|
23
|
+
* Renders a structured, readable summary of the captured browser context
|
|
24
|
+
* including the page URL, user agent, and viewport dimensions. Handles
|
|
25
|
+
* undefined/null gracefully. No styling applied — consumer provides CSS
|
|
26
|
+
* via `className` prop.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* <BrowserContext context={item.context} className="browser-context-panel" />
|
|
30
|
+
*/
|
|
31
|
+
export declare function BrowserContext({ context, className, }: BrowserContextProps): React.JSX.Element;
|
|
32
|
+
//# sourceMappingURL=BrowserContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserContext.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/BrowserContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for a single column in the DataTable.
|
|
5
|
+
*/
|
|
6
|
+
export interface ColumnDef<T> {
|
|
7
|
+
/** Unique key for this column */
|
|
8
|
+
key: string;
|
|
9
|
+
/** Column header label */
|
|
10
|
+
header: string;
|
|
11
|
+
/** Function to render cell content from a row item */
|
|
12
|
+
render: (item: T) => React.ReactNode;
|
|
13
|
+
/** Whether this column is sortable (optional, for future use) */
|
|
14
|
+
sortable?: boolean;
|
|
15
|
+
/** Additional CSS class names for this column's cells */
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Props for the DataTable component.
|
|
20
|
+
*/
|
|
21
|
+
export interface DataTableProps<T> {
|
|
22
|
+
/** Column definitions */
|
|
23
|
+
columns: ReadonlyArray<ColumnDef<T>>;
|
|
24
|
+
/** Data rows to display */
|
|
25
|
+
data: T[];
|
|
26
|
+
/** Function to extract a unique key from each row */
|
|
27
|
+
getRowKey: (item: T) => string;
|
|
28
|
+
/** Callback fired when a row is clicked */
|
|
29
|
+
onRowClick?: (item: T) => void;
|
|
30
|
+
/** Whether the table is loading data */
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
/** Message to display when there are no rows */
|
|
33
|
+
emptyMessage?: string;
|
|
34
|
+
/** Additional CSS class names on the root element */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** Additional CSS class names on the table element */
|
|
37
|
+
tableClassName?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* DataTable — generic headless data table component.
|
|
41
|
+
*
|
|
42
|
+
* Renders a `<table>` with configurable columns and rows.
|
|
43
|
+
* Supports loading state, empty state, and row click handlers.
|
|
44
|
+
* No styles applied — consumer provides styling via `className` props.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* <DataTable
|
|
48
|
+
* columns={[{ key: 'title', header: 'Title', render: (item) => item.title }]}
|
|
49
|
+
* data={items}
|
|
50
|
+
* getRowKey={(item) => item.id}
|
|
51
|
+
* onRowClick={(item) => navigate(`/feedback/${item.id}`)}
|
|
52
|
+
* />
|
|
53
|
+
*/
|
|
54
|
+
export declare function DataTable<T>({ columns, data, getRowKey, onRowClick, loading, emptyMessage, className, tableClassName, }: DataTableProps<T>): React.JSX.Element;
|
|
55
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IACrC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,yBAAyB;IACzB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,2BAA2B;IAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,qDAAqD;IACrD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,UAAU,EACV,OAAe,EACf,YAAgC,EAChC,SAAS,EACT,cAAc,GACf,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+DvC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { DialogueEntry } from '../../../core/types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the DialogueHistory component.
|
|
6
|
+
*/
|
|
7
|
+
export interface DialogueHistoryProps {
|
|
8
|
+
/**
|
|
9
|
+
* Array of dialogue turns between user and assistant.
|
|
10
|
+
* Rendered in chronological order (index 0 first).
|
|
11
|
+
*/
|
|
12
|
+
dialogue: DialogueEntry[];
|
|
13
|
+
/** Additional CSS class names applied to the root element */
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* DialogueHistory — headless conversation thread display component.
|
|
18
|
+
*
|
|
19
|
+
* Renders dialogue turns in chronological order with semantic distinction
|
|
20
|
+
* between user and assistant messages. No styling applied — consumer provides
|
|
21
|
+
* CSS via `className` prop.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* <DialogueHistory dialogue={item.dialogueHistory} className="dialogue-thread" />
|
|
25
|
+
*/
|
|
26
|
+
export declare function DialogueHistory({ dialogue, className, }: DialogueHistoryProps): React.JSX.Element;
|
|
27
|
+
//# sourceMappingURL=DialogueHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogueHistory.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/DialogueHistory.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqE1C"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { FeedbackStatus, FeedbackType, FeedbackScope, FeedbackSize } from '../../../core/types.js';
|
|
3
|
+
|
|
4
|
+
export interface StatusSelectProps {
|
|
5
|
+
/** The current status (pre-selected) */
|
|
6
|
+
currentStatus: FeedbackStatus;
|
|
7
|
+
/** Valid target statuses (from useStatusTransition) */
|
|
8
|
+
allowedTargets: FeedbackStatus[];
|
|
9
|
+
/** Currently selected value */
|
|
10
|
+
value: FeedbackStatus;
|
|
11
|
+
/** Called when the user selects a different status */
|
|
12
|
+
onChange: (status: FeedbackStatus) => void;
|
|
13
|
+
/** Optional CSS class on the container */
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* StatusSelect — renders only the statuses present in `allowedTargets`.
|
|
18
|
+
* The current status is shown as the pre-selected option but is NOT
|
|
19
|
+
* included in the selectable options (to prevent self-transitions).
|
|
20
|
+
*/
|
|
21
|
+
export declare function StatusSelect({ currentStatus, allowedTargets, value, onChange, className, }: StatusSelectProps): React.JSX.Element;
|
|
22
|
+
export interface TypeSelectProps {
|
|
23
|
+
/** Currently selected type */
|
|
24
|
+
value: FeedbackType;
|
|
25
|
+
/** Called when the user selects a different type */
|
|
26
|
+
onChange: (type: FeedbackType) => void;
|
|
27
|
+
/** Optional CSS class on the container */
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* TypeSelect — renders all four FeedbackType values as options.
|
|
32
|
+
*/
|
|
33
|
+
export declare function TypeSelect({ value, onChange, className, }: TypeSelectProps): React.JSX.Element;
|
|
34
|
+
export interface ScopeSelectProps {
|
|
35
|
+
/** Currently selected scope (undefined = not set) */
|
|
36
|
+
value: FeedbackScope | undefined;
|
|
37
|
+
/** Called when the user selects/clears scope */
|
|
38
|
+
onChange: (scope: FeedbackScope | undefined) => void;
|
|
39
|
+
/** Optional CSS class on the container */
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* ScopeSelect — renders a blank "— not set —" option plus all three FeedbackScope values.
|
|
44
|
+
* Scope is optional, so the blank option allows clearing it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function ScopeSelect({ value, onChange, className, }: ScopeSelectProps): React.JSX.Element;
|
|
47
|
+
export interface SizeSelectProps {
|
|
48
|
+
/** Currently selected size (undefined = not set) */
|
|
49
|
+
value: FeedbackSize | undefined;
|
|
50
|
+
/** Called when the user selects/clears size */
|
|
51
|
+
onChange: (size: FeedbackSize | undefined) => void;
|
|
52
|
+
/** Optional CSS class on the container */
|
|
53
|
+
className?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* SizeSelect — renders a blank "— not set —" option plus all four FeedbackSize values.
|
|
57
|
+
* Size is optional, so the blank option allows clearing it.
|
|
58
|
+
*/
|
|
59
|
+
export declare function SizeSelect({ value, onChange, className, }: SizeSelectProps): React.JSX.Element;
|
|
60
|
+
export interface AssigneeInputProps {
|
|
61
|
+
/** Current assignee (free text, or undefined) */
|
|
62
|
+
value: string | undefined;
|
|
63
|
+
/** Called when the assignee changes */
|
|
64
|
+
onChange: (assignedTo: string | undefined) => void;
|
|
65
|
+
/** Optional current user for "Assign to me" shortcut */
|
|
66
|
+
currentUser?: {
|
|
67
|
+
userId: string;
|
|
68
|
+
name?: string;
|
|
69
|
+
};
|
|
70
|
+
/** Optional CSS class on the container */
|
|
71
|
+
className?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* AssigneeInput — free-text input for assigning a feedback item.
|
|
75
|
+
* When `currentUser` is provided, an "Assign to me" button pre-fills the field.
|
|
76
|
+
*/
|
|
77
|
+
export declare function AssigneeInput({ value, onChange, currentUser, className, }: AssigneeInputProps): React.JSX.Element;
|
|
78
|
+
export interface TagsInputProps {
|
|
79
|
+
/** Current tags as a string array */
|
|
80
|
+
value: string[];
|
|
81
|
+
/** Called with the parsed tag array when the input changes */
|
|
82
|
+
onChange: (tags: string[]) => void;
|
|
83
|
+
/** Optional CSS class on the container */
|
|
84
|
+
className?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* TagsInput — comma-separated text input that produces a string[] value.
|
|
88
|
+
* Parses on each change: splits on commas, trims whitespace, removes empty strings.
|
|
89
|
+
*/
|
|
90
|
+
export declare function TagsInput({ value, onChange, className, }: TagsInputProps): React.JSX.Element;
|
|
91
|
+
export interface CorrectionNoteProps {
|
|
92
|
+
/** Current correction note text */
|
|
93
|
+
value: string;
|
|
94
|
+
/** Called when the text changes */
|
|
95
|
+
onChange: (note: string) => void;
|
|
96
|
+
/**
|
|
97
|
+
* When true, the textarea is required — form save is blocked until
|
|
98
|
+
* the note is non-empty (enforced by FeedbackUpdatePage).
|
|
99
|
+
*/
|
|
100
|
+
required: boolean;
|
|
101
|
+
/** Optional CSS class on the container */
|
|
102
|
+
className?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* CorrectionNote — textarea for explaining why a classification field changed.
|
|
106
|
+
* Rendered only when a classification field (type, scope, size) has changed.
|
|
107
|
+
* When `required` is true, sets aria-required="true".
|
|
108
|
+
*/
|
|
109
|
+
export declare function CorrectionNote({ value, onChange, required, className, }: CorrectionNoteProps): React.JSX.Element;
|
|
110
|
+
/**
|
|
111
|
+
* EditableFields — namespace of form-field components for FeedbackUpdatePage.
|
|
112
|
+
*
|
|
113
|
+
* Usage:
|
|
114
|
+
* import { EditableFields } from './components/EditableFields.js';
|
|
115
|
+
* <EditableFields.StatusSelect ... />
|
|
116
|
+
*/
|
|
117
|
+
export declare const EditableFields: {
|
|
118
|
+
readonly StatusSelect: typeof StatusSelect;
|
|
119
|
+
readonly TypeSelect: typeof TypeSelect;
|
|
120
|
+
readonly ScopeSelect: typeof ScopeSelect;
|
|
121
|
+
readonly SizeSelect: typeof SizeSelect;
|
|
122
|
+
readonly AssigneeInput: typeof AssigneeInput;
|
|
123
|
+
readonly TagsInput: typeof TagsInput;
|
|
124
|
+
readonly CorrectionNote: typeof CorrectionNote;
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=EditableFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableFields.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/EditableFields.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { FeedbackListPageProps } from '../types.js';
|
|
3
|
+
|
|
4
|
+
export type { FeedbackListPageProps };
|
|
5
|
+
/**
|
|
6
|
+
* FeedbackListPage — admin list page for browsing and filtering feedback items.
|
|
7
|
+
*
|
|
8
|
+
* Headless/unstyled component using Inversion of Control pattern.
|
|
9
|
+
* Consumer provides data via `items` prop; this component manages
|
|
10
|
+
* filter and sort state internally.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* <FeedbackListPage
|
|
14
|
+
* items={myItems}
|
|
15
|
+
* onNavigate={(path) => router.push(path)}
|
|
16
|
+
* />
|
|
17
|
+
*/
|
|
18
|
+
export declare function FeedbackListPage({ items, loading, onNavigate, className, tableClassName, filterClassName, emptyStateMessage, }: FeedbackListPageProps): React.JSX.Element;
|
|
19
|
+
//# sourceMappingURL=FeedbackListPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackListPage.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/FeedbackListPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQzD,YAAY,EAAE,qBAAqB,EAAE,CAAC;AA4CtC;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,OAAe,EACf,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,iBAA8C,GAC/C,EAAE,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0L3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackListPage.test.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/FeedbackListPage.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { AdminFilterState } from '../types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the FilterControls component.
|
|
6
|
+
*/
|
|
7
|
+
export interface FilterControlsProps {
|
|
8
|
+
/** Current filter state */
|
|
9
|
+
filters: AdminFilterState;
|
|
10
|
+
/** Callback fired when any filter value changes */
|
|
11
|
+
onChange: (filters: AdminFilterState) => void;
|
|
12
|
+
/** Additional CSS class names */
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* FilterControls — headless filtering controls for feedback items.
|
|
17
|
+
*
|
|
18
|
+
* Renders `<select>` elements for status, type, and environment filters.
|
|
19
|
+
* No direct state management — emits changes via `onChange` callback.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* <FilterControls
|
|
23
|
+
* filters={{ status: '', type: '', environment: '' }}
|
|
24
|
+
* onChange={(f) => setFilters(f)}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
export declare function FilterControls({ filters, onChange, className }: FilterControlsProps): React.JSX.Element;
|
|
28
|
+
//# sourceMappingURL=FilterControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterControls.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/FilterControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgFvG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the NavigationLink component.
|
|
5
|
+
*/
|
|
6
|
+
export interface NavigationLinkProps {
|
|
7
|
+
/** The path to navigate to when clicked */
|
|
8
|
+
path: string;
|
|
9
|
+
/** Callback that receives the path on click (consumer owns routing) */
|
|
10
|
+
onNavigate: (path: string) => void;
|
|
11
|
+
/** Content to render inside the link element */
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
/** Additional CSS class names */
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Optional aria-label for accessibility */
|
|
16
|
+
'aria-label'?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* NavigationLink — headless navigation element using Inversion of Control.
|
|
20
|
+
*
|
|
21
|
+
* Renders a `<button>` element that calls `onNavigate(path)` on click.
|
|
22
|
+
* Does NOT use `<a href>` to remain framework-agnostic.
|
|
23
|
+
* Consumer owns routing — this component just signals the desired destination.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* <NavigationLink path="/feedback/123" onNavigate={navigate}>
|
|
27
|
+
* View detail
|
|
28
|
+
* </NavigationLink>
|
|
29
|
+
*/
|
|
30
|
+
export declare function NavigationLink({ path, onNavigate, children, className, 'aria-label': ariaLabel, }: NavigationLinkProps): React.JSX.Element;
|
|
31
|
+
//# sourceMappingURL=NavigationLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationLink.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/NavigationLink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gDAAgD;IAChD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAuBzC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { StoredFeedbackItem } from '../../../core/types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the QuickActions component.
|
|
6
|
+
*/
|
|
7
|
+
export interface QuickActionsProps {
|
|
8
|
+
/** The feedback item to act on */
|
|
9
|
+
item: StoredFeedbackItem;
|
|
10
|
+
/**
|
|
11
|
+
* Called when a status transition is requested.
|
|
12
|
+
* Consumer owns the data mutation.
|
|
13
|
+
*/
|
|
14
|
+
updateItem: (id: string, patch: Partial<StoredFeedbackItem>) => Promise<void>;
|
|
15
|
+
/** Called when a navigation action is triggered */
|
|
16
|
+
onNavigate: (path: string) => void;
|
|
17
|
+
/** Optional current user for displaying user-specific actions */
|
|
18
|
+
currentUser?: {
|
|
19
|
+
userId: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Additional CSS class names applied to the root element */
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* QuickActions — headless action button group for common feedback operations.
|
|
27
|
+
*
|
|
28
|
+
* Renders status transition buttons based on allowed transitions for the
|
|
29
|
+
* current status, plus navigation buttons for editing and returning to the list.
|
|
30
|
+
* Buttons are disabled during async update operations. No styling applied —
|
|
31
|
+
* consumer provides CSS via `className` prop.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* <QuickActions
|
|
35
|
+
* item={feedbackItem}
|
|
36
|
+
* updateItem={updateItem}
|
|
37
|
+
* onNavigate={navigate}
|
|
38
|
+
* currentUser={currentUser}
|
|
39
|
+
* className="quick-actions-bar"
|
|
40
|
+
* />
|
|
41
|
+
*/
|
|
42
|
+
export declare function QuickActions({ item, updateItem, onNavigate, className, }: QuickActionsProps): React.JSX.Element;
|
|
43
|
+
//# sourceMappingURL=QuickActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuickActions.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/QuickActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,wBAAwB,CAAC;AAuBjF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,UAAU,EAAE,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,mDAAmD;IACnD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,iEAAiE;IACjE,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+EvC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the ScreenshotViewer component.
|
|
5
|
+
*/
|
|
6
|
+
export interface ScreenshotViewerProps {
|
|
7
|
+
/**
|
|
8
|
+
* S3 key for the screenshot. When provided, `generateScreenshotUrl` is
|
|
9
|
+
* called to obtain a display URL. When absent or null, a fallback message
|
|
10
|
+
* is shown.
|
|
11
|
+
*/
|
|
12
|
+
screenshotS3Key?: string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Consumer-provided function that resolves an S3 key to a displayable URL.
|
|
15
|
+
* If not provided and a key exists, a configuration hint is shown.
|
|
16
|
+
*/
|
|
17
|
+
generateScreenshotUrl?: (s3Key: string) => Promise<string>;
|
|
18
|
+
/** Alt text for the screenshot image. Defaults to "Feedback screenshot". */
|
|
19
|
+
alt?: string;
|
|
20
|
+
/** Additional CSS class names applied to the root element */
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ScreenshotViewer — headless screenshot display component.
|
|
25
|
+
*
|
|
26
|
+
* Displays a screenshot image with accessibility attributes. Degrades
|
|
27
|
+
* gracefully when no screenshot is available or the URL resolver is not
|
|
28
|
+
* configured. No styling applied — consumer provides CSS via `className` prop.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* <ScreenshotViewer
|
|
32
|
+
* screenshotS3Key={item.screenshotS3Key}
|
|
33
|
+
* generateScreenshotUrl={myUrlResolver}
|
|
34
|
+
* className="screenshot-panel"
|
|
35
|
+
* />
|
|
36
|
+
*/
|
|
37
|
+
export declare function ScreenshotViewer({ screenshotS3Key, generateScreenshotUrl, alt, className, }: ScreenshotViewerProps): React.JSX.Element;
|
|
38
|
+
//# sourceMappingURL=ScreenshotViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenshotViewer.d.ts","sourceRoot":"","sources":["../../../../src/react/admin/components/ScreenshotViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,qBAAqB,EACrB,GAA2B,EAC3B,SAAS,GACV,EAAE,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkE3C"}
|