![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /opt/mattermost/client/ |
Upload File : |
{"version":3,"file":"1119.b438684e4a1347d38d5b.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/channel_bookmarks/bookmark_delete_modal.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/bookmark_dot_menu.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/bookmark_item.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/channel_bookmarks.tsx"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\n\ntype Props = {\n displayName: string;\n onConfirm: () => void;\n onCancel?: () => void;\n onExited: () => void;\n}\n\nconst noop = () => {};\n\nfunction BookmarkDeleteModal({\n displayName,\n onExited,\n onCancel,\n onConfirm,\n}: Props) {\n const {formatMessage} = useIntl();\n\n const title = formatMessage({\n id: 'channel_bookmarks.confirm.delete.title',\n defaultMessage: 'Delete bookmark',\n });\n\n const confirmButtonText = formatMessage({\n id: 'channel_bookmarks.confirm.delete.button',\n defaultMessage: 'Yes, delete',\n });\n\n const message = (\n <FormattedMessage\n id={'channel_bookmarks.confirm.delete.text'}\n defaultMessage={'Are you sure you want to delete the bookmark <strong>{displayName}</strong>?'}\n values={{\n strong: (chunk: string) => <strong>{chunk}</strong>,\n displayName,\n }}\n />\n );\n\n return (\n <GenericModal\n confirmButtonText={confirmButtonText}\n handleCancel={onCancel ?? noop}\n handleConfirm={onConfirm}\n modalHeaderText={title}\n onExited={onExited}\n compassDesign={true}\n isDeleteModal={true}\n >\n {message}\n </GenericModal>\n );\n}\n\nexport default BookmarkDeleteModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {\n DotsHorizontalIcon,\n PencilOutlineIcon,\n LinkVariantIcon,\n TrashCanOutlineIcon,\n ArrowExpandIcon,\n OpenInNewIcon,\n BookOutlineIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmark, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport {editBookmark, deleteBookmark} from 'actions/channel_bookmarks';\nimport {openModal} from 'actions/views/modals';\n\nimport GetPublicModal from 'components/get_public_link_modal';\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL, shouldOpenInNewTab} from 'utils/url';\nimport {copyToClipboard} from 'utils/utils';\n\nimport BookmarkDeleteModal from './bookmark_delete_modal';\nimport ChannelBookmarksCreateModal from './channel_bookmarks_create_modal';\nimport {useCanGetPublicLink, useChannelBookmarkPermission} from './utils';\n\ntype Props = {bookmark: ChannelBookmark; open: () => void};\nconst BookmarkItemDotMenu = ({\n bookmark,\n open,\n}: Props) => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n const siteURL = getSiteURL();\n const openInNewTab = bookmark.type === 'link' && bookmark.link_url && shouldOpenInNewTab(bookmark.link_url, siteURL);\n\n let openIcon;\n if (bookmark.type === 'file') {\n openIcon = <ArrowExpandIcon size={18}/>;\n } else if (bookmark.link_url) {\n openIcon = openInNewTab ? <OpenInNewIcon size={18}/> : <BookOutlineIcon size={18}/>;\n }\n\n const canEdit = useChannelBookmarkPermission(bookmark.channel_id, 'edit');\n const canDelete = useChannelBookmarkPermission(bookmark.channel_id, 'delete');\n const canGetPublicLink = useCanGetPublicLink();\n\n const editLabel = formatMessage({id: 'channel_bookmarks.edit', defaultMessage: 'Edit'});\n const openLabel = formatMessage({id: 'channel_bookmarks.open', defaultMessage: 'Open'});\n const copyLinkLabel = formatMessage({id: 'channel_bookmarks.copy', defaultMessage: 'Copy link'});\n const copyFileLabel = formatMessage({id: 'channel_bookmarks.copyFilePublicLink', defaultMessage: 'Get a public link'});\n const deleteLabel = formatMessage({id: 'channel_bookmarks.delete', defaultMessage: 'Delete'});\n\n const handleEdit = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.CHANNEL_BOOKMARK_CREATE,\n dialogType: ChannelBookmarksCreateModal,\n dialogProps: {\n bookmark,\n channelId: bookmark.channel_id,\n onConfirm: async (data: ChannelBookmarkPatch) => dispatch(editBookmark(bookmark.channel_id, bookmark.id, data)) as ActionResult<boolean>,\n },\n }));\n }, [editBookmark, dispatch, bookmark]);\n\n const copyLink = useCallback(() => {\n if (bookmark.type === 'link' && bookmark.link_url) {\n copyToClipboard(bookmark.link_url);\n } else if (bookmark.type === 'file' && bookmark.file_id) {\n copyToClipboard(getFileDownloadUrl(bookmark.file_id));\n }\n }, [bookmark.type, bookmark.link_url, bookmark.file_id]);\n\n const handleDelete = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.CHANNEL_BOOKMARK_DELETE,\n dialogType: BookmarkDeleteModal,\n dialogProps: {\n displayName: bookmark.display_name,\n onConfirm: () => dispatch(deleteBookmark(bookmark.channel_id, bookmark.id)),\n },\n }));\n }, [deleteBookmark, dispatch, bookmark]);\n\n const handleGetPublicLink = useCallback(() => {\n if (!bookmark.file_id) {\n return;\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.GET_PUBLIC_LINK_MODAL,\n dialogType: GetPublicModal,\n dialogProps: {\n fileId: bookmark.file_id,\n },\n }));\n }, [bookmark.file_id, dispatch]);\n\n return (\n <Menu.Container\n anchorOrigin={{vertical: 'bottom', horizontal: 'right'}}\n transformOrigin={{vertical: 'top', horizontal: 'right'}}\n menuButton={{\n id: `channelBookmarksDotMenuButton-${bookmark.id}`,\n class: 'channelBookmarksDotMenuButton',\n children: <DotsHorizontalIcon size={18}/>,\n 'aria-label': formatMessage({id: 'channel_bookmarks.editBookmarkLabel', defaultMessage: 'Bookmark menu'}),\n }}\n menu={{\n id: 'channelBookmarksDotMenuDropdown',\n }}\n >\n <Menu.Item\n key='channelBookmarksOpen'\n id='channelBookmarksOpen'\n onClick={open}\n leadingElement={openIcon}\n labels={<span>{openLabel}</span>}\n aria-label={openLabel}\n />\n {canEdit && (\n <Menu.Item\n key='channelBookmarksEdit'\n id='channelBookmarksEdit'\n onClick={handleEdit}\n leadingElement={<PencilOutlineIcon size={18}/>}\n labels={<span>{editLabel}</span>}\n aria-label={editLabel}\n />\n )}\n {bookmark.type === 'link' && (\n <Menu.Item\n key='channelBookmarksLinkCopy'\n id='channelBookmarksLinkCopy'\n onClick={copyLink}\n leadingElement={<LinkVariantIcon size={18}/>}\n labels={<span>{copyLinkLabel}</span>}\n aria-label={copyLinkLabel}\n />\n )}\n {bookmark.type === 'file' && canGetPublicLink && (\n <Menu.Item\n key='channelBookmarksFileCopy'\n id='channelBookmarksFileCopy'\n onClick={handleGetPublicLink}\n leadingElement={<LinkVariantIcon size={18}/>}\n labels={<span>{copyFileLabel}</span>}\n aria-label={copyFileLabel}\n />\n )}\n {canDelete && (\n <Menu.Item\n key='channelBookmarksDelete'\n id='channelBookmarksDelete'\n onClick={handleDelete}\n leadingElement={<TrashCanOutlineIcon size={18}/>}\n labels={<span>{deleteLabel}</span>}\n aria-label={deleteLabel}\n isDestructive={true}\n />\n )}\n </Menu.Container>\n );\n};\n\nexport default BookmarkItemDotMenu;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnchorHTMLAttributes} from 'react';\nimport React, {cloneElement, forwardRef, useRef} from 'react';\nimport type {DraggableProvided} from 'react-beautiful-dnd';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {Link} from 'react-router-dom';\nimport styled, {css} from 'styled-components';\n\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getFile} from 'mattermost-redux/selectors/entities/files';\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport {openModal} from 'actions/views/modals';\n\nimport ExternalLink from 'components/external_link';\nimport FilePreviewModal from 'components/file_preview_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL, shouldOpenInNewTab} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport BookmarkItemDotMenu from './bookmark_dot_menu';\nimport BookmarkIcon from './bookmark_icon';\n\nconst useBookmarkLink = (bookmark: ChannelBookmark) => {\n const linkRef = useRef<HTMLAnchorElement>(null);\n const dispatch = useDispatch();\n const fileInfo: FileInfo | undefined = useSelector((state: GlobalState) => (bookmark?.file_id && getFile(state, bookmark.file_id)) || undefined);\n\n const open = () => {\n linkRef.current?.click();\n };\n\n const handleOpenFile = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n\n if (fileInfo) {\n dispatch(openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n post: {user_id: bookmark.owner_id, channel_id: bookmark.channel_id} as Post,\n fileInfos: [fileInfo],\n startIndex: 0,\n },\n }));\n }\n };\n\n const icon = (\n <BookmarkIcon\n type={bookmark.type}\n emoji={bookmark.emoji}\n imageUrl={bookmark.image_url}\n fileInfo={fileInfo}\n />\n );\n let link;\n\n if (bookmark.type === 'link' && bookmark.link_url) {\n link = (\n <DynamicLink\n href={bookmark.link_url}\n ref={linkRef}\n isFile={false}\n >\n {icon}\n <Label>{bookmark.display_name}</Label>\n </DynamicLink>\n );\n } else if (bookmark.type === 'file' && bookmark.file_id) {\n link = (\n <DynamicLink\n href={getFileDownloadUrl(bookmark.file_id)}\n onClick={handleOpenFile}\n ref={linkRef}\n isFile={true}\n >\n {icon}\n <Label>{bookmark.display_name}</Label>\n </DynamicLink>\n );\n }\n\n return {\n link,\n icon,\n open,\n } as const;\n};\n\ntype Props = {\n bookmark: ChannelBookmark;\n drag: DraggableProvided;\n isDragging: boolean;\n disableInteractions: boolean;\n};\nconst BookmarkItem = (({bookmark, drag, disableInteractions}: Props) => {\n const {link, open} = useBookmarkLink(bookmark);\n\n return (\n <Chip\n ref={drag.innerRef}\n {...drag.draggableProps}\n $disableInteractions={disableInteractions}\n >\n {link && cloneElement(link, {...drag.dragHandleProps, role: 'link'})}\n <BookmarkItemDotMenu\n bookmark={bookmark}\n open={open}\n />\n </Chip>\n );\n});\n\nconst Chip = styled.div<{$disableInteractions: boolean}>`\n position: relative;\n border-radius: 12px;\n overflow: hidden;\n margin: 1px 0;\n flex-shrink: 0;\n min-width: 5rem;\n max-width: 25rem;\n\n button {\n position: absolute;\n visibility: hidden;\n right: 6px;\n top: 3px;\n }\n\n ${({$disableInteractions}) => !$disableInteractions && css`\n &:hover,\n &:focus-within,\n &:has([aria-expanded=\"true\"]) {\n button {\n visibility: visible;\n }\n }\n\n &:hover,\n &:focus-within {\n a {\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n &:hover,\n &:focus-within,\n &:has([aria-expanded=\"true\"]) {\n a {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n color: rgba(var(--center-channel-color-rgb), 1);\n }\n }\n\n &:active:not(:has(button:active)),\n &--active,\n &--active:hover {\n a {\n background: rgba(var(--button-bg-rgb), 0.08);\n color: rgb(var(--button-bg-rgb)) !important;\n\n .icon__text {\n color: rgb(var(--button-bg));\n }\n\n .icon {\n color: rgb(var(--button-bg));\n }\n }\n }\n `}\n`;\n\nconst Label = styled.span`\n white-space: nowrap;\n padding: 4px 0;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nconst TARGET_BLANK_URL_PREFIX = '!';\n\ntype DynamicLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n children: React.ReactNode;\n isFile: boolean;\n};\nconst DynamicLink = forwardRef<HTMLAnchorElement, DynamicLinkProps>(({\n href,\n children,\n isFile,\n onClick,\n ...otherProps\n}, ref) => {\n const siteURL = getSiteURL();\n const openInNewTab = shouldOpenInNewTab(href, siteURL);\n\n const prefixed = href[0] === TARGET_BLANK_URL_PREFIX;\n\n if (prefixed || openInNewTab) {\n return (\n <StyledExternalLink\n {...otherProps}\n href={prefixed ? href.substring(1) : href}\n rel='noopener noreferrer'\n target='_blank'\n location='channel_bookmarks.item'\n ref={ref}\n >\n {children}\n </StyledExternalLink>\n );\n }\n\n if (href.startsWith(siteURL) && !isFile) {\n return (\n <StyledLink\n {...otherProps}\n to={href.slice(siteURL.length)}\n ref={ref}\n >\n {children}\n </StyledLink>\n );\n }\n\n return (\n <StyledAnchor\n {...otherProps}\n href={href}\n ref={ref}\n onClick={onClick}\n >\n {children}\n </StyledAnchor>\n );\n});\n\nconst linkStyles = css`\n display: flex;\n padding: 0 12px 0 6px;\n gap: 5px;\n\n color: rgba(var(--center-channel-color-rgb), 1);\n font-family: Open Sans;\n font-size: 12px;\n font-style: normal;\n font-weight: 600;\n line-height: 16px;\n`;\n\nconst StyledAnchor = styled.a`\n &&&& {\n ${linkStyles}\n }\n`;\n\nconst StyledLink = styled(Link)`\n &&&& {\n ${linkStyles}\n }\n`;\n\nconst StyledExternalLink = styled(ExternalLink)`\n &&&& {\n ${linkStyles}\n }\n`;\n\nexport default BookmarkItem;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport React from 'react';\nimport {DragDropContext, Draggable, Droppable} from 'react-beautiful-dnd';\nimport styled from 'styled-components';\n\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport BookmarkItem from './bookmark_item';\nimport BookmarksMenu from './channel_bookmarks_menu';\nimport {useChannelBookmarks, MAX_BOOKMARKS_PER_CHANNEL, useCanUploadFiles, useChannelBookmarkPermission} from './utils';\n\nimport './channel_bookmarks.scss';\n\ntype Props = {\n channelId: string;\n};\n\nfunction ChannelBookmarks({\n channelId,\n}: Props) {\n const {order, bookmarks, reorder} = useChannelBookmarks(channelId);\n const canReorder = useChannelBookmarkPermission(channelId, 'order');\n const canUploadFiles = useCanUploadFiles();\n const hasBookmarks = Boolean(order?.length);\n const limitReached = order.length >= MAX_BOOKMARKS_PER_CHANNEL;\n\n if (!hasBookmarks) {\n return null;\n }\n\n const handleOnDragEnd: ComponentProps<typeof DragDropContext>['onDragEnd'] = ({source, destination, draggableId}) => {\n if (destination) {\n reorder(draggableId, source.index, destination.index);\n }\n };\n\n return (\n <DragDropContext\n onDragEnd={handleOnDragEnd}\n >\n <Droppable\n droppableId='channel-bookmarks'\n direction='horizontal'\n >\n {(drop, snap) => {\n return (\n <Container\n ref={drop.innerRef}\n data-testid='channel-bookmarks-container'\n {...drop.droppableProps}\n >\n {order.map(makeItemRenderer(bookmarks, snap.isDraggingOver, !canReorder))}\n {drop.placeholder}\n <BookmarksMenu\n channelId={channelId}\n hasBookmarks={hasBookmarks}\n limitReached={limitReached}\n canUploadFiles={canUploadFiles}\n />\n </Container>\n );\n }}\n </Droppable>\n </DragDropContext>\n );\n}\n\nconst makeItemRenderer = (bookmarks: IDMappedObjects<ChannelBookmark>, disableInteractions: boolean, disableDrag: boolean) => (id: string, index: number) => {\n return (\n <Draggable\n key={id}\n draggableId={id}\n index={index}\n isDragDisabled={disableDrag}\n >\n {(drag, snap) => {\n return (\n <BookmarkItem\n key={id}\n drag={drag}\n isDragging={snap.isDragging}\n disableInteractions={snap.isDragging || disableInteractions}\n bookmark={bookmarks[id]}\n />\n );\n }}\n </Draggable>\n );\n};\n\nexport default ChannelBookmarks;\n\nconst Container = styled.div`\n display: flex;\n padding: 0 6px;\n padding-right: 0;\n min-height: 38px;\n align-items: center;\n border-bottom: 1px solid rgba(var(--center-channel-color-rgb), 0.12);\n overflow-x: auto;\n max-width: 100vw;\n`;\n"],"names":["noop","BookmarkDeleteModal","_ref","displayName","onExited","onCancel","onConfirm","formatMessage","useIntl","title","id","defaultMessage","confirmButtonText","message","React","FormattedMessage","values","strong","chunk","GenericModal","handleCancel","handleConfirm","modalHeaderText","compassDesign","isDeleteModal","propTypes","_pt","isRequired","BookmarkItemDotMenu","bookmark","open","dispatch","useDispatch","siteURL","getSiteURL","openInNewTab","type","link_url","shouldOpenInNewTab","openIcon","ArrowExpandIcon","size","OpenInNewIcon","BookOutlineIcon","canEdit","useChannelBookmarkPermission","channel_id","canDelete","canGetPublicLink","useCanGetPublicLink","editLabel","openLabel","copyLinkLabel","copyFileLabel","deleteLabel","handleEdit","useCallback","openModal","modalId","ModalIdentifiers","CHANNEL_BOOKMARK_CREATE","dialogType","ChannelBookmarksCreateModal","dialogProps","channelId","async","editBookmark","data","copyLink","copyToClipboard","file_id","getFileDownloadUrl","handleDelete","CHANNEL_BOOKMARK_DELETE","display_name","deleteBookmark","handleGetPublicLink","GET_PUBLIC_LINK_MODAL","GetPublicModal","fileId","Menu","anchorOrigin","vertical","horizontal","transformOrigin","menuButton","concat","class","children","DotsHorizontalIcon","menu","key","onClick","leadingElement","labels","PencilOutlineIcon","LinkVariantIcon","TrashCanOutlineIcon","isDestructive","_excluded","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","i","Symbol","toPrimitive","call","TypeError","String","_toPrimitive","_toPropertyKey","value","configurable","writable","BookmarkItem","drag","disableInteractions","link","linkRef","useRef","fileInfo","useSelector","state","getFile","undefined","icon","BookmarkIcon","emoji","imageUrl","image_url","DynamicLink","href","ref","isFile","Label","preventDefault","FILE_PREVIEW_MODAL","FilePreviewModal","post","user_id","owner_id","fileInfos","startIndex","_linkRef$current","current","click","useBookmarkLink","Chip","assign","innerRef","draggableProps","$disableInteractions","cloneElement","dragHandleProps","role","isDragging","styled","withConfig","_ref2","css","forwardRef","_ref3","otherProps","n","hasOwnProperty","includes","_objectWithoutPropertiesLoose","s","propertyIsEnumerable","_objectWithoutProperties","prefixed","StyledExternalLink","substring","rel","target","location","startsWith","StyledLink","to","slice","StyledAnchor","linkStyles","Link","ExternalLink","ChannelBookmarks","order","bookmarks","reorder","useChannelBookmarks","canReorder","canUploadFiles","useCanUploadFiles","hasBookmarks","Boolean","limitReached","MAX_BOOKMARKS_PER_CHANNEL","DragDropContext","onDragEnd","source","destination","draggableId","index","Droppable","droppableId","direction","drop","snap","Container","droppableProps","map","makeItemRenderer","isDraggingOver","placeholder","BookmarksMenu","disableDrag","Draggable","isDragDisabled"],"sourceRoot":""}