Skip to content

admin pages sorted by "last updated" by default - #1271

Merged
NGPixel merged 2 commits into
requarks:masterfrom
sbonaime:patch-1
Dec 15, 2019
Merged

NGPixel merged 2 commits into
requarks:masterfrom
sbonaime:patch-1

Conversation

@sbonaime

@sbonaime sbonaime commented Nov 28, 2019 •

Copy link
Copy Markdown
Contributor

admin pages sorted by "last updated" by default.
#1270

@sbonaime sbonaime changed the title admin pages sorted by "last updated" by default. Creator and last Edi… admin pages sorted by "last updated" by default Dec 2, 2019
@NGPixel
NGPixel merged commit 8d735c2 into requarks:master Dec 15, 2019
jionggyu pushed a commit to jionggyu/wiki-2.5.302-patch that referenced this pull request Jul 9, 2024
* admin pages sorted by "last updated" by default. Creator and last Editor now in the table

requarks#1270

* Sort by 'Last Updated' by default
dylan-hart added a commit to dylan-hart/wiki that referenced this pull request Aug 24, 2026
…s section (requarks#1260, requarks#1264, requarks#1266) (#5)

* Backend: raw total-count queries alongside unique counts (requarks#1269)

countsForGraph() and contributorCountsForGraph() now compute a
sibling raw count(*) figure per window/clientType and per/via,
additive alongside the existing distinct counts, threaded through
assembleGraph, GraphNode and the graph API schemas. Contributor
totals are deliberately not filtered to surviving authors -- a
since-deleted account's edits still count as real history rows,
unlike the unique-contributor figures.

Verified against a real Postgres 17 container (DATABASE_URL-gated
DB-backed suites pass alongside the pure-unit graph.test.ts).

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* Add tri-state indeterminate support to WCheckbox (OpenProject requarks#1271)

Adds an `indeterminate` prop that renders the standard dash/mixed glyph,
visually distinct from both checked and unchecked, with aria-checked="mixed"
for accessibility. Purely visual: the click handler still emits its usual
boolean flip, leaving the parent to decide what a click on an indeterminate
checkbox means -- the PAT scope tree (requarks#1272) uses this to select all
children on click, the standard tri-state convention.

* Rebuild PAT scope field as verb-grouped tri-state tree (OpenProject requarks#1272)

Replaces the flat `w-select multiple use-chips` scope field in both
ApiKeyCreateDialog.vue and ProfileApiKeyCreateDialog.vue with
ApiKeyScopePicker.vue: a two-level tree, one tri-state group node per verb
(access/manage/read/write/delete/review) that selects/deselects every scope
under it in one click, with independently-checkable scopes nested under an
expandable/collapsible group body. The wire shape (a flat array of scope
strings) is unchanged -- this is a picker UX change only.

Sources the scope list from one shared place (helpers/apiKeyScopes.js)
instead of the two independently hand-maintained literals that existed
before, and closes the gap against backend ALL_PERMISSIONS by adding the 4
scopes the frontend list was missing: read:users, read:groups,
manage:glossary, manage:classification.

* Frontend: Unique/Total sizing toggle, drop Uniform mode (requarks#1270)

Adds a "Count" Unique/Total toggle next to "Size by" that
radiusFor()/collideRadiusFor()/the hover tooltip all read through
contributorCountFor()/pageviewCountFor(), backed by requarks#1269's new
total fields. Drops the "Uniform" sizing option entirely -- sizeBy
now defaults to (and the tracking-disabled watcher falls back to)
'edits' instead. Relabels "Edit volume"/"Page visits" to
"Edits"/"Visits".

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* Add features.showOtherGroups site setting (task 1273)

Admin toggle in AdminGeneral.vue's Features card, backed by a new
features.showOtherGroups key (default false) in both site default-config
blocks in models/sites.ts and the sites API schema. Off by default, since
this eventually names every group's identity to any logged in user.

* Return non-member groups from GET /profile/groups (task 1274)

Gated on the caller's site having features.showOtherGroups enabled: off,
the response is exactly the pre-existing plain array; on, it becomes
{ groups, otherGroups } -- id+name only, resolved via the new
users.getNonMemberGroups() model method. The gate is enforced server-side
(never fetch-then-hide), preserving the route's no-read:groups design.

* Add subdued Other Groups section to profile Groups tab (task 1275)

Renders only when GET /profile/groups includes a non-empty otherGroups
list. Styled subdued per project convention: opacity-60 on the row content
(AdminApprovals.vue's disabled-rule pattern) and a grey avatar instead of
secondary (AdminGroups.vue's muted-state convention) -- informational
only, no click affordance.

* Final review fixes: parallelize independent queries, use es-toolkit groupBy

- graph.ts / pageHistory.ts / users.ts: three sequential-await sites where
  each query only depends on siteId/userId (not on each other) now run
  concurrently via Promise.all, cutting graph-load and profile-groups
  latency roughly 2-3x.
- apiKeyScopes.js: groupScopesByVerb() now uses es-toolkit's groupBy
  instead of a hand-rolled Map loop, per this repo's "use es-toolkit, not
  a hand-rolled equivalent" convention.

Found by the final code-review pass over this iteration's merged diff.

---------

Co-authored-by: Claude Sonnet 5 <[email protected]>
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.

2 participants