Web форма построенная на LWC + salesforce apex
Сама платформа Salesforce имеет узкоспециализированные инструменты и технологии для разработки в самой платформе (Salesforce — это CRM). Хотя последняя frontend-технология LWC уже заявлена как open source.
Хочу рассказать об одном из последних наших проектов, довольно объемном и интересном со стороны используемых решений и технологий.
Концепция такова: есть форма, в которой заполняется информация о клиенте, и в этой форме информация сгруппирована по тематическим блокам (например, контактные данные, кредитная информация, банковская информация). Форма имеет множество фич в виде различных валидаций, выпадающих подсказок в полях для заполнения, проверок данных в сторонних сервисах (например, решение по выдаче кредита клиенту) и так далее.
С концептом более или менее понятно. Теперь о технологическом стеке.
На стороне пользователя это интерфейс, построенный на Lightning Web Components с использованием Lightning Design System для оформления. Там, где не хватало лайтнинга, мы использовали классику — HTML5 + CSS3 + JavaScript.
На стороне бэкенда это встроенный язык платформы, он называется Apex и построен на всем известной Java. Также веб-сервисы для обработки данных на нашей стороне, написанные на Java, база данных на Oracle для хранения данных. Связь платформы Salesforce (в облаке) с нашими собственными системами через интеграционную платформу IBM Gateway и внутренний транспорт на нашей стороне Apache Kafka.
Теперь немного об интерфейсе. Он, как уже написано выше, построен на Lightning Web Components. Из названия понятно, что использована концепция компонентного фронта. Есть базовый компонент, представляющий всю форму, а внутри множество компонентов, каждый из которых представляет собой логическую часть интерфейса (блок информации, объединенной общим смыслом, или блок управляющих кнопок).
Так как наша компания интернациональная, имеется практика делать интерфейс мультиязычным. К счастью, платформа Salesforce позволяет делать это нативными инструментами.
У нас эта мультиязычность была реализована путем создания справочника «лейблов» в системе, и каждый такой «лэйбл» имел настройку перевода на нужные языки. Это все организовано через инструмент платформы custom label, так что в дальнейшем админы могут без проблем подправить форму, где нужно, без багов, косяков и правки кода. Все через настройки, и это круто! Я с командой всегда стараюсь все делать максимально удобно пользователей, администраторов систем и для дальнейшей поддержки :)
С технической точки зрения это выглядит так: 1) есть настройка «лейбла» (название на оригинале, английский + переводы на нужные языки); 2) дальше все «лейблы» импортируются в общем утилитном компоненте проекта; 3) все заинтересованные компоненты используют утилитный.
Таким образом, код получается структурированным и чистым. Ну и небольшой пример.
Импорт в утилитный компонент:
Использование в компоненте:
Еще хотел бы рассказать про пару решений, которые мы реализовали для определенных задач. Может, кому пригодится при решении своих задач, так как русскоязычное сообщество SF совсем небольшое, на мой взгляд.
Есть у нас внешняя система, из который мы берем различного рода данные по юридической информации по компаниям. И адрес в ответе выглядел таким образом в JSON.
Как видим, полный адрес не совсем совпадает с отдельными его частями. И если мы хотим, например, сохранить улицу и не потерять дополнительные данные в виде района, то нужно как-то разбивать полный адрес на нужные блоки. Причем ответы могут быть еще более дикими и запутанными.
Мы пришли к решению, что можно распарсить адрес с помощью определения подобия строк, используя отдельные данные по городу, улице и т. п. То есть выискивать в полном адресе его части, сравнивая на подобие отдельные блоки из полей с полным адресом. Часть алгоритма удалось унифицировать, и ее я представляю тут.
Раз.
Два.
Тут можно заметить, что при поиске слева или справа проверяемая строка наращивает новые элементы в произвольном порядке (не так, как расположены элементы в исходном массиве). Но для этого алгоритма и функции расчета коэффициента это не так важно, поэтому для упрощения и ускорения направление не учитывается.
Второй кейс уже относится конкретно к платформе Salesforce.
Так как часть пользователей у нас пользуется старым интерфейсом платформы SF Classic, нам нужно было предоставить доступ к странице, построенной на новом компонентом интерфейсе, через этот старый интерфейс.
Работает так: открываем через стандартную кнопку из классики страницу Visualforce, в ней открываем Aura Component, а уже в нем — lwc-компонент. Проще говоря, новая технология в старой обертке.
Из-за этого стандартные lwc-toast-уведомления не работают. Мы сделали кастомный Toast. Возможно, кто-то уже его ищет.
И он просто внедряется в любой компонент без доработок, вот так:
Как любой дочерний компонент, вы добавляете его в родительский и вызываете его апи-метод при необходимости.