1// å¼å ¥å¸®å©æé®çæç¤º 2import help from '../../config/help.js' 3import hooks from '../../src/hooks/index.js' 4import Template from '../../src/template.js' 5 6/** å½åæä½çpackage */ 7window.messageSelfPackage = null 8/** æ¯å¦æ¯æ¿æ¢ */ 9window.messagesIsReplace = false 10/** æ¯å¦æ¯ç¶ç±»æ·»å ï¼è¿æ¯å级添å */ 11window.messagesCheckTargetIsParent = false 12 13/** æ°æ®çå¬Mssages */ 14class MessagesManage { 15 constructor() { 16 this.receive = ReceiveMessages.ins() 17 // ä¸è£ ä¿®çæ¶åä¸ç¨åå§message 18 if (Utilts.ins().checkDesign()) { 19 this.message() 20 } 21 } 22 /** å便¨¡å¼ */ 23 static ins() { 24 if (!this.instance) return this.instance = new MessagesManage() 25 return this.instance 26 } 27 message() { 28 if (!this.isListenerMessage) { 29 this.isListenerMessage = true 30 window.addEventListener('message', (res) => { 31 res.data.funParam = res.data.funParam || '{}' 32 if (res.data.funName && this.receive[res.data.funName]) { 33 try { 34 this.receive[res.data.funName](JSON.parse(res.data.funParam), JSON.parse(res.data.option || '{}')) 35 } catch (err) { 36 console.error(err) 37 } 38 } 39 }) 40 } 41 } 42} 43 44/** åºç¡å ¬å ±Messagesç¶ç±» */ 45export class BaseMessages { 46 47 /** å½åæä½çpackage */ 48 // static selfPackage 49 /** æ¯å¦æ¯æ¿æ¢ */ 50 // static isReplace 51 /** æ¯å¦æ¯ç¶ç±»æ·»å ï¼è¿æ¯å级添å */ 52 // static checkTargetIsParent 53 54 constructor() { } 55 56 /** ææpackages */ 57 get packages() { 58 return this.design.packages 59 } 60 61 /** designç±» */ 62 get design() { 63 return window.design 64 } 65 66 /** 页é¢ç±»å */ 67 get pageType() { 68 return this.design.ctx.state.page.page_type || 'index' 69 } 70 71 /** æ¸²ææ°æ® */ 72 async render(attr_id, isRefres = false) { 73 await this.design.render(attr_id, isRefres) 74 } 75 76 /** 77 * è·¨åæ§è¡function 78 * @param {String} funName æ¹æ³å 79 * @param {Json} funParam ä¼ å 80 */ 81 postFun(funName, funParam, option) { 82 funParam = typeof funParam === 'object' && typeof funParam.stringify === 'function' ? funParam.stringify() : JSON.stringify(funParam) 83 window.parent.postMessage({ funName, funParam, option: JSON.stringify(option) }, '*') 84 } 85 86 /** 87 * å³åéæ°æ®ï¼ä¹ååºæ°æ®ï¼æä»¥åå¨ç¶ç±»å¥½ä¸ç¹ï¼ 88 * æ·»å packageï¼ä»¥åéæ°æ¸²æ 89 */ 90 async pushPackage(newPackage, option = {}) { 91 const addPackageState = window.ctx.state.addPackageState 92 if (typeof option.messageSelfPackage_attr_id !== 'undefined') window.messageSelfPackage = this.packages[option.messageSelfPackage_attr_id] 93 else if (addPackageState && addPackageState.action) { 94 const { packageItem } = window.ctx.state.addPackageState.thisDesignBox.getInsideData() 95 window.messageSelfPackage = packageItem 96 switch (addPackageState.action) { 97 case 'moduleToGrid': { 98 // module转grid 99 let gridPackage = newPackage.children[0] 100 gridPackage.parent_attr_id = packageItem.parent_attr_id 101 gridPackage.style = Utilts.ins().deepMerge(newPackage.style, gridPackage.style) 102 for (let i = 1; i < newPackage.children.length; i++) { 103 const item = newPackage.children[i]; 104 item.children.forEach(cellItem => { 105 cellItem.parent_attr_id = gridPackage.attr_id 106 gridPackage.children.push(cellItem) 107 }) 108 } 109 newPackage = gridPackage 110 break; 111 } 112 case 'unitToGrid': { 113 // å¨unit䏿·»å grid 114 } 115 } 116 } 117 if (typeof option.messagesIsReplace !== 'undefined') window.messagesIsReplace = option.messagesIsReplace 118 if (typeof option.messagesCheckTargetIsParent !== 'undefined') window.messagesCheckTargetIsParent = option.messagesCheckTargetIsParent 119 120 const hookKey = newPackage.dir === 'unit' ? newPackage.type : newPackage.dir 121 if (hooks[hookKey]) { 122 const hookRes = hooks[hookKey]?.beforePushPackage(newPackage, { 123 messageSelfPackage: window.messageSelfPackage, 124 messagesIsReplace: window.messagesIsReplace, 125 messagesCheckTargetIsParent: window.messagesCheckTargetIsParent 126 }, { ReceiveMessages, PostMessages }) 127 if (hookRes) { 128 newPackage = hookRes 129 } else if (hookRes === false) { 130 return 131 } 132 } 133 134 const newPackageAttrId = await this._getNewPackage(newPackage, window.messageSelfPackage) 135 const packages = this.packages 136 // æ´æ°newPackage 137 newPackage = packages[newPackageAttrId] 138 // 妿æ¯gridæcellå°±å¼¹åºæ·»å ç»ä»¶å¼¹çª 139 if (newPackage.dir === 'grid' || newPackage.dir === 'cell') { 140 // æ´æ°æ¿æ´»çpackage 141 window.messageSelfPackage = newPackage.dir === 'grid' ? newPackage.children[0] : newPackage 142 // æ´æ°æ·»å æ¹å¼ 143 window.messagesCheckTargetIsParent = true 144 // æ´æ°ç¶çº§æ°æ® 145 PostMessages.ins().updataPackage(packages[newPackage.parent_attr_id]) 146 // è¯·æ±æ·»å ç»ä»¶ 147 // PostMessages.ins().choosePackage('unit') 148 } else { 149 PostMessages.ins().updataPackage(packages[newPackage.parent_attr_id]) 150 // å ¶ä»ç就弹åºç¼è¾å¼¹çª 151 if (newPackage.dir === 'unit') { 152 PostMessages.ins().editPackage(newPackage.designBox) 153 } 154 } 155 PostMessages.ins().addRecord(newPackage.dir) 156 window.messagesIsReplace = false 157 if (option.callback) { 158 this.postFun(option.callback, newPackage) 159 } 160 } 161 162 // å¤çæ°æ·»å çpackage 163 async _getNewPackage(newPackage, selfPackage) { 164 const addPackageState = window.ctx.state.addPackageState 165 166 let newPackageAttrId = newPackage.attr_id 167 // å¦æç®æ æ¯ç¶çº§ï¼å°±å¾å½åçå级添å 168 if (window.messagesCheckTargetIsParent) { 169 selfPackage.children.push(newPackage)
170 await selfPackage.init() 171 await this.render(selfPackage.attr_id) 172 newPackageAttrId = selfPackage.children[0].attr_id 173 return newPackageAttrId 174 } 175 176 // å¦æç®æ æ¯å级ï¼å°±å¾åä¸ä¸ªæå ¥ï¼æè æ ¹æ® addPackageState.insertIndex 177 const pdata = this.packages[selfPackage.parent_attr_id] 178 let index = 0 179 if (!window.messagesIsReplace && addPackageState && typeof addPackageState.insertIndex === 'number') { 180 index = addPackageState.insertIndex 181 } else { 182 index = pdata.children.findIndex(item => item.attr_id === selfPackage.attr_id) 183 } 184 // å¦ææ¯æ¿æ¢å°±ä½¿ç¨æ¿æ¢ç䏿 ï¼åä¹åå颿·»å æ¯æ·»å 185 if (window.messagesIsReplace) pdata.children[index] = newPackage //æ¿æ¢ 186 else pdata.children.splice(index + 1, 0, newPackage) //æ·»å 187 await pdata.init() 188 await this.render(pdata.attr_id) 189 // å¦ææ¯æ¿æ¢æ¯index,æ·»å æ¯index+1 190 const newIndex = window.messagesIsReplace ? index : index + 1 191 newPackageAttrId = pdata.children[newIndex].attr_id 192 return newPackageAttrId 193 } 194} 195/** æäº¤æ¹æ³å°è£ ä¿®Messages */ 196export class PostMessages extends BaseMessages { 197 constructor() { 198 super() 199 } 200 /** å便¨¡å¼ */ 201 static ins() { 202 if (!this.instance) return this.instance = new PostMessages() 203 return this.instance 204 } 205 206 /** åå§åè£ ä¿®data */ 207 initDesignData(data) { 208 this.postFun('initDesignData', data) 209 } 210 /** æ·»å Package */ 211 addPackage(designBox, targetDir) { 212 let { packageItem, $selfDoc } = designBox.getInsideData() 213 if (!packageLimit(packageItem)) return 214 215 let hookKey = packageItem.dir === 'unit' ? packageItem.type : packageItem.dir 216 let hookRes = hooks[hookKey]?.beforeAddPackage(designBox, targetDir) 217 if (hookRes === false) return 218 219 if (hookRes?.dir) { 220 packageItem = hookRes 221 // console.log(`packageItem = hookRes`, packageItem); 222 223 } 224 window.messageSelfPackage = packageItem 225 window.messagesIsReplace = false //䏿¯æ¿æ¢ï¼æ¯æ·»å 226 const isGridToCell = packageItem.dir === 'grid' && targetDir === 'cell' 227 const isCellToCell = packageItem.dir === 'cell' && targetDir === 'cell' 228 if (isGridToCell || isCellToCell) { 229 if (isGridToCell) window.messagesCheckTargetIsParent = true 230 if (isCellToCell) window.messagesCheckTargetIsParent = false 231 this.pushPackage(this.design.getCell(packageItem)) 232 return 233 } 234 window.messagesCheckTargetIsParent = packageItem.dir !== targetDir 235 this.choosePackage(targetDir, { addPackageState: window.ctx.state.addPackageState }) 236 } 237 /** å é¤Package */ 238 deletePackage(designBox) { 239 new Modal().confirm('æ¯å¦ççå é¤ï¼', '请确认', { cancelText: 'åæ¶', submitText: 'ç¡®å®' }) 240 .then(() => { 241 let { packageItem, $selfDoc } = designBox.getInsideData() 242 243 packageItem.hook?.beforeDeletePackage(designBox, { ReceiveMessages, PostMessages }) 244 if (window.app.info.page.page_type === 'all_pop_up' && packageItem.dir === 'module') { 245 $selfDoc.previousElementSibling.remove() 246 } 247 $selfDoc.remove() 248 const pdata = this.packages[packageItem.parent_attr_id] 249 pdata.children = pdata.children.filter(item => item.attr_id !== packageItem.attr_id) 250 pdata.designBox.checkBlank() 251 this.postFun('deletePackage', packageItem) 252 UtiltsMesssages.ins().updateMessage(packageItem) //æ´æ°å¹¿åå¯¼èª 253 }) 254 } 255 /** ä¿®æ¹Package */ 256 editPackage(designBox) { 257 let { packageItem } = designBox.getInsideData() 258 this.postFun('editPackage', packageItem) 259 } 260 hidePc(designBox) { 261 let { packageItem } = designBox.getInsideData() 262 this.postFun('editShow', packageItem) 263 } 264 hidePad(designBox) { 265 let { packageItem } = designBox.getInsideData() 266 this.postFun('editShow', packageItem) 267 } 268 hidePhone(designBox) { 269 let { packageItem } = designBox.getInsideData() 270 this.postFun('editShow', packageItem) 271 } 272 /** æ¶èpackage */ 273 collectPackage(designBox) { 274 let { packageItem, $selfDoc } = designBox.getInsideData() 275 const isCollected = this.packages[$selfDoc.getAttribute('id')]['is_collected'] 276 if (isCollected) { 277 this.postFun('cancelCollectPackage', packageItem) 278 } else { 279 this.packages[$selfDoc.getAttribute('id')]['is_collected'] = 1 280 $selfDoc.setAttribute('is-collect', 1) 281 282 const $icon = $selfDoc.querySelector('.icon-shoucang-empty') 283 if ($icon) { 284 $icon.classList.add('icon-shoucang') 285 $icon.classList.remove('icon-shoucang-empty') 286 } 287 288 const data = {}
289 packageItem.children.forEach(thisGrid => { 290 data[thisGrid.attr_id] = thisGrid 291 thisGrid.children.forEach(thisCell => { 292 data[thisCell.attr_id] = thisCell 293 thisCell.children.forEach(thisUnit => { 294 data[thisUnit.attr_id] = thisUnit 295 }) 296 }) 297 }) 298 299 this.postFun('collectPackage', { ...packageItem, block_type: this.packages[packageItem.parent_attr_id].type }) 300 } 301 } 302 /** éæ©package */ 303 choosePackage(targetDir, option) { 304 this.postFun('choosePackage', { targetDir, selfPackage: window.messageSelfPackage }, option) 305 } 306 /** æ·»å æ¨¡åæç»ä»¶æ¶ï¼ç¹å»éä¸äºä»¶ */ 307 checkedPackage() { 308 this.postFun('checkedPackage', this.design.ctx.state.postCtxState.renderPackage) 309 } 310 /** æ´æ°packages */ 311 updataPackage(data) { 312 this.postFun('updataPackage', data) 313 } 314 /** æ·»å è®°å½ */ 315 addRecord(dir, pageDir = '') { 316 const typeStr = { page: 'ç¼è¾é¡µé¢è®°å½', block: 'ç¼è¾æ¿åè®°å½', module: 'æ·»å æ¨¡åè®°å½', grid: 'æ·»å å¸å±è®°å½', cell: 'æ·»å å æ ¼è®°å½', unit: 'æ·»å ç»ä»¶è®°å½' } 317 this.postFun('postAddRecord', pageDir ? typeStr[pageDir] : typeStr[dir]) 318 } 319 /** æäº¤iframe é«åº¦ */ 320 postIframeHeight(data) { 321 this.postFun('postIframeHeight', data) 322 } 323 /** æäº¤Ifram å è½½è¿åº¦ */ 324 postIframeIsLoading(isLoading) { 325 this.postFun('postIframeIsLoading', { src: this.design.ctx.query.render, isLoading }) 326 } 327 /**å¤å¶Package */ 328 copyPackage(designBox) { 329 let { packageItem } = designBox.getInsideData() 330 if (!packageLimit(packageItem)) return 331 packageItem = packageItem.hook?.beforeCopyPackage(designBox, { ReceiveMessages, PostMessages }) 332 if (!packageItem) return 333 // å级 334 window.messagesCheckTargetIsParent = false 335 window.messageSelfPackage = packageItem 336 window.messagesIsReplace = false 337 338 let newPackage = JSON.parse(JSON.stringify(packageItem)) 339 // æ´æ°attr_idãsign 340 function loopFunc(node, parentNode) { 341 node.sign = globalThis.Server.getSign() 342 node.attr_id = `${node.dir}-${node.sign}` 343 if (node.config) { 344 for (const key in node.config) { 345 const item = node.config[key] 346 for (const key in item) { 347 if (/sign$/.test(key)) { 348 item[key] = globalThis.Server.getSign() 349 } 350 } 351 } 352 } 353 for (const key in node.style) { 354 node.style[key].sign = globalThis.Server.getSign() 355 } 356 if (parentNode) node.parent_attr_id = parentNode.attr_id 357 if (node.name_sign) node.name_sign = globalThis.Server.getSign() 358 if (node.dir === 'unit' && node.content) { 359 node.content.data.forEach(item => { 360 for (const key in item) { 361 if (/sign$/.test(key)) { 362 item[key] = globalThis.Server.getSign() 363 } 364 } 365 }) 366 367 if (node.content.type === 'detail') node.content.relate_list = node.content.data?.map(p => p.sign) || [] 368 } 369 370 node.children?.forEach(item => { 371 loopFunc(item, node) 372 }) 373 } 374 loopFunc(newPackage); 375 376 this.pushPackage(newPackage) 377 } 378 /** æ¿æ¢æ¨¡å */ 379 replacePackage(designBox) { 380 let { packageItem } = designBox.getInsideData() 381 // å级添å ,䏿¯ç¶çº§æ·»å 382 window.messagesCheckTargetIsParent = false 383 window.messageSelfPackage = packageItem 384 // æ¿æ¢package 385 window.messagesIsReplace = true 386 this.postFun('replacePackage', packageItem) 387 } 388 /**ä¸ç§»Package */ 389 moveUpPackage(designBox) { 390 const { pitems, parent, currentIndex } = this._getCurrentNode(designBox) 391 let { packageItem, $selfDoc } = designBox.getInsideData() 392 //妿䏿¯ç¬¬ä¸ä¸ªèç¹ 393 if (currentIndex !== 0) { 394 //æå½å第ä¸ä¸ªèç¹ä¸ç§» 395 parent.insertBefore($selfDoc, pitems[currentIndex - 1]) 396 this._getMovePackage(packageItem, 1) 397 UtiltsMesssages.ins().updateMessage(packageItem) //æ´æ°å¹¿åå¯¼èª 398 this.packages[packageItem.attr_id].hook?.afterMovePackage(this.packages[packageItem.attr_id], 1, { ReceiveMessages, PostMessages }) 399 } 400 } 401 /**ä¸ç§»Package */ 402 moveDownPackage(designBox) { 403 const { pitems, parent, currentIndex } = this._getCurrentNode(designBox) 404 let { packageItem } = designBox.getInsideData() 405 //妿䏿¯æåä¸ä¸ªèç¹ 406 if (currentIndex !== pitems.length - 1) { 407 //æå½åä¸ç§»çèç¹ç§»ä¸æ¥ï¼ä¹å°±æ¯ä¸ç§» 408 parent.insertBefore(pitems[currentIndex + 1], pitems[currentIndex]) 409 this._getMovePackage(packageItem, -1) 410 UtiltsMesssages.ins().updateMessage(packageItem) //æ´æ°å¹¿åå¯¼èª 411 this.packages[packageItem.attr_id].hook?.afterMovePackage(this.packages[packageItem.attr_id], -1, { ReceiveMessages, PostMessages }) 412 } 413 } 414 /**çæPackage */ 415 generatePackage(designBox) { 416 // const { pitems, parent, currentIndex } = this._getCurrentNode(designBox) 417 let { packageItem, $selfDoc } = designBox.getInsideData() 418 if ($selfDoc.getAttribute('package-item') !== 'module') { 419 const parentModule = Utilts.ins().getParents($selfDoc, { attrName: 'package-item', attrValue: 'module' }) 420 packageItem.module_code = parentModule[0].getAttribute('co
420de') || '' 421 } 422 this.postFun('generatePackage', packageItem) 423 } 424 /**çæPackage */ 425 clearStyle(designBox) { 426 const { packageItem } = designBox.getInsideData() 427 let newPackage = JSON.parse(JSON.stringify(packageItem)) 428 for (const key in newPackage.style) { 429 for (const key2 in newPackage.style[key]) { 430 if (Object.prototype.toString.call(newPackage.style[key][key2]) === '[object Object]' && ['default', 'md', 'xl'].includes(key2)) newPackage.style[key][key2] = {} 431 } 432 } 433 newPackage.transfer = '' 434 // console.log('newPackage1', newPackage); 435 this.postFun('clearStyle', newPackage) 436 } 437 /**æ è®°Package */ 438 markPackage(designBox) { 439 // const { pitems, parent, currentIndex } = this._getCurrentNode(designBox) 440 let { packageItem, $selfDoc } = designBox.getInsideData() 441 if ($selfDoc.getAttribute('package-item') !== 'module') { 442 const parentModule = Utilts.ins().getParents($selfDoc, { attrName: 'package-item', attrValue: 'module' }) 443 packageItem.module_code = parentModule[0].getAttribute('code') 444 } 445 this.postFun('markPackage', packageItem) 446 } 447 /**å¸®å©æç¤ºè®¾ç½® */ 448 showHelp(designBox) { 449 let { packageItem } = designBox.getInsideData() 450 const { title, desc, img, mark } = help[packageItem.type] 451 let markHtml = '' 452 if (mark) { 453 markHtml = `<br/>${mark}` 454 } 455 new Modal().info(`<div class='help-box'>${desc}</div> 456 <a href="${img}" target="_blank" style="cursor: pointer;"><img src="${img}" alt=""></a> 457 <div>${markHtml}<br/>妿æ¨éè¦å¸®å©ï¼è¯·è®¿é®æä»¬ç<a href="https://www.lifisher.com/help.html" target="_blank" style="color: #00f;cursor: pointer;">帮å©ä¸å¿</a>页é¢ä»¥è·åæ´å¤å®æ´çæç¨å表</div>`, `ç»ä»¶(${title})说æ`).open() 458 } 459 /** 460 * ä¿åé¡µé¢ 461 * @param {*} pageParams ä¿åçç±»å 462 */ 463 savePage(pageParams) { 464 // console.log('pageParams', pageParams); 465 this.postFun('savePage', { data: this.design.ctx.state, pageParams }) 466 } 467 generatePageStyle(option) { 468 this.postFun('generatePageStyle', { data: this.design.ctx.state, option }) 469 } 470 /** 页颿ªå¾ */ 471 initPageThumb(data, flag, picture_type) { 472 this.postFun('initPageThumb', { base64: data, flag, picture_type }) 473 } 474 /** ååºè£ ä¿®åéè¿æ¥çåå§åå ¨å±æ ·å¼è®¾ç½® */ 475 initGlobalSiteStyle() { 476 this.postFun('initGlobalSiteStyle', this.design.ctx.state.site.style) 477 } 478 /** ä¿®æ¹html */ 479 modifyUnitHtml(packageItem) { 480 this.postFun('modifyUnitHtml', packageItem) 481 this.postFun('postAddRecord', 'ææ¬ä¿®æ¹') 482 } 483 484 /** åé页颿¸²æå®æ */ 485 loadPageComplete() { 486 this.postFun('loadPageComplete', true) 487 } 488 /** 489 * ç§»å¨ä½ç½® 490 * @param {*} data ç§»å¨çèç¹ 491 * @param {*} type 1ä¸ç§»-1ä¸ç§» 492 */ 493 _getMovePackage(targetPackage, type) { 494 // æ¾å°å½åç§»å¨çç¶çº§ 495 const parentData = this.packages[targetPackage.parent_attr_id] 496 // æ¾å°å½åç§»å¨çä½ç½® 497 const currentIndex = parentData.children.findIndex(item => item.attr_id === targetPackage.attr_id) 498 // å½åä½ç½®å¤§äº0æå¤ç 499 if (currentIndex >= 0) { 500 if (type === 1) { //ä¸ç§» 501 const item = parentData.children[currentIndex - 1] 502 parentData.children[currentIndex - 1] = parentData.children[currentIndex] 503 parentData.children[currentIndex] = item 504 } else if (type === -1) { //ä¸ç§» 505 const item = parentData.children[currentIndex + 1] 506 parentData.children[currentIndex + 1] = parentData.children[currentIndex] 507 parentData.children[currentIndex] = item 508 } 509 //æäº¤ç§»å¨ä½ç½®å°design 510 this.postFun('movePackage', [targetPackage, type]) 511 } 512 } 513 /** 514 * è·åå½åè¦ç§»å¨èç¹çåºæ¬ä¿¡æ¯ 515 * @return {$selfDoc, pitems, parent, currentIndex } 516 * pitems å½ånodeç¶ç±»ä¸çåèç¹æ°ç»ï¼ 517 * parent å½ånodeç¶èç¹ 518 * currentIndex å½ånodeç䏿 519 */ 520 _getCurrentNode(designBox) { 521 let { packageItem, $selfDoc } = designBox.getInsideData() 522 const parent = $selfDoc.parentNode 523 this._del_ff(parent) 524 const pitems = Array.from(parent.childNodes)
525 let currentIndex = pitems.findIndex(item => item.id === packageItem.attr_id) 526 return { pitems, parent, currentIndex } 527 } 528 529 /** å é¤parent.childNodes é颿²¡ç¨çtextèç¹ */ 530 _del_ff(elem) { 531 var elem_child = elem.childNodes; 532 for (var i = 0; i < elem_child.length; i++) { 533 if (elem_child[i].nodeName == "#text" && !/\s/.test(elem_child.nodeValue)) { 534 elem.removeChild(elem_child[i]); //表示循ç¯çåªä¸ä¸ªå¦ææ¯ç©ºæææ¬å°±å 餿ï¼[i]ä¸å®ä¸è½å°ã 535 } 536 } 537 } 538 539 getExternalContent(data, target, method) { 540 this.postFun('getExternalContent', { data, target, method }) 541 } 542} 543 544/** æ¥æ¶è£ ä¿®ä¼ è¿æ¥çæ¹æ³Messages */ 545export class ReceiveMessages extends BaseMessages { 546 constructor() { 547 super() 548 } 549 /** å便¨¡å¼ */ 550 static ins() { 551 if (!this.instance) return this.instance = new ReceiveMessages() 552 return this.instance 553 } 554 /** ä¿®æ¹è£ ä¿®æ°æ® */ 555 async editDesignData({ page }) { 556 this.design.ctx.state.page = page 557 } 558 /** çæé¡µé¢æ ·å¼ */ 559 generatePageStyle(option) { 560 PostMessages.ins().generatePageStyle(option) 561 } 562 /** ä¿®æ¹é¡µé¢ä»¥åéæ°æ¸²æ */ 563 async editPageStyle(data) { 564 const mergeObj = (p, obj) => { 565 for (let attr in obj) { 566 if (['var(--main-color)', 'var(--sub-color1)', 'var(--sub-color2)', 'var(--sub-color3)'].includes(p[attr])) continue; 567 p[attr] = typeof obj[attr] === 'object' ? mergeObj(p[attr] ? p[attr] : {}, obj[attr]) : obj[attr] 568 } 569 return p 570 } 571 572 for (let id in data['packages']) { 573 await this.packages[id].init(mergeObj(this.packages[id], data['packages'][id])) 574 } 575 576 const siteStyle = JSON.parse(JSON.stringify(this.design.ctx.state.site.style)) 577 const selectors = [':root', '[button-style="2"] .btn', '[button-style="1"] .btn', '[form-style="2"] .unit-form__control', '[form-style="2"] .unit-form__item-inner', '[form-style="1"] .unit-form__control', '[form-style="1"] .unit-form__item-inner'] 578 const terminals = ['default', 'md', 'xl'] 579 selectors.forEach(selector => { 580 terminals.forEach(terminal => { 581 Object.keys(data['color_mode']['main'][selector]).forEach(attr => { 582 siteStyle[selector][terminal][attr] = data['color_mode']['main'][selector][attr] 583 }) 584 }) 585 }) 586 587 this.design.ctx.state.site.style.init(siteStyle) 588 await this.design.renderCss() 589 590 this.design.ctx.state.template.color_mode_list = data['color_mode'] 591 this.postFun('updatePageColor', this.design.ctx.state) 592 } 593 /** ä¿®æ¹å 以åéæ°æ¸²æ */ 594 async editPackage(data, option = {}) { 595 const packages = this.packages 596 await packages[data.attr_id].init(data) 597 packages[data.attr_id].hook?.afterEditPackage(packages[data.attr_id], { ReceiveMessages, PostMessages }) 598 await this.render(data.attr_id) 599 // ä¿®æ¹éæ°æ¸²æä»¥åææ°çæ°æ®æ¨éç»è£ ä¿®ï¼éæ°æ´æ°ã 600 PostMessages.ins().updataPackage(packages[data.attr_id]) 601 UtiltsMesssages.ins().updateMessage(data) //æ´æ°å¹¿åå¯¼èª 602 if (option.callback) { 603 this.postFun(option.callback, data) 604 } 605 } 606 /** æ¹éå é¤package */ 607 deleteRelatePackage(packageData) { 608 if (!Array.isArray(packageData.package_list)) return 609 const parent_attr_id_map = {} 610 611 packageData.package_list.forEach(item => { 612 const designBox = this.packages[item.attr_id]?.designBox 613 if (designBox) { 614 let { packageItem, $selfDoc } = designBox.getInsideData() 615 $selfDoc?.remove() 616 617 if (!parent_attr_id_map[packageItem.parent_attr_id]) { 618 parent_attr_id_map[packageItem.parent_attr_id] = new Set([packageItem.attr_id]) 619 } else { 620 parent_attr_id_map[packageItem.parent_attr_id].add(packageItem.attr_id) 621 } 622 } 623 }) 624 625 for (const parent_attr_id in parent_attr_id_map) { 626 const set = parent_attr_id_map[parent_attr_id] 627 const pdata = this.packages[parent_attr_id] 628 const deletedPackages = pdata.children.filter(item => set.has(item.attr_id)) 629 pdata.children = pdata.children.filter(item => !set.has(item.attr_id)) 630 pdata.designBox.checkBlank() 631
632 deletedPackages.forEach(packageItem => { 633 UtiltsMesssages.ins().updateMessage(packageItem) //æ´æ°å¹¿åå¯¼èª 634 }) 635 } 636 637 this.postFun('deleteRelatePackage', packageData) 638 } 639 /** æ ¹æ®æ·»å ç»ä»¶ææ·»å 模åpostè¿æ¥çæ°æ®æ¸²æ */ 640 async postRenderData(ctxState) { 641 // ä¸è½åºç°design-box 642 // 使ç¨postMassageä¼ è¿æ¥çæ°æ®è¿è¡æ¸²æ 643 this.design.ctx.state.postCtxState = ctxState 644 // æäº¤æ¨¡åæç»ä»¶å è½½ç¶æï¼å¨renderéé¢è®¾ç½®ä¸ºtrue表示å è½½å®æ 645 PostMessages.ins().postIframeIsLoading(false) 646 // designä¼çå¬receiveCtxStateäºä»¶ï¼ç»§ç»å®ææ°æ®å¤çç¶åææ¸²æ 647 window.dispatchEvent(new CustomEvent('receiveCtxState')) 648 window.updataWindowHeightInterval = setInterval(() => { 649 this.postWindowHeight() 650 }, 500) 651 } 652 653 /** æ¤åï¼è¿åï¼éæ°æ¸²æ */ 654 async refresRender(data) { 655 if (data.template.color_mode_list) { 656 this.design.ctx.state.template.color_mode_list = data.template.color_mode_list 657 } 658 if (data.site && data.site.style) { 659 this.design.ctx.state.site.style.init(data.site.style) 660 } 661 662 if (data.template && data.template.block) { 663 const packages = this.packages 664 const all = [] 665 Object.keys(data.template.block).forEach(async (key) => { 666 all.push(new Promise(async (resolve, reject) => { 667 const block = data.template.block[key] 668 await packages[block.attr_id].init(block) 669 resolve() 670 })) 671 }) 672 await Promise.all(all) 673 await this.render('app', true) 674 } 675 } 676 677 /** 678 * è°ç¨main模å 679 * positionï¼-1 æå ¥å¨åé¢ï¼0 æ¿æ¢ï¼1 追å å¨åé¢ 680 */ 681 async invokeModule({ packageData, position, blockList, isSameSiteId }) { 682 const res = packageData 683 let parentPackage = {} 684 let commonPackage = { 685 header: null, 686 breadcrumb: null, 687 footer: null, 688 copyright: null 689 } 690 for (let k in this.packages) { 691 if (this.packages[k]['dir'] === 'block') { 692 if (this.packages[k]['type'] === 'main') { 693 parentPackage = this.packages[k] 694 } else if (Object.keys(commonPackage).includes(this.packages[k]['type']) && blockList.includes(this.packages[k]['type'])) { 695 commonPackage[this.packages[k]['type']] = this.packages[k] 696 } 697 } 698 } 699 700 let appendPackage = [] 701 if (position < 1) { 702 if (position === -1) { 703 appendPackage = parentPackage.children 704 } 705 parentPackage.children = [] 706 } 707 708 // æ´æ°attr_idãsign 709 function loopFunc(node, parentNode) { 710 node.sign = globalThis.Server.getSign() 711 node.attr_id = `${node.dir}-${node.sign}` 712 if (node.config) { 713 for (const key in node.config) { 714 const item = node.config[key] 715 for (const key in item) { 716 if (/sign$/.test(key)) { 717 item[key] = globalThis.Server.getSign() 718 } 719 } 720 } 721 } 722 for (const key in node.style) { 723 node.style[key].sign = globalThis.Server.getSign() 724 } 725 if (parentNode) node.parent_attr_id = parentNode.attr_id 726 if (node.name_sign) node.name_sign = globalThis.Server.getSign() 727 if (node.dir === 'unit' && node.content && node.content.type === 'detail') { 728 node.content.data.forEach(item => { 729 for (const key in item) { 730 if (/sign$/.test(key)) { 731 item[key] = globalThis.Server.getSign() 732 } 733 } 734 }) 735 736 node.content.relate_list = node.content.data?.map(p => p.sign) || [] 737 } 738 739 node.children?.forEach(item => { 740 loopFunc(item, node) 741 }) 742 } 743 function updateRelate(node) { 744 if (node.dir === 'unit' && node.content && node.content.type === 'detail' && !isSameSiteId) { 745 if (node.config?.list_nav) node.config.list_nav.column = '' 746 } 747 node.children?.forEach(item => { 748 updateRelate(item, node) 749 }) 750 } 751 752 const invokeCtx = JSON.parse(JSON.stringify(this.design.ctx)) 753 invokeCtx.state.postCtxState = { templateData: res } 754 invokeCtx.state.$t = this.design.ctx.state.$t 755 invokeCtx.state.request = this.design.ctx.state.request 756 757 invokeCtx.state.template = new Template(invokeCtx)
758 await invokeCtx.state.template.init() 759 invokeCtx.state.template.block.main.children.forEach(module => { 760 if (position) loopFunc(module, parentPackage) 761 parentPackage.children.push(module) 762 }) 763 let packageArr = [] 764 const designBlock = this.design.ctx.state.template.block 765 for (let blockType in commonPackage) { 766 if (commonPackage[blockType]) { 767 invokeCtx.state.template.block[blockType].children.forEach(module => { 768 updateRelate(module) 769 }) 770 designBlock[blockType] = invokeCtx.state.template.block[blockType] 771 document.querySelector('[package-block-type="' + blockType + '"]').id = designBlock[blockType].attr_id 772 await designBlock[blockType].init() 773 await this.render(designBlock[blockType].attr_id) 774 PostMessages.ins().updataPackage(designBlock[blockType]) 775 } 776 } 777 778 if (appendPackage.length) { 779 appendPackage.forEach(async module => { 780 parentPackage.children.push(module) 781 }) 782 } 783 packageArr.push(parentPackage) 784 packageArr.forEach(async (val) => { 785 await val.init() 786 await this.render(val.attr_id) 787 PostMessages.ins().updataPackage(val) 788 }) 789 PostMessages.ins().addRecord('', 'page') 790 } 791 792 /** 793 * ä¿åé¡µé¢ 794 * @param {*} saveType ä¿åçç±»åï¼å为ä¿å页é¢ï¼åå¸å°æ¨¡æ¿ï¼åå¸å°é¡µé¢åº 795 */ 796 postSavePage(data) { 797 PostMessages.ins().savePage(data) 798 } 799 // å¹³æ»æ»å¨å°éç¹ 800 toScroll(flag) { 801 const scroll_content = document.querySelector('body') 802 const total = document.body.scrollHeight 803 let distance = scroll_content.scrollTop 804 let step = total / 50 805 console.log('--------------', total, distance); 806 if (total > distance) { 807 smoothDown() 808 } 809 function smoothDown() { 810 console.log('-***', distance); 811 if (distance < total) { 812 distance += step 813 window.scrollTo({ 814 top: distance, 815 behavior: 'smooth' 816 }) 817 setTimeout(smoothDown, 100) 818 } else { 819 window.scrollTo({ 820 top: total, 821 behavior: 'smooth' 822 }) 823 setTimeout(() => { 824 html2canvas(document.querySelector('body'), { 825 useCORS: true, 826 ignoreElements: element => { 827 if (element.classList.value.indexOf('design-box') > -1) return true 828 return false 829 } 830 }) 831 .then(canvas => { 832 window.scrollTo({ 833 top: 0, 834 behavior: 'smooth' 835 }) 836 document.querySelector('[package-group="widget"]').style.display = 'block' 837 PostMessages.ins().initPageThumb(canvas.toDataURL('image/png'), flag) 838 }) 839 }, 5000); 840 } 841 } 842 } 843 844 /** ä¿åé¦é¡µæ¶ï¼æªå¾ */ 845 async getPicture({ flag, picture_type }) { 846 await new Load('/assets/plugins/html2canvas.min.js') 847 document.querySelector('[package-group="widget"]').style.display = 'none' 848 // this.toScroll(flag) 849 html2canvas(document.querySelector('body'), { 850 useCORS: true, 851 ignoreElements: element => { 852 if (element.classList.value.indexOf('design-box') > -1) return true 853 return false 854 } 855 }) 856 .then(canvas => { 857 document.querySelector('[package-group="widget"]').style.display = 'block' 858 PostMessages.ins().initPageThumb(canvas.toDataURL('image/png'), flag, picture_type) 859 }).catch(err => { 860 console.log('html2canvas error', err) 861 PostMessages.ins().initPageThumb('', flag, picture_type) 862 }) 863 } 864 865 /** ååºæ·»å 模åæç»ä»¶ */ 866 getWindowHeight() { 867 this.postWindowHeight() 868 } 869 870 /** åæ¶æ¶è */ 871 cancelCollectPackage(params) { 872 const $dom = document.querySelector('#module-' + params.sign) 873 if ($dom) { 874 this.packages['module-' + params.sign]['is_collected'] = 0 875 $dom.setAttribute('is-collect', 0) 876 } 877 const $icon = $dom.querySelector('.icon-shoucang') 878 if ($icon) { 879 $icon.classList.remove('icon-shoucang') 880 $icon.classList.add('icon-shoucang-empty') 881 } 882 } 883 884 /** æäº¤iframe é«åº¦ */ 885 postWindowHeight() { 886 if (window.windowHeight && window.windowHeight === document.querySelector('html').offsetHeight) return 887 window.windowHeight = document.querySelector('html').offsetHeight 888 PostMessages.ins().postIframeHeight({ src: this.design.ctx.query.render, height: window.windowHeight }) 889 } 890 891 /** ååºè£ ä¿®åéè¿æ¥çåå§åå ¨å±æ ·å¼è®¾ç½® */ 892 initGlobalSiteStyle(siteStyle) { 893 this.design.ctx.state.site.style.init(siteStyle) 894 // æ¸²ææ ·å¼ 895 this.design.renderCss() 896 //å°éæ°æ¸²æçç»ç»æè¿åç»è£ ä¿® 897 PostMessages.ins().initGlobalSiteStyle() 898 } 899
900 /** éæ°è®¾ç½®å ¨å±æ ·å¼ */ 901 siteStyle(data) { 902 this.design.ctx.state.site.style.init(data) 903 // è·åæ ·å¼ 904 this.design.renderCss() 905 //å°éæ°æ¸²æçç»ç»æè¿åç»è£ ä¿® 906 PostMessages.ins().initGlobalSiteStyle() 907 } 908 909 /** éæ°è®¾ç½®å ¨å±ç»ä»¶é ç½® */ 910 siteUnitConfig(data) { 911 this.design.ctx.state.site.unit_config = data 912 const formList = document.querySelectorAll('[form-common="1"]') 913 formList.forEach(async item => { 914 await window.design.render(item.querySelector('form').getAttribute('id').replace('inquiry-', '')) 915 }) 916 } 917 918 /** ä¿®æ¹ç«ç¹å±æ§ */ 919 updateSiteAttr(info) { 920 this.design.ctx.state.site[info.attr] = info.value 921 this.design.updateRenderAttr(info) 922 } 923 924 /** å ¨å±siteç«ç¹å±æ§è¿å */ 925 resetRenderAttr() { 926 this.design.resetRenderAttr() 927 } 928 929 /** éç½®ç«ç¹å±æ§,æ ·å¼æé¤ */ 930 resetSiteAttr(siteAttr) { 931 Object.keys(siteAttr).forEach(key => { 932 if (key !== 'style' && key !== 'recordSiteAttr') { 933 this.design.ctx.state.site[key] = siteAttr[key] 934 935 if (key === 'unit_config') { 936 const formList = document.querySelectorAll('[form-common="1"]') 937 formList.forEach(async item => { 938 await window.design.render(item.querySelector('form').getAttribute('id').replace('inquiry-', '')) 939 }) 940 } 941 } 942 }) 943 } 944 945 /** é置页é¢å¯¼èª */ 946 async resetSiteNav() { 947 await this.design.resetSiteNav() 948 } 949 950 /** è®¾ç½®è£ ä¿®æ¨¡å¼ */ 951 setDesignMode(type) { 952 const attribute = document.querySelector('body').attributes['design-mode'] 953 if (attribute) attribute.nodeValue = type 954 } 955 956 /** 设置å½åå¯ä»¥éæ°å è½½å¨ææ°æ® */ 957 updateDataReady(isLoad) { 958 this.design.ctx.state.isLoadContentData = isLoad 959 } 960 961 updateExternalContent({ data, target, method, content }) { 962 if (!data) { 963 document.querySelector('.tox-toolbar').style.pointerEvents = "visible" 964 var tinymceMaskEle = document.querySelector('.tinymce-mask-box'); 965 tinymceMaskEle.style.display = 'none'; 966 return; 967 } 968 const editor = tinymce.get(target) 969 let res_content = '' 970 if (method === 'insert') res_content = data.content.replace(/^\<p\>/, `<p>${content}`) 971 else res_content = data.content 972 // editor.insertContent((method === 'replace' ? '' : content) + data.content) 973 editor.insertContent(res_content) 974 } 975} 976 977/** å ¶å®ä¸äºå ¬å ±çæä½ */ 978class UtiltsMesssages { 979 constructor() { 980 981 } 982 983 /** ææpackages */ 984 get packages() { 985 return this.design.packages 986 } 987 988 /** designç±» */ 989 get design() { 990 return window.design 991 } 992 993 /** å便¨¡å¼ */ 994 static ins() { 995 if (!this.instance) return this.instance = new UtiltsMesssages() 996 return this.instance 997 } 998 999 /** æ´æ°*/ 1000 updateMessage(data) { 1001 // å¦ææ¯æ¨¡åæ´æ°å¹¶ä¸æåç§°ï¼å¹¶ä¸å½å为广åé¡µï¼ 1002 if (data.dir === 'module' && this.design.ctx.state.page.page_type === 'landing_page') { 1003 const packages = this.packages 1004 for (const key in packages) { 1005 const item = packages[key] 1006 if (item.type === 'landing-nav') { 1007 window.design.render(item.attr_id) 1008 } 1009 } 1010 } 1011 } 1012} 1013 1014MessagesManage.ins() 1015 1016/** éå¶packageæ°éï¼æ·»å orå¤å¶å夿 */ 1017function packageLimit(packageItem) { 1018 const packages = window.design.packages 1019 const parentPackageItem = packages[packageItem.parent_attr_id] 1020 if ( 1021 parentPackageItem && 1022 ((packageItem.dir === 'module' && window.ctx.state.addPackageState?.action === 'moduleToGrid' && packageItem.children.length > 21) || 1023 (packageItem.dir === 'module' && parentPackageItem.children.length > 45) || 1024 (packageItem.dir !== 'module' && parentPackageItem.children.length > 21)) 1025 ) { 1026 new Modal().warning('æ·»å å 容已达å°ä¸éï¼', 'æç¤º').open() 1027 return false 1028 } 1029 return true 1030}
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.