From c4d18506461b5191708af828099da5e3fb78c1d0 Mon Sep 17 00:00:00 2001 From: jfox-box Date: Wed, 17 Sep 2025 16:15:07 -0700 Subject: [PATCH 1/6] feat(react-tether): Upgrade react-tether to 3.0.3 BREAKING CHANGE: React 17 is no longer supported. This package now requires React 18 or 19. react-tether has been upgraded to v3, so components using react-tether may affect some layouts. --- i18n/en-US.properties | 2150 ----------------- package.json | 9 +- src/components/button-group/ButtonGroup.scss | 17 +- src/components/checkbox/Checkbox.scss | 4 +- src/components/context-menu/ContextMenu.tsx | 26 +- .../__tests__/ContextMenu.test.tsx | 62 +- .../draft-js-editor/DraftJSEditor.js | 8 +- .../draft-js-editor/DraftJSEditor.scss | 4 + src/components/dropdown-menu/DropdownMenu.js | 22 +- .../dropdown-menu/DropdownMenu.scss | 4 + .../__tests__/DropdownMenu.test.js | 293 +-- src/components/flyout/Flyout.js | 23 +- .../flyout/__tests__/Flyout.test.js | 256 +- .../footer-indicator/FooterIndicator.scss | 5 + .../footer-indicator/FooterIndicator.tsx | 6 +- .../FooterIndicator.test.tsx.snap | 1 + src/components/media/Media.scss | 4 + src/components/media/MediaMenu.tsx | 7 +- .../__snapshots__/Media.test.tsx.snap | 26 +- src/components/menu/MenuItem.scss | 3 + src/components/menu/MenuItem.tsx | 4 +- .../__snapshots__/MenuItem.test.tsx.snap | 1 + .../__tests__/PillSelector.test.js | 43 +- src/components/radar/RadarAnimation.scss | 4 + .../radar/RadarAnimation.stories.tsx | 8 +- src/components/radar/RadarAnimation.tsx | 75 +- .../radar/__tests__/RadarAnimation.test.tsx | 58 +- .../RadarAnimation.test.tsx.snap | 260 +- src/components/select/Select.js | 13 +- .../__snapshots__/Select.test.js.snap | 2 +- .../SidebarToggleButton.test.js.snap | 397 +++ .../text-area/__tests__/TextArea.test.js | 8 +- .../text-input/__tests__/TextInput.test.js | 7 +- src/components/tooltip/Tooltip.scss | 4 + src/components/tooltip/Tooltip.tsx | 97 +- .../tooltip/__tests__/Tooltip.test.tsx | 156 +- .../__snapshots__/Tooltip.test.tsx.snap | 598 ++++- .../content-sidebar/SidebarNavButton.js | 14 +- .../content-sidebar/SidebarNavButton.scss | 4 + .../annotations/AnnotationActivity.js | 63 +- .../__tests__/AnnotationActivity.test.js | 60 +- .../activity-feed/app-activity/AppActivity.js | 38 +- .../__tests__/AppActivity.test.js | 39 +- .../__snapshots__/AppActivity.test.js.snap | 24 +- .../activity-feed/comment/Comment.js | 132 +- .../comment/__tests__/Comment.test.js | 30 +- .../__snapshots__/Comment.test.js.snap | 36 +- .../comment/components/BaseCommentMenu.tsx | 136 +- .../activity-feed/task-new/Task.js | 81 +- .../task-new/__tests__/Task.test.js | 18 +- .../__tests__/__snapshots__/Task.test.js.snap | 45 +- .../CollapsibleSidebar.scss | 4 + .../CollapsibleSidebarMenuItem.js | 1 + .../CollapsibleSidebarMenuItem.test.js.snap | 1 + .../left-sidebar/LeftSidebarLinkCallout.js | 23 +- .../__tests__/LeftSidebarLinkCallout.test.js | 31 +- .../LeftSidebarLinkCallout.test.js.snap | 41 +- .../MarkerBasedPagination.test.js.snap | 372 +-- .../OffsetBasedPagination.test.js.snap | 1174 ++++----- src/features/sandbox-banner/SandboxBanner.tsx | 6 +- .../__snapshots__/SandboxBanner.test.tsx.snap | 9 +- .../unified-share-modal/SharedLinkSection.js | 24 +- .../UnifiedShareModal.scss | 12 + .../SharedLinkSection.test.js.snap | 1 + yarn.lock | 19 +- 65 files changed, 2791 insertions(+), 4312 deletions(-) create mode 100644 src/components/menu/MenuItem.scss create mode 100644 src/components/sidebar-toggle-button/__tests__/__snapshots__/SidebarToggleButton.test.js.snap diff --git a/i18n/en-US.properties b/i18n/en-US.properties index d1ba525dc6..b4e727725f 100644 --- a/i18n/en-US.properties +++ b/i18n/en-US.properties @@ -1,2152 +1,2 @@ -# The text for when the user does not have permissions to see access stats. -be.accessStatsPermissionsError = Sorry, you do not have permission to see the access stats for this file. -# Full date time and time stamp -be.activityFeed.fullDateTime = {time, date, full} at {time, time, short} -# Error message for feed item API errors -be.activityFeedItemApiError = There was a problem loading the activity feed. Please refresh the page or try again later. -# Text to show when an annotation activity no longer exists -be.activitySidebar.activityFeed.annotationMissingError = This comment no longer exists -# Text to show when comment no longer exists -be.activitySidebar.activityFeed.commentMissingError = This comment no longer exists -# Error title -be.activitySidebar.activityFeed.feedInlineErrorTitle = Error -# Text to show to hide more replies of comment or annotation -be.activitySidebar.activityFeed.hideReplies = Hide replies -# Text to show on button to start replying to comment -be.activitySidebar.activityFeed.reply = Reply -# Text to show on reply form input placeholder -be.activitySidebar.activityFeed.replyInThread = Reply in thread -# Text to show to get more replies of comment or annotation -be.activitySidebar.activityFeed.showReplies = See {repliesToLoadCount, plural, one {# reply} other {# replies}} -# Text to show when a task no longer exists -be.activitySidebar.activityFeed.taskMissingError = This task no longer exists -# Dropdown option for filtering all activity from activity list -be.activitySidebarFilter.status.allActivity = All Activity -# Dropdown option for filtering all comments from comments list -be.activitySidebarFilter.status.allComments = All Comments -# Dropdown option for filtering unresolved comments from activity or comments list -be.activitySidebarFilter.status.open = Unresolved Comments -# Dropdown option for filtering resolved comments from activity or comments list -be.activitySidebarFilter.status.resolved = Resolved Comments -# Dropdown option for filtering tasks from activity list -be.activitySidebarFilter.status.tasks = Tasks -# Label for add action -be.add = Add -# Text to display when app is disabled by applied access policy -be.additionalTab.blockedByShieldAccessPolicy = Use of this app is blocked due to a security policy. -# Error message when an annotation deletion fails -be.annotationThread.errorDeleteAnnotation = There was an error deleting this item. -# Error message when an annotation update fails -be.annotationThread.errorEditAnnotation = This annotation could not be modified. -# Error message when an annotation fetch fails -be.annotattionThread.errorFetchAnnotation = The annotation could not be fetched. -# Error message when an app activity deletion fails -be.api.appActivityDeleteErrorMessage = There was an error deleting this item. -# Error message when a comment creation fails due to a conflict -be.api.commentCreateConflictMessage = This comment already exists. -# Error message when a comment creation fails -be.api.commentCreateErrorMessage = There was an error creating this comment. -# Error message when a comment deletion fails -be.api.commentDeleteErrorMessage = There was an error deleting this comment. -# Error message when an annotation comment update fails -be.api.commentUpdateErrorMessage = This comment could not be modified. -# Error message when fetching for comment replies fails -be.api.repliesFetchErrorMessage = The replies to this comment could not be loaded. -# Title shown when an error occurs performing an action on a task -be.api.taskActionErrorTitle = Error -# Error message when approving a task fails -be.api.taskApproveErrorMessage = An error has occurred while approving this task. Please refresh the page and try again. -# Error message when completing a task fails -be.api.taskCompleteErrorMessage = An error has occurred while completing this task. Please refresh the page and try again. -# Error message when a task creation fails -be.api.taskCreateErrorMessage = An error occurred while creating this task. Please try again. -# Error message when a task deletion fails -be.api.taskDeleteErrorMessage = There was an error while deleting this task. Please refresh the page and try again. -# Warning message showing that, while the task was being created, the group assignee limit was exceeded by specified amount -be.api.taskGroupExceedsWarningTitle = One or more groups can not receive this task as a group size cannot exceed the limit of {max} assignees per group. -# Error message when rejecting a task fails -be.api.taskRejectErrorMessage = An error has occurred while rejecting this task. Please refresh the page and try again. -# Alt message if app activity icon is missing or cannot load -be.appActivity.altIcon = {appActivityName} Icon -# Text to display in the delete app activity submit button -be.appActivity.deleteMenuItem = Delete -# Confirmation prompt text to delete app activity -be.appActivity.deletePrompt = Are you sure you want to permanently delete this app activity? -# Icon title for a Box item of type folder is an archive -be.archive = Archive -# Icon title for a Box item of type folder is in archive -be.archivedFolder = Archived Folder -# Label for back button -be.back = Back -# Icon title for a Box item of type bookmark or web-link -be.bookmark = Bookmark -# Message when Box Tools cannot open a particular file type -be.boxEditBlacklistedError = This file cannot be opened locally -# Shown in the open with dropdown when an application is blocked by shield access policy. -be.boxEditErrorBlockedByPolicy = Local editing of this content has been disabled based on an access policy -# Message shown telling user how to install Box Tools -be.boxToolsInstallMessage = Install {boxTools} to open this file on your desktop -# Aria label for describing "breadcrumb" -be.breadcrumb.breadcrumbLabel = Breadcrumb -# Label for cancel action. -be.cancel = Cancel -# Label for choose action. -be.choose = Choose -# Aria label for the clear selection button. -be.clearSelection = Clear selection -# Label for close action. -be.close = Close -# Icon title for a Box item of type folder that has collaborators -be.collaboratedFolder = Collaborated Folder -# Message to the user to collapse the Transcript entries -be.collapse = Collapse -# Label for complete state. -be.complete = Complete -# Text shown to users when opening the content insights flyout and there is an error -be.contentInsights.contentAnalyticsErrorText = There was a problem loading content insights. Please try again. -# Message shown when the user does not have access to view content insights anymore -be.contentInsights.contentAnalyticsPermissionError = Oops! You no longer have access to view content insights. -# Title for Content Insights section in file sidebar -be.contentInsights.contentInsightsTitle = Content Insights -# Label for the chart displaying the number of downloads over the selected time period -be.contentInsights.downloadGraphLabel = Chart displaying the number of downloads over the selected time period -# Title for the content insights graph card regarding number of Previews -be.contentInsights.downloadGraphType = DOWNLOADS -# Open Content Insights button which opens the Content Insights Modal -be.contentInsights.openContentInsightsButton = See Details -# Label for the chart displaying the number of users over the selected time period -be.contentInsights.peopleGraphLabel = Chart displaying the number of users over the selected time period -# Title used to represent how many users have interacted with the file -be.contentInsights.peopleTitle = PEOPLE -# Label for the chart displaying the number of previews over the selected time period -be.contentInsights.previewGraphLabel = Chart displaying the number of previews over the selected time period -# Title for the content insights graph card regarding number of Previews -be.contentInsights.previewGraphType = PREVIEWS -# Label for the arrow indicator in the trend pill -be.contentInsights.trendDown = Trending down -# Trend description for the content insights graph card regarding the count of events from the past month -be.contentInsights.trendMonth = PAST MONTH -# Trend description for the content insights graph card regarding the count of events from the past three months -be.contentInsights.trendThreeMonths = PAST 3 MONTHS -# Label for the arrow indicator in the trend pill -be.contentInsights.trendUp = Trending up -# Trend description for the content insights graph card regarding the count of events from the past week -be.contentInsights.trendWeek = PAST WEEK -# Trend description for the content insights graph card regarding the count of events from the past year -be.contentInsights.trendYear = PAST YEAR -# Message that appears when the request for the ContentSharing Element is malformed. -be.contentSharing.badRequestError = The request for this item was malformed. -# Message that appears when collaborators cannot be retrieved in the ContentSharing Element. -be.contentSharing.collaboratorsLoadingError = Could not retrieve collaborators for this item. -# Default error notification text rendered when API fails -be.contentSharing.defaultErrorNoticeText = Something went wrong. Please try again later. -# Icon label for the error notifications -be.contentSharing.errorNoticeIcon = Error -# Message that appears when users cannot be retrieved in the ContentSharing Element. -be.contentSharing.getContactsError = Could not retrieve contacts. -# Display text for a Group contact type -be.contentSharing.groupContactLabel = Group -# Message that appears when the ContentSharing Element cannot be loaded. -be.contentSharing.loadingError = Could not load shared link for this item. -# Message that appears when the user cannot access the item for the ContentSharing Element. -be.contentSharing.noAccessError = You do not have access to this item. -# Message that appears when the item for the ContentSharing Element cannot be found. -be.contentSharing.notFoundError = Could not find shared link for this item. -# Close button aria label for the notifications -be.contentSharing.noticeCloseLabel = Close -# Message that appears when collaborators cannot be added to the shared link in the ContentSharing Element. -be.contentSharing.sendInvitationsError = {count, plural, one {Failed to invite a collaborator.} other {Failed to invite {count} collaborators.}} -# Message that appears when collaborators were added to the shared link in the ContentSharing Element. -be.contentSharing.sendInvitationsSuccess = {count, plural, one {Successfully invited a collaborator.} other {Successfully invited {count} collaborators.}} -# Message that appears when collaborators cannot be added to the shared link in the ContentSharing Element. -be.contentSharing.sendInvitesError = Could not send invites. -# Message that appears when collaborators were added to the shared link in the ContentSharing Element. -be.contentSharing.sendInvitesSuccess = Successfully invited collaborators. -# Message that appears when the shared link in the ContentSharing Element was removed. -be.contentSharing.sharedLinkRemovalSuccess = The shared link for this item was removed. -# Message that appears when the shared link settings in the ContentSharing Element were successfully updated. -be.contentSharing.sharedLinkSettingsUpdateSuccess = The shared link for this item was successfully updated. -# Message that appears when the shared link in the ContentSharing Element cannot be updated. -be.contentSharing.sharedLinkUpdateError = Could not update the shared link for this item. -# Text to show on menu item to delete the annotation comment -be.contentSidebar.activityFeed.annotationActivity.annotationActivityDeleteMenuItem = Delete -# Confirmation prompt text to delete the annotation comment -be.contentSidebar.activityFeed.annotationActivity.annotationActivityDeletePrompt = Are you sure you want to permanently delete this comment? -# Text to show on menu item to edit the annotation comment -be.contentSidebar.activityFeed.annotationActivity.annotationActivityEditMenuItem = Modify -# Full data and time for annotation title -be.contentSidebar.activityFeed.annotationActivity.annotationActivityPostedFullDateTime = {time, date, full} at {time, time, short} -# Text to show on menu item to resolve the annotation comment -be.contentSidebar.activityFeed.annotationActivity.annotationActivityResolveMenuItem = Resolve -# Text to show on menu item to unresolve the annotation comment -be.contentSidebar.activityFeed.annotationActivity.annotationActivityUnresolveMenuItem = Unresolve -# Annotation activity item link shown on annotation activity -be.contentSidebar.activityFeed.annotationActivityPageItem = Page {number} -# Annotation activity item link shown on annotation activity for previous file version -be.contentSidebar.activityFeed.annotationActivityVersionLink = Version {number} -# Annotation activity item link shown on annotation activity for previous file version that is unavailable -be.contentSidebar.activityFeed.annotationActivityVersionUnavailable = Version Unavailable -# Text to show on menu item to delete comment -be.contentSidebar.activityFeed.comment.commentDeleteMenuItem = Delete -# Confirmation prompt text to delete comment -be.contentSidebar.activityFeed.comment.commentDeletePrompt = Are you sure you want to permanently delete this comment? -# Text to show on menu item to edit comment -be.contentSidebar.activityFeed.comment.commentEditMenuItem = Modify -# Comment posted full date time for title -be.contentSidebar.activityFeed.comment.commentPostedFullDateTime = {time, date, full} at {time, time, short} -# Text to show on menu item to resolve the comment -be.contentSidebar.activityFeed.comment.commentResolveMenuItem = Resolve -# Text to show on menu item to unresolve the comment -be.contentSidebar.activityFeed.comment.commentUnresolveMenuItem = Unresolve -# Text to show to hide more replies of comment or annotation -be.contentSidebar.activityFeed.comment.hideReplies = Hide replies -# Text for aria label of Inline comment circle type icon -be.contentSidebar.activityFeed.comment.inlineCommentAnnotationIconTitle = Inline Comment -# Text to show on button to start replying to comment -be.contentSidebar.activityFeed.comment.reply = Reply -# Text to show on reply form input placeholder -be.contentSidebar.activityFeed.comment.replyInThread = Reply in thread -# Text to show to get more replies of comment or annotation -be.contentSidebar.activityFeed.comment.showReplies = See {repliesToLoadCount, plural, one {# reply} other {# replies}} -# Placeholder for approvers input -be.contentSidebar.activityFeed.commentForm.approvalAddAssignee = Add an assignee -# Label for checkbox to add approvers to a comment -be.contentSidebar.activityFeed.commentForm.approvalAddTask = Add Task -# Tooltip text for checkbox to add approvers to a comment -be.contentSidebar.activityFeed.commentForm.approvalAddTaskTooltip = Assigning a task to someone will send them a notification with the message in the comment box and allow them to approve or deny. -# Title for assignees input -be.contentSidebar.activityFeed.commentForm.approvalAssignees = Assignees -# Title for approvers due date input -be.contentSidebar.activityFeed.commentForm.approvalDueDate = Due Date -# Placeholder for due date input -be.contentSidebar.activityFeed.commentForm.approvalSelectDate = Select a date -# Mentioning call to action displayed below the comment input -be.contentSidebar.activityFeed.commentForm.atMentionTip = @mention users to notify them. -# Mentioning call to action detailed description for screen reader users -be.contentSidebar.activityFeed.commentForm.atMentionTipDescription = Use the @ symbol to mention users and use the up and down arrow keys to scroll through autocomplete suggestions. -# Text for cancel button -be.contentSidebar.activityFeed.commentForm.commentCancel = Cancel -# Accessible label for comment input field -be.contentSidebar.activityFeed.commentForm.commentLabel = Write a comment -# Text for post button -be.contentSidebar.activityFeed.commentForm.commentPost = Post -# Label for toggle to add video timestamp to comment -be.contentSidebar.activityFeed.commentForm.commentTimestampLabel = Comment with timestamp -# Placeholder for comment input -be.contentSidebar.activityFeed.commentForm.commentWrite = Write a comment -# Show original button for showing original comment -be.contentSidebar.activityFeed.commmon.showOriginalMessage = Show Original -# Indicator of resolved status of Comment or Annotation, visible in Feed Item (in upper-case in supported language) -be.contentSidebar.activityFeed.common.activityStatusResolved = RESOLVED -# Label indicating that message was edited, should be lowercase, should have escaped leading space -be.contentSidebar.activityFeed.common.editedMessage = \ (edited) -# See less button for hiding part of long message -be.contentSidebar.activityFeed.common.seeLessMessage = See less -# See more button for showing whole long message -be.contentSidebar.activityFeed.common.seeMoreMessage = See more -# Accessibility label for timestamp button that allows jumping to a specific time in media -be.contentSidebar.activityFeed.common.timestampLabel = Seek to video timestamp -# Translate button for translating comment -be.contentSidebar.activityFeed.common.translateMessage = Translate -# Text for aria label of approval task circle type icon -be.contentSidebar.activityFeed.task.approvalTaskAnnotationIconTitle = Approval Task -# Text for aria label of general task circle type icon -be.contentSidebar.activityFeed.task.generalTaskAnnotationIconTitle = General Task -# Tooltip text for any task icon, explaining that the task only needs one assignee to complete. -be.contentSidebar.activityFeed.task.taskAnyAffordanceTooltip = Only one assignee is required to complete this task -# Text to show on menu item to delete task -be.contentSidebar.activityFeed.task.taskDeleteMenuItem = Delete task -# Confirmation prompt text to delete task -be.contentSidebar.activityFeed.task.taskDeletePrompt = Are you sure you want to permanently delete this task? -# Text to show on menu item to edit task -be.contentSidebar.activityFeed.task.taskEditMenuItem = Modify task -# Tooltip text for multi-file icon, explaining that the task involves multiple files -be.contentSidebar.activityFeed.task.taskMultipleFilesAffordanceTooltip = There are multiple files associated with this task -# Label for checkbox to set a task that requires only one assignee to complete. -be.contentSidebar.activityFeed.taskForm.taskAnyCheckboxLabel = Only one assignee is required to complete this task -# Text in tooltip explaining completion rule for an any assignee task (with optional groups). -be.contentSidebar.activityFeed.taskForm.taskAnyInfoGroupTooltip = Selecting this option will require only one assignee to complete this task. This will include assignees across all groups. -# Text in tooltip explaining completion rule for an any assignee task. -be.contentSidebar.activityFeed.taskForm.taskAnyInfoTooltip = By default, all assignees are required to take action before a task is complete. Selecting this option will require only one assignee to complete this task. -# Warning message showing that, while the task was updated, not all assignees (1+) were removed -be.contentSidebar.activityFeed.taskForm.taskApprovalAssigneeRemovalWarningMessage = Unable to remove assignee(s) because the task is now approved. -# Title shown above error message when a task creation fails -be.contentSidebar.activityFeed.taskForm.taskCreateErrorTitle = Error -# Subheading for dropdown where user can select assignees and the item is a group -be.contentSidebar.activityFeed.taskForm.taskCreateGroupLabel = Group -# Title shown above warning message when a task create/edit partially fails -be.contentSidebar.activityFeed.taskForm.taskEditWarningTitle = Task Updated with Errors -# Warning message showing that, while the task was updated, not all assignees (1+) were removed -be.contentSidebar.activityFeed.taskForm.taskGeneralAssigneeRemovalWarningMessage = Unable to remove assignee(s) because the task is now completed. -# Title shown above warning message when task group exceeds limit -be.contentSidebar.activityFeed.taskForm.taskGroupExceedsWarningTitle = Exceeded max assignees per group -# Error message when a task edit fails -be.contentSidebar.activityFeed.taskForm.taskUpdateErrorMessage = An error occurred while modifying this task. Please try again. -# label for cancel button in create task popup -be.contentSidebar.activityFeed.taskForm.tasksAddTaskFormCancelLabel = Cancel -# label for task create form due date input -be.contentSidebar.activityFeed.taskForm.tasksAddTaskFormDueDateLabel = Due Date -# label for task create form message input -be.contentSidebar.activityFeed.taskForm.tasksAddTaskFormMessageLabel = Message -# label for task create form assignee input -be.contentSidebar.activityFeed.taskForm.tasksAddTaskFormSelectAssigneesLabel = Select Assignees -# label for create button in create task modal in create mode -be.contentSidebar.activityFeed.taskForm.tasksAddTaskFormSubmitLabel = Create -# label for edit button in create task modal in edit mode -be.contentSidebar.activityFeed.taskForm.tasksEditTaskFormSubmitLabel = Update -# Title for checkmark icon indicating someone completed a task -be.contentSidebar.activityFeed.taskNew.taskAssignmentCompleted = Completed -# Error message when we failed to load the collaborators when user tries to edit a task -be.contentSidebar.activityFeed.taskNew.taskCollaboratorLoadErrorMessage = An error has occurred while loading collaborators for this task. Please try again. -# Label and date for task due date -be.contentSidebar.activityFeed.taskNew.taskDueDateLabel = Due: {date} -# Text for due date description formatted with relative date and relative time. (Upper-case in supported languages) -be.contentSidebar.activityFeed.taskNew.taskFeedStatusDue = DUE {dateTime} -# Button name to hide task assignee list -be.contentSidebar.activityFeed.taskNew.taskShowLessAssignees = Show Less -# Button name to expand task assignee list, additionalAssigneeCount is the number of additional task assignees that can be shown. -be.contentSidebar.activityFeed.taskNew.taskShowMoreAssignees = Show {additionalAssigneeCount} More -# Button name to expand task assignee list, when there is an unknown number of assignees beyond additionalAssigneeCount. -be.contentSidebar.activityFeed.taskNew.taskShowMoreAssigneesOverflow = {additionalAssigneeCount, plural, one {Show #+ More} other {Show #+ More}} -# Approve option for an approval task -be.contentSidebar.activityFeed.taskNew.tasksFeedApproveAction = Approve -# Label for an approved task -be.contentSidebar.activityFeed.taskNew.tasksFeedApprovedLabel = Approved -# Label for an approved task (in upper-case in supported language) -be.contentSidebar.activityFeed.taskNew.tasksFeedApprovedUppercaseLabel = APPROVED -# Title for list of all task assignees -be.contentSidebar.activityFeed.taskNew.tasksFeedAssigneeListTitle = Assignees -# Completion option for a general task -be.contentSidebar.activityFeed.taskNew.tasksFeedCompleteAction = Mark as Complete -# Label for a completed task -be.contentSidebar.activityFeed.taskNew.tasksFeedCompletedLabel = Completed -# Label for an completed task (in upper-case in supported language) -be.contentSidebar.activityFeed.taskNew.tasksFeedCompletedUppercaseLabel = COMPLETED -# Comment headline for an approval task -be.contentSidebar.activityFeed.taskNew.tasksFeedHeadlineApproval = {user} assigned an Approval Task -# Comment headline for an approval task assigned to the current user -be.contentSidebar.activityFeed.taskNew.tasksFeedHeadlineApprovalCurrentUser = {user} assigned you an Approval Task -# Comment headline for a general task -be.contentSidebar.activityFeed.taskNew.tasksFeedHeadlineGeneral = {user} assigned a Task -# Comment headline for a general task assigned to the current user -be.contentSidebar.activityFeed.taskNew.tasksFeedHeadlineGeneralCurrentUser = {user} assigned you a Task -# Label for a task in progress -be.contentSidebar.activityFeed.taskNew.tasksFeedInProgressLabel = In Progress -# Label for a task in progress (in upper-case in supported language) -be.contentSidebar.activityFeed.taskNew.tasksFeedInProgressUppercaseLabel = IN PROGRESS -# Label for button to expand flyout to see all task assignees -be.contentSidebar.activityFeed.taskNew.tasksFeedMoreAssigneesLabel = See all assignees -# Reject option for an approval task -be.contentSidebar.activityFeed.taskNew.tasksFeedRejectAction = Reject -# Label for a rejected task -be.contentSidebar.activityFeed.taskNew.tasksFeedRejectedLabel = Rejected -# Label for a task rejected (in upper-case in supported language) -be.contentSidebar.activityFeed.taskNew.tasksFeedRejectedUppercaseLabel = REJECTED -# Approved task status, where dateTime is a readable time like "Today at 2pm" -be.contentSidebar.activityFeed.taskNew.tasksFeedStatusApproved = Approved {dateTime} -# Completed task status, where dateTime is a readable time like "Today at 2pm" -be.contentSidebar.activityFeed.taskNew.tasksFeedStatusCompleted = Completed {dateTime} -# Rejected task status, where dateTime is a readable time like "Today at 2pm" -be.contentSidebar.activityFeed.taskNew.tasksFeedStatusRejected = Rejected {dateTime} -# View the details for a task -be.contentSidebar.activityFeed.taskNew.tasksFeedViewDetailsAction = View Task Details -# label for button that opens task popup -be.contentSidebar.addTask = Add Task -# label for menu item that opens approval task popup -be.contentSidebar.addTask.approval = Approval Task -# description for menu item that opens approval task popup -be.contentSidebar.addTask.approval.description = Assignees will be responsible for approving or rejecting tasks -# title for approval task popup -be.contentSidebar.addTask.approval.title = Create Approval Task -# label for menu item that opens general task popup -be.contentSidebar.addTask.general = General Task -# description for menu item that opens general task popup -be.contentSidebar.addTask.general.description = Assignees will be responsible for marking tasks as complete -# title for general task popup -be.contentSidebar.addTask.general.title = Create General Task -# body for first-time user experience tooltip shown to new users of Box Sign -be.contentSidebar.boxSignFtuxBody = Sign documents or send signature requests, right from where your content lives -# title for first-time user experience tooltip shown to new users of Box Sign -be.contentSidebar.boxSignFtuxTitle = Box Sign - Secure, seamless e-signatures in Box -# label for button that opens a Box Sign signature request experience -be.contentSidebar.boxSignRequest = Request Signature -# One of the dropdown options that opens a Box Sign request signature experience -be.contentSidebar.boxSignRequestSignature = Request Signature -# Tooltip text for when Box Sign is blocked due to a security policy -be.contentSidebar.boxSignSecurityBlockedTooltip = This action is unavailable due to a security policy. -# One of the dropdown options that opens a Box Sign sign myself experience -be.contentSidebar.boxSignSignMyself = Sign Myself -# Tooltip text for when Box Sign is blocked due to an item being watermarked -be.contentSidebar.boxSignWatermarkBlockedTooltip = This action is unavailable, because the file is watermarked. -# title for when editing an existing approval task -be.contentSidebar.editTask.approval.title = Modify Approval Task -# modal title for when editing an existing general task -be.contentSidebar.editTask.general.title = Modify General Task -# Label for copy action. -be.copy = Copy -# Label for create action. -be.create = Create -# Error text for create folder dialog when name is already in use -be.createDialogErrorInUse = A folder with the same name already exists. -# Error text for create folder dialog when name is invalid -be.createDialogErrorInvalid = This is an invalid folder name. -# Error text for create folder dialog when name is too long -be.createDialogErrorTooLong = This folder name is too long. -# Label for create folder dialog -be.createDialogLabel = New Folder -# Text for create folder dialog -be.createDialogText = Please enter a name. -# Current user error message -be.currentUserErrorHeaderMessage = Something went wrong when fetching the current user. -# Date ascending option shown in the share access drop down select. -be.dateASC = Date: Oldest → Newest -# Date descending option shown in the share access drop down select. -be.dateDESC = Date: Newest → Oldest -# Text displayed to the user instead of showing today's date value -be.dateValue.today = Today -# Text displayed to the user instead of showing yesterday's date value -be.dateValue.yesterday = Yesterday -# Default error mask top message -be.defaultErrorMaskHeaderMessage = We’re sorry, something went wrong. -# Default error mask bottom message -be.defaultErrorMaskSubHeaderMessage = Please refresh the page or try again later. -# Default bottom inline error message -be.defaultInlineErrorContentMessage = Please try again later. -# Message to the user when there is at least one Open With integration available -be.defaultOpenWithDescription = Open this file with a partner service -# Label for default skill section in the preview sidebar -be.defaultSkill = Skill Card -# Label for delete action. -be.delete = Delete -# Text for delete confirmation dialog for files -be.deleteDialogFileText = Are you sure you want to delete {name}? -# Text for delete confirmation dialog for folders -be.deleteDialogFolderText = Are you sure you want to delete {name} and all its contents? -# Label for delete confirmation dialog -be.deleteDialogLabel = Confirm Delete -# Label for the description field in the preview sidebar. -be.description = Description -# Placeholder for file description in preview sidebar. -be.descriptionPlaceholder = Enter a description -# DocGen sidebar header -be.docGenSidebar.docGenTags = Doc Gen Tags -# No tags available -be.docGenSidebar.emptyTags = This document has no tags -# Error message when tags could not be loaded -be.docGenSidebar.errorTags = Looks like your recent changes to the Doc Gen template are yet to be processed. -# Image tags section header -be.docGenSidebar.imageTags = Image tags -# Label for the Process document button -be.docGenSidebar.refreshButton = Process document -# Text tags section header -be.docGenSidebar.textTags = Text tags -# Label for download action. -be.download = Download -# Message to the user to enter into drawing annotation mode -be.drawAnnotation = Drawing annotation mode -# Label for an edit action -be.editLabel = Edit -# Message to the user when there are no Open With integrations -be.emptyOpenWithDescription = No integrations are available for this file -# Text shown in the empty state when there is an error -be.emptyView.errorState = A network error has occurred while trying to load. -# Text shown in the empty state when there are no folder items -be.emptyView.folderState = There are no items in this folder. -# Text shown in the empty state when the folder items are loading -be.emptyView.loadingState = Please wait while the items load... -# Text shown in the empty state when there are no items for the metadata query -be.emptyView.metadataState = There are no items in this folder. -# Text shown in the empty state when there are no recent items -be.emptyView.recentsState = There are no recent items yet. -# Text shown in the empty state when there no results for the search query -be.emptyView.searchState = Sorry, we couldn't find what you're looking for. -# Text shown in the empty state when there are no selected items -be.emptyView.selectedState = You haven't selected any items yet. -# Generic error label. -be.error = Error -# Default label for signifying error in the sub header. -be.errorBreadcrumb = Error -# Title when an error occurs -be.errorOccured = An error occurred -# Message to the user when the open with element errors -be.errorOpenWithDescription = Opening this file with other services is currently unavailable -# Header message to the user when an Open With integration fails to execute -be.executeIntegrationOpenWithErrorHeader = We’re sorry, this integration is currently unavailable. -# Sub header message to the user when an Open With integration fails to execute -be.executeIntegrationOpenWithErrorSubHeader = Please try again later. -# Message to the user to expand the Transcript entries -be.expand = Expand -# Icon title for a Box item of type folder that has collaborators outside of the user's enterprise -be.externalFolder = External Folder -# Label for face skill section in the preview sidebar -be.faceSkill = Faces -# Call-to-action text describing what to do to navigate to specified feedback form -be.feedbackCtaText = Click to provide feedback -# Accessible text used to describe the form used for feedback -be.feedbackFormDescription = Beta Feedback Form -# Icon title for a Box item of type file -be.file = File -# File access stats error message -be.fileAccessStatsErrorHeaderMessage = Something went wrong when fetching the access stats. -# File classification error message -be.fileClassificationErrorHeaderMessage = Something went wrong when fetching classification. -# Inline error title message for file description -be.fileDescriptionInlineErrorTitleMessage = Something went wrong when saving the description. -# name of the File Request feature used to translate when a File Request is uploaded by the service -be.fileRequestDisplayName = File Request -# Icon title for a Box item of type folder -be.folder = Folder -# Aria label for button to get information about a file’s versions -be.getVersionInfo = Get version information -# Label for switching to grid view -be.gridView = Switch to Grid View -# Label for decreasing the size of columns in grid view -be.gridView.decreaseColumnSize = Decrease column size -# Label for increasing the size of columns in grid view -be.gridView.increaseColumnSize = Increase column size -# Label for the grid view size slider -be.gridView.sliderLabel = Grid view size -# Aria label for file icon -be.iconFile = {extension} File -# Label for in action. -be.in = In -# Text for last accessed date with last access prefix. -be.interactedDate = Last accessed on {date} -# Label for a Box item icon of type folder and is an archive -be.item.archive = Archive -# Label for a Box item icon of type folder and is located in an archive -be.item.archiveFolder = Archive folder -# Label for a Box item icon of type bookmark or web-link -be.item.bookmark = Bookmark -# Label for a Box item icon of type folder shared with collaborators -be.item.collaboratedFolder = Collaborated folder -# Label for a Box item icon of type folder shared with outside organization collaborators -be.item.externalFolder = External folder -# Label for a Box item icon of type file -be.item.file = File -# Label for a Box item icon of type file with its file extension -be.item.fileExtension = {extension} file -# Text for the list or grid item to indicate the modified date and modified user -be.item.modifiedDateBy = {date} by {name} -# Label for a Box item icon of type folder that is private to the user -be.item.personalFolder = Personal folder -# Text for the list or grid item to indicate the date the user last viewed the item -be.item.viewedDate = Viewed {date} -# Text for the list or grid item to indicate the user last viewed the item today -be.item.viewedToday = Viewed today -# Text for the list or grid item to indicate the user last viewed the item yesterday -be.item.viewedYesterday = Viewed yesterday -# Label for item created date. -be.itemCreated = Created -# Label for the list of files and folders displayed in a grid view -be.itemGrid.gridView = Grid view -# Label for item last accessed date. -be.itemInteracted = Last Accessed -# Label for the column header in the list view for the available user actions on the item -be.itemList.actionsColumn = ACTIONS -# Label for the column header in the list view for the date the item was modified -be.itemList.dateColumn = UPDATED -# Label for the column header in the list view for the combined details of the item -be.itemList.detailsColumn = DETAILS -# Concatenated text of the modified date and item size of the file or folder -be.itemList.itemSubtitle = {date} • {size} -# Label for the list of files and folders displayed in a list view -be.itemList.listView = List view -# Label for the column header in the list view for the name of the item -be.itemList.nameColumn = NAME -# Label for the column header in the list view for the size of the item -be.itemList.sizeColumn = SIZE -# Label for item modified date. -be.itemModified = Modified -# Label for item name attribute. -be.itemName = Name -# Label for item owner. -be.itemOwner = Owner -# Label for item size attribute. -be.itemSize = Size -# label for item uploader. -be.itemUploader = Uploader -# Label for keywords/topics skill section in the preview sidebar -be.keywordSkill = Topics -# Message displayed in the activity feed for when image keyword search applies keywords -be.keywordsAppliedList = Keywords were applied -# Label for a list of keywords. {words} are the list of keywords. -be.keywordsList = Keywords: {words} -# Label for switching to list view -be.listView = Switch to List View -# Label for loading state. -be.loading = Loading -# Placeholder for a logo. -be.logo = Logo -# Indicator on the footer that max items have been selected. -be.max = max -# Title for all categories -be.messageCenter.all = All -# Title for Box education category -be.messageCenter.boxEducation = Box Education -# Displayed when there was an error fetching posts -be.messageCenter.errorFetchingPosts = Sorry, we are having trouble showing posts at the moment. It may help to refresh the page. -# Title for product category -be.messageCenter.events = Events -# Displayed when there are no posts to display -be.messageCenter.noPosts = There are no posts for this category at the moment. -# Error message for preview not loading an image -be.messageCenter.previewError = Sorry, we're having trouble showing this image. -# Title for product category -be.messageCenter.product = Product -# Title for the message center modal -be.messageCenter.title = What's New -# Text shown in error notification banner -be.metadataUpdateErrorNotification = Unable to save changes. Please try again. -# Text shown in success notification banner -be.metadataUpdateSuccessNotification = {numSelected, plural, =1 {1 document updated} other {# documents updated} } -# Text for modified date with modified prefix. -be.modifiedDate = Modified {date} -# Text for modified date with user with modified prefix. -be.modifiedDateBy = Modified {date} by {name} -# Label for a button that displays more options -be.moreOptions = More options -# Display text for field when there are multiple items selected and have different value -be.multipleValues = Multiple Values -# Name ascending option shown in the share access drop down select. -be.nameASC = Name: A → Z -# Name descending option shown in the share access drop down select. -be.nameDESC = Name: Z → A -# Text for modified or interacted date with user. -be.nameDate = {date} by {name} -# Label for create new folder action. -be.newFolder = New Folder -# Next file button title -be.nextFile = Next File -# Title for next segment on skill timeline -be.nextSegment = Next Segment -# Message displayed in an empty activity feed -be.noActivity = No activity to show -# Message shown alongside empty activity feed when user can annotate -be.noActivityAnnotationPrompt = Hover over the preview and use the controls at the bottom to annotate the file. -# Message shown in -be.noActivityCommentPrompt = Comment and @mention people to notify them. -# Text shown to indicate the number of files selected -be.numFilesSelected = {numSelected, plural, =0 {0 files selected} one {1 file selected} other {# files selected} } -# Label for open action. -be.open = Open -# Next page button tooltip -be.pagination.nextPage = Next Page -# Next page button -be.pagination.nextPageButton = Next -# Pagination menu status with the range of entries shown -be.pagination.pageEntryStatus = Showing {startEntryIndex} to {endEntryIndex} of {totalCount} entries -# Pagination menu button with current page number out of total number of pages -be.pagination.pageStatus = {pageNumber} of {pageCount} -# Previous page button tooltip -be.pagination.previousPage = Previous Page -# Previous page button -be.pagination.previousPageButton = Previous -# Icon title for a Box item of type folder that is private and has no collaborators -be.personalFolder = Personal Folder -# Message to the user to enter into point annotation mode -be.pointAnnotation = Point annotation mode -# Label for preview action. -be.preview = Preview -# Error message when Preview fails due to the files call. -be.previewError = This preview didn’t load. Please try to open or download the file to view. -# Error message when Preview fails due to the files call which is blocked by an access policy. -be.previewErrorBlockedByPolicy = Your access to this content is restricted due to a security policy. -# Message when new preview is available. -be.previewUpdate = A new version of this file is available. -# Previous file button title -be.previousFile = Previous File -# Title for previous segment on skill timeline -be.previousSegment = Previous Segment -# Label for print action -be.print = Print -# If a user has been deleted, we call the user "a prior collaborator" - meaning someone who used to be able to collaborate on the content. -be.priorCollaborator = A Prior Collaborator -# Shown as the title in the sub header when showing recents. -be.recentsBreadcrumb = Recents -# Label for reload button. -be.reload = Reload -# Label for remove action. -be.remove = Remove -# Label for rename action. -be.rename = Rename -# Error text for rename dialog when name is already in use -be.renameDialogErrorInUse = An item with the same name already exists. -# Error text for rename dialog when name is invalid -be.renameDialogErrorInvalid = This name is invalid. -# Error text for rename dialog when name is too long -be.renameDialogErrorTooLong = This name is too long. -# Label for rename dialog -be.renameDialogLabel = Rename -# Text for rename dialog -be.renameDialogText = Please enter a new name for {name}: -# Label for resume action for a single file. -be.resume = Resume -# Label for resume action for multiple files. -be.resumeAll = Resume All -# Label for retry action. -be.retry = Retry -# Default label for root folder. -be.rootBreadcrumb = All Files -# Label for save action. -be.save = Save -# Shown as the title in the sub header while searching. -be.searchBreadcrumb = Search Results -# Aria label for the clear button in the search box. -be.searchClear = Clear search -# Shown as a placeholder in the search box. -be.searchPlaceholder = Search files and folders -# Default label for selected items list in the footer. -be.selected = {count} Selected -# Shown as the title in the sub header while showing selected items. -be.selectedBreadcrumb = Selected Items -# Label for share action. -be.share = Share -# Dropdown select option for collaborator share access. -be.shareAccessCollab = Access: People in this folder -# Dropdown select option for enterprise share access. -be.shareAccessCompany = People in this company -# Dropdown select option for no access. -be.shareAccessNone = No shared link -# Dropdown select option for open share access. -be.shareAccessOpen = Access: People with the link -# Dropdown select option to remove access. -be.shareAccessRemove = Remove shared link -# Label for shared link dialog -be.shareDialogLabel = Share -# Text for no shared link -be.shareDialogNone = None -# Text for share link dialog -be.shareDialogText = Shared Link: -# Title for the sidebar access stats. -be.sidebarAccessStats = Access Stats -# Title for the preview activity feed. -be.sidebarActivityTitle = Activity -# Generic Box AI content type opened used in welcome message and placeholder -be.sidebarBoxAIContent = content -# Label for button that triggers switch to Box AI Modal -be.sidebarBoxAISwitchToModalView = Switch to modal view -# Title for the preview Box AI feed. -be.sidebarBoxAITitle = Box AI -# Title for the sidebar content insights. -be.sidebarContentInsights = Content Insights -# Title for the preview details sidebar. -be.sidebarDetailsTitle = Details -# Title for the DocGen sidebar tab. -be.sidebarDocGenTitle = Doc Gen Tags -# Icon title for a Box file of type DocGen template -be.sidebarDocGenTooltip = Box Doc Gen -# Generic error content for file fetching. -be.sidebarFileFetchingErrorContent = An error has occurred while fetching your Box file. Please refresh the page and try again. -# Label for the hide sidebar button. -be.sidebarHide = Hide Sidebar -# Generic error content for metadata editing. -be.sidebarMetadataEditingErrorContent = An error has occurred while updating metadata. Please refresh the page and try again. -# Generic error content for metadata fetching. -be.sidebarMetadataFetchingErrorContent = An error has occurred while fetching metadata. Please refresh the page and try again. -# Title for the preview metadata. -be.sidebarMetadataTitle = Metadata -# Label for the sidebar tabs list -be.sidebarNavLabel = Sidebar -# Label for file properties section in the preview sidebar -be.sidebarProperties = File Properties -# Label for the show sidebar button. -be.sidebarShow = Show Sidebar -# Generic error content for skills editing. -be.sidebarSkillsErrorContent = An error has occurred while updating skills. Please refresh the page and try again. -# Generic error title for skills editing. -be.sidebarSkillsErrorTitle = Skills Error -# Title for the preview details skills. -be.sidebarSkillsTitle = Skills -# Label for the current version item in the version history list. -be.sidebarVersions.current = Current Version -# Label for the version delete action. -be.sidebarVersions.delete = Delete -# Error message for the version delete action. -be.sidebarVersions.deleteError = File version could not be deleted. -# Message displayed for a deleted version. {name} is the user who performed the action. -be.sidebarVersions.deletedBy = Deleted by {name} -# Tooltip message for actions disabled by retention policy. -be.sidebarVersions.disabledByRetention = Disabled by retention policy -# Label for the version download action. -be.sidebarVersions.download = Download -# Error message for the version download action. -be.sidebarVersions.downloadError = File version could not be downloaded. -# Message to display when no versions are available -be.sidebarVersions.empty = No prior versions are available for this file. -# Error message for the versions fetch call. -be.sidebarVersions.fetchError = File versions could not be retrieved. -# name of the File Request feature used to translate when a File Request is uploaded by the service -be.sidebarVersions.fileRequestDisplayName = File Request -# Error message with upsell for the versions fetch call for users who dont have the version feature. -be.sidebarVersions.notAvailable = Sorry, version history is not available with your current account plan. To access versioning, select from one of our paid plans. -# Label for the version preview action. -be.sidebarVersions.preview = Preview -# Header to display for group of versions created in the prior week -be.sidebarVersions.priorWeek = Last Week -# Label for the version promote action. -be.sidebarVersions.promote = Make Current -# Error message for the version promote action. -be.sidebarVersions.promoteError = File version could not be made current. -# Message displayed for a restored version. {name} is the user who performed the action. -be.sidebarVersions.promotedBy = Promoted from v{versionPromoted} by {name} -# Label for the version restore action. -be.sidebarVersions.restore = Restore -# Error message for the version restored action. -be.sidebarVersions.restoreError = File version could not be restored. -# Message displayed for a restored version. {name} is the user who performed the action. -be.sidebarVersions.restoredBy = Restored by {name} -# Heading for inline error messages displayed due to a remote server issue. -be.sidebarVersions.serverError = Server Error -# Header to display for group of versions created in the current month -be.sidebarVersions.thisMonth = This Month -# Title for the preview versions sidebar -be.sidebarVersions.title = Version History -# Header to display for group of versions created yesterday -be.sidebarVersions.today = Today -# Label for the version actions dropdown menu toggle button. -be.sidebarVersions.toggle = Toggle Actions Menu -# Text on the upgrade button shown when user does not have access to Version History -be.sidebarVersions.upgradeButton = Upgrade -# Text on the upgrade button shown when user does not have access to Version History -be.sidebarVersions.upgradeLink = Upgrade Now -# Message displayed for an uploaded version. {name} is the user who performed the action. -be.sidebarVersions.uploadedBy = Uploaded by {name} -# Text displayed if a version exceeds the user's maximum allowed version count -be.sidebarVersions.versionLimitExceeded = You are limited to the last {versionLimit, number} {versionLimit, plural, one {version} other {versions}}. -# Max supported entries for version history -be.sidebarVersions.versionMaxEntries = Version history is limited to the last {maxVersions} entries. -# Text to display in the version badge. -be.sidebarVersions.versionNumberBadge = V{versionNumber} -# Label given to the version badge for screen readers. -be.sidebarVersions.versionNumberLabel = Version number {versionNumber} -# Message describing when the version will be deleted due to an applied retention policy. -be.sidebarVersions.versionRetentionDelete = Will be deleted {time} by retention policy. -# Message describing that the version retention policy is indefinite and will not expire. -be.sidebarVersions.versionRetentionIndefinite = Retained indefinitely by retention policy. -# Message describing when the version retention policy will expire. -be.sidebarVersions.versionRetentionRemove = Retention policy expires on {time}. -# Upgrade message shown when user does not have access to Version History -be.sidebarVersions.versionUpsell = Sorry, version history is not available with your current account plan. To access versioning, select from one of our paid plans. -# Name displayed for unknown or deleted users. -be.sidebarVersions.versionUserUnknown = Unknown -# Header to display for group of versions created today -be.sidebarVersions.yesterday = Yesterday -# Size ascending option shown in the share access drop down select. -be.sizeASC = Size: Smallest → Largest -# Size descending option shown in the share access drop down select. -be.sizeDESC = Size: Largest → Smallest -# Error message when a skill processing failed -be.skillFileProcessingError = We’re sorry, something went wrong with processing the file. -# Error message when skill fails due to file extension -be.skillInvalidFileExtensionError = We’re sorry, no skills information was found. This file extension is currently not supported. -# Error message when skill fails due to file size -be.skillInvalidFileSizeError = We’re sorry, no skills information was found. This file size is currently not supported. -# Default message when skills are waiting to run -be.skillInvokedStatus = We’re preparing to process your file - please hold! -# Error message when a skill has no data -be.skillNoInfoFoundError = We’re sorry, no skills information was found. -# Default message when skills are still running -be.skillPendingStatus = We’re working on processing your file - please hold! -# Default error message when skills fail to run -be.skillUnknownError = Something went wrong with running this skill or fetching its data. -# Label for sort action -be.sort = Sort -# Label for status skill card in the preview sidebar -be.statusSkill = Status -# Generic success label. -be.success = Success -# Shown instead of todays date. -be.today = today -# Label for keywords/topics skill section in the preview sidebar -be.topicsSkill = Topics -# Message to the user for editing the transcript in the sidebar -be.transcriptEdit = Click any section to edit. -# Label for transcript skill section in the preview sidebar -be.transcriptSkill = Transcript -# Label for upload action. -be.upload = Upload -# Message shown for upload link for uploading more files when there are no items to upload -be.uploadEmptyFileInput = Browse your device -# Message shown for upload link for uploading more folders when there are no items to upload -be.uploadEmptyFolderInput = Select Folders -# Label for upload empty state. -be.uploadEmptyState = Empty state -# Message shown when there are no items to upload and folder upload is disabled -be.uploadEmptyWithFolderUploadDisabled = Drag and drop files -# Message shown when there are no items to upload and folder upload is enabled -be.uploadEmptyWithFolderUploadEnabled = Drag and drop files and folders -# Message shown when there is a network error when uploading -be.uploadError = A network error has occurred while trying to upload. -# Label for upload error state. -be.uploadErrorState = Error state -# Message shown when too many files are uploaded at once -be.uploadErrorTooManyFiles = You can only upload up to {fileLimit} file(s) at a time. -# Message shown when user drag and drops files onto uploads in progress -be.uploadInProgress = Drag and drop to add additional files -# Message shown on a device with no drag and drop support when there are no items to upload -be.uploadNoDragDrop = Select files from your device -# Message shown for letting user choose between {option1} and {option2} -be.uploadOptions = {option1} or {option2} -# Message shown when all files have been successfully uploaded -be.uploadSuccess = Success! Your files have been uploaded. -# Message shown for upload link for uploading more files after a successful upload -be.uploadSuccessFileInput = Select More Files -# Message shown for upload link for uploading more folders after a successful upload -be.uploadSuccessFolderInput = Select More Folders -# Label for upload success state. -be.uploadSuccessState = Success state -# Cancel upload button tooltip -be.uploadsCancelButtonTooltip = Cancel this upload -# Default error message shown when upload fails -be.uploadsDefaultErrorMessage = Something went wrong with the upload. Please try again. -# Error message shown when file size exceeds the limit -be.uploadsFileSizeLimitExceededErrorMessage = File size exceeds the folder owner’s file size limit -# Error message shown when file size exceeds the limit -be.uploadsFileSizeLimitExceededErrorMessageForUpgradeCta = This file exceeds your plan’s upload limit. Upgrade now to store larger files. -# Upgrade message shown when file size exceeds the limit -be.uploadsFileSizeLimitExceededUpgradeMessageForUpgradeCta = Upgrade -# Error message shown when attempting to upload a file which name already exists -be.uploadsItemNameInUseErrorMessage = A file with this name already exists. -# Text shown when uploads are completed -be.uploadsManagerUploadComplete = Completed -# Text shown when uploads failed -be.uploadsManagerUploadFailed = Some Uploads Failed -# Text shown when uploads are in progress -be.uploadsManagerUploadInProgress = Uploading -# Text shown to guide the user to drag drop file to upload -be.uploadsManagerUploadPrompt = Drop files on this page to upload them into this folder. -# Error message shown when one or more child folders failed to upload -be.uploadsOneOrMoreChildFoldersFailedToUploadMessage = One or more child folders failed to upload. -# Error message to display when a macOS package failed to upload -be.uploadsPackageUploadErrorMessage = Failed to upload package file. Please retry by saving as a single file. -# Error message shown when pending app folder size exceeds the limit -be.uploadsPendingFolderSizeLimitErrorMessage = Pending app folder size limit exceeded -# Error message shown when pending folder upload contains invalid characters -be.uploadsProvidedFolderNameInvalidMessage = Provided folder name, {name}, could not be used to create a folder. -# Retry upload button tooltip -be.uploadsRetryButtonTooltip = Retry upload -# Error message shown when account storage limit has been reached -be.uploadsStorageLimitErrorMessage = Account storage limit reached -# Message displayed in the activity feed for a deleted version. {name} is the user who performed the action. {version_number} is the file version string. -be.versionDeleted = {name} deleted v{version_number} -# Message displayed in the activity feed to represent the range of versions restored by multiple users. {numberOfCollaborators} is a number. {versions} is a range of versions. -be.versionMultipleUsersRestored = {numberOfCollaborators} collaborators restored v{versions} -# Message displayed in the activity feed to represent the range of versions trashed by multiple users. {numberOfCollaborators} is a number. {versions} is a range of versions. -be.versionMultipleUsersTrashed = {numberOfCollaborators} collaborators deleted v{versions} -# Message displayed in the activity feed to represent the range of versions uploaded by multiple users. {numberOfCollaborators} is a number and {versions} is a range of versions. -be.versionMultipleUsersUploaded = {numberOfCollaborators} collaborators uploaded v{versions} -# Message displayed in the activity feed for a promoted version. {name} is the user who performed the action. {version_promoted} is the originating file version string. {version_number} is the file version string. -be.versionPromoted = {name} promoted v{version_promoted} to v{version_number} -# Message displayed in the activity feed to represent the range of versions restored by a single user. {name} is the user who restored. {versions} is a range of versions. -be.versionRestoreCollapsed = {name} restored v{versions} -# Message displayed in the activity feed for a restored version. {name} is the user who performed the action. {version_number} is the file version string. -be.versionRestored = {name} restored v{version_number} -# Message displayed in the activity feed to represent the range of versions deleted by a single user. {name} is the user who deleted. {versions} is a range of versions. -be.versionTrashCollapsed = {name} deleted v{versions} -# Message displayed in the activity feed to represent the range of versions uploaded by a single user. {name} is the user who uploaded. {versions} is a range of versions. -be.versionUploadCollapsed = {name} uploaded v{versions} -# Message displayed in the activity feed for a newly uploaded version. {name} is the user who performed the action. {version_number} is the file version string. -be.versionUploaded = {name} uploaded v{version_number} -# Shown instead of yesterdays date. -be.yesterday = yesterday -# The label for the comments category of access stats -boxui.accessStats.accessStatsComments = Comments -# The label for the downloads category of access stats -boxui.accessStats.accessStatsDownloads = Downloads -# The label for the edit category of access stats -boxui.accessStats.accessStatsEdits = Edits -# The label for the preview category of access stats -boxui.accessStats.accessStatsPreviews = Previews -# The text in the link in the sidebar to open up the access stats popup -boxui.accessStats.accessStatsViewDetails = View Details -# The label for the view category of access stats for box notes -boxui.accessStats.accessStatsViews = Views -# Description text about advanced content insights. -boxui.advancedContentInsights.advancedContentInsightsDescription = Get actionable insights into how viewers are engaging with this content. Measure average time spent, page-by-page engagement, per person and per visit details. -# Advanced Content Insights toggle title -boxui.advancedContentInsights.advancedContentInsightsTitleDisabled = Activate Engagement Insights -# Advanced Content Insights toggle title -boxui.advancedContentInsights.advancedContentInsightsTitleEnabled = Engagement Insights is activated -# Text for an icon aria label to convey an external user of the enterprise -boxui.avatar.externalUser = External user -# Text for the beta badge -boxui.badges.beta = BETA -# Text for the trial badge -boxui.badges.trial = TRIAL -# Text for the upgrade badge -boxui.badges.upgrade = UPGRADE -# Next month button for a date picker calendar -boxui.base.nextMonth = Next Month -# Previous month button for a date picker calendar -boxui.base.previousMonth = Previous Month -# Aria label for describing "breadcrumb" -boxui.breadcrumb.breadcrumbLabel = Breadcrumb -# Button label for the "more" dropdown menu -boxui.categorySelector.label.more = More # Icon to display more information on the checkbox boxui.checkboxTooltip.iconInfoText = Info -# Button to add classification on an item -boxui.classification.add = Add -# Title of the card that shows the reason why the AI classification was applied when no date is available. -boxui.classification.appliedByBoxAi = Box AI -# Title of the card that shows the reason why the AI classification was applied on a specific date. -boxui.classification.appliedByBoxAiOnDate = Box AI on {modifiedAt} -# Details stating which user or service applied the classification and on what date. -boxui.classification.appliedByDetails = {appliedBy} on {appliedAt} -# The title text for classification applied details -boxui.classification.appliedByTitle = Applied By -# Header for classification section in sidebar -boxui.classification.classification = Classification -# Classification label color name as dark blue -boxui.classification.classificationDarkBlue = Dark Blue -# Classification label color name as green -boxui.classification.classificationGreen = Green -# Classification label color name as grey -boxui.classification.classificationGrey = Grey -# Classification label color name as light blue -boxui.classification.classificationLightBlue = Light Blue -# Classification label color name as orange -boxui.classification.classificationOrange = Orange -# Classification label color name as purple -boxui.classification.classificationPurple = Purple -# Classification label color name as red -boxui.classification.classificationRed = Red -# Classification label color name as yellow -boxui.classification.classificationYellow = Yellow -# Header displayed above the classification definition -boxui.classification.definition = Definition -# Button to edit classification on an item -boxui.classification.edit = Edit -# Sentence stating which user or service imported a classification and on what date. -boxui.classification.importedBy = Imported from {modifiedBy} on {modifiedAt} -# Default message for classification in the sidebar when there is none -boxui.classification.missing = Not classified -# Sentence stating which user or service modified a classification and on what date. -boxui.classification.modifiedBy = Applied by {modifiedBy} on {modifiedAt} -# Label displayed above details about when a classification was last modified. -boxui.classification.modifiedByLabel = Classification Label -# Text to display for users who have not accepted an invitation to collaborate yet -boxui.collaboratorAvatars.collaboration.pendingCollabText = Pending -# Label for collaborator avatars -boxui.collaboratorAvatars.collaboratorAvatarsLabel = Shared with -# Tooltip text for collaborator expiration badge -boxui.collaboratorAvatars.collaborators.expirationTooltipText = Access expires on {date} -# This tooltip indicates that a collaborator is not in the same enterprise of the current user -boxui.collaboratorAvatars.collaborators.externalCollabTooltipText = {email} is from outside of your company -# Manage all link text on collaborator list -boxui.collaboratorAvatars.manageAllLinkText = Manage All -# Text to display in collaborator list if there are more items -boxui.collaboratorAvatars.viewAdditionalPeopleText = View additional people -# Aria label for toggle button that expands/collapses sidebar (expanded state) -boxui.collapsiblesidebar.collapseBtnLabel = Collapse -# Aria label for toggle button that expands/collapses sidebar (collapsed state) -boxui.collapsiblesidebar.expandBtnLabel = Expand -# Content Answers feature name shown on menu item and modal title -boxui.contentAnswers.contentAnswersTitle = Box AI -# Default tooltip message for Content Answers entry point button -boxui.contentAnswers.defaultTooltip = Get instant answers about this document using Box AI -# Disabled tooltip message for Content Answers entry point button when the file type is not supported -boxui.contentAnswers.disabledTooltipFileNotCompatible = Box AI is not currently supported for this file type -# Text inside the chip for the first suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionLabel1 = Summarize this document -# Text inside the chip for the second suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionLabel2 = What are the key takeaways? -# Text inside the chip for the third suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionLabel3 = How can this document be improved? -# Text inside the chip for the fourth suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionLabel4 = Are there any next steps defined? -# Actual prompt for the first suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionPrompt1 = Summarize this document -# Actual prompt for the second suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionPrompt2 = What are the key takeaways? -# Actual prompt for the third suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionPrompt3 = How can this document be improved? -# Actual prompt for the fourth suggested question for documents -boxui.contentAnswers.documentSuggestedQuestionPrompt4 = Are there any next steps defined? -# Existing questions tooltip message for Content Answers entry point button -boxui.contentAnswers.hasQuestionsTooltip = Return to Box AI -# Content Answers welcome message spreadsheet supported by Intelligent Query notification -boxui.contentAnswers.welcomeMessageIntelligentQueryNotice = You can ask Box AI both simple and complex questions in your spreadsheet: total counts, averages, advanced comparisons, trend analyses and so on. Try it out today! -# Content Answers welcome message spreadsheet notification -boxui.contentAnswers.welcomeMessageSpreadsheetNotice = Spreadsheet support works best for text dense files -# Aria label for the icon inside spreadsheet notification -boxui.contentAnswers.welcomeMessageSpreadsheetNoticeAriaLabel = spreadsheet support notification banner -# Aria label for the folder breadcrumb -boxui.contentExplorer.breadcrumb = Breadcrumb -# Text shown on button used to close the content explorer -boxui.contentExplorer.cancel = Cancel -# Text shown on button used to choose an item -boxui.contentExplorer.choose = Choose -# Aria label for button to navigate back to the previous folder -boxui.contentExplorer.clickToGoBack = Click to go back -# Aria label for folder tree button to navigate back to previous folders -boxui.contentExplorer.clickToViewPath = Click to view path -# Text shown on button used to copy an item to a different folder -boxui.contentExplorer.copy = Copy -# Text shown in the list when the folder being viewed is empty -boxui.contentExplorer.emptyFolder = There are no subfolders in this folder. -# Text shown in the list when there are no search results -boxui.contentExplorer.emptySearch = Sorry, we couldn't find what you're looking for. -# Tooltip message for the folder tree breadcrumb button -boxui.contentExplorer.filepath = File path -# Text shown for the current folder and its number of items next to the folder tree breadcrumbs -boxui.contentExplorer.folderTreeBreadcrumbsText = {folderName} ({totalItems}) -# Label text shown next to the Include Subfolders toggle -boxui.contentExplorer.includeSubfolders = Include Subfolders -# Aria label for the info icon -boxui.contentExplorer.infoNoticeIconAriaLabel = Info icon -# Text shown on button used to move an item to a different folder -boxui.contentExplorer.move = Move -# Text shown as the header for a column of item names in the list -boxui.contentExplorer.name = Name -# Text shown on button used to create a new folder -boxui.contentExplorer.newFolder = New Folder -# Text shown to indicate the number of folders selected -boxui.contentExplorer.numFoldersSelected = {numSelected, plural, =0 {0 folders selected} one {1 folder selected} other {# folders selected} } -# Text shown to indicate the number of items selected with Include Subfolders feature -boxui.contentExplorer.numItemsSelected = {numSelected, plural, =0 {0 items selected} one {1 item selected} other {# items selected} } -# Text shown to indicate the number of items selected -boxui.contentExplorer.numSelected = {numSelected} Selected -# Results label for number of items on list when it's just 1 -boxui.contentExplorer.result = {itemsCount} result -# Results label for number of items on list -boxui.contentExplorer.results = {itemsCount} results -# Placeholder text shown in the search input -boxui.contentExplorer.searchPlaceholder = Search -# Text shown in the breadcrumbs when showing search results -boxui.contentExplorer.searchResults = Search Results -# Select All label for select all items check box -boxui.contentExplorer.selectAll = Select All -# Label for radio input to select an item from the item list, {name} is the item name -boxui.contentExplorer.selectItem = Select {name} -# Text shown when hovering over a disabled new folder button because the user lacks permissions to create a folder -boxui.contentexplorer.newFolder.forbidden = You do not have permission to create a folder here. -# Cancel button text -boxui.core.cancel = Cancel -# Close button text -boxui.core.close = Close -# Copy button text after user clicks on it -boxui.core.copied = Copied -# Copy button text -boxui.core.copy = Copy -# Done button text -boxui.core.done = Done -# Displays the navigation step index to the user of where they are in the guide. e.g. 1 of 4 -boxui.core.guidetooltip.navigation = {currentStepIndex} of {totalNumSteps} -# Label for "Alt" key -boxui.core.hotkeys.altKey = Alt -# Label for "Control" key -boxui.core.hotkeys.ctrlKey = Ctrl -# Label for "Enter" key -boxui.core.hotkeys.enterKey = Enter -# Label for "Esc" key -boxui.core.hotkeys.escKey = Esc -# Title for keyboard shortcut help modal -boxui.core.hotkeys.hotkeyModalTitle = Keyboard Shortcuts -# Describes a hotkey sequence, e.g. "shift+g then shift+a". {key1} is the first key ("shift+g" in our example) and {key2} is the second ("shift+a" in our example). -boxui.core.hotkeys.hotkeySequence = {key1} then {key2} -# Label for "Shift" key -boxui.core.hotkeys.shiftKey = Shift -# Label for "Spacebar" key -boxui.core.hotkeys.spacebarKey = Spacebar -# Okay button text -boxui.core.okay = Okay -# Optional text for labels -boxui.core.optional = optional -# Save button text -boxui.core.save = Save -# Description for keyboard shortcut to deselect all items in the file list -boxui.core.selection.deselectAllDescription = Deselect all items -# Description for keyboard shortcut to select next item in the file list -boxui.core.selection.downDescription = Select next item -# Description for keyboard shortcut to select all items in the file list -boxui.core.selection.selectAllDescription = Select all items -# Description for keyboard shortcut to add next item to current selection in the file list -boxui.core.selection.shiftDownDescription = Add next item to current selection -# Description for keyboard shortcut to add previous item to current selection in the file list -boxui.core.selection.shiftUpDescription = Add previous item to current selection -# Description for keyboard shortcut to select previous item in the file list -boxui.core.selection.shiftXDescription = Select current item -# Description for keyboard shortcut to select previous item in the file list -boxui.core.selection.upDescription = Select previous item -# Send button text -boxui.core.send = Send -# Button for opening date picker -boxui.datePicker.chooseDate = Choose Date -# Button for clearing date picker -boxui.datePicker.dateClearButton = Clear Date -# Error message when date is later than the maximum date -boxui.datePicker.dateInputMaxError = Please enter a date before {maxLocaleDate} -# Error message when date is earlier than the minimum date -boxui.datePicker.dateInputMinError = Please enter a date after {minLocaleDate} -# Error message when date is out of the minimum and maximum range -boxui.datePicker.dateInputRangeError = Please enter a date between {minLocaleDate} and {maxLocaleDate} -# Date entered is invalid -boxui.datePicker.iconAlertText = Invalid Date -# Label for comment timestamp in the comment form -boxui.draftjs.mentionSelector.commentTimestampLabel = Comment Timestamp -# Message for screenReader users when trying to tag a user but there are no matches -boxui.draftjs.mentionSelector.noUsersFound = No users found -# Message to display when a user triggers a mention -boxui.draftjs.mentionSelector.startMention = Mention someone to notify them -# Message for screenReader users when a certain number of users is being tagged -boxui.draftjs.mentionSelector.usersFound = {usersCount, plural, one {one user found} other {{usersCount} users found}} -# Icon showing a sad Box cloud -boxui.errorMask.iconSadCloudText = Sad Box Cloud -# Text to show when root folder is external -boxui.features.VirtualizedTableRenderers.allFiles = All Files -# The user is an anonymous user -boxui.features.VirtualizedTableRenderers.anonymousUser = Anonymous User -# Text to show when a file is external -boxui.features.VirtualizedTableRenderers.externalFile = External File -# Text to show when a folder is external -boxui.features.VirtualizedTableRenderers.externalFolder = External Folder -# Text to show on "modified by" table cell. Note that "lastModified" will contain additional localized text. Example: 2 days ago by John Smith -boxui.features.VirtualizedTableRenderers.lastModifiedBy = {lastModified} by {user} -# The user is unknown in the database. -boxui.features.VirtualizedTableRenderers.unknownUser = Unknown User -# Label for archivization date under item properties in the sidebar -boxui.itemDetails.archived = Archived -# Warning message in the sidebar that this bookmark will be automatically deleted on a certain date, {expiration} is the date -boxui.itemDetails.bookmarkExpiration = This bookmark will be deleted on {expiration}. -# Label for created date under item properties in the sidebar -boxui.itemDetails.created = Created -# Label for deletion date under item properties in the sidebar -boxui.itemDetails.deleted = Deleted -# Label for description under item properties in the sidebar -boxui.itemDetails.description = Description -# Placeholder for textarea to enter a description under item properties in the sidebar -boxui.itemDetails.descriptionPlaceholder = Enter a description -# Label for name of enterprise owner under item properties in the sidebar -boxui.itemDetails.enterpriseOwner = Enterprise Owner -# Warning message in the sidebar that this file will be automatically deleted on a certain date, {expiration} is the date -boxui.itemDetails.fileExpiration = This file will be deleted on {expiration}. -# Label for files count under item properties in the sidebar -boxui.itemDetails.filesCountLabel = {filesCount, plural, one {# File} other {# Files}} -# Warning message in the sidebar that this folder will be automatically deleted on a certain date, {expiration} is the date -boxui.itemDetails.folderExpiration = This folder will be deleted on {expiration}. -# Label for modified date under item properties in the sidebar -boxui.itemDetails.modified = Modified -# Label for name of owner under item properties in the sidebar -boxui.itemDetails.owner = Owner -# Label for description of the retention policy under item properties in the sidebar -boxui.itemDetails.retentionPolicyDescription = Policy -# Label for the expiration date of the retention policy under item properties in the sidebar -boxui.itemDetails.retentionPolicyExpiration = Policy Expiration -# Button to extend the expiration date of the retention policy under item properties in the sidebar -boxui.itemDetails.retentionPolicyExtend = Extend -# Text for button in the sidebar to open the version history popup, {versionCount} is the number of saved file versions -boxui.itemDetails.savedVersions = {versionCount, number} Saved Versions -# Warning message in the sidebar that this shared link will expire on a certain date, {expiration} is the date -boxui.itemDetails.sharedLinkExpiration = This shared link will be disabled on {expiration}. -# Label for human-readable filesize under item properties in the sidebar -boxui.itemDetails.size = Size -# Label for name of uploader under item properties in the sidebar -boxui.itemDetails.uploader = Uploader -# Label for a weblink url under item properties in the sidebar -boxui.itemDetails.url = URL -# Placeholder for a weblink url text area in the right sidebar -boxui.itemDetails.urlPlaceholder = Enter a valid url -# Label for comment options menu -boxui.media.menuButtonArialLabel = Options -# Description for AI autofill toggle switch -boxui.metadataInstanceEditor.aiAutofillDescription = Use Box AI to automatically extract metadata values. -# Learn more link for AI autofill -boxui.metadataInstanceEditor.aiAutofillLearnMore = Learn more -# Informational text below collapsible header indicating that all fields for this template are hidden -boxui.metadataInstanceEditor.allAttributesAreHidden = All attributes in this template have been hidden. -# Informational text below enable cascade policy toggle switch -boxui.metadataInstanceEditor.applyCascadePolicyText = Apply template and its values to all new and existing items in this folder and its subfolders. -# Informational text below enable cascade policy toggle switch indicating that cascade policy cannot be applied -boxui.metadataInstanceEditor.cannotApplyCascadePolicyText = Cascade policy cannot be applied to custom metadata at this time. -# Tooltip text a user can use to learn more about cascading metadata policy -boxui.metadataInstanceEditor.cascadePolicyLearnMore = Learn more -# Tooltip text that asks the user what they want to do when applying cascading to their metadata policy -boxui.metadataInstanceEditor.cascadePolicyModeQuestion = In the case of conflicts when applying this template and its values to existing items, what would you like to do? This is a one time action. -# Notice that explains that the cascade policy cannot be edited -boxui.metadataInstanceEditor.cascadePolicyOptionsDisabledNotice = This cascade policy cannot be edited. To modify it, deactivate the current policy and then re-enable it to set up a new one. -# Aria label for the disabled cascade options information icon -boxui.metadataInstanceEditor.cascadePolicyOptionsDisabledNoticeIconAriaLabel = Disabled cascade options information -# Label for radio button that selects overwrite mode for cascading policy -boxui.metadataInstanceEditor.cascadePolicyOverwriteMode = Overwrite all existing template values -# Label for radio button that selects skip mode for cascading policy -boxui.metadataInstanceEditor.cascadePolicySkipMode = Skip and keep all existing template values -# Label for the add button for custom metadata -boxui.metadataInstanceEditor.customAdd = Add -# Error enforcing unique key for custom metadata -boxui.metadataInstanceEditor.customErrorDuplicateKey = A field with that key already exists. -# Error enforcing non internal key for custom metadata -boxui.metadataInstanceEditor.customErrorInternalKey = Keys cannot begin with a $. -# Error enforcing required key for custom metadata -boxui.metadataInstanceEditor.customErrorRequired = A key is required. -# Label for the key field for custom metadata -boxui.metadataInstanceEditor.customKey = Key -# Placeholder for the key field for custom metadata -boxui.metadataInstanceEditor.customKeyPlaceholder = e.g. Order Number -# Title for the new field section for custom metadata -boxui.metadataInstanceEditor.customNewField = New Field -# Description for the new field section for custom metadata -boxui.metadataInstanceEditor.customNewFieldMessage = Add a custom metadata field. Other people will be able to see and search for this field. -# Label for the remove button for custom metadata -boxui.metadataInstanceEditor.customRemove = Remove -# title of the custom metadata card -boxui.metadataInstanceEditor.customTitle = Custom Metadata -# Label for the value field for custom metadata -boxui.metadataInstanceEditor.customValue = Value -# Placeholder for the value field for custom metadata -boxui.metadataInstanceEditor.customValuePlaceholder = e.g. 42 -# Text that shows in a tooltip above the edit pencil button. -boxui.metadataInstanceEditor.editTooltip = Edit Metadata -# Label for enable AI autofill toggle switch -boxui.metadataInstanceEditor.enableAIAutofill = Box AI Autofill -# Label for enable cascade policy toggle switch -boxui.metadataInstanceEditor.enableCascadePolicy = Enable Cascade Policy -# Name of the enhanced AI agent -boxui.metadataInstanceEditor.enhancedAgentName = Enhanced -# Message for users who may attempt to remove a custom metadata instance for a file. Also non-recoverable -boxui.metadataInstanceEditor.fileMetadataRemoveCustomTemplateConfirm = Are you sure you want to delete this custom metadata and all of its values from this file? -# Message for users who may attempt to remove a metadata instance for a file, which is non-recoverable -boxui.metadataInstanceEditor.fileMetadataRemoveTemplateConfirm = Are you sure you want to delete "{metadataName}" and all of its values from this file? -# Message for users who may attempt to remove a custom metadata instance for a folder. Also non-recoverable -boxui.metadataInstanceEditor.folderMetadataRemoveCustomTemplateConfirm = Are you sure you want to delete this custom metadata and all of its values? Any metadata template values already applied to files in this folder will not be deleted. -# Message for users who may attempt to remove a metadata instance for a folder, which is non-recoverable -boxui.metadataInstanceEditor.folderMetadataRemoveTemplateConfirm = Are you sure you want to delete "{metadataName}" and all of its values? Any metadata template values already applied to files in this folder will not be deleted. -# Error message displayed if the user enters a badly formatted value in metadata text box -boxui.metadataInstanceEditor.invalidValue = Invalid Input! -# Label for cancel button -boxui.metadataInstanceEditor.metadataCancel = Cancel -# Informational text shown in metadata modal when cascading is turned on for current folder -boxui.metadataInstanceEditor.metadataCascadePolicyEnabledInfo = This template and its values are being cascaded to all items in this folder and its subfolders. -# Label for save button -boxui.metadataInstanceEditor.metadataSave = Save -# Informational text below collapsible header indicating that there are no attributes for this template -boxui.metadataInstanceEditor.noAttributesForTemplate = There are no attributes in this template. -# Text to display when no metadata is applied to folder -boxui.metadataInstanceEditor.noMetadata = No Metadata Applied -# Instructions to create metadata for the selected folder -boxui.metadataInstanceEditor.noMetadataAddTemplate = Click 'Add' in the top right to add metadata to this item -# Informational text below cascade policy description and explains to the user that the policy will take some time to take effect. -boxui.metadataInstanceEditor.operationNotImmediate = This operation is not immediate and may take some time. -# Label to remove a template -boxui.metadataInstanceEditor.removeTemplate = Remove -# Name of the standard AI agent -boxui.metadataInstanceEditor.standardAgentName = Standard -# Label to add a template -boxui.metadataInstanceEditor.templateAdd = Add -# Placeholder to search for all templates -boxui.metadataInstanceEditor.templateSearchPlaceholder = Search all templates -# Text to indicate that we failed to fetch templates -boxui.metadataInstanceEditor.templatesFetchFailed = Sorry! We could not fetch templates. Please contact your administrator -# Text to indicate that all the templates have been added -boxui.metadataInstanceEditor.templatesNoRemainingTemplates = All templates have been added -# Text to indicate no templates found by searching -boxui.metadataInstanceEditor.templatesNoResults = No Results -# Text to indicate that the server has no templates -boxui.metadataInstanceEditor.templatesServerHasNoTemplates = Zero templates -# Overall title of metadata -boxui.metadataInstanceEditor.templatesTitle = Templates -# Label for the add button for custom metadata -boxui.metadataInstanceFields.customAdd = Add -# Label for the remove button for custom metadata -boxui.metadataInstanceFields.customRemove = Remove -# Text to indicate to select one or more values from dropdown list -boxui.metadataInstanceFields.fieldMultiSelectValue = Select Values -# Text to indicate no value exists -boxui.metadataInstanceFields.fieldNoValue = No Value -# Text to indicate to select a value from drop down list -boxui.metadataInstanceFields.fieldSelectValue = Select Value -# Text to indicate to set a date -boxui.metadataInstanceFields.fieldSetDate = Set Date -# Text to indicate to set a value -boxui.metadataInstanceFields.fieldSetValue = Set Value -# Error message displayed if the template has an field type we don't recognize -boxui.metadataInstanceFields.invalidMetadataFieldType = Invalid metadata field type! -# Button to get back inside modal -boxui.modalDialog.backModalText = Back -# Button to close modal -boxui.modalDialog.closeModalText = Close Modal -# Text shown on button to close the modal used to create a new folder -boxui.newFolderModal.cancel = Cancel -# Text shown on button to create a new folder -boxui.newFolderModal.create = Create -# Label text shown on top of the folder name input when creating a new folder -boxui.newFolderModal.folderName.label = Folder Name -# Placeholder text shown in the folder name input when creating a new folder -boxui.newFolderModal.folderName.placeholder = My New Folder -# Title shown in the modal used to create a new folder. "parentFolderName" should not be translated -boxui.newFolderModal.title = Create a New Folder in "{parentFolderName}" -# Button to clear notification -boxui.notification.clearNotification = Clear Notification -# Description for when someone last viewed a document less than a minute ago -boxui.presence.accessedInTheLastMinute = Viewed less than a minute ago -# Description for someone who is currently viewing or editing a document -boxui.presence.activeNow = Active now -# Description for when someone last commented on a document less than a minute ago -boxui.presence.commentedIntheLastMinute = Commented less than a minute ago -# Text on button to get shared link for the item -boxui.presence.getLinkButton = Get Link -# Text on button to invite collaborators to this item -boxui.presence.inviteButton = Invite People -# Description for when someone last edited a document less than a minute ago -boxui.presence.modifiedIntheLastMinute = Edited less than a minute ago -# Text for link at footer of the Recent Activity panel -boxui.presence.previewPresenceFlyoutAccessStatsLink = See all activity -# Text on button embedded within tooltip that is visible on page load -boxui.presence.previewPresenceFlyoutActivityCTA = View Recent Activity -# Tooltip text visible on page load, to prompt the user to press a button to view activity -boxui.presence.previewPresenceFlyoutCopy = Quickly see who has commented on, edited, or viewed this file. -# Description for when someone last previewed a document less than a minute ago -boxui.presence.previewedIntheLastMinute = Previewed less than a minute ago -# Header on presence dropdown list that represents recent activity on the item -boxui.presence.recentActivity = Recent Activity -# Description for when someone last viewed a document, {timeAgo} is a relative time like 2 months ago -boxui.presence.timeSinceLastAccessed = Viewed {timeAgo} -# Description for when someone last commented on a document, {timeAgo} is a relative time like 2 months ago -boxui.presence.timeSinceLastCommented = Commented {timeAgo} -# Description for when someone last edited a document, {timeAgo} is a relative time like 2 months ago -boxui.presence.timeSinceLastModified = Edited {timeAgo} -# Description for when someone last previewed a document, {timeAgo} is a relative time like 2 months ago -boxui.presence.timeSinceLastPreviewed = Previewed {timeAgo} -# Description of the button to toggle the presence overlay with recent activity -boxui.presence.toggleButtonLabel = Recent Activity -# Text on the add filter button, on click generates another filter row -boxui.queryBar.addFilterButtonText = + Add Filter -# Text on the apply filter button, on click applies the filters -boxui.queryBar.applyFiltersButtonText = Apply -# Text on the columns button, on click opens a menu which allows users to choose which columns to render -boxui.queryBar.columnsButtonText = Columns -# Text on the columns button, if one or more columns have been hidden then it will display this text -boxui.queryBar.columnsHiddenButtonText = {count, plural, one {1 Column Hidden} other {{count} Columns Hidden}} -# Text on the connector dropdown, on click should open a dropdown showing either AND or OR -boxui.queryBar.connectorAndText = AND -# Text on the connector dropdown, on click should open a dropdown showing either AND or OR -boxui.queryBar.connectorOrText = OR -# Text on the label, the first condition will show WHERE -boxui.queryBar.connectorWhereText = WHERE -# Text on the filters button, on click opens a menu which allows users to filter through the files -boxui.queryBar.filtersButtonText = Modify Filters -# Header text shown in template dropdown -boxui.queryBar.metadataViewTemplateListHeaderTitle = METADATA TEMPLATES -# Text on the filters button, will display a number in front of the filters text indicating how many filters are applied -boxui.queryBar.multipleFiltersButtonText = {number} Filters -# Text on the filters dropdown that is displayed when no filters have been inserted -boxui.queryBar.noFiltersAppliedText = No Filters Applied -# Text on the templates button when templates have been loaded and there are no templates in the enterprise -boxui.queryBar.noTemplatesText = No Templates Available -# Placeholder text on the value button, on click should open a dropdown -boxui.queryBar.selectValuePlaceholderText = Select value -# Text on the templates button, on click opens a menu which allows users to select a metadata templates -boxui.queryBar.templatesButtonText = Select Metadata -# Text on the templates button when templates are still being loaded -boxui.queryBar.templatesLoadingButtonText = Template Name -# Text displayed on the Tooltip for an input field -boxui.queryBar.tooltipEnterValueError = Please Enter a Value -# Text displayed on the Tooltip for an input field of type float -boxui.queryBar.tooltipInvalidFloatError = Please Enter a Decimal Number -# Text displayed on the Tooltip for an input field of type number -boxui.queryBar.tooltipInvalidNumberError = Please Enter an Integer -# Text displayed on the Tooltip for a date field -boxui.queryBar.tooltipSelectDateError = Please Select a Date -# Text displayed on the Tooltip for a value field -boxui.queryBar.tooltipSelectValueError = Please Select a Value -# Icon title for a Box item of type bookmark or web-link -boxui.quickSearch.bookmark = Bookmark -# Icon title for a Box item of type folder that has collaborators -boxui.quickSearch.collaboratedFolder = Collaborated Folder -# Icon title for a Box item of type folder that has collaborators outside of the user's enterprise -boxui.quickSearch.externalFolder = External Folder -# Icon title for a Box item of type file -boxui.quickSearch.file = File -# Title for a parent folder icon next to the name of the parent folder for a quick search result item -boxui.quickSearch.parentFolder = Parent Folder -# Icon title for a Box item of type folder that is private and has no collaborators -boxui.quickSearch.personalFolder = Personal Folder -# Text for a quick search result describing the date when the user last updated the item -boxui.quickSearch.updatedText = {date, date, medium} by {user} -# Statement describing when and who last updated a quick search result item, capitalize if appropriate -boxui.quickSearch.updatedTextToday = Today by {user} -# Statement describing when and who last updated a quick search result item, capitalize if appropriate -boxui.quickSearch.updatedTextYesterday = Yesterday by {user} -# The time that an event occurred -boxui.readableTime.eventTime = {time, date, medium} -# The time that an event occurred at a given date with the year included -boxui.readableTime.eventTimeDate = {time, date, medium} at {time, time, short} -# The time that an event occurred at a given date without the year included -boxui.readableTime.eventTimeDateShort = {date} at {time, time, short} -# The time that an event occurred today -boxui.readableTime.eventTimeToday = Today at {time, time, short} -# The time that an event occurred at a given date with the weekday included -boxui.readableTime.eventTimeWeekdayLong = {weekday}, {time, date, medium} -# The time that an event occurred yesterday -boxui.readableTime.eventTimeYesterday = Yesterday at {time, time, short} -# Title for a clear button -boxui.searchForm.clearButtonTitle = Clear -# Title for a search button -boxui.searchForm.searchButtonTitle = Search -# Label for a search input -boxui.searchForm.searchLabel = Search query -# Instructional message displayed on the embed widget security drag-drop game for screen readers -boxui.securityCloudGame.accessibilityInstructions = For security purposes, please drag the cloud object onto the target. You are on a {row} by {column} grid with a movable cloud object and a target area. Press spacebar to grab the cloud object, arrow keys to move, and spacebar to drop on the target. -# Message for the screen reader to tell when user drop the cloud. -boxui.securityCloudGame.cloudDropped = Cloud object dropped. -# Message for the screen reader to tell when user grab the cloud. -boxui.securityCloudGame.cloudGrabbed = Cloud object grabbed. -# White cloud title. -boxui.securityCloudGame.cloudObject = Cloud object -# Message for the screen reader to tell the current position of the cloud. -boxui.securityCloudGame.currentPosition = Current position: Row {row}, Column {column}. -# Instructional message displayed on the embed widget security drag-drop game -boxui.securityCloudGame.instructions = For security purposes, please drag the white cloud onto the dark cloud. Keyboard users: Press spacebar to grab the cloud, arrow keys to move, and spacebar to drop. -# Message for the screen reader to tell when the cloud hits the bottom edge of game board. -boxui.securityCloudGame.reachBottomEdge = Reached bottom edge of grid. -# Message for the screen reader to tell when the cloud hits the left edge of game board. -boxui.securityCloudGame.reachLeftEdge = Reached left edge of grid. -# Message for the screen reader to tell when the cloud hits the right edge of game board. -boxui.securityCloudGame.reachRightEdge = Reached right edge of grid. -# Message for the screen reader to tell when the cloud hits the top edge of game board. -boxui.securityCloudGame.reachTopEdge = Reached top edge of grid. -# Success message shown when a user successfully drags the cloud into position. -boxui.securityCloudGame.success = Success! -# Target dark cloud title. -boxui.securityCloudGame.target = Target -# Message for the screen reader to tell when the white cloud overlaps with the target cloud. -boxui.securityCloudGame.targetInRange = Target in range, you can drop the cloud object. -# Message for the screen reader to tell the position of the target. -boxui.securityCloudGame.targetPosition = Target position: Row {row}, Column {column}. -# Name list of all applications download restriction applied to classification -boxui.securityControls.allAppNames = All applications: {appsList} -# Name list of all integrations download restriction applied to classification -boxui.securityControls.allIntegrationNames = All integrations: {appsList} -# Bullet point that summarizes application download restriction applied to classification -boxui.securityControls.appDownloadBlacklist = Download restricted for some applications: {appNames} -# Bullet point that summarizes application download restriction applied to classification. This variation is used when the list of applications is longer than the configured threshold -boxui.securityControls.appDownloadBlacklistOverflow = Download restricted for some applications: {appNames} +{remainingAppCount} more -# Bullet point that summarizes application download restriction applied to classification -boxui.securityControls.appDownloadRestricted = Download restricted for some applications. -# Bullet point that summarizes application download restriction applied to classification -boxui.securityControls.appDownloadWhitelist = Only select applications are allowed: {appNames} -# Bullet point that summarizes application download restriction applied to classification. This variation is used when the list of applications is longer than the configured threshold -boxui.securityControls.appDownloadWhitelistOverflow = Only select applications are allowed: {appNames} +{remainingAppCount} more -# Bullet point that summarizes Box Sign request restrictions applied to items. Box Sign is a product name -boxui.securityControls.boxSignRequestRestricted = Sign restrictions apply. -# Bullet point that summarizes desktop download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners. Box Drive is a product name and not translated -boxui.securityControls.desktopDownloadExternalOwners = Download restricted on Box Drive, except Owners/Co-Owners. Also restricted for external users. -# Bullet point that summarizes desktop download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners/Editors. Box Drive is a product name and not translated -boxui.securityControls.desktopDownloadExternalOwnersEditors = Download restricted on Box Drive, except Owners/Co-Owners/Editors. Also restricted for external users. -# Bullet point that summarizes desktop download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners. Box Drive is a product name and not translated -boxui.securityControls.desktopDownloadOwners = Download restricted on Box Drive, except Owners/Co-Owners. -# Bullet point that summarizes desktop download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners/Editors. Box Drive is a product name and not translated -boxui.securityControls.desktopDownloadOwnersEditors = Download restricted on Box Drive, except Owners/Co-Owners/Editors. -# Bullet point that summarizes desktop download restrictions applied to classification, when restriction applies to external users. Box Drive is a product name and not translated -boxui.securityControls.downloadExternal = Download restricted on Box Drive for external users. -# Bullet point that summarizes external collaboration blocked restriction applied to classification -boxui.securityControls.externalCollabBlock = External collaboration restricted. -# Bullet point that summarizes external collaboration restriction applied to classification -boxui.securityControls.externalCollabDomainList = External collaboration limited to approved domains. -# Bullet point that summarizes integration download restriction applied to classification -boxui.securityControls.integrationDownloadAllowlist = Only select integrations are allowed: {appNames} -# Bullet point that summarizes integration download restriction applied to classification. This variation is used when the list of integrations is longer than the configured threshold -boxui.securityControls.integrationDownloadAllowlistOverflow = Only select integrations are allowed: {appNames} +{remainingAppCount} more -# Bullet point that summarizes integration download restriction applied to classification -boxui.securityControls.integrationDownloadDenylist = Download restricted for some integrations: {appNames} -# Bullet point that summarizes integration download restriction applied to classification. This variation is used when the list of integrations is longer than the configured threshold -boxui.securityControls.integrationDownloadDenylistOverflow = Download restricted for some integrations: {appNames} +{remainingAppCount} more -# Bullet point that summarizes integration download restriction applied to classification -boxui.securityControls.integrationDownloadRestricted = Download restricted for some integrations. -# Bullet point that summarizes mobile download restrictions applied to classification, when restriction applies to external users -boxui.securityControls.mobileDownloadExternal = Download restricted on mobile for external users. -# Bullet point that summarizes mobile download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners -boxui.securityControls.mobileDownloadExternalOwners = Download restricted on mobile, except Owners/Co-Owners. Also restricted for external users. -# Bullet point that summarizes mobile download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners/Editors -boxui.securityControls.mobileDownloadExternalOwnersEditors = Download restricted on mobile, except Owners/Co-Owners/Editors. Also restricted for external users. -# Bullet point that summarizes mobile download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners -boxui.securityControls.mobileDownloadOwners = Download restricted on mobile, except Owners/Co-Owners. -# Bullet point that summarizes mobile download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners/Editors -boxui.securityControls.mobileDownloadOwnersEditors = Download restricted on mobile, except Owners/Co-Owners/Editors. -# Description for modal to display classification and security controls details -boxui.securityControls.modalDescription = Classification labels defined by your administrator can be used to label content and apply security policies. -# Title for modal to display classification and security controls details -boxui.securityControls.modalTitle = View Classification for “{itemName}” -# Label displayed above the security restrictions on the file due to the classification label and associated policies. -boxui.securityControls.securityControlsLabel = Restrictions -# Bullet point that summarizes Shared Link Auto-Expiration enabled restriction applied to classification -boxui.securityControls.sharedLinkAutoExpirationApplied = Shared Link Auto-Expiration applied. -# Bullet point that summarizes collaborators shared link restriction applied to classification -boxui.securityControls.sharingCollabAndCompanyOnly = Shared links cannot be made publicly accessible. -# Bullet point that summarizes shared link restriction applied to classification -boxui.securityControls.sharingCollabOnly = Shared links allowed for collaborators only. -# Short summary displayed for classification when an application download restriction is applied to it -boxui.securityControls.shortApp = Application restrictions apply -# Short summary displayed for items when app, integration, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortAppIntegrationSignSharedLinkAutoExpiration = App, integration, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both app and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortAppSharedLinkAutoExpiration = App and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both app download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortAppSign = App and Sign restrictions apply -# Short summary displayed for items when app, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortAppSignSharedLinkAutoExpiration = App, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when a download restriction is applied to it -boxui.securityControls.shortDownload = Download restrictions apply -# Short summary displayed for classification when both download and app download restrictions are applied to it -boxui.securityControls.shortDownloadApp = Download and app restrictions apply -# Short summary displayed for items when download, app, integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortDownloadAppIntegrationSharedLinkAutoExpiration = Download, app, integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when download, app and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortDownloadAppSharedLinkAutoExpiration = Download, app and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when download, app download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadAppSign = Download, app and Sign restrictions apply -# Short summary displayed for items when download, app, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadAppSignSharedLinkAutoExpiration = Download, app, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when both download and integration download restrictions are applied to it -boxui.securityControls.shortDownloadIntegration = Download and integration restrictions apply -# Short summary displayed for items when download, integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortDownloadIntegrationSharedLinkAutoExpiration = Download, integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when download, integration download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadIntegrationSign = Download, integration and Sign restrictions apply -# Short summary displayed for items when download, integration, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadIntegrationSignSharedLinkAutoExpiration = Download, integration, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both download and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortDownloadSharedLinkAutoExpiration = Download and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadSign = Download and Sign restrictions apply -# Short summary displayed for items when download, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortDownloadSignSharedLinkAutoExpiration = Download, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when an integration download restriction is applied to it -boxui.securityControls.shortIntegration = Integration restrictions apply -# Short summary displayed for items when both integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortIntegrationSharedLinkAutoExpiration = Integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both integration download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortIntegrationSign = Integration and Sign restrictions apply -# Short summary displayed for items when integration, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortIntegrationSignSharedLinkAutoExpiration = Integration, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when Shared Link Auto-Expiration restriction is applied to them. -boxui.securityControls.shortSharedLinkAutoExpiration = Shared Link Auto-Expiration restriction applies -# Short summary displayed for classification when a sharing restriction is applied to it -boxui.securityControls.shortSharing = Sharing restriction applies -# Short summary displayed for classification when both sharing and app download restrictions are applied to it -boxui.securityControls.shortSharingApp = Sharing and app restrictions apply -# Short summary displayed for items when sharing, app, integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingAppIntegrationSharedLinkAutoExpiration = Sharing, app, integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, app and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingAppSharedLinkAutoExpiration = Sharing, app and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, app download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingAppSign = Sharing, app and Sign restrictions apply -# Short summary displayed for items when sharing, app, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingAppSignSharedLinkAutoExpiration = Sharing, app, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when both sharing and download restrictions are applied to it -boxui.securityControls.shortSharingDownload = Sharing and download restrictions apply -# Short summary displayed for items when sharing, download and app download restrictions are applied to them. -boxui.securityControls.shortSharingDownloadApp = Sharing, download and app restrictions apply -# Short summary displayed for items when sharing, download, app and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingDownloadAppSharedLinkAutoExpiration = Sharing, download, app and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, download, app download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadAppSign = Sharing, download, app and Sign restrictions apply -# Short summary displayed for items when sharing, download, app, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadAppSignSharedLinkAutoExpiration = Sharing, download, app, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, download and integration download restrictions are applied to them. -boxui.securityControls.shortSharingDownloadIntegration = Sharing, download and integration restrictions apply -# Short summary displayed for items when sharing, download, integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingDownloadIntegrationSharedLinkAutoExpiration = Sharing, download, integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, download, integration download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadIntegrationSign = Sharing, download, integration and Sign restrictions apply -# Short summary displayed for items when sharing, download, integration, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadIntegrationSignSharedLinkAutoExpiration = Sharing, download, integration, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, download and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingDownloadSharedLinkAutoExpiration = Sharing, download and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadSign = Sharing, download and Sign restrictions apply -# Short summary displayed for items when sharing, download, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingDownloadSignSharedLinkAutoExpiration = Sharing, download, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when both sharing and integration download restrictions are applied to it -boxui.securityControls.shortSharingIntegration = Sharing and integration restrictions apply -# Short summary displayed for items when sharing, integration and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingIntegrationSharedLinkAutoExpiration = Sharing, integration and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when sharing, integration download and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingIntegrationSign = Sharing, integration and Sign restrictions apply -# Short summary displayed for items when sharing, integration, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingIntegrationSignSharedLinkAutoExpiration = Sharing, integration, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both sharing and Shared Link Auto-Expiration restrictions are applied to them. -boxui.securityControls.shortSharingSharedLinkAutoExpiration = Sharing and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when both sharing and Sign restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingSign = Sharing and Sign restrictions apply -# Short summary displayed for items when sharing, Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSharingSignSharedLinkAutoExpiration = Sharing, Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for items when Sign restriction is applied to them. Box Sign is a product name -boxui.securityControls.shortSign = Sign restrictions apply -# Short summary displayed for items when both Sign and Shared Link Auto-Expiration restrictions are applied to them. Box Sign is a product name -boxui.securityControls.shortSignSharedLinkAutoExpiration = Sign and Shared Link Auto-Expiration restrictions apply -# Short summary displayed for classification when watermarking is applied to it -boxui.securityControls.shortWatermarking = Watermarking applies -# Button to display security controls modal -boxui.securityControls.viewAll = View All -# Bullet point that summarizes watermarking applied to classification -boxui.securityControls.watermarkingApplied = Watermarking will be applied. -# Bullet point that summarizes web download restrictions applied to classification, when restriction applies to external users -boxui.securityControls.webDownloadExternal = Download restricted on web for external users. -# Bullet point that summarizes web download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners -boxui.securityControls.webDownloadExternalOwners = Download restricted on web, except Owners/Co-Owners. Also restricted for external users. -# Bullet point that summarizes web download restrictions applied to classification, when restriction applies to external users and managed users except Owners/Co-Owners/Editors -boxui.securityControls.webDownloadExternalOwnersEditors = Download restricted on web, except Owners/Co-Owners/Editors. Also restricted for external users. -# Bullet point that summarizes web download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners -boxui.securityControls.webDownloadOwners = Download restricted on web, except Owners/Co-Owners. -# Bullet point that summarizes web download restrictions applied to classification, when restriction applies to managed users except Owners/Co-Owners/Editors -boxui.securityControls.webDownloadOwnersEditors = Download restricted on web, except Owners/Co-Owners/Editors. -# Alt text for info icon -boxui.select.moreInfo = More Info -# text shown on the Clear All option in the options list -boxui.selectField.clearAll = Clear All -# Text shown in the select field dropdown when there are no options that match the search field input -boxui.selectField.noResults = No Results -# Placeholder text shown in the search input -boxui.selectField.searchPlaceholder = Search -# Title for "Access Type" menu, in all capital letters -boxui.share.accessType = ACCESS TYPE -# Label for a shared link permission level -boxui.share.canEdit = Can edit -# Label for a shared link permission level -boxui.share.canView = Can view -# Text for Co-owner permission level in permissions table -boxui.share.coownerLevelText = Co-owner -# Text for permissions table Delete column -boxui.share.deleteTableHeaderText = Delete -# Text for permissions table Download column -boxui.share.downloadTableHeaderText = Download -# Text for permissions table Edit column -boxui.share.editTableHeaderText = Edit -# Text for Editor permission level in permissions table -boxui.share.editorLevelText = Editor -# Field label for shared link recipient list (title-case) -boxui.share.emailSharedLink = Email Shared Link -# Error message when user tries to send shared link as email without entering any recipients -boxui.share.enterAtLeastOneEmail = Enter at least one valid email -# Text for permissions table Get Link column -boxui.share.getLinkTableHeaderText = Get Link -# Label for a Group contact type -boxui.share.groupLabel = Group -# Text on button to cancel and close the invite collaborators modal. -boxui.share.inviteCollaboratorsModalCancelButton = Cancel -# Text on button to send invitations to collaborators for an item -boxui.share.inviteCollaboratorsModalSendInvites = Send Invites -# Title of the Invite Collaborators Modal. {itemName} is the name of the file / folder being shared -boxui.share.inviteCollaboratorsModalTitle = Invite to {itemName} -# Label of the field where a user designates who to invite to collaborate on an item -boxui.share.inviteFieldLabel = Invite -# Label to invite editors to a file in the invite collab modal -boxui.share.inviteFileEditorsLabel = Invite people to become editors of this file. -# Label of the field where a user designates which permissions a collaborator will have on an item -boxui.share.inviteePermissionsFieldLabel = Invitee Permissions -# Tooltip text a user can use to learn more about collaborator permission options -boxui.share.inviteePermissionsLearnMore = Learn More -# Label for "Message" text box to email the shared link (title-case) -boxui.share.message = Message -# Placeholder text for message section -boxui.share.messageSelectorPlaceholder = Add a message -# Text for permissions table Owner column -boxui.share.ownerTableHeaderText = Owner -# Description of a company shared link for a file with view and download permissions -boxui.share.peopleInCompanyCanDownloadFile = Anyone in your company with the link can view and download this file. -# Description of a company shared link for a folder with view and download permissions -boxui.share.peopleInCompanyCanDownloadFolder = Anyone in your company with the link can view this folder and download its contents. -# Description of a company shared link for a file with edit permissions (implies view and download permissions as well) -boxui.share.peopleInCompanyCanEditFile = Anyone in your company with the link can edit and download this file. -# Description of a company shared link for a file with view permissions -boxui.share.peopleInCompanyCanViewFile = Anyone in your company with the link can view this file. -# Description of a company shared link for a folder with view permissions -boxui.share.peopleInCompanyCanViewFolder = Anyone in your company with the link can view this folder. -# This string describes the access level of a file or folder, or who can see the item. {enterpriseName} is the company name -boxui.share.peopleInEnterprise = People in {enterpriseName} -# Description of a collaborator-only shared link for a file with no permissions -boxui.share.peopleInItemCanAccessFile = Any collaborator on the file with the link can access this file. -# Description of a collaborator-only shared link for a folder with no permissions -boxui.share.peopleInItemCanAccessFolder = Any collaborator on the folder with the link can access this folder. -# Description of a collaborator-only shared link for a file with download permissions -boxui.share.peopleInItemCanDownloadFile = Any collaborator on this file with the link can download this file. -# Description of a collaborator-only shared link for a folder with download permissions -boxui.share.peopleInItemCanDownloadFolder = Any collaborator on this folder with the link can download this folder. -# Description of a collaborator-only shared link for a file with edit permissions (implies view and download permissions as well) -boxui.share.peopleInItemCanEditFile = Any collaborator on this file with the link can edit this file and download its contents. -# Description of a collaborator-only shared link for a file with view and download permissions -boxui.share.peopleInItemCanPreviewAndDownloadFile = Any collaborator on this file with the link can view this file and download its contents. -# Description of a collaborator-only shared link for a folder with view and download permissions -boxui.share.peopleInItemCanPreviewAndDownloadFolder = Any collaborator on this folder with the link can view this folder and download its contents. -# Description of a collaborator-only shared link for a file with view permissions -boxui.share.peopleInItemCanPreviewFile = Any collaborator on this file with the link can view this file. -# Description of a collaborator-only shared link for a folder with view permissions -boxui.share.peopleInItemCanPreviewFolder = Any collaborator on this folder with the link can view this folder. -# Description of a specific company shared link for a file with view and download permissions. {company} is the company name -boxui.share.peopleInSpecifiedCompanyCanDownloadFile = Anyone in {company} with the link can view and download this file. -# Description of a specific company shared link for a folder with view and download permissions. {company} is the company name -boxui.share.peopleInSpecifiedCompanyCanDownloadFolder = Anyone in {company} with the link can view this folder and download its contents. -# Description of a specific company shared link for a file with edit permissions (implies view and download permissions as well). {company} is the company name -boxui.share.peopleInSpecifiedCompanyCanEditFile = Anyone in {company} with the link can edit and download this file. -# Description of an specific company shared link for a file with view permissions. {company} is the company name -boxui.share.peopleInSpecifiedCompanyCanViewFile = Anyone in {company} with the link can view this file. -# Description of an specific company shared link for a folder with view permissions. {company} is the company name -boxui.share.peopleInSpecifiedCompanyCanViewFolder = Anyone in {company} with the link can view this folder. -# Label for "People in this file" option -boxui.share.peopleInThisFile = People in this file -# Label for "People in this folder" option -boxui.share.peopleInThisFolder = People in this folder -# Label for "People in your company" option -boxui.share.peopleInYourCompany = People in your company -# Description of an open shared link for a file with view and download permissions -boxui.share.peopleWithLinkCanDownloadFile = Anyone with the link can view and download this file. -# Description of an open shared link for a folder with view and download permissions -boxui.share.peopleWithLinkCanDownloadFolder = Anyone with the link can view this folder and download its contents. -# Description of an open shared link for a file with edit permissions (implies view and download permissions as well) -boxui.share.peopleWithLinkCanEditFile = Anyone with the link can edit and download this file. -# Description of an open shared link for a file with view permissions -boxui.share.peopleWithLinkCanViewFile = Anyone with the link can view this file. -# Description of an open shared link for a folder with view permissions -boxui.share.peopleWithLinkCanViewFolder = Anyone with the link can view this folder. -# Label for "People with the link" option -boxui.share.peopleWithTheLink = People with the link -# Text for permissions table Permission Levels column -boxui.share.permissionLevelsTableHeaderText = Permission Levels -# Label for optional personal message to include when inviting collaborators to an item -boxui.share.personalMessageLabel = Personal Message -# Placeholder text for the pill selector -boxui.share.pillSelectorPlaceholder = Add names or email addresses -# Text for permissions table Preview column -boxui.share.previewTableHeaderText = Preview -# Text for Previewer permission level in permissions table -boxui.share.previewerLevelText = Previewer -# Text for Previewer Uploader permission level in permissions table -boxui.share.previewerUploaderLevelText = Previewer Uploader -# Text on a badge encouraging users to refer a friend to sign up for Box -boxui.share.referAFriendBadgeText = REFER -# Text on a link to the "Reward Center", where users can refer a friend to sign up for Box -boxui.share.referAFriendRewardCenterLinkText = Click Here -# Text encouraging users to refer a friend to sign up for Box -boxui.share.referAFriendText = Want a free month of Box? Refer your friend! -# Label for option to remove shared link -boxui.share.removeLink = Remove Link -# Description for confirmation modal to remove a shared link -boxui.share.removeLinkConfirmationDescription = This will permanently remove the shared link. If this item is embedded on other sites it will also become inaccessible. Any custom properties, settings and expirations will be removed as well. Do you want to continue? -# Label for confirmation modal to remove a shared link (title-case) -boxui.share.removeLinkConfirmationTitle = Remove Shared Link -# Accessible label for button that loads share settings popup -boxui.share.settingsButtonLabel = Open shared link settings popup -# Tooltip describing when this shared link will expire. {expiration, date, long} is the formatted date -boxui.share.sharedLinkExpirationTooltip = This link will expire on {expiration, date, long} -# Label for field to copy shared link URL (title-case) -boxui.share.sharedLinkLabel = Shared Link -# Title for shared link modal (title-case) -boxui.share.sharedLinkModalTitle = Shared Link for {itemName} -# Text to show when the access level of people in company and user can view only -boxui.share.sharedLinkSettings.accessLevel.inCompanyView = This content is available to anyone within your company with the link, and can be viewed. -# Text to show when the access level of people in company and user can view and download -boxui.share.sharedLinkSettings.accessLevel.inCompanyViewDownload = This content is available to anyone within your company with the link, and can be viewed or downloaded. -# Text to show when the access level of people collaborate on the item -boxui.share.sharedLinkSettings.accessLevel.inItem = This content is available to invited collaborators with the link. -# Text to show when the access level of people with link and user can view only -boxui.share.sharedLinkSettings.accessLevel.withLinkView = This content is publicly available to anyone with the link, and can be viewed. -# Text to show when the access level of people with link and user can view and download -boxui.share.sharedLinkSettings.accessLevel.withLinkViewDownload = This content is publicly available to anyone with the link, and can be viewed or downloaded. -# Label for option to enable downloads on a shared link -boxui.share.sharedLinkSettings.allowDownloadLabel = Allow users with the shared link to download this item -# Title for Allow Download section -boxui.share.sharedLinkSettings.allowDownloadTitle = Allow Download -# Label for Custom URL text input field -boxui.share.sharedLinkSettings.customURLLabel = Non-private custom URL -# Text to show that direct link download is disabled due to applied shield access policy with classification -boxui.share.sharedLinkSettings.directDownloadBlockedByAccessPolicyWithClassification = Download has been disabled for content due to the classification. -# Text to show that direct link download is disabled due to applied shield access policy without classification -boxui.share.sharedLinkSettings.directDownloadBlockedByAccessPolicyWithoutClassification = Download has been disabled for content without classification. -# Text to show that direct link download is disabled due to security policy -boxui.share.sharedLinkSettings.directDownloadBlockedByMaliciousContent = Download for this content has been disabled due to a security policy. -# Title for Direct Link section -boxui.share.sharedLinkSettings.directLinkLabel = Direct Link -# Label for option to enable expiration on a shared link -boxui.share.sharedLinkSettings.expirationLabel = Disable Shared Link on -# Title for Link Expiration section -boxui.share.sharedLinkSettings.expirationTitle = Link Expiration -# Notice shown at top of modal when one or more settings are unavailable due to permission settings -boxui.share.sharedLinkSettings.inaccessibleSettingsNotice = Certain settings may not be available for this item due to permissions. -# Title for shared link settings modal (title-case) -boxui.share.sharedLinkSettings.modalTitle = Shared Link Settings -# Label for checkbox to enable password on shared link -boxui.share.sharedLinkSettings.passwordLabel = Require password -# Placeholder for text input to enter a password -boxui.share.sharedLinkSettings.passwordPlaceholder = Enter a password -# Title for section to add password to shared link -boxui.share.sharedLinkSettings.passwordTitle = Password Protect -# Text for the link used to navigate users to the relevant community article -boxui.share.sharedLinkSettings.sharedLinkSettingWarningLinkText = Learn more about shared link settings. -# Text displayed stating that content shared openly may be exposed to the public -boxui.share.sharedLinkSettings.sharedLinkWarningText = This content is publicly available to anyone with the link. -# Text to show when a custom URL has not been set -boxui.share.sharedLinkSettings.vanityNameNotSet = The custom URL has not been set -# Placeholder for Custom URL text input field -boxui.share.sharedLinkSettings.vanityNamePlaceholder = Enter a custom path (12 or more characters) -# Text field for implications of using the custom (vanity) URL as a notice -boxui.share.sharedLinkSettings.vanityURLWarning = Custom URLs should not be used when sharing sensitive content. -# Accessible label for shared link input field -boxui.share.sharedLinkURLLabel = URL -# Label for link to upgrade to get more access controls for inviting collaborators to an item -boxui.share.upgradeGetMoreAccessControls = Get More Access Controls -# Text for permissions table Upload column -boxui.share.uploadTableHeaderText = Upload -# Text for Uploader permission level in permissions table -boxui.share.uploaderLevelText = Uploader -# Text label for custom URL section -boxui.share.vanityURLEnableText = Publish content broadly with a custom, non-private URL -# Text for Viewer permission level in permissions table -boxui.share.viewerLevelText = Viewer -# Text for Viewer Uploader permission level in permissions table -boxui.share.viewerUploaderLevelText = Viewer Uploader -# Description of permissions granted to users who have access to the shared link -boxui.shareMenu.downloadOnly = Download Only -# Description of permissions granted when inviting a collab to this item -boxui.shareMenu.editAndComment = Edit and Comment -# Label for menu option to get shared link for item (title-case) -boxui.shareMenu.getSharedLink = Get Shared Link -# Label for disabled menu option when user does not have permission to get shared link for item -boxui.shareMenu.insufficientPermissionsMenuOption = Insufficient sharing permissions. Please contact the folder owner. -# Tooltip to show when user does not have permission to invite collaborators to item -boxui.shareMenu.insufficientPermissionsTooltip = You have insufficient permissions to invite collaborators. -# Label for menu option to invite collaborators to item -boxui.shareMenu.inviteCollabs = Invite Collaborators -# Tooltip to show when only owners and co-owners are allowed to invite collaborators to item -boxui.shareMenu.ownerCoownerOnlyTooltip = You have insufficient permissions to invite collaborators. Only the owner and co-owners can invite collaborators. -# Description of permissions granted to users who have access to the shared link -boxui.shareMenu.shortcutOnly = Shortcut Only -# Description of permissions granted to users who have access to the shared link -boxui.shareMenu.viewAndDownload = View and Download -# Description of permissions granted to users who have access to the shared link -boxui.shareMenu.viewOnly = View Only -# Aria-label for the dropdown menu that shows actions for selected items -boxui.subHeader.bulkItemActionMenuAriaLabel = Bulk actions -# Text for metadata button that will open the metadata side panel -boxui.subHeader.metadata = Metadata -# Error message for empty time formats. "HH:MM A" should be localized. -boxui.timeInput.emptyTimeError = Required field. Enter a time in the format HH:MM A. -# Error message for invalid time formats. "HH:MM A" should be localized. -boxui.timeInput.invalidTimeError = Invalid time format. Enter a time in the format HH:MM A. -# Used in a dialog box that urges the user to upgrade. This is substituted into the middle of the sentence in the string with id boxui.unifiedShare.levelOfCollabAccess -boxui.unifiedShare.collabAccess = collaborator access -# Text to display for a group of users who have accepted an invitation to collaborate -boxui.unifiedShare.collaboration.groupCollabText = Group -# Text to display for individual users who have accepted an invitation to collaborate -boxui.unifiedShare.collaboration.userCollabText = User -# Title for collaborator list modal -boxui.unifiedShare.collaboratorListTitle = People in ‘{itemName}’ -# This string is displayed as tooltip on hovering over expire icon for collab -boxui.unifiedShare.collaborators.expirationTooltipClickableText = Access expires on {date}. Click for details. -# Text to show when the number of contact email addresses displayed on a tooltip exceeds the maximum amount that can be displayed -boxui.unifiedShare.contactEmailsTooltipText = {emails}, and {remainingEmailsCount} more -# Text for the notice that is displayed when there are collaboration restrictions that apply to one or more of the selected contacts -boxui.unifiedShare.contactRestrictionNotice = {count, plural, one {{count} invitation} other {{count} invitations}} cannot be sent because external collaboration is restricted due to the applied security policy. -# Text for the notice that is displayed when there are Information Barrier collaboration restrictions that apply to one or more of the selected contacts -boxui.unifiedShare.contactRestrictionNoticeInformationBarrier = {count, plural, one {{count} invitation} other {{count} invitations}} cannot be sent due to a security policy. -# Text for the notice that is displayed when there are Information Barrier collaboration restrictions that apply to only one of the selected contacts -boxui.unifiedShare.contactRestrictionNoticeInformationBarrierSingular = Invitations cannot be sent to {email} due to a security policy. -# Text for the notice that is displayed when there are Information Barrier collaboration restrictions that apply to only one of the selected contacts, which is a group -boxui.unifiedShare.contactRestrictionNoticeInformationBarrierSingularGroup = Invitations cannot be sent to "{groupName}" due to a security policy. -# Text for the notice that is displayed when there are collaboration restrictions that apply to one or more of the selected contacts -boxui.unifiedShare.contactRestrictionNoticeSingular = Invitations cannot be sent to {email} because external collaboration is restricted due to the applied security policy. -# Label for the button that removes restricted contacts on the contact restriction notice -boxui.unifiedShare.contactRestrictionRemoveButtonLabel = Remove to continue -# Error message when more than the maximum number of contacts is entered -boxui.unifiedShare.contactsExceedLimitError = Oops! The maximum number of collaborators that can be added at once is {maxContacts} collaborators. Please try again by splitting your invitations into batches. -# Text shown in share modal when there is at least one external collaborators -boxui.unifiedShare.contentSharedWithExternalCollaborators = This content will be shared with external collaborators. -# Text used in button label to describe permission level - co-owner -boxui.unifiedShare.coownerLevelButtonLabel = Invite as Co-owner -# Description for Co-owner permission level in permissions table -boxui.unifiedShare.coownerLevelDescription = Manage security, upload, download, preview, share, edit, and delete -# Text for Co-owner permission level in permissions table -boxui.unifiedShare.coownerLevelText = Co-owner -# Tooltip description for users who do not have permission for link creation -boxui.unifiedShare.disabledCreateLinkTooltip = You do not have permission to create the link. -# Tooltip text for when shared permission option is not available due to security policy -boxui.unifiedShare.disabledMaliciousContentShareLinkPermission = This option isn’t available for this item due to a security policy. -# Tooltip text for when shared permission option is not available due to restriction or classification -boxui.unifiedShare.disabledShareLinkPermission = This option is not available due to a security policy. -# Text used in button label to describe permission level - editor -boxui.unifiedShare.editorLevelButtonLabel = Invite as Editor -# Description for Editor permission level in invitee permission dropdown -boxui.unifiedShare.editorLevelDescription = Upload, download, preview, share, edit, and delete -# Description for Editor permission level in invitee permission dropdown for files -boxui.unifiedShare.editorLevelFileDescription = Upload, download, preview, share, and edit -# Text for Editor permission level in invitee permission dropdown -boxui.unifiedShare.editorLevelText = Editor -# The message to show when you have clicked the button to send the email to a new collaborator (title case) -boxui.unifiedShare.emailModalTitle = Send Link to ‘{itemName}’ -# Error message when user tries to send Shared Link as email without entering any recipients -boxui.unifiedShare.enterAtLeastOneEmail = Enter at least one valid email -# Tooltip text shown in the share modal, encouraging users to enter email addresses to share the item with -boxui.unifiedShare.enterEmailAddressesCalloutText = Share this item with coworkers by entering their email addresses -# Label for tooltips or other components that display expiration icons -boxui.unifiedShare.expiresMessage = Expires -# This is label for the button so a user understands the new interface -boxui.unifiedShare.ftuxConfirmLabel = Got it -# Text for the body of the tooltip for the ftux experience when the edit option is available for the user -boxui.unifiedShare.ftuxEditPermissionTooltipBody = Select the new edit option to easily share your file with people or groups. -# Text for the title of the tooltip for the ftux experience when the edit option is available for the user -boxui.unifiedShare.ftuxEditPermissionTooltipTitle = Collaboration made easy -# Text on the link which allows to learn more about link security -boxui.unifiedShare.ftuxLinkText = Read more about shared link security here. -# This text describes the purpose of the new UI, using the button label to open the modal -boxui.unifiedShare.ftuxNewUSMUserBody = We’ve simplified the sharing experience when you click 'Share'. Invite people to this item here and toggle the link on or off below for easy sharing. -# This title appears in the callout when loading the modal, to let users know about the new UI -boxui.unifiedShare.ftuxNewUsmUserTitle = Simplified sharing for files and folders -# Label for the LabelPill that is shown when the user first opens the SharedLinkPermissions dropdown and sees the Can Edit option -boxui.unifiedShare.ftuxSharedLinkPermissionsEditTag = NEW -# Label for a Group contact type -boxui.unifiedShare.groupLabel = Group -# Invite Collaborators disabled state tooltip -boxui.unifiedShare.inviteDisabledTooltip = You do not have permission to invite collaborators. -# Invite Collaborators disabled state tooltip due to item being weblink -boxui.unifiedShare.inviteDisabledWeblinkTooltip = Collaborators cannot be added to bookmarks. -# Label of the field where a user designates who to invite to collaborate on an item -boxui.unifiedShare.inviteFieldLabel = Invite People -# Text for the notice that is displayed when there are collaboration restrictions that apply to one or more of the selected contacts and business justifications are allowed for bypassing restrictions -boxui.unifiedShare.justifiableContactRestrictionNotice = This content requires a business justification for {count, plural, one {{count} invitation} other {{count} invitations}}. Please select a business justification below. -# Text for the notice that is displayed when there are collaboration restrictions that apply to one or more of the selected contacts and business justifications are allowed for bypassing restrictions -boxui.unifiedShare.justifiableContactRestrictionNoticeSingular = This content requires a business justification to invite {email}. Please select a business justification below. -# Label for the button that removes restricted contacts on the contact restriction notice when business justifications are allowed for bypassing restrictions -boxui.unifiedShare.justifiableContactRestrictionRemoveButtonLabel = Alternatively, remove to continue -# The error message that is displayed when a user tries to send invitations to external collaborators, but a business justification is required before proceeding -boxui.unifiedShare.justificationRequiredError = Select a justification or remove to continue -# The placeholder text of the select field that allows selecting a business justification reason -boxui.unifiedShare.justificationSelectPlaceholder = Select Justification -# Used in a dialog box that urges the user to upgrade. The collaboratorAccess variable is replaced with the words "collaborator access" from the string with the id boxui.unifiedShare.collabAccess -boxui.unifiedShare.levelOfCollabAccess = Set the level of {collaboratorAccess} and increase security through one of our paid plans. {upgradeLink} -# Call to action text for allowing the user to create a new shared link -boxui.unifiedShare.linkShareOff = Create shared link -# Call to action text for allowing the user to remove an existing shared link -boxui.unifiedShare.linkShareOn = Shared link is created -# Label for "Message" text box to email the shared Link -boxui.unifiedShare.message = Message -# Title of the Unified Share Modal. {itemName} is the name of the file / folder being shared -boxui.unifiedShare.modalTitle = Share ‘{itemName}’ -# Description of a company shared link for a file. -boxui.unifiedShare.peopleInCompanyCanAccessFile = Anyone in your company with the link or people invited to this file can access -# Description of a company shared link for a folder. -boxui.unifiedShare.peopleInCompanyCanAccessFolder = Anyone in your company with the link or people invited to this folder can access -# Description of a company shared link for a hub. -boxui.unifiedShare.peopleInCompanyCanAccessHub = Anyone in your company with the link or people invited to this hub can access -# Label for "People in {enterpriseName}" option -boxui.unifiedShare.peopleInEnterpriseName = People in {enterpriseName} -# Description of a collaborator-only shared link for a file -boxui.unifiedShare.peopleInItemCanAccessFile = Only invited people can access this file -# Description of a collaborator-only shared link for a folder -boxui.unifiedShare.peopleInItemCanAccessFolder = Only invited people can access this folder -# Description of a collaborator-only shared link for a hub -boxui.unifiedShare.peopleInItemCanAccessHub = Only invited people can access this hub -# Description of a specific company shared link for a file. {company} is the company name -boxui.unifiedShare.peopleInSpecifiedCompanyCanAccessFile = Anyone at {company} with the link or people invited to this file can access -# Description of a specific company shared link for a folder. {company} is the company name -boxui.unifiedShare.peopleInSpecifiedCompanyCanAccessFolder = Anyone at {company} with the link or people invited to this folder can access -# Description of a specific company shared link for a hub. {company} is the company name -boxui.unifiedShare.peopleInSpecifiedCompanyCanAccessHub = Anyone at {company} with the link or people invited to this hub can access -# Label for "People in this file" option -boxui.unifiedShare.peopleInThisFile = Invited people only -# Label for "People in this folder" option -boxui.unifiedShare.peopleInThisFolder = Invited people only -# Label for "People in your company" option -boxui.unifiedShare.peopleInYourCompany = People in your company -# Description of an open shared link -boxui.unifiedShare.peopleWithLinkDescription = Publicly accessible and no sign-in required -# Text to show that those having the link will have access -boxui.unifiedShare.peopleWithTheLinkText = People with the link -# Text used in button label to describe permission level - previewer -boxui.unifiedShare.previewerLevelButtonLabel = Invite as Previewer -# Description for Previewer permission level in invitee permission dropdown -boxui.unifiedShare.previewerLevelDescription = Preview only -# Text for Previewer permission level in invitee permission dropdown -boxui.unifiedShare.previewerLevelText = Previewer -# Text used in button label to describe permission level - previewer uploader -boxui.unifiedShare.previewerUploaderLevelButtonLabel = Invite as Previewer Uploader -# Description for Previewer Uploader permission level in invitee permission dropdown -boxui.unifiedShare.previewerUploaderLevelDescription = Upload and preview -# Text for Previewer Uploader permission level in invitee permission dropdown -boxui.unifiedShare.previewerUploaderLevelText = Previewer Uploader -# Tooltip description to explain recommendation for sharing tooltip -boxui.unifiedShare.recommendedSharingTooltipCalloutText = Based on your usage, we think {fullName} would be interested in this file. -# Description for confirmation modal to remove a collaborator -boxui.unifiedShare.removeCollaboratorConfirmationDescription = Are you sure you want to remove {name} as a collaborator? -# Label for confirmation modal to remove a collaborator (title-case) -boxui.unifiedShare.removeCollaboratorConfirmationTitle = Remove Collaborator -# Description for confirmation modal to remove a shared link -boxui.unifiedShare.removeLinkConfirmationDescription = This will permanently remove the shared link. If this item is embedded on other sites it will also become inaccessible. Any custom properties, settings and expirations will be removed as well. Do you want to continue? -# Label for confirmation modal to remove a shared link (title-case) -boxui.unifiedShare.removeLinkConfirmationTitle = Remove Shared Link -# Tooltip description for not having access to remove link -boxui.unifiedShare.removeLinkTooltip = You do not have permission to remove the link. -# The error message that is displayed when a user tries to send invitations to external collaborators, but restricted contacts need to be removed before proceeding -boxui.unifiedShare.restrictedContactsError = Remove to continue -# Tooltip text for email shared link button (title-case) -boxui.unifiedShare.sendSharedLink = Send Shared Link -# Field label for shared link recipient list (title-case) -boxui.unifiedShare.sendSharedLinkFieldLabel = Email Shared Link -# This tooltip appears over the shared link toggle, explaining what happens when it is clicked -boxui.unifiedShare.sharedLinkDisabledTooltipCopy = Create and copy link for sharing -# Text shown in share modal when shared link is editable and is open to public access -boxui.unifiedShare.sharedLinkEditablePubliclyAvailable = Publicly available for anyone to view and download. Any logged in users with the link can edit. -# Text shown in share modal when shared link is editable and is open to company access -boxui.unifiedShare.sharedLinkElevatedEditableCompanyAvailable = People who have access to this link can edit. -# Tooltip describing when this shared link will expire. {expiration, date, long} is the formatted date -boxui.unifiedShare.sharedLinkExpirationTooltip = This link will expire and be inaccessible on {expiration, date, long}. -# Label for a shared link permission to show for an editable box note / file -boxui.unifiedShare.sharedLinkPermissionsEdit = Can edit -# Text to use in the tooltip when presenting an editable Box Note (DO NOT TRANSLATE "Box Notes") -boxui.unifiedShare.sharedLinkPermissionsEditTooltip = This permission can only be changed in Box Notes -# Label for a shared link permission level -boxui.unifiedShare.sharedLinkPermissionsViewDownload = Can view and download -# Label for a shared link permission level -boxui.unifiedShare.sharedLinkPermissionsViewOnly = Can view only -# Text shown in share modal when shared link is open to public access -boxui.unifiedShare.sharedLinkPubliclyAvailable = This content is publicly available to anyone with the link. -# Label for the shared link section of the unified share modal -boxui.unifiedShare.sharedLinkSectionLabel = Share Link -# Description of the shared link settings modal entry point. This shows link-specific options. -boxui.unifiedShare.sharedLinkSettings = Link Settings -# Tooltip text shown in the share modal, next to the settings gear, describing what settings can be changed -boxui.unifiedShare.sharedLinkSettingsCalloutText = Create a custom URL, enable password protection, enable link expiration, and much more -# Title for suggested collaborators that can be added to the form -boxui.unifiedShare.suggestedCollabsTitle = Suggested -# Description for cta to upgrade to get more access controls for inviting collaborators to an item -boxui.unifiedShare.upgradeGetMoreAccessControlsDescription = 62% of customers on your plan {upgradeGetMoreAccessControlsLink} to manage collaborators’ access and permission settings -# Label for link to upgrade to get more access controls for inviting collaborators to an item -boxui.unifiedShare.upgradeGetMoreAccessControlsLink = upgrade -# Title for the upgrade inline notice for upgrade user plan -boxui.unifiedShare.upgradeInlineNoticeTitle = Upgrade Your Plan -# Label for link to upgrade account -boxui.unifiedShare.upgradeLink = Upgrade now -# Text used in button label to describe permission level - uploader -boxui.unifiedShare.uploaderLevelButtonLabel = Invite as Uploader -# Description for Uploader permission level in invitee permission dropdown -boxui.unifiedShare.uploaderLevelDescription = Upload only -# Text for Uploader permission level in invitee permission dropdown -boxui.unifiedShare.uploaderLevelText = Uploader -# Text used in button label to describe permission level - viewer -boxui.unifiedShare.viewerLevelButtonLabel = Invite as Viewer -# Description for Viewer permission level in invitee permission dropdown -boxui.unifiedShare.viewerLevelDescription = Download, preview, and share -# Text for Viewer permission level in invitee permission dropdown -boxui.unifiedShare.viewerLevelText = Viewer -# Text used in button label to describe permission level - viewer uploader -boxui.unifiedShare.viewerUploaderLevelButtonLabel = Invite as Viewer Uploader -# Text for Viewer Uploader permission level in invitee permission dropdown -boxui.unifiedShare.viewerUploaderLevelDescription = Upload, download, preview, share, and edit -# Text for Viewer Uploader permission level in invitee permission dropdown -boxui.unifiedShare.viewerUploaderLevelText = Viewer Uploader -# Error message for when an invalid URL is entered -boxui.validation.URLError = Invalid URL -# Error message for when an invalid email is entered -boxui.validation.emailError = Invalid Email Address -# Generic error message for a field is invalid -boxui.validation.genericError = Invalid Input -# Error message for when an invalid Date is entered -boxui.validation.invalidDateError = Invalid Date -# Error message for when an invalid user is entered -boxui.validation.invalidUserError = Invalid User -# Error message for when a required field is missing -boxui.validation.requiredError = Required Field -# Error message for when an input value is too long. {max} is the maximum length -boxui.validation.tooLongError = Input cannot exceed {max} characters -# Error message for when an input value is too short. {min} is the minimum length -boxui.validation.tooShortError = Input must be at least {min} characters diff --git a/package.json b/package.json index 34bcc189e9..ae8a3ce97e 100644 --- a/package.json +++ b/package.json @@ -266,7 +266,7 @@ "react-responsive": "^10.0.0", "react-router-dom": "^5.3.4", "react-scrollbars-custom": "^4.0.21", - "react-tether": "^1.0.5", + "react-tether": "^3.0.3", "react-textarea-autosize": "^8.5.3", "regenerator-runtime": "^0.14.1", "remarkable": "^2.0.1", @@ -347,7 +347,7 @@ "react-responsive": "^10.0.0", "react-router-dom": "5.3.4", "react-scrollbars-custom": "^4.0.21", - "react-tether": "^1.0.5", + "react-tether": "^3.0.3", "react-textarea-autosize": "^8.5.3", "regenerator-runtime": "^0.13.2", "remarkable": "^2.0.1", @@ -357,11 +357,6 @@ "tabbable": "^1.1.2", "uuid": "^8.3.2" }, - "comments": { - "dependencies": { - "react-tether": "Version 2.x has too many breaking changes and requires forwardRef on all components" - } - }, "msw": { "workerDirectory": [".storybook/public"] } diff --git a/src/components/button-group/ButtonGroup.scss b/src/components/button-group/ButtonGroup.scss index 94d71c2aea..21b583efc2 100644 --- a/src/components/button-group/ButtonGroup.scss +++ b/src/components/button-group/ButtonGroup.scss @@ -43,7 +43,8 @@ &, & > .bdl-targeted-click-through { - > .btn { + > .btn, + > * > .btn { margin: 5px 0 5px -1px; border-radius: 0; @@ -64,17 +65,20 @@ } } - > .btn:first-child { + > .btn:first-child, + > *:first-child > .btn { border-top-left-radius: $bdl-border-radius-size-med; border-bottom-left-radius: $bdl-border-radius-size-med; } - > .btn:last-child { + > .btn:last-child, + > *:last-child > .btn { border-top-right-radius: $bdl-border-radius-size-med; border-bottom-right-radius: $bdl-border-radius-size-med; } - > .btn.is-selected { + > .btn.is-selected, + > * > .btn.is-selected { z-index: 2; /* place on top of siblings */ color: $bdl-gray-80; background-color: $bdl-gray-10; @@ -82,7 +86,8 @@ box-shadow: none; } - > .btn:focus { + > .btn:focus, + > * > .btn:focus { z-index: 3; /* place on top of all other buttons for accessibility */ } } @@ -98,7 +103,7 @@ border: 1px solid $bdl-gray-30; box-shadow: none; cursor: default; - opacity: .4; + opacity: 0.4; } > .btn-primary { diff --git a/src/components/checkbox/Checkbox.scss b/src/components/checkbox/Checkbox.scss index 733ff86c37..1e6fecf5f9 100644 --- a/src/components/checkbox/Checkbox.scss +++ b/src/components/checkbox/Checkbox.scss @@ -75,8 +75,10 @@ .checkbox-tooltip-wrapper { display: inline-flex; vertical-align: text-bottom; + line-height: 0.1; // This keeps the tooltip wrapper height consistent with the child element - > .info-tooltip { + > .info-tooltip, + > * > .info-tooltip { position: relative; display: inline-block; flex: none; diff --git a/src/components/context-menu/ContextMenu.tsx b/src/components/context-menu/ContextMenu.tsx index e645b4f9b6..477a4c3680 100644 --- a/src/components/context-menu/ContextMenu.tsx +++ b/src/components/context-menu/ContextMenu.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import TetherComponent from 'react-tether'; +import TetherComponent, { TetherProps } from 'react-tether'; import uniqueId from 'lodash/uniqueId'; import './ContextMenu.scss'; @@ -158,8 +158,7 @@ class ContextMenu extends React.Component { onClose: this.handleMenuClose, }; - // TypeScript defs don't work for older versions of react-tether - const tetherProps = { + const tetherProps: TetherProps = { attachment: 'top left', classPrefix: 'context-menu', constraints, @@ -167,11 +166,24 @@ class ContextMenu extends React.Component { targetOffset, }; + if (document?.body) { + tetherProps.renderElementTo = document.body; + } + return ( - - {React.isValidElement(menuTarget) ? React.cloneElement(menuTarget, menuTargetProps) : null} - {isOpen && React.isValidElement(menu) ? React.cloneElement(menu, menuProps) : null} - + { + return React.isValidElement(menuTarget) ? ( +
{React.cloneElement(menuTarget, menuTargetProps)}
+ ) : null; + }} + renderElement={ref => { + return isOpen && React.isValidElement(menu) ? ( +
{React.cloneElement(menu, menuProps)}
+ ) : null; + }} + /> ); } } diff --git a/src/components/context-menu/__tests__/ContextMenu.test.tsx b/src/components/context-menu/__tests__/ContextMenu.test.tsx index 086834e8ba..8671cb3d4e 100644 --- a/src/components/context-menu/__tests__/ContextMenu.test.tsx +++ b/src/components/context-menu/__tests__/ContextMenu.test.tsx @@ -53,7 +53,7 @@ describe('components/context-menu/ContextMenu', () => { }); test('should correctly render a single child button with correct props', () => { - const wrapper = shallow( + const wrapper = mount( @@ -69,7 +69,7 @@ describe('components/context-menu/ContextMenu', () => { }); test('should not render child menu when menu is closed', () => { - const wrapper = shallow( + const wrapper = mount( @@ -81,13 +81,16 @@ describe('components/context-menu/ContextMenu', () => { }); test('should correctly render a single child menu with correct props when menu is open', () => { - const wrapper = shallow( + const wrapper = mount( , ); - wrapper.setState({ isOpen: true }); + act(() => { + wrapper.setState({ isOpen: true }); + }); + wrapper.update(); const instance = wrapper.instance(); @@ -100,17 +103,19 @@ describe('components/context-menu/ContextMenu', () => { }); test('should render TetherComponent with correct props with correct default values', () => { - const wrapper = shallow( + const wrapper = mount( , ); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('attachment')).toEqual('top left'); - expect(wrapper.prop('targetAttachment')).toEqual('top left'); - expect(wrapper.prop('constraints')).toEqual([]); + // Find the TetherComponent by looking for one with renderTarget prop + const tetherComponent = wrapper.findWhere(node => node.prop('renderTarget') && node.prop('renderElement')); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('attachment')).toEqual('top left'); + expect(tetherComponent.prop('targetAttachment')).toEqual('top left'); + expect(tetherComponent.prop('constraints')).toEqual([]); }); test('should render TetherComponent with constraints when specified', () => { @@ -153,12 +158,9 @@ describe('components/context-menu/ContextMenu', () => { , ); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('setState') - .withArgs({ - isOpen: false, - }); + sandbox.mock(instance).expects('setState').withArgs({ + isOpen: false, + }); instance.closeMenu(); }); @@ -247,7 +249,9 @@ describe('components/context-menu/ContextMenu', () => { const instance = wrapper.instance(); document.addEventListener = jest.fn(); document.removeEventListener = jest.fn(); - instance.setState({ isOpen: true }); + act(() => { + instance.setState({ isOpen: true }); + }); expect(document.addEventListener).not.toHaveBeenCalledWith('click', expect.anything(), expect.anything()); expect(document.addEventListener).not.toHaveBeenCalledWith( 'contextmenu', @@ -290,14 +294,8 @@ describe('components/context-menu/ContextMenu', () => { ); const documentMock = sandbox.mock(document); - documentMock - .expects('removeEventListener') - .withArgs('contextmenu') - .never(); - documentMock - .expects('removeEventListener') - .withArgs('click') - .never(); + documentMock.expects('removeEventListener').withArgs('contextmenu').never(); + documentMock.expects('removeEventListener').withArgs('click').never(); wrapper.unmount(); }); @@ -411,18 +409,18 @@ describe('components/context-menu/ContextMenu', () => { const instance = wrapper.instance() as ContextMenu; instance.closeMenu = closeMenuSpy; - const handleContextMenuEvent = ({ + const handleContextMenuEvent = { clientX: 10, clientY: 15, preventDefault: preventDefaultSpy, - } as unknown) as MouseEvent; + } as unknown as MouseEvent; act(() => { instance.handleContextMenu(handleContextMenuEvent); }); - const documentClickEvent = ({ + const documentClickEvent = { target: document.createElement('div'), - } as unknown) as MouseEvent; + } as unknown as MouseEvent; instance.handleDocumentClick(documentClickEvent); expect(closeMenuSpy).toHaveBeenCalled(); }); @@ -438,18 +436,18 @@ describe('components/context-menu/ContextMenu', () => { const instance = wrapper.instance() as ContextMenu; instance.closeMenu = closeMenuSpy; - const handleContextMenuEvent = ({ + const handleContextMenuEvent = { clientX: 10, clientY: 15, preventDefault: preventDefaultSpy, - } as unknown) as MouseEvent; + } as unknown as MouseEvent; act(() => { instance.handleContextMenu(handleContextMenuEvent); }); - const documentClickEvent = ({ + const documentClickEvent = { target: document.getElementById(instance.menuID), - } as unknown) as MouseEvent; + } as unknown as MouseEvent; instance.handleDocumentClick(documentClickEvent); expect(closeMenuSpy).not.toHaveBeenCalled(); }); diff --git a/src/components/draft-js-editor/DraftJSEditor.js b/src/components/draft-js-editor/DraftJSEditor.js index d34d7347a6..89457318d8 100644 --- a/src/components/draft-js-editor/DraftJSEditor.js +++ b/src/components/draft-js-editor/DraftJSEditor.js @@ -126,7 +126,13 @@ class DraftJSEditor extends React.Component { {description} - + {/* need div so tooltip can set aria-describedby */}
{ bodyElement, children, className, + targetWrapperClassName, constrainToScrollParent, constrainToWindow, constrainToWindowWithPin, @@ -264,16 +267,25 @@ class DropdownMenu extends React.Component { return ( - {React.cloneElement(menuButton, menuButtonProps)} - {isOpen && React.cloneElement(menu, menuProps)} - + renderTarget={ref => ( +
+ {React.cloneElement(menuButton, menuButtonProps)} +
+ )} + renderElement={ref => { + return isOpen ? ( +
+ {React.cloneElement(menu, menuProps)} +
+ ) : null; + }} + /> ); } } diff --git a/src/components/dropdown-menu/DropdownMenu.scss b/src/components/dropdown-menu/DropdownMenu.scss index e9ac1a327b..926370d557 100644 --- a/src/components/dropdown-menu/DropdownMenu.scss +++ b/src/components/dropdown-menu/DropdownMenu.scss @@ -19,6 +19,10 @@ margin-top: 5px; } +.bdl-DropdownMenu-target { + display: inline-block; +} + @include breakpoint($medium-screen) { .bdl-DropdownMenu--responsive { &.dropdown-menu-enabled { diff --git a/src/components/dropdown-menu/__tests__/DropdownMenu.test.js b/src/components/dropdown-menu/__tests__/DropdownMenu.test.js index 44d9159579..8164138977 100644 --- a/src/components/dropdown-menu/__tests__/DropdownMenu.test.js +++ b/src/components/dropdown-menu/__tests__/DropdownMenu.test.js @@ -21,13 +21,18 @@ describe('components/dropdown-menu/DropdownMenu', () => { FakeMenu.displayName = 'FakeMenu'; /* eslint-enable */ - const getWrapper = (props = {}) => - shallow( + const renderWrapper = (props = {}) => { + return mount( , ); + }; + + const findTetherComponent = wrapper => { + return wrapper.findWhere(node => node.prop('renderTarget') && node.prop('renderElement')); + }; afterEach(() => { sandbox.verifyAndRestore(); @@ -57,7 +62,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should correctly render a single child button with correct props', () => { - const wrapper = shallow( + const wrapper = mount( @@ -76,7 +81,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should set aria-expanded="true" and aria-controls=menuID when menu is open', () => { - const wrapper = shallow( + const wrapper = mount( @@ -84,7 +89,9 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - instance.openMenuAndSetFocusIndex(0); + act(() => { + instance.openMenuAndSetFocusIndex(0); + }); wrapper.update(); const button = wrapper.find(FakeButton); @@ -93,7 +100,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should not render child menu when menu is closed', () => { - const wrapper = shallow( + const wrapper = mount( @@ -105,7 +112,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should correctly render a single child menu with correct props when menu is open', () => { - const wrapper = shallow( + const wrapper = mount( @@ -113,7 +120,9 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - instance.openMenuAndSetFocusIndex(1); + act(() => { + instance.openMenuAndSetFocusIndex(1); + }); wrapper.update(); const menu = wrapper.find(FakeMenu); @@ -126,125 +135,95 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should render TetherComponent with correct props with correct default values', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('attachment')).toEqual('top left'); - expect(wrapper.prop('bodyElement')).toEqual(document.body); - expect(wrapper.prop('classPrefix')).toEqual('dropdown-menu'); - expect(wrapper.prop('targetAttachment')).toEqual('bottom left'); - expect(wrapper.prop('constraints')).toEqual([]); - expect(wrapper.prop('enabled')).toBe(false); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('attachment')).toEqual('top left'); + expect(tetherComponent.prop('renderElementTo')).toEqual(document.body); + expect(tetherComponent.prop('classPrefix')).toEqual('dropdown-menu'); + expect(tetherComponent.prop('targetAttachment')).toEqual('bottom left'); + expect(tetherComponent.prop('constraints')).toEqual([]); + expect(tetherComponent.prop('enabled')).toBe(false); }); test('should render TetherComponent in the body if invalid body element is specified', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ bodyElement: 'foo' }); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('attachment')).toEqual('top left'); - expect(wrapper.prop('bodyElement')).toEqual(document.body); - expect(wrapper.prop('classPrefix')).toEqual('dropdown-menu'); - expect(wrapper.prop('targetAttachment')).toEqual('bottom left'); - expect(wrapper.prop('constraints')).toEqual([]); - expect(wrapper.prop('enabled')).toBe(false); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('attachment')).toEqual('top left'); + expect(tetherComponent.prop('renderElementTo')).toEqual(document.body); + expect(tetherComponent.prop('classPrefix')).toEqual('dropdown-menu'); + expect(tetherComponent.prop('targetAttachment')).toEqual('bottom left'); + expect(tetherComponent.prop('constraints')).toEqual([]); + expect(tetherComponent.prop('enabled')).toBe(false); }); test('should render className in the className is specified', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ className: 'foo' }); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('className')).toEqual('foo'); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('className')).toEqual('foo'); }); test('should render TetherComponent with a specific body element', () => { const bodyEl = document.createElement('div'); - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ bodyElement: bodyEl }); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('attachment')).toEqual('top left'); - expect(wrapper.prop('bodyElement')).toEqual(bodyEl); - expect(wrapper.prop('classPrefix')).toEqual('dropdown-menu'); - expect(wrapper.prop('targetAttachment')).toEqual('bottom left'); - expect(wrapper.prop('constraints')).toEqual([]); - expect(wrapper.prop('enabled')).toBe(false); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('attachment')).toEqual('top left'); + expect(tetherComponent.prop('renderElementTo')).toEqual(bodyEl); + expect(tetherComponent.prop('classPrefix')).toEqual('dropdown-menu'); + expect(tetherComponent.prop('targetAttachment')).toEqual('bottom left'); + expect(tetherComponent.prop('constraints')).toEqual([]); + expect(tetherComponent.prop('enabled')).toBe(false); }); test('should render TetherComponent with correct props when right aligned', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ isRightAligned: true }); - expect(wrapper.prop('attachment')).toEqual('top right'); - expect(wrapper.prop('targetAttachment')).toEqual('bottom right'); - expect(wrapper.prop('enabled')).toBe(false); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('attachment')).toEqual('top right'); + expect(tetherComponent.prop('targetAttachment')).toEqual('bottom right'); + expect(tetherComponent.prop('enabled')).toBe(false); }); test('should render TetherComponent with attachment and targetAttachment props passed in as tetherAttachment and tetherTargetAttachment', () => { const tetherAttachment = 'middle left'; const tetherTargetAttachment = 'middle right'; - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ + isRightAligned: true, + tetherAttachment, + tetherTargetAttachment, + }); - expect(wrapper.prop('attachment')).toEqual(tetherAttachment); - expect(wrapper.prop('targetAttachment')).toEqual(tetherTargetAttachment); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('attachment')).toEqual(tetherAttachment); + expect(tetherComponent.prop('targetAttachment')).toEqual(tetherTargetAttachment); }); test('should render TetherComponent with enabled prop when menu is open', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); - instance.openMenuAndSetFocusIndex(0); + act(() => { + instance.openMenuAndSetFocusIndex(0); + }); wrapper.update(); - expect(wrapper.prop('enabled')).toBe(true); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('enabled')).toBe(true); }); test('should render TetherComponent with scrollParent constraint when constrainToScrollParent=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToScrollParent: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'scrollParent', attachment: 'together', @@ -253,14 +232,10 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should render TetherComponent with window constraint when constrainToScrollParent=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToWindow: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'window', attachment: 'together', @@ -269,14 +244,10 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should render TetherComponent with scrollParent and window constraints when constrainToScrollParent=true and constrainToWindow=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToScrollParent: true, constrainToWindow: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'scrollParent', attachment: 'together', @@ -289,14 +260,10 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should render TetherComponent with window constraints and pinned when constrainToWindowWithPin=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToWindowWithPin: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'window', attachment: 'together', @@ -306,14 +273,10 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should render TetherComponent with window constraints, pinned and scroll parent when constrainToWindowWithPin=true and constrainToScrollParent=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToScrollParent: true, constrainToWindowWithPin: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'scrollParent', attachment: 'together', @@ -329,46 +292,30 @@ describe('components/dropdown-menu/DropdownMenu', () => { describe('openMenuAndSetFocusIndex()', () => { test('should call setState() with correct values', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('setState') - .withArgs({ - isOpen: true, - initialFocusIndex: 1, - }); + sandbox.mock(instance).expects('setState').withArgs({ + isOpen: true, + initialFocusIndex: 1, + }); instance.openMenuAndSetFocusIndex(1); }); }); describe('closeMenu()', () => { test('should call setState() with correct values', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('setState') - .withArgs({ - isOpen: false, - }); + sandbox.mock(instance).expects('setState').withArgs({ + isOpen: false, + }); instance.closeMenu(); }); }); describe('handleButtonClick()', () => { test('should call openMenuAndSetFocusIndex(null) when menu is currently closed', () => { - const wrapper = shallow( + const wrapper = mount( @@ -376,10 +323,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('openMenuAndSetFocusIndex') - .withArgs(null); + sandbox.mock(instance).expects('openMenuAndSetFocusIndex').withArgs(null); wrapper.find(FakeButton).simulate('click', { preventDefault: sandbox.mock(), @@ -393,7 +337,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { stopPropagation: jest.fn(), }; const onMenuClose = jest.fn(); - const wrapper = shallow( + const wrapper = mount( @@ -401,13 +345,15 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - instance.openMenuAndSetFocusIndex(1); + act(() => { + instance.openMenuAndSetFocusIndex(1); + }); wrapper.find(FakeButton).simulate('click', event); expect(event.stopPropagation).toBeCalled(); expect(event.preventDefault).toBeCalled(); - expect(onMenuClose).toBeCalledWith(event); + expect(onMenuClose).toBeCalled(); }); }); @@ -424,7 +370,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }, ].forEach(({ key }) => { test('should call openMenuAndSetFocus(0) when an open keystroke is pressed', () => { - const wrapper = shallow( + const wrapper = mount( @@ -432,10 +378,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('openMenuAndSetFocusIndex') - .withArgs(0); + sandbox.mock(instance).expects('openMenuAndSetFocusIndex').withArgs(0); wrapper.find(FakeButton).simulate('keydown', { key, @@ -447,8 +390,15 @@ describe('components/dropdown-menu/DropdownMenu', () => { test('shoud not stop esc propagation if dropdown is closed', () => { const onMenuClose = jest.fn(); - const wrapper = getWrapper({ onMenuClose }); - wrapper.setState({ isOpen: false }); + const wrapper = mount( + + + + , + ); + act(() => { + wrapper.setState({ isOpen: false }); + }); wrapper.find(FakeButton).simulate('keydown', { key: KEYS.escape, @@ -461,8 +411,15 @@ describe('components/dropdown-menu/DropdownMenu', () => { test('should stop esc propagation if dropdown is open', () => { const onMenuClose = jest.fn(); - const wrapper = getWrapper({ onMenuClose }); - wrapper.setState({ isOpen: true }); + const wrapper = mount( + + + + , + ); + act(() => { + wrapper.setState({ isOpen: true }); + }); wrapper.find(FakeButton).simulate('keydown', { key: KEYS.escape, @@ -474,7 +431,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { }); test('should call openMenuAndSetFocus(-1) to last item when "up" is pressed', () => { - const wrapper = shallow( + const wrapper = mount( @@ -482,10 +439,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { ); const instance = wrapper.instance(); - sandbox - .mock(instance) - .expects('openMenuAndSetFocusIndex') - .withArgs(-1); + sandbox.mock(instance).expects('openMenuAndSetFocusIndex').withArgs(-1); wrapper.find(FakeButton).simulate('keydown', { key: 'ArrowUp', @@ -497,12 +451,7 @@ describe('components/dropdown-menu/DropdownMenu', () => { describe('handleMenuClose()', () => { test('should call closeMenu() and focusButton() when called', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); sandbox.mock(instance).expects('closeMenu'); diff --git a/src/components/flyout/Flyout.js b/src/components/flyout/Flyout.js index 0e56a1351d..602f7f4c68 100644 --- a/src/components/flyout/Flyout.js +++ b/src/components/flyout/Flyout.js @@ -488,14 +488,23 @@ class Flyout extends React.Component { } return ( - - {React.cloneElement(overlayButton, overlayButtonProps)} - {isVisible && ( - - {React.cloneElement(overlayContent, overlayProps)} - + ( +
+ {React.cloneElement(overlayButton, overlayButtonProps)} +
)} -
+ renderElement={ref => { + return isVisible ? ( +
+ + {React.cloneElement(overlayContent, overlayProps)} + +
+ ) : null; + }} + /> ); } } diff --git a/src/components/flyout/__tests__/Flyout.test.js b/src/components/flyout/__tests__/Flyout.test.js index 21de997c5a..a82eaee160 100644 --- a/src/components/flyout/__tests__/Flyout.test.js +++ b/src/components/flyout/__tests__/Flyout.test.js @@ -36,6 +36,19 @@ describe('components/flyout/Flyout', () => { FakeOverlay.displayName = 'FakeOverlay'; /* eslint-enable */ + const renderWrapper = (props = {}) => { + return mount( + + + + , + ); + }; + + const findTetherComponent = wrapper => { + return wrapper.findWhere(node => node.prop('renderTarget') && node.prop('renderElement')); + }; + afterEach(() => { sandbox.verifyAndRestore(); }); @@ -64,12 +77,7 @@ describe('components/flyout/Flyout', () => { }); test('should correctly render a single child button with correct props', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); const button = wrapper.find(FakeButton); @@ -83,16 +91,14 @@ describe('components/flyout/Flyout', () => { }); test('should set aria-expanded="true" and aria-controls=overlayID when overlay is visible', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); - wrapper.setState({ - isVisible: true, + act(() => { + wrapper.setState({ + isVisible: true, + }); }); + wrapper.update(); const button = wrapper.find(FakeButton); expect(button.prop('aria-expanded')).toEqual('true'); @@ -112,17 +118,15 @@ describe('components/flyout/Flyout', () => { }); test('should correctly render a single child overlay with correct props when overlay is open', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); - wrapper.setState({ - isVisible: true, + act(() => { + wrapper.setState({ + isVisible: true, + }); }); + wrapper.update(); const overlay = wrapper.find(FakeOverlay); expect(overlay.length).toBe(1); @@ -136,80 +140,60 @@ describe('components/flyout/Flyout', () => { }); test('should render TetherComponent with correct props with correct default values', () => { - const wrapper = shallow( - - - - , - ); - expect(wrapper.is('TetherComponent')).toBe(true); - expect(wrapper.prop('attachment')).toEqual('top left'); - expect(wrapper.prop('targetAttachment')).toEqual('bottom left'); - expect(wrapper.prop('classPrefix')).toEqual('flyout-overlay'); - expect(wrapper.prop('enabled')).toBe(false); + const wrapper = renderWrapper(); + + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.length).toBe(1); + expect(tetherComponent.prop('attachment')).toEqual('top left'); + expect(tetherComponent.prop('targetAttachment')).toEqual('bottom left'); + expect(tetherComponent.prop('classPrefix')).toEqual('flyout-overlay'); + expect(tetherComponent.prop('enabled')).toBe(false); }); test('should render TetherComponent with correct enable prop when overlay is visible', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper(); - wrapper.setState({ - isVisible: true, + act(() => { + wrapper.setState({ + isVisible: true, + }); }); + wrapper.update(); - expect(wrapper.prop('enabled')).toBe(true); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('enabled')).toBe(true); }); test('should render TetherComponent with offset when offset is passed in as a prop', () => { const offset = 'wooot'; - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ offset }); - expect(wrapper.prop('offset')).toEqual(offset); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('offset')).toEqual(offset); }); test('should render TetherComponent with passed in className', () => { const className = 'the-class-name'; - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ className }); - expect(wrapper.prop('classes')).toEqual({ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('classes')).toEqual({ element: `flyout-overlay ${className}`, }); }); test('should render TetherComponent without scrollParent constraint when constrainToScrollParent=false', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToScrollParent: false }); - expect(wrapper.prop('constraints')).toEqual([]); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([]); }); test('should render TetherComponent with window constraint when constrainToWindow=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToWindow: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'scrollParent', attachment: 'together', @@ -222,14 +206,10 @@ describe('components/flyout/Flyout', () => { }); test('should render TetherComponent with window constraint when constrainToWindowWithPin=true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ constrainToWindowWithPin: true }); - expect(wrapper.prop('constraints')).toEqual([ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('constraints')).toEqual([ { to: 'scrollParent', attachment: 'together', @@ -277,13 +257,10 @@ describe('components/flyout/Flyout', () => { }, ].forEach(({ position, offset }) => { test('should set tether offset correctly when offset props is not passed in', () => { - const wrapper = shallow( - - - - , - ); - expect(wrapper.prop('offset')).toEqual(offset); + const wrapper = renderWrapper({ position }); + + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('offset')).toEqual(offset); }); }); }); @@ -313,12 +290,7 @@ describe('components/flyout/Flyout', () => { ])( 'should handle clicks within overlay properly %s', ({ closeOnClick, hasClickableAncestor, shouldCloseOverlay }) => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ closeOnClick }); const instance = wrapper.instance(); act(() => { instance.setState({ @@ -350,12 +322,7 @@ describe('components/flyout/Flyout', () => { let wrapper = null; beforeEach(() => { - wrapper = mount( - - - - , - ); + wrapper = renderWrapper(); instance = wrapper.instance(); }); @@ -403,12 +370,7 @@ describe('components/flyout/Flyout', () => { describe('handleButtonHover()', () => { test('should call openOverlay() when props.openOnHover is true', () => { const event = {}; - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ openOnHover: true }); const instance = wrapper.instance(); setTimeout(() => { @@ -420,12 +382,7 @@ describe('components/flyout/Flyout', () => { test('should not call openOverlay() when props.openOnHover is false', () => { const event = {}; - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ openOnHover: false }); const instance = wrapper.instance(); setTimeout(() => { @@ -437,12 +394,7 @@ describe('components/flyout/Flyout', () => { test('should be able to set custom timeouts for the openOnHover', () => { const timeout = 100; - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ openOnHover: false, openOnHoverDebounceTimeout: timeout }); const instance = wrapper.instance(); setTimeout(() => { @@ -459,12 +411,7 @@ describe('components/flyout/Flyout', () => { describe('handleButtonHoverLeave()', () => { test('should call closeOverlay', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ openOnHover: false }); const instance = wrapper.instance(); @@ -514,32 +461,26 @@ describe('components/flyout/Flyout', () => { }, ].forEach(({ currentIsVisible, isVisibleAfterOverlayClosed }) => { test('should toggle isVisible state when called', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); const event = { preventDefault: sandbox.stub(), }; - instance.setState({ - isVisible: currentIsVisible, + act(() => { + instance.setState({ + isVisible: currentIsVisible, + }); + }); + act(() => { + instance.closeOverlay(event); }); - instance.closeOverlay(event); expect(instance.state.isVisible).toEqual(isVisibleAfterOverlayClosed); }); }); test('should call onClose when closeOverlay gets called', () => { const onClose = sandbox.mock(); - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ onClose }); const instance = wrapper.instance(); const event = { preventDefault: sandbox.stub(), @@ -560,12 +501,7 @@ describe('components/flyout/Flyout', () => { }, ].forEach(({ currentIsVisible, isVisibleAfterOverlayOpened }) => { test('should toggle isVisible state when called', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); const event = { preventDefault: sandbox.stub(), @@ -584,12 +520,7 @@ describe('components/flyout/Flyout', () => { test('should call onOpen when openOverlay gets called', () => { const onOpen = sandbox.mock(); - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ onOpen }); const instance = wrapper.instance(); const event = { preventDefault: sandbox.stub(), @@ -900,12 +831,7 @@ describe('components/flyout/Flyout', () => { }, ].forEach(({ prevIsVisible, currIsVisible, shouldAddEventListener, shouldRemoveEventListener }) => { test('should remove and add event listeners properly', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper({ isVisibleByDefault: prevIsVisible }); const instance = wrapper.instance(); const documentMock = sandbox.mock(document); @@ -940,12 +866,7 @@ describe('components/flyout/Flyout', () => { }, ].forEach(({ isVisible, shouldRemoveEventListener }) => { test('should remove event listeners only when the overlay is visible', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); const documentMock = sandbox.mock(document); @@ -969,12 +890,7 @@ describe('components/flyout/Flyout', () => { describe('handleOverlayClose()', () => { test('should call focusButton() and closeOverlay() when called', () => { - const wrapper = mount( - - - - , - ); + const wrapper = renderWrapper(); const instance = wrapper.instance(); sandbox.mock(instance).expects('focusButton'); @@ -986,14 +902,10 @@ describe('components/flyout/Flyout', () => { describe('isResponsive', () => { test('should have correct className when isResponsive is true', () => { - const wrapper = shallow( - - - - , - ); + const wrapper = renderWrapper({ isResponsive: true }); - expect(wrapper.prop('classes')).toEqual({ + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('classes')).toEqual({ element: `flyout-overlay bdl-Flyout--responsive`, }); }); diff --git a/src/components/footer-indicator/FooterIndicator.scss b/src/components/footer-indicator/FooterIndicator.scss index 485b99d5c7..c67944bd61 100644 --- a/src/components/footer-indicator/FooterIndicator.scss +++ b/src/components/footer-indicator/FooterIndicator.scss @@ -35,3 +35,8 @@ white-space: nowrap; text-overflow: ellipsis; } + +.bdl-FooterIndicator-tooltipTarget { + display: block; + height: 100%; +} diff --git a/src/components/footer-indicator/FooterIndicator.tsx b/src/components/footer-indicator/FooterIndicator.tsx index 2e23315cdf..a28b16ced5 100644 --- a/src/components/footer-indicator/FooterIndicator.tsx +++ b/src/components/footer-indicator/FooterIndicator.tsx @@ -11,7 +11,11 @@ type Props = { const FooterIndicator = ({ indicatorText }: Props) => { return (
- +
diff --git a/src/components/footer-indicator/__tests__/__snapshots__/FooterIndicator.test.tsx.snap b/src/components/footer-indicator/__tests__/__snapshots__/FooterIndicator.test.tsx.snap index 7b9898adda..409da56108 100644 --- a/src/components/footer-indicator/__tests__/__snapshots__/FooterIndicator.test.tsx.snap +++ b/src/components/footer-indicator/__tests__/__snapshots__/FooterIndicator.test.tsx.snap @@ -9,6 +9,7 @@ exports[`feature/footer-indicator/FooterIndicator should render a FooterIndicato constrainToWindow={true} isDisabled={false} position="top-right" + targetWrapperClassName="bdl-FooterIndicator-tooltipTarget" text="abcdefghijklmnopqrstuvwxyz" theme="default" > diff --git a/src/components/media/Media.scss b/src/components/media/Media.scss index e1e211f007..3ac5adbe6e 100644 --- a/src/components/media/Media.scss +++ b/src/components/media/Media.scss @@ -4,6 +4,10 @@ .bdl-Media { display: flex; align-items: flex-start; + + .bdl-DropdownMenu-target { + display: block; + } } // the media content, ie, an avatar diff --git a/src/components/media/MediaMenu.tsx b/src/components/media/MediaMenu.tsx index 3cec436a7e..75f4c510e0 100644 --- a/src/components/media/MediaMenu.tsx +++ b/src/components/media/MediaMenu.tsx @@ -38,7 +38,12 @@ const MediaMenu = ({ intl, ...rest }: MediaMenuProps) => ( - + - + +
Yo Yo Ma diff --git a/src/components/menu/MenuItem.scss b/src/components/menu/MenuItem.scss new file mode 100644 index 0000000000..9a242931bc --- /dev/null +++ b/src/components/menu/MenuItem.scss @@ -0,0 +1,3 @@ +.bdl-MenuItem-radarTarget { + display: block; +} diff --git a/src/components/menu/MenuItem.tsx b/src/components/menu/MenuItem.tsx index afb3c289cf..986e9adb86 100644 --- a/src/components/menu/MenuItem.tsx +++ b/src/components/menu/MenuItem.tsx @@ -4,6 +4,8 @@ import omit from 'lodash/omit'; import RadarAnimation from '../radar'; +import './MenuItem.scss'; + export interface MenuItemProps { /** 'aria-checked' - ARIA attribute for checkbox elements */ 'aria-checked'?: boolean; @@ -68,7 +70,7 @@ class MenuItem extends React.Component { let menuItem =
  • {children}
  • ; if (showRadar) { - menuItem = {menuItem}; + menuItem = {menuItem}; } return menuItem; diff --git a/src/components/menu/__tests__/__snapshots__/MenuItem.test.tsx.snap b/src/components/menu/__tests__/__snapshots__/MenuItem.test.tsx.snap index a0fdee1d64..2195d4b04a 100644 --- a/src/components/menu/__tests__/__snapshots__/MenuItem.test.tsx.snap +++ b/src/components/menu/__tests__/__snapshots__/MenuItem.test.tsx.snap @@ -8,6 +8,7 @@ exports[`components/menu/MenuItem render() should render a RadarAnimation if sho constrainToWindow={true} isShown={true} position="middle-right" + targetWrapperClassName="bdl-MenuItem-radarTarget" >
  • { wrapper.setState({ selectedIndex: 0 }); }); - expect( - wrapper - .find('Pill') - .at(0) - .prop('isSelected'), - ).toBe(true); + expect(wrapper.find('Pill').at(0).prop('isSelected')).toBe(true); }); test('should render hidden pill selection helper', () => { @@ -282,7 +277,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { sandbox.mock(wrapper.find('textarea').getDOMNode()).expects('focus'); - wrapper.simulate('click'); + wrapper.find('.bdl-PillSelector').simulate('click'); }); }); @@ -310,7 +305,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { sandbox.mock(instance).expects('resetSelectedIndex'); sandbox.mock(wrapper.find('textarea').getDOMNode()).expects('focus'); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'Backspace', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -323,7 +318,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = mount( {}} onInput={onInputStub} onRemove={onRemoveStub} value="test" />, ); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'Backspace', preventDefault: sandbox.mock().never(), stopPropagation: sandbox.mock().never(), @@ -336,7 +331,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = mount( , ); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'Backspace', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -350,7 +345,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = mount( , ); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'Backspace', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -360,7 +355,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { test('should not call onRemove() when backspace is pressed and there are no pills and no input value', () => { const wrapper = mount(); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'Backspace', preventDefault: sandbox.mock().never(), stopPropagation: sandbox.mock().never(), @@ -376,7 +371,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { wrapper.setState({ selectedIndex: 1 }); }); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowLeft', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -391,7 +386,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { wrapper.setState({ selectedIndex: 0 }); }); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowLeft', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -411,7 +406,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { sandbox.mock(wrapper.find('[data-testid="pill-selection-helper"]').getDOMNode()).expects('focus'); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowLeft', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -424,7 +419,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = mount( {}} onInput={onInputStub} onRemove={onRemoveStub} value="test" />, ); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowLeft', preventDefault: sandbox.mock().never(), stopPropagation: sandbox.mock().never(), @@ -449,7 +444,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { sandbox.mock(instance).expects('resetSelectedIndex'); sandbox.mock(wrapper.find('textarea').getDOMNode()).expects('focus'); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowRight', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -468,7 +463,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { wrapper.setState({ selectedIndex: 0 }); }); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowRight', preventDefault: sandbox.mock(), stopPropagation: sandbox.mock(), @@ -479,7 +474,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { test('should not prevent default when right arrow is pressed and no pill is selected', () => { const wrapper = mount(); - wrapper.simulate('keyDown', { + wrapper.find('.bdl-PillSelector').simulate('keyDown', { key: 'ArrowRight', preventDefault: sandbox.mock().never(), stopPropagation: sandbox.mock().never(), @@ -494,10 +489,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = shallow( , ); - wrapper - .find('Pill') - .at(0) - .prop('onRemove')(); + wrapper.find('Pill').at(0).prop('onRemove')(); expect(onRemoveStub.calledWith(option, 0)).toBe(true); }); @@ -507,10 +499,7 @@ describe('components/pill-selector-dropdown/PillSelector', () => { const wrapper = shallow( , ); - wrapper - .find('Pill') - .at(0) - .prop('onRemove')(); + wrapper.find('Pill').at(0).prop('onRemove')(); expect(onRemoveStub.calledWith(option, 0)).toBe(true); }); }); diff --git a/src/components/radar/RadarAnimation.scss b/src/components/radar/RadarAnimation.scss index 085282ce67..81ac1265ab 100644 --- a/src/components/radar/RadarAnimation.scss +++ b/src/components/radar/RadarAnimation.scss @@ -117,3 +117,7 @@ $radar-animation-offset: 1px; .radar-animation-element { z-index: $overlay-z-index; } + +.bdl-RadarAnimation-target { + display: inline-block; +} diff --git a/src/components/radar/RadarAnimation.stories.tsx b/src/components/radar/RadarAnimation.stories.tsx index ead426d643..00d195296d 100644 --- a/src/components/radar/RadarAnimation.stories.tsx +++ b/src/components/radar/RadarAnimation.stories.tsx @@ -58,9 +58,11 @@ export const topRight = () => ( ); export const withOffset = () => ( - - - +
    + + + +
    ); export default { diff --git a/src/components/radar/RadarAnimation.tsx b/src/components/radar/RadarAnimation.tsx index a66778471b..685a2f39d3 100644 --- a/src/components/radar/RadarAnimation.tsx +++ b/src/components/radar/RadarAnimation.tsx @@ -1,6 +1,9 @@ import * as React from 'react'; +import classNames from 'classnames'; import uniqueId from 'lodash/uniqueId'; -import TetherComponent from 'react-tether'; +import TetherComponent, { type TetherProps } from 'react-tether'; + +import TetherPosition from '../../common/tether-positions'; import './RadarAnimation.scss'; @@ -18,48 +21,50 @@ export enum RadarAnimationPosition { const positions = { [RadarAnimationPosition.BOTTOM_CENTER]: { - attachment: 'top center', - targetAttachment: 'bottom center', + attachment: TetherPosition.TOP_CENTER, + targetAttachment: TetherPosition.BOTTOM_CENTER, }, [RadarAnimationPosition.BOTTOM_LEFT]: { - attachment: 'top left', - targetAttachment: 'bottom left', + attachment: TetherPosition.TOP_LEFT, + targetAttachment: TetherPosition.BOTTOM_LEFT, }, [RadarAnimationPosition.BOTTOM_RIGHT]: { - attachment: 'top right', - targetAttachment: 'bottom right', + attachment: TetherPosition.TOP_RIGHT, + targetAttachment: TetherPosition.BOTTOM_RIGHT, }, [RadarAnimationPosition.MIDDLE_CENTER]: { - attachment: 'middle center', - targetAttachment: 'middle center', + attachment: TetherPosition.MIDDLE_CENTER, + targetAttachment: TetherPosition.MIDDLE_CENTER, }, [RadarAnimationPosition.MIDDLE_LEFT]: { - attachment: 'middle right', - targetAttachment: 'middle left', + attachment: TetherPosition.MIDDLE_RIGHT, + targetAttachment: TetherPosition.MIDDLE_LEFT, }, [RadarAnimationPosition.MIDDLE_RIGHT]: { - attachment: 'middle left', - targetAttachment: 'middle right', + attachment: TetherPosition.MIDDLE_LEFT, + targetAttachment: TetherPosition.MIDDLE_RIGHT, }, [RadarAnimationPosition.TOP_CENTER]: { - attachment: 'bottom center', - targetAttachment: 'top center', + attachment: TetherPosition.BOTTOM_CENTER, + targetAttachment: TetherPosition.TOP_CENTER, }, [RadarAnimationPosition.TOP_LEFT]: { - attachment: 'bottom left', - targetAttachment: 'top left', + attachment: TetherPosition.BOTTOM_LEFT, + targetAttachment: TetherPosition.TOP_LEFT, }, [RadarAnimationPosition.TOP_RIGHT]: { - attachment: 'bottom right', - targetAttachment: 'top right', + attachment: TetherPosition.BOTTOM_RIGHT, + targetAttachment: TetherPosition.TOP_RIGHT, }, }; export interface RadarAnimationProps { /** A React element to put the radar on */ - children: React.ReactChild; + children: React.ReactElement; /** A CSS class for the radar */ className?: string; + /** Optional class name for the target wrapper element */ + targetWrapperClassName?: string; /** Whether to constrain the radar to the element's scroll parent. Defaults to `false` */ constrainToScrollParent: boolean; /** Whether to constrain the radar to window. Defaults to `true` */ @@ -98,6 +103,7 @@ class RadarAnimation extends React.Component { const { children, className = '', + targetWrapperClassName, constrainToScrollParent, constrainToWindow, position, @@ -127,18 +133,17 @@ class RadarAnimation extends React.Component { 'aria-describedby': this.radarAnimationID, }); - // Typescript defs seem busted for older versions of react-tether - const tetherProps: { - attachment: string; - className?: string; - classPrefix: string; - constraints: {}; - targetAttachment: string; + const tetherProps: Pick< + TetherProps, + 'attachment' | 'targetAttachment' | 'constraints' | 'classPrefix' | 'enabled' + > & { offset?: string; + className?: string; } = { attachment, classPrefix: 'radar-animation', constraints, + enabled: isShown, targetAttachment, }; @@ -151,15 +156,21 @@ class RadarAnimation extends React.Component { } return ( - - {referenceElement} - {isShown && ( -
    + ( +
    + {referenceElement} +
    + )} + renderElement={ref => ( +
    )} - + /> ); } } diff --git a/src/components/radar/__tests__/RadarAnimation.test.tsx b/src/components/radar/__tests__/RadarAnimation.test.tsx index bcd8eabac3..9f66770d5e 100644 --- a/src/components/radar/__tests__/RadarAnimation.test.tsx +++ b/src/components/radar/__tests__/RadarAnimation.test.tsx @@ -1,14 +1,19 @@ import * as React from 'react'; -import { shallow } from 'enzyme'; +import { mount, shallow, ReactWrapper } from 'enzyme'; import RadarAnimation, { RadarAnimationProps, RadarAnimationPosition } from '../RadarAnimation'; describe('components/radar/RadarAnimation', () => { - const getWrapper = (props: {}) => - shallow( + const renderWrapper = (props: Partial & Record = {}) => { + return mount(
    Hello
    , ); + }; + + const findTetherComponent = (wrapper: ReactWrapper) => { + return wrapper.findWhere(node => node.prop('renderTarget') && node.prop('renderElement')); + }; [ { // description: @@ -52,13 +57,17 @@ describe('components/radar/RadarAnimation', () => { }, ].forEach(({ position }) => { test(`should render correctly with ${position} positioning`, () => { - const wrapper = getWrapper({ position } as RadarAnimationProps); + const wrapper = shallow( + +
    Hello
    +
    , + ); expect(wrapper).toMatchSnapshot(); }); }); test('should spread the rest of the props to the radar node', () => { - const wrapper = getWrapper({ + const wrapper = renderWrapper({ 'data-resin-target': 'radaranimation1', }); expect(wrapper.find('.radar').prop('data-resin-target')).toBe('radaranimation1'); @@ -66,44 +75,41 @@ describe('components/radar/RadarAnimation', () => { test('should render with custom offset when provided', () => { const offset = '0 10px'; - const wrapper = getWrapper({ + const wrapper = renderWrapper({ offset, }); - expect(wrapper.prop('offset')).toEqual(offset); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('offset')).toEqual(offset); }); test('should render correctly with tetherElementClassName', () => { expect( - getWrapper({ - tetherElementClassName: 'tether-element-class-name', - }), + shallow( + +
    Hello
    +
    , + ), ).toMatchSnapshot(); }); describe('isShown', () => { test('should be shown when isShown is not provided', () => { - expect( - getWrapper({} as RadarAnimationProps) - .find('.radar') - .exists(), - ).toBe(true); + const wrapper = renderWrapper({}); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('enabled')).toBe(true); }); test('should be shown when isShown is true', () => { - expect( - getWrapper({ isShown: true } as RadarAnimationProps) - .find('.radar') - .exists(), - ).toBe(true); + const wrapper = renderWrapper({ isShown: true }); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('enabled')).toBe(true); }); test('should not be shown when isShown is false', () => { - expect( - getWrapper({ isShown: false } as RadarAnimationProps) - .find('.radar') - .exists(), - ).toBe(false); + const wrapper = renderWrapper({ isShown: false }); + const tetherComponent = findTetherComponent(wrapper); + expect(tetherComponent.prop('enabled')).toBe(false); }); }); @@ -111,7 +117,7 @@ describe('components/radar/RadarAnimation', () => { test.each([true, false])('should only position the tether when shown', isShown => { const positionTetherMock = jest.fn(); - const wrapper = getWrapper({ isShown } as RadarAnimationProps); + const wrapper = renderWrapper({ isShown }); // @ts-ignore: react-tether shenanigans wrapper.instance().tetherRef = { current: { position: positionTetherMock } }; diff --git a/src/components/radar/__tests__/__snapshots__/RadarAnimation.test.tsx.snap b/src/components/radar/__tests__/__snapshots__/RadarAnimation.test.tsx.snap index 9c9e44e7e6..129ecf551b 100644 --- a/src/components/radar/__tests__/__snapshots__/RadarAnimation.test.tsx.snap +++ b/src/components/radar/__tests__/__snapshots__/RadarAnimation.test.tsx.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`components/radar/RadarAnimation should render correctly with bottom-center positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with bottom-left positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with bottom-right positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with middle-center positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with middle-left positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with middle-right positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with tetherElementClassName 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with top-center positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with top-left positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; exports[`components/radar/RadarAnimation should render correctly with top-right positioning 1`] = ` - -
    - Hello -
    -
    -
    -
    -
    - +/> `; diff --git a/src/components/select/Select.js b/src/components/select/Select.js index 93b90e6415..02bd2953c1 100644 --- a/src/components/select/Select.js +++ b/src/components/select/Select.js @@ -63,12 +63,13 @@ const Select = ({ {infoTooltip && ( - - setInfoTooltipIsOpen(!infoTooltipIsOpen)} - > + + setInfoTooltipIsOpen(!infoTooltipIsOpen)}> diff --git a/src/components/sidebar-toggle-button/__tests__/__snapshots__/SidebarToggleButton.test.js.snap b/src/components/sidebar-toggle-button/__tests__/__snapshots__/SidebarToggleButton.test.js.snap new file mode 100644 index 0000000000..978edcc68f --- /dev/null +++ b/src/components/sidebar-toggle-button/__tests__/__snapshots__/SidebarToggleButton.test.js.snap @@ -0,0 +1,397 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`components/sidebar-toggle-button/SidebarToggleButton should render correctly as closed 1`] = ` + + + + } + renderTarget={[Function]} + targetAttachment="middle left" + > +
    + + + +
    +
    +
    +
    +
    +`; + +exports[`components/sidebar-toggle-button/SidebarToggleButton should render correctly as left oriented toggle when closed 1`] = ` + + + + } + renderTarget={[Function]} + targetAttachment="middle right" + > +
    + + + +
    +
    +
    +
    +
    +`; + +exports[`components/sidebar-toggle-button/SidebarToggleButton should render correctly as left oriented toggle when open 1`] = ` + + + + } + renderTarget={[Function]} + targetAttachment="middle right" + > +
    + + + +
    +
    +
    +
    +
    +`; + +exports[`components/sidebar-toggle-button/SidebarToggleButton should render correctly as open 1`] = ` + + + + } + renderTarget={[Function]} + targetAttachment="middle left" + > +
    + + + +
    +
    +
    +
    +
    +`; diff --git a/src/components/text-area/__tests__/TextArea.test.js b/src/components/text-area/__tests__/TextArea.test.js index a71f7cce2d..198abee25d 100644 --- a/src/components/text-area/__tests__/TextArea.test.js +++ b/src/components/text-area/__tests__/TextArea.test.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import { mount, shallow } from 'enzyme'; import TextArea from '../TextArea'; @@ -71,11 +72,8 @@ describe('components/text-area/TextArea', () => { test('should render Tooltip with tetherElementClassName', () => { const className = 'tether-element-class-name'; - const wrapper = shallow(