Динамическое отображение полей сделки Битрикс24
В CRM Битрикс24 в сделке нужно сделать так:
Если какое-то определенное поле в данной конкретной сделке после её сохранения заполнено - то часть других полей нужно скрывать. Вариант отловить событие изменения сделки и скрыть нужные поля - не рабочий, т.к. во всех других сделках аналогичные поля также скроются, а нужно, чтобы этот механизм работал для конкретной сделки.
Я хочу сделать вот как: найти компонент, который отвечает на вывод верстки пользовательских полей, и уже в шаблоне этого компонента стилями или ещё как, просто не отображать те пользовательские поля, которые нужно скрыть в данной конкретной сделке.
Например: Если в текущей сделке НЕ заполнено поле "Результат общения с клиентом" - то нужно в текущей сделке скрыть поля «Дата назначенной встречи», «Точка продаж» и «Причина отказа».
Нашёл компонент, который отвечает за вывод карточки сделки в popup-окне.
на странице crm/deal/index.php размещён вызов компонента bitrix:crm.deal
В компоненте bitrix:crm.deal есть файл details.php. В нём вызов компонента bitrix:crm.entity.details.frame
В компоненте bitrix:crm.entity.details.frame в шаблоне вызов компонента bitrix:ui.sidepanel.wrapper - сюда в качестве параметра POPUP_COMPONENT_NAME передаётся значение bitrix:crm.deal.details
Далее смотрю компонент bitrix:crm.deal.details. У него в шаблоне вызывается компонент bitrix:crm.entity.details
В шаблоне bitrix:crm.entity.details вызывается компонент bitrix:crm.entity.editor
В шаблоне bitrix:crm.entity.editor и происходит вывод верстки карточки сделки. Но проблема в том, что там очень много JS-кода, и разобраться в нём тяжело.
Подскажите, может у кого-то была похожая задача - точечно скрывать поля сделки в зависимости от того, заполнено какое-то другое поле этой сделки, или нет.
Никакие другие варианты, кроме как править верстку - я пока не придумал, а поля нужно скрывать точечно - не для всех сделок, а у каждой конкретной сделки смотреть - если заполнено поле "Результат общения с клиентом" - то поля «Дата назначенной встречи», «Точка продаж» и «Причина отказа» - отображать. А если поле "Результат общения с клиентом" НЕ заполнено - то поля «Дата назначенной встречи», «Точка продаж» и «Причина отказа» - скрывать.
Ответы (1 шт):
Если в текущей сделке НЕ заполнено поле "Результат общения с клиентом" - то нужно в текущей сделке скрыть поля «Дата назначенной встречи», «Точка продаж» и «Причина отказа».
Такое можно реализовать вот таким образом... Если будет пример твоего html - можно будет предложить пример более приближенный к действительности.
const test = o => o.parentElement.querySelector('fieldset')
.classList.toggle('off', o.value === '')
const act = e => test(e.target)
const fn = o => {
o.addEventListener('input', act)
test(o)
}
document.querySelectorAll('.point').forEach(fn)
.off {
display: none;
}
<article>
<h1>Сделка 1</h1>
<input class='point' placeholder='Результат общения с клиентом' />
<fieldset>
<legend>Детали</legend>
<input placeholder='Дата назначенной встречи' />
<input placeholder='Точка продаж' />
<input placeholder='Причина отказа' />
</fieldset>
</article>
<article>
<h1>Сделка 2</h1>
<input class='point' placeholder='Результат общения с клиентом' />
<fieldset>
<legend>Детали</legend>
<input placeholder='Дата назначенной встречи' />
<input placeholder='Точка продаж' />
<input placeholder='Причина отказа' />
</fieldset>
</article>
