Skip to content

feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766 - #2012

Merged
bmestrallet merged 6 commits into
feature/ai-contributionfrom
feat/EXO-88766-templates-category-filter
Jul 22, 2026
Merged

feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766#2012
bmestrallet merged 6 commits into
feature/ai-contributionfrom
feat/EXO-88766-templates-category-filter

Conversation

@bmestrallet

Copy link
Copy Markdown
Contributor

Stacked on feat/EXO-88755 (PR #2011). Retarget up the chain as the lower PRs merge.

What this adds

A filter row for the Templates section of the shared "Add a document" drawer, so template lists stay usable as they grow.

  • Category chips — reuses the shared <categories-filter> component (the same flat chip bar the activity stream and Documents app use, from categoryVueComponents): object-type="document", space-id = drive owner, hide-on-empty so it only appears when the drive's templates are actually categorized. Zero new taxonomy code.
  • Search — the standard drawer pattern: a filter icon in the title bar opens a full-width search field with a back arrow (not an inline field), matching the UX used across the product.
  • Both filters run client-side over the already-loaded templates (category via item.categoryIds, compared as strings so number/string ids match; search via name) — no extra backend. The row only surfaces once there are more than 3 templates.

Wiring

The AttachmentApp gatein module now <depends> on categoryVueComponents so the chip component resolves inside the attachment bundle (the Documents portlet already depends on it).

Testing

Built, deployed on a local 7.3.x instance, and live-verified: the category chip bar renders and filters (a real "Company Resources" category narrowed 5 → 1); the top-bar filter icon opens a full-width search that filtered "Budget" → 3 and the back arrow restored the title + cleared the query; category matching confirmed robust to number-vs-string ids. Filters hide for small/uncategorized sets (hide-on-empty + the >3 threshold).

🤖 Generated with Claude Code

@bmestrallet
bmestrallet force-pushed the feat/EXO-88755-documents-templates branch 2 times, most recently from 03adc67 to e15fd04 Compare July 22, 2026 20:48
Base automatically changed from feat/EXO-88755-documents-templates to feature/ai-contribution July 22, 2026 20:49
@bmestrallet
bmestrallet force-pushed the feat/EXO-88766-templates-category-filter branch from ed25939 to 0bea4db Compare July 22, 2026 20:52
@bmestrallet
bmestrallet requested a review from ahamdi July 22, 2026 20:52
bmestrallet and others added 5 commits July 22, 2026 21:53
…ment drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bmestrallet
bmestrallet force-pushed the feat/EXO-88766-templates-category-filter branch from 0bea4db to 7079040 Compare July 22, 2026 20:59
…8768 (#2013)

* EXO-88721: Revamp attachment drive-explorer picker onto /v1/documents API

Rewrite the level-2 "Use existing uploads" picker
(AttachmentsDriveExplorerDrawer) off the legacy ECMS/WCM XML drive
listing onto the modern documents-service /v1/documents JSON API.

- Two-source model: My Documents (userIdentityId) + My Spaces
  (space.identity.id); cloud drives dropped.
- Reuse the mobile FolderTreeViewDrawer for drive/space/folder
  navigation; the panel icon opens it and it auto-expands to the
  current folder (fix a Vuetify v-treeview buildTree crash caused by
  backend children:null on empty leaf folders).
- Reuse documents-breadcrumb with a new global mobile branch
  (fa-angle-left to parent + current folder / drive name).
- Simple list rows (checkbox + icon + name); exo-drawer use-filter
  header search driving server-side query; server-side pagination.
- Reuse Documents list cells via a $root shim on the attachment app.
- Preserve the level-1 emit contract and folder CRUD.
- Scope two leaking documents.css rules (.v-alert__content, .py-10px)
  under .documents-application to avoid bleeding into other portlets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: revamp attachments drawer UX and add dedicated create-document drawer - EXO-88732

Level-1 "Attach files" drawer:
- Empty state: hero drop-zone + secondary tiles (Select from Documents / Create
  a new document); populated state: compact add bar (Upload / Documents / New)
  keeping room for the list.
- Full-drawer drag-and-drop overlay (bound to the drawer body, since exo-drawer
  teleports its panel out of the component root), remove-all with confirm,
  retry-on-failed-upload, and de-dup of the rendered list by (id || uploadId).
- Richer attachment rows: thumbnails, transparent source + location chips,
  and a remove/detach control that shows in both composer and entity-bound modes.

Create document is now a dedicated nested "Add a document" drawer (replacing the
popup menu):
- Doc-type selectable cards (Document/Spreadsheet/Presentation) with hover and a
  primary-ring selected state, keyboard-accessible (role/tabindex/Enter-Space).
- Inline title field + a footer Cancel/Create (Create disabled until a type is
  picked and the title is valid); reuses the existing create / 409 / OnlyOffice
  editor-tab logic; returns to the populated level-1 list on success.
- "Or start from a template" separator + a Templates placeholder empty-state
  (scaffold for a future templates backend).

Level-2 drive picker:
- Explicit back arrow returning to level-1.
- Ship the breadcrumb root label keys in the attachments bundle so they resolve
  on host pages (notes/task/news editors) that do not load the Documents bundle.

UI polish: shadow + light-grey tile hover (kept border), larger top margin, and
FA5-safe icons throughout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: Drive "+ New" menu — Upload item + shared "Add a document" drawer - EXO-88752

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: document templates in the shared "Add a document" drawer - EXO-88755

Make the scaffolded Templates section of the shared create-document drawer
real, entirely in the documents repo and reusing existing components.

- Source = the "Templates" folder (by convention) at the current drive's docs
  root, resolved per context (space identity in a space, user identity in
  personal) via GET /v1/documents; its files are listed and rendered.
- Cards REUSE the Documents-app grid card (documents-item-card) for the
  thumbnail preview + hover title/info bar, registered into the attachment
  bundle via initComponents.js. Real thumbnails come for free.
- Card click copies the template node into the current target folder
  (POST /v1/documents/duplicate, destinationId resolved from the drive-root
  relative path via the breadcrumb endpoint) then behaves like blank-create:
  attachment-list add / Drive refresh, and OnlyOffice open only for office
  document types (PDF/image templates are copied but not opened, avoiding an
  editor error).
- The card's hover info icon opens the existing document-info-drawer.
- Visibility: the Templates section is always shown; when the folder is
  absent/empty a neutral, context word-swapped placeholder is displayed
  (new i18n keys in attachments_en.properties).

No backend changes: reuses /v1/documents list + /v1/documents/duplicate +
/v1/documents/breadcrumb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: rename Drive Import to Mass Import with archive icon - EXO-88752

The '+ New' menu 'Import' entry (zip mass import) is renamed 'Mass Import' and
uses a distinct 'far fa-file-archive' icon (was the same fa-upload as the Upload
entry). i18n via the existing documents.label.zip.upload key; desktop + mobile
menus both updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: templates drawer — name-first create, full-width cards, folder bootstrap, symlink templates - EXO-88755

Follow-up polish on the shared Add-a-document drawer's Templates section:

- Name-first create (option B): clicking a template card selects it (primary ring)
  and reveals an editable title field right under that card, pre-filled with the
  template's base name; the footer Create commits it with that name.
- Full-width, stacked template cards (were fixed-width side-by-side).
- Readable card hover band: the reused Documents card's title band rendered white
  in the drawer (theme --allPagesMaskColor + a nested white v-card hid the white
  file name); force the activity-stream grey and make the inner name card
  transparent, teleport-proof selectors.
- Collision-safe create: copy the template into the target folder, re-fetch the
  created node for a valid (openable) id, and fall back to a dedupe-safe in-place
  duplicate on the JCR 'same name sibling' 500 — no backend change.
- Bootstrap (A): when the Templates folder is missing and the user can edit the
  drive root, offer a one-click 'Create a Templates folder'; context-aware empty
  states otherwise.
- Global/other-space templates via symlinks (B): copy the symlink target
  (sourceID) so the new doc holds real content; filter symlinks whose target the
  viewer can't read.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: create-from-template targets the copy by id-diff, not by name - EXO-88755

The created copy was located by name (name === template.name). When the backend
de-duplicated a clashing name to 'name (1)', that match instead picked the source
template, so the option-B rename hit the template's id — renaming/consuming the
source and 503-ing (JCR refuses to rename a node OnlyOffice has open).

Fix: snapshot the destination folder's file ids before the copy (listFolderFileIds)
and pick the one new id afterwards (findNewCopy). The rename now targets the actual
copy (a fresh, unopened node). Verified live in the collision scenario: copy id != template id, rename 200, source template preserved; symlink templates also copy their target into a real file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768

Add exo-drawer's built-in header filter (use-filter -> filter icon -> full-width
search) to the shared FolderTreeViewDrawer, wired to the tree's existing
searchDrives(query) via the 'search-drives' event (the same event DocumentsMain
already emits) — searches the user's spaces server-side, resets on empty. Add a
back arrow in the title for consistency with the other level-2 drawers (closes the
nav drawer, revealing the explorer/list underneath). Shared component, so it
benefits both the Documents mobile nav and the attachment drive explorer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: wire the Folder tree filter to v-treeview's native search - EXO-88768

The filter was emitting 'search-drives', but that event's handler (searchDrives)
lives on the desktop side-panel component (FolderTreeView), which isn't mounted
when the drawer is used — so typing did nothing. Instead feed the filter text into
v-treeview's built-in :search: added a 'search' prop to TreeView (document-tree-view)
and bound the drawer's filter to it, filtering the loaded tree (drives + expanded
folders) by name client-side.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bmestrallet
bmestrallet merged commit fa7a76e into feature/ai-contribution Jul 22, 2026
1 check passed
@bmestrallet
bmestrallet deleted the feat/EXO-88766-templates-category-filter branch July 22, 2026 21:02
bmestrallet added a commit that referenced this pull request Jul 28, 2026
…ment drawer - EXO-88766 (#2012)

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768 (#2013)

* EXO-88721: Revamp attachment drive-explorer picker onto /v1/documents API

Rewrite the level-2 "Use existing uploads" picker
(AttachmentsDriveExplorerDrawer) off the legacy ECMS/WCM XML drive
listing onto the modern documents-service /v1/documents JSON API.

- Two-source model: My Documents (userIdentityId) + My Spaces
  (space.identity.id); cloud drives dropped.
- Reuse the mobile FolderTreeViewDrawer for drive/space/folder
  navigation; the panel icon opens it and it auto-expands to the
  current folder (fix a Vuetify v-treeview buildTree crash caused by
  backend children:null on empty leaf folders).
- Reuse documents-breadcrumb with a new global mobile branch
  (fa-angle-left to parent + current folder / drive name).
- Simple list rows (checkbox + icon + name); exo-drawer use-filter
  header search driving server-side query; server-side pagination.
- Reuse Documents list cells via a $root shim on the attachment app.
- Preserve the level-1 emit contract and folder CRUD.
- Scope two leaking documents.css rules (.v-alert__content, .py-10px)
  under .documents-application to avoid bleeding into other portlets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: revamp attachments drawer UX and add dedicated create-document drawer - EXO-88732

Level-1 "Attach files" drawer:
- Empty state: hero drop-zone + secondary tiles (Select from Documents / Create
  a new document); populated state: compact add bar (Upload / Documents / New)
  keeping room for the list.
- Full-drawer drag-and-drop overlay (bound to the drawer body, since exo-drawer
  teleports its panel out of the component root), remove-all with confirm,
  retry-on-failed-upload, and de-dup of the rendered list by (id || uploadId).
- Richer attachment rows: thumbnails, transparent source + location chips,
  and a remove/detach control that shows in both composer and entity-bound modes.

Create document is now a dedicated nested "Add a document" drawer (replacing the
popup menu):
- Doc-type selectable cards (Document/Spreadsheet/Presentation) with hover and a
  primary-ring selected state, keyboard-accessible (role/tabindex/Enter-Space).
- Inline title field + a footer Cancel/Create (Create disabled until a type is
  picked and the title is valid); reuses the existing create / 409 / OnlyOffice
  editor-tab logic; returns to the populated level-1 list on success.
- "Or start from a template" separator + a Templates placeholder empty-state
  (scaffold for a future templates backend).

Level-2 drive picker:
- Explicit back arrow returning to level-1.
- Ship the breadcrumb root label keys in the attachments bundle so they resolve
  on host pages (notes/task/news editors) that do not load the Documents bundle.

UI polish: shadow + light-grey tile hover (kept border), larger top margin, and
FA5-safe icons throughout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: Drive "+ New" menu — Upload item + shared "Add a document" drawer - EXO-88752

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: document templates in the shared "Add a document" drawer - EXO-88755

Make the scaffolded Templates section of the shared create-document drawer
real, entirely in the documents repo and reusing existing components.

- Source = the "Templates" folder (by convention) at the current drive's docs
  root, resolved per context (space identity in a space, user identity in
  personal) via GET /v1/documents; its files are listed and rendered.
- Cards REUSE the Documents-app grid card (documents-item-card) for the
  thumbnail preview + hover title/info bar, registered into the attachment
  bundle via initComponents.js. Real thumbnails come for free.
- Card click copies the template node into the current target folder
  (POST /v1/documents/duplicate, destinationId resolved from the drive-root
  relative path via the breadcrumb endpoint) then behaves like blank-create:
  attachment-list add / Drive refresh, and OnlyOffice open only for office
  document types (PDF/image templates are copied but not opened, avoiding an
  editor error).
- The card's hover info icon opens the existing document-info-drawer.
- Visibility: the Templates section is always shown; when the folder is
  absent/empty a neutral, context word-swapped placeholder is displayed
  (new i18n keys in attachments_en.properties).

No backend changes: reuses /v1/documents list + /v1/documents/duplicate +
/v1/documents/breadcrumb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: rename Drive Import to Mass Import with archive icon - EXO-88752

The '+ New' menu 'Import' entry (zip mass import) is renamed 'Mass Import' and
uses a distinct 'far fa-file-archive' icon (was the same fa-upload as the Upload
entry). i18n via the existing documents.label.zip.upload key; desktop + mobile
menus both updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: templates drawer — name-first create, full-width cards, folder bootstrap, symlink templates - EXO-88755

Follow-up polish on the shared Add-a-document drawer's Templates section:

- Name-first create (option B): clicking a template card selects it (primary ring)
  and reveals an editable title field right under that card, pre-filled with the
  template's base name; the footer Create commits it with that name.
- Full-width, stacked template cards (were fixed-width side-by-side).
- Readable card hover band: the reused Documents card's title band rendered white
  in the drawer (theme --allPagesMaskColor + a nested white v-card hid the white
  file name); force the activity-stream grey and make the inner name card
  transparent, teleport-proof selectors.
- Collision-safe create: copy the template into the target folder, re-fetch the
  created node for a valid (openable) id, and fall back to a dedupe-safe in-place
  duplicate on the JCR 'same name sibling' 500 — no backend change.
- Bootstrap (A): when the Templates folder is missing and the user can edit the
  drive root, offer a one-click 'Create a Templates folder'; context-aware empty
  states otherwise.
- Global/other-space templates via symlinks (B): copy the symlink target
  (sourceID) so the new doc holds real content; filter symlinks whose target the
  viewer can't read.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: create-from-template targets the copy by id-diff, not by name - EXO-88755

The created copy was located by name (name === template.name). When the backend
de-duplicated a clashing name to 'name (1)', that match instead picked the source
template, so the option-B rename hit the template's id — renaming/consuming the
source and 503-ing (JCR refuses to rename a node OnlyOffice has open).

Fix: snapshot the destination folder's file ids before the copy (listFolderFileIds)
and pick the one new id afterwards (findNewCopy). The rename now targets the actual
copy (a fresh, unopened node). Verified live in the collision scenario: copy id != template id, rename 200, source template preserved; symlink templates also copy their target into a real file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768

Add exo-drawer's built-in header filter (use-filter -> filter icon -> full-width
search) to the shared FolderTreeViewDrawer, wired to the tree's existing
searchDrives(query) via the 'search-drives' event (the same event DocumentsMain
already emits) — searches the user's spaces server-side, resets on empty. Add a
back arrow in the title for consistency with the other level-2 drawers (closes the
nav drawer, revealing the explorer/list underneath). Shared component, so it
benefits both the Documents mobile nav and the attachment drive explorer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: wire the Folder tree filter to v-treeview's native search - EXO-88768

The filter was emitting 'search-drives', but that event's handler (searchDrives)
lives on the desktop side-panel component (FolderTreeView), which isn't mounted
when the drawer is used — so typing did nothing. Instead feed the filter text into
v-treeview's built-in :search: added a 'search' prop to TreeView (document-tree-view)
and bound the drawer's filter to it, filtering the loaded tree (drives + expanded
folders) by name client-side.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Jihed525 pushed a commit that referenced this pull request Jul 30, 2026
…ment drawer - EXO-88766 (#2012)

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768 (#2013)

* EXO-88721: Revamp attachment drive-explorer picker onto /v1/documents API

Rewrite the level-2 "Use existing uploads" picker
(AttachmentsDriveExplorerDrawer) off the legacy ECMS/WCM XML drive
listing onto the modern documents-service /v1/documents JSON API.

- Two-source model: My Documents (userIdentityId) + My Spaces
  (space.identity.id); cloud drives dropped.
- Reuse the mobile FolderTreeViewDrawer for drive/space/folder
  navigation; the panel icon opens it and it auto-expands to the
  current folder (fix a Vuetify v-treeview buildTree crash caused by
  backend children:null on empty leaf folders).
- Reuse documents-breadcrumb with a new global mobile branch
  (fa-angle-left to parent + current folder / drive name).
- Simple list rows (checkbox + icon + name); exo-drawer use-filter
  header search driving server-side query; server-side pagination.
- Reuse Documents list cells via a $root shim on the attachment app.
- Preserve the level-1 emit contract and folder CRUD.
- Scope two leaking documents.css rules (.v-alert__content, .py-10px)
  under .documents-application to avoid bleeding into other portlets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: revamp attachments drawer UX and add dedicated create-document drawer - EXO-88732

Level-1 "Attach files" drawer:
- Empty state: hero drop-zone + secondary tiles (Select from Documents / Create
  a new document); populated state: compact add bar (Upload / Documents / New)
  keeping room for the list.
- Full-drawer drag-and-drop overlay (bound to the drawer body, since exo-drawer
  teleports its panel out of the component root), remove-all with confirm,
  retry-on-failed-upload, and de-dup of the rendered list by (id || uploadId).
- Richer attachment rows: thumbnails, transparent source + location chips,
  and a remove/detach control that shows in both composer and entity-bound modes.

Create document is now a dedicated nested "Add a document" drawer (replacing the
popup menu):
- Doc-type selectable cards (Document/Spreadsheet/Presentation) with hover and a
  primary-ring selected state, keyboard-accessible (role/tabindex/Enter-Space).
- Inline title field + a footer Cancel/Create (Create disabled until a type is
  picked and the title is valid); reuses the existing create / 409 / OnlyOffice
  editor-tab logic; returns to the populated level-1 list on success.
- "Or start from a template" separator + a Templates placeholder empty-state
  (scaffold for a future templates backend).

Level-2 drive picker:
- Explicit back arrow returning to level-1.
- Ship the breadcrumb root label keys in the attachments bundle so they resolve
  on host pages (notes/task/news editors) that do not load the Documents bundle.

UI polish: shadow + light-grey tile hover (kept border), larger top margin, and
FA5-safe icons throughout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: Drive "+ New" menu — Upload item + shared "Add a document" drawer - EXO-88752

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: document templates in the shared "Add a document" drawer - EXO-88755

Make the scaffolded Templates section of the shared create-document drawer
real, entirely in the documents repo and reusing existing components.

- Source = the "Templates" folder (by convention) at the current drive's docs
  root, resolved per context (space identity in a space, user identity in
  personal) via GET /v1/documents; its files are listed and rendered.
- Cards REUSE the Documents-app grid card (documents-item-card) for the
  thumbnail preview + hover title/info bar, registered into the attachment
  bundle via initComponents.js. Real thumbnails come for free.
- Card click copies the template node into the current target folder
  (POST /v1/documents/duplicate, destinationId resolved from the drive-root
  relative path via the breadcrumb endpoint) then behaves like blank-create:
  attachment-list add / Drive refresh, and OnlyOffice open only for office
  document types (PDF/image templates are copied but not opened, avoiding an
  editor error).
- The card's hover info icon opens the existing document-info-drawer.
- Visibility: the Templates section is always shown; when the folder is
  absent/empty a neutral, context word-swapped placeholder is displayed
  (new i18n keys in attachments_en.properties).

No backend changes: reuses /v1/documents list + /v1/documents/duplicate +
/v1/documents/breadcrumb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: rename Drive Import to Mass Import with archive icon - EXO-88752

The '+ New' menu 'Import' entry (zip mass import) is renamed 'Mass Import' and
uses a distinct 'far fa-file-archive' icon (was the same fa-upload as the Upload
entry). i18n via the existing documents.label.zip.upload key; desktop + mobile
menus both updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: templates drawer — name-first create, full-width cards, folder bootstrap, symlink templates - EXO-88755

Follow-up polish on the shared Add-a-document drawer's Templates section:

- Name-first create (option B): clicking a template card selects it (primary ring)
  and reveals an editable title field right under that card, pre-filled with the
  template's base name; the footer Create commits it with that name.
- Full-width, stacked template cards (were fixed-width side-by-side).
- Readable card hover band: the reused Documents card's title band rendered white
  in the drawer (theme --allPagesMaskColor + a nested white v-card hid the white
  file name); force the activity-stream grey and make the inner name card
  transparent, teleport-proof selectors.
- Collision-safe create: copy the template into the target folder, re-fetch the
  created node for a valid (openable) id, and fall back to a dedupe-safe in-place
  duplicate on the JCR 'same name sibling' 500 — no backend change.
- Bootstrap (A): when the Templates folder is missing and the user can edit the
  drive root, offer a one-click 'Create a Templates folder'; context-aware empty
  states otherwise.
- Global/other-space templates via symlinks (B): copy the symlink target
  (sourceID) so the new doc holds real content; filter symlinks whose target the
  viewer can't read.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: create-from-template targets the copy by id-diff, not by name - EXO-88755

The created copy was located by name (name === template.name). When the backend
de-duplicated a clashing name to 'name (1)', that match instead picked the source
template, so the option-B rename hit the template's id — renaming/consuming the
source and 503-ing (JCR refuses to rename a node OnlyOffice has open).

Fix: snapshot the destination folder's file ids before the copy (listFolderFileIds)
and pick the one new id afterwards (findNewCopy). The rename now targets the actual
copy (a fresh, unopened node). Verified live in the collision scenario: copy id != template id, rename 200, source template preserved; symlink templates also copy their target into a real file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768

Add exo-drawer's built-in header filter (use-filter -> filter icon -> full-width
search) to the shared FolderTreeViewDrawer, wired to the tree's existing
searchDrives(query) via the 'search-drives' event (the same event DocumentsMain
already emits) — searches the user's spaces server-side, resets on empty. Add a
back arrow in the title for consistency with the other level-2 drawers (closes the
nav drawer, revealing the explorer/list underneath). Shared component, so it
benefits both the Documents mobile nav and the attachment drive explorer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: wire the Folder tree filter to v-treeview's native search - EXO-88768

The filter was emitting 'search-drives', but that event's handler (searchDrives)
lives on the desktop side-panel component (FolderTreeView), which isn't mounted
when the drawer is used — so typing did nothing. Instead feed the filter text into
v-treeview's built-in :search: added a 'search' prop to TreeView (document-tree-view)
and bound the drawer's filter to it, filtering the loaded tree (drives + expanded
folders) by name client-side.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit fa7a76e)
bmestrallet added a commit that referenced this pull request Aug 1, 2026
…ment drawer - EXO-88766 (#2012)

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768 (#2013)

* EXO-88721: Revamp attachment drive-explorer picker onto /v1/documents API

Rewrite the level-2 "Use existing uploads" picker
(AttachmentsDriveExplorerDrawer) off the legacy ECMS/WCM XML drive
listing onto the modern documents-service /v1/documents JSON API.

- Two-source model: My Documents (userIdentityId) + My Spaces
  (space.identity.id); cloud drives dropped.
- Reuse the mobile FolderTreeViewDrawer for drive/space/folder
  navigation; the panel icon opens it and it auto-expands to the
  current folder (fix a Vuetify v-treeview buildTree crash caused by
  backend children:null on empty leaf folders).
- Reuse documents-breadcrumb with a new global mobile branch
  (fa-angle-left to parent + current folder / drive name).
- Simple list rows (checkbox + icon + name); exo-drawer use-filter
  header search driving server-side query; server-side pagination.
- Reuse Documents list cells via a $root shim on the attachment app.
- Preserve the level-1 emit contract and folder CRUD.
- Scope two leaking documents.css rules (.v-alert__content, .py-10px)
  under .documents-application to avoid bleeding into other portlets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: revamp attachments drawer UX and add dedicated create-document drawer - EXO-88732

Level-1 "Attach files" drawer:
- Empty state: hero drop-zone + secondary tiles (Select from Documents / Create
  a new document); populated state: compact add bar (Upload / Documents / New)
  keeping room for the list.
- Full-drawer drag-and-drop overlay (bound to the drawer body, since exo-drawer
  teleports its panel out of the component root), remove-all with confirm,
  retry-on-failed-upload, and de-dup of the rendered list by (id || uploadId).
- Richer attachment rows: thumbnails, transparent source + location chips,
  and a remove/detach control that shows in both composer and entity-bound modes.

Create document is now a dedicated nested "Add a document" drawer (replacing the
popup menu):
- Doc-type selectable cards (Document/Spreadsheet/Presentation) with hover and a
  primary-ring selected state, keyboard-accessible (role/tabindex/Enter-Space).
- Inline title field + a footer Cancel/Create (Create disabled until a type is
  picked and the title is valid); reuses the existing create / 409 / OnlyOffice
  editor-tab logic; returns to the populated level-1 list on success.
- "Or start from a template" separator + a Templates placeholder empty-state
  (scaffold for a future templates backend).

Level-2 drive picker:
- Explicit back arrow returning to level-1.
- Ship the breadcrumb root label keys in the attachments bundle so they resolve
  on host pages (notes/task/news editors) that do not load the Documents bundle.

UI polish: shadow + light-grey tile hover (kept border), larger top margin, and
FA5-safe icons throughout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: Drive "+ New" menu — Upload item + shared "Add a document" drawer - EXO-88752

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: document templates in the shared "Add a document" drawer - EXO-88755

Make the scaffolded Templates section of the shared create-document drawer
real, entirely in the documents repo and reusing existing components.

- Source = the "Templates" folder (by convention) at the current drive's docs
  root, resolved per context (space identity in a space, user identity in
  personal) via GET /v1/documents; its files are listed and rendered.
- Cards REUSE the Documents-app grid card (documents-item-card) for the
  thumbnail preview + hover title/info bar, registered into the attachment
  bundle via initComponents.js. Real thumbnails come for free.
- Card click copies the template node into the current target folder
  (POST /v1/documents/duplicate, destinationId resolved from the drive-root
  relative path via the breadcrumb endpoint) then behaves like blank-create:
  attachment-list add / Drive refresh, and OnlyOffice open only for office
  document types (PDF/image templates are copied but not opened, avoiding an
  editor error).
- The card's hover info icon opens the existing document-info-drawer.
- Visibility: the Templates section is always shown; when the folder is
  absent/empty a neutral, context word-swapped placeholder is displayed
  (new i18n keys in attachments_en.properties).

No backend changes: reuses /v1/documents list + /v1/documents/duplicate +
/v1/documents/breadcrumb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: rename Drive Import to Mass Import with archive icon - EXO-88752

The '+ New' menu 'Import' entry (zip mass import) is renamed 'Mass Import' and
uses a distinct 'far fa-file-archive' icon (was the same fa-upload as the Upload
entry). i18n via the existing documents.label.zip.upload key; desktop + mobile
menus both updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: templates drawer — name-first create, full-width cards, folder bootstrap, symlink templates - EXO-88755

Follow-up polish on the shared Add-a-document drawer's Templates section:

- Name-first create (option B): clicking a template card selects it (primary ring)
  and reveals an editable title field right under that card, pre-filled with the
  template's base name; the footer Create commits it with that name.
- Full-width, stacked template cards (were fixed-width side-by-side).
- Readable card hover band: the reused Documents card's title band rendered white
  in the drawer (theme --allPagesMaskColor + a nested white v-card hid the white
  file name); force the activity-stream grey and make the inner name card
  transparent, teleport-proof selectors.
- Collision-safe create: copy the template into the target folder, re-fetch the
  created node for a valid (openable) id, and fall back to a dedupe-safe in-place
  duplicate on the JCR 'same name sibling' 500 — no backend change.
- Bootstrap (A): when the Templates folder is missing and the user can edit the
  drive root, offer a one-click 'Create a Templates folder'; context-aware empty
  states otherwise.
- Global/other-space templates via symlinks (B): copy the symlink target
  (sourceID) so the new doc holds real content; filter symlinks whose target the
  viewer can't read.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: create-from-template targets the copy by id-diff, not by name - EXO-88755

The created copy was located by name (name === template.name). When the backend
de-duplicated a clashing name to 'name (1)', that match instead picked the source
template, so the option-B rename hit the template's id — renaming/consuming the
source and 503-ing (JCR refuses to rename a node OnlyOffice has open).

Fix: snapshot the destination folder's file ids before the copy (listFolderFileIds)
and pick the one new id afterwards (findNewCopy). The rename now targets the actual
copy (a fresh, unopened node). Verified live in the collision scenario: copy id != template id, rename 200, source template preserved; symlink templates also copy their target into a real file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: filter templates by category + top-bar search in the Add-a-document drawer - EXO-88766

Adds a filter row to the drawer's Templates section, reusing the shared
<categories-filter> chip bar (the same flat component the activity stream + Docs
app use, from categoryVueComponents; object-type=document, space-id=drive owner,
hide-on-empty so it only shows when templates are actually categorized). Free-text
search follows the standard drawer pattern — a filter icon in the title bar opens
a full-width search field with a back arrow. Both filters apply client-side over
the already-loaded templates (category via item.categoryIds compared as strings so
number/string ids match; search via name); no extra backend. Filters only surface
once there are enough templates (>3). Wiring: AttachmentApp gatein module now
depends on categoryVueComponents so the chip component resolves in the bundle.
Live-verified: chips render + filter, top-bar search filters + back-arrow restores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: use exo-drawer built-in filter icon + expand in the templates drawer - EXO-88766

Replace the hand-rolled title-bar search with exo-drawer's built-in header
filter (use-filter + filter-placeholder + @filter-updated), so the filter icon
sits at the platform-standard location next to the close button with the standard
glyph/size/margin, and add allow-expand for a full-screen icon to browse templates
more comfortably. The category chip bar stays in the content; both filters remain
client-side over the loaded templates. Live-verified: funnel → inline search
filters (Budget → 3); expand toggles full screen and reveals more category chips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: responsive template grid — multi-column when the drawer is expanded - EXO-88766

Switch the template grid to CSS grid auto-fill (repeat(auto-fill, minmax(240px,
1fr))): one full-width card per row in the normal narrow drawer, flowing to
several columns automatically when the drawer is expanded — purely container-width
driven, no expand-state needed. Live-verified: collapsed = 1/row, expanded = 5/row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: expanded-only category bar + centered side margins + ring radius fix - EXO-88766

- Detect the expanded (full-screen) state via exo-drawer's own @expand-updated
  event (same pattern as App Center's launcher drawer) — no ResizeObserver hack.
- Show the category chip bar only in the expanded view (room for it there).
- Centre the expanded content (max-width 1200, margin-inline auto) so it has left/
  right margins like the notification/favorite drawers instead of edge-to-edge.
- Fix the selected-template ring to the card's own 4px radius so it hugs the
  corners instead of bowing out.
Live-verified: collapsed = no chips / full-width card / ring hugs; expanded =
chips shown, content centred with margins, multi-column, event flips drawerExpanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: template cards always show icon/title/info; fix category back-to-root; hide checkbox+menu - EXO-88766

- Category filter: navigating back to root emits `undefined`, which the filter
  treated as a value (String(undefined)) and matched nothing → no templates. Use
  `!= null` so null/undefined both mean 'no filter' (show all).
- Template cards now use show-details=true so the reused card's title band (file
  icon + name) shows permanently, like the Documents card view, and the info
  button is kept visible without hovering.
- Suppress the docs card-view selection checkbox and 3-dots actions menu on the
  template cards (they make no sense when picking a template); keep the info button.
Live-verified: root shows all; band + info always visible; hover shows no
checkbox/menu; category filter still narrows correctly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: drive search + back arrow in the Folder tree nav drawer - EXO-88768

Add exo-drawer's built-in header filter (use-filter -> filter icon -> full-width
search) to the shared FolderTreeViewDrawer, wired to the tree's existing
searchDrives(query) via the 'search-drives' event (the same event DocumentsMain
already emits) — searches the user's spaces server-side, resets on empty. Add a
back arrow in the title for consistency with the other level-2 drawers (closes the
nav drawer, revealing the explorer/list underneath). Shared component, so it
benefits both the Documents mobile nav and the attachment drive explorer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: wire the Folder tree filter to v-treeview's native search - EXO-88768

The filter was emitting 'search-drives', but that event's handler (searchDrives)
lives on the desktop side-panel component (FolderTreeView), which isn't mounted
when the drawer is used — so typing did nothing. Instead feed the filter text into
v-treeview's built-in :search: added a 'search' prop to TreeView (document-tree-view)
and bound the drawer's filter to it, filtering the loaded tree (drives + expanded
folders) by name client-side.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant