暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

productdetails.js 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. function startDetails(){
  2. // http://127.0.0.1:5502/productdetails.html?productId=106633230000024
  3. if(window.location.search.split('=')[0] == ''){
  4. window.location.href = "/notfound.html";
  5. return;
  6. }
  7. let productId = window.location.search.split('=')[1].split('&')[0];
  8. console.log(productId);
  9. let itemtagscombinationRes = null;
  10. let labels = {};
  11. let isThereInLabel = {};
  12. let currentComb = null;
  13. let group = {};
  14. let loadingActions = {
  15. addLoader(){
  16. $('.loadingCall').removeClass('d-none');
  17. $('.mainContanierProduct').addClass('d-none');
  18. },
  19. removeLoader(){
  20. $('.loadingCall').addClass('d-none');
  21. $('.mainContanierProduct').removeClass('d-none');
  22. }
  23. }
  24. let currentClick = null;
  25. if(productId){
  26. loadingActions.addLoader();
  27. updateProductId(productId);
  28. getProductDetails(productId);
  29. appendSpecs(productId)
  30. }else{
  31. window.location.href = "/notfound.html"
  32. }
  33. function updateProductId(val){
  34. $('#productidtag').val(val);
  35. }
  36. function updateItemId(val){
  37. $('#itemidtag').val(val);
  38. }
  39. let specification_wrap_action = {
  40. remove(){
  41. $('.specification-wrap').addClass('d-none');
  42. },
  43. add(){
  44. $('.specification-wrap').removeClass('d-none');
  45. }
  46. }
  47. let description_action = {
  48. addVal(value){
  49. $('.description-wrap > p').html(value);
  50. },
  51. removeVal(value){
  52. $('.description-wrap > p').html('');
  53. }
  54. }
  55. function getSpecsItemHTML({name,des,itemid,id}){
  56. return `<div id="${id}" data-specitemid="${itemid}" class="">
  57. <div class="row border-bottom">
  58. <div class="col-sm-6 bg-gray-3 py-2">
  59. ${name}
  60. </div>
  61. <div class="col-sm-6 py-2">
  62. ${des}
  63. </div>
  64. </div>
  65. </div>`;
  66. return ` <tr id="${id}" data-specitemid="${itemid}">
  67. <td style="width:200px">${name}</td>
  68. <td class="">${des}</td>
  69. </tr>`;
  70. }
  71. // function getSpecsItemHTML({name,des,itemid,id}){
  72. // return ` <tr id="${id}" data-specitemid="${itemid}">
  73. // <td style="width:200px">${name}</td>
  74. // <td class="">${des}</td>
  75. // </tr>`;
  76. // }
  77. async function appendSpecs(id){
  78. let resData = await API_SERVICES_ACTIONS.getAPIService(`apis/v4/bizgaze/integrations/products/itemspecifications/itemid/${id}`,true);
  79. if(resData.isError){
  80. $('.productdetailstabs').addClass('d-none');
  81. $('.specContainerleft').html('')
  82. $('.specContainerRight').html('')
  83. return;
  84. }
  85. $('.productdetailstabs ').removeClass('d-none');
  86. const res = resData.response;
  87. console.log(JSON.parse(res.result));
  88. const data = JSON.parse(res.result);
  89. console.log(data);
  90. let html = '';
  91. let leftHtml = '';
  92. let rightHtml = '';
  93. if(data.length == 0){
  94. $('.productdetailstabs ').addClass('d-none');
  95. $('.specContainerleft').html('')
  96. $('.specContainerRight').html('')
  97. return;
  98. }
  99. for(let i=0;i<data.length;i++){
  100. const {specificationname,specificationitemid,itemid,description} = data[i];
  101. if((i+1)%2 == 0){
  102. rightHtml += getSpecsItemHTML({
  103. name:specificationname,id:specificationitemid,itemid,des:description
  104. })
  105. }else{
  106. leftHtml += getSpecsItemHTML({
  107. name:specificationname,id:specificationitemid,itemid,des:description
  108. });
  109. }
  110. }
  111. $('.specContainerleft').html(leftHtml)
  112. $('.specContainerRight').html(rightHtml)
  113. }
  114. function getParentHTML(name,productid,id,isMain){
  115. return `<div class="pb-2 $${name?.replace(" ",'')}-parent">
  116. <h5 class="py-2 smallHeadingProductDetails">${name}</h5>
  117. <div class="d-flex gap-2 ${id}container" data-tagid="${id}">
  118. </div>
  119. </div>`;
  120. }
  121. function onClickHandler(e) {
  122. $(e).parent().find('.borderselector').removeClass('borderselector');
  123. $(e).addClass('borderselector')
  124. }
  125. function getChildHTML(tagid,name,isTrue){
  126. return `
  127. <div data-type="${tagid}-${name}" data-tagiditem="${tagid}" class="specsmallcard optiontaganwi ${isTrue?'borderselector':''} card small-font p-3">
  128. ${name}
  129. </div>
  130. `
  131. }
  132. function addeventlisteners(){
  133. $('.optiontaganwi').each(function (i,el){
  134. $(el).click(function (e){
  135. $('#quantity').val(1)
  136. $(e.target).parent().find('.borderselector').removeClass('borderselector');
  137. $(e.target).addClass('borderselector')
  138. searchComb();
  139. currentClick = e.target;
  140. // getAllCombination();
  141. })
  142. });
  143. }
  144. function updateDetailsByObj(obj){
  145. $('.productname').html(obj.itemname)
  146. $('.price').html(obj.pricelist);
  147. appendSpecs(obj.itemid)
  148. $('#skudetailitem').val(obj.sku)
  149. $('.des_productdes').html(obj.itemdescription);
  150. $('#addtocart').attr('data-qty',obj.quantity);
  151. let defaultImg = obj.itemimageurl ? imgServerNameBuild(obj.itemimageurl): `./dist/assets/imgs/nophoto.png`;
  152. console.log(obj.itemimageurl,'obj.itemimageurlobj.itemimageurlobj.itemimageurl');
  153. $('.productDetailsMain > img').attr('src',defaultImg);
  154. updateItemId(obj.itemid);
  155. }
  156. function searchComb(){
  157. let valuesSelected = [];
  158. $('#addtocart').removeClass('disabled');
  159. $('.msgErrorDetailsItem').addClass('d-none');
  160. $('.borderselector').each(function (i,el){
  161. let val = $(el).html();
  162. valuesSelected.push(val.trim());
  163. });
  164. let labelRecord = {};
  165. for(let label in labels){
  166. labelRecord[label] = false;
  167. }
  168. console.log(labelRecord);
  169. specification_wrap_action.add();
  170. console.log(group);
  171. let unFiler = null;
  172. for(let i=0;i<itemtagscombinationRes.length;i++){
  173. const currItem = itemtagscombinationRes[i];
  174. const {tagnames} = currItem;
  175. let isTrue = true;
  176. let labelFilter = labelRecord;
  177. for(let i=0;i<valuesSelected.length;i++){
  178. if(!tagnames.includes(valuesSelected[i])){
  179. isTrue = false
  180. unFiler = labelFilter;
  181. break;
  182. }
  183. labelFilter[group[valuesSelected[i]]] = true;
  184. }
  185. if(isTrue){
  186. console.log(itemtagscombinationRes[i],'itemtagscombinationRes[i]');
  187. const {quantity} = itemtagscombinationRes[i];
  188. if(quantity>=$('#quantity').val() && quantity>=1){
  189. currentComb = itemtagscombinationRes[i];
  190. // $('.productname').html(itemtagscombinationRes[i].itemname)
  191. // $('.price').html(itemtagscombinationRes[i].pricelist);
  192. // location.hash = itemtagscombinationRes[i].itemname.trim();
  193. // appendSpecs(itemtagscombinationRes[i].itemid)
  194. history.replaceState(null, null, `#itemid=${itemtagscombinationRes[i].itemid}#${itemtagscombinationRes[i].itemname.trim()}`);
  195. // $('#skudetailitem').val(itemtagscombinationRes[i].sku)
  196. // $('.des_productdes').html(itemtagscombinationRes[i].itemdescription);
  197. updateDetailsByObj(itemtagscombinationRes[i]);
  198. }else{
  199. let name = itemtagscombinationRes[i].itemname.split('-')[0];
  200. $('#addtocart').addClass('disabled');
  201. let itemsName = name;
  202. $('.borderselector').each(function (i,e){
  203. itemsName += ` ${$(e).html().trim()}`;
  204. });
  205. updateItemId(null);
  206. specification_wrap_action.remove();
  207. $('#skudetailitem').val(-1)
  208. $('.productname').html(itemsName)
  209. history.replaceState(null, null, `#`);
  210. $('.msgErrorDetailsItem').removeClass('d-none');
  211. $('.des_productdes').html('');
  212. $('.price').html('');
  213. }
  214. initAddToCart()
  215. return;
  216. }
  217. }
  218. let name = itemtagscombinationRes[0].itemname.split('-')[0];
  219. let itemsName = name;
  220. $('.borderselector').each(function (i,e){
  221. itemsName += `- ${$(e).html().trim()}`;
  222. })
  223. specification_wrap_action.remove();
  224. $('.productname').html(itemsName)
  225. $('#skudetailitem').val(-1)
  226. $('.price').html('');
  227. $('#addtocart').addClass('disabled');
  228. $('.msgErrorDetailsItem').removeClass('d-none');
  229. initAddToCart()
  230. }
  231. function getAllCombination(){
  232. const currClickAttr = $(currentClick).html().trim();
  233. let isThere = [];
  234. for(let item in isThereInLabel){
  235. let {tagnames} = isThereInLabel[item];
  236. if(tagnames.includes(currClickAttr)){
  237. isThere.push( isThereInLabel[item])
  238. }
  239. }
  240. let selected = [];
  241. $('.borderselector').each(function (i,e){
  242. selected.push($(e).html().trim())
  243. });
  244. // console.log(selected);
  245. // console.log(isThere);
  246. let ishashObj = {};
  247. for(let i=0;i<isThere.length;i++){
  248. let {tagnames,tagids} = isThere[i];
  249. tagnames = tagnames.split('|');
  250. tagids = tagids.split('|');
  251. for(let j=0;j<tagnames.length;j++){
  252. if(!ishashObj[tagnames[j]]){
  253. ishashObj[tagnames[j]] = tagids[j];
  254. }
  255. }
  256. }
  257. // console.log(ishashObj);
  258. // for(let i=0;i<itemtagscombinationRes.length;i++){
  259. // }
  260. }
  261. async function getProductDetails(id){
  262. // let res = await getStatAPIService(`${SERVERNAME}/apis/v4/bizgaze/integrations/products/productattributelist/productid/${id}`);
  263. let resData = await API_SERVICES_ACTIONS.getAPIService(`apis/v4/bizgaze/integrations/products/productattributelist/productid/${id}`,true);
  264. if(resData.isError){
  265. loadingActions.removeLoader();
  266. alert(resData.errorMsg.message);
  267. return;
  268. }
  269. let res = resData.response;
  270. res = JSON.parse(res.result);
  271. // console.log(res);
  272. if(!res) {
  273. loadingActions.removeLoader();
  274. return;
  275. };
  276. let html = '';
  277. for(let i=0;i<res.length;i++){
  278. const currItem = res[i];
  279. // parenttagid means under what label
  280. // tag id means it know unquie id
  281. const {parentattribute,parenttagid,tagid,attribute,productid} = currItem;
  282. if(labels[parentattribute]){
  283. labels[parentattribute].items.push({
  284. attribute,
  285. tagid:tagid
  286. });
  287. }else{
  288. labels[parentattribute] = {
  289. id:parenttagid,
  290. items:[{
  291. attribute,
  292. tagid:tagid
  293. }]
  294. };
  295. html += getParentHTML(parentattribute,productid,parenttagid,i==0);
  296. }
  297. }
  298. $('#spec-container-details').html(html);
  299. // console.log(labels,'labels');
  300. let childIds = [];
  301. for(let item in labels){
  302. let {id,items} = labels[item];
  303. // $(`[data-tagid=${id}]`)
  304. let html = '';
  305. for(let i=0;i<items.length;i++){
  306. const {attribute,tagid} = items[i]
  307. childIds.push(tagid);
  308. group[attribute] = item;
  309. html += getChildHTML(tagid,attribute,i==0);
  310. }
  311. $(`[data-tagid="${id}"]`).html(html);
  312. }
  313. itemtagscombinationRes = await API_SERVICES_ACTIONS.getAPIService(`apis/v4/bizgaze/integrations/products/itemtagscombination/productid/${id}`,true);
  314. itemtagscombinationRes = JSON.parse(itemtagscombinationRes.response.result);
  315. console.log(itemtagscombinationRes);
  316. let valuesSelected = [];
  317. $('.borderselector').each(function (i,el){
  318. let val = $(el).html();
  319. valuesSelected.push(val.trim());
  320. });
  321. let searchParams = window.location.search.split("&");
  322. let skuId = window.location.hash.split('#')[1].split('=')[1];
  323. // skuId = skuId.split('=')[1]
  324. let isGo = true;
  325. for(let i=0;i<itemtagscombinationRes.length;i++){
  326. const currItem = itemtagscombinationRes[i];
  327. const {tagnames,sku,itemid} = currItem;
  328. isThereInLabel[tagnames] = itemtagscombinationRes[i];
  329. let isTrue = true;
  330. if(isGo){
  331. // for(let i=0;i<valuesSelected.length;i++){
  332. // if(!tagnames.includes(valuesSelected[i])){
  333. // isTrue = false
  334. // }
  335. // }
  336. if(skuId != itemid){
  337. isTrue = false
  338. }
  339. if(isTrue){
  340. console.log(itemtagscombinationRes[i],'itemtagscombinationRes[i]');
  341. currentComb = itemtagscombinationRes[i];
  342. // location.hash = itemtagscombinationRes[i].itemname.trim();
  343. // $('.productname').html(itemtagscombinationRes[i].itemname);
  344. // $('#skudetailitem').val(itemtagscombinationRes[i].sku)
  345. // $('.price').html(itemtagscombinationRes[i].pricelist)
  346. // appendSpecs(itemtagscombinationRes[i].itemid);
  347. // $('.des_productdes').html(itemtagscombinationRes[i].itemdescription);
  348. updateDetailsByObj(itemtagscombinationRes[i]);
  349. isGo = false;
  350. let {tagnames,tagids,pricelist} = itemtagscombinationRes[i];
  351. tagids = tagids.split('|');
  352. tagnames = tagnames.split('|');
  353. $('.optiontaganwi').removeClass('borderselector');
  354. for(let i=0;i<tagids.length;i++){
  355. $(`[data-tagiditem="${tagids[i]}"]`).addClass('borderselector');
  356. }
  357. // tagiditem
  358. }
  359. }
  360. }
  361. if(isGo){
  362. console.log(itemtagscombinationRes[0]);
  363. let {tagnames,tagids,pricelist} = itemtagscombinationRes[0];
  364. tagids = tagids.split('|');
  365. tagnames = tagnames.split('|');
  366. $('.optiontaganwi').removeClass('borderselector');
  367. currentComb = itemtagscombinationRes[0];
  368. // updateItemId(itemtagscombinationRes[0].itemid);
  369. for(let i=0;i<tagids.length;i++){
  370. $(`[data-type="${tagids[i]}-${tagnames[i]}"]`).addClass('borderselector');
  371. }
  372. // $('.price').html(pricelist);
  373. // $('.des_productdes').html(itemtagscombinationRes[0].itemdescription);
  374. // appendSpecs(itemtagscombinationRes[0].itemid);
  375. updateDetailsByObj(itemtagscombinationRes[0]);
  376. //console.log(childIds);
  377. //
  378. }
  379. //getAllCombination(valuesSelected)
  380. // for(let i=0;i<itemtagscombinationRes.length;i++){
  381. // const {tagnames} = itemtagscombinationRes[i];
  382. // }
  383. $('#spec-container-details').children().slice(1).find('.specsmallcard').removeClass('specsmallcard');
  384. addeventlisteners();
  385. loadingActions.removeLoader();
  386. return;
  387. // let resTwo = await postStatAPIService(`${SERVERNAME}/apis/v4/bizgaze/integrations/products/itemtagscombination/productid/${id}`);
  388. //let html = '';
  389. let attributesObj = {};
  390. for(let i=0;i<res.length;i++){
  391. const {parentattribute,tagid,productid} = res[i];
  392. // let attributes = await postStatAPIService(`${SERVERNAME}/apis/v4/bizgaze/integrations/products/productattributelist/parenttagid/${tagid}`);
  393. // attributesObj[tagid] = JSON.parse(attributes.data.result);
  394. // console.log(attributes.data.result,tagid);
  395. html += getParentHTML(parentattribute,productid,tagid,i==0);
  396. }
  397. $('#spec-container-details').html(html);
  398. // let attributes = await postStatAPIService(`${SERVERNAME}/apis/v4/bizgaze/integrations/products/productattributelist/parenttagid/${tagid}`);
  399. return;
  400. for(let attr in attributesObj){
  401. const arr = attributesObj[attr];
  402. let html = '';
  403. for(let i=0;i<arr.length;i++){
  404. const {attribute,tagid} = arr[i];
  405. html += getChildHTML(tagid,attribute,i==0);
  406. }
  407. $(`[data-tagid="${attr}"]`).html(html);
  408. }
  409. let defaultValues = await postStatAPIService(`${SERVERNAME}/apis/v4/bizgaze/integrations/products/sellableitemlist/productid/${id}`);
  410. defaultValues = JSON.parse(defaultValues.data.result);
  411. let {itemname,price} = defaultValues[0];
  412. $('.productname').html(itemname);
  413. $('.price').html(price)
  414. $('#spec-container-details').children().slice(1).find('.specsmallcard').removeClass('specsmallcard');
  415. // getQuantityById(id)
  416. }
  417. }
  418. startDetails();