@fivepixels-js/react 0.2.2 → 0.2.3
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/icons/Icons.d.ts +9 -0
- package/dist/components/icons/Icons.d.ts.map +1 -1
- package/dist/components/icons/Icons.js +12 -0
- package/dist/components/icons/Icons.js.map +1 -1
- package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -1
- package/dist/components/overlay/ReportOverlayLayer.js +3 -3
- package/dist/components/overlay/ReportOverlayLayer.js.map +1 -1
- package/dist/components/overlay/TargetHighlights.d.ts +2 -1
- package/dist/components/overlay/TargetHighlights.d.ts.map +1 -1
- package/dist/components/overlay/TargetHighlights.js +3 -2
- package/dist/components/overlay/TargetHighlights.js.map +1 -1
- package/dist/components/panel/PanelProjectFooter.d.ts.map +1 -1
- package/dist/components/panel/PanelProjectFooter.js +1 -4
- package/dist/components/panel/PanelProjectFooter.js.map +1 -1
- package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
- package/dist/components/panel/ReportDraftForm.js +48 -35
- package/dist/components/panel/ReportDraftForm.js.map +1 -1
- package/dist/components/panel/ReportImportConfirmDialog.d.ts +3 -2
- package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -1
- package/dist/components/panel/ReportImportConfirmDialog.js +8 -1
- package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -1
- package/dist/components/panel/feedback/AssigneeThreadEntry.d.ts.map +1 -1
- package/dist/components/panel/feedback/AssigneeThreadEntry.js +11 -2
- package/dist/components/panel/feedback/AssigneeThreadEntry.js.map +1 -1
- package/dist/components/panel/feedback/DraftComposerToolbar.d.ts +24 -0
- package/dist/components/panel/feedback/DraftComposerToolbar.d.ts.map +1 -0
- package/dist/components/panel/feedback/DraftComposerToolbar.js +60 -0
- package/dist/components/panel/feedback/DraftComposerToolbar.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts +4 -1
- package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackCaseEditor.js +19 -7
- package/dist/components/panel/feedback/FeedbackCaseEditor.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackCategorySelector.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackCategorySelector.js +10 -7
- package/dist/components/panel/feedback/FeedbackCategorySelector.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackComposer.d.ts +11 -1
- package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackComposer.js +133 -19
- package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts +16 -0
- package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackDeleteAction.js +28 -0
- package/dist/components/panel/feedback/FeedbackDeleteAction.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackHoverCard.js +4 -4
- package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackListItem.js +8 -26
- package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackThread.js +29 -10
- package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js +1 -1
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -1
- package/dist/components/panel/feedback/MentionComposerInput.d.ts +17 -0
- package/dist/components/panel/feedback/MentionComposerInput.d.ts.map +1 -0
- package/dist/components/panel/feedback/MentionComposerInput.js +292 -0
- package/dist/components/panel/feedback/MentionComposerInput.js.map +1 -0
- package/dist/components/panel/feedback/MentionMessage.d.ts +9 -0
- package/dist/components/panel/feedback/MentionMessage.d.ts.map +1 -0
- package/dist/components/panel/feedback/MentionMessage.js +27 -0
- package/dist/components/panel/feedback/MentionMessage.js.map +1 -0
- package/dist/components/panel/feedback/PickTargetSnippet.d.ts +3 -2
- package/dist/components/panel/feedback/PickTargetSnippet.d.ts.map +1 -1
- package/dist/components/panel/feedback/PickTargetSnippet.js +12 -4
- package/dist/components/panel/feedback/PickTargetSnippet.js.map +1 -1
- package/dist/components/panel/feedback/ThreadAuthorMeta.d.ts.map +1 -1
- package/dist/components/panel/feedback/ThreadAuthorMeta.js +4 -1
- package/dist/components/panel/feedback/ThreadAuthorMeta.js.map +1 -1
- package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
- package/dist/components/panel/feedback/ThreadChildReply.js +2 -1
- package/dist/components/panel/feedback/ThreadChildReply.js.map +1 -1
- package/dist/components/panel/feedback/ThreadEntryActions.d.ts +3 -1
- package/dist/components/panel/feedback/ThreadEntryActions.d.ts.map +1 -1
- package/dist/components/panel/feedback/ThreadEntryActions.js +26 -6
- package/dist/components/panel/feedback/ThreadEntryActions.js.map +1 -1
- package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
- package/dist/components/point/MarkerCaseSidebar.js +8 -3
- package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
- package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
- package/dist/components/point/MarkerFeedbackWindow.js +12 -5
- package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
- package/dist/components/point/ReportDraftMarker.d.ts.map +1 -1
- package/dist/components/point/ReportDraftMarker.js +3 -2
- package/dist/components/point/ReportDraftMarker.js.map +1 -1
- package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
- package/dist/components/point/ReportMarkersLayer.js +2 -2
- package/dist/components/point/ReportMarkersLayer.js.map +1 -1
- package/dist/components/report/ReportView.d.ts.map +1 -1
- package/dist/components/report/ReportView.js +4 -7
- package/dist/components/report/ReportView.js.map +1 -1
- package/dist/constants/threadActionStyles.d.ts +16 -0
- package/dist/constants/threadActionStyles.d.ts.map +1 -0
- package/dist/constants/threadActionStyles.js +52 -0
- package/dist/constants/threadActionStyles.js.map +1 -0
- package/dist/hooks/report/assembleReportContextValue.d.ts +25 -17
- package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
- package/dist/hooks/report/assembleReportContextValue.js +8 -2
- package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
- package/dist/hooks/report/useReplyCaseEdit.d.ts +6 -1
- package/dist/hooks/report/useReplyCaseEdit.d.ts.map +1 -1
- package/dist/hooks/report/useReplyCaseEdit.js +28 -2
- package/dist/hooks/report/useReplyCaseEdit.js.map +1 -1
- package/dist/hooks/report/useReportAuthSession.d.ts +1 -1
- package/dist/hooks/report/useReportDraftSession.d.ts +2 -1
- package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
- package/dist/hooks/report/useReportDraftSession.js +18 -0
- package/dist/hooks/report/useReportDraftSession.js.map +1 -1
- package/dist/hooks/report/useReportMutations.d.ts +6 -1
- package/dist/hooks/report/useReportMutations.d.ts.map +1 -1
- package/dist/hooks/report/useReportMutations.js +43 -2
- package/dist/hooks/report/useReportMutations.js.map +1 -1
- package/dist/hooks/report/useReportReplyReview.d.ts +7 -0
- package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -1
- package/dist/hooks/report/useReportReplyReview.js +37 -20
- package/dist/hooks/report/useReportReplyReview.js.map +1 -1
- package/dist/hooks/report/useReportState.d.ts +6 -0
- package/dist/hooks/report/useReportState.d.ts.map +1 -1
- package/dist/hooks/report/useReportState.js +30 -1
- package/dist/hooks/report/useReportState.js.map +1 -1
- package/dist/hooks/usePanelFeedbackTransfer.d.ts +4 -4
- package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -1
- package/dist/hooks/usePanelFeedbackTransfer.js +24 -17
- package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +44 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +51 -16
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/types.d.ts +33 -3
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/providers/reportContext.d.ts +32 -2
- package/dist/providers/reportContext.d.ts.map +1 -1
- package/dist/providers/reportContextPartitions.d.ts +1 -1
- package/dist/providers/reportContextPartitions.d.ts.map +1 -1
- package/dist/providers/reportContextPartitions.js +6 -0
- package/dist/providers/reportContextPartitions.js.map +1 -1
- package/dist/storage/local/localStorageAdapter.d.ts.map +1 -1
- package/dist/storage/local/localStorageAdapter.js +2 -0
- package/dist/storage/local/localStorageAdapter.js.map +1 -1
- package/dist/styles/reportStylesheet.d.ts +1 -1
- package/dist/styles/reportStylesheet.d.ts.map +1 -1
- package/dist/styles/reportStylesheet.js +1 -1
- package/dist/styles/reportStylesheet.js.map +1 -1
- package/dist/types/mention.d.ts +17 -0
- package/dist/types/mention.d.ts.map +1 -0
- package/dist/types/mention.js +11 -0
- package/dist/types/mention.js.map +1 -0
- package/dist/types/report.d.ts +4 -0
- package/dist/types/report.d.ts.map +1 -1
- package/dist/types/report.js.map +1 -1
- package/dist/utils/feedback/feedbackDataTransfer.d.ts +9 -2
- package/dist/utils/feedback/feedbackDataTransfer.d.ts.map +1 -1
- package/dist/utils/feedback/feedbackDataTransfer.js +24 -16
- package/dist/utils/feedback/feedbackDataTransfer.js.map +1 -1
- package/dist/utils/feedback/feedbackImportMerge.d.ts +26 -0
- package/dist/utils/feedback/feedbackImportMerge.d.ts.map +1 -0
- package/dist/utils/feedback/feedbackImportMerge.js +97 -0
- package/dist/utils/feedback/feedbackImportMerge.js.map +1 -0
- package/dist/utils/feedback/feedbackPermissions.d.ts +8 -0
- package/dist/utils/feedback/feedbackPermissions.d.ts.map +1 -0
- package/dist/utils/feedback/feedbackPermissions.js +30 -0
- package/dist/utils/feedback/feedbackPermissions.js.map +1 -0
- package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -1
- package/dist/utils/feedback/validateFeedbackImport.js +1 -0
- package/dist/utils/feedback/validateFeedbackImport.js.map +1 -1
- package/dist/utils/mention/elementMentions.d.ts +39 -0
- package/dist/utils/mention/elementMentions.d.ts.map +1 -0
- package/dist/utils/mention/elementMentions.js +273 -0
- package/dist/utils/mention/elementMentions.js.map +1 -0
- package/dist/utils/mention/mentionComposerDom.d.ts +31 -0
- package/dist/utils/mention/mentionComposerDom.d.ts.map +1 -0
- package/dist/utils/mention/mentionComposerDom.js +253 -0
- package/dist/utils/mention/mentionComposerDom.js.map +1 -0
- package/dist/utils/panel/heatmapActivity.d.ts +1 -1
- package/dist/utils/report/buildDraftFromReport.d.ts +5 -0
- package/dist/utils/report/buildDraftFromReport.d.ts.map +1 -0
- package/dist/utils/report/buildDraftFromReport.js +33 -0
- package/dist/utils/report/buildDraftFromReport.js.map +1 -0
- package/dist/utils/shared/format.d.ts +2 -0
- package/dist/utils/shared/format.d.ts.map +1 -1
- package/dist/utils/shared/format.js +19 -0
- package/dist/utils/shared/format.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/panel/feedback/ComposerFooterWarning.d.ts +0 -6
- package/dist/components/panel/feedback/ComposerFooterWarning.d.ts.map +0 -1
- package/dist/components/panel/feedback/ComposerFooterWarning.js +0 -6
- package/dist/components/panel/feedback/ComposerFooterWarning.js.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReportCase } from "../../../types/report.js";
|
|
2
|
+
import { type FeedbackCategory } from "../../../constants/feedbackCategory.js";
|
|
3
|
+
type DraftComposerToolbarProps = {
|
|
4
|
+
cases: ReportCase[];
|
|
5
|
+
activeCaseId: string | null;
|
|
6
|
+
onSelectCase: (caseId: string) => void;
|
|
7
|
+
onAddCase: () => void;
|
|
8
|
+
onRemoveCase: (caseId: string) => void;
|
|
9
|
+
category: FeedbackCategory | null;
|
|
10
|
+
onCategoryChange: (value: FeedbackCategory) => void;
|
|
11
|
+
categoryNeedsAttention?: boolean;
|
|
12
|
+
onSubmit: () => void;
|
|
13
|
+
isSubmitting?: boolean;
|
|
14
|
+
submitLabel?: string;
|
|
15
|
+
submittingLabel?: string;
|
|
16
|
+
showGitHubIssueOnCreate?: boolean;
|
|
17
|
+
onGitHubIssueSubmit?: () => void;
|
|
18
|
+
isGitHubIssueSubmitting?: boolean;
|
|
19
|
+
isGitHubIssueConfirming?: boolean;
|
|
20
|
+
onGitHubIssueConfirmingChange?: (confirming: boolean) => void;
|
|
21
|
+
};
|
|
22
|
+
export declare function DraftComposerToolbar({ cases, activeCaseId, onSelectCase, onAddCase, onRemoveCase, category, onCategoryChange, categoryNeedsAttention, onSubmit, isSubmitting, submitLabel, submittingLabel, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, isGitHubIssueConfirming, onGitHubIssueConfirmingChange, }: DraftComposerToolbarProps): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=DraftComposerToolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DraftComposerToolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/DraftComposerToolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAM7F,KAAK,yBAAyB,GAAG;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,6BAA6B,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CACjE,CAAC;AAeF,wBAAgB,oBAAoB,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,sBAA8B,EAC9B,QAAQ,EACR,YAAoB,EACpB,WAAW,EACX,eAAe,EACf,uBAA+B,EAC/B,mBAAmB,EACnB,uBAA+B,EAC/B,uBAA+B,EAC/B,6BAA6B,GAChC,EAAE,yBAAyB,+BAqL3B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { FEEDBACK_CATEGORIES } from "../../../constants/feedbackCategory.js";
|
|
4
|
+
import { ChevronDownIcon, SendIcon } from "../../../components/icons/Icons.js";
|
|
5
|
+
import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
|
|
6
|
+
import { PanelDropdownMenu, PanelDropdownMenuItem } from "../../../components/panel/PanelDropdownMenu.js";
|
|
7
|
+
import { useReportPreferences } from "../../../providers/reportContext.js";
|
|
8
|
+
const TOOLBAR_TRIGGER_CLASS = "inline-flex h-[28px] max-w-[140px] items-center gap-[4px] rounded-[8px] px-[8px] text-[12px] font-semibold text-[var(--adaptive-black600)] transition-colors hover:bg-[var(--adaptive-tintOpacity100)] hover:text-[var(--adaptive-black900)]";
|
|
9
|
+
function truncateLabel(text, fallback) {
|
|
10
|
+
const trimmed = text.trim();
|
|
11
|
+
if (!trimmed) {
|
|
12
|
+
return fallback;
|
|
13
|
+
}
|
|
14
|
+
return trimmed.length > 18 ? `${trimmed.slice(0, 18)}…` : trimmed;
|
|
15
|
+
}
|
|
16
|
+
export function DraftComposerToolbar({ cases, activeCaseId, onSelectCase, onAddCase, onRemoveCase, category, onCategoryChange, categoryNeedsAttention = false, onSubmit, isSubmitting = false, submitLabel, submittingLabel, showGitHubIssueOnCreate = false, onGitHubIssueSubmit, isGitHubIssueSubmitting = false, isGitHubIssueConfirming = false, onGitHubIssueConfirmingChange, }) {
|
|
17
|
+
const { messages } = useReportPreferences();
|
|
18
|
+
const [casesOpen, setCasesOpen] = useState(false);
|
|
19
|
+
const [categoryOpen, setCategoryOpen] = useState(false);
|
|
20
|
+
const isActionDisabled = isSubmitting || isGitHubIssueSubmitting;
|
|
21
|
+
const resolvedSubmitLabel = submitLabel ?? messages.composer.draftComplete;
|
|
22
|
+
const resolvedSubmittingLabel = submittingLabel ?? messages.composer.draftCompleting;
|
|
23
|
+
const activeCaseIndex = Math.max(0, cases.findIndex((item) => item.id === activeCaseId));
|
|
24
|
+
const activeCase = cases[activeCaseIndex] ?? cases[0] ?? null;
|
|
25
|
+
const casesLabel = activeCase ? truncateLabel(activeCase.text, messages.composer.caseTabLabel(activeCaseIndex + 1)) : messages.composer.casesDropdownLabel;
|
|
26
|
+
const categoryLabel = category ? messages.composer.categoryOption[category] : messages.composer.categoryLabel;
|
|
27
|
+
const handleGitHubIssueClick = () => {
|
|
28
|
+
if (isActionDisabled || !onGitHubIssueSubmit) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!isGitHubIssueConfirming) {
|
|
32
|
+
onGitHubIssueConfirmingChange?.(true);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
onGitHubIssueConfirmingChange?.(false);
|
|
36
|
+
onGitHubIssueSubmit();
|
|
37
|
+
};
|
|
38
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-[6px] px-[8px] py-[6px]", children: [_jsx(HoverTooltip, { label: messages.composer.addCase, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: onAddCase, disabled: isActionDisabled, "aria-label": messages.composer.addCaseTabAriaLabel, className: "inline-flex h-[28px] w-[28px] shrink-0 items-center justify-center rounded-[8px] text-[18px] font-medium leading-none text-[var(--adaptive-black600)] transition-colors hover:bg-[var(--adaptive-tintOpacity100)] hover:text-[var(--adaptive-black900)] disabled:opacity-50", children: "+" }) }), _jsx("span", { className: "h-[14px] w-px shrink-0 bg-[var(--adaptive-border-subtle)]", "aria-hidden": true }), _jsx(PanelDropdownMenu, { open: casesOpen, onClose: () => setCasesOpen(false), align: "left", menuClassName: "min-w-[180px] rounded-[10px]", trigger: _jsxs("button", { type: "button", "data-fivepixels-interactive": "", "aria-expanded": casesOpen, "aria-label": messages.composer.casesDropdownAriaLabel, disabled: isActionDisabled, onClick: () => {
|
|
39
|
+
setCategoryOpen(false);
|
|
40
|
+
setCasesOpen((current) => !current);
|
|
41
|
+
}, className: `${TOOLBAR_TRIGGER_CLASS} disabled:opacity-50`, children: [_jsx("span", { className: "min-w-0 truncate", children: casesLabel }), _jsx(ChevronDownIcon, { className: "h-[12px] w-[12px] shrink-0" })] }), children: cases.map((item, index) => {
|
|
42
|
+
const isActive = item.id === activeCaseId;
|
|
43
|
+
return (_jsxs("div", { className: "flex items-stretch", children: [_jsx(PanelDropdownMenuItem, { active: isActive, onClick: () => {
|
|
44
|
+
onSelectCase(item.id);
|
|
45
|
+
setCasesOpen(false);
|
|
46
|
+
}, children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: truncateLabel(item.text, messages.composer.caseTabLabel(index + 1)) }) }), cases.length > 1 ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: () => {
|
|
47
|
+
onRemoveCase(item.id);
|
|
48
|
+
if (cases.length <= 2) {
|
|
49
|
+
setCasesOpen(false);
|
|
50
|
+
}
|
|
51
|
+
}, "aria-label": messages.composer.removeCaseAriaLabel(index + 1), className: "inline-flex w-[28px] shrink-0 items-center justify-center text-[14px] text-[var(--adaptive-black500)] hover:bg-[var(--adaptive-black100)] hover:text-[var(--adaptive-black900)]", children: "\u00D7" })) : null] }, item.id));
|
|
52
|
+
}) }), _jsx(PanelDropdownMenu, { open: categoryOpen, onClose: () => setCategoryOpen(false), align: "left", menuClassName: "min-w-[140px] rounded-[10px]", trigger: _jsxs("button", { type: "button", "data-fivepixels-interactive": "", "aria-expanded": categoryOpen, "aria-label": messages.composer.categoryAriaLabel, "aria-invalid": categoryNeedsAttention || undefined, disabled: isActionDisabled, onClick: () => {
|
|
53
|
+
setCasesOpen(false);
|
|
54
|
+
setCategoryOpen((current) => !current);
|
|
55
|
+
}, className: `${TOOLBAR_TRIGGER_CLASS} disabled:opacity-50 ` + (categoryNeedsAttention ? "fivepixels-validation-attention text-rose-500 hover:text-rose-600" : ""), children: [_jsx("span", { className: "min-w-0 truncate", children: categoryLabel }), _jsx(ChevronDownIcon, { className: "h-[12px] w-[12px] shrink-0" })] }), children: FEEDBACK_CATEGORIES.map((item) => (_jsx(PanelDropdownMenuItem, { active: category === item, onClick: () => {
|
|
56
|
+
onCategoryChange(item);
|
|
57
|
+
setCategoryOpen(false);
|
|
58
|
+
}, children: messages.composer.categoryOption[item] }, item))) }), _jsx("div", { className: "min-w-[8px] flex-1" }), showGitHubIssueOnCreate && onGitHubIssueSubmit ? (_jsxs("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleGitHubIssueClick, className: "inline-flex h-[28px] items-center justify-center rounded-full border border-[var(--adaptive-border-subtle)] px-[10px] text-[12px] font-semibold text-[var(--adaptive-black500)] disabled:opacity-50", "aria-label": isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmAriaLabel : messages.composer.gitIssueSendAriaLabel, title: isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmTitle : messages.composer.gitIssueSendTitle, children: ["+ ", isGitHubIssueSubmitting ? messages.composer.gitIssueSendingLabel : isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmLabel : messages.composer.gitIssueSendLabel] })) : null, _jsx(HoverTooltip, { label: resolvedSubmitLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: onSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[var(--adaptive-black900)] text-[var(--adaptive-black50)] disabled:opacity-50", "aria-label": isSubmitting ? resolvedSubmittingLabel : resolvedSubmitLabel, children: _jsx(SendIcon, { className: "h-[14px] w-[14px]" }) }) })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=DraftComposerToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DraftComposerToolbar.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/DraftComposerToolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAyB,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAsBpE,MAAM,qBAAqB,GACvB,8OAA8O,CAAC;AAEnP,SAAS,aAAa,CAAC,IAAY,EAAE,QAAgB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,sBAAsB,GAAG,KAAK,EAC9B,QAAQ,EACR,YAAY,GAAG,KAAK,EACpB,WAAW,EACX,eAAe,EACf,uBAAuB,GAAG,KAAK,EAC/B,mBAAmB,EACnB,uBAAuB,GAAG,KAAK,EAC/B,uBAAuB,GAAG,KAAK,EAC/B,6BAA6B,GACL;IACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,YAAY,IAAI,uBAAuB,CAAC;IACjE,MAAM,mBAAmB,GAAG,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC3E,MAAM,uBAAuB,GAAG,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;IACrF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC5B,CAAC,EACD,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CACtD,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9D,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC3J,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;IAE9G,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAChC,IAAI,gBAAgB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC3B,6BAA6B,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO;QACX,CAAC;QAED,6BAA6B,EAAE,CAAC,KAAK,CAAC,CAAC;QACvC,mBAAmB,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,CACH,eAAK,SAAS,EAAC,wDAAwD,aACnE,KAAC,YAAY,IAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,YAC1C,iBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,EAC9B,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,gBAAgB,gBACd,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EACjD,SAAS,EAAC,6QAA6Q,kBAGlR,GACE,EAEf,eACI,SAAS,EAAC,2DAA2D,wBAEvE,EAEF,KAAC,iBAAiB,IACd,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,KAAK,EAAC,MAAM,EACZ,aAAa,EAAC,8BAA8B,EAC5C,OAAO,EACH,kBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,mBACf,SAAS,gBACZ,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EACpD,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE;wBACV,eAAe,CAAC,KAAK,CAAC,CAAC;wBACvB,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;oBACxC,CAAC,EACD,SAAS,EAAE,GAAG,qBAAqB,sBAAsB,aAEzD,eAAM,SAAS,EAAC,kBAAkB,YAAE,UAAU,GAAQ,EACtD,KAAC,eAAe,IAAC,SAAS,EAAC,4BAA4B,GAAG,IACrD,YAGZ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC;oBAE1C,OAAO,CACH,eAEI,SAAS,EAAC,oBAAoB,aAE9B,KAAC,qBAAqB,IAClB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,GAAG,EAAE;oCACV,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oCACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gCACxB,CAAC,YAED,eAAM,SAAS,EAAC,yBAAyB,YAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAQ,GAClG,EACvB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAChB,iBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,EAC9B,OAAO,EAAE,GAAG,EAAE;oCACV,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oCACtB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wCACpB,YAAY,CAAC,KAAK,CAAC,CAAC;oCACxB,CAAC;gCACL,CAAC,gBACW,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,EAC5D,SAAS,EAAC,iLAAiL,uBAGtL,CACZ,CAAC,CAAC,CAAC,IAAI,KA3BH,IAAI,CAAC,EAAE,CA4BV,CACT,CAAC;gBACN,CAAC,CAAC,GACc,EAEpB,KAAC,iBAAiB,IACd,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,KAAK,EAAC,MAAM,EACZ,aAAa,EAAC,8BAA8B,EAC5C,OAAO,EACH,kBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,mBACf,YAAY,gBACf,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,kBACjC,sBAAsB,IAAI,SAAS,EACjD,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE;wBACV,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;oBAC3C,CAAC,EACD,SAAS,EAAE,GAAG,qBAAqB,uBAAuB,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,mEAAmE,CAAC,CAAC,CAAC,EAAE,CAAC,aAEhK,eAAM,SAAS,EAAC,kBAAkB,YAAE,aAAa,GAAQ,EACzD,KAAC,eAAe,IAAC,SAAS,EAAC,4BAA4B,GAAG,IACrD,YAGZ,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC/B,KAAC,qBAAqB,IAElB,MAAM,EAAE,QAAQ,KAAK,IAAI,EACzB,OAAO,EAAE,GAAG,EAAE;wBACV,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBACvB,eAAe,CAAC,KAAK,CAAC,CAAC;oBAC3B,CAAC,YAEA,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAPlC,IAAI,CAQW,CAC3B,CAAC,GACc,EAEpB,cAAK,SAAS,EAAC,oBAAoB,GAAG,EAErC,uBAAuB,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAC9C,kBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,EAC9B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,sBAAsB,EAC/B,SAAS,EAAC,qMAAqM,gBACnM,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAC9H,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,mBAE9G,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,IAC3K,CACZ,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,YAAY,IACT,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,gBAAgB,YAE1B,iBACI,IAAI,EAAC,QAAQ,iCACe,EAAE,EAC9B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,kKAAkK,gBAChK,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,mBAAmB,YAExE,KAAC,QAAQ,IAAC,SAAS,EAAC,mBAAmB,GAAG,GACrC,GACE,IACb,CACT,CAAC;AACN,CAAC"}
|
|
@@ -9,7 +9,10 @@ type FeedbackCaseEditorProps = {
|
|
|
9
9
|
needsAttention?: boolean;
|
|
10
10
|
attentionKey?: number;
|
|
11
11
|
emptyCaseIds?: string[];
|
|
12
|
+
showTabBar?: boolean;
|
|
13
|
+
activeCaseId?: string | null;
|
|
14
|
+
onActiveCaseIdChange?: (caseId: string) => void;
|
|
12
15
|
};
|
|
13
|
-
export declare function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus, onSubmitShortcut, needsAttention, attentionKey, emptyCaseIds, }: FeedbackCaseEditorProps): import("react").JSX.Element | null;
|
|
16
|
+
export declare function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus, onSubmitShortcut, needsAttention, attentionKey, emptyCaseIds, showTabBar, activeCaseId: controlledActiveCaseId, onActiveCaseIdChange, }: FeedbackCaseEditorProps): import("react").JSX.Element | null;
|
|
14
17
|
export {};
|
|
15
18
|
//# sourceMappingURL=FeedbackCaseEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackCaseEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,KAAK,uBAAuB,GAAG;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackCaseEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,KAAK,uBAAuB,GAAG;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAmFF,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAiB,EACjB,gBAAgB,EAChB,cAAsB,EACtB,YAAgB,EAChB,YAAiB,EACjB,UAAiB,EACjB,YAAY,EAAE,sBAAsB,EACpC,oBAAoB,GACvB,EAAE,uBAAuB,sCAqIzB"}
|
|
@@ -46,11 +46,23 @@ function resolveActiveCaseId(cases, activeCaseId) {
|
|
|
46
46
|
}
|
|
47
47
|
return cases[cases.length - 1]?.id ?? cases[0].id;
|
|
48
48
|
}
|
|
49
|
-
export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus = false, onSubmitShortcut, needsAttention = false, attentionKey = 0, emptyCaseIds = [], }) {
|
|
49
|
+
export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus = false, onSubmitShortcut, needsAttention = false, attentionKey = 0, emptyCaseIds = [], showTabBar = true, activeCaseId: controlledActiveCaseId, onActiveCaseIdChange, }) {
|
|
50
50
|
const { messages } = useReportPreferences();
|
|
51
51
|
const previousCaseCountRef = useRef(cases.length);
|
|
52
52
|
const containerRef = useRef(null);
|
|
53
|
-
const [
|
|
53
|
+
const [uncontrolledActiveCaseId, setUncontrolledActiveCaseId] = useState(() => cases[0]?.id ?? null);
|
|
54
|
+
const isActiveCaseControlled = controlledActiveCaseId !== undefined;
|
|
55
|
+
const activeCaseId = isActiveCaseControlled ? controlledActiveCaseId : uncontrolledActiveCaseId;
|
|
56
|
+
const setActiveCaseId = useCallback((caseId) => {
|
|
57
|
+
if (!caseId) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (isActiveCaseControlled) {
|
|
61
|
+
onActiveCaseIdChange?.(caseId);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
setUncontrolledActiveCaseId(caseId);
|
|
65
|
+
}, [isActiveCaseControlled, onActiveCaseIdChange]);
|
|
54
66
|
const resolvedActiveCaseId = resolveActiveCaseId(cases, activeCaseId);
|
|
55
67
|
const activeCase = cases.find((item) => item.id === resolvedActiveCaseId) ?? null;
|
|
56
68
|
const activeCaseIndex = activeCase ? cases.findIndex((item) => item.id === activeCase.id) : -1;
|
|
@@ -58,10 +70,10 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
|
|
|
58
70
|
const getCaseInputPlaceholder = useCallback((index) => messages.composer.caseInputPlaceholder(index), [messages.composer]);
|
|
59
71
|
useEffect(() => {
|
|
60
72
|
const nextActiveCaseId = resolveActiveCaseId(cases, activeCaseId);
|
|
61
|
-
if (nextActiveCaseId !== activeCaseId) {
|
|
73
|
+
if (nextActiveCaseId && nextActiveCaseId !== activeCaseId) {
|
|
62
74
|
setActiveCaseId(nextActiveCaseId);
|
|
63
75
|
}
|
|
64
|
-
}, [activeCaseId, cases]);
|
|
76
|
+
}, [activeCaseId, cases, setActiveCaseId]);
|
|
65
77
|
useEffect(() => {
|
|
66
78
|
if (cases.length <= previousCaseCountRef.current) {
|
|
67
79
|
previousCaseCountRef.current = cases.length;
|
|
@@ -75,7 +87,7 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
|
|
|
75
87
|
});
|
|
76
88
|
}
|
|
77
89
|
previousCaseCountRef.current = cases.length;
|
|
78
|
-
}, [cases]);
|
|
90
|
+
}, [cases, setActiveCaseId]);
|
|
79
91
|
useEffect(() => {
|
|
80
92
|
if (!needsAttention || attentionKey <= 0 || emptyCaseIds.length === 0) {
|
|
81
93
|
return;
|
|
@@ -91,7 +103,7 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
|
|
|
91
103
|
window.requestAnimationFrame(() => {
|
|
92
104
|
document.getElementById(`fivepixels-case-input-${targetCaseId}`)?.focus();
|
|
93
105
|
});
|
|
94
|
-
}, [needsAttention, attentionKey, emptyCaseIds, resolvedActiveCaseId]);
|
|
106
|
+
}, [needsAttention, attentionKey, emptyCaseIds, resolvedActiveCaseId, setActiveCaseId]);
|
|
95
107
|
const handleRemoveCase = (caseId) => {
|
|
96
108
|
const removeIndex = cases.findIndex((item) => item.id === caseId);
|
|
97
109
|
if (removeIndex < 0) {
|
|
@@ -106,6 +118,6 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
|
|
|
106
118
|
if (!activeCase || activeCaseIndex < 0) {
|
|
107
119
|
return null;
|
|
108
120
|
}
|
|
109
|
-
return (_jsxs("div", { ref: containerRef, className: "flex h-full min-h-0 flex-1 flex-col", children: [_jsx(FeedbackCaseTabBar, { variant: "editor", cases: cases, activeCaseId: resolvedActiveCaseId, onSelectCase: setActiveCaseId, onAddCase: onAddCase, onRemoveCase: handleRemoveCase, invalidCaseIds: needsAttention ? emptyCaseIds : [] }), _jsx("div", { role: "tabpanel", id: `fivepixels-case-panel-${activeCase.id}`, "aria-labelledby": `fivepixels-case-tab-${activeCase.id}`, className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-[4px] py-[4px]", children: _jsx(CaseTextarea, { id: `fivepixels-case-input-${activeCase.id}`, autoFocus: autoFocus && activeCaseIndex === 0, value: activeCase.text, placeholder: getCaseInputPlaceholder(activeCaseIndex + 1), onChange: (text) => onCaseChange(activeCase.id, text), onSubmitShortcut: onSubmitShortcut, needsAttention: activeCaseNeedsAttention }) })] }));
|
|
121
|
+
return (_jsxs("div", { ref: containerRef, className: "flex h-full min-h-0 flex-1 flex-col", children: [showTabBar ? (_jsx(FeedbackCaseTabBar, { variant: "editor", cases: cases, activeCaseId: resolvedActiveCaseId, onSelectCase: setActiveCaseId, onAddCase: onAddCase, onRemoveCase: handleRemoveCase, invalidCaseIds: needsAttention ? emptyCaseIds : [] })) : null, _jsx("div", { role: "tabpanel", id: `fivepixels-case-panel-${activeCase.id}`, "aria-labelledby": `fivepixels-case-tab-${activeCase.id}`, className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-[4px] py-[4px]", children: _jsx(CaseTextarea, { id: `fivepixels-case-input-${activeCase.id}`, autoFocus: autoFocus && activeCaseIndex === 0, value: activeCase.text, placeholder: getCaseInputPlaceholder(activeCaseIndex + 1), onChange: (text) => onCaseChange(activeCase.id, text), onSubmitShortcut: onSubmitShortcut, needsAttention: activeCaseNeedsAttention }) })] }));
|
|
110
122
|
}
|
|
111
123
|
//# sourceMappingURL=FeedbackCaseEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackCaseEditor.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackCaseEditor.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackCategorySelector.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FeedbackCategorySelector.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,KAAK,6BAA6B,GAAG;IACjC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAsB,EAAE,YAAgB,EAAE,EAAE,6BAA6B,+BAyD9I"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef } from "react";
|
|
3
|
+
import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
|
|
3
4
|
import { FEEDBACK_CATEGORIES } from "../../../constants/feedbackCategory.js";
|
|
4
5
|
export function FeedbackCategorySelector({ value, onChange, messages, needsAttention = false, attentionKey = 0 }) {
|
|
5
6
|
const containerRef = useRef(null);
|
|
@@ -11,15 +12,17 @@ export function FeedbackCategorySelector({ value, onChange, messages, needsAtten
|
|
|
11
12
|
containerRef.current?.scrollIntoView({ behavior: "smooth", block: "nearest" });
|
|
12
13
|
firstButtonRef.current?.focus();
|
|
13
14
|
}, [needsAttention, attentionKey]);
|
|
14
|
-
return (_jsx("div", { ref: containerRef, className:
|
|
15
|
+
return (_jsx("div", { ref: containerRef, className:
|
|
16
|
+
// "flex flex-wrap items-center gap-[4px] border-t border-[var(--adaptive-tintOpacity100)] p-[4px] transition-[box-shadow,background-color] duration-200 " +
|
|
17
|
+
"flex flex-wrap items-center gap-[4px] p-[4px] transition-[box-shadow,background-color] duration-200 " +
|
|
15
18
|
(needsAttention ? "fivepixels-validation-attention rounded-b-[12px] bg-rose-500/10" : ""), role: "group", "aria-label": messages.composer.categoryAriaLabel, "aria-invalid": needsAttention || undefined, children: FEEDBACK_CATEGORIES.map((category, index) => {
|
|
16
19
|
const selected = value === category;
|
|
17
|
-
return (_jsx("button", { ref: index === 0 ? firstButtonRef : undefined, type: "button", "data-fivepixels-interactive": "", "aria-pressed": selected, onClick: () => onChange(category), className: "rounded-[8px] border px-[12px] py-[4px] text-[12px] font-semibold " +
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
return (_jsx(HoverTooltip, { label: messages.composer.categoryTooltip[category], multiline: true, children: _jsx("button", { ref: index === 0 ? firstButtonRef : undefined, type: "button", "data-fivepixels-interactive": "", "aria-pressed": selected, "aria-label": `${messages.composer.categoryOption[category]}. ${messages.composer.categoryTooltip[category]}`, onClick: () => onChange(category), className: "rounded-[8px] border px-[12px] py-[4px] text-[12px] font-semibold " +
|
|
21
|
+
(selected
|
|
22
|
+
? "border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-surface-inverse)] text-[var(--adaptive-text-inverse)]"
|
|
23
|
+
: needsAttention
|
|
24
|
+
? "border-rose-400 text-[var(--adaptive-text-primary)]"
|
|
25
|
+
: "border-[var(--adaptive-border-subtle)] text-[var(--adaptive-text-muted)]"), children: messages.composer.categoryOption[category] }) }, category));
|
|
23
26
|
}) }));
|
|
24
27
|
}
|
|
25
28
|
//# sourceMappingURL=FeedbackCategorySelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackCategorySelector.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAyB,MAAM,iCAAiC,CAAC;AAW7F,MAAM,UAAU,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,EAAiC;IAC3I,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,cAAc,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO;QACX,CAAC;QAED,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,cACI,GAAG,EAAE,YAAY,EACjB,SAAS,
|
|
1
|
+
{"version":3,"file":"FeedbackCategorySelector.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAyB,MAAM,iCAAiC,CAAC;AAW7F,MAAM,UAAU,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,EAAiC;IAC3I,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,cAAc,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO;QACX,CAAC;QAED,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,cACI,GAAG,EAAE,YAAY,EACjB,SAAS;QACL,4JAA4J;QAC5J,sGAAsG;YACtG,CAAC,cAAc,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,EAAE,CAAC,EAE7F,IAAI,EAAC,OAAO,gBACA,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,kBACjC,cAAc,IAAI,SAAS,YAExC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,KAAK,KAAK,QAAQ,CAAC;YAEpC,OAAO,CACH,KAAC,YAAY,IAET,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAClD,SAAS,kBAET,iBACI,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAC7C,IAAI,EAAC,QAAQ,iCACe,EAAE,kBAChB,QAAQ,gBACV,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAC3G,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,SAAS,EACL,oEAAoE;wBACpE,CAAC,QAAQ;4BACL,CAAC,CAAC,iHAAiH;4BACnH,CAAC,CAAC,cAAc;gCACd,CAAC,CAAC,qDAAqD;gCACvD,CAAC,CAAC,0EAA0E,CAAC,YAGtF,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,GACtC,IArBJ,QAAQ,CAsBF,CAClB,CAAC;QACN,CAAC,CAAC,GACA,CACT,CAAC;AACN,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { ReportField, ReportFieldValues, ReportCase } from "../../../types/report.js";
|
|
2
2
|
import type { ReportAuthor } from "../../../types/report.js";
|
|
3
3
|
import type { FeedbackCategory } from "../../../constants/feedbackCategory.js";
|
|
4
|
+
import type { ElementMention } from "../../../types/mention.js";
|
|
5
|
+
export type ComposerMode = "deny" | "recheck" | "checkout" | "question";
|
|
4
6
|
type FeedbackComposerProps = {
|
|
5
7
|
message?: string;
|
|
6
8
|
onMessageChange?: (value: string) => void;
|
|
9
|
+
mentions?: ElementMention[];
|
|
10
|
+
onMentionsChange?: (mentions: ElementMention[]) => void;
|
|
11
|
+
enableElementMentions?: boolean;
|
|
7
12
|
cases?: ReportCase[];
|
|
8
13
|
onCaseChange?: (caseId: string, text: string) => void;
|
|
9
14
|
onAddCase?: () => void;
|
|
@@ -30,6 +35,8 @@ type FeedbackComposerProps = {
|
|
|
30
35
|
askQuestionChecked?: boolean;
|
|
31
36
|
onAskQuestionChange?: (checked: boolean) => void;
|
|
32
37
|
askQuestionForced?: boolean;
|
|
38
|
+
composerMode?: ComposerMode | null;
|
|
39
|
+
onCancelComposerMode?: () => void;
|
|
33
40
|
hideAuthorSelector?: boolean;
|
|
34
41
|
lockedAuthorName?: string;
|
|
35
42
|
onFooterWarningChange?: (message: string | null) => void;
|
|
@@ -37,7 +44,10 @@ type FeedbackComposerProps = {
|
|
|
37
44
|
hideActions?: boolean;
|
|
38
45
|
hidePrimarySubmitAction?: boolean;
|
|
39
46
|
categoryPrompt?: string;
|
|
47
|
+
showCaseTabBar?: boolean;
|
|
48
|
+
activeCaseId?: string | null;
|
|
49
|
+
onActiveCaseIdChange?: (caseId: string) => void;
|
|
40
50
|
};
|
|
41
|
-
export declare function FeedbackComposer({ message, onMessageChange, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category, onCategoryChange, showCategory, showTags: _showTags, onSubmit, isSubmitting, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, placeholder, autoFocus, errorMessage, showAskQuestionToggle, askQuestionChecked, onAskQuestionChange, askQuestionForced, hideAuthorSelector, lockedAuthorName, onFooterWarningChange, hideEditor, hideActions, hidePrimarySubmitAction, categoryPrompt, }: FeedbackComposerProps): import("react").JSX.Element;
|
|
51
|
+
export declare function FeedbackComposer({ message, onMessageChange, mentions, onMentionsChange, enableElementMentions, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category, onCategoryChange, showCategory, showTags: _showTags, onSubmit, isSubmitting, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, placeholder, autoFocus, errorMessage, showAskQuestionToggle, askQuestionChecked, onAskQuestionChange, askQuestionForced, composerMode, onCancelComposerMode, hideAuthorSelector, lockedAuthorName, onFooterWarningChange, hideEditor, hideActions, hidePrimarySubmitAction, categoryPrompt, showCaseTabBar, activeCaseId, onActiveCaseIdChange, }: FeedbackComposerProps): import("react").JSX.Element;
|
|
42
52
|
export {};
|
|
43
53
|
//# sourceMappingURL=FeedbackComposer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackComposer.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackComposer.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { useReportPreferences } from "../../../providers/reportContext.js";
|
|
4
|
-
import { SendIcon } from "../../../components/icons/Icons.js";
|
|
4
|
+
import { CloseIcon, AskActionIcon, DeniedActionIcon, CompleteActionIcon, SendIcon } from "../../../components/icons/Icons.js";
|
|
5
5
|
import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
|
|
6
6
|
import { FeedbackCategorySelector } from "./FeedbackCategorySelector.js";
|
|
7
7
|
import { FeedbackCaseEditor } from "./FeedbackCaseEditor.js";
|
|
8
|
+
import { MentionComposerInput } from "./MentionComposerInput.js";
|
|
9
|
+
import { resolveComposerModeActionKind, THREAD_ACTION_STYLE } from "../../../constants/threadActionStyles.js";
|
|
10
|
+
const REPLY_TEXTAREA_MIN_HEIGHT = 32;
|
|
11
|
+
const REPLY_TEXTAREA_MAX_HEIGHT = 200;
|
|
12
|
+
const REPLY_LINE_HEIGHT_PX = 21;
|
|
13
|
+
const COMPOSER_MODE_TAG_INLINE_RESERVE_PX = 96;
|
|
14
|
+
const REPLY_MEASURE_ROOT_ATTR = "data-reply-measure-root";
|
|
8
15
|
function isCaseTextErrorMessage(errorMessage, caseCount, caseTextRequired, casesRequired) {
|
|
9
16
|
if (!errorMessage) {
|
|
10
17
|
return false;
|
|
@@ -19,20 +26,121 @@ function isCaseTextErrorMessage(errorMessage, caseCount, caseTextRequired, cases
|
|
|
19
26
|
}
|
|
20
27
|
return false;
|
|
21
28
|
}
|
|
22
|
-
|
|
29
|
+
function getComposerModeLabel(mode, messages) {
|
|
30
|
+
const kind = resolveComposerModeActionKind(mode);
|
|
31
|
+
if (kind === "ask") {
|
|
32
|
+
return messages.composer.modeTag.ask;
|
|
33
|
+
}
|
|
34
|
+
if (kind === "denied") {
|
|
35
|
+
return messages.composer.modeTag.denied;
|
|
36
|
+
}
|
|
37
|
+
return messages.composer.modeTag.complete;
|
|
38
|
+
}
|
|
39
|
+
function ComposerModeIcon({ mode, className }) {
|
|
40
|
+
const kind = resolveComposerModeActionKind(mode);
|
|
41
|
+
const color = THREAD_ACTION_STYLE[kind].color;
|
|
42
|
+
if (kind === "ask") {
|
|
43
|
+
return (_jsx(AskActionIcon, { className: className, fill: color }));
|
|
44
|
+
}
|
|
45
|
+
if (kind === "denied") {
|
|
46
|
+
return (_jsx(DeniedActionIcon, { className: className, fill: color }));
|
|
47
|
+
}
|
|
48
|
+
return (_jsx(CompleteActionIcon, { className: className, fill: color }));
|
|
49
|
+
}
|
|
50
|
+
function ComposerModeTag({ mode, messages, onDismiss }) {
|
|
51
|
+
const kind = resolveComposerModeActionKind(mode);
|
|
52
|
+
const style = THREAD_ACTION_STYLE[kind];
|
|
53
|
+
return (_jsxs("span", { className: `inline-flex h-[22px] shrink-0 items-center gap-[4px] rounded-full px-[8px] text-[12px] font-semibold ${style.tagBg} ${style.tagText}`, style: { color: style.color }, children: [_jsx(ComposerModeIcon, { mode: mode, className: "h-[12px] w-[12px]" }), _jsx("span", { style: { color: style.color }, children: getComposerModeLabel(mode, messages) }), onDismiss ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: onDismiss, "aria-label": messages.composer.modeTagDismissAriaLabel, className: `ml-[2px] inline-flex h-[14px] w-[14px] items-center justify-center rounded-full ${style.tagDismissHoverBg}`, style: { color: style.color }, children: _jsx(CloseIcon, { className: "h-[10px] w-[10px]" }) })) : null] }));
|
|
54
|
+
}
|
|
55
|
+
function ReplyTextarea({ value, onChange, placeholder, autoFocus, onSubmitShortcut, onMultilineChange, reserveInlineStart = 0, }) {
|
|
56
|
+
const textareaRef = useRef(null);
|
|
57
|
+
const measureFrameRef = useRef(null);
|
|
58
|
+
const lastMultilineRef = useRef(null);
|
|
59
|
+
const syncHeight = useCallback(() => {
|
|
60
|
+
const textarea = textareaRef.current;
|
|
61
|
+
if (!textarea) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const measureRoot = textarea.closest(`[${REPLY_MEASURE_ROOT_ATTR}]`);
|
|
65
|
+
const rootWidth = measureRoot instanceof HTMLElement ? measureRoot.clientWidth : (textarea.parentElement?.clientWidth ?? textarea.clientWidth);
|
|
66
|
+
const measureWidth = reserveInlineStart > 0 ? Math.max(80, rootWidth - reserveInlineStart) : rootWidth;
|
|
67
|
+
const previousWidth = textarea.style.width;
|
|
68
|
+
const previousFlex = textarea.style.flex;
|
|
69
|
+
const previousMinWidth = textarea.style.minWidth;
|
|
70
|
+
// Isolate measurement from flex siblings (mode tag) so wrap detection stays stable across layouts.
|
|
71
|
+
textarea.style.flex = "none";
|
|
72
|
+
textarea.style.minWidth = "0";
|
|
73
|
+
textarea.style.width = `${measureWidth}px`;
|
|
74
|
+
textarea.style.height = "auto";
|
|
75
|
+
const measureScrollHeight = textarea.scrollHeight;
|
|
76
|
+
const styles = window.getComputedStyle(textarea);
|
|
77
|
+
const paddingY = (Number.parseFloat(styles.paddingTop) || 0) + (Number.parseFloat(styles.paddingBottom) || 0);
|
|
78
|
+
const lineHeight = Number.parseFloat(styles.lineHeight) || REPLY_LINE_HEIGHT_PX;
|
|
79
|
+
const singleLineHeight = lineHeight + paddingY;
|
|
80
|
+
const isMultiline = value.includes("\n") || measureScrollHeight > singleLineHeight + 1;
|
|
81
|
+
textarea.style.flex = previousFlex;
|
|
82
|
+
textarea.style.minWidth = previousMinWidth;
|
|
83
|
+
textarea.style.width = previousWidth;
|
|
84
|
+
textarea.style.height = "auto";
|
|
85
|
+
const displayScrollHeight = textarea.scrollHeight;
|
|
86
|
+
const nextHeight = Math.min(Math.max(REPLY_TEXTAREA_MIN_HEIGHT, displayScrollHeight), REPLY_TEXTAREA_MAX_HEIGHT);
|
|
87
|
+
textarea.style.height = `${nextHeight}px`;
|
|
88
|
+
textarea.style.overflowY = displayScrollHeight > REPLY_TEXTAREA_MAX_HEIGHT ? "auto" : "hidden";
|
|
89
|
+
if (lastMultilineRef.current === isMultiline) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
lastMultilineRef.current = isMultiline;
|
|
93
|
+
onMultilineChange?.(isMultiline);
|
|
94
|
+
}, [onMultilineChange, reserveInlineStart, value]);
|
|
95
|
+
useLayoutEffect(() => {
|
|
96
|
+
lastMultilineRef.current = null;
|
|
97
|
+
}, [reserveInlineStart]);
|
|
98
|
+
useLayoutEffect(() => {
|
|
99
|
+
syncHeight();
|
|
100
|
+
}, [syncHeight]);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const handleResize = () => {
|
|
103
|
+
if (measureFrameRef.current !== null) {
|
|
104
|
+
window.cancelAnimationFrame(measureFrameRef.current);
|
|
105
|
+
}
|
|
106
|
+
measureFrameRef.current = window.requestAnimationFrame(() => {
|
|
107
|
+
syncHeight();
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
window.addEventListener("resize", handleResize);
|
|
111
|
+
return () => {
|
|
112
|
+
window.removeEventListener("resize", handleResize);
|
|
113
|
+
if (measureFrameRef.current !== null) {
|
|
114
|
+
window.cancelAnimationFrame(measureFrameRef.current);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}, [syncHeight]);
|
|
118
|
+
return (_jsx("textarea", { ref: textareaRef, autoFocus: autoFocus, value: value, onChange: (event) => onChange(event.target.value), placeholder: placeholder, rows: 1, className: "max-h-[200px] w-full min-w-0 flex-1 resize-none overflow-hidden bg-transparent px-[4px] py-[6px] text-[14px] leading-[1.5] text-[var(--adaptive-text-primary)] outline-none placeholder:text-[var(--adaptive-text-muted)]", style: { minHeight: REPLY_TEXTAREA_MIN_HEIGHT }, onKeyDown: (event) => {
|
|
119
|
+
if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
onSubmitShortcut();
|
|
122
|
+
}
|
|
123
|
+
} }));
|
|
124
|
+
}
|
|
125
|
+
export function FeedbackComposer({ message = "", onMessageChange, mentions = [], onMentionsChange, enableElementMentions = false, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category = null, onCategoryChange, showCategory = false, showTags: _showTags = false, onSubmit, isSubmitting = false, showGitHubIssueOnCreate = false, onGitHubIssueSubmit, isGitHubIssueSubmitting = false, placeholder, autoFocus = false, errorMessage = "", showAskQuestionToggle = false, askQuestionChecked = false, onAskQuestionChange, askQuestionForced = false, composerMode = null, onCancelComposerMode, hideAuthorSelector = false, lockedAuthorName, onFooterWarningChange, hideEditor = false, hideActions = false, hidePrimarySubmitAction = false, categoryPrompt, showCaseTabBar = true, activeCaseId, onActiveCaseIdChange, }) {
|
|
23
126
|
const { messages } = useReportPreferences();
|
|
24
127
|
const [isGitHubIssueConfirming, setIsGitHubIssueConfirming] = useState(false);
|
|
25
128
|
const [categoryAttentionKey, setCategoryAttentionKey] = useState(0);
|
|
26
129
|
const [caseAttentionKey, setCaseAttentionKey] = useState(0);
|
|
27
|
-
const
|
|
130
|
+
const [isReplyMultiline, setIsReplyMultiline] = useState(false);
|
|
131
|
+
const resolvedComposerMode = composerMode ?? (askQuestionForced ? "question" : null);
|
|
132
|
+
const isQuestionMode = askQuestionForced || askQuestionChecked || resolvedComposerMode === "question";
|
|
28
133
|
const usesCaseEditor = Boolean(cases && onCaseChange && onAddCase && onRemoveCase);
|
|
29
|
-
const
|
|
134
|
+
const showInlineComposerModeTag = Boolean(resolvedComposerMode && !isReplyMultiline);
|
|
135
|
+
const showFooterComposerModeTag = Boolean(resolvedComposerMode && isReplyMultiline);
|
|
136
|
+
const showActionRow = !hideActions && (showAskQuestionToggle || showGitHubIssueOnCreate || !hidePrimarySubmitAction || showFooterComposerModeTag);
|
|
30
137
|
const resolvedPlaceholder = isQuestionMode ? messages.composer.questionPlaceholder : (placeholder ?? (usesCaseEditor ? messages.fieldEditor.messagePlaceholder : messages.composer.placeholder));
|
|
31
138
|
const emptyCaseIds = useMemo(() => (cases ?? []).filter((item) => !item.text.trim()).map((item) => item.id), [cases]);
|
|
32
139
|
const hasEmptyCase = emptyCaseIds.length > 0;
|
|
33
140
|
const isCategoryRequiredError = errorMessage === messages.errors.categoryRequired;
|
|
34
141
|
const isEmptyCaseError = isCaseTextErrorMessage(errorMessage, cases?.length ?? 0, messages.errors.caseTextRequired, messages.errors.casesRequired);
|
|
35
|
-
const
|
|
142
|
+
const canSelectCategory = Boolean(onCategoryChange);
|
|
143
|
+
const categoryNeedsAttention = canSelectCategory && !category && !hasEmptyCase && (categoryAttentionKey > 0 || isCategoryRequiredError);
|
|
36
144
|
const caseNeedsAttention = usesCaseEditor && hasEmptyCase && (caseAttentionKey > 0 || isEmptyCaseError);
|
|
37
145
|
const footerWarning = caseNeedsAttention ? messages.errors.emptyCaseMessageRequired : categoryNeedsAttention ? messages.errors.categoryRequired : null;
|
|
38
146
|
const isFooterHandledError = isCategoryRequiredError || isEmptyCaseError;
|
|
@@ -54,11 +162,11 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
|
|
|
54
162
|
setCaseAttentionKey((current) => current + 1);
|
|
55
163
|
}, [isEmptyCaseError, usesCaseEditor, hasEmptyCase, errorMessage]);
|
|
56
164
|
useEffect(() => {
|
|
57
|
-
if (!isCategoryRequiredError || !
|
|
165
|
+
if (!isCategoryRequiredError || !canSelectCategory || category || hasEmptyCase) {
|
|
58
166
|
return;
|
|
59
167
|
}
|
|
60
168
|
setCategoryAttentionKey((current) => current + 1);
|
|
61
|
-
}, [isCategoryRequiredError,
|
|
169
|
+
}, [isCategoryRequiredError, canSelectCategory, category, hasEmptyCase, errorMessage]);
|
|
62
170
|
useEffect(() => {
|
|
63
171
|
if (!hasEmptyCase && caseAttentionKey > 0) {
|
|
64
172
|
setCaseAttentionKey(0);
|
|
@@ -69,12 +177,20 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
|
|
|
69
177
|
setCategoryAttentionKey(0);
|
|
70
178
|
}
|
|
71
179
|
}, [category, categoryAttentionKey]);
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
if (!resolvedComposerMode) {
|
|
182
|
+
setIsReplyMultiline(false);
|
|
183
|
+
}
|
|
184
|
+
}, [resolvedComposerMode]);
|
|
185
|
+
const handleReplyMultilineChange = useCallback((next) => {
|
|
186
|
+
setIsReplyMultiline((current) => (current === next ? current : next));
|
|
187
|
+
}, []);
|
|
72
188
|
const bumpValidationAttention = () => {
|
|
73
189
|
if (usesCaseEditor && hasEmptyCase) {
|
|
74
190
|
setCaseAttentionKey((current) => current + 1);
|
|
75
191
|
return;
|
|
76
192
|
}
|
|
77
|
-
if (
|
|
193
|
+
if (canSelectCategory && !category) {
|
|
78
194
|
setCategoryAttentionKey((current) => current + 1);
|
|
79
195
|
}
|
|
80
196
|
};
|
|
@@ -97,15 +213,13 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
|
|
|
97
213
|
setIsGitHubIssueConfirming(false);
|
|
98
214
|
onGitHubIssueSubmit();
|
|
99
215
|
};
|
|
100
|
-
return (_jsxs("div", { className: `flex w-full flex-col
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
? messages.feedbackList.gitIssueConfirmLabel
|
|
109
|
-
: messages.composer.gitIssueSendLabel] }) })) : null, !hidePrimarySubmitAction ? (_jsx(HoverTooltip, { label: messages.composer.sendAriaLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[#f6562f] text-white disabled:opacity-50", "aria-label": messages.composer.sendAriaLabel, children: _jsx(SendIcon, { className: "h-[16px] w-[16px]" }) }) })) : null] }) })) : null, showCategory && categoryPrompt ? (_jsx("div", { className: "border-t border-[var(--adaptive-tintOpacity100)] px-[12px] py-[14px] text-[14px] font-semibold leading-[1.5] text-[var(--adaptive-text-primary)]", children: categoryPrompt })) : null, showCategory && onCategoryChange ? (_jsx(FeedbackCategorySelector, { value: category, onChange: onCategoryChange, messages: messages, needsAttention: categoryNeedsAttention, attentionKey: categoryAttentionKey })) : null] }));
|
|
216
|
+
return (_jsxs("div", { className: `flex w-full flex-col bg-[var(--adaptive-neutralTintOpacity50)] backdrop-blur-sm ${usesCaseEditor && !hideEditor ? "min-h-0 flex-1" : ""}`, children: [!hideEditor ? (_jsxs("div", { className: `relative ${usesCaseEditor ? "min-h-0 flex-1" : ""}`, children: [errorMessage && !isFooterHandledError ? (_jsx("p", { role: "alert", className: "absolute bottom-full left-[8px] right-[8px] z-10 mb-[6px] rounded-[8px] border border-rose-200 bg-rose-50 px-[8px] py-[4px] text-[12px] leading-[1.4] text-rose-700 shadow-[0_2px_8px_rgba(0,0,0,0.08)]", children: errorMessage })) : null, usesCaseEditor ? (_jsx(FeedbackCaseEditor, { cases: cases, onCaseChange: onCaseChange, onAddCase: onAddCase, onRemoveCase: onRemoveCase, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, needsAttention: caseNeedsAttention, attentionKey: caseAttentionKey, emptyCaseIds: emptyCaseIds, showTabBar: showCaseTabBar, activeCaseId: activeCaseId, onActiveCaseIdChange: onActiveCaseIdChange })) : enableElementMentions ? (_jsx("div", { "data-reply-measure-root": "", className: "px-[8px] pt-[8px]", children: _jsxs("div", { className: showInlineComposerModeTag ? "flex items-start gap-[6px]" : undefined, children: [showInlineComposerModeTag && resolvedComposerMode ? (_jsx("div", { className: "flex h-[32px] shrink-0 items-center", children: _jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode }) })) : null, _jsx(MentionComposerInput, { value: message, mentions: mentions, onChange: ({ message: nextMessage, mentions: nextMentions }) => {
|
|
217
|
+
onMessageChange?.(nextMessage);
|
|
218
|
+
onMentionsChange?.(nextMentions);
|
|
219
|
+
}, placeholder: resolvedPlaceholder, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, onMultilineChange: handleReplyMultilineChange, reserveInlineStart: resolvedComposerMode ? COMPOSER_MODE_TAG_INLINE_RESERVE_PX : 0 })] }) })) : (_jsx("div", { "data-reply-measure-root": "", className: "px-[8px] pt-[8px]", children: _jsxs("div", { className: showInlineComposerModeTag ? "flex items-start gap-[6px]" : undefined, children: [showInlineComposerModeTag && resolvedComposerMode ? (_jsx("div", { className: "flex h-[32px] shrink-0 items-center", children: _jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode }) })) : null, _jsx(ReplyTextarea, { value: message, onChange: (value) => onMessageChange?.(value), placeholder: resolvedPlaceholder, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, onMultilineChange: handleReplyMultilineChange, reserveInlineStart: resolvedComposerMode ? COMPOSER_MODE_TAG_INLINE_RESERVE_PX : 0 })] }) }))] })) : null, showActionRow ? (_jsxs("div", { className: `flex items-center gap-[8px] px-[8px] pb-[8px] ${showFooterComposerModeTag || !(hideAuthorSelector && !lockedAuthorName) ? "justify-between" : "justify-end"}`, children: [showFooterComposerModeTag && resolvedComposerMode ? (_jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode })) : (_jsx("div", { className: "min-w-0 flex-1" })), _jsxs("div", { className: "flex shrink-0 items-center gap-[6px]", children: [showAskQuestionToggle ? (_jsxs("label", { className: "inline-flex items-center gap-[4px] px-[2px] text-[12px] text-[var(--adaptive-black600)]", children: [_jsx("input", { type: "checkbox", "data-fivepixels-interactive": "", checked: isQuestionMode, disabled: askQuestionForced || isActionDisabled, onChange: (event) => onAskQuestionChange?.(event.target.checked), className: "h-[14px] w-[14px] accent-[var(--adaptive-blue500)]" }), _jsx("span", { children: messages.composer.askQuestionLabel })] })) : null, showGitHubIssueOnCreate ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleGitHubIssueSubmit, className: "inline-flex h-[24px] items-center justify-center gap-[4px] rounded-full border border-[var(--adaptive-border-subtle)] px-[12px] py-[4px] disabled:opacity-50", "aria-label": isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmAriaLabel : messages.composer.gitIssueSendAriaLabel, title: isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmTitle : messages.composer.gitIssueSendTitle, children: _jsxs("span", { className: "text-[12px] font-semibold text-[var(--adaptive-black500)]", children: ["+", " ", isGitHubIssueSubmitting
|
|
220
|
+
? messages.composer.gitIssueSendingLabel
|
|
221
|
+
: isGitHubIssueConfirming
|
|
222
|
+
? messages.feedbackList.gitIssueConfirmLabel
|
|
223
|
+
: messages.composer.gitIssueSendLabel] }) })) : null, !hidePrimarySubmitAction ? (_jsx(HoverTooltip, { label: messages.composer.sendAriaLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[#f6562f] text-white disabled:opacity-50", "aria-label": messages.composer.sendAriaLabel, children: _jsx(SendIcon, { className: "h-[16px] w-[16px]" }) }) })) : null] })] })) : null, showCategory && categoryPrompt ? _jsx("div", { className: "px-[12px] py-[8px] text-[16px] font-bold leading-[1.5] text-[var(--adaptive-text-primary)]", children: categoryPrompt }) : null, showCategory && onCategoryChange ? (_jsx(FeedbackCategorySelector, { value: category, onChange: onCategoryChange, messages: messages, needsAttention: categoryNeedsAttention, attentionKey: categoryAttentionKey })) : null] }));
|
|
110
224
|
}
|
|
111
225
|
//# sourceMappingURL=FeedbackComposer.js.map
|