diff --git a/mockup.html b/mockup.html index 1d48cf7..ed35ff8 100644 --- a/mockup.html +++ b/mockup.html @@ -4756,39 +4756,210 @@ function _generateFromModal() { }); } +// Режимы документа: view | elena-add | blocks | direct-edit +var _docMode = 'view'; +var _docData = null; // текущий документ + function _showGeneratedDoc(data) { + _docData = data; + _docMode = 'view'; var old = document.getElementById('tpl-result'); if (old) old.remove(); + _renderDocModal(); + _updateDossier({ decisions: ['Составлен документ: ' + (data.title||data.template)] }); +} + +function _renderDocModal() { + var old = document.getElementById('tpl-result'); if (old) old.remove(); + var data = _docData; if (!data) return; + + // Готовые блоки для добавления по типу документа + var BLOCKS = { + notice_no_renewal: [ + 'Прошу подтвердить получение настоящего уведомления в письменной форме', + 'Прошу организовать передачу помещения по акту в согласованную дату', + 'Дополнительно уведомляю о намерении истребовать обеспечительный платёж' + ], + claim_payment: [ + 'В случае неоплаты оставляю за собой право начислить пени по ст. 395 ГК РФ', + 'Прошу подтвердить получение настоящей претензии', + 'При урегулировании в досудебном порядке готов рассмотреть рассрочку' + ], + act_acceptance: [ + 'Замечания и недостатки, выявленные при приёмке, зафиксированы в Приложении №1', + 'Гарантийный срок исчисляется с даты подписания настоящего акта', + 'Акт составлен в двух экземплярах, имеющих равную юридическую силу' + ] + }; + var tplKey = (_tplCurrent && _tplCurrent.key) || ''; + var blocks = BLOCKS[tplKey] || [ + 'Прошу подтвердить получение настоящего документа', + 'Стороны вправе согласовать иные условия дополнительным соглашением', + 'Настоящий документ составлен в электронном виде и имеет юридическую силу' + ]; + + var isEdit = (_docMode === 'direct-edit'); var modal = document.createElement('div'); modal.id = 'tpl-result'; modal.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:flex;align-items:center;justify-content:center;padding:16px'; + modal.innerHTML = - '
' + - (data.text || '').replace(/' + + + // ── Режим редактирования — дисклеймер в UI (не в документе) + (isEdit ? + '' + + 'Вы редактируете документ самостоятельно. ЗАЩИТА является информационным сервисом — ' + + 'ответственность за внесённые изменения несёте вы. Документ отправляется контрагенту без этой пометки.' + + '' : '') + + + // ── Тулбар режимов + '' + + '' + + '' + + '' + + '' + '' + - '' + - '' + - '' + - '' + - '' + - '' + + + // ── Панель режима + ''; document.body.appendChild(modal); +} - // Сохраняем в досье - _updateDossier({ decisions: ['Составлен документ: ' + (data.title||data.template)] }); +function _getModePanelHTML(blocks) { + if (_docMode === 'elena-add') { + return '' + _getModePanelHTML(blocks) + '' + + + // ── Текст документа + '' + + (isEdit + ? '' + + + // ── Нижняя панель действий + '' + + (isEdit + ? '' + : '') + + '' + + '' + + '' + '' + '' + + '' + + '' + + ''; + } + if (_docMode === 'blocks') { + return '' + + ''; + } + return ''; // view и direct-edit — без панели +} + +function _setDocMode(mode) { + _docMode = mode; + _renderDocModal(); + // Скроллим к тексту + setTimeout(function(){ + var el = document.getElementById('tpl-doc-text'); + if (el) el.scrollIntoView({behavior:'smooth', block:'nearest'}); + }, 100); +} + +// Режим 1: Елена добавляет через API +function _elenaAddToDoc() { + var inp = document.getElementById('elena-add-inp'); + if (!inp || !inp.value.trim()) return; + var request = inp.value.trim(); + inp.value = ''; + inp.placeholder = 'Елена думает...'; + inp.disabled = true; + + var currentText = ''; + var el = document.getElementById('tpl-doc-text'); + if (el) currentText = el.tagName === 'TEXTAREA' ? el.value : (el.textContent||el.innerText||''); + + fetch(API_BASE + '/api/generate', { + method: 'POST', headers: {'Content-Type':'application/json'}, + body: JSON.stringify({ + template: (_tplCurrent && _tplCurrent.key) || 'custom', + parties: (_tplCurrent && _tplCurrent.parties) || {}, + contract_data: (_tplCurrent && _tplCurrent.contract_data) || {}, + extra: 'ТЕКУЩИЙ ДОКУМЕНТ:\n' + currentText.slice(0, 2000) + '\n\nЗАПРОС КЛИЕНТА: ' + request + + '\n\nДобавь нужный фрагмент в конец документа в том же стиле. Верни ТОЛЬКО дополнение (не весь документ).' + }) + }) + .then(function(r){ return r.json(); }) + .then(function(d) { + inp.disabled = false; + inp.placeholder = 'Опишите что добавить...'; + if (d.error) { toast('Ошибка: ' + d.error); return; } + var addition = '\n\n' + (d.text || ''); + // Добавляем к тексту + var textEl = document.getElementById('tpl-doc-text'); + if (textEl) { + if (textEl.tagName === 'TEXTAREA') textEl.value += addition; + else textEl.textContent += addition; + } + if (_docData) _docData.text = (_docData.text || '') + addition; + toast('✅ Елена добавила пункт'); + _addCaseNote('decision', 'Документ дополнен: ' + request, {}); + }) + .catch(function() { inp.disabled = false; toast('Ошибка'); }); +} + +// Режим 2: Готовый блок +function _addBlockToDoc(blockText) { + var textEl = document.getElementById('tpl-doc-text'); + var addition = '\n\n' + blockText + '.'; + if (textEl) { + if (textEl.tagName === 'TEXTAREA') textEl.value += addition; + else textEl.textContent += addition; + } + if (_docData) _docData.text = (_docData.text || '') + addition; + toast('✅ Блок добавлен'); + _setDocMode('view'); // возвращаемся в просмотр +} + +// Режим 3: Сохранить прямое редактирование +function _saveDocEdits() { + var textEl = document.getElementById('tpl-doc-text'); + if (textEl && _docData) { + _docData.text = textEl.tagName === 'TEXTAREA' ? textEl.value : (textEl.textContent||''); + _addCaseNote('decision', 'Документ отредактирован клиентом самостоятельно', { ts: new Date().toISOString() }); + } + _setDocMode('view'); + toast('✅ Изменения сохранены'); } function _printDoc() {Выберите готовый блок для добавления в документ:' + + blocks.map(function(b) { + return ''; + }).join('') + + '