* 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.
* Initial plan
* Fix: Hard delete documents from store on permanent deletion
When documents are permanently deleted, they need to be completely
removed from the local MobX store, not just soft-deleted. This change
ensures that after permanent deletion, the document is immediately
removed from the UI without requiring a page reload.
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>
* Fix: Also hard delete documents in emptyTrash method
The emptyTrash method also needs to hard delete documents from the
store after the backend permanently deletes them, not just soft delete.
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>
* Single line sidebar items
* fix: Letter icon in breadcrumb missing letter
Alignment of sidebar items
* fix: Editing state
* fix: Shared sidebar
* fix: Drag over unloaded document in sidebar does not allow drop
* perf
* Sidebar hover background
* Allow click toggle closed
* fix: Disclosure toggle
* perf: Avoid rendering collapsed folders
* 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
* Use `shareLoader` for loading public docs in `documents.info` endpoint
* cleanup sharedCache in documents store
* remove shareId path param for authenticated routes
* require auth in document loader
---------
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
* feat: duplicate a document as draft
* review
* Default `publish` toggle to match current document
Ensures duplicating a draft does not publish it.
---------
Co-authored-by: Tom Moor <tom.moor@gmail.com>
* improv: use statusFilter instead of includeArchive,includeDrafts for document search
* improv: update FilterComponent to add support for multiple selected items
* feat: update document type search ui
* fix test
* Restore support for old parameters to avoid breaking change
---------
Co-authored-by: Tom Moor <tom.moor@gmail.com>