caterium-app/public/core/offer-workspace-v1769.js

137 lines
15 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(()=>{
'use strict';
if(window.SunOfferWorkspaceV1769)return;
const VERSION='17.6.9';
const RELEASE='20260908-v17-6-9-offer-pdf-tabs-gallery';
const MODES=new Set(['preview','editor','templates']);
const GALLERY_KEY='sunOfferGalleryOverridesV1769';
const DEFAULT_GALLERY=['offer-gallery/001.jpg','offer-gallery/002.jpg'];
const $=id=>document.getElementById(id);
const modal=()=>$('sunClientOfferModal');
const dialog=()=>modal()?.querySelector('.dialog')||null;
const toast=(text,type='info',ms=4200)=>{try{return window.SunEnterprise?.toast?.(text,type,ms)}catch(_){};};
let mode='preview',activeOrderId='';
let openersPatched=false,classicPatched=false;
function readGalleryMap(){try{const v=JSON.parse(localStorage.getItem(GALLERY_KEY)||'{}');return v&&typeof v==='object'&&!Array.isArray(v)?v:{}}catch(_){return{}}}
function writeGalleryMap(map){try{localStorage.setItem(GALLERY_KEY,JSON.stringify(map));window.dispatchEvent(new CustomEvent('sun:offer-gallery-v1769-change',{detail:{orderId:activeOrderId}}));return true}catch(e){console.error('[Caterium v17.6.9] gallery persist failed',e);toast('Не удалось сохранить фото: хранилище заполнено.','error',6000);return false}}
function galleryFor(orderId=activeOrderId){const map=readGalleryMap(),v=map[String(orderId||'')];return Array.isArray(v)&&v.length?v.slice(0,2).map((x,i)=>x||DEFAULT_GALLERY[i]):DEFAULT_GALLERY.slice()}
function saveGallerySlot(index,value){if(!activeOrderId){toast('Сначала сохраните заказ, чтобы закрепить фотографии предложения.','warn',5200);return false}const map=readGalleryMap(),key=String(activeOrderId),arr=Array.isArray(map[key])?map[key].slice(0,2):DEFAULT_GALLERY.slice();while(arr.length<2)arr.push(DEFAULT_GALLERY[arr.length]);arr[index]=value||DEFAULT_GALLERY[index];map[key]=arr;const ok=writeGalleryMap(map);if(ok){syncGalleryUi();refreshOffer();}return ok}
function currentDraftId(){try{if(window.draft?.id!=null)return String(window.draft.id)}catch(_){}const raw=document.querySelector('#orderForm [name="id"],#orderId,#order-id')?.value;return raw?String(raw):''}
function installStyle(){
if($('sunOfferWorkspaceV1769Style'))return;
const s=document.createElement('style');s.id='sunOfferWorkspaceV1769Style';s.textContent=`
#sunClientOfferModal .dialog.sun-offer-workspace-v1769{width:min(1240px,calc(100vw - 24px));height:min(94vh,980px);max-height:94vh;overflow:hidden!important;padding:0!important;display:flex;flex-direction:column;background:#f5f6f5;border-radius:19px}
#sunClientOfferModal .sun-offer-modal-head{flex:0 0 auto;padding:14px 16px;background:#fff;border-bottom:1px solid #e5e7e6;position:relative;z-index:5}
.sun-offer-workspace-tabs-v1769{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding:9px 12px;background:#fff;border-bottom:1px solid #e5e7e6;overflow-x:auto;scrollbar-width:thin}
.sun-offer-workspace-tabs-v1769 button{flex:0 0 auto;border:1px solid #dfe3e0;background:#f7f8f7;color:#48504a;border-radius:999px;padding:8px 13px;font-size:12px;font-weight:850;white-space:nowrap}
.sun-offer-workspace-tabs-v1769 button.on{background:#1d2a22;color:#fff;border-color:#1d2a22;box-shadow:0 4px 13px rgba(29,42,34,.16)}
#sunClientOfferModal .sun-offer-frame-wrap,#sunClientOfferModal #sunOfferEditor,#sunClientOfferModal #sunOfferTemplateV1764{flex:1 1 auto;min-height:0!important;overflow:auto!important;margin:0!important}
#sunClientOfferModal .sun-offer-frame-wrap{padding:14px 16px 20px;background:#eef0ee}
#sunClientOfferModal #sunOfferEditor{padding:15px 16px 24px!important;background:#fff;border:0!important}
#sunClientOfferModal #sunOfferTemplateV1764{padding:16px!important;background:#fff;border:0!important}
#sunClientOfferModal[data-offer-workspace-mode="preview"] #sunOfferEditor,#sunClientOfferModal[data-offer-workspace-mode="preview"] #sunOfferTemplateV1764{display:none!important}
#sunClientOfferModal[data-offer-workspace-mode="preview"] .sun-offer-frame-wrap{display:block!important}
#sunClientOfferModal[data-offer-workspace-mode="editor"] .sun-offer-frame-wrap,#sunClientOfferModal[data-offer-workspace-mode="editor"] #sunOfferTemplateV1764{display:none!important}
#sunClientOfferModal[data-offer-workspace-mode="editor"] #sunOfferEditor{display:block!important}
#sunClientOfferModal[data-offer-workspace-mode="templates"] .sun-offer-frame-wrap,#sunClientOfferModal[data-offer-workspace-mode="templates"] #sunOfferEditor{display:none!important}
#sunClientOfferModal[data-offer-workspace-mode="templates"] #sunOfferTemplateV1764{display:block!important}
#sunClientOfferModal #sunOfferTemplateV1764 .sun-v1764-offer-template-head{position:sticky;top:-16px;z-index:2;background:#fff;padding:1px 0 10px;margin-bottom:10px}
#sunClientOfferModal #sunOfferTemplateV1764 .sun-v1764-offer-template-grid{grid-template-columns:repeat(3,minmax(170px,1fr));gap:10px}
#sunClientOfferModal #sunOfferTemplateV1764 .sun-v1764-offer-template-grid button{min-height:166px;padding:10px;border-radius:15px}
#sunClientOfferModal #sunOfferTemplateV1764 .sun-offer-template-mini{height:auto;aspect-ratio:1000/1414}
#sunClientOfferModal .sun-offer-editor-gallery{border:1px solid #e0e4e1;border-radius:16px;padding:14px;background:#f8faf8}
#sunClientOfferModal .sun-offer-editor-gallery-images{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px!important;margin-top:12px}
#sunClientOfferModal .sun-offer-gallery-upload-v1769{position:relative;border:1px solid #d9dfda;border-radius:14px;background:#fff;padding:9px;min-width:0}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 img{display:block;width:100%!important;height:170px!important;object-fit:cover!important;border-radius:10px!important;background:#edf0ed}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 .sun-offer-gallery-actions-v1769{display:flex;gap:7px;align-items:center;justify-content:space-between;margin-top:8px;flex-wrap:wrap}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 .sun-offer-gallery-actions-v1769 b{font-size:12px;color:#303831}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 input[type=file]{position:absolute;inline-size:1px;block-size:1px;opacity:0;pointer-events:none}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 label,#sunClientOfferModal .sun-offer-gallery-upload-v1769 button{display:inline-flex!important;width:auto!important;flex-direction:row!important;align-items:center;gap:5px;margin:0!important;border-radius:9px;padding:7px 9px;font-size:11px;font-weight:800;cursor:pointer}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 label{background:#1d2a22;color:#fff;border:1px solid #1d2a22}
#sunClientOfferModal .sun-offer-gallery-upload-v1769 button{background:#fff;color:#7b3a32;border:1px solid #e3c9c5}
#sunClientOfferModal .sun-offer-editor-note{margin:12px 0 0}
@media(max-width:820px){
#sunClientOfferModal{padding:0!important}#sunClientOfferModal .dialog.sun-offer-workspace-v1769{width:100vw;height:100vh;max-height:none;border-radius:0}
#sunClientOfferModal .sun-offer-modal-head{padding:10px 12px}#sunClientOfferModal .sun-offer-modal-actions{gap:5px}
#sunClientOfferModal .sun-offer-modal-actions button{padding:7px 9px;font-size:11px}
#sunClientOfferModal #sunOfferTemplateV1764 .sun-v1764-offer-template-grid{grid-template-columns:repeat(2,minmax(135px,1fr))}
#sunClientOfferModal .sun-offer-editor-gallery-images{grid-template-columns:1fr}
}
`;document.head.appendChild(s);
}
function ensureTabs(){
const d=dialog(),m=modal();if(!d||!m)return false;
d.classList.add('sun-offer-workspace-v1769');
let tabs=$('sunOfferWorkspaceTabsV1769');
if(!tabs){
tabs=document.createElement('nav');tabs.id='sunOfferWorkspaceTabsV1769';tabs.className='sun-offer-workspace-tabs-v1769';tabs.setAttribute('aria-label','Разделы предложения клиенту');tabs.innerHTML=`<button type="button" data-offer-workspace-tab="preview">PDF и предпросмотр</button><button type="button" data-offer-workspace-tab="editor">Редактор</button><button type="button" data-offer-workspace-tab="templates">Оформление PDF</button>`;
const head=d.querySelector('.sun-offer-modal-head');head?.insertAdjacentElement('afterend',tabs);
tabs.addEventListener('click',e=>{const b=e.target.closest('[data-offer-workspace-tab]');if(b)setMode(b.dataset.offerWorkspaceTab)});
}
setMode(mode,false);return true;
}
function setMode(next,focus=true){
if(!MODES.has(next))next='preview';mode=next;const m=modal();if(!m)return;
m.dataset.offerWorkspaceMode=mode;
document.querySelectorAll('#sunOfferWorkspaceTabsV1769 [data-offer-workspace-tab]').forEach(b=>b.classList.toggle('on',b.dataset.offerWorkspaceTab===mode));
const edit=$('sunOfferEdit');if(edit){const label=mode==='editor'?'К просмотру':'Редактировать';if(edit.textContent!==label)edit.textContent=label;edit.setAttribute('aria-pressed',mode==='editor'?'true':'false')}
if(focus){const target=mode==='editor'?$('sunOfferEditor'):mode==='templates'?$('sunOfferTemplateV1764'):m.querySelector('.sun-offer-frame-wrap');target?.scrollTo?.({top:0,behavior:'instant'});}
}
function syncGalleryUi(){const arr=galleryFor();for(let i=0;i<2;i++){const img=$(`sunOfferGalleryPreview${i}`);if(img)img.src=arr[i]||DEFAULT_GALLERY[i]}}
function upgradeGalleryUi(){
const wrap=modal()?.querySelector('.sun-offer-editor-gallery-images');if(!wrap)return false;
if(wrap.dataset.sunV1769==='1'){syncGalleryUi();return true;}
wrap.innerHTML=[0,1].map(i=>`<div class="sun-offer-gallery-upload-v1769"><img id="sunOfferGalleryPreview${i}" src="${DEFAULT_GALLERY[i]}" alt="Фото сервировки ${i+1}"><div class="sun-offer-gallery-actions-v1769"><b>Фото ${i+1}</b><div style="display:flex;gap:6px"><label>Загрузить<input type="file" accept="image/jpeg,image/png,image/webp" data-offer-gallery-slot="${i}"></label><button type="button" data-offer-gallery-reset="${i}">Сбросить</button></div></div></div>`).join('');
wrap.dataset.sunV1769='1';syncGalleryUi();return true;
}
async function fileToDataUrl(file){
const maxSide=1400,target=700*1024;
let bitmap;try{bitmap=await createImageBitmap(file)}catch(_){return await new Promise((res,rej)=>{const r=new FileReader();r.onload=()=>res(String(r.result||''));r.onerror=rej;r.readAsDataURL(file)})}
try{
let scale=Math.min(1,maxSide/Math.max(bitmap.width,bitmap.height)),quality=.86,best='';
for(let i=0;i<5;i++){
const c=document.createElement('canvas');c.width=Math.max(1,Math.round(bitmap.width*scale));c.height=Math.max(1,Math.round(bitmap.height*scale));const x=c.getContext('2d',{alpha:false});x.fillStyle='#fff';x.fillRect(0,0,c.width,c.height);x.drawImage(bitmap,0,0,c.width,c.height);const url=c.toDataURL('image/jpeg',quality);best=url;if(Math.round((url.length-22)*.75)<=target)break;quality=Math.max(.62,quality-.07);scale*=.86;
}
return best;
}finally{bitmap.close?.()}
}
function refreshOffer(){try{window.dispatchEvent(new CustomEvent('sunoffertemplatechange',{detail:{galleryOnly:true,orderId:activeOrderId}}))}catch(_){}}
function patchOpeners(){
if(openersPatched)return true;const one=window.sunOpenClientOffer,cur=window.sunOpenCurrentClientOffer;if(typeof one!=='function'||typeof cur!=='function')return false;
window.sunOpenClientOffer=function(id,...rest){activeOrderId=String(id??'');mode='preview';const out=one.call(this,id,...rest);setTimeout(()=>{enhance();setMode('preview',false);syncGalleryUi()},80);return out};
window.sunOpenCurrentClientOffer=function(...args){activeOrderId=currentDraftId();mode='preview';const out=cur.apply(this,args);setTimeout(()=>{enhance();setMode('preview',false);syncGalleryUi()},80);return out};
window.sunOpenClientOffer.__sunV1769=true;window.sunOpenCurrentClientOffer.__sunV1769=true;openersPatched=true;return true;
}
function patchClassic(){
if(classicPatched)return true;const api=window.SunClassicOfferPDFV1767;if(!api||typeof api.renderPages!=='function')return false;const original=api.renderPages.bind(api);
api.renderPages=async function(snapshot,...rest){const s=structuredClone(snapshot||{}),id=String(s.orderId||activeOrderId||'');if(id){s.finalGallery=galleryFor(id)}return original(s,...rest)};api.renderPages.__sunV1769=true;classicPatched=true;return true;
}
function enhance(){installStyle();ensureTabs();upgradeGalleryUi();patchOpeners();patchClassic();}
document.addEventListener('change',async e=>{
const input=e.target.closest?.('[data-offer-gallery-slot]');if(!input)return;const file=input.files?.[0];if(!file)return;if(!/^image\/(jpeg|png|webp)$/i.test(file.type||'')){toast('Поддерживаются JPG, PNG и WEBP.','warn');input.value='';return}const idx=Number(input.dataset.offerGallerySlot);input.disabled=true;toast(`Оптимизирую фото ${idx+1}`);try{const data=await fileToDataUrl(file);if(!data)throw new Error('Не удалось обработать изображение.');saveGallerySlot(idx,data);toast(`Фото ${idx+1} сохранено для этого предложения.`,'success')}catch(err){console.error(err);toast(err?.message||String(err),'error')}finally{input.disabled=false;input.value=''}
},true);
document.addEventListener('click',e=>{
const reset=e.target.closest?.('[data-offer-gallery-reset]');if(reset){e.preventDefault();saveGallerySlot(Number(reset.dataset.offerGalleryReset),DEFAULT_GALLERY[Number(reset.dataset.offerGalleryReset)]);toast('Фото возвращено к стандартному.','success');return}
const edit=e.target.closest?.('#sunOfferEdit');if(edit&&modal()?.classList.contains('on')){e.preventDefault();e.stopImmediatePropagation();setMode(mode==='editor'?'preview':'editor');return;}
const pdf=e.target.closest?.('#sunOfferPdf');if(pdf&&modal()?.classList.contains('on')&&mode!=='preview')setMode('preview',false);
},true);
window.addEventListener('sun:offer-gallery-v1769-change',syncGalleryUi);
let enhanceQueued=false;
const observer=new MutationObserver(()=>{if(enhanceQueued)return;enhanceQueued=true;queueMicrotask(()=>{enhanceQueued=false;enhance()})});
observer.observe(document.documentElement,{subtree:true,childList:true});
installStyle();enhance();
const retry=setInterval(()=>{if(patchOpeners()&&patchClassic())clearInterval(retry)},350);setTimeout(()=>clearInterval(retry),15000);
window.SunOfferWorkspaceV1769={VERSION,RELEASE,GALLERY_KEY,setMode,enhance,galleryFor,checks:()=>({version:VERSION,mode,modal:Boolean(modal()),tabs:Boolean($('sunOfferWorkspaceTabsV1769')),activeOrderId,openersPatched,classicPatched})};
})();