PageSourceSearch

https://order.kyobobook.co.kr/assets/js/cart/methods/setCartList.js

js kyobobook.co.kr collected 2026-10-01 08:46:59 UTC 13,753 bytes, 289 lines download raw bytes

1import {cartState} from "../state/CartState.js";
2
3/**
4 * 카트 리스트 렌더링 및 상태 업데이트
5 *
6 * @param {number} i - 장바구니 그리기 순서
7 * @param {string} k - 카테고리 코드('010','020','030','040','060','070')
8 * @param {Array<Object>} d - 상품 데이터 리스트
9 * @param {string} brdrYn - 바로드림 여부('Y'/'N')
10 * @param {boolean} moreYn - 추가 로딩 여부
11 */
12export async function setCartList(i, k, d, brdrYn, moreYn) {
13    let html = '';
14
15    //패키지상품 제외.2VM1
16    if (k === "010" || k === "020" || k === "030" || k === "040" || k === "060") {
17        //전체 리스트 담기
18        $.each(d, function (index, item) {
19            cartState.allList.push(item);
20        });
21
22        let item = d;
23        let template = (moreYn) ? $.templates(`#templateCart${k}Contents`) : $.templates(`#templateCart${k}`);
24        let renderRowWrapper = template.render(item, {
25            numberFloor: (val) => {//saleCmdtPrceDscnRate
26                return order.utils.number.numberFloor(val);
27            },
28            isEmpty: (val) => order.utils.isEmpty(val),
29            getSize: () => {
30                return item.length - 1;
31            },
32            //상품 상세페이지
33            getProductLink: (saleCmdtid, saleCmdtDvsnCode, cmdtcode, attName1, attWrth1) => {
34                return order.utils.getProductLink(saleCmdtid, saleCmdtDvsnCode, cmdtcode, attName1, attWrth1, false, '');
35            },
36            //상품이미지 옵션
37            getImageWrapClassName: (saleCmdtDvsnCode) => {
38                /* eBook, sam, 학술논문, 오디오북 상품인 경우 [ type_bookcover ] class 추가
39                썸네일 정방형인 경우 (PB, 핫트랙스) [ type_square_round ] class 추가
40                기프트카드인 경우 [ type_gift_card ] class 추가
41                사은품인 경우 [ type_cover ] class 추가 */
42                let clsName = "";
43                switch (saleCmdtDvsnCode) {
44                    case "AUD":
45                    case "SAM":
46                    case "EBK":
47                    case "DUM":// 오디오북, SAM, eBook, 학술논문
48                        clsName = "type_bookcover";
49                        break;
50                    case "PBC": // PB
51                    case "GFT":
52                    case "DVD":
53                    case "MUC":// 핫트랙스
54                        clsName = "type_square_round";
55                        break;
56                    case "GFC": // 기프트카드
57                        clsName = "type_gift_card";
58                        break;
59                    case "OPT": // 사은품
60                        clsName = "type_cover";
61                        break;
62                }
63                return clsName;
64            },
65            //업체상품
66            entsList: (rcvIndex, goodsList, entsId, dlvrAmnt, freeDlvrStnrAmnt, freeDlvrYsno) => {
67                return $("#templateCart040prd").render(goodsList, {
68                    getDualIndex: () => {
69                        return rcvIndex;
70                    },
71                    entsId: () => {
72                        return entsId;
73                    },
74                    dlvrAmnt: () => {
75                        return dlvrAmnt;
76                    },
77                    freeDlvrStnrAmnt: () => {
78                        return freeDlvrStnrAmnt;
79                    },
80                    isEmpty: (val) => order.utils.isEmpty(val),
81                    getProductLink: (saleCmdtid, saleCmdtDvsnCode, cmdtcode, attName1, attWrth1) => {
82                        // 상품상세
83                        return order.utils.getProductLink(saleCmdtid, saleCmdtDvsnCode, cmdtcode, attName1, attWrth1, false, '');
84                    },
85                    freeDlvrYsno: () => {
86                        return freeDlvrYsno;
87                    },
88                });
89            },
90            isOPNYn: (goodsList) => {
91                if (goodsList[0].saleCmdtDvsnCode === "OPN") return "Y";
92                else return "N";
93            }
94        });
95
96        if (moreYn) {
97            $('[data-cart-list-' + k + ']').append(renderRowWrapper);
98        } else {
99            $("[spbkKindGoodsList]").append(renderRowWrapper);
100        }
101
102        //택배배송 바로드림만일땐 안보이게 숨기기
103        if (brdrYn === "Y") {
104            $("[data-all-cart-list]").remove();
105        }
106    }
107
108    // 교보문고 무료배송 프로그래스바 설정
109    if (k === "010" && i !== 0) {
110        $('#cartCalcWrap').attr("data-add-offset", order.utils.isMobile() ? "100" : "132");
111    }
112
113    // 핫트랙스 무료배송 프로그래스바 설정
114    if (k === "030" && i !== 0) {
115        $('#htrsCartCalcWrap').attr("data-add-offset", order.utils.isMobile() ? "100" : "132");
116    }
117
118    //패키지상품 리스트 세팅
119    if (k === "070") {
120        let item = d;
121        let sumTotalPrice = 0;
122        let template = $.templates('#templateCart' + k + '');
123
124        let pakTotalDscnRate = 0; //예정할인율
125        let pakTotalSaleCmdtSapr = 0; //예정판매가
126        let pakMobTotalSaleCmdtSapr = 0; //예정판매가(모바일)
127        let pakTotalAdtnSaleAmnt = 0; //추가판매금액
128        let pakTotalPoint = 0; //예정적립포인트
129        let pakMobTotalPoint = 0; //예정적립포인트(모바일)
130        let pakMobTotalSaleCmdtPrce = 0; //패키지 정가합계(모바일)
131        let soldOutCnt = 0; // 패키지 내 soldOut된 필수상품 수
132        let renderRowWrapper = template.render(item, {
133            isEmpty: (val) => order.utils.isEmpty(val),
134            getSize: () => {
135                return item.length - 1;
136            },
137            getSoldOutYn: (soldOutYn, goodsList) => {
138
139                for (let j = 0; j < goodsList.length; j++) {
140                    //패키지 대표상품이 품절상품이거나, 필수상품이면서 품절이거나, 필수상품이면서 절판인 경우 전체 패키지 품절표시
141                    if ((goodsList[j].soldOutYn === "Y" && goodsList[j].rqrdYsno === "Y")
142                        || soldOutYn === "Y" || ((goodsList[j].saleCdtnCode !== "001" && goodsList[j].saleCdtnCode !== "008") && goodsList[j].rqrdYsno === "Y")) {
143                        soldOutYn = "Y";
144                    }
145                }
146
147                return soldOutYn;
148            },
149            setSoldOutCnt: (soldOutYn, goodsList) => {
150                soldOutCnt = 0;
151                for (let j = 0; j < goodsList.length; j++) {
152                    //패키지 대표상품이 품절상품이거나, 필수상품이면서 품절이거나, 필수상품이면서 절판인 경우 전체 패키지 품절표시
153                    if ((goodsList[j].soldOutYn === "Y" && goodsList[j].rqrdYsno === "Y")
154                        || soldOutYn === "Y" || ((goodsList[j].saleCdtnCode !== "001" && goodsList[j].saleCdtnCode !== "008") && goodsList[j].rqrdYsno === "Y")) {
155                        soldOutCnt += 1;
156                    }
157                }
158            },
159            getSoldOutCnt: () => {
160                return soldOutCnt;
161            },
162            getPrdSoldOutYn: (soldOutYn, goodsList) => {
163                let prdSoldOutYn = "N";
164                if (goodsList.soldOutYn === "Y" || (goodsList.saleCdtnCode !== "001" && goodsList.saleCdtnCode !== "008") || (goodsList.spbkKindCode === "020" && (goodsList.dgctSaleCdtnCode !== "001" && goodsList.dgctSaleCdtnCode !== "003"))) {
165                    prdSoldOutYn = "Y";
166                }
167
168                if (soldOutYn === "Y" && prdSoldOutYn === "Y") {
169                    prdSoldOutYn = "Y";
170                } else if (soldOutYn === "N" && prdSoldOutYn === "N") {
171                    prdSoldOutYn = "N";
172                }
173
174                return prdSoldOutYn;
175
176            },
177            getChekYsno: (goodsList) => {
178                return goodsList[0].chekYsno;
179            },
180            getRequQntt: (goodsList) => {
181                let combRequQntt = 1;
182                let spbkKindCodeArry = ['020', '130'];
183                for (let j = 0; j < goodsList.length; j++) {
184                    //패키지 대표상품이 품절상품이거나, 필수상품이면서 품절이거나, 필수상품이면서 절판인 경우 전체 패키지 품절표시
185                    if ($.inArray(goodsList[j].spbkKindCode, spbkKindCodeArry) === -1) {
186                        combRequQntt = goodsList[j].requQntt;
187                    }
188                }
189                return combRequQntt;
190            },
191            // 패키지 하위상품이 전부 디지털 상품군(020/130)이면 대표 수량 조절 불가 판정
192            isAllDigital: (goodsList) => {
193                let spbkKindCodeArry = ['020', '130'];
194                return goodsList.length > 0
195                    && goodsList.every((g) => $.inArray(g.spbkKindCode, spbkKindCodeArry) !== -1);
196            },
197            getPackLink: (combCmdtSaleCmdtid) => {
198                // 상품상세
199                return order.utils.getProductLink(combCmdtSaleCmdtid, '', '', '', '', false, '');
200            },
201            getPageLink: (saleCmdtid, saleCmdtDvsnCode, cmdtcode) => {
202                return order.utils.getProductLink(saleCmdtid, saleCmdtDvsnCode, cmdtcode, '', '', false, '');
203            },
204            getPakTotalPoint: (soldOutYn, goodsList) => {
205                pakTotalPoint = 0;
206                pakMobTotalPoint = 0; // 모바일(적립예정포인트 * 수량 계산하여 표현)
207                for (let j = 0; j < goodsList.length; j++) {
208                    //패키지 대표상품이 품절상품이거나, 필수상품이면서 품절이거나, 필수상품이면서 절판인 경우 전체 패키지 품절표시
209                    if ((goodsList[j].soldOutYn === "Y" && goodsList[j].rqrdYsno === "Y")
210                        || soldOutYn === "Y" || ((goodsList[j].saleCdtnCode !== "001" && goodsList[j].saleCdtnCode !== "008") && goodsList[j].rqrdYsno === "Y")) {
211                        soldOutYn = "Y";
212                    }
213                    pakTotalPoint += parseInt(goodsList[j].upntAcmlAmnt);
214                    pakMobTotalPoint += parseInt(goodsList[j].upntAcmlAmnt) * goodsList[j].requQntt;
215                }
216
217                if (order.utils.isMobile()) {
218                    return pakMobTotalPoint;
219                }
220                return pakTotalPoint;
221            },
222            getPakTotalDscnRate: (combSaleCmdtPrce, soldOutYn, goodsList) => {
223                // 20221213 패키지 할인율 오류 수정
224                pakTotalSaleCmdtSapr = 0;
225                pakTotalAdtnSaleAmnt = 0;
226                pakMobTotalSaleCmdtSapr = 0; // 모바일(할인가 * 수량 계산하여 표현)
227                pakMobTotalSaleCmdtPrce = 0; // 모바일(정가 * 수량 계산하여 표현)
228
229                for (let j = 0; j < goodsList.length; j++) {
230                    //패키지 대표상품이 품절상품이거나, 필수상품이면서 품절이거나, 필수상품이면서 절판인 경우 전체 패키지 품절표시
231                    if ((goodsList[j].soldOutYn === "Y" && goodsList[j].rqrdYsno === "Y")
232                        || soldOutYn === "Y" || ((goodsList[j].saleCdtnCode !== "001" && goodsList[j].saleCdtnCode !== "008") && goodsList[j].rqrdYsno === "Y")) {
233                        soldOutYn = "Y";
234                    }
235                    pakTotalSaleCmdtSapr += goodsList[j].totalSaleCmdtSapr;
236                    pakTotalAdtnSaleAmnt += goodsList[j].adtnSaleAmnt;
237                    pakMobTotalSaleCmdtSapr += ((goodsList[j].totalSaleCmdtSapr + goodsList[j].adtnSaleAmnt) * goodsList[j].requQntt)
238                    pakMobTotalSaleCmdtPrce += ((goodsList[j].saleCmdtPrce + goodsList[j].adtnSaleAmnt) * goodsList[j].requQntt)
239                }
240                pakTotalSaleCmdtSapr += pakTotalAdtnSaleAmnt;
241                pakTotalDscnRate = (1 - ((pakTotalSaleCmdtSapr) / combSaleCmdtPrce)).toFixed(2) * 100;
242
243                //자바스크립트 소수점 버그.(ex 0.14*100)
244                if ((pakTotalDscnRate + "").length > 4) {
245                    pakTotalDscnRate = pakTotalDscnRate.toFixed();
246                }
247
248                return pakTotalDscnRate;
249            },
250            getPakTotalSaleCmdtSapr: () => {
251                if (order.utils.isMobile()) {
252                    return pakMobTotalSaleCmdtSapr;
253                }
254                return pakTotalSaleCmdtSapr;
255            },
256            getPakTotalSaleCmdtPrce: (combSaleCmdtPrce) => {
257                if (order.utils.isMobile()) {
258                    return pakMobTotalSaleCmdtPrce;
259                }
260                return combSaleCmdtPrce;
261            },
262            setTotalPrice: (rcvIndex, totalSaleCmdtSapr, adtnSaleAmnt, requQntt, spbkKindCode, goodsList, pushYn) => {
263                ////console.log(rcvIndex);
264                if (rcvIndex == 0) sumTotalPrice = 0;
265                if (spbkKindCode !== "020") {
266                    sumTotalPrice += (totalSaleCmdtSapr + adtnSaleAmnt) * requQntt;
267                } else {
268                    sumTotalPrice += totalSaleCmdtSapr;
269                }
270
271                //품절상품 제외하고 리스트 담기
272                if (pushYn == 'true') {
273                    cartState.allList.push(goodsList);
274                }
275            },
276            getSumTotalPrice: () => {
277                return sumTotalPrice;
278            }
279        });
280        $("[spbkKindGoodsList]").append(renderRowWrapper);
281    }
282
283    if (!order.utils.isMobile()) {
284        KyoboBookPub.ink.setSpsOffsetData('.cart_calc_wrap.sps');
285    } else {
286        let spsDiv = $('.fold_anchor_box.sps.sps-blw');
287        $(spsDiv).removeClass("sps-blw");
288    }
289}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.