Перейти к содержанию

Введение#

Одним из основных инструментов Лексемы являются Документ и Реестр документов. Документ выполняет функцию структурированного хранения и вывода информации из БД. В Лексеме документ – это форма (наследник от Form), которая имеет привязку к модели и обладает рядом дополнительных свойств для работы с данными. С точки зрения БД документ – это одна строка в таблице. Реестр документов – это список (форма с одной лишь таблицей) в котором выведены документы, он выполняет менеджерские функции над документами (создание, просмотр, удаление).

Документ#

Как писалось выше, документ – это форма, привязанная к модели (таблице в БД). Чтобы создать такую форму, класс должен быть наследован от класса Document и иметь переопределённое свойство binding, которое должно возвращать модель, к которой привязан документ.

Пример.

Класс документа City (город).

import { Document } from 'ecosoft-lexema8'
import template from './CityForm.xml'
import model from './city.model.json'
export default class CityForm extends Document {
  constructor(args) {
    super(args)
  }
  static get template() {
    return template
  }
  static get binding() {
    return model
  }
}

Методы#

Методы экземпляра класса Document:

Наименование Описание
save() метод, содержащий логику сохранения, в том числе функционал оптимистического блокировщика
copy() метод копирования документа
onSaved() стандартный "обработчик" сохранения, отправляющий событие saved сервиса документов
reloadData() выполняет перезагрузку данных, на которых построен документ

Статические методы класса Document:

Наименование Описание
loadData() описывает логику загрузки данных документа

Пример. Добавим к предыдущему примеру кнопки Сохранения изменений документа в заголовок.

Макет.

<Form writeRoles='Super' title='Город'>
  <ToolBar >
    <Tool id="toolBarItemSave" caption="Сохранить" image="current-theme/images/leftNavBar/save.png" clicked='toolBarItemSave_clicked' />
    <Tool id="toolBarItemSaveAndExit" caption="Сохранить и закрыть" image="current-theme/images/leftNavBar/saveAndClose.png" clicked='toolBarItemSaveAndExit_clicked' />
    <Tool id="toolBarItemExit" caption="Закрыть" image="current-theme/images/leftNavBar/close.png" clicked='toolBarItemExit_clicked'/>
  </ToolBar>
  <Layout>
...
  </Layout>
</Form>

Класс.

import { Document } from 'ecosoft-lexema8'
import template from './CityForm.xml'
import model from './city.model.json'
export default class CityForm extends Document {
  constructor(args) {
    super(args)
  }
  static get template() {
    return template
  }
  static get binding() {
    return model
  }
  /** Сохранить */
  toolBarItemSave_clicked() {
    this.save().done(() => {
      this.services.dialog.info('Документ сохранен');
    })
  }
  /** Сохранить и закрыть */
  toolBarItemSaveAndExit_clicked() {
    this.save().done(() => {
      this.services.dialog.info('Документ сохранен');
      this.close();
    })
  }
  /** Закрыть */
  toolBarItemExit_clicked() {
    this.close();
  }
}

Регистрация#

Регистрация документа прописывается в units.json. Параметр caption не указывается, чтобы не выводить его в меню.

1
2
3
4
{
        "key": "CityForm",
        "form": "./forms/CityForm.js"
      }

Реестр документов#

Для управления документами в Лексеме существует «Реестр документов», он выполняет следующие функции:

Создание новых документов

Вывод существующих документов

Открытие существующего документа

Удаление документа

По сути это форма, на которой расположен только один контрол – grid (таблица) и управляющие кнопки в заголовке.

Класс, описывающий реестр, должен быть отнаследован от класса Registry, привязан к модели (свойство binding) и переопределить свойство documentKey. Макет должен содержать аналитический грид (таблица, в которой возможен только вывод информации) с id=’grid’ и ссылкой на форму документа (viewName).

Пример.

Макет реестра документов «Город».

<Form writeRoles="Super" title='Город'>
  <ToolBar>
    <Tool caption='Создать документ' id='CreateToolbarItem1' image='current-theme/images/leftNavBar/new.png' clicked='createDocument' />
    <Tool caption='Удалить' id='DeleteToolbarItem1' image='current-theme/images/leftNavBar/trash.png' clicked=deleteSelectedDocuments' />
  </ToolBar>
  <Layout >
    <AnalyticalGrid id='grid' bind='*' viewName="CityForm" primaryKeyName='VCode' filterable="true" sortable='true' selectionMode='checkbox' columnsResize='true' showFilterRow="true" width='100%' editorWidth='12' height="100%">
      <Column text='Дата документа' datafield='DocumentDate' cellsformat='dd.MM.yyyy' cellsalign='left' align='center' width='10%' >
        <DateTimeInput/>
      </Column>
...
    </AnalyticalGrid>
  </Layout>
</Form>

Класс формы.

import { Registry } from 'ecosoft-lexema8' // импорт родительского класса для реестра
import template from './CityRegistry.xml' // импорт макета документа
import model from '../city.model.json' // импорт модели
export default class CityRegistry extends Registry {
  constructor(...args) {
    super(...args);
  }
  // макет документа
  static get template() {
    return template;
  }
  // привязка к модели
  static get binding() {
    return model;
  }
  static get documentKey () {
    return 'CityForm';
 }
}

Обратите внимание, что в макете кнопки управления смотрят на методы createDocument и deleteSelectedDocuments, но в классе невидна их реализация. Дело в том, что это стандартные методы реестра, их описание смотрите ниже.

В классе свойство documentKey возвращает идентификатор формы документа, он указывается при регистрации формы в units.json, в свойстве key. Данный параметр необходим для корректной работы функции createDocument.

Свойства#

Наименование Описание
trackableSources возвращает массив отслеживаемых сущностей (по умолчанию - свойство binding текущего класса)
grid возвращает ссылку на грид, который является основным гридом реестра (по умолчанию - первый найденный на форме грид)
documentKey возвращает ключ документа, используется в методе создания документа из реестра и из меню

Методы#

Наименование Описание
createDocument обёртка над методом создания документов, привязанная к источнику данных, на которой построен реестр
copyDocument метод копирования документа
deleteSelectedDocuments метод, запрашивающий у пользователя подтверждение удаления объектов, выделенных в основном гриде, и удаляющий их в случае получения подтверждения
onDocumentSaved стандартный "обработчик" события сохранения документов сервиса документов
loadData описывает логику загрузки данных реестра
getDataParameters статический метод, отвечающий за получение параметров для загрузки источника данных
openDialog обёртка над методом вызова диалога выбора периода, сохраняющая выбранный период и перезагружающая источник данных с учётом новых параметров
getPeriod метод, возвращающий объект с тремя свойствами (rDate, beginDate, endDate), если вызван в реестре с настроенным свойством dateProperty в модели, либо пустой объект.

Регистрация#

Реестр, как и все формы регистрируется в units.json.

1
2
3
4
5
6
{
        "caption": "Город",
        "key": "CityRegistry",
        "form": "./forms/CityRegistry.js",
        "creation": "true"
      }

Свойство caption необходимо для вывода ссылки на реестр в меню.

Свойство creation не обязательно, при его включении появляется возможность создания нового документа прямо из меню. В этом случае в меню рядом с ссылкой на реестр появится иконка создания нового документа.