UNPKG

mattermost-redux

Version:

Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client

226 lines (225 loc) 9.64 kB
"use strict"; // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. Object.defineProperty(exports, "__esModule", { value: true }); exports.getFullName = getFullName; exports.displayUsername = displayUsername; exports.spaceSeparatedStringIncludes = spaceSeparatedStringIncludes; exports.isAdmin = isAdmin; exports.isGuest = isGuest; exports.isTeamAdmin = isTeamAdmin; exports.isSystemAdmin = isSystemAdmin; exports.includesAnAdminRole = includesAnAdminRole; exports.isChannelAdmin = isChannelAdmin; exports.hasUserAccessTokenRole = hasUserAccessTokenRole; exports.hasPostAllRole = hasPostAllRole; exports.hasPostAllPublicRole = hasPostAllPublicRole; exports.profileListToMap = profileListToMap; exports.removeUserFromList = removeUserFromList; exports.getSuggestionsSplitBy = getSuggestionsSplitBy; exports.getSuggestionsSplitByMultiple = getSuggestionsSplitByMultiple; exports.nameSuggestionsForUser = nameSuggestionsForUser; exports.filterProfilesStartingWithTerm = filterProfilesStartingWithTerm; exports.filterProfilesMatchingWithTerm = filterProfilesMatchingWithTerm; exports.sortByUsername = sortByUsername; exports.applyRolesFilters = applyRolesFilters; const i18n_utils_1 = require("mattermost-redux/utils/i18n_utils"); const constants_1 = require("../constants"); function getFullName(user) { if (user.first_name && user.last_name) { return user.first_name + ' ' + user.last_name; } else if (user.first_name) { return user.first_name; } else if (user.last_name) { return user.last_name; } return ''; } function displayUsername(user, teammateNameDisplay, useFallbackUsername = true) { let name = useFallbackUsername ? (0, i18n_utils_1.localizeMessage)({ id: 'channel_loader.someone', defaultMessage: 'Someone' }) : ''; if (user) { if (teammateNameDisplay === constants_1.Preferences.DISPLAY_PREFER_NICKNAME) { name = user.nickname || getFullName(user); } else if (teammateNameDisplay === constants_1.Preferences.DISPLAY_PREFER_FULL_NAME) { name = getFullName(user); } else { name = (user.remote_id && user.props?.RemoteUsername) ? user.props.RemoteUsername : user.username; } if (!name || name.trim().length === 0) { name = user.username; } } return name; } function spaceSeparatedStringIncludes(item, spaceSeparated) { if (spaceSeparated) { const items = spaceSeparated?.split(' '); return items.includes(item); } return false; } function isAdmin(roles) { return isSystemAdmin(roles) || isTeamAdmin(roles); } function isGuest(roles) { return spaceSeparatedStringIncludes('system_guest', roles); } function isTeamAdmin(roles) { return spaceSeparatedStringIncludes(constants_1.General.TEAM_ADMIN_ROLE, roles); } function isSystemAdmin(roles) { return spaceSeparatedStringIncludes(constants_1.General.SYSTEM_ADMIN_ROLE, roles); } function includesAnAdminRole(roles) { const rolesArray = roles.split(' '); return [ constants_1.General.SYSTEM_ADMIN_ROLE, constants_1.General.SYSTEM_USER_MANAGER_ROLE, constants_1.General.SYSTEM_READ_ONLY_ADMIN_ROLE, constants_1.General.SYSTEM_MANAGER_ROLE, constants_1.General.SHARED_CHANNEL_MANAGER_ROLE, constants_1.General.SECURE_CONNECTION_MANAGER_ROLE, ].some((el) => rolesArray.includes(el)); } function isChannelAdmin(roles) { return spaceSeparatedStringIncludes(constants_1.General.CHANNEL_ADMIN_ROLE, roles); } function hasUserAccessTokenRole(roles) { return spaceSeparatedStringIncludes(constants_1.General.SYSTEM_USER_ACCESS_TOKEN_ROLE, roles); } function hasPostAllRole(roles) { return spaceSeparatedStringIncludes(constants_1.General.SYSTEM_POST_ALL_ROLE, roles); } function hasPostAllPublicRole(roles) { return spaceSeparatedStringIncludes(constants_1.General.SYSTEM_POST_ALL_PUBLIC_ROLE, roles); } function profileListToMap(profileList) { const profiles = {}; for (let i = 0; i < profileList.length; i++) { profiles[profileList[i].id] = profileList[i]; } return profiles; } function removeUserFromList(userId, list) { for (let i = list.length - 1; i >= 0; i--) { if (list[i].id === userId) { list.splice(i, 1); return list; } } return list; } // Splits the term by a splitStr and composes a list of the parts of // the split concatenated with the rest, forming a set of suggesitons // matchable with startsWith // // E.g.: for "one.two.three" by "." it would yield // ["one.two.three", ".two.three", "two.three", ".three", "three"] function getSuggestionsSplitBy(term, splitStr) { const splitTerm = term.split(splitStr); const initialSuggestions = splitTerm.map((st, i) => splitTerm.slice(i).join(splitStr)); let suggestions = []; if (splitStr === ' ') { suggestions = initialSuggestions; } else { suggestions = initialSuggestions.reduce((acc, val) => { if (acc.length === 0) { acc.push(val); } else { acc.push(splitStr + val, val); } return acc; }, []); } return suggestions; } function getSuggestionsSplitByMultiple(term, splitStrs) { const suggestions = splitStrs.reduce((acc, val) => { getSuggestionsSplitBy(term, val).forEach((suggestion) => acc.add(suggestion)); return acc; }, new Set()); return [...suggestions]; } function nameSuggestionsForUser(user, includeFullEmail = false) { const profileSuggestions = []; const usernameSuggestions = getSuggestionsSplitByMultiple((user.username || '').toLowerCase(), constants_1.General.AUTOCOMPLETE_SPLIT_CHARACTERS); profileSuggestions.push(...usernameSuggestions); const first = (user.first_name || '').toLowerCase(); const last = (user.last_name || '').toLowerCase(); const full = first + ' ' + last; profileSuggestions.push(first, last, full); profileSuggestions.push((user.nickname || '').toLowerCase()); const positionSuggestions = getSuggestionsSplitBy((user.position || '').toLowerCase(), ' '); profileSuggestions.push(...positionSuggestions); const email = (user.email || '').toLowerCase(); const emailPrefix = email.split('@')[0]; profileSuggestions.push(emailPrefix); // Only include full email if explicitly requested (when search contains @) if (includeFullEmail && email.includes('@')) { profileSuggestions.push(email); } return profileSuggestions; } function filterProfilesStartingWithTerm(users, term) { const lowercasedTerm = term.toLowerCase(); let trimmedTerm = lowercasedTerm; if (trimmedTerm.startsWith('@')) { trimmedTerm = trimmedTerm.substr(1); } // Include full email in suggestions if the search term contains @ const includeFullEmail = lowercasedTerm.includes('@'); return users.filter((user) => { if (!user) { return false; } const profileSuggestions = nameSuggestionsForUser(user, includeFullEmail); return profileSuggestions.filter((suggestion) => suggestion !== '').some((suggestion) => suggestion.startsWith(trimmedTerm)); }); } function filterProfilesMatchingWithTerm(users, term) { const lowercasedTerm = term.toLowerCase(); let trimmedTerm = lowercasedTerm; if (trimmedTerm.startsWith('@')) { trimmedTerm = trimmedTerm.substr(1); } // Include full email in suggestions if the search term contains @ const includeFullEmail = lowercasedTerm.includes('@'); return users.filter((user) => { if (!user) { return false; } const profileSuggestions = nameSuggestionsForUser(user, includeFullEmail); return profileSuggestions.filter((suggestion) => suggestion !== '').some((suggestion) => suggestion.includes(trimmedTerm)); }); } function sortByUsername(a, b) { const nameA = a.username; const nameB = b.username; return nameA.localeCompare(nameB); } function checkUserHasRole(user, userIsNotAdminOrGuest, membership, role) { const isSystemRole = role.includes('system'); return (( // If role is system user then user cannot have system admin or system guest roles isSystemRole && user.roles.includes(role) && ((role === constants_1.General.SYSTEM_USER_ROLE && userIsNotAdminOrGuest) || role !== constants_1.General.SYSTEM_USER_ROLE)) || ( // If user is a system admin or a system guest then ignore team and channel memberships !isSystemRole && userIsNotAdminOrGuest && ((role === constants_1.General.TEAM_ADMIN_ROLE && membership?.scheme_admin) || (role === constants_1.General.CHANNEL_ADMIN_ROLE && membership?.scheme_admin) || (role === constants_1.General.TEAM_USER_ROLE && membership?.scheme_user && !membership?.scheme_admin) || (role === constants_1.General.CHANNEL_USER_ROLE && membership?.scheme_user && !membership?.scheme_admin)))); } function applyRolesFilters(user, filterRoles, excludeRoles, membership) { const userIsNotAdminOrGuest = !(user.roles.includes(constants_1.General.SYSTEM_ADMIN_ROLE) || user.roles.includes(constants_1.General.SYSTEM_GUEST_ROLE)); const userHasExcludedRole = excludeRoles.some(checkUserHasRole.bind(null, user, userIsNotAdminOrGuest, membership)); if (userHasExcludedRole) { return false; } return filterRoles.length === 0 || filterRoles.some(checkUserHasRole.bind(null, user, userIsNotAdminOrGuest, membership)); }