From ecd8b449e3de4a189ef4e1fe67ba9b2fb33caca6 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Wed, 28 Oct 2026 22:28:12 +0900 Subject: [PATCH] #434 --- backend/app/services/counts_defaults.rb | 3 +- backend/app/services/counts_table_query.rb | 4 +- .../src/components/counts/CountsControls.tsx | 8 +++- .../src/components/counts/CountsResults.tsx | 2 +- .../components/counts/CountsSortHeader.tsx | 48 +++++++++++++++++-- .../components/counts/CountsTableLayout.tsx | 14 ++++-- .../src/components/counts/countsTable.css | 7 ++- frontend/src/lib/counts.ts | 23 ++++++++- frontend/src/lib/countsTableLayout.ts | 2 + 9 files changed, 95 insertions(+), 16 deletions(-) diff --git a/backend/app/services/counts_defaults.rb b/backend/app/services/counts_defaults.rb index b5e35fc..a29fe7b 100644 --- a/backend/app/services/counts_defaults.rb +++ b/backend/app/services/counts_defaults.rb @@ -13,6 +13,7 @@ class CountsDefaults 'rows' => '', 'cols' => '', 'conditions' => '', 'tags' => '' } } details = detail_params(resource) if details + details = details.merge('sort' => 'resource_id:asc version_no:asc') language = Locale.find_by(code: locale)&.language_code || locale name = CountsResourceDefinition.name_key(language) aliases = CountsResourceDefinition.aliases_key(language) @@ -72,7 +73,7 @@ class CountsDefaults entry[:definition] == params.fetch('definition', 'latest') && entry[:mode] == params.fetch('mode', 'summary') end&.fetch(:params) || {} - if settings.key?('sort') && params.key?('rows') + if settings.key?('sort') && params.key?('rows') && params.fetch('mode', 'summary') == 'summary' actual = QueryState.axes(params['rows']) expected = QueryState.axes(settings.fetch('rows')) compatible = actual.is_a?(Array) && actual.first.is_a?(Hash) && diff --git a/backend/app/services/counts_table_query.rb b/backend/app/services/counts_table_query.rb index c4f6744..bf48084 100644 --- a/backend/app/services/counts_table_query.rb +++ b/backend/app/services/counts_table_query.rb @@ -21,7 +21,7 @@ class CountsTableQuery @connection = @definition.model.connection @axes = CountsAxes.new(population) @page = Integer(params.fetch('page', '1'), 10) - @limit = Integer(params.fetch('limit', '20'), 10) + @limit = Integer(params.fetch('limit', '100'), 10) @mode = params.fetch('mode', 'summary') raise ArgumentError unless page.between?(1, 1_000_000) && limit.between?(1, 100) raise ArgumentError unless ['summary', 'details'].include?(mode) @@ -178,7 +178,7 @@ class CountsTableQuery query = population.scope.select(Arel.sql( "(#{ population.latest_sql }) AS counts_latest")) order = sort_sql { detail_expression(_1) } - query = query.order(Arel.sql((order + ['v.id DESC']).join(', '))) + query = query.order(Arel.sql((order + ['v.id ASC']).join(', '))) .limit(limit).offset((page - 1) * limit) rows = query.to_a if ['posts', 'tags'].include?(@definition.resource) diff --git a/frontend/src/components/counts/CountsControls.tsx b/frontend/src/components/counts/CountsControls.tsx index d1728be..23cabb6 100644 --- a/frontend/src/components/counts/CountsControls.tsx +++ b/frontend/src/components/counts/CountsControls.tsx @@ -92,6 +92,7 @@ const CountsControls = ( const update = (key: string, value: string) => setDraft (previous => { const next = new URLSearchParams (previous) setCountState (next, key, value) + if (key === 'limit') next.delete ('page') if (next.toString () === previous.toString ()) return previous if (['rows', 'cols'].includes (key) && next.get ('sort') !== '') next.delete ('sort') if (key !== 'mode') return next @@ -153,10 +154,13 @@ const CountsControls = ( {label ('displaySettings')}