* chore: Replace lodash with es-toolkit
Migrate all direct lodash imports to es-toolkit/compat for a smaller,
faster, lodash-compatible utility library. Transitive lodash usage from
other packages remains unchanged.
* fix: Restore isPlainObject semantics in CanCan policy
The lodash migration aliased `isObject` to `lodash/isPlainObject` and
the codemod incorrectly mapped the local name to es-toolkit's `isObject`,
which also returns true for arrays and functions. This caused condition
objects in policy definitions to be skipped, breaking authorization
checks across the codebase.
* fix: Restore unicode-aware length counting in validators
es-toolkit/compat's size() returns string.length, while lodash's _.size()
counts unicode code points. Switch to [...value].length to preserve the
previous behavior so multi-byte characters like emoji count as one.
* base context menu
* extract document actions to `useDocumentMenuAction` hook
* context menu for DocumentListItem
* common menu component
* use Menu in dropdown and context
* menu context
* remove DropdownMenu and ContextMenu primitives
* update yarn.lock
* permissions recent bug fix
* works without custom items in menu
* tooltip support for dropdown button
* fix: menu goes out of bounds
* custom node, lazy render menu for perf
* bug fixes
* fix: useTemplateActions re-computed templates on every render
* fix: hide subscribe/unsubscribe for inactive documents & collections
* cleanup `MenuContext` & `useTemplateMenuItems`
* rename prop, increase dropdown max-height
* jsdoc
* Update Switch component onChange handler to use boolean callback
- Remove synthetic event handling from Switch component
- Update onChange signature to (checked: boolean) => void
- Update all call points across the codebase:
- PublicAccess.tsx: Updated handlers for indexing, showLastModified, and published switches
- Security.tsx: Created individual handlers for all security preferences
- Preferences.tsx: Created individual handlers for user preferences
- CollectionForm.tsx: Added createSwitchRegister helper for react-hook-form compatibility
- TemplatizeDialog: Updated publish handler
- DocumentMenu.tsx: Added handlers for embeds and full-width toggles
- Search.tsx: Updated SearchTitlesFilter handler
- Application.tsx: Added createSwitchRegister helper
- Details.tsx: Updated public branding handler
- Features.tsx: Created individual handlers for seamless edit and commenting
- OAuthClientForm.tsx: Added createSwitchRegister helper
- Maintained backward compatibility with react-hook-form
- Improved type safety and code clarity
* Fix ESLint floating promise errors
- Add void operator to onChange call in CollectionForm.tsx
- Add void operator to document.save call in DocumentMenu.tsx
These changes fix the @typescript-eslint/no-floating-promises errors
while maintaining the existing functionality.
* Fix Switch component onChange handlers in remaining files
- Updated DocumentCopy.tsx handlers to use boolean parameter
- Updated Notifications.tsx to use closure pattern for event types
- Updated SlackListItem.tsx to use closure pattern for event names
- All TypeScript errors resolved
* Refactor createSwitchRegister into utils/forms
- Created shared utility function in app/utils/forms.ts
- Removed duplicate implementations from CollectionForm, Application, and OAuthClientForm
- Updated all usage points to use the shared utility
- Improved TypeScript typing with Record<string, unknown>
- Fixed imports and removed unused variables
- Maintained existing functionality while reducing code duplication
* Fix TypeScript errors in createSwitchRegister utility
- Updated generic constraint from Record<string, unknown> to FieldValues
- Added Path import from react-hook-form for proper type safety
- Fixed parameter type from keyof TFormData to Path<TFormData>
- Improved type compatibility with react-hook-form's UseFormRegister
Resolves TypeScript compilation errors in CI pipeline.
* Remove unnecessary handlePublishChange callbacks
- Removed handlePublishChange wrapper in DocumentCopy.tsx
- Removed handlePublishChange wrapper in TemplatizeDialog/index.tsx
- Updated Switch components to use setPublish directly
- Simplified code by leveraging boolean callback from Switch component
Since Switch now passes boolean directly, no need for intermediate callbacks.
* Address review feedback: simplify callbacks and fix fullWidth behavior
1. DocumentCopy.tsx:
- Remove handleRecursiveChange callback wrapper
- Use setRecursive directly with Switch component
2. DocumentMenu.tsx:
- Add void user.save() to persist user preference
- Add document.fullWidth = checked for optimistic update behavior
Both changes leverage the boolean callback from Switch component properly.
* Update Security.tsx
* i18n
---------
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
* Fix issue #8026: Prevent multiple context menus from being open simultaneously
- Created useCoordinatedMenuState hook that wraps Reakit's useMenuState
- Enhanced MenuProvider with menu registry and coordination logic
- Expanded MenuProvider scope to wrap entire application
- Updated key menu components to use coordinated menu state:
- DocumentMenu
- Template (SubMenu)
- FilterOptions
- AccountMenu
- CollectionMenu
- Ensures only one context menu can be open at a time
- Maintains existing Reakit integration and component structure
* Update all imports, add lint rule
* Update to named export
* fix: Sidebar still needs separate MenuProvider to track isOpen within
* fix: Cannot directly open a menu with another open
---------
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
* feat: Collection subscription
* refactor to use latest impl
* load subscriptions only once
* tests, type rename, migration index
* all users in publish flow
* tsc
* remove SubscriptionType.Collection enum
* review
* fix: loading of doc policies should be delayed until menu is opened
* fix: fetch upon hover and display menu only when data is loaded
* fix: remove documents.isFetching
* fix: wait for policies to load
* fix: bifurcate
* fix: className is never used at any callsite of
* fix: MenuContext
* fix: collection is derived from document
* fix: mount MenuContent only when button is clicked
* fix: jsdoc
* fix: aria-label
* fix: review
* Split permissions for reading documents from updating collection
* fix: Admins should have collection read permission, tests
* tsc
* Add admin option to permission selector
* Combine publish and create permissions, update -> createDocuments where appropriate
* Plural -> singular
* wip
* Quick version of collection structure loading, will revisit
* Remove documentIds method
* stash
* fixing tests to account for admin creation
* Add self-hosted migration
* fix: Allow groups to have admin permission
* Prefetch collection documents
* fix: Document explorer (move/publish) not working with async documents
* fix: Cannot re-parent document to collection by drag and drop
* fix: Cannot drag to import into collection item without admin permission
* Remove unused isEditor getter
* fix: Margin on floating toolbar
fix: Flash of toolbar on wide screens
* fix: Nesting of comment marks
* fix: Post button not visible when there is a draft comment, makes it look like the comment is saved
fix: Styling of link editor results now matches other menus
fix: Allow small link editor in comments sidebar
* fix: Cannot use arrow keys to navigate suggested links
Added animation to link suggestions
Added mixin for text ellipsis
* fix: Link input appears non-rounded when no creation option
* Accidental removal
* fix: New threads attached to previous as replies
* fix: Cannot use floating toolbar properly in comments
* perf: Avoid re-writing history on click in editor
* fix: Comment on text selection
* fix: 'Copy link' on comments uses wrong hostname
* Show comment buttons on input focus rather than non-empty input
Increase maximum sidebar size
* Allow opening comments from document menu
* fix: Clicking comment menu should not focus thread