@ncds/ui-admin 1.8.21-alpha.7 → 1.8.21-alpha.9
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/cjs/src/components/navigation/pagination/Pagination.js +3 -1
- package/dist/cjs/src/components/navigation/pagination/__tests__/Pagination.test.js +74 -0
- package/dist/cjs/src/components/overlays/postcode-search-modal/PostcodeSearchModal.js +66 -90
- package/dist/cjs/src/components/overlays/postcode-search-modal/PostcodeSearchModalTip.js +70 -0
- package/dist/cjs/src/components/overlays/postcode-search-modal/__tests__/PostcodeSearchModal.test.js +96 -39
- package/dist/cjs/src/generated/scoped-css.js +1 -1
- package/dist/esm/src/components/navigation/pagination/Pagination.js +3 -1
- package/dist/esm/src/components/navigation/pagination/__tests__/Pagination.test.js +74 -0
- package/dist/esm/src/components/overlays/postcode-search-modal/PostcodeSearchModal.js +66 -90
- package/dist/esm/src/components/overlays/postcode-search-modal/PostcodeSearchModalTip.js +63 -0
- package/dist/esm/src/components/overlays/postcode-search-modal/__tests__/PostcodeSearchModal.test.js +96 -39
- package/dist/esm/src/generated/scoped-css.js +1 -1
- package/dist/temp/src/components/navigation/pagination/Pagination.js +3 -1
- package/dist/temp/src/components/navigation/pagination/__tests__/Pagination.test.js +74 -0
- package/dist/temp/src/components/overlays/postcode-search-modal/PostcodeSearchModal.d.ts +3 -7
- package/dist/temp/src/components/overlays/postcode-search-modal/PostcodeSearchModal.js +34 -27
- package/dist/temp/src/components/overlays/postcode-search-modal/PostcodeSearchModalTip.d.ts +16 -0
- package/dist/temp/src/components/overlays/postcode-search-modal/PostcodeSearchModalTip.js +24 -0
- package/dist/temp/src/components/overlays/postcode-search-modal/__tests__/PostcodeSearchModal.test.js +82 -35
- package/dist/temp/src/generated/scoped-css.js +1 -1
- package/dist/types/src/components/overlays/postcode-search-modal/PostcodeSearchModal.d.ts +3 -7
- package/dist/types/src/components/overlays/postcode-search-modal/PostcodeSearchModalTip.d.ts +16 -0
- package/dist/ui-admin/assets/styles/style.css +43 -5
- package/dist/ui-admin/assets/styles/style.scoped.css +43 -5
- package/package.json +1 -1
|
@@ -26,7 +26,9 @@ const Pagination = _ref => {
|
|
|
26
26
|
const [start, setStart] = (0, _react.useState)(1);
|
|
27
27
|
const noPrev = breakPoint === 'mo' ? currentPage === 1 : start === 1;
|
|
28
28
|
const noNext = breakPoint === 'mo' ? currentPage >= totalPage : start + pageCount - 1 >= totalPage;
|
|
29
|
-
|
|
29
|
+
// mo 는 CSS 가 페이지 번호 목록과 first/last 를 숨겨 prev/next 만 남는다.
|
|
30
|
+
// pc 기준(totalPage > pageCount)을 그대로 쓰면 페이지가 적을 때 이동 수단이 하나도 없다.
|
|
31
|
+
const showJumpPageButton = breakPoint === 'mo' ? totalPage > 1 : totalPage > pageCount;
|
|
30
32
|
const handleClickButton = pageNum => {
|
|
31
33
|
if ((0, _lodashEs.isFunction)(onPageChange)) {
|
|
32
34
|
onPageChange(pageNum);
|
|
@@ -15,6 +15,12 @@ const CURRENT_PAGE = 91; // 100페이지 기준 마지막 그룹(91~100)을 보
|
|
|
15
15
|
const GROUP_START_100_PAGES = 91; // currentPage=91 일 때의 그룹 시작
|
|
16
16
|
const GROUP_START_50_PAGES = 41; // totalPage=50 으로 줄었을 때의 마지막 그룹 시작
|
|
17
17
|
const LAST_PAGE_50 = 50;
|
|
18
|
+
/** 페이지 그룹 크기(10) 이하로 나뉘는 건수 — 3페이지 */
|
|
19
|
+
const TOTAL_COUNT_3_PAGES = 30;
|
|
20
|
+
/** TOTAL_COUNT_3_PAGES 기준 총 페이지 수 = 마지막 페이지 번호 */
|
|
21
|
+
const LAST_PAGE_3 = 3;
|
|
22
|
+
/** 페이지가 하나뿐인 건수 */
|
|
23
|
+
const TOTAL_COUNT_1_PAGE = 8;
|
|
18
24
|
let root = null;
|
|
19
25
|
let container = null;
|
|
20
26
|
function render(props) {
|
|
@@ -37,6 +43,8 @@ function render(props) {
|
|
|
37
43
|
container = null;
|
|
38
44
|
});
|
|
39
45
|
const pageNums = el => Array.from(el.querySelectorAll('.ncua-pagination__page-num')).map(b => Number(b.textContent));
|
|
46
|
+
const prevOf = el => el.querySelector('.ncua-pagination__before');
|
|
47
|
+
const nextOf = el => el.querySelector('.ncua-pagination__next');
|
|
40
48
|
(0, _vitest.describe)('#332 Pagination — totalPage 축소 시 start 보정', () => {
|
|
41
49
|
(0, _vitest.it)('totalPage 가 줄면 start 를 마지막 그룹으로 보정하고 범위 밖 페이지 버튼을 표시하지 않는다', () => {
|
|
42
50
|
// 1) 100 페이지에서 91 페이지 보는 중 → 91~100 그룹 표시
|
|
@@ -59,4 +67,70 @@ const pageNums = el => Array.from(el.querySelectorAll('.ncua-pagination__page-nu
|
|
|
59
67
|
(0, _vitest.expect)(nums[0]).toBe(GROUP_START_50_PAGES);
|
|
60
68
|
(0, _vitest.expect)(Math.max(...nums)).toBeLessThanOrEqual(LAST_PAGE_50);
|
|
61
69
|
});
|
|
70
|
+
});
|
|
71
|
+
(0, _vitest.describe)('Pagination — mo 모드 이전/다음 버튼 노출', () => {
|
|
72
|
+
(0, _vitest.it)('페이지가 그룹 크기 이하여도 mo 에서는 이전·다음 버튼이 노출된다', () => {
|
|
73
|
+
// Given/When: 3페이지(그룹 크기 10 이하) 분량을 mo 로 렌더하면
|
|
74
|
+
const el = render({
|
|
75
|
+
totalCount: TOTAL_COUNT_3_PAGES,
|
|
76
|
+
itemCountPerPage: ITEM_COUNT_PER_PAGE,
|
|
77
|
+
pageCount: PAGE_GROUP_SIZE,
|
|
78
|
+
currentPage: 1,
|
|
79
|
+
breakPoint: 'mo'
|
|
80
|
+
});
|
|
81
|
+
// Then: mo 는 페이지 번호 목록이 CSS 로 숨겨지므로 이전·다음 버튼이 있어야 이동할 수 있다
|
|
82
|
+
(0, _vitest.expect)(prevOf(el)).not.toBeNull();
|
|
83
|
+
(0, _vitest.expect)(nextOf(el)).not.toBeNull();
|
|
84
|
+
});
|
|
85
|
+
(0, _vitest.it)('첫 페이지에서는 이전 버튼이, 마지막 페이지에서는 다음 버튼이 비활성이다', () => {
|
|
86
|
+
// Given/When: 3페이지 중 첫 페이지를 mo 로 렌더하면
|
|
87
|
+
const first = render({
|
|
88
|
+
totalCount: TOTAL_COUNT_3_PAGES,
|
|
89
|
+
itemCountPerPage: ITEM_COUNT_PER_PAGE,
|
|
90
|
+
pageCount: PAGE_GROUP_SIZE,
|
|
91
|
+
currentPage: 1,
|
|
92
|
+
breakPoint: 'mo'
|
|
93
|
+
});
|
|
94
|
+
// Then: 이전만 막히고 다음은 누를 수 있다
|
|
95
|
+
(0, _vitest.expect)(prevOf(first)?.disabled).toBe(true);
|
|
96
|
+
(0, _vitest.expect)(nextOf(first)?.disabled).toBe(false);
|
|
97
|
+
// When: 마지막 페이지로 이동하면
|
|
98
|
+
const last = render({
|
|
99
|
+
totalCount: TOTAL_COUNT_3_PAGES,
|
|
100
|
+
itemCountPerPage: ITEM_COUNT_PER_PAGE,
|
|
101
|
+
pageCount: PAGE_GROUP_SIZE,
|
|
102
|
+
currentPage: LAST_PAGE_3,
|
|
103
|
+
breakPoint: 'mo'
|
|
104
|
+
});
|
|
105
|
+
// Then: 반대로 다음이 막힌다
|
|
106
|
+
(0, _vitest.expect)(prevOf(last)?.disabled).toBe(false);
|
|
107
|
+
(0, _vitest.expect)(nextOf(last)?.disabled).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
(0, _vitest.it)('페이지가 하나뿐이면 mo 에서도 이전·다음 버튼을 내보내지 않는다', () => {
|
|
110
|
+
// Given/When: 1페이지 분량을 mo 로 렌더하면
|
|
111
|
+
const el = render({
|
|
112
|
+
totalCount: TOTAL_COUNT_1_PAGE,
|
|
113
|
+
itemCountPerPage: ITEM_COUNT_PER_PAGE,
|
|
114
|
+
pageCount: PAGE_GROUP_SIZE,
|
|
115
|
+
currentPage: 1,
|
|
116
|
+
breakPoint: 'mo'
|
|
117
|
+
});
|
|
118
|
+
// Then: 이동할 곳이 없으므로 버튼도 없다
|
|
119
|
+
(0, _vitest.expect)(prevOf(el)).toBeNull();
|
|
120
|
+
(0, _vitest.expect)(nextOf(el)).toBeNull();
|
|
121
|
+
});
|
|
122
|
+
(0, _vitest.it)('pc 는 기존대로 페이지 그룹을 넘길 때만 점프 버튼을 노출한다', () => {
|
|
123
|
+
// Given/When: 3페이지 분량을 pc 로 렌더하면
|
|
124
|
+
const el = render({
|
|
125
|
+
totalCount: TOTAL_COUNT_3_PAGES,
|
|
126
|
+
itemCountPerPage: ITEM_COUNT_PER_PAGE,
|
|
127
|
+
pageCount: PAGE_GROUP_SIZE,
|
|
128
|
+
currentPage: 1,
|
|
129
|
+
breakPoint: 'pc'
|
|
130
|
+
});
|
|
131
|
+
// Then: 페이지 번호로 직접 이동하므로 점프 버튼은 나오지 않는다
|
|
132
|
+
(0, _vitest.expect)(prevOf(el)).toBeNull();
|
|
133
|
+
(0, _vitest.expect)(nextOf(el)).toBeNull();
|
|
134
|
+
(0, _vitest.expect)(pageNums(el)).toHaveLength(LAST_PAGE_3);
|
|
135
|
+
});
|
|
62
136
|
});
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.PostcodeSearchModal = void 0;
|
|
7
7
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
8
|
-
var _uiAdminIcon = require("@ncds/ui-admin-icon");
|
|
9
8
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
10
9
|
var _react = require("react");
|
|
11
10
|
var _button = require("../../action/button");
|
|
@@ -14,15 +13,16 @@ var _inputBase = require("../../forms-and-input/input-base");
|
|
|
14
13
|
var _radio = require("../../forms-and-input/radio");
|
|
15
14
|
var _pagination = require("../../navigation/pagination");
|
|
16
15
|
var _modal = require("../modal");
|
|
16
|
+
var _PostcodeSearchModalTip = require("./PostcodeSearchModalTip");
|
|
17
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
18
|
/** 기획서 기준값 */
|
|
19
19
|
const PAGE_SIZE = 15;
|
|
20
20
|
/** 페이지 번호 그룹 크기 — 초과 시 Pagination 이 점프 버튼을 노출한다 */
|
|
21
21
|
const PAGER_WINDOW = 10;
|
|
22
|
-
/** 이 건수를 넘으면 Tip 을 압축 버전으로 전환한다 (기획서 기준) */
|
|
23
|
-
const TIP_COMPACT_THRESHOLD = 30;
|
|
24
22
|
/** 반응형 전환 기준 — assets/styles/base/_variable.scss 의 $breakpoint 와 동일 */
|
|
25
23
|
const MOBILE_BREAKPOINT = 768;
|
|
24
|
+
/** 본문 스크롤 컨테이너. Modal.Content 가 overflow-y:auto 를 갖는다. */
|
|
25
|
+
const SCROLL_CONTAINER_SELECTOR = '.ncua-modal__content';
|
|
26
26
|
const MODAL_TITLE = '주소 찾기';
|
|
27
27
|
const SEARCH_PLACEHOLDER = '도로명, 지번, 건물명 검색';
|
|
28
28
|
const SEARCH_BUTTON_LABEL = '검색';
|
|
@@ -30,7 +30,6 @@ const EMPTY_TITLE = '검색 결과가 없습니다.';
|
|
|
30
30
|
const EMPTY_DESCRIPTION = '검색어를 다시 확인해 주세요.';
|
|
31
31
|
const ROAD_BADGE_LABEL = '도로명';
|
|
32
32
|
const JIBUN_BADGE_LABEL = '지번';
|
|
33
|
-
const TIP_LABEL = 'Tip';
|
|
34
33
|
// 라디오 그룹 이름. `ncua-` 로 시작하면 MCP 의 BEM 추출기가 CSS 클래스로 오인하므로 접두사를 뺀다.
|
|
35
34
|
const RESULT_RADIO_NAME = 'postcode-search-modal-result';
|
|
36
35
|
/** E0006·E0008 외 나머지 코드는 모두 같은 문구를 쓴다(기획서: E0009~E0013 통합). */
|
|
@@ -39,23 +38,6 @@ const ERROR_HINT = {
|
|
|
39
38
|
E0006: '시도명으로는 검색이 불가합니다.',
|
|
40
39
|
E0008: '검색어를 두 글자 이상 입력해주세요.'
|
|
41
40
|
};
|
|
42
|
-
/** Tip 카드 첫 줄 안내 문구 (기획서 TIPS.searchTitle) */
|
|
43
|
-
const TIP_TITLE = '아래 조합으로 검색하면 원하는 주소를 더 쉽게 찾을 수 있어요.';
|
|
44
|
-
/** Tip 상세 버전에 노출할 검색어 조합과 예시 주소 (기획서 TIPS.searchTips) */
|
|
45
|
-
const TIP_ITEMS = [{
|
|
46
|
-
combination: '도로명 + 건물번호',
|
|
47
|
-
example: '디지털로26길 43'
|
|
48
|
-
}, {
|
|
49
|
-
combination: '지역명(동·리) + 번지',
|
|
50
|
-
example: '구로동 235-3'
|
|
51
|
-
}, {
|
|
52
|
-
combination: '지역명(동·리) + 건물명(아파트명)',
|
|
53
|
-
example: '구로동 대륭포스트타워8차'
|
|
54
|
-
}];
|
|
55
|
-
/** Tip 압축 버전 문구 — 예시 주소를 빼고 조합만 한 줄로 (기획서 TIPS.searchTipsCompact) */
|
|
56
|
-
const TIP_COMPACT_TEXT = "'도로명+건물번호', '지역명+지번', '지역명+건물명(아파트명)'";
|
|
57
|
-
const TIP_EXAMPLE_PREFIX = '예)';
|
|
58
|
-
const TIP_ICON_SIZE = 16;
|
|
59
41
|
/** 선택 표시를 판정하는 키. 우편번호만으로는 같은 건물의 다른 지번을 구분하지 못한다. */
|
|
60
42
|
const resultKey = _ref => {
|
|
61
43
|
let {
|
|
@@ -65,10 +47,6 @@ const resultKey = _ref => {
|
|
|
65
47
|
} = _ref;
|
|
66
48
|
return `${zipCode}|${roadAddress}|${jibunAddress}`;
|
|
67
49
|
};
|
|
68
|
-
const resolveTipVariant = (hasResults, totalCount) => {
|
|
69
|
-
if (!hasResults) return 'detail';
|
|
70
|
-
return totalCount > TIP_COMPACT_THRESHOLD ? 'compact' : null;
|
|
71
|
-
};
|
|
72
50
|
/** SSR(도큐사우루스 등)에서는 초기값을 false(=PC)로 두고 mount 이후 갱신한다. */
|
|
73
51
|
const useIsMobileViewport = () => {
|
|
74
52
|
const [isMobile, setIsMobile] = (0, _react.useState)(false);
|
|
@@ -84,49 +62,33 @@ const useIsMobileViewport = () => {
|
|
|
84
62
|
}, []);
|
|
85
63
|
return isMobile;
|
|
86
64
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
example
|
|
113
|
-
} = _ref3;
|
|
114
|
-
return (0, _jsxRuntime.jsxs)("li", {
|
|
115
|
-
className: "ncua-postcode-search-modal__tip-item",
|
|
116
|
-
children: [(0, _jsxRuntime.jsx)("span", {
|
|
117
|
-
className: "ncua-postcode-search-modal__tip-combination",
|
|
118
|
-
children: combination
|
|
119
|
-
}), (0, _jsxRuntime.jsx)("span", {
|
|
120
|
-
className: "ncua-postcode-search-modal__tip-example",
|
|
121
|
-
children: `${TIP_EXAMPLE_PREFIX} ${example}`
|
|
122
|
-
})]
|
|
123
|
-
}, combination);
|
|
124
|
-
})
|
|
125
|
-
})]
|
|
126
|
-
});
|
|
65
|
+
/**
|
|
66
|
+
* 본문이 위로 스크롤됐는지 여부.
|
|
67
|
+
* 고정된 검색 영역과 스크롤되는 결과 사이의 경계선을 스크롤 중에만 그리기 위해 쓴다.
|
|
68
|
+
* enabled 가 false 면 감시를 걸지 않고 항상 false 를 돌려준다.
|
|
69
|
+
*/
|
|
70
|
+
const useIsContentScrolled = (rootRef, enabled) => {
|
|
71
|
+
const [isScrolled, setIsScrolled] = (0, _react.useState)(false);
|
|
72
|
+
(0, _react.useEffect)(() => {
|
|
73
|
+
if (!enabled) {
|
|
74
|
+
setIsScrolled(false);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const scroller = rootRef.current?.closest(SCROLL_CONTAINER_SELECTOR);
|
|
78
|
+
if (!scroller) return;
|
|
79
|
+
const sync = () => setIsScrolled(scroller.scrollTop > 0);
|
|
80
|
+
// 결과가 바뀌어도 스크롤 위치는 남을 수 있어 구독 시점의 값으로 먼저 맞춘다.
|
|
81
|
+
sync();
|
|
82
|
+
scroller.addEventListener('scroll', sync, {
|
|
83
|
+
passive: true
|
|
84
|
+
});
|
|
85
|
+
return () => {
|
|
86
|
+
scroller.removeEventListener('scroll', sync);
|
|
87
|
+
};
|
|
88
|
+
}, [rootRef, enabled]);
|
|
89
|
+
return isScrolled;
|
|
127
90
|
};
|
|
128
|
-
|
|
129
|
-
const PostcodeSearchModal = _ref4 => {
|
|
91
|
+
const PostcodeSearchModal = _ref2 => {
|
|
130
92
|
let {
|
|
131
93
|
open,
|
|
132
94
|
onClose,
|
|
@@ -143,8 +105,9 @@ const PostcodeSearchModal = _ref4 => {
|
|
|
143
105
|
loading = false,
|
|
144
106
|
errorCode,
|
|
145
107
|
onSelect
|
|
146
|
-
} =
|
|
108
|
+
} = _ref2;
|
|
147
109
|
const isMobile = useIsMobileViewport();
|
|
110
|
+
const rootRef = (0, _react.useRef)(null);
|
|
148
111
|
// 선택 표시는 컴포넌트가 직접 들고 있는다. 사용처는 onSelect 로 값만 받으면 된다.
|
|
149
112
|
// 우편번호는 한 페이지에 중복될 수 있어 주소 전체를 키로 쓴다.
|
|
150
113
|
const [selectedKey, setSelectedKey] = (0, _react.useState)();
|
|
@@ -164,7 +127,8 @@ const PostcodeSearchModal = _ref4 => {
|
|
|
164
127
|
// 검색을 실행한 검색어와 현재 입력값이 같을 때만 "결과 없음"으로 본다.
|
|
165
128
|
// 입력 중에는 두 값이 달라지고, 응답을 기다리는 동안에는 loading 이 막는다.
|
|
166
129
|
const showEmptyState = !hasError && !loading && results.length === 0 && searchQuery !== '' && searchQuery === searchedQuery;
|
|
167
|
-
|
|
130
|
+
// 결과 목록이 있을 때만 스크롤이 생기므로 그때만 감시한다.
|
|
131
|
+
const isContentScrolled = useIsContentScrolled(rootRef, open && hasResults);
|
|
168
132
|
const handleSearchQueryChange = event => {
|
|
169
133
|
onSearchQueryChange(event.target.value);
|
|
170
134
|
};
|
|
@@ -191,28 +155,40 @@ const PostcodeSearchModal = _ref4 => {
|
|
|
191
155
|
}), (0, _jsxRuntime.jsx)(_modal.Modal.Content, {
|
|
192
156
|
children: (0, _jsxRuntime.jsxs)("div", {
|
|
193
157
|
className: "ncua-postcode-search-modal",
|
|
158
|
+
ref: rootRef,
|
|
194
159
|
children: [(0, _jsxRuntime.jsxs)("div", {
|
|
195
|
-
className:
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
160
|
+
className: (0, _classnames.default)('ncua-postcode-search-modal__search-area', {
|
|
161
|
+
'is-fixed': hasResults && isContentScrolled
|
|
162
|
+
}),
|
|
163
|
+
children: [(0, _jsxRuntime.jsxs)("div", {
|
|
164
|
+
className: "ncua-postcode-search-modal__search",
|
|
165
|
+
children: [(0, _jsxRuntime.jsx)(_inputBase.InputBase, {
|
|
166
|
+
className: "ncua-postcode-search-modal__search-input",
|
|
167
|
+
size: "sm",
|
|
168
|
+
fullWidth: true,
|
|
169
|
+
value: searchQuery,
|
|
170
|
+
onChange: handleSearchQueryChange,
|
|
171
|
+
onKeyDown: handleSearchKeyDown,
|
|
172
|
+
placeholder: SEARCH_PLACEHOLDER,
|
|
173
|
+
destructive: hasError,
|
|
174
|
+
hintText: errorCode ? ERROR_HINT[errorCode] ?? DEFAULT_ERROR_HINT : undefined
|
|
175
|
+
}), (0, _jsxRuntime.jsx)(_button.Button, {
|
|
176
|
+
className: "ncua-postcode-search-modal__search-button",
|
|
177
|
+
label: SEARCH_BUTTON_LABEL,
|
|
178
|
+
size: "sm",
|
|
179
|
+
hierarchy: "secondary",
|
|
180
|
+
onClick: handleSearch
|
|
181
|
+
})]
|
|
182
|
+
}), hasResults && (0, _jsxRuntime.jsxs)("div", {
|
|
183
|
+
children: [(0, _jsxRuntime.jsx)("p", {
|
|
184
|
+
className: "ncua-postcode-search-modal__result-title",
|
|
185
|
+
children: _PostcodeSearchModalTip.TIP_TITLE
|
|
186
|
+
}), (0, _jsxRuntime.jsx)("p", {
|
|
187
|
+
className: "ncua-postcode-search-modal__result-desc",
|
|
188
|
+
children: "\uB3C4\uB85C\uBA85+\uAC74\uBB3C\uBC88\uD638, \uC9C0\uC5ED\uBA85+\uC9C0\uBC88, \uC9C0\uC5ED\uBA85+\uAC74\uBB3C\uBA85(\uC544\uD30C\uD2B8\uBA85)"
|
|
189
|
+
})]
|
|
212
190
|
})]
|
|
213
|
-
}),
|
|
214
|
-
compact: tipVariant === 'compact'
|
|
215
|
-
}), hasResults && (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
191
|
+
}), !hasResults && (0, _jsxRuntime.jsx)(PostcodeSearchModal.Tip, {}), hasResults && (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
216
192
|
children: [(0, _jsxRuntime.jsxs)("p", {
|
|
217
193
|
className: "ncua-postcode-search-modal__count",
|
|
218
194
|
children: ["\uAC80\uC0C9 ", (0, _jsxRuntime.jsx)("b", {
|
|
@@ -280,4 +256,4 @@ const PostcodeSearchModal = _ref4 => {
|
|
|
280
256
|
};
|
|
281
257
|
exports.PostcodeSearchModal = PostcodeSearchModal;
|
|
282
258
|
PostcodeSearchModal.displayName = 'PostcodeSearchModal';
|
|
283
|
-
PostcodeSearchModal.Tip = Tip;
|
|
259
|
+
PostcodeSearchModal.Tip = _PostcodeSearchModalTip.Tip;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Tip = exports.TIP_TITLE = void 0;
|
|
7
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
8
|
+
var _uiAdminIcon = require("@ncds/ui-admin-icon");
|
|
9
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const TIP_LABEL = 'Tip';
|
|
12
|
+
/** Tip 카드 첫 줄 안내 문구 (기획서 TIPS.searchTitle) */
|
|
13
|
+
const TIP_TITLE = exports.TIP_TITLE = '아래 조합으로 검색하면 원하는 주소를 더 쉽게 찾을 수 있어요.';
|
|
14
|
+
/** Tip 에 노출할 검색어 조합과 예시 주소 (기획서 TIPS.searchTips) */
|
|
15
|
+
const TIP_ITEMS = [{
|
|
16
|
+
combination: '도로명 + 건물번호',
|
|
17
|
+
example: '디지털로26길 43'
|
|
18
|
+
}, {
|
|
19
|
+
combination: '지역명(동·리) + 번지',
|
|
20
|
+
example: '구로동 235-3'
|
|
21
|
+
}, {
|
|
22
|
+
combination: '지역명(동·리) + 건물명(아파트명)',
|
|
23
|
+
example: '구로동 대륭포스트타워8차'
|
|
24
|
+
}];
|
|
25
|
+
const TIP_EXAMPLE_PREFIX = '예)';
|
|
26
|
+
const TIP_ICON_SIZE = 16;
|
|
27
|
+
/**
|
|
28
|
+
* 검색어 조합을 안내하는 Tip 카드.
|
|
29
|
+
* 결과 목록이 없는 화면(초기·오류·결과 없음)에서만 노출된다.
|
|
30
|
+
* 결과가 있을 때는 모달이 안내 문구 한 줄만 검색 영역에 붙여 고정한다.
|
|
31
|
+
*/
|
|
32
|
+
const Tip = _ref => {
|
|
33
|
+
let {
|
|
34
|
+
className
|
|
35
|
+
} = _ref;
|
|
36
|
+
return (0, _jsxRuntime.jsxs)("div", {
|
|
37
|
+
className: (0, _classnames.default)('ncua-postcode-search-modal__tip', className),
|
|
38
|
+
children: [(0, _jsxRuntime.jsxs)("p", {
|
|
39
|
+
className: "ncua-postcode-search-modal__tip-label",
|
|
40
|
+
children: [(0, _jsxRuntime.jsx)(_uiAdminIcon.AnnotationInfoFill, {
|
|
41
|
+
className: "ncua-postcode-search-modal__tip-icon",
|
|
42
|
+
width: TIP_ICON_SIZE,
|
|
43
|
+
height: TIP_ICON_SIZE
|
|
44
|
+
}), TIP_LABEL]
|
|
45
|
+
}), (0, _jsxRuntime.jsx)("p", {
|
|
46
|
+
className: "ncua-postcode-search-modal__tip-title",
|
|
47
|
+
children: TIP_TITLE
|
|
48
|
+
}), (0, _jsxRuntime.jsx)("ul", {
|
|
49
|
+
className: "ncua-postcode-search-modal__tip-list",
|
|
50
|
+
children: TIP_ITEMS.map(_ref2 => {
|
|
51
|
+
let {
|
|
52
|
+
combination,
|
|
53
|
+
example
|
|
54
|
+
} = _ref2;
|
|
55
|
+
return (0, _jsxRuntime.jsxs)("li", {
|
|
56
|
+
className: "ncua-postcode-search-modal__tip-item",
|
|
57
|
+
children: [(0, _jsxRuntime.jsx)("span", {
|
|
58
|
+
className: "ncua-postcode-search-modal__tip-combination",
|
|
59
|
+
children: combination
|
|
60
|
+
}), (0, _jsxRuntime.jsx)("span", {
|
|
61
|
+
className: "ncua-postcode-search-modal__tip-example",
|
|
62
|
+
children: `${TIP_EXAMPLE_PREFIX} ${example}`
|
|
63
|
+
})]
|
|
64
|
+
}, combination);
|
|
65
|
+
})
|
|
66
|
+
})]
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
exports.Tip = Tip;
|
|
70
|
+
Tip.displayName = 'PostcodeSearchModal.Tip';
|