ifthenelse-8.x-1.x-dev-no-core/modules/contrib/if_then_else/src/core/Nodes/Values/EntityValue/EntityValue.js

modules/contrib/if_then_else/src/core/Nodes/Values/EntityValue/EntityValue.js
var VueEntityValueControl = {
  components: {
    // Component included for Multiselect.
    Multiselect: window.VueMultiselect.default
  },
  props: ['ikey', 'getData', 'putData', 'emitter', 'onChange'],
  template: `<div class="fields-container">
    <div class="entity-select">
      <label class="typo__label">Select an Entity</label>
      <multiselect v-model="selected_entity" :show-labels="false" :options="entities" 
      placeholder="Entity" @input="entitySelected" label="label" 
      track-by="value"></multiselect>
    </div>
           
    <label>Entity</label>
    <div class="radio">
      <input type="radio" :id="radio1_uid" value="value" v-model="input_selection" @change="inputSelectionChanged">
      <label :for="radio1_uid">Enter Entity Id Below</label>
    </div>
    <input v-if="input_selection == 'value'" type="text" class="input" name="entity-id-class" :value="entityId" 
    @blur="updateEntityId" />
    <div class="radio">
      <input type="radio" :id="radio2_uid" value="input" v-model="input_selection" @change="inputSelectionChanged">
      <label :for="radio2_uid">Select From Entity Id</label>
    </div>
                
  </div>`,
  data() {
    return {
      type: drupalSettings.if_then_else.nodes.entity_value.type,
      class: drupalSettings.if_then_else.nodes.entity_value.class,
      name: drupalSettings.if_then_else.nodes.entity_value.name,
      selected_entity: [],
      entityId: '',
      entities: [],
      input_selection: 'value',
    }
  },
  methods: {
    entitySelected(value) {
      //Triggered when selecting an entity from entity dropdown.
      //reinitialize all values
      this.entityId = '';
      this.selected_entity = [];
      if (value !== null) { //check if an entity is selected
        this.selected_entity = {
          label: value.label,
          value: value.value
        };
      }

      //Updating reactive variable of Vue to reflect changes on frontend
      this.onChange(value.value);
      this.putData('selected_entity', this.selected_entity);
      this.putData('entityId', this.entityId);
      editor.trigger('process');
    },
    updateEntityId(e) {
      //Triggered when entering form class
      this.putData('entityId', e.target.value);
      editor.trigger('process');
    },
    inputSelectionChanged() {
      this.putData('input_selection', this.input_selection);
      editor.trigger('process');
    }
  },

  mounted() {
    this.putData('type', drupalSettings.if_then_else.nodes.entity_value.type);
    this.putData('class', drupalSettings.if_then_else.nodes.entity_value.class);
    this.putData('name', drupalSettings.if_then_else.nodes.entity_value.name);

    this.input_selection = this.getData('input_selection');

    //Setting values of retejs condition nodes when editing rule page loads
    var selected_entity = this.getData('selected_entity');
    if (typeof selected_entity != 'undefined') {
      this.selected_entity = selected_entity;
      this.onChange(selected_entity.value);
    } else {
      this.putData('selected_entity', []);
    }
    this.entityId = this.getData('entityId');
  },
  created() {
    //Triggered when loading retejs editor but before mounted function. See documentaion of Vuejs
    this.radio1_uid = _.uniqueId('radio_');
    this.radio2_uid = _.uniqueId('radio_');

    //Fetching values of fields when editing rule page loads
    if (drupalSettings.if_then_else.nodes.form_class_condition.entity_info) {
      var entities_list = drupalSettings.if_then_else.nodes.form_class_condition.entity_info;
      Object.keys(entities_list).forEach(itemKey => {
        this.entities.push({
          label: entities_list[itemKey].label,
          value: entities_list[itemKey].entity_id
        });
      });
    }
  }

}

class EntityValueControl extends Rete.Control {

  constructor(emitter, key, onChange) {
    super(key);
    this.component = VueEntityValueControl;
    this.props = {
      emitter,
      ikey: key,
      onChange
    };
  }
}

class EntityValueComponent extends Rete.Component {
  constructor() {
    var nodeName = 'entity_value';
    var node = drupalSettings.if_then_else.nodes[nodeName];
    super(jsUcfirst(node.type) + ": " + node.label);
  }

  //Event node builder
  builder(eventNode) {

    var node_outputs = [];
    node_outputs['success'] = new Rete.Output('success', 'Success', sockets['bool']);
    node_outputs['entity'] = new Rete.Output('entity', 'Entity', sockets['object.entity']);
    eventNode.addOutput(node_outputs['success']);
    eventNode.addOutput(node_outputs['entity']);

    var nodeName = 'entity_value';
    var node = drupalSettings.if_then_else.nodes[nodeName];

    function handleInput() {
      return function(value) {
        let socket_out = eventNode.outputs.get('entity');
        if (value == 'user') {
          socket_out.socket = sockets['object.entity.user'];
        } else if (value != 'user') {
          socket_out.socket = sockets['object.entity'];
        }
        eventNode.outputs.set('entity', socket_out);
        eventNode.update();
        editor.view.updateConnections({
          node: eventNode
        });
        editor.trigger('process');
      }
    }

    eventNode.addControl(new EntityValueControl(this.editor, nodeName, handleInput()));
    for (let name in node.inputs) {
      let inputLabel = node.inputs[name].label + (node.inputs[name].required ? ' *' : '');
      if (node.inputs[name].sockets.length === 1) {
        compatibleSockets['object.entity'] = ['object.entity'];
        compatibleSockets['object.entity.user'] = ['object.entity.user'];
        eventNode.addInput(new Rete.Input(name, inputLabel, sockets[node.inputs[name].sockets[0]]));
      } else if (node.inputs[name].sockets.length > 1) {
        let socketNames = [];
        let socketLabels = [];
        for (let idx in node.inputs[name].sockets) {
          socketNames.push(node.inputs[name].sockets[idx]);
          socketLabels.push(sockets[node.inputs[name].sockets[idx]].name);
        }
        socketNames.sort();
        socketLabels.sort();
        let socketLabel = socketLabels.join(', ');
        let socketName = socketNames.join(', ');

        if (!(socketName in sockets)) {
          sockets[socketName] = new Rete.Socket(socketLabel);
        }

        for (let idx in node.inputs[name].sockets) {
          if (!sockets[node.inputs[name].sockets[idx]].compatibleWith(sockets[socketName])) {
            sockets[node.inputs[name].sockets[idx]].combineWith(sockets[socketName]);
            if (typeof compatibleSockets[node.inputs[name].sockets[idx]] === "undefined") {
              compatibleSockets[node.inputs[name].sockets[idx]] = [];
            }
            compatibleSockets[node.inputs[name].sockets[idx]].push(socketName);
          }
        }

        eventNode.addInput(new Rete.Input(name, inputLabel, sockets[socketName]));
      }
    }
  }
  worker(eventNode, inputs, outputs) {
    //outputs['form'] = eventNode.data.event;
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc