fix(capture): 캡쳐 후 발주일자 input 사라지는 버그 — 처리 순서 역순 fix
Deploy momo-erp / deploy (push) Successful in 1m57s
Deploy momo-erp / deploy (push) Successful in 1m57s
root cause: .js-no-export 인 input 의 cssText 캡쳐 시점에 이미 display:none 이 적용되어 있어, finally 의 cssText 원복이 display:none 을 다시 적용 → input 이 영구히 사라짐. 수정: - 진입 순서: input cssText 캡쳐 FIRST → 그 다음 .js-no-export display:none - 원복 순서: cssText FIRST → 그 다음 display 원복 (역순) - 이로써 cssText 의 'display:none' 잔류 방지 부수: admin/orders 의 '출고' 버튼은 출고완료(APPROVED) 발주에서 숨김 — 'editable && (출고)' → 'STATUS === REQUESTED && (출고)'.
This commit is contained in:
@@ -636,7 +636,7 @@ function StatementPreview({
|
||||
>
|
||||
<Download size={12} /> 엑셀 다운로드
|
||||
</a>
|
||||
{editable && (
|
||||
{order.STATUS === "REQUESTED" && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={shipNow}
|
||||
|
||||
@@ -18,13 +18,11 @@ interface CaptureShareOptions {
|
||||
}
|
||||
|
||||
export async function captureAndShare({ node, filename, shareTitle, shareText, forceWidth }: CaptureShareOptions): Promise<void> {
|
||||
// 거래처에 보낼 이미지에서 내부 정보(.js-no-export)는 잠시 숨긴다.
|
||||
const hideEls = node.querySelectorAll<HTMLElement>(".js-no-export");
|
||||
const prev: { el: HTMLElement; display: string }[] = [];
|
||||
hideEls.forEach((el) => { prev.push({ el, display: el.style.display }); el.style.display = "none"; });
|
||||
// ⚠️ 순서 중요: input 의 cssText 를 *먼저* 캡쳐 → 그 다음 .js-no-export hide.
|
||||
// 반대 순서면 .js-no-export 인 input 의 cssText 에 'display:none' 이 박혀
|
||||
// 원복 시 input 이 영구히 사라지는 버그가 생김.
|
||||
|
||||
// input/select/textarea 의 외형(테두리/배경/padding) 만 잠시 제거 — 값은 그대로 표시.
|
||||
// display:none 으로 숨기지 않음 (React 가 같은 DOM 재사용 시 사라진 채 남는 케이스 회피)
|
||||
// 1) input/select/textarea 의 외형(테두리/배경/padding) 만 잠시 제거 — 값은 그대로 표시.
|
||||
const fields = node.querySelectorAll<HTMLElement>("input, select, textarea");
|
||||
const fieldPrev: { el: HTMLElement; cssText: string }[] = [];
|
||||
fields.forEach((el) => {
|
||||
@@ -42,6 +40,11 @@ export async function captureAndShare({ node, filename, shareTitle, shareText, f
|
||||
}
|
||||
});
|
||||
|
||||
// 2) 거래처에 보낼 이미지에서 내부 정보(.js-no-export)는 잠시 숨긴다.
|
||||
const hideEls = node.querySelectorAll<HTMLElement>(".js-no-export");
|
||||
const prev: { el: HTMLElement; display: string }[] = [];
|
||||
hideEls.forEach((el) => { prev.push({ el, display: el.style.display }); el.style.display = "none"; });
|
||||
|
||||
// forceWidth: 캡처 직전 임시로 node 의 width 를 강제하여 가로 layout 으로 펼친다.
|
||||
// 모바일 화면(좁은 viewport)에서 좁게 줄어든 표/품명을 한 줄로 펼치기 위함.
|
||||
const widthPrev: {
|
||||
@@ -97,9 +100,10 @@ export async function captureAndShare({ node, filename, shareTitle, shareText, f
|
||||
});
|
||||
return;
|
||||
} finally {
|
||||
// 캡처 끝나면 (성공/실패 무관) 숨겼던 요소 복원
|
||||
prev.forEach((p) => { p.el.style.display = p.display; });
|
||||
// 캡처 끝나면 (성공/실패 무관) 숨겼던 요소 복원.
|
||||
// 순서 역순 — cssText 가 hideEls 의 display:none 덮어쓰지 않도록.
|
||||
fieldPrev.forEach((f) => { f.el.style.cssText = f.cssText; });
|
||||
prev.forEach((p) => { p.el.style.display = p.display; });
|
||||
if (widthPrev) {
|
||||
node.style.width = widthPrev.width;
|
||||
node.style.minWidth = widthPrev.minWidth;
|
||||
|
||||
Reference in New Issue
Block a user