mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-08-18 09:14:09 +00:00
UI: Search Skin (#3552)
## Description: Sorta fixes a visual bug: <img width="1021" height="129" alt="image" src="https://github.com/user-attachments/assets/2ea46fcd-d85c-4f46-a9b9-28c40b818269" /> By adding parity with the flag modal: <img width="988" height="561" alt="image" src="https://github.com/user-attachments/assets/29ca0b9f-3887-4867-b67b-8c35b026b021" /> (Parity <img width="1032" height="342" alt="image" src="https://github.com/user-attachments/assets/b9c551eb-047a-402f-8e7b-c207d967ff38" /> ) (code pretty much copy paste from flagmodal) ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: w.o.n
This commit is contained in:
@@ -949,7 +949,8 @@
|
|||||||
"default": "Default"
|
"default": "Default"
|
||||||
},
|
},
|
||||||
"select_skin": "Select Skin",
|
"select_skin": "Select Skin",
|
||||||
"selected": "selected"
|
"selected": "selected",
|
||||||
|
"search": "Search..."
|
||||||
},
|
},
|
||||||
"cosmetics": {
|
"cosmetics": {
|
||||||
"artist_label": "Artist:"
|
"artist_label": "Artist:"
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export class TerritoryPatternsModal extends BaseModal {
|
|||||||
|
|
||||||
@state() private selectedPattern: PlayerPattern | null;
|
@state() private selectedPattern: PlayerPattern | null;
|
||||||
@state() private selectedColor: string | null = null;
|
@state() private selectedColor: string | null = null;
|
||||||
|
@state() private search = "";
|
||||||
|
|
||||||
private cosmetics: Cosmetics | null = null;
|
private cosmetics: Cosmetics | null = null;
|
||||||
private userSettings: UserSettings = new UserSettings();
|
private userSettings: UserSettings = new UserSettings();
|
||||||
@@ -67,6 +68,15 @@ export class TerritoryPatternsModal extends BaseModal {
|
|||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private includedInSearch(name: string): boolean {
|
||||||
|
const displayName = name.replace(/_/g, " ");
|
||||||
|
return displayName.toLowerCase().includes(this.search.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
private handleSearch(event: Event) {
|
||||||
|
this.search = (event.target as HTMLInputElement).value;
|
||||||
|
}
|
||||||
|
|
||||||
private renderPatternGrid(): TemplateResult {
|
private renderPatternGrid(): TemplateResult {
|
||||||
const buttons: TemplateResult[] = [];
|
const buttons: TemplateResult[] = [];
|
||||||
const patterns: (Pattern | null)[] = [
|
const patterns: (Pattern | null)[] = [
|
||||||
@@ -74,6 +84,12 @@ export class TerritoryPatternsModal extends BaseModal {
|
|||||||
...Object.values(this.cosmetics?.patterns ?? {}),
|
...Object.values(this.cosmetics?.patterns ?? {}),
|
||||||
];
|
];
|
||||||
for (const pattern of patterns) {
|
for (const pattern of patterns) {
|
||||||
|
if (pattern === null && this.search) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pattern !== null && !this.includedInSearch(pattern.name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const colorPalettes = pattern
|
const colorPalettes = pattern
|
||||||
? [...(pattern.colorPalettes ?? []), null]
|
? [...(pattern.colorPalettes ?? []), null]
|
||||||
: [null];
|
: [null];
|
||||||
@@ -135,6 +151,19 @@ export class TerritoryPatternsModal extends BaseModal {
|
|||||||
ariaLabel: translateText("common.back"),
|
ariaLabel: translateText("common.back"),
|
||||||
rightContent: html`<not-logged-in-warning></not-logged-in-warning>`,
|
rightContent: html`<not-logged-in-warning></not-logged-in-warning>`,
|
||||||
})}
|
})}
|
||||||
|
|
||||||
|
<div class="md:flex items-center gap-2 justify-center mt-4">
|
||||||
|
<input
|
||||||
|
class="h-12 w-full max-w-md border border-white/10 bg-black/60
|
||||||
|
rounded-xl shadow-inner text-xl text-center focus:outline-none
|
||||||
|
focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 text-white placeholder-white/30 transition-all"
|
||||||
|
type="text"
|
||||||
|
placeholder=${translateText("territory_patterns.search")}
|
||||||
|
.value=${this.search}
|
||||||
|
@change=${this.handleSearch}
|
||||||
|
@keyup=${this.handleSearch}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center py-3 shrink-0">
|
<div class="flex justify-center py-3 shrink-0">
|
||||||
<button
|
<button
|
||||||
@@ -176,6 +205,10 @@ export class TerritoryPatternsModal extends BaseModal {
|
|||||||
await this.refresh();
|
await this.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected onClose(): void {
|
||||||
|
this.search = "";
|
||||||
|
}
|
||||||
|
|
||||||
private selectPattern(pattern: PlayerPattern | null) {
|
private selectPattern(pattern: PlayerPattern | null) {
|
||||||
this.selectedColor = null;
|
this.selectedColor = null;
|
||||||
this.userSettings.setSelectedColor(undefined);
|
this.userSettings.setSelectedColor(undefined);
|
||||||
|
|||||||
Reference in New Issue
Block a user