fix(pop): 연결 역방향 라우팅 + 확정 후속 액션 + API URL 수정
- useConnectionResolver: _auto 모드에서 역방향(타겟→소스) 라우팅 추가 - pop-button: 입고 확정 성공 후 followUpActions 실행 (navigate/refresh/event) - pop-button: execute-action API URL 경로 수정 (/api/pop/ → /pop/)
This commit is contained in:
parent
e3ae8d273c
commit
f12fca46be
|
|
@ -11,7 +11,8 @@
|
||||||
*
|
*
|
||||||
* _auto 모드:
|
* _auto 모드:
|
||||||
* sourceOutput="_auto"인 연결은 소스/타겟의 connectionMeta를 비교하여
|
* sourceOutput="_auto"인 연결은 소스/타겟의 connectionMeta를 비교하여
|
||||||
* key가 같고 category="event"인 쌍을 모두 자동 라우팅한다.
|
* key가 같고 category="event"인 쌍을 양방향으로 자동 라우팅한다.
|
||||||
|
* (정방향: 소스->타겟, 역방향: 타겟->소스)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
|
|
@ -85,9 +86,9 @@ export function useConnectionResolver({
|
||||||
|
|
||||||
if (!sourceType || !targetType) continue;
|
if (!sourceType || !targetType) continue;
|
||||||
|
|
||||||
const pairs = getAutoMatchPairs(sourceType, targetType);
|
// 정방향: 소스 sendable -> 타겟 receivable
|
||||||
|
const forwardPairs = getAutoMatchPairs(sourceType, targetType);
|
||||||
for (const pair of pairs) {
|
for (const pair of forwardPairs) {
|
||||||
const sourceEvent = `__comp_output__${conn.sourceComponent}__${pair.sourceKey}`;
|
const sourceEvent = `__comp_output__${conn.sourceComponent}__${pair.sourceKey}`;
|
||||||
const targetEvent = `__comp_input__${conn.targetComponent}__${pair.targetKey}`;
|
const targetEvent = `__comp_input__${conn.targetComponent}__${pair.targetKey}`;
|
||||||
|
|
||||||
|
|
@ -99,6 +100,21 @@ export function useConnectionResolver({
|
||||||
});
|
});
|
||||||
unsubscribers.push(unsub);
|
unsubscribers.push(unsub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 역방향: 타겟 sendable -> 소스 receivable
|
||||||
|
const reversePairs = getAutoMatchPairs(targetType, sourceType);
|
||||||
|
for (const pair of reversePairs) {
|
||||||
|
const sourceEvent = `__comp_output__${conn.targetComponent}__${pair.sourceKey}`;
|
||||||
|
const targetEvent = `__comp_input__${conn.sourceComponent}__${pair.targetKey}`;
|
||||||
|
|
||||||
|
const unsub = subscribe(sourceEvent, (payload: unknown) => {
|
||||||
|
publish(targetEvent, {
|
||||||
|
value: payload,
|
||||||
|
_connectionId: conn.id,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
unsubscribers.push(unsub);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const sourceEvent = `__comp_output__${conn.sourceComponent}__${conn.sourceOutput || conn.sourceField}`;
|
const sourceEvent = `__comp_output__${conn.sourceComponent}__${conn.sourceOutput || conn.sourceField}`;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -547,7 +547,7 @@ export function PopButtonComponent({
|
||||||
const cardListMapping = cardListData?.mapping ?? null;
|
const cardListMapping = cardListData?.mapping ?? null;
|
||||||
const fieldMapping = fieldData?.mapping ?? null;
|
const fieldMapping = fieldData?.mapping ?? null;
|
||||||
|
|
||||||
const result = await apiClient.post("/api/pop/execute-action", {
|
const result = await apiClient.post("/pop/execute-action", {
|
||||||
action: "inbound-confirm",
|
action: "inbound-confirm",
|
||||||
data: {
|
data: {
|
||||||
items: selectedItems,
|
items: selectedItems,
|
||||||
|
|
@ -567,6 +567,24 @@ export function PopButtonComponent({
|
||||||
success: true,
|
success: true,
|
||||||
count: selectedItems.length,
|
count: selectedItems.length,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 후속 액션 실행 (navigate, refresh 등)
|
||||||
|
const followUps = config?.followUpActions ?? [];
|
||||||
|
for (const fa of followUps) {
|
||||||
|
switch (fa.type) {
|
||||||
|
case "navigate":
|
||||||
|
if (fa.targetScreenId) {
|
||||||
|
publish("__pop_navigate__", { screenId: fa.targetScreenId, params: fa.params });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "refresh":
|
||||||
|
publish("__pop_refresh__");
|
||||||
|
break;
|
||||||
|
case "event":
|
||||||
|
if (fa.eventName) publish(fa.eventName, fa.eventPayload);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
toast.error(result.data?.message || "입고 확정에 실패했습니다.");
|
toast.error(result.data?.message || "입고 확정에 실패했습니다.");
|
||||||
}
|
}
|
||||||
|
|
@ -577,7 +595,7 @@ export function PopButtonComponent({
|
||||||
setConfirmProcessing(false);
|
setConfirmProcessing(false);
|
||||||
setShowInboundConfirm(false);
|
setShowInboundConfirm(false);
|
||||||
}
|
}
|
||||||
}, [componentId, subscribe, publish, config?.statusChangeRules, config?.inboundConfirm?.statusChangeRules]);
|
}, [componentId, subscribe, publish, config?.statusChangeRules, config?.inboundConfirm?.statusChangeRules, config?.followUpActions]);
|
||||||
|
|
||||||
// 클릭 핸들러
|
// 클릭 핸들러
|
||||||
const handleClick = useCallback(async () => {
|
const handleClick = useCallback(async () => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue