feat(message_bizppurio): 검수/운영 별도 계정 안내 + 사전 준비 UI 2단 카드화
비즈뿌리오는 검수/운영을 별도 계정으로 운영하도록 권장하나 본 플러그인은 계정을 1벌만 보관하므로, 관리자가 이를 인지하도록 검수 모드 카드에 안내를 상시 노출한다. 검수 모드 안내의 "(개발)" 표현도 제거했다. 또한 사전 준비 안내가 세로로 길어 보이는 문제를 개선해, 문자·카카오를 넓은 화면에서 2단 카드 + 채널 아이콘으로 정리했다(모바일 1단 유지).
This commit is contained in:
@@ -30,3 +30,5 @@
|
||||
- 알림톡 발송이 일시적인 오류(카카오 시스템 오류·처리 지연·타임아웃 등)로 실패한 경우 자동으로 다시 시도합니다.
|
||||
- 알림에 연결한 알림톡 템플릿이 카카오에서 삭제·차단되거나 승인이 취소되면, 알림 설정 화면의 해당 알림에 "사용 불가 — 재연결 필요" 표시가 나타납니다. 예전에는 연결이 끊긴 뒤에도 정상 연결처럼 보여 발송 실패 후에야 알 수 있었지만, 이제 화면에서 바로 확인하고 다시 연결할 수 있습니다. (카카오 조회가 일시적으로 안 되는 경우에는 잘못된 경고가 뜨지 않도록 표시를 보류합니다.)
|
||||
- 알림톡 연결 창에서 자격증명 오류 등으로 승인 템플릿 목록을 불러오지 못한 경우와, 승인된 템플릿이 실제로 없는 경우를 구분해 안내합니다. 불러오기에 실패하면 설정을 확인하라는 안내가, 실제로 없으면 템플릿을 먼저 등록·검수하라는 안내가 표시됩니다.
|
||||
- 검수 모드 설정에 검수와 운영은 별도의 비즈뿌리오 계정으로 운영하는 것을 권장한다는 안내를 함께 표시합니다.
|
||||
- 사용 전 준비 안내를 문자(SMS/LMS)와 카카오 알림톡 두 갈래로 나눠 넓은 화면에서 좌우 두 칸으로 보여주고, 각 항목에 채널 아이콘을 더해 한눈에 구분되도록 정리했습니다.
|
||||
|
||||
+30
@@ -79,6 +79,27 @@ describe('plugin_settings.json — 섹션', () => {
|
||||
expect(introIdx).toBeLessThan(smsIdx);
|
||||
});
|
||||
|
||||
it('채널별 준비 목록은 PC(lg 이상) 2단, 모바일 1단 그리드로 배치된다', () => {
|
||||
// 문자·카카오 블록을 감싼 컨테이너가 grid grid-cols-1 lg:grid-cols-2 여야 한다.
|
||||
// sms_label 을 담은 블록의 부모(구분선 아래 컨테이너)에서 grid 클래스를 확인.
|
||||
const notice = findById(root, 'preparation_notice');
|
||||
const raw = JSON.stringify(notice);
|
||||
// 세로 1단 고정(flex-col) 이 아니라 반응형 grid 여야 한다.
|
||||
expect(raw).toContain('grid-cols-1');
|
||||
expect(raw).toContain('lg:grid-cols-2');
|
||||
});
|
||||
|
||||
it('문자·카카오 준비 블록은 카드(배경+테두리)로 감싸고 채널 아이콘을 라벨에 붙인다', () => {
|
||||
const notice = findById(root, 'preparation_notice');
|
||||
const raw = JSON.stringify(notice);
|
||||
// 각 열이 카드로 감싸짐 (다크모드 쌍 포함 solid 배경)
|
||||
expect(raw).toContain('bg-blue-100');
|
||||
expect(raw).toContain('dark:bg-blue-900');
|
||||
// 채널별 아이콘 (문자=envelope, 카카오=comment-dots)
|
||||
expect(raw).toContain('"envelope"');
|
||||
expect(raw).toContain('"comment-dots"');
|
||||
});
|
||||
|
||||
it('검수 모드 카드에 is_test_mode Toggle 이 있다', () => {
|
||||
const card = findById(root, 'test_mode_card');
|
||||
expect(card).toBeTruthy();
|
||||
@@ -87,6 +108,15 @@ describe('plugin_settings.json — 섹션', () => {
|
||||
expect(raw).toContain('is_test_mode');
|
||||
});
|
||||
|
||||
it('검수 모드 카드에 검수/운영 계정 분리 권장 안내가 상시 노출된다', () => {
|
||||
// 검수 켜짐/꺼짐과 무관하게(if 조건 없이) 카드 안에 계정 분리 권장 문구가 있어야 한다.
|
||||
const card = findById(root, 'test_mode_card') as { if?: string } | null;
|
||||
expect(card).toBeTruthy();
|
||||
expect(card?.if).toBeUndefined(); // 카드 자체가 조건부가 아님 → 상시 노출
|
||||
const raw = JSON.stringify(card);
|
||||
expect(raw).toContain('settings.test_mode.account_notice');
|
||||
});
|
||||
|
||||
it('운영 모드(검수 off) 경고 박스가 조건부로 존재한다', () => {
|
||||
const warning = findById(root, 'live_mode_warning');
|
||||
expect(warning).toBeTruthy();
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
"save_failed": "Failed to save settings.",
|
||||
"test_mode": {
|
||||
"label": "Test Mode",
|
||||
"hint": "In test mode, messages are sent to the Bizppurio inspection (dev) domain. Turn it off to send through the production domain."
|
||||
"hint": "In test mode, messages are sent to the Bizppurio inspection domain. Turn it off to send through the production domain.",
|
||||
"account_notice": "We recommend using separate Bizppurio accounts for inspection and production."
|
||||
},
|
||||
"live_mode_warning_title": "Sending in production",
|
||||
"live_mode_warning_body": "Test mode is off, so real SMS and alimtalk messages are sent to actual customers and sending fees are charged. Keep test mode on while inspecting.",
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
"save_failed": "설정 저장에 실패했습니다.",
|
||||
"test_mode": {
|
||||
"label": "검수 모드",
|
||||
"hint": "검수 모드에서는 비즈뿌리오 검수(개발) 도메인으로 발송됩니다. 끄면 운영 도메인으로 실제 발송됩니다."
|
||||
"hint": "검수 모드에서는 비즈뿌리오 검수 도메인으로 발송됩니다. 끄면 운영 도메인으로 실제 발송됩니다.",
|
||||
"account_notice": "검수와 운영은 별도의 비즈뿌리오 계정으로 운영하는 것을 권장합니다."
|
||||
},
|
||||
"live_mode_warning_title": "운영 환경으로 발송됩니다",
|
||||
"live_mode_warning_body": "검수 모드가 꺼져 있어 실제 고객에게 문자·알림톡이 발송되고 발송 비용이 청구됩니다. 검수 단계에서는 검수 모드를 켜 두세요.",
|
||||
|
||||
+14
-8
@@ -182,25 +182,25 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"comment": "구분선 아래 — 문자·카카오 채널별 사전 준비 목록",
|
||||
"comment": "구분선 아래 — 문자·카카오 채널별 사전 준비 목록 (PC lg 이상 2단, 모바일 1단)",
|
||||
"type": "basic", "name": "Div",
|
||||
"props": { "className": "mt-3 pt-3 border-t border-blue-100 dark:border-blue-900 flex flex-col gap-4" },
|
||||
"props": { "className": "mt-3 pt-3 border-t border-blue-100 dark:border-blue-900 grid grid-cols-1 lg:grid-cols-2 gap-4" },
|
||||
"children": [
|
||||
{
|
||||
"comment": "문자(SMS/LMS) — 라벨 + 발신번호 등록 1줄",
|
||||
"comment": "문자(SMS/LMS) — 카드 + 아이콘 라벨 + 발신번호 등록 1줄",
|
||||
"type": "basic", "name": "Div",
|
||||
"props": { "className": "space-y-1" },
|
||||
"props": { "className": "space-y-2 rounded-lg bg-blue-100 dark:bg-blue-900 border border-blue-200 dark:border-blue-800 p-3" },
|
||||
"children": [
|
||||
{ "type": "basic", "name": "P", "props": { "className": "text-sm font-semibold text-blue-900 dark:text-blue-100" }, "text": "$t:sirsoft-message_bizppurio.settings.preparation.sms_label" },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex items-center gap-2 text-sm font-semibold text-blue-900 dark:text-blue-100" }, "children": [ { "type": "basic", "name": "Icon", "props": { "name": "envelope", "size": "sm", "className": "text-blue-500 dark:text-blue-400" } }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.sms_label" } ] },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex gap-2 ml-1 text-sm text-blue-800 dark:text-blue-200 leading-relaxed" }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-blue-400 dark:text-blue-500 flex-shrink-0" }, "text": "•" }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.sms_sender" } ] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"comment": "카카오 알림톡 — 라벨 + 채널/템플릿/API키 3줄",
|
||||
"comment": "카카오 알림톡 — 카드 + 아이콘 라벨 + 채널/템플릿/API키 3줄",
|
||||
"type": "basic", "name": "Div",
|
||||
"props": { "className": "space-y-1" },
|
||||
"props": { "className": "space-y-2 rounded-lg bg-blue-100 dark:bg-blue-900 border border-blue-200 dark:border-blue-800 p-3" },
|
||||
"children": [
|
||||
{ "type": "basic", "name": "P", "props": { "className": "text-sm font-semibold text-blue-900 dark:text-blue-100" }, "text": "$t:sirsoft-message_bizppurio.settings.preparation.kakao_label" },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex items-center gap-2 text-sm font-semibold text-blue-900 dark:text-blue-100" }, "children": [ { "type": "basic", "name": "Icon", "props": { "name": "comment-dots", "size": "sm", "className": "text-blue-500 dark:text-blue-400" } }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.kakao_label" } ] },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex gap-2 ml-1 text-sm text-blue-800 dark:text-blue-200 leading-relaxed" }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-blue-400 dark:text-blue-500 flex-shrink-0" }, "text": "•" }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.kakao_channel" } ] },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex gap-2 ml-1 text-sm text-blue-800 dark:text-blue-200 leading-relaxed" }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-blue-400 dark:text-blue-500 flex-shrink-0" }, "text": "•" }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.kakao_template" } ] },
|
||||
{ "type": "basic", "name": "P", "props": { "className": "flex gap-2 ml-1 text-sm text-blue-800 dark:text-blue-200 leading-relaxed" }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-blue-400 dark:text-blue-500 flex-shrink-0" }, "text": "•" }, { "type": "basic", "name": "Span", "text": "$t:sirsoft-message_bizppurio.settings.preparation.kakao_apikey" } ] }
|
||||
@@ -304,6 +304,12 @@
|
||||
"name": "P",
|
||||
"props": { "className": "form-hint" },
|
||||
"text": "$t:sirsoft-message_bizppurio.settings.test_mode.hint"
|
||||
},
|
||||
{
|
||||
"type": "basic",
|
||||
"name": "P",
|
||||
"props": { "className": "form-hint" },
|
||||
"text": "$t:sirsoft-message_bizppurio.settings.test_mode.account_notice"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -41,6 +41,7 @@ effects:
|
||||
# 섹션 구조
|
||||
- info_panel_test_mode_api_sending_report_sections_present
|
||||
- test_mode_card_has_is_test_mode_toggle
|
||||
- test_mode_card_shows_separate_account_notice_always
|
||||
- live_mode_warning_shown_when_test_mode_off
|
||||
# 입력 필드
|
||||
- five_input_fields_bound_by_name
|
||||
|
||||
Reference in New Issue
Block a user