diff --git a/modules/if_then_else_group/if_then_else_group.libraries.yml b/modules/if_then_else_group/if_then_else_group.libraries.yml index 15b7a3d..6b47d5f 100644 --- a/modules/if_then_else_group/if_then_else_group.libraries.yml +++ b/modules/if_then_else_group/if_then_else_group.libraries.yml @@ -2,5 +2,12 @@ UserRoleToGroupAction: version: 1.0 js: src/core/Nodes/Actions/UserRoleToGroupAction/UserRoleToGroupAction.js: {} + dependencies: + - if_then_else/external + +UserRoleInGroupCondition: + version: 1.0 + js: + src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.js: {} dependencies: - if_then_else/external \ No newline at end of file diff --git a/modules/if_then_else_group/if_then_else_group.services.yml b/modules/if_then_else_group/if_then_else_group.services.yml index 67bb6f5..22ba458 100644 --- a/modules/if_then_else_group/if_then_else_group.services.yml +++ b/modules/if_then_else_group/if_then_else_group.services.yml @@ -22,13 +22,13 @@ services: arguments: ['@entity_type.manager'] tags: - { name: 'event_subscriber' } - + if_then_else_group_user_role_to_group_action_register: class: Drupal\if_then_else_group\core\Nodes\Actions\UserRoleToGroupAction\UserRoleToGroupAction arguments: ['@entity_type.manager'] tags: - { name: 'event_subscriber' } - + if_then_else_group_user_in_group_condition_register: class: Drupal\if_then_else_group\core\Nodes\Conditions\UserInGroupCondition\UserInGroupCondition arguments: ['@entity_type.manager'] @@ -40,3 +40,9 @@ services: arguments: ['@entity_type.manager'] tags: - { name: 'event_subscriber' } + + if_then_else_group_user_role_in_group_condition_register: + class: Drupal\if_then_else_group\core\Nodes\Conditions\UserRoleInGroupCondition\UserRoleInGroupCondition + arguments: ['@entity_type.manager'] + tags: + - { name: 'event_subscriber' } \ No newline at end of file diff --git a/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.js b/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.js new file mode 100644 index 0000000..f991725 --- /dev/null +++ b/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.js @@ -0,0 +1,101 @@ +var VueUserRoleInGroupConditionControl = { + props: ['emitter', 'ikey', 'getData', 'putData', 'onChange'], + components: { + Multiselect: window.VueMultiselect.default + }, + data() { + return { + type: drupalSettings.if_then_else.nodes.user_role_in_group_condition.type, + class: drupalSettings.if_then_else.nodes.user_role_in_group_condition.class, + name: drupalSettings.if_then_else.nodes.user_role_in_group_condition.name, + classArg: drupalSettings.if_then_else.nodes.user_role_in_group_condition.classArg, + value: [], + options: [], + selected_options: [], + group_roles: [], + selected_roles: [], + } + }, + template: ` +
+
+ + + + + + +
+
`, + + methods: { + fieldValueChanged(value){ + if(value !== undefined && value !== null && value !== ''){ + //Triggered when selecting an field. + var selectedOptions = []; + + selectedOptions = {name: value.name, code: value.code}; + + //check if selected field value is changed. + var prevSelectedField = this.getData('selected_options'); + if(typeof prevSelectedField != 'undefined' && prevSelectedField.code != value.code){ + this.selected_roles = ''; + this.putData('selected_roles',''); + } + + var field_roles = drupalSettings.if_then_else.nodes.user_role_in_group_condition.group_roles + this.group_roles = field_roles[value.code]; + this.putData('selected_options',selectedOptions); + editor.trigger('process'); + }else{ + this.putData('selected_options',''); + this.putData('selected_roles',''); + this.value = ''; + } + }, + entityFieldValueChanged(value){ + if(value !== undefined && value !== null && value !== ''){ + var selected_roles = []; + selected_roles.push({name: value.name, code: value.code}); + this.putData('selected_roles',selected_roles); + editor.trigger('process'); + } + }, + }, + mounted() { + //initialize variable for data + this.putData('type',drupalSettings.if_then_else.nodes.user_role_in_group_condition.type); + this.putData('class',drupalSettings.if_then_else.nodes.user_role_in_group_condition.class); + this.putData('name', drupalSettings.if_then_else.nodes.user_role_in_group_condition.name); + this.putData('classArg', drupalSettings.if_then_else.nodes.user_role_in_group_condition.classArg); + + //setting values of selected fields when rule edit page loads. + //Setting values of retejs condition nodes when editing rule page loads + var get_selected_options = this.getData('selected_options'); + var get_selected_roles = this.getData('selected_roles'); + if(typeof get_selected_options != 'undefined'){ + this.value = get_selected_options; + var field_roles = drupalSettings.if_then_else.nodes.user_role_in_group_condition.group_roles + this.group_roles = field_roles[get_selected_options.code]; + this.selected_roles = this.getData('selected_roles'); + } + else { + this.putData('selected_options',[]); + } + }, + created() { + if(drupalSettings.if_then_else.nodes.user_role_in_group_condition.group_types){ + //setting list of all fields for a form when rule edit page loads. + this.options = drupalSettings.if_then_else.nodes.user_role_in_group_condition.group_types; + } + } +}; +class UserRoleInGroupConditionControl extends Rete.Control { + constructor(emitter, key, onChange) { + super(key); + this.component = VueUserRoleInGroupConditionControl; + this.props = { emitter, ikey: key, onChange}; + } +} diff --git a/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.php b/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.php new file mode 100644 index 0000000..39d2561 --- /dev/null +++ b/modules/if_then_else_group/src/core/Nodes/Conditions/UserRoleInGroupCondition/UserRoleInGroupCondition.php @@ -0,0 +1,155 @@ +entityTypeManager = $entity_manager; + } + + /** + * {@inheritdoc} + */ + public static function getName() { + return 'user_role_in_group_condition'; + } + + /** + * {@inheritdoc} + */ + public function registerNode(NodeSubscriptionEvent $event) { + $groups = $this->entityTypeManager->getStorage('group_type')->loadMultiple(); + $group_list = []; + foreach ($groups as $group_id => $group) { + if (!empty($group->getRoleIds(FALSE))) { + $group_list[$group_id]['name'] = $group->label(); + $group_list[$group_id]['code'] = $group_id; + $group_roles = $group->getRoles(FALSE); + + foreach ($group_roles as $group_role) { + $group_list[$group_id]['roles'][] = [ + 'code' => $group_role->id(), + 'name' => $group_role->label(), + ]; + } + } + } + + $group_array = []; + $i = 0; + $group_roles = []; + foreach ($group_list as $group_type) { + $group_array[$i]['name'] = $group_type['name']; + $group_array[$i]['code'] = $group_type['code']; + + $j = 0; + foreach ($group_type['roles'] as $roles) { + $group_roles[$group_type['code']][$j]['code'] = $roles['code']; + $group_roles[$group_type['code']][$j]['name'] = $roles['name']; + $j++; + } + $i++; + } + + $event->nodes[static::getName()] = [ + 'label' => $this->t('User Role In Group'), + 'type' => 'condition', + 'class' => 'Drupal\\if_then_else_group\\core\\Nodes\\Conditions\\UserRoleInGroupCondition\\UserRoleInGroupCondition', + 'classArg' => ['entity_type.manager'], + 'dependencies' => ['group', 'if_then_else_group'], + 'library' => 'if_then_else_group/UserRoleInGroupCondition', + 'control_class_name' => 'UserRoleInGroupConditionControl', + 'group_types' => $group_array, + 'group_roles' => $group_roles, + 'inputs' => [ + 'user' => [ + 'label' => $this->t('User Id / User object'), + 'description' => $this->t('User Id or User object.'), + 'sockets' => ['number', 'object.entity.user'], + 'required' => TRUE, + ], + 'group_id' => [ + 'label' => $this->t('Group Id'), + 'description' => $this->t('The group id to add the user.'), + 'sockets' => ['number'], + 'required' => TRUE, + ], + ], + 'outputs' => [ + 'success' => [ + 'label' => $this->t('Success'), + 'description' => $this->t('Does the user in group(s)?'), + 'socket' => 'bool', + ], + ], + ]; + } + + /** + * Validation function. + */ + public function validateNode(NodeValidationEvent $event) { + $data = $event->node->data; + if (empty($data->selected_options)) { + $event->errors[] = $this->t('Selected a options name to fetch it\'s value in "@node_name".', ['@node_name' => $event->node->name]); + } + } + + /** + * {@inheritdoc} + */ + public function process() { + $user = $this->inputs['user']; + $group_id = $this->inputs['group_id']; + if (is_numeric($user)) { + $user = $this->entityTypeManager->getStorage('user')->load($user); + if (empty($user)) { + $this->setSuccess(FALSE); + return; + } + } + elseif (!$user instanceof UserInterface) { + $this->setSuccess(FALSE); + return; + } + + $group = Group::load($group_id); + $member = $group->getMember($user); + if ($member != NULL) { + $list_role = $member->getRoles(); + $selected_roles = array_shift($this->data->selected_roles); + if (array_key_exists($selected_roles->code, $list_role)) { + $this->setSuccess(TRUE); + } + else { + $this->setSuccess(FALSE); + return; + } + } + } +}