Compare commits

...

3 commits

Author SHA1 Message Date
e09296ef51 Fix outfit editor bug where opening style picker increases page height 2025-01-12 12:10:47 -08:00
b6e3079599 Use shorter style name in outfit editor's pose picker label
Now that some of these series names are very long (like "Prismatic
Cocoa: Festive"), they can throw off the layout. Let's just use the
shorter one, it's clear enough!
2025-01-12 12:02:52 -08:00
a385a5b962 Better ordering for NC Styles in the outfit editor
Previously, when opening the pose picker and looking at Styles, the
Cybunny options were sorted like this:

- Default
- Celebratory 25th Anniversary
- Festive Christmas
- Nostalgic Baby
- Nostalgic Blue
- Nostalgic Christmas
- Nostalgic Darigan
- Nostalgic Faerie
- Nostalgic Grey
- Nostalgic Maraquan
- Nostalgic Mutant
- Nostalgic Plushie
- Nostalgic Robot
- Nostalgic Royalboy
- Nostalgic Royalgirl
- Nostalgic Snow
- Nostalgic Tyrannian
- Prismatic Cocoa: Festive Christmas
- Prismatic Cocoa: Nostalgic Christmas
- Prismatic Tinsel: Festive Christmas
- Prismatic Tinsel: Nostalgic Christmas
- Spooky Halloween

Now, they're sorted like this:

- Default
- Celebratory 25th Anniversary
- Nostalgic Baby
- Nostalgic Blue
- Festive Christmas
- Prismatic Cocoa: Festive Christmas
- Prismatic Tinsel: Festive Christmas
- Nostalgic Christmas
- Prismatic Cocoa: Nostalgic Christmas
- Prismatic Tinsel: Nostalgic Christmas
- Nostalgic Darigan
- Nostalgic Faerie
- Nostalgic Grey
- Spooky Halloween
- Nostalgic Maraquan
- Nostalgic Mutant
- Nostalgic Plushie
- Nostalgic Robot
- Nostalgic Royalboy
- Nostalgic Royalgirl
- Nostalgic Snow
- Nostalgic Tyrannian

Note especially the Christmas case, which is all together now! I think
it's also more in line with people's expectations for Halloween to be
alphabetically among the rest, instead of being at the bottom for being
"Spooky".

There's enough styles now that I'm starting to wonder if there's other
UI affordances worth having here, like e.g. only showing (or at least
prioritizing) styles that match the chosen color? But I don't want to
mislead people about compatibility, either.
2025-01-12 11:58:37 -08:00
4 changed files with 41 additions and 10 deletions

View file

@ -27,11 +27,9 @@ class AltStylesController < ApplicationController
render
}
format.json {
@alt_styles = @alt_styles.includes(swf_assets: [:zone]).
sort_by(&:full_name)
@alt_styles = @alt_styles.includes(swf_assets: [:zone]).by_name_grouped
render json: @alt_styles.as_json(
only: [:id, :species_id, :color_id, :body_id, :series_name,
:adjective_name, :thumbnail_url],
only: [:id, :species_id, :color_id, :body_id, :thumbnail_url],
include: {
swf_assets: {
only: [:id, :body_id],
@ -39,7 +37,7 @@ class AltStylesController < ApplicationController
methods: [:urls, :known_glitches],
}
},
methods: [:series_name, :adjective_name, :thumbnail_url],
methods: [:series_main_name, :adjective_name],
)
}
end

View file

@ -283,7 +283,7 @@ const PosePickerButton = React.forwardRef(
const theme = useTheme();
const icon = altStyle != null ? twemojiSunglasses : getIcon(pose);
const label = altStyle != null ? altStyle.seriesName : getLabel(pose);
const label = altStyle != null ? altStyle.seriesMainName : getLabel(pose);
return (
<ClassNames>
@ -723,6 +723,13 @@ function StyleOption({ altStyle, checked, onChange, inputRef }) {
checked={checked}
onChange={(e) => onChange(altStyle.id)}
ref={inputRef}
// HACK: Without this, the page extends super long. I think this is
// because the VisuallyHidden just uses `position: absolute`,
// which makes it float invisibly *beyond* the scrolling
// container it's in, extending the page? But if we put it at
// the top-left corner instead, it doesn't.
left="0"
top="0"
/>
<Flex
alignItems="center"

View file

@ -49,7 +49,7 @@ function normalizeAltStyle(altStyleData) {
speciesId: String(altStyleData.species_id),
colorId: String(altStyleData.color_id),
bodyId: String(altStyleData.body_id),
seriesName: altStyleData.series_name,
seriesMainName: altStyleData.series_main_name,
adjectiveName: altStyleData.adjective_name,
thumbnailUrl: altStyleData.thumbnail_url,

View file

@ -26,6 +26,24 @@ class AltStyle < ApplicationRecord
# created around midnight.
order(Arel.sql("DATE(CONVERT_TZ(created_at, '+00:00', '-08:00')) DESC"))
}
scope :by_series_main_name, -> {
# The main part of the series name, like "Nostalgic".
order(Arel.sql("SUBSTRING_INDEX(series_name, ': ', -1)"))
}
scope :by_series_variant_name, -> {
# The variant part of the series name, like "Prismatic Cyan".
order(Arel.sql("SUBSTRING_INDEX(series_name, ': ', 1)"))
}
scope :by_color_name, -> {
joins(:color).order(Color.arel_table[:name])
}
scope :by_name_grouped, -> {
# Sort by the color name, then the main part of the series name, then the
# variant part of the series name. This way, all the, say, Christmas colors
# and their Prismatic variants will be together, including both Festive and
# Nostalgic cases.
by_color_name.by_series_main_name.by_series_variant_name
}
scope :unlabeled, -> { where(series_name: nil) }
scope :newest, -> { order(created_at: :desc) }
@ -58,6 +76,14 @@ class AltStyle < ApplicationRecord
real_series_name.present?
end
def series_main_name
series_name.split(': ').last
end
def series_variant_name
series_name.split(': ').first
end
def adjective_name
"#{series_name} #{color.human_name}"
end
@ -106,9 +132,9 @@ class AltStyle < ApplicationRecord
end
def self.all_series_names
# Sort by the part *after* the colon, then before (if any).
distinct.where.not(series_name: nil).pluck(:series_name).
sort_by { |series_name| series_name.split(': ', 2).reverse }
distinct.where.not(series_name: nil).
by_series_main_name.by_series_variant_name.
pluck(:series_name)
end
def self.all_supported_colors