(self["webpackChunktine20_tinebase"] = self["webpackChunktine20_tinebase"] || []).push([[2421],{

/***/ 86715:
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */

__webpack_require__(86469);
__webpack_require__(65424);
Ext.ns('Tine.GDPR.Addressbook');
Tine.GDPR.Addressbook.EditDialogPlugin = function () {};
Tine.GDPR.Addressbook.EditDialogPlugin.prototype = {
  contactEditDialog: null,
  app: null,
  init: function (cmp) {
    this.contactEditDialog = cmp;
    this.app = Tine.Tinebase.appMgr.get('GDPR');

    // intercept save contact
    cmp.on('save', this.onBeforeSave, this);
  },
  onBeforeSave: function (cmp, record, ticketFn) {
    var resolve = ticketFn();
    if (this.data) {
      // need this for duplicate check. Doesn´t show GDPR Windows after duplicate check.
      this.onBeforeApplyProvenanceDialog(this.data);
      resolve();
    } else {
      var window = Tine.GDPR.Addressbook.DataProvenanceDialog.openWindow({
        listeners: {
          scope: this,
          beforeapply: this.onBeforeApplyProvenanceDialog
        }
      });
      window.on('beforeclose', this.onBeforeCloseProvenanceDialog.createDelegate(this, [resolve]), this);
    }
  },
  validateDataProvenance: function () {
    var mandatoryConfig = Tine.Tinebase.configManager.get('dataProvenanceADBContactMandatory', 'GDPR');
    return !!(mandatoryConfig != 'yes' || this.contactEditDialog.record.get('GDPR_DataProvenance'));
  },
  onBeforeApplyProvenanceDialog: function (data) {
    var _ = window.lodash,
      me = this;
    _.each(data, function (v, k) {
      if (v) {
        me.contactEditDialog.record.set(k, v);
      }
    });
    this.data = data;
    return me.validateDataProvenance();
  },
  onBeforeCloseProvenanceDialog(resolve) {
    var _ = window.lodash,
      me = this;
    if (!me.validateDataProvenance()) {
      return false;
    }
    resolve();
  }
};
Ext.preg('Tine.GDPR.Addressbook.EditDialogPlugin', Tine.GDPR.Addressbook.EditDialogPlugin);
Ext.ux.pluginRegistry.register('/Addressbook/EditDialog/Contact', Tine.GDPR.Addressbook.EditDialogPlugin);

/***/ }),

/***/ 65424:
/***/ (() => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */

Ext.ns('Tine.GDPR.Addressbook');
Tine.GDPR.Addressbook.ContactGDPRPanel = Ext.extend(Ext.Panel, {
  layout: 'fit',
  border: false,
  requiredGrant: 'editGrant',
  canonicalName: ['Addressbook', 'EditDialog', 'Contact', 'GDPRPanel'].join(Tine.Tinebase.CanonicalPath.separator),
  initComponent: function () {
    var me = this;
    this.app = this.app || Tine.Tinebase.appMgr.get('GDPR');
    this.title = this.app.i18n._('GDPR');
    this.action_gdpr = new Ext.Button({
      text: this.app.i18n._('GRPR LINK'),
      handler: () => {
        window.open(this.gdprLink, '_blank');
      },
      disabled: false,
      hidden: true,
      scope: this
    });
    this.blacklistContactLabel = new Ext.form.Label({
      text: this.app.i18n._('Must not be contacted')
    });
    this.blacklistContactCheckbox = new Ext.form.Checkbox({
      hideLabel: true,
      disabled: true,
      boxLabel: this.app.i18n._("This Contact withdrawed usage of his data for any purpose."),
      listeners: {
        scope: this,
        check: this.onBlacklistContactCheck
      }
    });
    this.expiryDatePicker = new Ext.ux.form.ClearableDateField({
      fieldLabel: this.app.i18n._('Expiry Date')
    });
    this.expiryDateDescription = new Ext.form.Label({
      style: 'margin-left: 10px; margin-top: 19px; position: absolute;',
      text: this.app.i18n._('Contact gets deleted after this date automatically.')
    });
    this.dataIntendedPurposesGrid = new Tine.widgets.grid.QuickaddGridPanel({
      border: true,
      frame: false,
      enableBbar: false,
      allowCreateNew: true,
      allowDelete: false,
      editDialogConfig: {
        mode: 'local'
      },
      recordClass: Tine.GDPR.Model.DataIntendedPurposeRecord,
      columns: ['intendedPurpose', 'agreeDate', 'agreeComment', 'withdrawDate', 'withdrawComment'],
      defaultSortInfo: {
        field: 'agreeDate'
      },
      columnsConfig: {
        agreeComment: {
          width: 200
        },
        withdrawComment: {
          width: 200
        }
      },
      quickaddMandatory: 'intendedPurpose',
      validate: true,
      flex: 1
    });
    this.items = [{
      layout: 'vbox',
      align: 'stretch',
      pack: 'start',
      border: false,
      items: [{
        layout: 'form',
        frame: true,
        width: '100%',
        labelAlign: 'top',
        items: [[this.action_gdpr], this.blacklistContactLabel, this.blacklistContactCheckbox, {
          layout: 'hbox',
          height: 50,
          layoutConfig: {
            align: 'stretch',
            pack: 'start'
          },
          items: [{
            layout: 'form',
            width: 100,
            items: this.expiryDatePicker
          }, {
            layout: 'form',
            flex: 1,
            items: this.expiryDateDescription
          }]
        }]
      }, this.dataIntendedPurposesGrid]
    }];
    this.supr().initComponent.call(this);
  },
  onRender: function () {
    this.supr().onRender.apply(this, arguments);
    this.editDialog = this.findParentBy(function (c) {
      return c instanceof Tine.Addressbook.ContactEditDialog;
    });
    this.editDialog.on('load', this.onRecordLoad, this);
    this.editDialog.on('recordUpdate', this.onRecordUpdate, this);

    // NOTE: panel is usually rendered after record was load
    this.onRecordLoad(this.editDialog, this.editDialog.record);
  },
  onBlacklistContactCheck: function (cb, checked) {
    if (checked) {
      this.dataIntendedPurposesGrid.getStore().each(function (r) {
        if (!r.get('withdrawDate')) {
          r.set('withdrawDate', new Date());
          if (!r.get('withdrawComment')) {
            r.set('withdrawComment', this.app.i18n._('Blacklist'));
          }
        }
      }, this);
    } else {
      this.dataIntendedPurposesGrid.getStore().each(function (r) {
        Ext.each(['withdrawDate', 'withdrawComment'], function (k) {
          if (r.isModified(k)) {
            r.set(k, r.modified[k]);
          }
        }, this);
      }, this);
    }
    this.dataIntendedPurposesGrid.setReadOnly(checked);
  },
  onRecordLoad: function (editDialog, record) {
    var _ = window.lodash,
      evalGrants = editDialog.evalGrants,
      container = editDialog.getForm().findField('container_id').selectedRecord,
      hasRequiredGrant = !evalGrants || _.get(container, 'data.account_grants' + '.' + this.requiredGrant),
      blacklistContact = !!+record.get('GDPR_Blacklist'),
      expiryDate = record.get('GDPR_DataExpiryDate');
    this.blacklistContactCheckbox.setValue(blacklistContact);
    if (expiryDate) {
      this.expiryDatePicker.setValue(expiryDate);
    }
    this.dataIntendedPurposesGrid.setStoreFromArray(record.get('GDPR_DataIntendedPurposeRecord') || []);
    this.setReadOnly(!hasRequiredGrant);
    if (blacklistContact) {
      this.dataIntendedPurposesGrid.setReadOnly(true);
    }
    this.gdprLink = Tine.Tinebase.common.getUrl() + `GDPR/view/manageConsent/${record.id}`;
  },
  setReadOnly: function (readOnly) {
    this.readOnly = readOnly;
    this.dataIntendedPurposesGrid.setReadOnly(readOnly);
    this.blacklistContactCheckbox.setDisabled(readOnly);
    this.expiryDatePicker.setReadOnly(readOnly);
  },
  onRecordUpdate: function (editDialog, record) {
    record.set('GDPR_DataIntendedPurposeRecord', this.dataIntendedPurposesGrid.getFromStoreAsArray());
    record.set('GDPR_Blacklist', this.blacklistContactCheckbox.getValue());
    record.set('GDPR_DataExpiryDate', this.expiryDatePicker.getValue());
  },
  getCanonicalPathSegment: function () {
    return ['', this.app.appName, this.canonicalName].join(Tine.Tinebase.CanonicalPath.separator);
  }
});
Ext.ux.ItemRegistry.registerItem('Tine.Addressbook.editDialog.mainTabPanel', Tine.GDPR.Addressbook.ContactGDPRPanel, 20);

/***/ }),

/***/ 86469:
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */
Ext.ns('Tine.GDPR.Addressbook');
__webpack_require__(38652);
Tine.GDPR.Addressbook.DataProvenanceDialog = Ext.extend(Tine.Tinebase.dialog.Dialog, {
  labelAlign: 'top',
  layout: 'form',
  frame: false,
  canonicalName: ['Addressbook', 'EditDialog', 'Contact', 'DataProvenanceDialog'].join(Tine.Tinebase.CanonicalPath.separator),
  initComponent: function () {
    this.app = Tine.Tinebase.appMgr.get('GDPR');
    var dataProvenanceMandatory = Tine.Tinebase.configManager.get('dataProvenanceADBContactMandatory', 'GDPR');
    this.items = [Tine.widgets.form.RecordPickerManager.get('GDPR', 'DataProvenance', {
      fieldLabel: this.app.i18n._('Data Provenance'),
      allowBlank: dataProvenanceMandatory !== 'yes',
      name: 'GDPR_DataProvenance',
      anchor: '100%',
      value: dataProvenanceMandatory == 'default' ? Tine.Tinebase.configManager.get('defaultADBContactDataProvenance', 'GDPR') : ''
    }), {
      xtype: 'textfield',
      fieldLabel: this.app.i18n._('Reason for Editing'),
      name: 'GDPR_DataEditingReason',
      maxLength: 255,
      anchor: '100%',
      emptyText: this.app.i18n._('Please enter the reason for editing this data')
    }];
    this.items = [{
      layout: 'form',
      style: 'padding: 5px;',
      border: false,
      items: this.items
    }];
    Tine.GDPR.Addressbook.DataProvenanceDialog.superclass.initComponent.call(this);
  },
  onButtonCancel: Tine.Tinebase.dialog.Dialog.prototype.onButtonApply,
  getEventData: function () {
    this.getForm().isValid();
    return this.getForm().getFieldValues();
  },
  getCanonicalPathSegment: function () {
    return ['', this.app.appName, this.canonicalName].join(Tine.Tinebase.CanonicalPath.separator);
  }
});
Tine.GDPR.Addressbook.DataProvenanceDialog.openWindow = function (config) {
  var window = Tine.WindowFactory.getWindow({
    title: Tine.Tinebase.appMgr.get('GDPR').i18n._('Please Confirm the Data Provenance'),
    closeAction: 'close',
    modal: true,
    width: 550,
    height: 200,
    layout: 'fit',
    plain: true,
    items: new Tine.GDPR.Addressbook.DataProvenanceDialog(config)
  });
  return window;
};

/***/ }),

/***/ 38652:
/***/ (() => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */
Ext.ns('Tine.GDPR.Addressbook');
Tine.GDPR.Addressbook.DataProvenancePicker = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
  initComponent: function () {
    this.recordClass = Tine.GDPR.Model.DataProvenance;
    this.recordProxy = Tine.GDPR.dataprovenanceBackend;
    Tine.GDPR.Addressbook.DataProvenancePicker.superclass.initComponent.call(this);
  },
  // add expired btn
  initList: function () {
    Tine.GDPR.Addressbook.DataProvenancePicker.superclass.initList.apply(this, arguments);
    if (this.pageTb && !this.showExpired) {
      this.showExpiredBtn = new Ext.Button({
        text: this.app.i18n._('Show expired'),
        iconCls: 'action_showArchived',
        enableToggle: true,
        pressed: this.showExpired,
        scope: this,
        handler: function () {
          this.showExpired = this.showExpiredBtn.pressed;
          this.store.load();
        }
      });
      this.pageTb.add('-', this.showExpiredBtn);
      this.pageTb.doLayout();
    }
  },
  // append showExpired value
  onBeforeLoad: function (store, options) {
    Tine.GDPR.Addressbook.DataProvenancePicker.superclass.onBeforeLoad.apply(this, arguments);
    if (this.showExpiredBtn) {
      Ext.each(store.baseParams.filter, function (filter, idx) {
        if (filter.field == 'expiration') {
          store.baseParams.filter.remove(filter);
        }
      }, this);
      if (!this.showExpiredBtn.pressed) {
        store.baseParams.filter.push({
          field: "expiration",
          operator: "after",
          value: new Date()
        });
      }
    }
  }
});
Tine.widgets.form.RecordPickerManager.register('GDPR', 'DataProvenance', Tine.GDPR.Addressbook.DataProvenancePicker);

/***/ }),

/***/ 79581:
/***/ (() => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019-2023 Metaways Infosystems GmbH (http://www.metaways.de)
 */

Ext.ns('Tine.GDPR.Addressbook');

// NOTE server announces 'records' as refIdField, but we need intendedPurpose to search in the right records
//      is it \Tinebase_ModelConfiguration_Const::IS_METADATA_MODEL_FOR in fact?
Tine.widgets.grid.FilterRegistry.register('Addressbook', 'Contact', {
  filtertype: 'foreignrecord',
  foreignRecordClass: 'GDPR.DataIntendedPurposeRecord',
  foreignRefIdField: 'intendedPurpose',
  linkType: 'foreignId',
  filterName: 'GDPRDataIntendedPurposeFilter',
  independentRecords: true,
  multipleForeignRecords: true,
  ownField: 'GDPR_DataIntendedPurposeRecord',
  // i18n._('GDPR Intended Purpose')
  label: 'GDPR Intended Purpose'
});

/***/ }),

/***/ 49317:
/***/ (() => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */

Ext.namespace('Tine.GDPR');
Tine.GDPR.Application = Ext.extend(Tine.Tinebase.Application, {
  hasMainScreen: false,
  /**
   * Get translated application title of the GDPR App
   *
   * @return {String}
   */
  getTitle: function () {
    return this.i18n._('GDPR');
  },
  // @TODO this should really autoregister
  registerCoreData: function () {
    Tine.log.info('Tine.GDPR.Application - registering core data ... ');
    Tine.CoreData.Manager.registerGrid('GDPR_Model_DataProvenance', Tine.GDPR.DataProvenanceGridPanel);
    Tine.CoreData.Manager.registerGrid('GDPR_Model_DataIntendedPurpose', Tine.GDPR.DataIntendedPurposeGridPanel);
  }
});

/***/ }),

/***/ 19737:
/***/ (() => {

Ext.ns('Tine.GDPR.Felamimail');
Tine.GDPR.Felamimail.MessageEditDialogPlugin = function () {};
Tine.GDPR.Felamimail.MessageEditDialogPlugin.prototype = {
  editDialog: null,
  app: null,
  init: function (editDialog) {
    this.app = Tine.Tinebase.appMgr.get('GDPR');
    this.editDialog = editDialog;
    this.recipientGrid = this.editDialog.recipientGrid;
    if (!this.recipientGrid) return;
    this.record = this.editDialog.record;
    this.manageConsentRecordPicker = new Tine.Tinebase.widgets.form.RecordPickerComboBox({
      fieldLabel: this.app.i18n.gettext('Data Intended purpose of this mass mailing'),
      name: 'dataIntendedPurposes',
      width: 300,
      blurOnSelect: true,
      allowBlank: true,
      recordClass: Tine.GDPR.Model.DataIntendedPurpose,
      recordProxy: Tine.GDPR.dataintendedpurposeBackend,
      listeners: {
        scope: this,
        'select': (combo, record, index) => {
          //TODO: load template from twig config?
          this.selectedDataIntendedPurpose = record;
          this.recipientGrid.updateMassMailingRecipients();
        }
      }
    });
    this.editDialog.messageInfoFormPanel.add(this.manageConsentRecordPicker);
    this.editDialog.switchMassMailingMode = this.switchMassMailingMode.createDelegate(this);
    this.recipientGrid.validateRecipientToken = this.validateRecipientToken.createDelegate(this);
  },
  switchMassMailingMode(active) {
    this.editDialog.massMailingMode = active;
    if (this.recipientGrid) this.recipientGrid.massMailingMode = active;
    this.editDialog.massMailingInfoText.setVisible(active);
    this.manageConsentRecordPicker.setVisible(active);
    this.updateMessageBody(active);
    if (active) this.showDipSelectPicker();
    this.recipientGrid.view.refresh();
    this.editDialog.doLayout();
  },
  updateMessageBody(active) {
    const locale = Tine.Tinebase.registry.get('locale').locale || 'en';
    const template = Tine.Tinebase.configManager.get('manageConsentEmailTemplate', 'GDPR');
    if (!template) return;
    const translatedTemplate = (template === null || template === void 0 ? void 0 : template[locale]) ?? null;
    if (!translatedTemplate) return;
    const body = this.record.get('body');
    const format = this.record.get('content_type');
    if (format === 'text/plain') {
      if (active && !body.includes(translatedTemplate)) {
        this.record.set('body', `${body}\n${translatedTemplate}`);
      }
      if (!active && body.includes(translatedTemplate)) {
        this.record.set('body', body.replace(translatedTemplate, ''));
      }
    }
    if (format === 'text/html') {
      const consentLinkElement = document.createElement('span');
      consentLinkElement.className = 'felamimail-body-manage-consent-link';
      consentLinkElement.innerHTML = translatedTemplate;
      if (active) {
        this.editDialog.appendHtmlNode(consentLinkElement, 'above', 'felamimail-body-signature-current');
      } else {
        const matches = this.editDialog.htmlEditor.getDoc().getElementsByClassName(consentLinkElement.className);
        while (matches.length > 0) matches[0].parentElement.removeChild(matches[0]);
      }
      this.record.set('body', this.editDialog.bodyCards.layout.activeItem.getValue());
    }
    this.editDialog.msgBody = this.record.get('body');
    this.editDialog.bodyCards.layout.activeItem.setValue(this.editDialog.msgBody);
  },
  /**
   * validate recipient token in gdpr plugin
   *
   * - skip all validation when it is not in mass mailing mode
   *
   * validation in mass mailing mode:
   * 
   * valid cases when no DataIntendedPurpose selected:
   * - when token type is mailingList/group/list -> but they will resolve to it's members automatically
   * - when token has no contact record -> because it might be an external or a new created contact
   * - when token has no dataIntended purpose records
   * 
   * invalid cases when no DataIntendedPurpose selected:
   * - when contact enables "do not contact this contact at all" in contactEditDialog/GDPR tab
   * - when contact has not consented to this purpose
   * 
   * invalid cases when DataIntendedPurpose is selected:
   * - when contact has not consented to the selected DataIntendedPurpose
   * - when contact consent date is expired
   * - when contact consent date is set but not reached yet
   *
   * @param token
   */
  validateRecipientToken(token) {
    const defaultTip = String.format(this.app.i18n._('In {0} mass mailing mode this recipient will be removed, '), this.app.appName);
    if (!token || !this.recipientGrid.massMailingMode) {
      return {
        isValid: true,
        tip: 'skip checking token'
      };
    }
    // in mass mailing mode, list should be valid to be displayed in searchContactCombo
    if (token !== null && token !== void 0 && token.emails) {
      const app = this.editDialog.app;
      return {
        isValid: true,
        tip: app.i18n._('Send message to individual list members instead')
      };
    }
    if (!token.contact_record) {
      return {
        isValid: true,
        tip: defaultTip + 'GDPR consent missing as no contact record was found'
      };
    }
    const contact = token.contact_record;
    if (contact !== null && contact !== void 0 && contact.GDPR_Blacklist) {
      return {
        isValid: false,
        tip: defaultTip + this.app.i18n._('as it must not be contacted at all')
      };
    }
    if (!this.selectedDataIntendedPurpose) {
      return {
        isValid: true,
        tip: defaultTip + this.app.i18n._('skip checking contact when data intended purpose has not been selected')
      };
    }
    if (!(contact !== null && contact !== void 0 && contact.GDPR_DataIntendedPurposeRecord)) {
      return {
        isValid: true,
        tip: defaultTip + this.app.i18n._('skip checking contact without dataIntended purpose records')
      };
    }
    const dip = contact.GDPR_DataIntendedPurposeRecord.find(d => d.intendedPurpose.id === this.selectedDataIntendedPurpose.id);
    if (!dip) {
      return {
        isValid: false,
        tip: defaultTip + this.app.i18n._('as contact has not consent to this purpose')
      };
    }
    if (dip.withdrawDate && new Date() > new Date(dip.withdrawDate)) {
      return {
        isValid: false,
        tip: defaultTip + this.app.i18n._('as consent date has expired')
      };
    }
    if (dip.agreeDate && new Date() < new Date(dip.agreeDate)) {
      return {
        isValid: true,
        tip: defaultTip + this.app.i18n._('consent date is set but not reached yet')
      };
    }
    return {
      isValid: true,
      tip: 'valid token'
    };
  },
  showDipSelectPicker() {
    const dialog = new Tine.Tinebase.dialog.Dialog({
      windowTitle: this.app.i18n._('Please select a data intended purpose'),
      listeners: {
        apply: record => {
          this.manageConsentRecordPicker.setValue(record);
          this.selectedDataIntendedPurpose = record;
          this.recipientGrid.updateMassMailingRecipients();
        },
        cancel: () => {
          this.editDialog.onToggleMassMailing();
        }
      },
      getEventData: function (eventName) {
        if (eventName === 'apply') return this.getForm().findField('dataIntendedPurpose').selectedRecord;
      },
      items: [{
        layout: 'form',
        frame: true,
        width: '100%',
        labelWidth: 300,
        labelAlign: 'top',
        padding: '10px',
        items: [{
          xtype: 'label',
          html: "1. " + this.app.i18n._('The recipients will be removed if they have not consent to the selected intended purpose.') + '<br/>' + "2. " + this.app.i18n._("The recipients with 'Must not be contacted' will be removed when no intended purpose is selected.")
        }, Tine.widgets.form.RecordPickerManager.get('GDPR', 'DataIntendedPurpose', {
          name: 'dataIntendedPurpose'
        })]
      }],
      openWindow: function (config) {
        if (!this.window) {
          this.window = Tine.WindowFactory.getWindow(Ext.apply({
            title: this.windowTitle,
            closeAction: 'close',
            modal: true,
            width: 400,
            height: 200,
            layout: 'fit',
            items: [this]
          }, config || {}));
        }
        return this.window;
      }
    });
    dialog.openWindow();
  }
};
Ext.preg('Tine.GDPR.Felamimail.MessageEditDialogPlugin', Tine.GDPR.Felamimail.MessageEditDialogPlugin);
Ext.ux.pluginRegistry.register('/Felamimail/EditDialog/Message', Tine.GDPR.Felamimail.MessageEditDialogPlugin);

/***/ }),

/***/ 37098:
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

/*
 * Tine 2.0
 *
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiß <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */

__webpack_require__(49317);
__webpack_require__(79581);
__webpack_require__(86715);
__webpack_require__(19737);

/***/ })

}]);