Клиентский проект3 мин чтения
MyLanit - веб-часть фотогалерей и фотоконкурсов для корпоративного портала

Технологии
Ссылки
Услуги
- →Анализ требований и архитектура решения
- →Разработка кастомной веб-части на React + Redux
- →Интеграция с SharePoint REST API и списками
- →Интеграция rich-text-редактора TinyMCE
- →Интерфейс администратора и инструменты модерации контента
- →Проектирование API-контракта с параллельной backend-командой
Результаты
- ✓Самообслуживаемая веб-часть фотогалереи и конкурса
- ✓Автоматический жизненный цикл конкурса - голосование открывается и закрывается без участия IT
- ✓Админ-веб-часть с полным CRUD, модерацией и дашбордом результатов
- ✓Галерея на masonry-сетке с бесконечной прокруткой и функциями вовлечения (лайки, комментарии, голосование)
Задача
ЛАНИТ нужен был способ проводить внутренние фотоконкурсы на корпоративном портале SharePoint - то, чего не было из коробки. Сотрудники должны иметь возможность загружать фото, голосовать за понравившиеся и оставлять комментарии, а HR-менеджерам нужен был полный контроль над жизненным циклом конкурса без правки кода и звонков в IT.
Исследование
Погрузившись в требования, мы поняли, что задача шире простого виджета галереи. Нужны были два разных режима - свободная фотогалерея и конкурс с голосованием по таймеру - каждый со своей моделью прав, состоянием интерфейса и жизненным циклом. Данные голосования должны были переживать перезапуски портала и интегрироваться со списками SharePoint, где уже хранился другой корпоративный контент.
Рассмотренные варианты
Перед выбором решения оценили три направления:
- Готовые надстройки SharePoint - отклонены, потому что ни одна не поддерживала кастомную логику голосования или требования к брендингу клиента.
- Внешний сервис во встроенном iframe - отклонён из-за корпоративной политики безопасности, запрещающей обработку внутреннего контента сторонними системами.
- Кастомная веб-часть на React - выбрана. Полный контроль над UX, владение данными остаётся внутри SharePoint, а кодовую базу может поддерживать штатная команда.
Решение
Кастомная веб-часть на React была единственным путём, удовлетворяющим всем ограничениям одновременно: суверенитет данных, свобода дизайна и возможность выпустить оба режима из единого разворачиваемого артефакта. Для управления состоянием выбрали Redux - с учётом сложности состояния голосования между компонентами; Redux-Router обеспечил виртуальную навигацию без изменений серверной маршрутизации в SharePoint.
Реализация
Фронтенд и бэкенд разрабатывались параллельно при строгой дисциплине API-контракта. Плитки фото используют masonry-сетку для раскладки в стиле Pinterest; react-infinite-scroller полностью убирает пагинацию. Кастомная обёртка над TinyMCE связывает rich-text-редактор с Redux Forms - нетривиальная интеграция, потребовавшая аккуратного управления жизненным циклом, чтобы избежать утечек памяти. Серверная запланированная задача следит за датами окончания конкурсов и автоматически переводит их в режим результатов, убирая любой ручной шаг из процесса HR.
Выпущены две ролевые поверхности: веб-часть для сотрудников (загрузка, просмотр, лайки, комментарии, голосование) и отдельная админ-веб-часть (полный CRUD для галерей и конкурсов, очередь модерации, дашборд результатов с защитой от случайного удаления).
Практически вся работа шла на удалённых Windows-серверах. Клиент удалённого рабочего стола стал почти родным: любая задача начиналась с подключения к удалённому серверу.

Результат
HR-команды перешли от координации фотоконкурсов по почте с ручным подсчётом голосов в таблицах к полностью самообслуживаемому процессу. Создание конкурса занимает менее двух минут. Голосование закрывается автоматически. Результаты видны всем сотрудникам в момент истечения дедлайна - участие IT не требуется ни на одном этапе.
Обзор пользовательского интерфейса
Обзор интерфейса администратора
Сервис статистики
Сбор статистики с внутреннего портала в Google Analytics. Данные пользователей в записи вымышленные, секреты тестовые; публикуется после истечения сроков давности.
Прошлись по ТЗ заказчика и разобрали, как в уже выстроенной коробочной системе выполнить бизнес-требование по генерации нужного отчёта по конкретной метрике, не строя ничего нового.
По теме
Проекты

Jiro Health - практическая аналитика для врачей
До: практикующим медикам в США приходилось собирать данные о доходах, рекомендациях и денежных потоках из систем, которые медленно подключались. После: как principal/founding engineer в команде основателей я веду разработку API своих подов от спецификации до релиза и строю интерфейсы корпоративного уровня на Node.js с фоновой обработкой данных на Python.

Челябинский государственный университет - доработка и администрирование портала на SharePoint
До: университетскому порталу на SharePoint не хватало того, чего нет в платформе из коробки: календаря событий, рейтинговых списков из выгрузок FoxPro, мобильной вёрстки и защищённых от спама адресов. После: свои веб-части добавили календарь с синхронизацией из Google, рейтинговые списки на SSRS, которые обновляются из загрузки, и скрытые email, а сайт получил адаптивную мобильную версию.

Почта России - корпоративный портал для государственных почтовых отправлений
У Почты России были десятки насыщенных данными экранов без единого компонента таблицы. Мы построили стандартизированный, работающий с сервером CustomGrid - а затем завели всё его состояние в Redux - чтобы каждая таблица в портале вела себя одинаково.
Открыт для работы по контракту
Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.
Записаться на 30-минутный звонок