Add OnlyOfficeTemplates module

This commit is contained in:
Fedor
2026-02-16 09:27:19 +03:00
parent fd54177ada
commit 2bb56342f4
29 changed files with 2173 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
{strip}
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<h4 class="pull-left">{vtranslate('LBL_OOT_ADD_TEMPLATE', $MODULE_NAME)}</h4>
<div class="clearfix"></div>
</div>
</div>
<div class="row">
<div class="col-sm-8">
{if $ERROR_MSG}
<div class="alert alert-danger">{$ERROR_MSG|escape}</div>
{/if}
<form action="index.php" method="post" enctype="multipart/form-data" class="form-horizontal">
<input type="hidden" name="module" value="OnlyOfficeTemplates" />
<input type="hidden" name="action" value="UploadTemplate" />
<input type="hidden" name="redirect" value="List" />
<div class="form-group">
<label class="control-label col-sm-3">{vtranslate('LBL_OOT_NAME', $MODULE_NAME)} <span class="redColor">*</span></label>
<div class="col-sm-9">
<input type="text" name="name" class="form-control" required="required" />
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3">{vtranslate('LBL_OOT_MODULE', $MODULE_NAME)} <span class="redColor">*</span></label>
<div class="col-sm-9">
<select name="module_name" class="form-control" required="required">
<option value="">-- {vtranslate('LBL_SELECT_OPTION','Vtiger')} --</option>
{foreach from=$MODULES key=modName item=modLabel}
<option value="{$modName}">{$modLabel}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3">{vtranslate('LBL_OOT_FILE', $MODULE_NAME)} (DOCX) <span class="redColor">*</span></label>
<div class="col-sm-9">
<input type="file" name="file" accept=".docx" required="required" />
<span class="help-block">{vtranslate('LBL_OOT_FILE_HINT', $MODULE_NAME)}</span>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button type="submit" class="btn btn-success">{vtranslate('LBL_SAVE', $MODULE_NAME)}</button>
<a href="index.php?module=OnlyOfficeTemplates&view=List&app=TOOLS" class="btn btn-default">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a>
</div>
</div>
</form>
</div>
</div>
</div>
{/strip}

View File

@@ -0,0 +1,76 @@
{strip}
<div class="contents tabbable">
<div class="row">
<div class="col-xs-4 left-block" style="border-right: 1px solid #ddd;">
<h4>{if $TEMPLATE.id gt 0}{vtranslate('LBL_OOT_EDIT_TEMPLATE', $MODULE_NAME)}{else}{vtranslate('LBL_OOT_ADD_TEMPLATE', $MODULE_NAME)}{/if}</h4>
{if $ERROR_MSG}<div class="alert alert-danger">{$ERROR_MSG|escape}</div>{/if}
<form id="ootMetadataForm" action="index.php" method="post" class="form-horizontal">
<input type="hidden" name="module" value="OnlyOfficeTemplates" />
<input type="hidden" name="action" value="SaveMetadata" />
<input type="hidden" name="templateid" value="{$TEMPLATE.id}" />
<input type="hidden" name="redirect" value="Edit" />
<div class="form-group">
<label class="control-label col-sm-4">{vtranslate('LBL_OOT_NAME', $MODULE_NAME)}</label>
<div class="col-sm-8">
<input type="text" name="name" class="form-control" value="{$TEMPLATE.name|escape}" required />
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-4">{vtranslate('LBL_OOT_MODULE', $MODULE_NAME)}</label>
<div class="col-sm-8">
<select name="module_name" class="form-control" required>
<option value="">-- {vtranslate('LBL_SELECT_OPTION','Vtiger')} --</option>
{foreach from=$MODULES key=modName item=modLabel}
<option value="{$modName}" {if $TEMPLATE.module eq $modName}selected{/if}>{$modLabel}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<button type="submit" class="btn btn-success">{vtranslate('LBL_SAVE', $MODULE_NAME)}</button>
<a href="index.php?module=OnlyOfficeTemplates&view=List&app=TOOLS" class="btn btn-default">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a>
</div>
</div>
</form>
</div>
<div class="col-xs-8" style="min-height: 600px;">
{if $OOT_EDITOR_AVAILABLE}
<p class="text-muted">{vtranslate('LBL_OOT_EDITOR_HINT', $MODULE_NAME)}</p>
<div id="ootOnlyOfficeEditor" style="width:100%; height:700px;"></div>
<script src="{$OOT_DOCUMENT_SERVER}/web-apps/apps/api/documents/api.js"></script>
<script>
(function() {
var docKey = "{$OOT_DOC_KEY|escape:'javascript'}";
var config = {
document: {
fileType: "docx",
key: docKey,
title: "{$OOT_DOC_TITLE|escape:'javascript'}",
url: "{$OOT_DOCUMENT_URL|escape:'javascript'}"
},
documentType: "word",
editorConfig: {
callbackUrl: "{$OOT_CALLBACK_URL|escape:'javascript'}",
mode: "edit",
lang: "ru"
},
width: "100%",
height: "100%"
};
if (typeof DocsAPI !== "undefined") {
new DocsAPI.DocEditor("ootOnlyOfficeEditor", config);
} else {
document.getElementById("ootOnlyOfficeEditor").innerHTML = "<div class=\"alert alert-warning\">Не удалось загрузить OnlyOffice. Проверьте ONLYOFFICE_DOCUMENT_SERVER.</div>";
}
})();
</script>
{else}
<div class="alert alert-info">{$OOT_EDITOR_MESSAGE|escape}</div>
<p>{vtranslate('LBL_OOT_EDITOR_FALLBACK', $MODULE_NAME)}</p>
<a href="index.php?module=OnlyOfficeTemplates&view=AddTemplate&app=TOOLS" class="btn btn-primary">{vtranslate('LBL_OOT_ADD_VIA_UPLOAD', $MODULE_NAME)}</a>
{/if}
</div>
</div>
</div>
{/strip}

View File

@@ -0,0 +1,65 @@
{*
OnlyOfficeTemplates widget: template list, format (PDF/DOCX), Download / Save to Documents
*}
{if $CRM_TEMPLATES_EXIST eq 0}
<li class="dropdown-header">
<span class="fa fa-file-text-o"></span> {vtranslate('LBL_OOT_TEMPLATES','OnlyOfficeTemplates')}
</li>
<li class="oot-widget" data-record="{$ID}" data-module="{$MODULE}">
<div class="form-group">
<label class="control-label">{vtranslate('LBL_OOT_SELECT_TEMPLATE','OnlyOfficeTemplates')}</label>
<select class="oot-template-id form-control input-sm">
{foreach from=$CRM_TEMPLATES item=tpl}
<option value="{$tpl.id}">{$tpl.name}</option>
{/foreach}
</select>
</div>
<div class="form-group">
<label class="control-label">{vtranslate('LBL_OOT_FORMAT','OnlyOfficeTemplates')}</label>
<select class="oot-format form-control input-sm">
<option value="pdf">{vtranslate('LBL_OOT_FORMAT_PDF','OnlyOfficeTemplates')}</option>
<option value="docx">{vtranslate('LBL_OOT_FORMAT_DOCX','OnlyOfficeTemplates')}</option>
</select>
</div>
<div class="btn-group btn-group-justified">
<a href="javascript:;" class="oot-download"><i class="fa fa-download"></i> {vtranslate('LBL_OOT_DOWNLOAD','OnlyOfficeTemplates')}</a>
<a href="javascript:;" class="oot-save-to-docs"><i class="fa fa-save"></i> {vtranslate('LBL_OOT_SAVE_TO_DOCUMENTS','OnlyOfficeTemplates')}</a>
</div>
</li>
{else}
<li><span class="text-muted">{vtranslate('LBL_OOT_NO_TEMPLATES','OnlyOfficeTemplates')}</span></li>
{/if}
{if $CRM_TEMPLATES_EXIST eq 0}
<script type="text/javascript">
(function() {
var container = document.querySelector('.oot-widget');
if (!container) return;
container.addEventListener('click', function(e) {
var t = e.target.closest('.oot-download, .oot-save-to-docs');
if (!t) return;
e.preventDefault();
var record = container.getAttribute('data-record'), module = container.getAttribute('data-module');
var sel = container.querySelector('.oot-template-id'), fmt = container.querySelector('.oot-format');
var templateId = sel ? sel.value : '', format = fmt ? fmt.value : 'pdf';
var mode = t.classList.contains('oot-download') ? 'download' : 'save_to_documents';
var url = 'index.php?module=OnlyOfficeTemplates&action=CreateFromTemplate&record=' + encodeURIComponent(record) + '&source_module=' + encodeURIComponent(module) + '&template_id=' + encodeURIComponent(templateId) + '&format=' + encodeURIComponent(format) + '&mode=' + encodeURIComponent(mode);
if (mode === 'download') {
window.location.href = url;
} else {
var xhr = new XMLHttpRequest();
xhr.open('GET', url + '&ajax=1');
xhr.onload = function() {
var res = {};
try { res = JSON.parse(xhr.responseText); } catch (err) {}
if (res.success) {
alert(res.message || 'Сохранено в Документы');
} else {
alert(res.error || 'Ошибка');
}
};
xhr.send();
}
});
})();
</script>
{/if}

View File

@@ -0,0 +1,47 @@
{strip}
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<h4 class="pull-left">{vtranslate('LBL_OOT_TEMPLATES', $MODULE_NAME)}</h4>
<a href="index.php?module=OnlyOfficeTemplates&action=CreateDraft&app=TOOLS" class="btn btn-success pull-right">
<i class="fa fa-plus"></i> {vtranslate('LBL_OOT_ADD_TEMPLATE', $MODULE_NAME)}
</a>
<a href="index.php?module=OnlyOfficeTemplates&view=AddTemplate&app=TOOLS" class="btn btn-default pull-right" style="margin-right:8px;">
{vtranslate('LBL_OOT_UPLOAD_FILE', $MODULE_NAME)}
</a>
<div class="clearfix"></div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
{if empty($TEMPLATES)}
<div class="alert alert-info">{vtranslate('LBL_OOT_EMPTY_LIST', $MODULE_NAME)}</div>
{else}
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>{vtranslate('LBL_OOT_NAME', $MODULE_NAME)}</th>
<th>{vtranslate('LBL_OOT_MODULE', $MODULE_NAME)}</th>
<th>{vtranslate('LBL_OOT_FILE', $MODULE_NAME)}</th>
<th>{vtranslate('LBL_OOT_CREATED_AT', $MODULE_NAME)}</th>
</tr>
</thead>
<tbody>
{foreach from=$TEMPLATES item=TPL}
<tr>
<td>
<a href="index.php?module=OnlyOfficeTemplates&view=Edit&templateid={$TPL.id}&app=TOOLS">{$TPL.name|escape}</a>
</td>
<td>{$TPL.module|escape}</td>
<td>{$TPL.file_name|escape}</td>
<td>{$TPL.created_at|escape}</td>
</tr>
{/foreach}
</tbody>
</table>
{/if}
</div>
</div>
</div>
{/strip}