All files / ee/app/assets/javascripts/members utils.js

100% Statements 23/23
100% Branches 12/12
100% Functions 9/9
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132                                        32x                                                                       23x 224x 173x     51x   51x 119x                 51x                                           23x 235x   668x         23x 86x     94x   23x 91x                       23x   11x 2x 2x     9x    
import { uniqueId } from 'lodash';
import showGlobalToast from '~/vue_shared/plugins/global_toast';
import { __, s__ } from '~/locale';
import {
  generateBadges as CEGenerateBadges,
  roleDropdownItems as CERoleDropdownItems,
  isDirectMember,
  handleMemberRoleUpdate as CEHandleMemberRoleUpdate,
} from '~/members/utils';
 
export {
  isGroup,
  isDirectMember,
  isCurrentUser,
  canRemove,
  canRemoveBlockedByLastOwner,
  canResend,
  canUpdate,
} from '~/members/utils';
 
export const generateBadges = ({ member, isCurrentUser, canManageMembers }) => [
  ...CEGenerateBadges({ member, isCurrentUser, canManageMembers }),
  {
    show: member.usingLicense,
    text: __('Is using seat'),
    variant: 'neutral',
  },
  {
    show: member.groupSso,
    text: __('SAML'),
    variant: 'info',
  },
  {
    show: member.groupManagedAccount,
    text: __('Managed Account'),
    variant: 'info',
  },
  {
    show: member.canOverride,
    text: __('LDAP'),
    variant: 'info',
  },
  {
    show: member.enterpriseUserOfThisGroup,
    text: __('Enterprise'),
    variant: 'info',
  },
];
 
/**
 * Creates the dropdowns options for static and custom roles
 *
 * @param {object} member
 *   @param {Map<string, number>} member.validRoles
 *   @param {Array<{baseAccessLevel: number, name: string, memberRoleId: number}>} member.customRoles
 */
export const roleDropdownItems = ({ validRoles, customRoles }) => {
  if (!customRoles?.length) {
    return CERoleDropdownItems({ validRoles });
  }
 
  const { flatten: staticRoleDropdownItems } = CERoleDropdownItems({ validRoles });
 
  const customRoleDropdownItems = customRoles.map(
    ({ baseAccessLevel, name, memberRoleId, description }) => ({
      accessLevel: baseAccessLevel,
      memberRoleId,
      text: name,
      value: uniqueId('role-custom-'),
      description,
    }),
  );
 
  return {
    flatten: [...staticRoleDropdownItems, ...customRoleDropdownItems],
    formatted: [
      {
        text: s__('MemberRole|Standard roles'),
        options: staticRoleDropdownItems,
      },
      {
        text: s__('MemberRole|Custom roles'),
        options: customRoleDropdownItems,
      },
    ],
  };
};
 
/**
 * Finds and returns unique value
 *
 * @param {Array<{accessLevel: number, memberRoleId: null|number, text: string, value: string}>} flattenDropdownItems
 * @param {object} member
 *   @param {{integerValue: number, memberRoleId: undefined|null|number}} member.accessLevel
 */
export const initialSelectedRole = (flattenDropdownItems, member) => {
  return flattenDropdownItems.find(
    ({ accessLevel, memberRoleId }) =>
      accessLevel === member.accessLevel.integerValue &&
      memberRoleId === (member.accessLevel.memberRoleId ?? null),
  )?.value;
};
 
export const canDisableTwoFactor = (member) => {
  return Boolean(member.canDisableTwoFactor);
};
 
export const canOverride = (member) => member.canOverride && isDirectMember(member);
 
export const canUnban = (member) => {
  return Boolean(member.banned) && member.canUnban;
};
 
/**
 * Handles role change response, whether it was immediate or enqueued
 *
 * @param {object} update
 *  @param {string} update.currentRole
 *  @param {string} update.requestedRole
 *  @param {object} update.response server response
 * @returns {string} actual new member role
 */
export const handleMemberRoleUpdate = ({ currentRole, requestedRole, response }) => {
  // key and enum are defined in ee/app/controllers/concerns/ee/membership_actions.rb
  if (response?.data?.enqueued) {
    showGlobalToast(s__('Members|Role change request was sent to the administrator.'));
    return currentRole;
  }
 
  return CEHandleMemberRoleUpdate({ currentRole, requestedRole, response });
};