Skip to content

feat: mc options sorting and count#4444

Open
cemreinanc wants to merge 4 commits intomainfrom
feat/4318-mc-options-sorting-and-count
Open

feat: mc options sorting and count#4444
cemreinanc wants to merge 4 commits intomainfrom
feat/4318-mc-options-sorting-and-count

Conversation

@cemreinanc
Copy link
Contributor

@cemreinanc cemreinanc commented Mar 3, 2026

fixes #4318

Summary by CodeRabbit

  • New Features

    • Dynamic option visibility now adapts based on total option count, intelligently grouping lesser-shown options into an "Others" category.
  • Bug Fixes

    • Option labels now consistently truncate to a single line across all display modes.
    • Improved aggregation logic for grouped options in "Others" category with proper value calculations.
  • Refactor

    • Reorganized and consolidated choice handling utilities for improved maintainability.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 3, 2026

📝 Walkthrough

Walkthrough

This PR refactors multiple-choice option visibility and ordering logic by introducing a dynamic visibility function (getEffectiveVisibleCount) that defaults to 4 options but shows all 5 when exactly 5 options exist, consolidates "Others" aggregation into a shared utility, removes hardcoded resolution option promotion, and adds CP reveal time handling across question pages, feed tiles, and chart components.

Changes

Cohort / File(s) Summary
Core Utilities
front_end/src/constants/questions.ts, front_end/src/utils/questions/choices.ts
Added DEFAULT_VISIBLE_CHOICES_COUNT constant and getEffectiveVisibleCount() function for dynamic visibility calculation. Introduced collectSortedTimestamps() and buildChoicesWithOthers() helpers. Extended generateChoiceItemsFromMultipleChoiceForecast() signature with hideCP and cpRevealsOn config options, reworked visibility and ordering control flow using the new helpers.
Question Page Components
front_end/src/app/(main)/questions/[id]/components/group_timeline.tsx, front_end/src/app/(main)/questions/[id]/components/multiple_choices_chart_view/index.tsx, front_end/src/app/(main)/questions/[id]/components/multiple_choices_chart_view/choices_legend/index.tsx
Removed maxVisibleCheckboxes and maxLegendChoices props, replacing with dynamic computation via getEffectiveVisibleCount(). Introduced local state for legend pinning logic and dropdown synchronization. Updated buildChoicesWithOthers() usage for chart rendering.
Detailed Question Card Components
front_end/src/components/detailed_question_card/detailed_group_card/index.tsx, front_end/src/components/detailed_question_card/detailed_question_card/multiple_choice_chart_card.tsx
Replaced getMaxVisibleCheckboxes() with getEffectiveVisibleCount() for visibility calculation. Introduced "Others" aggregation via buildChoicesWithOthers(). Added CP reveal time handling and tooltip generation for aggregated items. Extended choice generation with hideCP and cpRevealsOn parameters.
Post/Feed Components
front_end/src/components/post_card/multiple_choice_tile/index.tsx, front_end/src/components/post_card/multiple_choice_tile/choice_option.tsx, front_end/src/components/post_card/question_tile/index.tsx, front_end/src/components/post_card/group_of_questions_tile/index.tsx, front_end/src/components/consumer_post_card/group_forecast_card/numeric_forecast_card.tsx, front_end/src/components/consumer_post_card/group_forecast_card/percentage_forecast_card.tsx
Replaced hardcoded visibility constants with getEffectiveVisibleCount() computation based on option/question count. Integrated buildChoicesWithOthers() for augmented choice lists. Updated color selection and ordering logic to remove dependency on choiceOrdering. Applied label truncation in tile display.
Removed Legacy Code
front_end/src/components/detailed_question_card/embeds.ts, front_end/src/components/forecast_maker/forecast_maker_multiple_choice.tsx
Deleted getMaxVisibleCheckboxes() and buildEmbedChoicesWithOthers() functions from embeds.ts (migrated logic to centralized utilities). Removed resolution option promotion logic from forecast_maker_multiple_choice.tsx that reordered choices to put resolved option first.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~70 minutes

Possibly related PRs

  • feat: probability sorting option for MC #4303 — Modifies multiple-choice option ordering including CP_DESC handling and overlaps with generateChoiceItemsFromMultipleChoiceForecast and MultipleChoiceOptionsOrder logic.
  • issue/4164/fix/mc-choices-hidden #4283 — Updates CP reveal handling and empty label flow in percentage_forecast_card.tsx, directly related to CP reveal state management changes in this PR.
  • Feat/mc options change #4038 — Modifies multiple-choice choice utilities and visibility logic including buildChoicesWithOthers and generateChoiceItemsFromMultipleChoiceForecast, indicating overlapping code paths.

Suggested reviewers

  • lsabor
  • ncarazon
  • hlbmtc

Poem

🐰 Four choices show, five keep all,
Others aggregate into one small ball,
No more hardcoded sorting tricks—
Dynamic visibility's the fix!
Round your options, the MC now clicks! 🎯

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: mc options sorting and count' clearly and specifically refers to the main changes in the PR: introducing dynamic option count logic and sorting behavior for multiple-choice questions.
Linked Issues check ✅ Passed The PR implements all primary requirements from #4318: dynamic visible count (4 options + other, or all 5 if exactly 5 options), CP-based sorting with order preservation for fixed-order options, option text truncation, and CP hiding logic.
Out of Scope Changes check ✅ Passed All changes are directly scoped to implementing #4318 requirements: visible count logic, sorting behavior, option truncation, and related refactoring. No unrelated modifications detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/4318-mc-options-sorting-and-count

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 3, 2026

🚀 Preview Environment

Your preview environment is ready!

Resource Details
🌐 Preview URL https://metaculus-pr-4444-feat-4318-mc-options-sorting-a-preview.mtcl.cc
📦 Docker Image ghcr.io/metaculus/metaculus:feat-4318-mc-options-sorting-and-count-b58da58
🗄️ PostgreSQL NeonDB branch preview/pr-4444-feat-4318-mc-options-sorting-a
Redis Fly Redis mtc-redis-pr-4444-feat-4318-mc-options-sorting-a

Details

  • Commit: 11fa8a1201a3aca7c1c5177b4df2289d6531926c
  • Branch: feat/4318-mc-options-sorting-and-count
  • Fly App: metaculus-pr-4444-feat-4318-mc-options-sorting-a

ℹ️ Preview Environment Info

Isolation:

  • PostgreSQL and Redis are fully isolated from production
  • Each PR gets its own database branch and Redis instance
  • Changes pushed to this PR will trigger a new deployment

Limitations:

  • Background workers and cron jobs are not deployed in preview environments
  • If you need to test background jobs, use Heroku staging environments

Cleanup:

  • This preview will be automatically destroyed when the PR is closed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
front_end/src/components/post_card/multiple_choice_tile/choice_option.tsx (1)

101-109: Keep the full option text discoverable.

Now that every label is single-line truncated, long options with the same prefix can collapse to the same visible text. Adding a title here keeps the full wording available without changing layout.

📝 Suggested tweak
       <div
+        title={choice}
         className={cn(
           "resize-label min-w-0 flex-1 pr-2.5 text-left text-sm font-normal leading-4",
           "truncate",
           labelClassName
         )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@front_end/src/components/post_card/multiple_choice_tile/choice_option.tsx`
around lines 101 - 109, The label div that renders the option text (in
choice_option.tsx) is truncated and should expose the full text via a title
attribute; update the div that uses cn(...) and renders {choice} to include
title={choice} (or title={`${choice}`} to handle non-strings) so long options
remain discoverable while keeping the single-line layout; reference the rendered
element that currently uses className={cn(...)} and the choice and
labelClassName props when making this change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@front_end/src/app/`(main)/questions/[id]/components/multiple_choices_chart_view/choices_legend/index.tsx:
- Around line 85-89: The legend popover/dropdown still renders full labels for
hidden choices; update the popover item rendering to use the same truncation as
the pinned chips by passing truncateLabel(label || choice, 30) instead of label
|| choice. Locate the popover/dropdown mapping where hidden legend items are
rendered (the code near legendChoices.map / ChoiceCheckbox in
choices_legend/index.tsx) and replace the raw label with truncateLabel(...),
ensuring any component props or keys that display text (e.g., ChoiceCheckbox or
the dropdown item renderer) receive the truncated string.

In
`@front_end/src/components/detailed_question_card/detailed_question_card/multiple_choice_chart_card.tsx`:
- Around line 253-257: The embed path currently uses
buildChoicesWithOthers(choiceItems) which inserts a hardcoded English "Others"
label causing the legend to remain untranslated; update the embed branch in
embedChoiceItems to pass the localized label (reuse the same i18n key/translator
used by the tooltip path) into buildChoicesWithOthers or map the returned
"Others" item label through the component's translator before passing to
MultipleChoiceTile so the legend uses the translated string; reference the
embedChoiceItems constant, buildChoicesWithOthers, and MultipleChoiceTile when
making this change.

In `@front_end/src/utils/questions/choices.ts`:
- Around line 46-66: The code incorrectly assumes all inactive entries share the
same aggregationTimestamps/userTimestamps by using inactive[0] (aggTs, userTs)
and summing aggregationValues[i]/userValues[i]; instead build a unified
timestamp set from all inactive[].aggregationTimestamps and all
inactive[].userTimestamps, create per-entry maps from timestamp->value, and then
compute aggregationValues and userValues by iterating that unified timestamp
list and summing values from each map (using null for missing entries) so
timestamps are aligned across different histories; update the logic that uses
aggTs/userTs, sumNullable, aggregationValues and userValues accordingly and keep
generateChoiceItemsFromGroupQuestions()’s timestamp semantics consistent.
- Around line 201-214: The current isCPHidden branch is mutating item.active to
make the first N definition-order items active, which swaps the selected set;
instead, when isCPHidden (cpRevealsOn or hideCP logic) do not change any
item.active flags — preserve the existing CP-based selected set — and only
adjust presentation order/visible slice if needed; so in the isCPHidden branch
remove the choiceItems.forEach mutation that sets item.active, keep computing
effectiveActiveCount via getEffectiveVisibleCount for presentation purposes, and
return choiceItems (or a reordered/trimmed view) without altering any
item.active properties.

---

Nitpick comments:
In `@front_end/src/components/post_card/multiple_choice_tile/choice_option.tsx`:
- Around line 101-109: The label div that renders the option text (in
choice_option.tsx) is truncated and should expose the full text via a title
attribute; update the div that uses cn(...) and renders {choice} to include
title={choice} (or title={`${choice}`} to handle non-strings) so long options
remain discoverable while keeping the single-line layout; reference the rendered
element that currently uses className={cn(...)} and the choice and
labelClassName props when making this change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e12e446a-3f7e-4fd3-98d2-235ee8440ff4

📥 Commits

Reviewing files that changed from the base of the PR and between 885e759 and b58da58.

📒 Files selected for processing (15)
  • front_end/src/app/(main)/questions/[id]/components/group_timeline.tsx
  • front_end/src/app/(main)/questions/[id]/components/multiple_choices_chart_view/choices_legend/index.tsx
  • front_end/src/app/(main)/questions/[id]/components/multiple_choices_chart_view/index.tsx
  • front_end/src/components/consumer_post_card/group_forecast_card/numeric_forecast_card.tsx
  • front_end/src/components/consumer_post_card/group_forecast_card/percentage_forecast_card.tsx
  • front_end/src/components/detailed_question_card/detailed_group_card/index.tsx
  • front_end/src/components/detailed_question_card/detailed_question_card/multiple_choice_chart_card.tsx
  • front_end/src/components/detailed_question_card/embeds.ts
  • front_end/src/components/forecast_maker/forecast_maker_question/forecast_maker_multiple_choice.tsx
  • front_end/src/components/post_card/group_of_questions_tile/index.tsx
  • front_end/src/components/post_card/multiple_choice_tile/choice_option.tsx
  • front_end/src/components/post_card/multiple_choice_tile/index.tsx
  • front_end/src/components/post_card/question_tile/index.tsx
  • front_end/src/constants/questions.ts
  • front_end/src/utils/questions/choices.ts
💤 Files with no reviewable changes (2)
  • front_end/src/components/detailed_question_card/embeds.ts
  • front_end/src/components/forecast_maker/forecast_maker_question/forecast_maker_multiple_choice.tsx

Comment on lines 253 to +257
const embedChoiceItems = useMemo(() => {
if (!embedMode) return choiceItems;
const othersLabel = "Others";

return buildEmbedChoicesWithOthers(
choiceItems,
maxVisibleCheckboxes,
othersLabel
);
}, [choiceItems, embedMode, maxVisibleCheckboxes]);
return buildChoicesWithOthers(choiceItems);
}, [choiceItems, embedMode]);
Copy link
Contributor

@coderabbitai coderabbitai bot Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Localize the embed "Others" label.

buildChoicesWithOthers() falls back to a hardcoded English label, and this embed path passes that item straight into MultipleChoiceTile, so the legend will show English text in every locale. Reuse the translated label here, like the tooltip path already does.

🌐 Suggested fix
   const embedChoiceItems = useMemo(() => {
     if (!embedMode) return choiceItems;
-
-    return buildChoicesWithOthers(choiceItems);
-  }, [choiceItems, embedMode]);
+    const inactiveCount = choiceItems.filter((c) => !c.active).length;
+    return buildChoicesWithOthers(
+      choiceItems,
+      t("othersCount", { count: inactiveCount })
+    );
+  }, [choiceItems, embedMode, t]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@front_end/src/components/detailed_question_card/detailed_question_card/multiple_choice_chart_card.tsx`
around lines 253 - 257, The embed path currently uses
buildChoicesWithOthers(choiceItems) which inserts a hardcoded English "Others"
label causing the legend to remain untranslated; update the embed branch in
embedChoiceItems to pass the localized label (reuse the same i18n key/translator
used by the tooltip path) into buildChoicesWithOthers or map the returned
"Others" item label through the component's translator before passing to
MultipleChoiceTile so the legend uses the translated string; reference the
embedChoiceItems constant, buildChoicesWithOthers, and MultipleChoiceTile when
making this change.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does embeds have localization implemented? Or are they just EN? check the embed related files outside ofthis pr

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find embed-related files
fd -e tsx -e ts embed --exclude node_modules | grep -v __tests__ | head -30

echo "---"
# Check if embed routes/pages use next-intl or any i18n
rg -n "useTranslations|getTranslations|NextIntlClientProvider|next-intl" --type=tsx --type=ts -g "*embed*" -l 2>/dev/null || \
rg -rn "useTranslations|getTranslations|NextIntlClientProvider|next-intl" --include="*.tsx" --include="*.ts" -l | xargs grep -l -i "embed" 2>/dev/null | head -20

echo "---"
# Check embed page/layout files for locale setup
fd -e tsx -e ts -e js . front_end/src/app --exec grep -l -i "embed" {} \; 2>/dev/null | head -20

Length of output: 2786


🏁 Script executed:

#!/bin/bash
# Check the embed page and layout for locale/i18n setup
cat front_end/src/app/(embed)/questions/embed/[id]/page.tsx

echo "=== layout ==="
fd layout front_end/src/app/\(embed\) 2>/dev/null | xargs cat 2>/dev/null

echo "=== embed_question_card ==="
cat front_end/src/app/(embed)/questions/components/embed_question_card.tsx

echo "=== embed_question_plot ==="
cat front_end/src/app/(embed)/questions/components/embed_question_plot.tsx

echo "=== check for useTranslations in embed files ==="
rg -rn "useTranslations|getTranslations|NextIntlClientProvider" front_end/src/app/\(embed\)/

Length of output: 146


🏁 Script executed:

#!/bin/bash
# Use fd to find and cat embed files safely
fd "page.tsx" front_end/src --full-path | grep embed | xargs cat

echo "=== layout files ==="
fd "layout.tsx" front_end/src --full-path | grep embed | xargs cat 2>/dev/null || echo "no layout found"

echo "=== useTranslations check in embed components ==="
fd ".tsx" front_end/src --full-path | grep "(embed)" | xargs grep -l "useTranslations\|getTranslations\|NextIntlClientProvider" 2>/dev/null || echo "none found"

echo "=== embed_question_card ==="
fd "embed_question_card.tsx" front_end/src | xargs cat

echo "=== embed_question_plot ==="
fd "embed_question_plot.tsx" front_end/src | xargs cat

Length of output: 9009


🏁 Script executed:

#!/bin/bash
# Check root layout for NextIntlClientProvider
fd "layout.tsx" front_end/src/app --full-path | head -5 | xargs cat

echo "=== check i18n/middleware config ==="
fd "middleware" front_end/src --full-path | xargs cat 2>/dev/null | head -60

echo "=== check i18n config ==="
fd "i18n" front_end/src --full-path -e ts | head -5 | xargs cat 2>/dev/null
fd "i18n.ts" front_end --full-path | xargs cat 2>/dev/null

Length of output: 5874


🏁 Script executed:

#!/bin/bash
# Check the true root app layout
fd "layout.tsx" front_end/src/app --max-depth 2 | xargs cat

echo "=== next-intl plugin config ==="
cat front_end/next.config.js 2>/dev/null || cat front_end/next.config.ts 2>/dev/null || cat front_end/next.config.mjs 2>/dev/null

echo "=== check if NextIntlClientProvider is anywhere in the tree ==="
rg -rn "NextIntlClientProvider" front_end/src/

Length of output: 11583


@cemreinanc — Embeds do have full localization. Here's what the codebase shows:

  1. Root layout (front_end/src/app/layout.tsx) wraps every route — including (embed) — with NextIntlClientProvider messages={messages}. There is no embed-specific override that strips it out.
  2. next-intl is wired globally via createNextIntlPlugin() in next.config.js, and locale is resolved per-request from the user's cookie / Accept-Language header in i18n.ts.
  3. Grep for NextIntlClientProvider in the (embed) subtree returns nothing — because it inherits from the root, not because it's absent.

So useTranslations() works correctly in embed mode, and the hardcoded "Others" string from buildChoicesWithOthers's English fallback will appear untranslated for non-English users. The original suggested fix remains valid:

   const embedChoiceItems = useMemo(() => {
     if (!embedMode) return choiceItems;
-
-    return buildChoicesWithOthers(choiceItems);
-  }, [choiceItems, embedMode]);
+    const inactiveCount = choiceItems.filter((c) => !c.active).length;
+    return buildChoicesWithOthers(
+      choiceItems,
+      t("othersCount", { count: inactiveCount })
+    );
+  }, [choiceItems, embedMode, t]);

🐇 🔍 Curious rabbit traces the provider up through the layout tree...


✏️ Learnings added
Learnt from: cemreinanc
Repo: Metaculus/metaculus PR: 4444
File: front_end/src/components/detailed_question_card/detailed_question_card/multiple_choice_chart_card.tsx:253-257
Timestamp: 2026-03-12T21:53:38.992Z
Learning: In the Metaculus frontend (Next.js App Router), the embed route group at `front_end/src/app/(embed)/` does NOT have its own `NextIntlClientProvider`. It inherits translations from the root layout at `front_end/src/app/layout.tsx`, which wraps all routes with `<NextIntlClientProvider messages={messages}>`. Therefore, `useTranslations()` works correctly in all embed components, and i18n strings should always be used instead of hardcoded English text.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: cemreinanc
Repo: Metaculus/metaculus PR: 4444
File: front_end/src/utils/questions/choices.ts:201-214
Timestamp: 2026-03-12T21:47:53.792Z
Learning: In `front_end/src/utils/questions/choices.ts` (`generateChoiceItemsFromMultipleChoiceForecast`), when CP is hidden (`hideCP` or `cpRevealsOn`), selecting items by definition order (first N) instead of by CP rank is intentional. Using CP-based selection when CP is hidden would implicitly reveal which options have high CP, defeating the purpose of hiding it. This behavior is by design for the Metaculus frontend.

Learnt from: aseckin
Repo: Metaculus/metaculus PR: 4001
File: front_end/src/app/(futureeval)/futureeval/components/futureeval-leaderboard-table.tsx:15-22
Timestamp: 2026-01-20T16:49:51.584Z
Learning: The mockTranslate function in front_end/src/app/(futureeval)/futureeval/components/futureeval-leaderboard-table.tsx is an intentional workaround to satisfy the entryLabel function signature from shared AIB utils while keeping FutureEval translation-free.

Comment on lines +46 to +66
const aggTs = inactive[0]?.aggregationTimestamps ?? [];
const userTs = inactive[0]?.userTimestamps ?? [];

const sumNullable = (vals: Array<number | null | undefined>) => {
let sum = 0;
let hasAny = false;
for (const v of vals) {
if (v != null) {
sum += v;
hasAny = true;
}
}
return hasAny ? Number(sum.toFixed(6)) : null;
};

const aggregationValues = aggTs.map((_, i) =>
sumNullable(inactive.map((o) => o.aggregationValues[i]))
);
const userValues = userTs.map((_, i) =>
sumNullable(inactive.map((o) => o.userValues[i]))
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't aggregate "Others" by array position.

This assumes every inactive choice shares aggregationTimestamps and userTimestamps with inactive[0], then sums ...Values[i] by index. generateChoiceItemsFromGroupQuestions() in this same file builds those timestamp arrays per question, so different close times or sparse histories will misalign the series and produce incorrect "Others" values.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@front_end/src/utils/questions/choices.ts` around lines 46 - 66, The code
incorrectly assumes all inactive entries share the same
aggregationTimestamps/userTimestamps by using inactive[0] (aggTs, userTs) and
summing aggregationValues[i]/userValues[i]; instead build a unified timestamp
set from all inactive[].aggregationTimestamps and all inactive[].userTimestamps,
create per-entry maps from timestamp->value, and then compute aggregationValues
and userValues by iterating that unified timestamp list and summing values from
each map (using null for missing entries) so timestamps are aligned across
different histories; update the logic that uses aggTs/userTs, sumNullable,
aggregationValues and userValues accordingly and keep
generateChoiceItemsFromGroupQuestions()’s timestamp semantics consistent.

@cemreinanc cemreinanc requested review from hlbmtc and ncarazon March 10, 2026 17:14
Comment on lines 328 to 330
const sortedAggregationTimestamps = uniq(aggregationTimestamps).sort(
(a, b) => a - b
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resorts already sorted timestamps.

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.

MC options default sorting and visible count changes

2 participants