В отделе фронтенда команды sensenet у нас остались долгие недели. Новые функции в серверной части и наша незавершенная DMS MVP породили множество задач и дали нам много улучшений. Но теперь мы выпустили все эти новые вещи, поэтому можем немного расслабиться и подвести итоги того, что уже сделано. Присоединяйтесь к нам и следите за последними новостями, и, возможно, вы немного узнаете о предстоящих событиях.

sn-client-js 3.0.0

Sn-client-js - это ядро ​​- и основная точка входа - наших клиентских пакетов. Он содержит логику взаимодействия с репозиторием, аутентификации, запросов и объединяет встроенные типы контента.

Уточнение концепций типа контента

Типы содержимого Typescript могут быть сгенерированы из серверной части sensenet ECM и полезны, если вы хотите написать код строго типизированный Typescript. В предыдущих выпусках типы контента были унаследованы от класса Content (который представляет собой представление экземпляра контента, управляемое моделью предметной области). Например, наследование User выглядело так:

Контент GenericContent Пользователь

Теперь мы извлекли наш класс Content (теперь ContentInternal) из цепочки наследования и создали псевдоним типа под названием Content - это тип объединения * ContentInternal *. и указанный Тип. Это изменение дает некоторые из многих преимуществ

  • Если вы используете простой JavaScript, вам даже не нужно заботиться о типах контента (кроме случаев создания контента).
  • Мы можем удалить всю логику из сгенерированных определений типов контента. Это примерно 1000 строк кода :)
  • Использовать свои собственные типы контента будет намного проще. Вам нужно только определить новый класс Typescript, который реализует IContent, и вы можете его использовать.

Схемы, привязанные к репозиторию

ContentTypes и Schemas описывают контент. На данный момент схемы используются для генерации и проверки динамических форм. Схемы - в отличие от ContentTypes - могут изменяться во время выполнения. Сразу после того, как вы измените определение типа контента (например, добавите новое обязательное поле в старом обзоре или, может быть, в одном из будущих выпусков нашего графического интерфейса администратора;)) вы будете ожидать, что следующий контент, который вы создадите, подберет изменение. В настоящий момент также создаются схемы, но с этого момента они используются только как значения по умолчанию. У экземпляров репозитория есть свои собственные хранилища схем, и их содержимое можно заменить. Мы планируем добавить функцию перезагрузки живой схемы в следующем выпуске.

Загрузить

Мы добавили функцию частичной загрузки в версию 2.5.0, теперь мы ее улучшили. У нас есть три конечных точки для загрузки. С помощью repository.UploadFile () вы можете загрузить простой объект File из формы или события Drop, с помощью repository.UploadTextAsFile () вы можете сохранить строку как двоичный файл и, наконец, repository.UploadFromDropEvent () позволяет загружать весь список файлов или поддерево с каталогами из простого события Drop. Событие загрузки работает с rx / js observables, поэтому можно легко отслеживать информацию о ходе загрузки на основе готовых фрагментов. В этом выпуске к параметрам загрузки добавлены дополнительные параметры OData. Они полезны, если вы хотите указать поля для выбора или раскрытия после завершения загрузки, чтобы вам не приходилось перезагружать содержимое файла вручную.

Пакетные действия

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

{  
   "d":{  
      "__count":3,
      "results":[  
         {  
            "Id":101,
            "Path":"Root/Workspace/DocLib",
            "Name":"a"
         }         {  
            "Id":102,
            "Path":"Root/Workspace/DocLib",
            "Name":"b"
         }
      ],
      "errors":[  
         {  
            "content":{  
               "Id":103,
               "Path":"Root/Workspace/DocLib",
               "Name":"C"
            },
            "error":{  
               "code":"NotSpecified",
               "exceptiontype":"Exception",
               "message":{  
                  "lang":"en-us",
                  "value":"Error message value"
               },
               "innererror":{  
                  "trace":"InnerError Trace value"
               }
            }
         }
      ]
   }
}

Вышеупомянутая операция вызовет два события repository.Events.OnContentCreated и дополнительный repository.Events.OnContentCreateFailed для одного HTTP-запроса.

Но что делать с пакетными операциями и событиями репозитория?

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

OAuth

Мы добавили поддержку поставщика OAuth для службы аутентификации JWT. Это означает, что вы можете реализовать и добавить своего собственного провайдера OAuth - точно так же, как мы сделали это в sn-client-auth-google.

sn-client-auth-google 1.0.0

Этот пакет является нашим первым официальным поставщиком OAuth на стороне клиента. Для этого требуется sensenet ^ 7.0.0 с установленным SN7 провайдер OAuth и проект консоли Google API. Вы можете использовать его с официальной Библиотекой платформы Google или без нее или с любым сторонним компонентом, который может получать id_token.

Мы сосредоточились на том, чтобы эта библиотека была простой и простой в использовании. Надеюсь, вы сможете интегрировать ее в течение нескольких минут - после проверки примера в readme.

sn-redux 3.4.0

Sn-redux всегда следит за sn-client-js, мы работаем в основном параллельно, и на этот раз так и произошло. Узнайте, как были добавлены новые функции и чего и как вы можете достичь с их помощью.

Загрузить

Есть три новых действия для обработки материалов, связанных с загрузкой. Один для запроса загрузки (может обрабатывать только один файл одновременно), один для обработки, если файл был успешно загружен, и один для сбоя загрузки. Функциональность загрузки также реализована в связанных редукторах, поэтому, если был загружен новый файл, его идентификатор добавляется в массив ids, а объект entities будет содержать новый контент. Конечно, есть новый redux-observable, обрабатывающий запрос ajax в фоновом режиме, поэтому для того, чтобы иметь возможность загрузки, вам просто нужно вызвать действие загрузки:

Actions.UploadRequest(content, file)

Param content - это родительский объект содержимого, а file - это файл, который необходимо загрузить.

Подробнее о загрузке в sn-redux читайте в Справочнике по API.

Пакетные действия

Отныне пакетные операции также поддерживаются в sn-redux с тремя новыми действиями для обработки запросов, успешных и неудачных операций. Поскольку ответы пакетных операций могут быть смешанными (часть содержимого может быть загружена, а часть - нет), добавлен новый редуктор с именем batchResponses для хранения пользовательского ответа и ошибки. На заднем плане три новых эпоса обрабатывают процессы.

Подробнее о пакетных операциях в sn-redux читайте в Справочнике по API.

OAuth

Поскольку необходимый провайдер был готов как на бэкэнде, так и в sn-client-js, было необходимо добавить действие для обработки входа (и регистрации) с учетной записью Google в sn-redux. Однако процесс после входа в систему такой же, как и при создании нового эпика под названием userLoginGoogleEpic. Этот новый эпик подписан на новое действие запроса входа в систему, но если на него был получен успешный ответ или он был неудачным, он отправляет те же действия, которые используются в простом процессе входа в систему.

Что дальше?

Давайте в двух словах посмотрим, что у нас осталось на зиму:

Ограниченные пакеты npm

Поскольку sn-client-js начал слишком быстро расти, будет хорошей идеей разделить его на несколько пакетов. Мы должны изменить наши соглашения об именах с нашими пакетами NPM и ввести область видимости пакетов для пакетов, специфичных для @senet, точно так же, как это сделали @Material, @angular, @aurelia или @ReactiveX.

ContentTypes против схем

Поскольку ContentTypes и Schemas как автоматически сгенерированные классы связаны вместе и тесно связаны с объектом Repository, мы не можем расширять или добавлять типы контента из разных пакетов (службы sensenet, веб-страницы и т. Д.). Поэтому в будущем мы должны распространять ContentTypes в отдельном пакете, чтобы можно было добавлять типы контента и схемы без изменения sn-client-js.

Улучшения CTD

Определения типов контента Sensenet великолепны, но время от времени их нужно обновлять. На этот раз это означает некоторые важные улучшения, такие как добавление решений для группировки полей, упорядочивания и некоторые изменения в свойстве Icon для обработки библиотек шрифтов и значков, таких как Значки материалов или Font awesome.

Локализация

Строковые ресурсы были включены на стороне клиента через встроенный в sensenet механизм связывания и обработки зависимостей. Поскольку мы создаем отдельные приложения с обменом данными через OData, мы должны выяснить, как локализованные строковые ресурсы могут быть распределены от sensenet ECM к клиенту.

Первоначально опубликовано на сайте community.senet.com 29 ноября 2017 г.