102 lines
9.2 KiB
PHP
Raw 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.

<section class="agreement-form-section" data-credential-section hidden>
<h3 class="agreement-section-heading">证件签署留档(按需)</h3>
<label class="agreement-checkbox-choice"><input type="checkbox" name="credential_required" value="1" data-credential-required disabled><span><strong style="display: block">本次需要补充证件并签署留档</strong><span class="agreement-help" style="display: block">默认不勾选,仅发送给本次选中的合作方。</span></span></label>
<div data-credential-content hidden style="display: grid; gap: .875rem; margin-top: 1rem">
<div class="agreement-field" style="margin-top: 1rem">
<label for="agreement-credential-signer">证件签署方</label>
<select id="agreement-credential-signer" class="agreement-control" name="credential_signer" data-credential-signer disabled></select>
<p class="agreement-help">每张推送单仅由所选签署方签字或盖章一次。营业执照须由企业盖章。</p>
</div>
<div class="agreement-form-grid">
@foreach (\App\Support\CourierAgreementCredentials::IMAGES as $key => $label)
<div class="agreement-field" data-credential-image-field="{{ $key }}">
<label for="agreement-credential-{{ $key }}">{{ $label }} <span class="agreement-required">*</span></label>
<input class="agreement-control" id="agreement-credential-{{ $key }}" name="credential_images[{{ $key }}]" type="file" accept="image/jpeg,image/png" data-credential-image="{{ $key }}" disabled>
<img data-credential-thumbnail="{{ $key }}" alt="{{ $label }}预览" hidden style="max-width: 100%; height: 100px; object-fit: contain; margin-top: .5rem">
<button class="agreement-inline-button" type="button" data-credential-remove="{{ $key }}" style="align-self: flex-start" hidden>删除图片</button>
</div>
@endforeach
</div>
<p class="agreement-help">JPG / PNG,每张不超过 10 MB,宽高不超过 5000 像素。请遮挡银行卡安全码。</p>
<p class="agreement-help" data-credential-description></p>
</div>
<div class="agreement-template-note" style="margin-top: 1rem" aria-live="polite"><span class="material-icons-outlined" aria-hidden="true">description</span><div><strong>本次发送清单</strong><p data-credential-send-list>仅发送当前签署文件</p></div></div>
</section>
<script>
(function () {
function initializeCredentials() {
var root = document.querySelector('[data-agreement-signing]');
if (!root || root.dataset.credentialsInitialized) return;
var form = root.querySelector('[data-agreement-form]');
if (!form) return;
root.dataset.credentialsInitialized = 'true';
var type = form.querySelector('[name="document_type"]'), section = root.querySelector('[data-credential-section]');
var required = root.querySelector('[data-credential-required]'), content = root.querySelector('[data-credential-content]');
var signer = root.querySelector('[data-credential-signer]'), preview = root.querySelector('[data-credential-preview]');
var images = Array.from(root.querySelectorAll('[data-credential-image]')), urls = {}, previousType = null;
var definitions = {
authorization: [{name: '身份证推送单', keys: ['id_front', 'id_back']}, {name: '银行卡推送单', keys: ['bank_front', 'bank_back']}],
'entity-change': [{name: '营业执照盖章推送单', keys: ['license']}, {name: '身份证推送单', keys: ['id_front', 'id_back']}, {name: '银行卡推送单', keys: ['bank_front', 'bank_back']}]
};
function release(key) { if (urls[key]) URL.revokeObjectURL(urls[key]); delete urls[key]; }
function imageControl(key) { return images.find(function (input) { return input.dataset.credentialImage === key; }); }
function update() {
var supported = Boolean(definitions[type.value]);
if (previousType !== type.value) {
required.checked = false; signer.replaceChildren();
(type.value === 'entity-change' ? ['变更前主体', '变更后主体'] : ['委托方', '受托方']).forEach(function (label, index) {
var option = document.createElement('option'); option.value = String(index); option.textContent = label; signer.append(option);
});
signer.value = type.value === 'entity-change' ? '1' : '0';
images.forEach(function (input) { input.value = ''; release(input.dataset.credentialImage); }); previousType = type.value;
}
section.hidden = !supported; required.disabled = !supported;
var signerNames = type.value === 'entity-change' ? ['former_company_name', 'changed_company_name'] : ['principal_name', 'trustee_name'];
var roleNames = type.value === 'entity-change' ? ['变更前主体', '变更后主体'] : ['委托方', '受托方'];
Array.from(signer.options).forEach(function (option, index) {
var input = form.querySelector('[name="' + signerNames[index] + '"]');
option.textContent = roleNames[index] + ':' + (input && input.value.trim() || '待填写');
});
var active = supported && required.checked; content.hidden = !active; signer.disabled = !active;
var sheets = active ? definitions[type.value] : [], keys = sheets.flatMap(function (sheet) { return sheet.keys; });
images.forEach(function (input) {
var key = input.dataset.credentialImage, visible = keys.includes(key);
input.disabled = !visible; input.required = visible;
root.querySelector('[data-credential-image-field="' + key + '"]').hidden = !visible;
var img = root.querySelector('[data-credential-thumbnail="' + key + '"]');
img.hidden = !urls[key]; if (urls[key]) img.src = urls[key]; else img.removeAttribute('src');
root.querySelector('[data-credential-remove="' + key + '"]').hidden = !input.files.length;
input.setCustomValidity(input.files.length && (!['image/jpeg', 'image/png'].includes(input.files[0].type) || input.files[0].size > 10 * 1024 * 1024) ? '请选择不超过 10 MB 的 JPG 或 PNG 图片' : '');
});
root.querySelector('[data-credential-description]').textContent = type.value === 'entity-change'
? '营业执照单独一页盖章;身份证、银行卡正反面各合成一页,各签字或盖章一次。'
: '身份证正反面合为一页,银行卡正反面合为另一页,每页各签字或盖章一次。';
var selectedName = type.options[type.selectedIndex].textContent.trim();
root.querySelector('[data-credential-send-list]').textContent = [selectedName + '.pdf'].concat(sheets.map(function (sheet) { return sheet.name + '.pdf'; })).join(';') + '。分别回传、独立留档。';
preview.replaceChildren(); preview.hidden = !active;
sheets.forEach(function (sheet) {
var paper = document.createElement('article'); paper.className = 'agreement-preview-paper';
var title = document.createElement('h3'); title.textContent = sheet.name; paper.append(title);
sheet.keys.forEach(function (key) {
var block = document.createElement('div'); block.className = 'agreement-preview-account';
if (urls[key]) { var img = document.createElement('img'); img.src = urls[key]; img.alt = imageControl(key).previousElementSibling.textContent; img.style.cssText = 'width:100%;height:130px;object-fit:contain'; block.append(img); }
else block.textContent = imageControl(key).previousElementSibling.textContent.replace('*', '').trim() + ' · 待上传'; paper.append(block);
});
var sign = document.createElement('div'); sign.className = 'agreement-preview-account';
sign.textContent = (sheet.keys[0] === 'license' ? '盖章' : '签字 / 盖章') + '位置 · 本页 1 处'; paper.append(sign); preview.append(paper);
});
}
images.forEach(function (input) { input.addEventListener('change', function () {
var key = input.dataset.credentialImage; release(key);
if (input.files[0] && ['image/jpeg', 'image/png'].includes(input.files[0].type) && input.files[0].size <= 10 * 1024 * 1024) urls[key] = URL.createObjectURL(input.files[0]); update();
}); });
root.querySelectorAll('[data-credential-remove]').forEach(function (button) { button.addEventListener('click', function () { var key = button.dataset.credentialRemove; imageControl(key).value = ''; release(key); update(); }); });
type.addEventListener('change', update); required.addEventListener('change', update);
form.addEventListener('input', update); form.addEventListener('change', update);
form.addEventListener('reset', function () { setTimeout(function () { previousType = null; update(); }, 0); });
update();
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initializeCredentials); else initializeCredentials();
})();
</script>