issue-sticker 0.2.1 → 0.3.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/CHANGELOG.md +28 -0
- package/README.md +6 -6
- package/dist/{createLucideIcon-B457EluY.js → createLucideIcon-CmSNiW63.js} +19 -17
- package/dist/{externalUserPayload-C2hxbvaU.js → externalUserPayload-hJjuUx6q.js} +154 -57
- package/dist/issue-sticker-headless-react.js +2 -2
- package/dist/issue-sticker-headless.js +15 -9
- package/dist/issue-sticker-react.js +594 -134
- package/dist/{tooltip-BkQcdrki.js → tooltip-DciWyUWs.js} +1 -1
- package/package.json +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
npm 패키지 `issue-sticker`의 변경 이력입니다. 설치·업그레이드에 영향을 주는 변경만 기록합니다.
|
|
4
4
|
|
|
5
|
+
## 0.3.0 - 2026-08-12
|
|
6
|
+
|
|
7
|
+
### 추가
|
|
8
|
+
|
|
9
|
+
- 이슈 생성 폼과 이슈 상세에서 프로젝트 커스텀 필드를 입력·조회할 수 있습니다. 커스텀 필드는 Jira 연동 여부와 무관하게 표시됩니다.
|
|
10
|
+
- `select`, `multi_select`, `boolean` 등 커스텀 필드 타입별 입력과 표시를 지원하고, 옵션형 필드는 태그 기반 UI로 다룹니다.
|
|
11
|
+
- Headless SDK의 익명 이슈 상세 조회 요청에 게스트 소유자 식별자를 함께 전송합니다.
|
|
12
|
+
|
|
13
|
+
### 개선
|
|
14
|
+
|
|
15
|
+
- Jira 계정 연결 안내를 이슈 폼과 대시보드 흐름 안에서 확인할 수 있게 정리했습니다.
|
|
16
|
+
- 이슈 폼 입력 중 호스트 페이지 단축키가 함께 실행되지 않도록 이벤트 처리를 보강했습니다.
|
|
17
|
+
- SDK 런타임 호스트를 최상위 레이어로 올려, 호스트 앱 UI에 이슈 생성 팝업이 가려지는 상황을 줄였습니다.
|
|
18
|
+
- 토스트 배경과 상태 아이콘 색상을 공용 토큰 기준으로 맞춰 알림 가독성을 개선했습니다.
|
|
19
|
+
|
|
20
|
+
### 수정
|
|
21
|
+
|
|
22
|
+
- 소유자 식별자가 없는 익명 이슈에서 편집·삭제 진입점이 노출되던 문제를 수정했습니다.
|
|
23
|
+
- Jira 연결 직후 필드가 조회 불가로 보이거나 연결 실패 안내가 누락되던 문제를 수정했습니다.
|
|
24
|
+
- Notion 필드 저장 실패와 외부 연동 피드백을 toast로 일관되게 표시합니다.
|
|
25
|
+
|
|
26
|
+
## 0.2.2 - 2026-08-06
|
|
27
|
+
|
|
28
|
+
### 수정
|
|
29
|
+
|
|
30
|
+
- SDK 위젯이 현재 페이지 URL과 정확히 일치하는 스티커만 렌더링하도록 수정했습니다. 같은 도메인이더라도 다른 path, query, hash에 등록된 스티커는 현재 페이지에 표시되지 않습니다.
|
|
31
|
+
- `/` 경로 페이지에서도 스티커 조회가 도메인 전체 매칭으로 넓어지지 않고 현재 페이지 URL 기준으로 동작합니다.
|
|
32
|
+
|
|
5
33
|
## 0.2.0 - 2026-08-05
|
|
6
34
|
|
|
7
35
|
### 주의가 필요한 변경
|
package/README.md
CHANGED
|
@@ -138,7 +138,7 @@ IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
|
138
138
|
| 속성 | 타입 | 필수 | 설명 |
|
|
139
139
|
| ----------------------- | ------------------------------------ | ---- | ------------------------------------------------------------------------------------------- |
|
|
140
140
|
| `apiKey` | `string` | Yes | [관리자 콘솔](https://app.issuesticker.com)에서 발급한 SDK API key |
|
|
141
|
-
| `user` | `SDKUser` | No | 연동하는 앱의 사용자 정보. 전달하면 작성자가 기록되고 자신이 만든 이슈를
|
|
141
|
+
| `user` | `SDKUser` | No | 연동하는 앱의 사용자 정보. 전달하면 작성자가 기록되고 자신이 만든 이슈를 조회·수정·삭제할 수 있습니다. 전달하지 않으면(익명) 이번 세션에서 만든 이슈라도 수정·삭제할 수 없습니다 |
|
|
142
142
|
| `onboarding` | `'off' \| 'onMount' \| 'onFABClick'` | No | 온보딩 가이드 트리거 (기본 `'onMount'`). `'off'`면 "가이드 다시 보기"도 숨깁니다 |
|
|
143
143
|
| `screenshotCompression` | `{ useWebWorker?: boolean }` | No | 스크린샷 압축을 Web Worker에서 수행할지 여부 |
|
|
144
144
|
| `enabled` | `boolean` | No | 위젯 활성화 여부 (기본 `true`). `useIssueSticker` 전용 옵션 |
|
|
@@ -181,11 +181,11 @@ IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
|
181
181
|
## 사용자 식별
|
|
182
182
|
|
|
183
183
|
|
|
184
|
-
| 모드 | 설정 | 이슈 조회 범위 |
|
|
185
|
-
| ----------- | ------------------- | ----------------------------------------------------- |
|
|
186
|
-
| 익명 | `user` 없이 초기화 | 조회 없음 (이번 세션에서 생성한 이슈만 화면에 표시됨) |
|
|
187
|
-
| 사용자 식별 | `user` 전달 | 해당 사용자가 생성한 이슈 |
|
|
188
|
-
| 멤버 | FAB의 "멤버 로그인" | 프로젝트의 모든 이슈 |
|
|
184
|
+
| 모드 | 설정 | 이슈 조회 범위 | 수정·삭제 |
|
|
185
|
+
| ----------- | ------------------- | ----------------------------------------------------- | ----------------------------------- |
|
|
186
|
+
| 익명 | `user` 없이 초기화 | 조회 없음 (이번 세션에서 생성한 이슈만 화면에 표시됨) | 불가 (자신이 만든 이슈도 불가) |
|
|
187
|
+
| 사용자 식별 | `user` 전달 | 해당 사용자가 생성한 이슈 | 자신이 만든 이슈만 가능 |
|
|
188
|
+
| 멤버 | FAB의 "멤버 로그인" | 프로젝트의 모든 이슈 | 프로젝트의 모든 이슈 가능 |
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
## 문제 해결
|
|
@@ -21612,6 +21612,23 @@ class Replayer {
|
|
|
21612
21612
|
this.config.logger.log(REPLAY_CONSOLE_PREFIX, ...args);
|
|
21613
21613
|
}
|
|
21614
21614
|
}
|
|
21615
|
+
const OVERLAY_LAYER_INDEX = {
|
|
21616
|
+
// 익스텐션·SDK 위젯의 shadow host. isolation:isolate 로 stacking context 를 만들기 때문에
|
|
21617
|
+
// 아래 레이어 값들은 호스트 내부 순서만 정한다. 호스트 페이지의 오버레이와 겨루는 것은
|
|
21618
|
+
// 이 값 하나뿐이라, 페이지가 쓸 수 있는 어떤 레이어보다 위여야 한다.
|
|
21619
|
+
runtimeHost: 2147483647,
|
|
21620
|
+
fab: 999999,
|
|
21621
|
+
tourMask: 1000006,
|
|
21622
|
+
tourPopover: 1000007
|
|
21623
|
+
};
|
|
21624
|
+
const OVERLAY_LAYER = {
|
|
21625
|
+
shell: "z-[1000000]",
|
|
21626
|
+
sdkLoginOverlay: "z-[1000003]",
|
|
21627
|
+
dialogOverlay: "z-[1000004]",
|
|
21628
|
+
dialogContent: "z-[1000005]",
|
|
21629
|
+
floating: "z-[1000008]",
|
|
21630
|
+
toast: "z-[1000010]"
|
|
21631
|
+
};
|
|
21615
21632
|
function r(e2) {
|
|
21616
21633
|
var t2, f2, n2 = "";
|
|
21617
21634
|
if ("string" == typeof e2 || "number" == typeof e2) n2 += e2;
|
|
@@ -27246,21 +27263,6 @@ function stopEscapePropagation(handler) {
|
|
|
27246
27263
|
event.stopPropagation();
|
|
27247
27264
|
};
|
|
27248
27265
|
}
|
|
27249
|
-
const OVERLAY_LAYER_INDEX = {
|
|
27250
|
-
sdkHost: 999999,
|
|
27251
|
-
fab: 999999,
|
|
27252
|
-
tourMask: 1000006,
|
|
27253
|
-
tourPopover: 1000007,
|
|
27254
|
-
sdkLoginHost: 2147483647
|
|
27255
|
-
};
|
|
27256
|
-
const OVERLAY_LAYER = {
|
|
27257
|
-
shell: "z-[1000000]",
|
|
27258
|
-
sdkLoginOverlay: "z-[1000003]",
|
|
27259
|
-
dialogOverlay: "z-[1000004]",
|
|
27260
|
-
dialogContent: "z-[1000005]",
|
|
27261
|
-
floating: "z-[1000008]",
|
|
27262
|
-
toast: "z-[1000010]"
|
|
27263
|
-
};
|
|
27264
27266
|
const PortalContainerContext = React.createContext(void 0);
|
|
27265
27267
|
function PortalContainerProvider({ container: container2, children }) {
|
|
27266
27268
|
return /* @__PURE__ */ jsx(PortalContainerContext.Provider, { value: container2, children });
|
|
@@ -27381,7 +27383,7 @@ export {
|
|
|
27381
27383
|
Anchor as A,
|
|
27382
27384
|
Content as C,
|
|
27383
27385
|
DismissableLayer as D,
|
|
27384
|
-
|
|
27386
|
+
OVERLAY_LAYER_INDEX as O,
|
|
27385
27387
|
Primitive as P,
|
|
27386
27388
|
Replayer as R,
|
|
27387
27389
|
Slot as S,
|
|
@@ -27389,7 +27391,7 @@ export {
|
|
|
27389
27391
|
cn as a,
|
|
27390
27392
|
usePortalContainer as b,
|
|
27391
27393
|
createLucideIcon as c,
|
|
27392
|
-
|
|
27394
|
+
OVERLAY_LAYER as d,
|
|
27393
27395
|
useControllableState as e,
|
|
27394
27396
|
useId as f,
|
|
27395
27397
|
composeEventHandlers as g,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { q as gzip_1, r as record, a as cn, P as Primitive, l as useCallbackRef$1, j as useComposedRefs, h as Presence, n as Portal$1, g as composeEventHandlers, i as createContextScope, o as createSlot, D as DismissableLayer, C as Content, t as createPopperScope, e as useControllableState, v as Root2$1, f as useId, A as Anchor, w as Arrow, b as usePortalContainer,
|
|
1
|
+
import { q as gzip_1, r as record, a as cn, P as Primitive, l as useCallbackRef$1, j as useComposedRefs, h as Presence, n as Portal$1, g as composeEventHandlers, i as createContextScope, o as createSlot, D as DismissableLayer, C as Content, t as createPopperScope, e as useControllableState, v as Root2$1, f as useId, A as Anchor, w as Arrow, b as usePortalContainer, d as OVERLAY_LAYER, s as stopEscapePropagation, k as useLayoutEffect2, V as VISUALLY_HIDDEN_STYLES, c as createLucideIcon, x as clsx, S as Slot$2, O as OVERLAY_LAYER_INDEX } from "./createLucideIcon-CmSNiW63.js";
|
|
2
2
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import React__default, { useState, createContext, useContext, useCallback, useRef, useLayoutEffect, useEffect, useMemo } from "react";
|
|
@@ -6084,6 +6084,25 @@ const ChevronRight = createLucideIcon("ChevronRight", [
|
|
|
6084
6084
|
* See the LICENSE file in the root directory of this source tree.
|
|
6085
6085
|
*/
|
|
6086
6086
|
const ChevronUp = createLucideIcon("ChevronUp", [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]]);
|
|
6087
|
+
/**
|
|
6088
|
+
* @license lucide-react v0.468.0 - ISC
|
|
6089
|
+
*
|
|
6090
|
+
* This source code is licensed under the ISC license.
|
|
6091
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6092
|
+
*/
|
|
6093
|
+
const MousePointerClick = createLucideIcon("MousePointerClick", [
|
|
6094
|
+
["path", { d: "M14 4.1 12 6", key: "ita8i4" }],
|
|
6095
|
+
["path", { d: "m5.1 8-2.9-.8", key: "1go3kf" }],
|
|
6096
|
+
["path", { d: "m6 12-1.9 2", key: "mnht97" }],
|
|
6097
|
+
["path", { d: "M7.2 2.2 8 5.1", key: "1cfko1" }],
|
|
6098
|
+
[
|
|
6099
|
+
"path",
|
|
6100
|
+
{
|
|
6101
|
+
d: "M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z",
|
|
6102
|
+
key: "s0h3yz"
|
|
6103
|
+
}
|
|
6104
|
+
]
|
|
6105
|
+
]);
|
|
6087
6106
|
/**
|
|
6088
6107
|
* @license lucide-react v0.468.0 - ISC
|
|
6089
6108
|
*
|
|
@@ -10768,14 +10787,17 @@ const POPOVER_FADE_MS = 180;
|
|
|
10768
10787
|
const DEFAULT_LABELS = {
|
|
10769
10788
|
badge: "가이드",
|
|
10770
10789
|
close: "가이드 닫기",
|
|
10771
|
-
skip: "
|
|
10790
|
+
skip: "건너뛰기",
|
|
10772
10791
|
skipConfirmTitle: "가이드를 건너뛸까요?",
|
|
10773
|
-
|
|
10792
|
+
// 표면마다 진입점이 다르다(admin=헤더 아이콘, extension=더보기 메뉴, sdk=FAB 메뉴).
|
|
10793
|
+
// 위치를 특정하면 어느 한쪽에서는 틀린 안내가 되므로 라벨만 가리킨다.
|
|
10794
|
+
skipConfirmBody: "'가이드 다시 보기'를 누르면 언제든 다시 열 수 있습니다.",
|
|
10774
10795
|
skipConfirmCancel: "계속 보기",
|
|
10775
|
-
skipConfirmConfirm: "
|
|
10796
|
+
skipConfirmConfirm: "건너뛰기",
|
|
10776
10797
|
previous: "이전",
|
|
10777
10798
|
next: "다음",
|
|
10778
|
-
done: "완료"
|
|
10799
|
+
done: "완료",
|
|
10800
|
+
clickHint: "강조된 곳을 클릭하세요"
|
|
10779
10801
|
};
|
|
10780
10802
|
const MASK_PADDING = 8;
|
|
10781
10803
|
const CUTOUT_RADIUS = 12;
|
|
@@ -10887,6 +10909,12 @@ function shouldRenderNextButton(step) {
|
|
|
10887
10909
|
if (step.advanceOn && !step.allowManualAdvance) return false;
|
|
10888
10910
|
return true;
|
|
10889
10911
|
}
|
|
10912
|
+
function isTargetInteractionStep(step) {
|
|
10913
|
+
var _a;
|
|
10914
|
+
const hasTarget = !!step.targetId || (((_a = step.targetIds) == null ? void 0 : _a.length) ?? 0) > 0;
|
|
10915
|
+
if (!hasTarget) return false;
|
|
10916
|
+
return !!step.advanceOnTargetClick || !!step.advanceOn;
|
|
10917
|
+
}
|
|
10890
10918
|
function OnboardingStyleTag() {
|
|
10891
10919
|
return /* @__PURE__ */ jsx("style", { children: `
|
|
10892
10920
|
.issue-sticker-onboarding-popover {
|
|
@@ -10897,11 +10925,16 @@ function OnboardingStyleTag() {
|
|
|
10897
10925
|
.issue-sticker-onboarding-popover {
|
|
10898
10926
|
transition-duration: 1ms !important;
|
|
10899
10927
|
}
|
|
10928
|
+
|
|
10929
|
+
.issue-sticker-onboarding-highlight {
|
|
10930
|
+
animation: none !important;
|
|
10931
|
+
}
|
|
10900
10932
|
}
|
|
10901
10933
|
` });
|
|
10902
10934
|
}
|
|
10903
10935
|
function OnboardingPopoverContent({
|
|
10904
10936
|
step,
|
|
10937
|
+
clickHint,
|
|
10905
10938
|
labels,
|
|
10906
10939
|
canGoPrevious,
|
|
10907
10940
|
isLast,
|
|
@@ -10967,6 +11000,10 @@ function OnboardingPopoverContent({
|
|
|
10967
11000
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
10968
11001
|
/* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold leading-5 text-text-primary", children: step.title }),
|
|
10969
11002
|
/* @__PURE__ */ jsx("p", { className: "mt-2 whitespace-pre-line text-sm leading-5 text-text-secondary", children: step.body }),
|
|
11003
|
+
clickHint ? /* @__PURE__ */ jsxs("p", { className: "mt-2 flex items-center gap-1.5 text-xs font-semibold leading-5 text-brand", children: [
|
|
11004
|
+
/* @__PURE__ */ jsx(MousePointerClick, { "aria-hidden": "true", className: "h-3.5 w-3.5 shrink-0" }),
|
|
11005
|
+
clickHint
|
|
11006
|
+
] }) : null,
|
|
10970
11007
|
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-between gap-2", children: [
|
|
10971
11008
|
/* @__PURE__ */ jsx(
|
|
10972
11009
|
"button",
|
|
@@ -11026,6 +11063,8 @@ function OnboardingOverlay({
|
|
|
11026
11063
|
const shouldCenterPopover = !cutoutRect && (step.position ?? "center") === "center";
|
|
11027
11064
|
const maskColor = "rgba(8, 13, 18, 0.62)";
|
|
11028
11065
|
const isPassthrough = !!step.advanceOn;
|
|
11066
|
+
const isTargetInteraction = isTargetInteractionStep(step);
|
|
11067
|
+
const clickHint = isTargetInteraction ? step.clickHint ?? labels.clickHint : null;
|
|
11029
11068
|
React.useEffect(() => {
|
|
11030
11069
|
setIsSkipConfirmOpen(false);
|
|
11031
11070
|
}, [step.id]);
|
|
@@ -11117,7 +11156,11 @@ function OnboardingOverlay({
|
|
|
11117
11156
|
"div",
|
|
11118
11157
|
{
|
|
11119
11158
|
"aria-hidden": "true",
|
|
11120
|
-
|
|
11159
|
+
"data-testid": "onboarding-cutout-outline",
|
|
11160
|
+
className: cn(
|
|
11161
|
+
"fixed",
|
|
11162
|
+
isTargetInteraction ? "issue-sticker-onboarding-highlight animate-pulse-ring border-2 border-brand" : "border border-white/90"
|
|
11163
|
+
),
|
|
11121
11164
|
style: {
|
|
11122
11165
|
left: cutoutRect.left,
|
|
11123
11166
|
top: cutoutRect.top,
|
|
@@ -11147,6 +11190,7 @@ function OnboardingOverlay({
|
|
|
11147
11190
|
OnboardingPopoverContent,
|
|
11148
11191
|
{
|
|
11149
11192
|
step,
|
|
11193
|
+
clickHint,
|
|
11150
11194
|
labels,
|
|
11151
11195
|
canGoPrevious,
|
|
11152
11196
|
isLast,
|
|
@@ -11381,7 +11425,7 @@ function OnboardingProvider({
|
|
|
11381
11425
|
writeOnboardingStorage(storageInput, "completed");
|
|
11382
11426
|
closeFlow();
|
|
11383
11427
|
}, [closeFlow, storageInput]);
|
|
11384
|
-
const
|
|
11428
|
+
const dismiss2 = React.useCallback(() => {
|
|
11385
11429
|
writeOnboardingStorage(storageInput, "dismissed");
|
|
11386
11430
|
closeFlow();
|
|
11387
11431
|
}, [closeFlow, storageInput]);
|
|
@@ -11467,7 +11511,7 @@ function OnboardingProvider({
|
|
|
11467
11511
|
target: activeTarget,
|
|
11468
11512
|
start,
|
|
11469
11513
|
advance: advanceFromTargetClick,
|
|
11470
|
-
dismiss,
|
|
11514
|
+
dismiss: dismiss2,
|
|
11471
11515
|
complete
|
|
11472
11516
|
});
|
|
11473
11517
|
}, [
|
|
@@ -11476,7 +11520,7 @@ function OnboardingProvider({
|
|
|
11476
11520
|
advanceFromTargetClick,
|
|
11477
11521
|
complete,
|
|
11478
11522
|
currentStepIndex,
|
|
11479
|
-
|
|
11523
|
+
dismiss2,
|
|
11480
11524
|
flowId,
|
|
11481
11525
|
isOpen,
|
|
11482
11526
|
start
|
|
@@ -11549,12 +11593,12 @@ function OnboardingProvider({
|
|
|
11549
11593
|
registerTarget,
|
|
11550
11594
|
start,
|
|
11551
11595
|
advance: advanceFromTargetClick,
|
|
11552
|
-
dismiss,
|
|
11596
|
+
dismiss: dismiss2,
|
|
11553
11597
|
complete,
|
|
11554
11598
|
isOpen,
|
|
11555
11599
|
currentStep: isOpen ? activeStep : null
|
|
11556
11600
|
}),
|
|
11557
|
-
[activeStep, advanceFromTargetClick, complete,
|
|
11601
|
+
[activeStep, advanceFromTargetClick, complete, dismiss2, isOpen, registerTarget, start]
|
|
11558
11602
|
);
|
|
11559
11603
|
return /* @__PURE__ */ jsxs(OnboardingContext.Provider, { value: contextValue, children: [
|
|
11560
11604
|
children,
|
|
@@ -11569,7 +11613,7 @@ function OnboardingProvider({
|
|
|
11569
11613
|
isPopoverVisible,
|
|
11570
11614
|
canGoPrevious: currentStepIndex > 0,
|
|
11571
11615
|
isLast: currentStepIndex >= steps.length - 1,
|
|
11572
|
-
onSkip:
|
|
11616
|
+
onSkip: dismiss2,
|
|
11573
11617
|
onNext: goNext,
|
|
11574
11618
|
onPrevious: goPrevious
|
|
11575
11619
|
}
|
|
@@ -11601,6 +11645,50 @@ function useOnboardingFlow() {
|
|
|
11601
11645
|
[context]
|
|
11602
11646
|
);
|
|
11603
11647
|
}
|
|
11648
|
+
let nextId = 0;
|
|
11649
|
+
let toasts = [];
|
|
11650
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
11651
|
+
function emit() {
|
|
11652
|
+
listeners.forEach((l2) => l2());
|
|
11653
|
+
}
|
|
11654
|
+
function addToast(message2, type, options) {
|
|
11655
|
+
const id = `toast-${++nextId}`;
|
|
11656
|
+
const t2 = {
|
|
11657
|
+
id,
|
|
11658
|
+
message: message2,
|
|
11659
|
+
type,
|
|
11660
|
+
action: options == null ? void 0 : options.action,
|
|
11661
|
+
duration: (options == null ? void 0 : options.duration) ?? 2e3,
|
|
11662
|
+
createdAt: Date.now()
|
|
11663
|
+
};
|
|
11664
|
+
toasts = [...toasts, t2];
|
|
11665
|
+
emit();
|
|
11666
|
+
return id;
|
|
11667
|
+
}
|
|
11668
|
+
function dismiss(id) {
|
|
11669
|
+
toasts = toasts.filter((t2) => t2.id !== id);
|
|
11670
|
+
emit();
|
|
11671
|
+
}
|
|
11672
|
+
function dismissAll() {
|
|
11673
|
+
toasts = [];
|
|
11674
|
+
emit();
|
|
11675
|
+
}
|
|
11676
|
+
function toast(message2, options) {
|
|
11677
|
+
return addToast(message2, "default", options);
|
|
11678
|
+
}
|
|
11679
|
+
toast.success = (message2, options) => addToast(message2, "success", options);
|
|
11680
|
+
toast.warning = (message2, options) => addToast(message2, "warning", options);
|
|
11681
|
+
toast.error = (message2, options) => addToast(message2, "error", options);
|
|
11682
|
+
toast.info = (message2, options) => addToast(message2, "info", options);
|
|
11683
|
+
toast.dismiss = dismiss;
|
|
11684
|
+
toast.dismissAll = dismissAll;
|
|
11685
|
+
function subscribe(listener) {
|
|
11686
|
+
listeners.add(listener);
|
|
11687
|
+
return () => listeners.delete(listener);
|
|
11688
|
+
}
|
|
11689
|
+
function getSnapshot() {
|
|
11690
|
+
return toasts;
|
|
11691
|
+
}
|
|
11604
11692
|
({
|
|
11605
11693
|
type: [NetworkLogType.XMLHTTPREQUEST, NetworkLogType.FETCH]
|
|
11606
11694
|
});
|
|
@@ -11695,6 +11783,11 @@ const devLogger = {
|
|
|
11695
11783
|
write("debug", scope, args);
|
|
11696
11784
|
}
|
|
11697
11785
|
};
|
|
11786
|
+
function buildGuestOwnerQuery(mode, externalUserId) {
|
|
11787
|
+
if (mode !== "public") return "";
|
|
11788
|
+
if (!externalUserId) return "";
|
|
11789
|
+
return `?external_user_id=${encodeURIComponent(externalUserId)}`;
|
|
11790
|
+
}
|
|
11698
11791
|
function extractDomain(url) {
|
|
11699
11792
|
try {
|
|
11700
11793
|
if (!url.includes("://")) {
|
|
@@ -12215,68 +12308,72 @@ function buildExternalUserPayload(user) {
|
|
|
12215
12308
|
};
|
|
12216
12309
|
}
|
|
12217
12310
|
export {
|
|
12218
|
-
|
|
12219
|
-
|
|
12220
|
-
|
|
12311
|
+
getPrimaryJiraMapping as $,
|
|
12312
|
+
getJiraMetadata as A,
|
|
12313
|
+
buildJiraIssueFields as B,
|
|
12221
12314
|
ConsoleCollector as C,
|
|
12222
|
-
|
|
12223
|
-
|
|
12224
|
-
|
|
12225
|
-
|
|
12226
|
-
|
|
12315
|
+
Button$1 as D,
|
|
12316
|
+
ChevronDown as E,
|
|
12317
|
+
Portal as F,
|
|
12318
|
+
Content2 as G,
|
|
12319
|
+
Check as H,
|
|
12227
12320
|
Input as I,
|
|
12228
|
-
|
|
12229
|
-
|
|
12321
|
+
DatePicker as J,
|
|
12322
|
+
getNotionPageMetadata as K,
|
|
12230
12323
|
Label as L,
|
|
12231
|
-
|
|
12324
|
+
buildNotionFieldViews as M,
|
|
12232
12325
|
NetworkCollector as N,
|
|
12233
|
-
|
|
12326
|
+
DirectUploadError as O,
|
|
12234
12327
|
Popover as P,
|
|
12235
|
-
|
|
12328
|
+
getRegisteredUploadId as Q,
|
|
12236
12329
|
Root2 as R,
|
|
12237
12330
|
ScreenRecordingController as S,
|
|
12238
12331
|
Trigger as T,
|
|
12239
|
-
|
|
12240
|
-
|
|
12241
|
-
|
|
12332
|
+
subscribe as U,
|
|
12333
|
+
getSnapshot as V,
|
|
12334
|
+
toast as W,
|
|
12242
12335
|
X,
|
|
12243
|
-
|
|
12244
|
-
|
|
12245
|
-
|
|
12336
|
+
getExposedJiraFields as Y,
|
|
12337
|
+
isJiraFieldExposed as Z,
|
|
12338
|
+
getIntegrationFailureMessage as _,
|
|
12246
12339
|
uploadSignedMediaWithApi as a,
|
|
12247
|
-
|
|
12248
|
-
|
|
12249
|
-
|
|
12250
|
-
|
|
12251
|
-
|
|
12252
|
-
|
|
12253
|
-
|
|
12254
|
-
|
|
12255
|
-
|
|
12256
|
-
|
|
12340
|
+
createCollection as a0,
|
|
12341
|
+
useDirection as a1,
|
|
12342
|
+
ReactRemoveScroll as a2,
|
|
12343
|
+
hideOthers as a3,
|
|
12344
|
+
useFocusGuards as a4,
|
|
12345
|
+
FocusScope as a5,
|
|
12346
|
+
getPrimaryNotionMapping as a6,
|
|
12347
|
+
buttonVariants as a7,
|
|
12348
|
+
findElementBySelector as a8,
|
|
12349
|
+
findElementByXPath as a9,
|
|
12350
|
+
useOnboardingFlow as aa,
|
|
12351
|
+
useOnboardingTarget as ab,
|
|
12352
|
+
ONBOARDING_POPOVER_DATA_ATTR as ac,
|
|
12353
|
+
OnboardingProvider as ad,
|
|
12257
12354
|
normalizeJiraFieldId as b,
|
|
12258
12355
|
captureWithModernScreenshot as c,
|
|
12259
12356
|
directUploadToSignedUrl as d,
|
|
12260
12357
|
buildJiraCreateFields as e,
|
|
12261
12358
|
buildNotionCreateFields as f,
|
|
12262
12359
|
getElementPosition as g,
|
|
12263
|
-
|
|
12264
|
-
|
|
12265
|
-
|
|
12266
|
-
|
|
12267
|
-
|
|
12268
|
-
|
|
12360
|
+
buildGuestOwnerQuery as h,
|
|
12361
|
+
devLogger as i,
|
|
12362
|
+
filterExcludeServiceRelatedLogs as j,
|
|
12363
|
+
filterExcludeServiceRelatedConsoleLogs as k,
|
|
12364
|
+
compactNetworkLogsForTransport as l,
|
|
12365
|
+
sanitizeString as m,
|
|
12269
12366
|
normalizeExposedJiraFields as n,
|
|
12270
|
-
|
|
12271
|
-
|
|
12272
|
-
|
|
12273
|
-
|
|
12367
|
+
buildExternalUserPayload as o,
|
|
12368
|
+
SessionReplayCaptureController as p,
|
|
12369
|
+
preloadModernScreenshot as q,
|
|
12370
|
+
Select$1 as r,
|
|
12274
12371
|
syncExternalIssueIntegrations as s,
|
|
12275
|
-
|
|
12372
|
+
SelectTrigger as t,
|
|
12276
12373
|
uploadScreenshotDataUrls as u,
|
|
12277
|
-
|
|
12278
|
-
|
|
12279
|
-
|
|
12280
|
-
|
|
12281
|
-
|
|
12374
|
+
SelectValue as v,
|
|
12375
|
+
SelectContent as w,
|
|
12376
|
+
SelectItem as x,
|
|
12377
|
+
PopoverTrigger as y,
|
|
12378
|
+
PopoverContent as z
|
|
12282
12379
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useRef, useState, useCallback, useEffect } from "react";
|
|
3
|
-
import { c as createLucideIcon, u as ungzip_1, a as cn, R as Replayer } from "./createLucideIcon-
|
|
4
|
-
import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from "./tooltip-
|
|
3
|
+
import { c as createLucideIcon, u as ungzip_1, a as cn, R as Replayer } from "./createLucideIcon-CmSNiW63.js";
|
|
4
|
+
import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from "./tooltip-DciWyUWs.js";
|
|
5
5
|
/**
|
|
6
6
|
* @license lucide-react v0.468.0 - ISC
|
|
7
7
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { u as uploadScreenshotDataUrls, a as uploadSignedMediaWithApi, d as directUploadToSignedUrl, n as normalizeExposedJiraFields, b as normalizeJiraFieldId, g as getElementPosition, c as captureWithModernScreenshot, e as buildJiraCreateFields, f as buildNotionCreateFields, s as syncExternalIssueIntegrations,
|
|
1
|
+
import { u as uploadScreenshotDataUrls, a as uploadSignedMediaWithApi, d as directUploadToSignedUrl, n as normalizeExposedJiraFields, b as normalizeJiraFieldId, g as getElementPosition, c as captureWithModernScreenshot, e as buildJiraCreateFields, f as buildNotionCreateFields, h as buildGuestOwnerQuery, s as syncExternalIssueIntegrations, i as devLogger, C as ConsoleCollector, N as NetworkCollector, j as filterExcludeServiceRelatedLogs, k as filterExcludeServiceRelatedConsoleLogs, l as compactNetworkLogsForTransport, m as sanitizeString, o as buildExternalUserPayload, S as ScreenRecordingController, p as SessionReplayCaptureController, q as preloadModernScreenshot } from "./externalUserPayload-hJjuUx6q.js";
|
|
2
2
|
import "react/jsx-runtime";
|
|
3
3
|
import "react";
|
|
4
|
-
import "./createLucideIcon-
|
|
4
|
+
import "./createLucideIcon-CmSNiW63.js";
|
|
5
5
|
class IssueStickerHeadlessError extends Error {
|
|
6
6
|
constructor(code, message, cause) {
|
|
7
7
|
super(message);
|
|
@@ -528,9 +528,8 @@ function upsertFilterGroup(groups, group) {
|
|
|
528
528
|
options: mergeOptions(existing.options, group.options)
|
|
529
529
|
});
|
|
530
530
|
}
|
|
531
|
-
function appendCustomFieldFilterGroups(groups,
|
|
531
|
+
function appendCustomFieldFilterGroups(groups, customFields) {
|
|
532
532
|
for (const field of customFields) {
|
|
533
|
-
if (!exposedFieldIds.has(normalizeJiraFieldId(field.field_key))) continue;
|
|
534
533
|
const options = getSelectableCustomFieldOptions(field);
|
|
535
534
|
if (!options.length) continue;
|
|
536
535
|
upsertFilterGroup(groups, {
|
|
@@ -580,12 +579,15 @@ function composeIssueFilterGroups(integrations, customFields) {
|
|
|
580
579
|
const config = getJiraConfig(integration);
|
|
581
580
|
return integration.is_active !== false && config;
|
|
582
581
|
});
|
|
582
|
+
appendCustomFieldFilterGroups(groups, customFields);
|
|
583
583
|
const jiraConfig = jiraIntegration ? getJiraConfig(jiraIntegration) : null;
|
|
584
584
|
const configExposedFields = getExposedFields(jiraConfig);
|
|
585
585
|
if (configExposedFields.length) {
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
586
|
+
appendJiraFieldFilterGroups(
|
|
587
|
+
groups,
|
|
588
|
+
new Set(configExposedFields),
|
|
589
|
+
getLastKnownJiraFields(jiraConfig)
|
|
590
|
+
);
|
|
589
591
|
}
|
|
590
592
|
for (const integration of integrations) {
|
|
591
593
|
if (integration.is_active === false) continue;
|
|
@@ -821,8 +823,12 @@ class HeadlessIssueRepository {
|
|
|
821
823
|
return this.options.transport.requestResponse(endpoint, options);
|
|
822
824
|
}
|
|
823
825
|
openIssue(issueId) {
|
|
826
|
+
const ownerQuery = buildGuestOwnerQuery(
|
|
827
|
+
this.options.getAuthMode(),
|
|
828
|
+
this.options.getDefaultExternalUserId()
|
|
829
|
+
);
|
|
824
830
|
return this.request(
|
|
825
|
-
`/api/sdk/issues/${encodeURIComponent(issueId)}`
|
|
831
|
+
`/api/sdk/issues/${encodeURIComponent(issueId)}${ownerQuery}`
|
|
826
832
|
);
|
|
827
833
|
}
|
|
828
834
|
createIssue(issueData) {
|
|
@@ -913,7 +919,7 @@ class HeadlessIssueRepository {
|
|
|
913
919
|
},
|
|
914
920
|
customFieldValues: customValues,
|
|
915
921
|
upsertCustomFieldValue: (fieldDefinitionId, value) => this.request(
|
|
916
|
-
`/api/custom-field-values/issues/${encodeURIComponent(createdIssue.id)}/values`,
|
|
922
|
+
`/api/sdk/custom-field-values/issues/${encodeURIComponent(createdIssue.id)}/values`,
|
|
917
923
|
{
|
|
918
924
|
method: "PUT",
|
|
919
925
|
body: {
|