sales-frontend-oz 0.0.85 → 0.0.86
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/README.md +0 -320
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,321 +1 @@
|
|
|
1
1
|
# sales-frontend-oz
|
|
2
|
-
|
|
3
|
-
오즈(OZ) 솔루션을 컨트롤하는 함수 및 유틸리티를 제공하는 패키지입니다.
|
|
4
|
-
|
|
5
|
-
본 패키지는 **비즈니스 로직에 대한 의존성을 최소화**하고, 각 기능을 **독립적인 단위로 제공**하는 데 초점을 둡니다.
|
|
6
|
-
|
|
7
|
-
`백엔드 데이터 연동`, `오즈 이벤트 핸들러 연동` 등 비즈니스 로직에 의존하는 부분은 **사용하는 쪽에서 조립하여 구현**합니다.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 브릿지 의존성
|
|
12
|
-
|
|
13
|
-
본 패키지는 `sales-frontend-bridge` 패키지에서 제공하는 OZ 컨트롤 브릿지를 사용합니다.
|
|
14
|
-
|
|
15
|
-
브릿지별로 arg와 사용예시는 bridge 패키지에서 주석을 확인
|
|
16
|
-
|
|
17
|
-
> 참고 [스펙시트 loop 문서](https://hanwhalifem365.sharepoint.com/:fl:/g/contentstorage/CSP_59145850-ae09-4b55-9442-8d4f215f999f/IQCQXNlNeWcWTKkF6hZww9H5AdYXHbYnQaxct5FC6-mMnQ4?e=I40eUd&nav=cz0lMkZjb250ZW50c3RvcmFnZSUyRkNTUF81OTE0NTg1MC1hZTA5LTRiNTUtOTQ0Mi04ZDRmMjE1Zjk5OWYmZD1iJTIxVUZnVVdRbXVWVXVVUW8xUElWLVpuOFhBQkVpNk40dER2aFpSS3h6Ylh4akdNb0xhRTAtT1FiUHpsc0NyYms2ciZmPTAxNVdPVkNSRVFMVE1VMjZMSENaR0tTQlBLQ1pZTUhVUFomYz0lMkYmYT1Mb29wQXBwJng9JTdCJTIydyUyMiUzQSUyMlQwUlRVSHhvWVc1M2FHRnNhV1psYlRNMk5TNXphR0Z5WlhCdmFXNTBMbU52Ylh4aUlWVkdaMVZYVVcxMVZsVjFWVkZ2TVZCSlZpMWFiamhZUVVKRmFUWk9OSFJFZG1oYVVrdDRlbUpZZUdwSFRXOU1ZVVV3TFU5UllsQjZiSE5EY21Kck5uSjhNREUxVjA5V1ExSkhWVVpWVVZwTlJWUmFWbFpJTWt0TVdVMUhValEyTWxwVVV3JTNEJTNEJTIyJTJDJTIyaSUyMiUzQSUyMjgwZDJkZjViLWQ5OTktNDM2ZC1iMTVhLTc0Y2MwMTQzMTAwYSUyMiU3RA%3D%3D)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## [n2ozBridge.\*](../bridge/src/native/bridge-oz/native-bridge-oz.ts)
|
|
22
|
-
|
|
23
|
-
오즈 뷰어가 **켜져 있을 때만 호출 가능한 브릿지**입니다.
|
|
24
|
-
|
|
25
|
-
### 오즈 엔진 뷰어 함수 Wrapper 브릿지
|
|
26
|
-
|
|
27
|
-
- **getInformation**
|
|
28
|
-
|
|
29
|
-
- 현재 페이지, 전체 페이지 수, 서명 입력값 등을 조회할 때 사용
|
|
30
|
-
|
|
31
|
-
- **getGlobal**
|
|
32
|
-
|
|
33
|
-
- 서식에서 참조하는 전역 변수 값을 조회 (`chkFlag`)
|
|
34
|
-
|
|
35
|
-
- **setGlobal**
|
|
36
|
-
|
|
37
|
-
- 서식에서 참조하는 전역 변수 값을 설정 (`checkeForm`, `chkFlag`)
|
|
38
|
-
|
|
39
|
-
- **script**
|
|
40
|
-
|
|
41
|
-
- 상단 서식 목록 클릭 시 페이지 이동에 사용(`movepage`)
|
|
42
|
-
|
|
43
|
-
- **scriptEx**
|
|
44
|
-
|
|
45
|
-
- 형광펜 기능에 사용
|
|
46
|
-
|
|
47
|
-
- **triggerExternalEventByDocIndex**
|
|
48
|
-
- 청약서 컷팅, 중간 저장 데이터 생성 시 사용
|
|
49
|
-
|
|
50
|
-
### Native 컨트롤 브릿지
|
|
51
|
-
|
|
52
|
-
- **updateOzDocumentStatus**
|
|
53
|
-
|
|
54
|
-
- 상단 서식 목록 완료 여부 상태값 업데이트
|
|
55
|
-
|
|
56
|
-
- **savePdf**
|
|
57
|
-
|
|
58
|
-
- 모든 서식에 서명 완료 후 PDF로 변환
|
|
59
|
-
|
|
60
|
-
- **saveSignImg**
|
|
61
|
-
|
|
62
|
-
- 컷팅한 청약서 이미지를 태블릿 로컬에 저장
|
|
63
|
-
|
|
64
|
-
- **createOzPdfViewer**
|
|
65
|
-
|
|
66
|
-
- PDF 변환 후 PDF 뷰어를 생성하여 표시
|
|
67
|
-
|
|
68
|
-
- **hideOzPdfViewer**
|
|
69
|
-
|
|
70
|
-
- PDF 뷰어 종료
|
|
71
|
-
|
|
72
|
-
- **showSignatureShortcut**
|
|
73
|
-
|
|
74
|
-
- 서명 바로가기 버튼 표시
|
|
75
|
-
|
|
76
|
-
- **hideSignatureShortcut**
|
|
77
|
-
|
|
78
|
-
- 서명 바로가기 버튼 숨김
|
|
79
|
-
|
|
80
|
-
- **showMissingFieldWarning**
|
|
81
|
-
|
|
82
|
-
- 미입력 서명 알림(`!` 버튼) 표시
|
|
83
|
-
|
|
84
|
-
- **hideMissingFieldWarning**
|
|
85
|
-
- 미입력 서명 알림(`!` 버튼) 숨김
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## [n2bridge.\*](../bridge/src/native/bridge/native-bridge.ts)
|
|
90
|
-
|
|
91
|
-
모든 화면에서 호출 가능한 브릿지입니다.
|
|
92
|
-
|
|
93
|
-
- **createOZViewer**
|
|
94
|
-
|
|
95
|
-
- 오즈 뷰어 생성 및 초기화
|
|
96
|
-
|
|
97
|
-
- **hideOZViewer**
|
|
98
|
-
|
|
99
|
-
- 오즈 뷰어 종료
|
|
100
|
-
|
|
101
|
-
- **downloadDocument**
|
|
102
|
-
|
|
103
|
-
- 비정형 문서에서 OZD 파일을 태블릿 로컬로 다운로드
|
|
104
|
-
|
|
105
|
-
- **getOzFontParam**
|
|
106
|
-
|
|
107
|
-
- 태블릿에 설치된 폰트 정보를 오즈 양식에 맞게 반환
|
|
108
|
-
|
|
109
|
-
- **showLoader**
|
|
110
|
-
|
|
111
|
-
- `청약 문서를 불러오고 있어요` 모달 표시
|
|
112
|
-
|
|
113
|
-
- **hideLoader**
|
|
114
|
-
|
|
115
|
-
- `청약 문서를 불러오고 있어요` 모달 숨김
|
|
116
|
-
|
|
117
|
-
- **showAlert**
|
|
118
|
-
|
|
119
|
-
- Native 레벨 Alert 표시 (예: 서명 중간 저장 실패)
|
|
120
|
-
|
|
121
|
-
- **localFetchBridge**
|
|
122
|
-
|
|
123
|
-
- Android 전용
|
|
124
|
-
- 태블릿 로컬 FILE URL을 fetch 가능한 HTTP URL로 변환
|
|
125
|
-
- 로컬 파일을 직접 fetch하여 비정형 업로드에 사용
|
|
126
|
-
(로컬 파일 → Blob Fetch → DUD 업로드)
|
|
127
|
-
|
|
128
|
-
- **dudExternalFileUpload**
|
|
129
|
-
|
|
130
|
-
- iOS 전용 (`localFetchBridge` 사용 불가)
|
|
131
|
-
- 태블릿 로컬 FILE을 DUD로 업로드 후 FILE ID 반환
|
|
132
|
-
(로컬 파일 → DUD 업로드)
|
|
133
|
-
|
|
134
|
-
- **contractClear**
|
|
135
|
-
- 청약 완료된 계약에 대해 `policyNumber`를 전달하여 호출
|
|
136
|
-
- 태블릿 로컬에서 해당 증권번호 관련 폴더 전체 삭제 요청
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## 브릿지 데이터 통신 구조
|
|
141
|
-
|
|
142
|
-
### 요청
|
|
143
|
-
|
|
144
|
-
```js
|
|
145
|
-
// setGlobal 요청 샘플 코드
|
|
146
|
-
await Bridge.nativeOz.setGlobal({ docIndex: 1, key: 'checkeForm', value: 'Y' });
|
|
147
|
-
|
|
148
|
-
// 브릿지로 전달되는 setGlobal 요청 데이터 구조
|
|
149
|
-
{
|
|
150
|
-
// 브릿지 액션명
|
|
151
|
-
"action": "setGlobal",
|
|
152
|
-
// 요청을 구분하는 프로미스 아이디
|
|
153
|
-
"promiseId": "setGlobal_1769563150390_tzq61xcge",
|
|
154
|
-
// 브릿지가 인자를 받는경우 option 객체의 하위 프로퍼티로 전달
|
|
155
|
-
"option": { "docIndex": 1, "key": "checkeForm", "value": "Y" }
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### 응답
|
|
160
|
-
|
|
161
|
-
```js
|
|
162
|
-
// setGlobal 응답 샘플
|
|
163
|
-
{
|
|
164
|
-
// 브릿지 액션명
|
|
165
|
-
"action": "setGlobal",
|
|
166
|
-
// 브릿지 리턴값
|
|
167
|
-
"data": true,
|
|
168
|
-
// 요청했던 내용을 그대로 돌려준다(실패했을경우 요청값이 무엇이었는지 확인하기 위한 용도)
|
|
169
|
-
"option": { "docIndex": 1, "key": "checkeForm", "value": "Y" }
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// getInformation 응답 샘플
|
|
173
|
-
{
|
|
174
|
-
"action": "getInformation",
|
|
175
|
-
"data": "15",
|
|
176
|
-
"option": { "command": "REPORT_COUNT" }
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 명확한 응답값이 존재하는 브릿지요청(getInformation 등)은 data에 유의미한 값이 들어온다
|
|
180
|
-
// 명확한 응답값이 없는 브릿지요청(showLoader, hideLoader)등은 특이사항 없으면 `success`가 주로 리턴된다
|
|
181
|
-
{
|
|
182
|
-
"action": "showSignatureShortcut",
|
|
183
|
-
"data": "success",
|
|
184
|
-
"option": {}
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## 이벤트 기반 통신
|
|
191
|
-
|
|
192
|
-
Web => Native는 브릿지로 통신
|
|
193
|
-
|
|
194
|
-
Native => Web은 이벤트 기반 통신(`window.dispatchEvent`)
|
|
195
|
-
|
|
196
|
-
오즈 뷰어 내 존재하는 Native 버튼 클릭시 이벤트가 발생한다
|
|
197
|
-
|
|
198
|
-
구현 샘플은 [btn-touch-event-util](./src/internal/utils/btn-touch-event-util)를 확인한다.
|
|
199
|
-
|
|
200
|
-
이벤트의 데이터는 type과 btnID 두개의 프로퍼티로 구성되어 있다.
|
|
201
|
-
|
|
202
|
-
- type으로 대략적으로 큰 범위를 가르는 기준으로 쓰고
|
|
203
|
-
- btnID는 정확히 어떤 버튼을 눌렀는지 구분하는데 쓰인다
|
|
204
|
-
|
|
205
|
-
```typescript
|
|
206
|
-
// Native에서 발생시키는 커스텀이벤트 핸들러 예시
|
|
207
|
-
const handleOZBtnTouchEvent = async (e: CustomEvent<OZBtnTouchEvent>) => {
|
|
208
|
-
const { detail } = e;
|
|
209
|
-
|
|
210
|
-
if (detail.type === 'comment') {
|
|
211
|
-
// 형광펜 주석 모드 관련 버튼 클릭 시
|
|
212
|
-
await CommentHandler(detail);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
// 주석 모드 (형광펜 버튼) 클릭 이벤트 핸들러
|
|
217
|
-
async function CommentHandler({ type, btnID }: CommentEvent) {
|
|
218
|
-
if (btnID === 'yellow') {
|
|
219
|
-
// 형광펜 버튼 노란색
|
|
220
|
-
await setEnableCommentMode('yellow');
|
|
221
|
-
} else if (btnID === 'eraser') {
|
|
222
|
-
// 형광펜 버튼 지우개
|
|
223
|
-
await setEnableCommentMode('eraser');
|
|
224
|
-
} else if (btnID === 'disable') {
|
|
225
|
-
// 형광펜 모드 종료
|
|
226
|
-
await setDisableCommentMode();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
## 폴더 구조
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
.
|
|
237
|
-
└── src
|
|
238
|
-
├── oz # 외부에 export하는 소스
|
|
239
|
-
│ ├── constant # 오즈 파라미터 공통 상수
|
|
240
|
-
│ ├── hooks # 오즈 이벤트 구독 및 데이터 변환 hook
|
|
241
|
-
│ ├── types # 오즈 뷰어에서 사용할 타입 및 enum
|
|
242
|
-
│ └── utils # 오즈 뷰어 공통 유틸
|
|
243
|
-
├── internal # 패키지 내부 전용 소스 (외부 미노출)
|
|
244
|
-
│ ├── const # [스토리북용] 테스트 하드코딩 상수
|
|
245
|
-
│ └── utils # [스토리북용] 테스트 유틸 함수
|
|
246
|
-
└── sample-stories # 샘플 스토리북
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### constant
|
|
250
|
-
|
|
251
|
-
패키지 외부로 제공할 상수들을 정의
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
.
|
|
255
|
-
├── comment-pen-param.ts # 오즈 뷰어 내 형광펜 버튼 색상 정의
|
|
256
|
-
├── oz-param.ts # 오즈 뷰어 기동 시 뷰어 속성 정의
|
|
257
|
-
└── pdf-param.ts # 서명 후 PDF Export 시 PDF 속성 정의
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### hooks
|
|
261
|
-
|
|
262
|
-
외부로 제공하는 React Hook 모음
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
.
|
|
266
|
-
├── use-document-info.tsx # 오즈에 바인딩할 문서 목록을 다양한 형태로 가공하는 Hook
|
|
267
|
-
└── use-oz-event-listener.tsx # OZ 뷰어 콜백 이벤트를 구독하는 Hook
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### utils
|
|
271
|
-
|
|
272
|
-
외부로 제공하는 유틸 함수 모음
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
.
|
|
276
|
-
├── bridge-util # Native 브릿지를 호출하는 공통 유틸
|
|
277
|
-
│ ├── alert-util.ts # Native Alert 호출 유틸
|
|
278
|
-
│ ├── create-report-util.ts # 오즈 뷰어 최초 생성 관련 브릿지 유틸
|
|
279
|
-
│ ├── fetch-util.ts # 비정형 OZD 파일 다운로드 유틸
|
|
280
|
-
│ ├── focus-util.ts # 서식 validation 및 서명 패드 포커스 제어
|
|
281
|
-
│ ├── get-draft-data-util.ts # 중간 저장 데이터 제어 유틸
|
|
282
|
-
│ ├── oz-wrapper-util.ts # 기본 오즈 컨트롤 유틸
|
|
283
|
-
│ ├── save-pdf-util.ts # 오즈 문서 → PDF Export 유틸
|
|
284
|
-
│ └── validation-util.ts # 서식 유효성 검사 유틸
|
|
285
|
-
├── common-util.ts # [순수 함수] 공통 유틸
|
|
286
|
-
└── value-change-debounce-util.ts # [순수 함수] OnValueChange 이벤트 debounce 처리 유틸
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### 스토리북 테스트 페이지
|
|
290
|
-
|
|
291
|
-
가끔 특정 기능만 빠르게 테스트 해보고싶을때 스토리북 페이지를 로딩하는 테스트 앱을 빌드해서 사용할수 있다
|
|
292
|
-
(신규 브릿지 추가 등)
|
|
293
|
-
|
|
294
|
-
1. package 프로젝트에서 브랜치 이름을 `oz`로 생성한다
|
|
295
|
-
2. `oz` 브랜치 체크아웃
|
|
296
|
-
3. pnpm run deploy-storybook 실행
|
|
297
|
-
4. https://oz--685dde4728854606b608af64.chromatic.com/ 접속
|
|
298
|
-
|
|
299
|
-
oz브랜치의 스토리북에서는 다른 페이지는 필요없으므로
|
|
300
|
-
|
|
301
|
-
[main.ts](../../apps/docs/.storybook/main.ts)에서 오즈 스토리만 남기고 나머지는 주석처리를 해 주면 좋다
|
|
302
|
-
|
|
303
|
-
```ts
|
|
304
|
-
// 오즈 샘플 스토리만 남기고 모두 주석처리
|
|
305
|
-
const config: StorybookConfig = {
|
|
306
|
-
stories: isDesignSystemOnly
|
|
307
|
-
? [
|
|
308
|
-
// Design System만
|
|
309
|
-
// '../../../packages/design-system/**/*.stories.@(js|jsx|ts|tsx|mdx)',
|
|
310
|
-
// '../../../packages/design-system/**/*.mdx'
|
|
311
|
-
]
|
|
312
|
-
: [
|
|
313
|
-
// 전체 (src 폴더로 한정하여 node_modules 자동 제외)
|
|
314
|
-
// '../**/*.mdx',
|
|
315
|
-
// '../**/*.stories.@(js|jsx|ts|tsx|mdx)',
|
|
316
|
-
// '../../../packages/**/*.mdx',
|
|
317
|
-
// '../../../packages/**/*.stories.@(js|jsx|ts|tsx|mdx)',
|
|
318
|
-
'../../../packages/oz/src/sample-stories/oz-sample.stories.tsx'
|
|
319
|
-
]
|
|
320
|
-
};
|
|
321
|
-
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sales-frontend-oz",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.86",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -27,18 +27,18 @@
|
|
|
27
27
|
"react": "^19.1.0",
|
|
28
28
|
"tsup": "^8.4.0",
|
|
29
29
|
"typescript": "5.8.2",
|
|
30
|
-
"eslint-config-sales-frontend-eslint-config-v8": "^0.0.
|
|
30
|
+
"eslint-config-sales-frontend-eslint-config-v8": "^0.0.8",
|
|
31
31
|
"sales-frontend-typescript-config": "0.0.2",
|
|
32
|
-
"sales-frontend-bridge": "0.0.
|
|
32
|
+
"sales-frontend-bridge": "0.0.113",
|
|
33
33
|
"sales-frontend-vitest-config": "0.0.2"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"react": ">=18.0.0",
|
|
37
37
|
"react-dom": ">=18.0.0",
|
|
38
|
-
"sales-frontend-bridge": "0.0.
|
|
38
|
+
"sales-frontend-bridge": "0.0.113"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"sales-frontend-utils": "0.0.
|
|
41
|
+
"sales-frontend-utils": "0.0.65"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"lint": "eslint . --max-warnings 0",
|