-
Notifications
You must be signed in to change notification settings - Fork 126
Conversation
Implements nextcloud#356: a compact star rating, with hearts and thumbs as alternatives. A linear scale already covers 1..N, but as a row of radio buttons. A rating is the control people expect for "how would you rate this", takes far less width, and reads at a glance in the results. Built from real radio inputs rather than clickable icons, so it stays keyboard navigable and every option is announced with the value it selects. The hit area is a full clickable-area square while the icon itself stays small, since an icon-sized target is awkward to hit on a phone. The hover animation is dropped under prefers-reduced-motion. Configurable from 2 to 10 icons, defaulting to 5. The answer is stored as the plain number, so results and CSV export need no special handling. Validated server-side as a whole number within the configured maximum rather than trusting the client. Rating carries no options, so it is checked on its own rather than as a predefined-option type. No schema change. FormsQuestionType is left alone, matching how linearscale, ranking and color are already handled, so openapi.json is unaffected. Signed-off-by: global-prog <raqeeb@uosamarra.edu.iq>
Codecov Report
✅ All modified and coverable lines are covered by tests.
📢 Thoughts on this report? Let us know!
Chartman123
commented
Sep 11, 2026
@global-prog thanks for the PR :) please add the AI section to the description if you used AI to generate this PR 👍🏻
some comments on the code itself: as this uses mostly the same logic as linear scale questions, we should re-use the existing extraSettings (especially maxOption instead of maxRating) and also the validation logic as far as possible. Rest is looking good from a first glance at it.
Perhaps you could also add a screenshot/recording of how it works to the description so that the @nextcloud/designers could have a look at it without having to build it 👍🏻
A rating is a linear scale that always starts at 1 and is drawn as icons, so it should not carry settings and checks of its own: * its top end is stored as optionsHighest rather than a separate maxRating key, and optionsLowest is refused, since a rating's lowest end is always 1; * the linear scale's bounds on optionsHighest (2 to 10) now apply to it as well. The editor already offered exactly that range, but the server never enforced it; * the range check that validated linear scale answers is moved into one helper that both types call, keeping its message and defaults, so linear scale behaviour is unchanged. Adds tests for the rating's accepted settings and for its answer validation, which the first commit did not have. Signed-off-by: global-prog <raqeeb@uosamarra.edu.iq>
global-prog
commented
Sep 11, 2026
Thanks! Done in the latest commit:
- the rating now stores its top end as
optionsHighestinstead ofmaxRating, and gets the linear scale's bounds on it (2 to 10).optionsLowestis refused, since a rating always starts at 1. - the linear scale's range check is moved into one helper that both types call, with the same message and defaults, so linear scale behaviour is unchanged.
- added tests for the rating's settings and its answer validation.
I've added the AI declaration to the description, and I'll add a screenshot of the editor and the filled-in form there as well.
Uh oh!
There was an error while loading. Please reload this page.
Closes #2608.
Summary
A compact rating question, with stars, hearts or thumbs up, configurable from 2 to 10 icons (default 5).
A linear scale already covers 1..N, but renders as a row of radio buttons. A rating is the control people expect for "how would you rate this", takes far less width, and reads at a glance in the results.
Accessibility
Built from real radio inputs rather than clickable icons, so:
3 of 5) rather than as an unnamed radio--default-clickable-areasquare while the icon itself stays small — an icon-sized target is awkward to hit on a phoneprefers-reduced-motionStorage and validation
The answer is stored as the plain number, so results and CSV export need no special handling.
It is validated server-side as a whole number within the configured maximum rather than trusting the client. A rating carries no options, so it is checked on its own rather than as a predefined-option type.
Scope
maxRatingandratingIconlive in the existingextraSettingsFormsQuestionTypeis deliberately left alone, matching howlinearscale,rankingandcolorare already handled, soopenapi.jsonis unaffectedTesting
npm run lint,npm run stylelintandphp -lcleanmainwith no errorsHappy to adjust the default icon count, the icon set, or drop the hearts/thumbs options if you would rather keep it to stars.
🤖 AI (if applicable)