Кастомизация Document Manager

Document Manager это комплексный виджет, разработанный с помощью MV* фреймфорка Webix Jet. Это готовое приложение с минимальной конфигурацией и специальным API для переопределения логики внутренних модулей.

Кастомизация компонентов и моделей подразумевает работу с исходным кодом.

Природа Jet-приложения и внутренние модули

Document Manager построен как Jet приложение в обёртке Webix компонента, поэтому вы можете инициализировать его любым из двух способов.

Компоненты

Интерфейс Document Manager разбит по частям (компонентам). Каждый компонент, это класс, который наследуется от класса JetView и имеет свои методы и конфигурацию.

Исходный код частей интерфейса (компонентов Jet) находится в папке sources/views.

views
    cards.js
  editor.js
  menus
     addnewmenu.js
   ...

На странице карты классов представлен список используемых компонентов, а также их расположение на в интерфейсе.

Модели/Сервисы

В моделях Document Manager описана логика для загрузки, хранения и кэширования данных, скачивания файлов, визуализации прогресса операций сохранения и др. В Webix Jet модели называются сервисами.

Исходный код для моделей (сервисов Jet) находятся в папке sources/models.

models
    Backend.js
    LocalData.js
    LocalTags.js
    LocalUsers.js
    Operations.js
    Tags.js
    Users.js
    Versions.js

Методы сервисов вызываются самим интерфейсом, но также могут быть вызваны программистом напрямую:

$$("dm").getService("versions").restore(id, version);

Кастомизация компонентов

  • вы можете переопределять метод config() для изменений в UI
  • вы можете переопределять метод init() для изменений в UI и поведении компонентов
  • вы можете переопределять любой метод, но с осторожностью
  • вы можете создавать и вызывать свои методы

Для начала создайте класс и наследуйте его от класса по умолчанию или от docmanager.views.JetView:

class CustomTopBar extends docManager.views.topbar {
  config(){
    // получаем JSON объект с конфигурацией
    const ui = super.config();
    // изменения конкретного компонента
    ui.height = 50;
    return ui;
  }
  init() {
    // вызываем логику по умолчанию
    super.init();
    // а это уже пользовательский метод
    this.doSomething();
  }
  doSomething(){
    // какое-либо действие при инициализации
  }
}

Затем переопределите компонент (класс) по умолчанию с помощью свойства override:

webix.ui({
    view: "docmanager",
    url: "https://docs.webix.com/docmanager-backend/",
    override: new Map([
        [docManager.views.topbar, CustomTopBar]
    ])
});

Одиночный режим отображения

Чтобы показывать определённую вкладку ("cards", "grid", "double") без возможности переключения между ними, скройте компонент Tabbar у класса docManager.views.topbar:

class CustomTopBar extends docManager.views.topbar {
    init() {
        // логика по умолчанию
        super.init();
        // removing components can cause errors
        // hiding components is safe
        this.$$("modes").hide();
    }
}

После этого замените класс по умолчанию новым классом с помощью свойства override:

{
    view:"docmanager",
    mode: "cards", // показываем любую вкладку (кроме "grid")
    override: new Map([[docManager.views.topbar, CustomTopBar]]),
}

Related sample:  Document Manager: Single Mode

Больше примеров кастомизации смотрите в практических руководствах.

Рекомендации

1. Мы не рекомендуем удалять компоненты из интерфейса, т.к. внутренняя логика может всё ещё обращаться к ним. Вы можете скрывать компоненты.

class CustomTopBar extends docManager.views.topbar {
    init() {
        // логика по умолчанию
        super.init();
        // удаление компонента может спровоцировать ошибку
        // скрытие компонента безопасно
        this.$$("modes").hide();
    }
}

2. Получить экземпляр компонента внутри Jet можно следующими способами:

  • с помощью метода $$(id) у JetView.

Метод работает для внутреннего компонента, у которого определён локальный ID (localId).

init() {
    // логика по умолчанию
    super.init();
    // получаем экземпляр компонента с localId = "modes"
    this.$$("modes").hide();
}
  • с помощью queryView, если localId не определён.
init(view) {
    // логика по умолчанию
    super.init();
    // получаем экземпляр первой кнопки segmented
    view.queryView("segmented").hide();
}

3. С помощью кода ниже можно определить, в компактном ли режиме приложение в данный момент:

const compact = this.getParam("compact", true);

Метод доступен из любого компонента или сервиса.

4. Чтобы получить текущее состояние приложения и его реактивные свойства воспользуйтесь одним из способов ниже:

const state = this.app.getState();
// или
const state = this.getParam("state");

Методы доступен из любого компонента или сервиса.

Кастомизация сервисов Jet

  • вы можете добавлять и вызывать свои методы
  • вы можете переопределять любые существующие методы, но с осторожностью

Прежде всего создайте свой класс сервиса и наследуйте его от класса сервиса по умолчанию:

class MyBackend extends docManager.services.Backend {
  folders(){
    // клиентские данные
    return webix.promise.resolve(folders);
  }
}

Затем переопределите класс по умолчанию вашим с помощью свойства override:

webix.ui({
    view: "docmanager",
    url: "https://docs.webix.com/docmanager-backend/"
    override: new Map([
      [docmanager.services.backend, MyBackend]
    ])
});

Related sample:  Document Manager: Data Source

Больше информации о сервисе Backend в Document Manager читайте в этой статье.

Обратная совместимость

Document Manager - это очень гибкий виджет в отношении кастомизаций: вы можете менять в нём практически всё, что угодно. Однако следует помнить о следующих моментах:

  • Внутренняя логика модулей Document Manager может меняться в последующих релизах.
  • Мы сделаем всё, чтобы оставить сигнатуры методов без изменений, но в случае необходимости возможны критические изменения.

Обратите внимание, что у кода для IE11 и Edge должен быть другой синтаксис.

Наверх