The "Shared by" column in Shared with me could not be sorted. It now sorts
A to Z (Z to A on a second click) by all sharers' names in alphabetical
order, the same rule as "Shared with", so items shared by several people
stay in a stable place while the avatars keep their current order. Sorting
by "Shared with" also no longer reorders that column's avatars.
Signed-off-by: Gaurav Soni <sonigaurav119@gmail.com>
The packages are now published from owncloud/ocis, but their repository
and homepage fields still referenced owncloud/web. npm trusted publishing
requires repository.url to exactly match the publishing repository, and
the first publish attempt (tsconfig 0.0.7) failed with a 404.
Also disable setup-node package manager caching in the release workflow,
as recommended for release builds.
Signed-off-by: Lukas Hirt <info@hirt.cz>
The 'unstructured collection of testable space interactions' test runs about 80 UI steps across two spaces and takes ~150s of its 180s budget, so slow CI runners made it time out. Mark it with test.slow(), as done for the other long journeys.
Signed-off-by: Lukas Hirt <info@hirt.cz>
* feat: final removal of any docs related content
* docs: fixes from codereview
* chore: remove dead protoc-gen-doc references, drop stale buf.gen.yaml warning
The buf.gen.yaml warning comment is incorrect: the bare plugin paths are
intentional, resolved at build time by the symlink protoc-deps creates via
`bingo get -l` before buf generate ever runs.
Removing the doc plugin block left protoc-gen-doc dead: nothing generates
with it anymore, but protoc-deps still installed/symlinked it and its
.bingo lock files were still committed.
See: https://github.com/owncloud/ocis/pull/13165#issuecomment-6218074157
---------
Co-authored-by: Michal Klos <michal.klos@kiteworks.com>
Scrolling inside an app such as OnlyOffice could make the whole page bounce
with it, exposing the blank page background behind the app frame. Set
overscroll-behavior-y: none on the root element while AppWrapper is mounted
and restore the previous value on unmount. The logic lives in a new
useDisableRootOverscroll composable, which is covered by unit tests.
Signed-off-by: Lukas Hirt <info@hirt.cz>
* fix(web): [OCISDEV-1511] refresh files stuck in processing after upload or copy
A postprocessing-finished event that arrives while a folder reload or a
fetch after copy is still in flight is dropped, because the resource is
not in the store yet. The response then adds the resource as processing
and nothing clears it until a page reload.
Remember finished items for a short time and refetch them when they show
up in the store as processing.
* chore: [OCISDEV-1511] add changelog
Save the MFA status after the user is resolved so signed-URL downloads
inherit it, and check its age on read. Build the signing-key URL with
the URL API so it works with the vault base URL.
Remove the "Session expiring" extend/dismiss popup and its expiry
worker. Drop the frontend session_duration capability and config;
OCIS_MFA_SESSION_DURATION stays in use by the proxy.
`requireAcr()`, used by the admin settings route guards, redirected to the
IdP whenever the `acr` did not match, so a user without a second factor
looped forever.
It now uses the same protection as the vault: the step-up carries its
target as OIDC state, and if the IdP answers it without the required
`acr`, `requireAcr()` returns false. The admin settings guards then
redirect to the default view and an error message is shown.
Follow-up to https://github.com/owncloud/ocis/pull/12985, which fixed the same loop for the vault.
Selecting a language dropped focus to the page body and the save
confirmation went unannounced, because the select's own best-effort
refocus raced against the handler's translation reload and network
save. Restore focus explicitly once that work settles, before
announcing the save.
* fix(web): stop redirect loop when vault MFA step-up fails
Signed-off-by: Samuel Schumacher <samuel.schumacher@werkspiel.de>
Signed-off-by: Samuel Schumacher <schumacher@b1-systems.de>
* fix(web): leave vault with a full page load after failed MFA step-up
Returning to `/` in-app kept the vault clients and loaded vault spaces
with the non-MFA token, which ended on the RUNTIME-BOOTSTRAP-040 crash
page. Vault mode is fixed per page load, so reload outside the vault
instead and show the MFA error message after the reload. The spaces
load error handler no longer routes to the crash page while leaving.
Also addresses review feedback:
- use $pgettext with translator context for the error message
- test that an expired user with a fresh marker is still redirected
* fix(web): only treat a vault step-up as failed after the IdP answered it
The step-up marker relied on a 5 minute TTL, so a user who went to the
IdP, pressed back and opened the vault again got the error without ever
seeing the IdP. The step-up request now carries its target as OIDC
state; the sign-in callback picks it up and only the navigation right
after the callback counts as the answer. The sessionStorage marker and
the TTL are gone.
Also addresses review feedback:
- simplify the auth guard check to `redirect !== undefined`
- drop the storage key re-export, the spec imports it from the helper
Signed-off-by: Samuel Schumacher <schumacher@b1-systems.de>
---------
Signed-off-by: Samuel Schumacher <samuel.schumacher@werkspiel.de>
Signed-off-by: Samuel Schumacher <schumacher@b1-systems.de>
* fix(web): [OCISDEV-1478] move combobox role to the focusable input
The combobox role and its ARIA state lived on vue-select's non-focusable
wrapper div, so screen readers never announced the actual input as a
combobox and its accessible name fell back to a generic hardcoded label.
Moves role, aria-expanded, aria-controls, aria-haspopup and
aria-activedescendant to the focusable search input and gives it its own
label.
* fix(web): [OCISDEV-1478] fix CI, drop QuotaSelect's own search slot
It rendered a plain unlabeled input, bypassing OcSelect's accessible
one. That only worked by accident because vue-select's wrapper div
used to carry a fallback label, which the combobox fix removes.
feat(web): adopt Nx as task orchestrator for web/
Introduces Nx on top of the existing pnpm workspace, so lint/typecheck/
test can be scoped to only the projects affected by a change instead of
running against the whole monorepo on every PR.
- Phase 0: add nx (^23.2.1) as a workspace devDependency, nx.json with a
targetDefaults entry for test:unit (cache: true), ignore .nx/cache and
.nx/workspace-data. No behavior change to any existing script.
- Phase 1: register @nx/vitest's inference plugin so every package with
a vitest.config.ts gets a real, cached "test" target read directly
from its own config, not just the packages that happened to already
declare a "test:unit" npm script. Excludes vite.config.common.ts,
the root vite.config.ts and vite.cern.config.ts from the plugin's
default glob - none of them are test configs, and loading them as one
aborts the whole project graph. defaultBase: "master" (bare `nx
affected` defaults to a branch named "main"). testMode: "run" so `nx
run <project>:test` doesn't default to vitest's watch mode locally.
- Phase 2a: register @nx/eslint/plugin for a per-project "lint" target
on every project (root `lint` script untouched).
- Phase 2b: register @nx/vite/plugin's typecheckTargetName for a
per-project "typecheck" target on projects with their own real
vite.config.ts (design-system, web-client, web-pkg, web-test-helpers).
The ~20 web-app-*/web-runtime projects only have a vitest.config.ts
and aren't covered; root `pnpm run check:types` (whole-repo vue-tsc)
stays the one check that covers everything.
- Phase 3 (CI): adds a `full-run` output to detect-web-changes - true for
push to master/stable-* or a `[full-ci]` PR title (unchanged behavior),
false for a normal PR, which instead runs `nx affected -t lint` / `nx
affected -t test --base=<PR base sha>`. Added fetch-depth: 0 to
web-build-test's checkout, needed for `nx affected --base=<sha>` to
find that commit. Check types and the full-run unit-test path
deliberately stay whole-repo (see inline comments for why).
Also:
- removes design-system's broken "lint": "lint:stylelint" alias (needed
the "lint" name free for the new per-project target; it was never
callable as written - "lint:stylelint" isn't a binary - and nothing
called it).
- makes the design system's webfontloader import fire-and-forget so an
in-flight rejection at test teardown doesn't surface as an unhandled
rejection under vitest's per-project runs.
- pin `typescript` via `pnpm.overrides`. Adding nx's own devDependencies
makes pnpm re-resolve the workspace's peer graph, and today's registry
now has a typescript 6.x that some peer ranges accept - without the
pin, half the vue-peer-dependent packages (pinia, vue-router,
vue3-gettext, focus-trap-vue, ...) fork into a second, incompatible
module instance. Same pin as the dependency-cycle fix, for an
unrelated reason; needed independently here since this branch changes
package.json on its own.
nx's `dependsOn: ["^target"]` errors outright on a circular task graph,
so this only works once the pre-existing web-pkg/design-system/
web-test-helpers dependency cycle is fixed - see
fix(web): break web-pkg/design-system/web-test-helpers dependency cycle,
which this PR targets rather than master.
Verified: nx run-many -t test / lint / typecheck succeed for all
projects; nx show projects --affected --files=... resolves correctly for
shared config changes; nx affected -t lint --base=<sha> matches pnpm
lint; root pnpm lint/check:types/check:format/test:unit/build all still
pass unchanged (380 files / 3128 tests).
fix(web): break web-pkg/design-system/web-test-helpers dependency cycle
web-pkg, design-system and web-test-helpers formed a cycle: the mount
helpers have to install the design system (its components are registered
globally) and web-pkg's mocked pinia stores, so web-test-helpers was
imported by both packages that imported it back.
Resolved by layering the helpers onto the packages that already need
them, instead of adding another one:
design-system/testing mount/shallowMount, prop types, design system +
gettext + router-link stub plugins
web-pkg/src/testing the above, extended with casl abilities, mocked
pinia stores and component mocks
web-test-helpers re-export of web-pkg/src/testing
design-system sits at the bottom of the workspace graph, so it cannot
depend on a package that installs it - hence the generic half lives
there. web-pkg composes those plugins rather than duplicating them, so
every helper is still defined exactly once, and no package depends on
one above it.
The public API of `@ownclouders/web-test-helpers` is unchanged, so
external extensions are unaffected.
Also:
- pin `typescript` via `pnpm.overrides` - without it, a second peer-
resolved typescript version forks `vue`, which forks `vue3-gettext`
into two module instances, breaking `inject(GetTextSymbol)` for any
component mounted through these helpers.
- keep `@ownclouders/design-system/testing` external in web-pkg's lib
build. rollup matches `external` strings exactly, so the subpath was
inlined, shipping a second copy of the design system and of
@vue/test-utils into the published bundle - components and wrappers
were then not identity-equal to the consumer's own, and gettext
injection broke.
- name the web-test-helpers umd output `.cjs`. The package is ESM, so the
`.js` file that publishConfig.exports pointed `require` at could not be
required.
Verified: `pnpm install --frozen-lockfile` clean, zero cyclic-workspace
warnings; `pnpm test:unit` 380 files / 3129 tests pass; `pnpm check:types`
0 errors; `pnpm lint`/`check:format` 0 errors; `pnpm build` succeeds;
published artifacts checked by mounting through the built `dist/` bundles
the way an external extension resolves them via publishConfig.exports.
* fix(web): [OCISDEV-1474] keep focus on trigger when dropdown closes
Dropdowns that close on item click removed the clicked item from the
DOM, dropping keyboard focus to the page body and causing screen
readers to re-announce the whole page over any status message the
action triggered. OcDrop now restores focus to its trigger on close,
unless the action already moved focus elsewhere itself.
* fix(web): [OCISDEV-1474] hide trigger tooltip when refocused on close
Restoring focus to the trigger button popped its own tooltip back
open, since tippy's default trigger includes focus. The tooltip then
sat on top of the button and blocked the next click, breaking the
share e2e test. Hide the tooltip right after refocusing.
Toast/status messages (e.g. clipboard copy, file restore) were often
dropped by screen readers because the live region was never cleared
between messages. Clear it before each message and refill after a
short delay so announcements survive focus changes. Toasts themselves
are no longer live regions, since a freshly inserted aria-live node
isn't reliably announced.