Show:
import Ember from 'ember';
import EditFormController from 'ember-flexberry/controllers/edit-form';
import FdViewAttributesProperty from '../objects/fd-view-attributes-property';
import FdViewAttributesMaster from '../objects/fd-view-attributes-master';
import FdViewAttributesDetail from '../objects/fd-view-attributes-detail';
import { getDataForBuildTree, getClassTreeNode, getAssociationTreeNode } from '../utils/fd-attributes-for-tree';
import { translationMacro as t } from 'ember-i18n';
import FdWorkPanelToggler from '../mixins/fd-work-panel-toggler';
import { createPropertyName, restorationNodeTree, afterCloseNodeTree } from '../utils/fd-metods-for-tree';

export default EditFormController.extend(FdWorkPanelToggler, {
  parentRoute: 'fd-view-list-form',

  /**
   Service that triggers objectlistview events.

   @property objectlistviewEventsService
   @type {Class}
   @default Ember.inject.service()
   */
  objectlistviewEventsService: Ember.inject.service('objectlistview-events'),

  allAttrsHidedn: false,

  popupMessage: t(`forms.fd-view-edit-form.attributes-panel.close-panel-btn-caption`),

  /**
    Index of the selected attribute for editing.

    @property selectedRowIndex
    @type Number
    @default null
   */
  selectedRowIndex: null,

  /**
    Array of possible view name for selected detail for editing.

    @property detailViewNameItems
    @type Array
    @default []
   */
  detailViewNameItems: [],

  /**
    Type of the selected master for editing.

    @property lookupTypeItems
    @type Array
    @default ['default', 'standard', 'combo']
   */
  lookupTypeItems: ['default', 'standard', 'combo'],

  /**
    Included plugins for jsTree.

    @property plugins
    @type String
    @default 'wholerow, types, search'
   */
  plugins: 'wholerow, types, search',

  /**
    Selected nodes in jsTree.

    @property jstreeSelectedNodes
    @type Array
    @default []
   */
  jstreeSelectedNodes: Ember.A(),

  /**
    Type settings for jsTree.

    @property typesOptions
    @type Object
  */
  typesOptions: Ember.computed(() => ({
    'property': {
      icon: 'assets/images/attribute.bmp'
    },
    'master': {
      icon: 'assets/images/master.bmp'
    },
    'detail': {
      icon: 'assets/images/datail.png'
    },
    'class': {
      icon: 'assets/images/class.bmp'
    }
  })),

  /**
    Data for search tree nodes.

    @property searchTerm
    @type String
    @default ''
   */
  searchTerm: '',

  /**
    Search settings for jsTree.

    @property searchOptions
    @type Object
  */
  searchOptions: Ember.computed(() => ({
    show_only_matches: true
  })),

  /**
    Type selected attribute for editing.

    @property propertyType
    @type Object
  */
  propertyType: Ember.computed('rowModel', function() {
    let rowModel = this.get('rowModel');
    if (rowModel instanceof FdViewAttributesDetail) {
      return 'isDetail';
    } else if (rowModel instanceof FdViewAttributesMaster) {
      return 'isMaster';
    } else {
      return null;
    }
  }),

  /**
    Data selected attribute for editing.

    @property rowModel
    @type Object
  */
  rowModel: Ember.computed('selectedRowIndex', function() {
    let model = this.get('model.view.definition');
    let index = this.get('selectedRowIndex');
    if (!Ember.isNone(index)) {
      let rowModel = model[index];
      let detailsViewArray = this.get('model.detailsView');
      let detailViewByName = detailsViewArray.findBy('detailName', rowModel.name);
      let detailViewByRole = detailsViewArray.findBy('detailRole', rowModel.name);
      if (detailViewByName) {
        this.set('detailViewNameItems', detailViewByName.detailViewNameItems);
      } else if (detailViewByRole) {
        this.set('detailViewNameItems', detailViewByRole.detailViewNameItems);
      } else {
        this.set('detailViewNameItems', []);
      }

      return rowModel;
    }

    return null;
  }),

  actions: {

    /**
      Resets 'masterPropertyName' and 'masterCustomizationString' if 'LookupType' is 'default'.

      @method actions.changeLookupType
      @param {Object} value An object with a new value in the `value` property.
    */
    changeLookupType(value) {
      if (value === 'default') {
        let rowModel = this.get('rowModel');
        rowModel.set('masterPropertyName', '');
        rowModel.set('masterCustomizationString', '');
      }
    },

    /**
      Handles form 'onCreateCaptionClick' button click.

      @method actions.onCreateCaptionClick
    */
    onCreateCaptionClick() {
      let rowModel = this.get('rowModel');
      if (Ember.isNone(rowModel)) {
        return;
      }

      let splitName = rowModel.name.split('.');
      let caption = '';
      splitName.forEach((partCaption) => {
        caption = partCaption + ' ' + caption;
      });

      Ember.set(rowModel, 'caption', caption.trim());
    },

    /**
      Handles form 'onAttributesClick' table row click.

      @method actions.onAttributesClick
    */
    onAttributesClick(index) {
      let configPanelSidebar = Ember.$('.ui.sidebar.config-panel');
      let sidebarOpened = configPanelSidebar.hasClass('visible');
      let selectedRowIndex = this.get('selectedRowIndex');

      if ((!Ember.isNone(index) || sidebarOpened) && selectedRowIndex !== index) {
        this.send('toggleConfigPanel', 'active-tree-tab', index);
      }

      this.set('selectedRowIndex', index);
    },

    /**
      Handles creating jsTree.

      @method actions.handleTreeDidBecomeReady
    */
    handleTreeDidBecomeReady() {
      let treeObject = this.get('jstreeObject');
      treeObject.on('open_node.jstree', this._openNodeTree.bind(this));
      treeObject.on('after_close.jstree', afterCloseNodeTree.bind(this));
    },

    /**
      Handles form 'moveRightHighlighted' button click.
      Add attribute in definition.

      @method actions.moveRightHighlighted
    */
    moveRightHighlighted() {
      let selectedNodes = this.get('jstreeSelectedNodes')[0];
      let treeData = this.get('model.tree');
      let model = this.get('model.view.definition');

      // Create propertyName
      let propertyName = createPropertyName(selectedNodes, treeData[0], true);

      if (model.findBy('name', propertyName)) {
        return;
      }

      let newDdfinition;
      switch (selectedNodes.type) {
        case 'property':
          newDdfinition = FdViewAttributesProperty.create({
            name: propertyName
          });
          break;
        case 'master':
          newDdfinition = FdViewAttributesMaster.create({
            name: propertyName
          });
          break;
        case 'detail':
          newDdfinition = FdViewAttributesDetail.create({
            name: propertyName
          });
          break;
      }

      if (!Ember.isNone(newDdfinition)) {
        model.pushObject(newDdfinition);
      }
    },

    /**
      Handles form 'moveLeftHighlighted' button click.
      Delete attribute from definition.

      @method actions.moveLeftHighlighted
    */
    moveLeftHighlighted() {
      let rowModel = this.get('rowModel');

      if (!Ember.isNone(rowModel)) {
        let model = this.get('model.view.definition');
        model.removeObject(rowModel);
        this.set('selectedRowIndex', null);
      }
    },

    /**
      Handles form 'moveUpHighlighted' button click.

      @method actions.moveUpHighlighted
    */
    moveUpHighlighted() {
      let index = this.get('selectedRowIndex');
      if (index === 0) {
        return;
      }

      let prevAttrIndex = this.get('prevAttr');
      if (index === prevAttrIndex--) {
        this.set('prevAttr', prevAttrIndex);
      }

      let model = this.get('model.view.definition');
      let prev = index - 1;
      let node = model[index];
      let prevNode = model[prev];
      model.replace(prev, 1, node);
      model.replace(index, 1, prevNode);
      this.set('selectedRowIndex', prev);
    },

    /**
      Handles form 'moveDownHighlighted' button click.

      @method actions.moveDownHighlighted
    */
    moveDownHighlighted() {
      let index = this.get('selectedRowIndex');
      let model = this.get('model.view.definition');
      if (index === model.length - 1) {
        return;
      }

      let prevAttrIndex = this.get('prevAttr');
      if (index === prevAttrIndex++) {
        this.set('prevAttr', prevAttrIndex);
      }

      let next = index + 1;
      let node = model[next];
      let nextNode = model[index];
      model.replace(index, 1, node);
      model.replace(next, 1, nextNode);
      this.set('selectedRowIndex', next);
    },

    closeRightpanel() {
      Ember.$('.closable.panel-left').toggle(500);

      if (this.allAttrsHidedn) {
        this.set('popupMessage', t('forms.fd-view-edit-form.attributes-panel.close-panel-btn-caption'));
        Ember.$('.panel-wrapper .panel-right.view-attributes').css('width', '50%');
      } else {
        this.set('popupMessage', t('forms.fd-view-edit-form.attributes-panel.show-panel-btn-caption'));
        Ember.$('.panel-wrapper .panel-right.view-attributes').css('width', '100%');
      }

      this.toggleProperty('allAttrsHidedn');
    },

    /**
      Handles form 'saveView' button click.

      @method actions.saveView
    */
    saveView() {
      let view = this.get('model.view');
      view.set('definition', Ember.A(view.get('definition').toArray()));
      let _this = this;

      this.get('objectlistviewEventsService').setLoadingState('loading');
      view.save().then(() => {
        let routeName = _this.get('routeName');
        if (routeName.indexOf('.new') > 0) {
          _this.transitionToRoute(routeName.slice(0, -4), view.get('id'));
        } else {
          _this.get('objectlistviewEventsService').setLoadingState('');
        }
      });
    }
  },

  /**
    Overridden action for jsTree 'openNode'.
    @method _openNodeTree
  */
  _openNodeTree(e, data) {
    let treeData = this.get('model.tree');
    restorationNodeTree(treeData, data.node.original, Ember.A(['master', 'class']), false, (function(node) {
      let dataForBuildTree = getDataForBuildTree(this.get('store'), node.get('idNode'));
      let childrenAttributes = getClassTreeNode(Ember.A(), dataForBuildTree.classes);
      let childrenNode = getAssociationTreeNode(childrenAttributes, dataForBuildTree.associations, node.get('id'));

      return childrenNode;
    }).bind(this));

    this.get('jstreeActionReceiver').send('redraw');
  },

  willDestroy() {
    this._super(...arguments);
    let treeObject = this.get('jstreeObject');
    if (!Ember.isNone(treeObject)) {
      treeObject.off('open_node.jstree', this._openNodeTree.bind(this));
      treeObject.off('after_close.jstree', afterCloseNodeTree.bind(this));
    }
  }
});