Динамическое отображение полей сделки Битрикс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 шт):

Автор решения: ksa

Если в текущей сделке НЕ заполнено поле "Результат общения с клиентом" - то нужно в текущей сделке скрыть поля «Дата назначенной встречи», «Точка продаж» и «Причина отказа».

Такое можно реализовать вот таким образом... Если будет пример твоего 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>

→ Ссылка