← Назад ко всем проектам

Клиентский проект3 мин чтения

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

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

Технологии

ReactSharePointReduxGalleryPhotoProjectFrontend

Ссылки

Услуги

  • →Анализ требований и архитектура решения
  • →Разработка кастомной веб-части на React + Redux
  • →Интеграция с SharePoint REST API и списками
  • →Интеграция rich-text-редактора TinyMCE
  • →Интерфейс администратора и инструменты модерации контента
  • →Проектирование API-контракта с параллельной backend-командой

Результаты

  • ✓Самообслуживаемая веб-часть фотогалереи и конкурса
  • ✓Автоматический жизненный цикл конкурса - голосование открывается и закрывается без участия IT
  • ✓Админ-веб-часть с полным CRUD, модерацией и дашбордом результатов
  • ✓Галерея на masonry-сетке с бесконечной прокруткой и функциями вовлечения (лайки, комментарии, голосование)

Задача

ЛАНИТ нужен был способ проводить внутренние фотоконкурсы на корпоративном портале SharePoint - то, чего не было из коробки. Сотрудники должны иметь возможность загружать фото, голосовать за понравившиеся и оставлять комментарии, а HR-менеджерам нужен был полный контроль над жизненным циклом конкурса без правки кода и звонков в IT.

Исследование

Погрузившись в требования, мы поняли, что задача шире простого виджета галереи. Нужны были два разных режима - свободная фотогалерея и конкурс с голосованием по таймеру - каждый со своей моделью прав, состоянием интерфейса и жизненным циклом. Данные голосования должны были переживать перезапуски портала и интегрироваться со списками SharePoint, где уже хранился другой корпоративный контент.

Рассмотренные варианты

Перед выбором решения оценили три направления:

  1. Готовые надстройки SharePoint - отклонены, потому что ни одна не поддерживала кастомную логику голосования или требования к брендингу клиента.
  2. Внешний сервис во встроенном iframe - отклонён из-за корпоративной политики безопасности, запрещающей обработку внутреннего контента сторонними системами.
  3. Кастомная веб-часть на React - выбрана. Полный контроль над UX, владение данными остаётся внутри SharePoint, а кодовую базу может поддерживать штатная команда.

Решение

Кастомная веб-часть на React была единственным путём, удовлетворяющим всем ограничениям одновременно: суверенитет данных, свобода дизайна и возможность выпустить оба режима из единого разворачиваемого артефакта. Для управления состоянием выбрали Redux - с учётом сложности состояния голосования между компонентами; Redux-Router обеспечил виртуальную навигацию без изменений серверной маршрутизации в SharePoint.

Реализация

Фронтенд и бэкенд разрабатывались параллельно при строгой дисциплине API-контракта. Плитки фото используют masonry-сетку для раскладки в стиле Pinterest; react-infinite-scroller полностью убирает пагинацию. Кастомная обёртка над TinyMCE связывает rich-text-редактор с Redux Forms - нетривиальная интеграция, потребовавшая аккуратного управления жизненным циклом, чтобы избежать утечек памяти. Серверная запланированная задача следит за датами окончания конкурсов и автоматически переводит их в режим результатов, убирая любой ручной шаг из процесса HR.

Выпущены две ролевые поверхности: веб-часть для сотрудников (загрузка, просмотр, лайки, комментарии, голосование) и отдельная админ-веб-часть (полный CRUD для галерей и конкурсов, очередь модерации, дашборд результатов с защитой от случайного удаления).

Практически вся работа шла на удалённых Windows-серверах. Клиент удалённого рабочего стола стал почти родным: любая задача начиналась с подключения к удалённому серверу.

Окно подключения к удалённому рабочему столу Windows-сервера, адрес сервера и логин скрыты
Любая задача начиналась с удалённого подключения

Результат

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

Обзор пользовательского интерфейса

Обзор интерфейса администратора

Сервис статистики

Сбор статистики с внутреннего портала в Google Analytics. Данные пользователей в записи вымышленные, секреты тестовые; публикуется после истечения сроков давности.

Прошлись по ТЗ заказчика и разобрали, как в уже выстроенной коробочной системе выполнить бизнес-требование по генерации нужного отчёта по конкретной метрике, не строя ничего нового.

Проекты

Jiro Health - практическая аналитика для врачей

Jiro Health - практическая аналитика для врачей

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

Челябинский государственный университет - доработка и администрирование портала на SharePoint

Челябинский государственный университет - доработка и администрирование портала на SharePoint

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

Почта России - корпоративный портал для государственных почтовых отправлений

Почта России - корпоративный портал для государственных почтовых отправлений

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

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок