/**
  * Действие в случае ошибки при сабмите.<br>
  * По умолчанию выдаёт сообщение об ошибке, и далее проверяет, остались ли ещё незавершённые
  * сабмиты. Если нет, то скрывает индикатор загрузки и вызывает afterSave(). Может быть
  * переопределён в классе-наследнике.
  *
  * @param resultRecord запись
  * @param resultHtml полученный от сервера результат сабмита в виде строки
  */
 protected void onSubmitFailure(JepRecord resultRecord, String resultHtml) {
   messageBox.showError(clientFactory.getTexts().errors_file_uploadError() + "\n" + resultHtml);
   if (submitCounter == 0) {
     JepClientUtil.hideLoadingPanel();
     afterSave(resultRecord);
   }
 }
  /**
   * Обработчик события сохранения 'save' В зависимости от состояния выполняет сохранение
   * существующего или создание нового объекта.
   *
   * <p>Метод используется в случае использования стандартного сервиса работы с данными
   * JepStandardService. При реализации в прикладном модуле собственного сервиса необходимо в
   * презентере-наследнике прикладного модуля реализовать перекрывающий метод onSave().
   */
  public void onSave(SaveEvent event) {
    if (fields.isValid()) {
      JepRecord formProperties = fields.getValues();

      logger.debug(this.getClass() + ".onSave(): formProperties = " + formProperties);

      // Для подчинённых объектов добавляется foreignKey.
      if (JepScopeStack.instance.size() > 1 || !JepScopeStack.instance.peek().isMainActive()) {
        JepClientUtil.addForeignKey(formProperties);
      }

      // Для режима редактирования текущую запись
      // необходимо дополнить или переписать значениями с формы.
      if (EDIT.equals(_workstate)) {
        JepRecord updatedRecord = new JepRecord(currentRecord);
        updatedRecord.update(formProperties);
        formProperties = updatedRecord;
      }

      // Если не выполнены первоначальные условия проверки, то выходим из сохранения.
      if (!beforeSave(formProperties)) return;

      eventBus.setSaveButtonEnabled(false);

      if (CREATE.equals(_workstate)) {
        saveOnCreate(formProperties);
      } else if (EDIT.equals(_workstate)) {
        saveOnEdit(formProperties);
      }

    } else {
      messageBox.showError(clientFactory.getTexts().errors_dialog_form_incorrectInputData());
    }
  }
 /**
  * При необходимости выполнить какие-либо дополнительные действия после сохранения метод
  * перекрывается наследниками.
  *
  * @param resultRecord результирующая запись
  */
 protected void afterSave(JepRecord resultRecord) {
   // Поскольку БД-модуль не обязан возвращать родительский ключ.
   if (JepScopeStack.instance.size() > 1 || !JepScopeStack.instance.peek().isMainActive()) {
     JepClientUtil.addForeignKey(resultRecord);
   }
   // Текущую запись обновляем ТОЛЬКО после успешного сохранения.
   eventBus.setCurrentRecord(resultRecord);
   // Вызов перехода на новый Place происходит ОБЯЗАТЕЛЬНО ПОСЛЕ подготовки данных для записи в
   // History
   // (изменения Scope в обработчиках шины событий).
   placeController.goTo(new JepViewDetailPlace());
 }
 /** Обработчик события поиска "doSearch". */
 public void onDoSearch(DoSearchEvent event) {
   if (fields.isValid()) {
     // Получим значения с формы.
     JepRecord formProperties = fields.getValues();
     // Добавим foreignKey.
     JepClientUtil.addForeignKey(formProperties);
     PagingConfig pagingConfig = new PagingConfig(formProperties);
     eventBus.search(pagingConfig);
     // Вызов перехода на новый Place происходит ОБЯЗАТЕЛЬНО ПОСЛЕ подготовки данных для записи в
     // History
     // (изменения Scope в обработчиках шины событий).
     placeController.goTo(new JepViewListPlace());
   } else {
     messageBox.showError(JepTexts.errors_dialog_form_incorrectInputData());
   }
 }
 /**
  * Действие в случае успешного сабмита.<br>
  * По умолчанию проверяет, остались ли ещё незавершённые сабмиты, и если нет, то скрывает
  * индикатор загрузки и вызывает afterSave(). Может быть переопределён в классе-наследнике.
  *
  * @param resultRecord запись
  */
 protected void onSubmitSuccess(JepRecord resultRecord) {
   if (submitCounter == 0) {
     JepClientUtil.hideLoadingPanel();
     afterSave(resultRecord);
   }
 }