refactor: replace select2 with slim-select (#5065)

* i cant figure this oooout

* fix: closing commandline causing settings page update

* remove log

* fix event looping issues
rerendering selects when updating settings

* remove comment

* move section back to where it should be

* update styling

* move redrawing to settings group

* no need to save to a variable

* types

* fix styles

* search placeholder

* fix structure

* fix styles

* using slim for the rest of selects

* disabled styling

* use slim

* styling

* use slim

* multi select styling

* use slim

* use slim

* use slim

* use slim

* remove everything else related to select2

* last select2 mention

* comment

* fix(settings page): font family buttons not working

* fix: input indicators remaining visible after leaving the login page (underscoore) (#5062)

* chore: update node version to 18.19.1 (#5060)

* impr(quote): add Code C quotes (penguin-teal) (#5053)

* fix: question mark appearing next to unrated quotes

* removed unnecessary link

---------

Co-authored-by: Ajay kumar <ajaykumar.bit.1995@gmail.com>
Co-authored-by: Christian Fehmer <fehmer@users.noreply.github.com>
Co-authored-by: penguin-teal <130006737+penguin-teal@users.noreply.github.com>
This commit is contained in:
Jack 2024-02-17 12:12:15 +01:00 committed by GitHub
parent 197f2c36cf
commit 3e0be2e210
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 405 additions and 396 deletions

View file

@ -28,7 +28,7 @@
"konami": "1.6.3",
"lz-ts": "1.1.2",
"object-hash": "3.0.0",
"select2": "4.1.0-rc.0",
"slim-select": "2.8.1",
"stemmer": "2.0.0",
"throttle-debounce": "3.0.1",
"workbox-window": "6.5.4"
@ -42,7 +42,6 @@
"@types/jest": "27.5.0",
"@types/jquery": "3.5.14",
"@types/object-hash": "2.2.1",
"@types/select2": "4.0.55",
"@types/throttle-debounce": "2.1.0",
"@types/tinycolor2": "1.4.3",
"autoprefixer": "10.4.14",
@ -3860,15 +3859,6 @@
"integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
"dev": true
},
"node_modules/@types/select2": {
"version": "4.0.55",
"resolved": "https://registry.npmjs.org/@types/select2/-/select2-4.0.55.tgz",
"integrity": "sha512-lqngYTv7W1e8HiLSEq7cJhnnKqV3vuwCBkfka6ZXBoM0Z8aVoZrR9gxjbwRzcqBBw4EpAvVXZGPuaDOM+apeZw==",
"dev": true,
"dependencies": {
"@types/jquery": "*"
}
},
"node_modules/@types/serve-index": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
@ -14699,8 +14689,7 @@
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/js-yaml": {
"version": "4.1.0",
@ -15400,6 +15389,17 @@
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
"integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
@ -18248,6 +18248,29 @@
"node": ">=0.10.0"
}
},
"node_modules/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
},
"peerDependencies": {
"react": "^18.2.0"
}
},
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@ -19092,6 +19115,14 @@
"node": ">=v12.22.7"
}
},
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
"integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
"dependencies": {
"loose-envify": "^1.1.0"
}
},
"node_modules/schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@ -19116,11 +19147,6 @@
"integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
"dev": true
},
"node_modules/select2": {
"version": "4.1.0-rc.0",
"resolved": "https://registry.npmjs.org/select2/-/select2-4.1.0-rc.0.tgz",
"integrity": "sha512-Hr9TdhyHCZUtwznEH2CBf7967mEM0idtJ5nMtjvk3Up5tPukOLXbHUNmh10oRfeNIhj+3GD3niu+g6sVK+gK0A=="
},
"node_modules/selfsigned": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
@ -19616,6 +19642,15 @@
"node": ">=8"
}
},
"node_modules/slim-select": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/slim-select/-/slim-select-2.8.1.tgz",
"integrity": "sha512-/wi+4dau48edrPZ/ggD+R8qD6FbCLGv5zvrYh4rqp1RNEIbkb1pRYJbljLjvr7/QqBvX3Hjbnvdnw9FPzJ8o5Q==",
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
},
"node_modules/snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",

View file

@ -31,7 +31,6 @@
"@types/jest": "27.5.0",
"@types/jquery": "3.5.14",
"@types/object-hash": "2.2.1",
"@types/select2": "4.0.55",
"@types/throttle-debounce": "2.1.0",
"@types/tinycolor2": "1.4.3",
"autoprefixer": "10.4.14",
@ -99,7 +98,7 @@
"konami": "1.6.3",
"lz-ts": "1.1.2",
"object-hash": "3.0.0",
"select2": "4.1.0-rc.0",
"slim-select": "2.8.1",
"stemmer": "2.0.0",
"throttle-debounce": "3.0.1",
"workbox-window": "6.5.4"

View file

@ -178,189 +178,145 @@ select:-webkit-autofill:focus {
caret-color: var(--text-color);
}
.select2-dropdown {
background-color: var(--bg-color);
color: var(--text-color);
// slim-select styles
.ss-main {
border-radius: var(--roundness);
outline: none;
}
.select2-container--default.select2-container--disabled
.select2-selection--single {
background: var(--sub-alt-color) !important;
opacity: 0.33;
cursor: default;
pointer-events: none;
}
.select2-selection {
border: none;
border-radius: var(--roundness);
background: var(--sub-alt-color);
height: fit-content;
height: -moz-fit-content;
padding: 5px;
border-radius: var(--roundness);
color: var(--text-color);
font: var(--font);
border: none;
outline: none;
}
.select2-container--default
.select2-selection--single
.select2-selection__rendered {
color: var(--text-color);
outline: none;
}
.select2-container--default
.select2-results__option--highlighted.select2-results__option--selectable {
background-color: var(--text-color);
color: var(--bg-color);
}
.select2-container--default .select2-results__option--selected {
background-color: var(--main-color);
color: var(--bg-color);
}
.select2-container--open .select2-dropdown--below,
.select2-container--open .select2-dropdown--above {
border-color: var(--sub-alt-color);
background: var(--bg-color);
color: var(--sub-color);
border-radius: var(--roundness);
}
.select2-container--default .select2-selection--single {
color: var(--text-color);
background: var(--sub-alt-color);
outline: none;
border: none;
height: auto;
border-radius: var(--roundness);
}
.select2-container--default.select2-container--disabled
.select2-selection--single {
background: #5051517a;
}
.select2-selection:focus {
height: fit-content;
height: -moz-fit-content;
padding: 5px;
border-radius: var(--roundness);
color: var(--text-color);
font: var(--font);
border: none;
outline: none;
}
.select2-selection:active {
height: fit-content;
height: -moz-fit-content;
padding: 5px;
border-radius: var(--roundness);
color: var(--text-color);
font: var(--font);
border: none;
outline: none;
}
.select2-container--default
.select2-selection--single
.select2-selection__arrow {
height: 35px;
}
.select2-container--default
.select2-selection--single
.select2-selection__arrow
b {
border-color: var(--text-color) transparent transparent transparent;
}
.select2-container--default.select2-container--open
.select2-selection--single
.select2-selection__arrow
b {
border-color: var(--text-color) transparent;
}
.select2-container--default .select2-search--dropdown .select2-search__field {
border-color: var(--sub-alt-color);
background: var(--bg-color);
color: var(--text-color);
border-radius: var(--roundness);
}
.select2-container--default .select2-results__group {
color: var(--text-color);
}
.select2-container--default .select2-selection--multiple {
background: var(--sub-alt-color);
border-radius: var(--roundness);
color: var(--text-color);
outline: none;
border: none;
}
.select2-selection__choice__display {
color: var(--bg-color);
}
.select2-selection__choice__remove {
color: var(--main-color) !important;
}
.select2-container .select2-search--inline .select2-search__field {
margin: 0;
border-radius: 0;
padding: 0.5em;
font-size: 1em;
font-family: var(--font);
line-height: 1rem;
caret-color: var(--main-color);
line-height: 1.25em;
&:focus {
box-shadow: inherit;
}
&:focus-visible {
box-shadow: 0 0 0 0.1rem var(--bg-color), 0 0 0 0.2rem var(--text-color);
}
.ss-arrow path {
stroke: var(--text-color);
transition: none;
}
&.ss-disabled {
opacity: 0.33;
pointer-events: none;
background: var(--sub-alt-color);
cursor: pointer;
}
.ss-values {
.ss-placeholder {
padding: 0;
margin: 0;
color: var(--sub-color);
}
.ss-single {
margin: 0;
}
.ss-value {
animation: unset !important;
background-color: unset;
.ss-value-text {
height: 100%;
color: var(--bg-color);
background: var(--main-color);
border-radius: calc(var(--roundness) / 2) 0 0 calc(var(--roundness) / 2);
}
.ss-value-delete {
border-left: 1px solid var(--bg-color);
background: var(--main-color);
height: 100%;
box-sizing: border-box;
width: 100%;
border-radius: 0 calc(var(--roundness) / 2) calc(var(--roundness) / 2) 0;
transition: background 0.125s;
svg path {
stroke: var(--bg-color);
}
&:hover {
background: var(--text-color);
svg path {
stroke: var(--bg-color);
}
}
}
}
}
}
.select2-container--default.select2-container--focus
.select2-selection--multiple {
.ss-content {
transition: none;
border: none;
}
.select2-container--default .select2-selection--multiple {
border: none;
padding: 0.5rem;
font-family: var(--font);
}
.select2-container--default
.select2-selection--multiple
.select2-selection__choice {
background-color: var(--main-color);
border: none;
border-radius: calc(var(--roundness) / 2);
box-sizing: border-box;
display: inline-block;
margin-left: 0;
margin-top: 0;
margin-right: 0.5rem;
padding: 0;
padding-left: 1.25rem;
position: relative;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: bottom;
white-space: nowrap;
}
.select2-container--default
.select2-selection--multiple
.select2-selection__choice__remove {
line-height: 1.5rem;
border-right: 1px solid var(--bg-color);
color: var(--bg-color) !important;
transition: 0.125s;
}
.select2-container--default
.select2-selection--multiple
.select2-selection__choice__remove:hover {
background-color: var(--text-color);
background: var(--sub-alt-color);
color: var(--text-color);
.ss-search {
padding: 0.5em;
border-top: 0.1em solid var(--bg-color);
border-bottom: 0.1em solid var(--bg-color);
input {
border: none;
background: var(--bg-color);
font-size: 1em;
padding: 0.5em;
&:focus-visible {
box-shadow: 0 0 0 0.1rem var(--bg-color), 0 0 0 0.2rem var(--text-color);
}
&:focus {
border: none;
}
&::placeholder {
color: var(--sub-color);
}
&::-webkit-search-cancel-button {
-webkit-appearance: none;
}
}
}
.ss-list {
.ss-optgroup {
.ss-optgroup-label {
margin-top: 1em;
padding: 0.5em;
padding-left: 1em;
.ss-optgroup-label-text {
color: var(--sub-color);
}
}
}
.ss-optgroup .ss-option,
.ss-optgroup .ss-option:not(.ss-disabled),
.ss-option,
.ss-option:not(.ss-disabled) {
padding: 0.5em;
padding-left: 0.5em;
color: var(--text-color);
&.ss-selected {
background: var(--main-color);
color: var(--bg-color);
}
&:hover,
&.ss-highlighted {
background: var(--text-color);
color: var(--bg-color);
}
// &:last-child {
// margin-bottom: 1em;
// }
}
.ss-optgroup .ss-option,
.ss-optgroup .ss-option:not(.ss-disabled) {
padding-left: 1em;
}
}
&.ss-open-below {
border-bottom-left-radius: var(--roundness);
border-bottom-right-radius: var(--roundness);
}
&.ss-open-above {
border-top-left-radius: var(--roundness);
border-top-right-radius: var(--roundness);
}
}

View file

@ -29,7 +29,7 @@
grid-area: buttons;
.timeRange {
grid-template-columns: 1fr 1fr;
.select2 {
.languageSelect {
grid-column: span 2;
}
}

View file

@ -11,6 +11,7 @@ import { getHTMLById as getBadgeHTMLbyId } from "../controllers/badge-controller
import * as ConnectionState from "../states/connection";
import * as Skeleton from "../popups/skeleton";
import { debounce } from "throttle-debounce";
import SlimSelect from "slim-select";
const wrapperId = "leaderboardsWrapper";
@ -680,52 +681,57 @@ $("#leaderboardsWrapper").on("click", (e) => {
}
});
const languageSelector = $(
"#leaderboardsWrapper #leaderboards .leaderboardsTop .buttonGroup.timeRange .languageSelect"
).select2({
placeholder: "select a language",
width: "100%",
const languageSelector = new SlimSelect({
select:
"#leaderboardsWrapper #leaderboards .leaderboardsTop .buttonGroup.timeRange .languageSelect",
settings: {
showSearch: false,
contentLocation: document.querySelector(
"#leaderboardsWrapper"
) as HTMLElement,
},
data: [
{
id: "english",
value: "english",
text: "english",
selected: true,
},
{
id: "spanish",
value: "spanish",
text: "spanish",
},
{
id: "german",
value: "german",
text: "german",
},
{
id: "french",
value: "french",
text: "french",
},
{
id: "portuguese",
value: "portuguese",
text: "portuguese",
},
{
id: "indonesian",
value: "indonesian",
text: "indonesian",
},
{
id: "italian",
value: "italian",
text: "italian",
},
{
id: "russian",
value: "russian",
text: "russian",
},
],
});
languageSelector.on("select2:select", (e) => {
currentLanguage = e.params.data.id;
updateTitle();
void update();
events: {
afterChange: (newVal): void => {
currentLanguage = newVal[0]?.value as string;
updateTitle();
void update();
},
},
});
let leftScrollEnabled = true;
@ -852,9 +858,8 @@ $(
).on("click", () => {
currentTimeRange = "allTime";
currentLanguage = "english";
languageSelector.prop("disabled", true);
languageSelector.val("english");
languageSelector.trigger("change");
languageSelector.disable();
languageSelector.setSelected("english");
void update();
});
@ -863,7 +868,7 @@ $(
).on("click", () => {
currentTimeRange = "daily";
updateYesterdayButton();
languageSelector.prop("disabled", false);
languageSelector.enable();
void update();
});

View file

@ -3,7 +3,6 @@
import "jquery";
import "jquery-color";
import "jquery.easing";
import "select2";
import "../styles/index.scss";
import "./firebase";

View file

@ -18,6 +18,7 @@ import { getAuthenticatedUser, isAuthenticated } from "../firebase";
import Ape from "../ape";
import { areFunboxesCompatible } from "../test/funbox/funbox-validation";
import { get as getTypingSpeedUnit } from "../utils/typing-speed-units";
import SlimSelect from "slim-select";
import * as Skeleton from "../popups/skeleton";
import * as CustomBackgroundFilter from "../elements/custom-background-filter";
@ -421,10 +422,12 @@ function reset(): void {
$(".pageSettings .section.themes .favThemes.buttons").empty();
$(".pageSettings .section.themes .allThemes.buttons").empty();
$(".pageSettings .section.themes .allCustomThemes.buttons").empty();
$(".pageSettings .section.languageGroups .buttons").empty();
$(".pageSettings select").empty().select2("destroy");
$(".pageSettings .section[data-config-name='funbox'] .buttons").empty();
$(".pageSettings .section[data-config-name='fontFamily'] .buttons").empty();
for (const select of document.querySelectorAll(".pageSettings select")) {
//@ts-expect-error
select?.slim?.destroy?.();
}
}
let groupsInitialized = false;
@ -436,11 +439,6 @@ async function fillSettingsPage(): Promise<void> {
}
// Language Selection Combobox
const languageEl = document.querySelector(
".pageSettings .section[data-config-name='language'] select"
) as HTMLSelectElement;
languageEl.innerHTML = "";
let languageElHTML = "";
let languageGroups;
try {
@ -454,37 +452,32 @@ async function fillSettingsPage(): Promise<void> {
);
}
const languageSelectData = [];
if (languageGroups) {
for (const group of languageGroups) {
let langComboBox = `<optgroup label="${group.name}">`;
group.languages.forEach((language: string) => {
langComboBox += `<option value="${language}">
${Misc.getLanguageDisplayString(language)}
</option>`;
});
langComboBox += `</optgroup>`;
languageElHTML += langComboBox;
const groupData = {
label: group.name,
options: group.languages.map((language: string) => {
return {
value: language,
text: Misc.getLanguageDisplayString(language),
selected: language === Config.language,
};
}),
};
languageSelectData.push(groupData);
}
languageEl.innerHTML = languageElHTML;
}
$(languageEl).select2({
width: "100%",
new SlimSelect({
select: ".pageSettings .section[data-config-name='language'] select",
data: languageSelectData,
settings: {
searchPlaceholder: "search",
},
});
await Misc.sleep(0);
const layoutEl = document.querySelector(
".pageSettings .section[data-config-name='layout'] select"
) as HTMLSelectElement;
layoutEl.innerHTML = `<option value='default'>off</option>`;
let layoutElHTML = "";
const keymapEl = document.querySelector(
".pageSettings .section[data-config-name='keymapLayout'] select"
) as HTMLSelectElement;
keymapEl.innerHTML = `<option value='overrideSync'>emulator sync</option>`;
let keymapElHTML = "";
let layoutsList;
try {
layoutsList = await Misc.getLayoutsList();
@ -492,45 +485,48 @@ async function fillSettingsPage(): Promise<void> {
console.error(Misc.createErrorMessage(e, "Failed to refresh keymap"));
}
const layoutSelectData = [];
const keymapLayoutSelectData = [];
layoutSelectData.push({
value: "default",
text: "off",
});
keymapLayoutSelectData.push({
value: "overrideSync",
text: "emulator sync",
});
if (layoutsList) {
for (const layout of Object.keys(layoutsList)) {
if (layout.toString() !== "korean") {
layoutElHTML += `<option value='${layout}'>${layout.replace(
/_/g,
" "
)}</option>`;
layoutSelectData.push({
value: layout,
text: layout.replace(/_/g, " "),
});
}
if (layout.toString() !== "default") {
keymapElHTML += `<option value='${layout}'>${layout.replace(
/_/g,
" "
)}</option>`;
keymapLayoutSelectData.push({
value: layout,
text: layout.replace(/_/g, " "),
});
}
}
layoutEl.innerHTML += layoutElHTML;
keymapEl.innerHTML += keymapElHTML;
}
$(layoutEl).select2({
width: "100%",
new SlimSelect({
select: ".pageSettings .section[data-config-name='layout'] select",
data: layoutSelectData,
});
$(keymapEl).select2({
width: "100%",
new SlimSelect({
select: ".pageSettings .section[data-config-name='keymapLayout'] select",
data: keymapLayoutSelectData,
});
await Misc.sleep(0);
const themeEl1 = document.querySelector(
".pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.light"
) as HTMLSelectElement;
themeEl1.innerHTML = "";
let themeEl1HTML = "";
const themeEl2 = document.querySelector(
".pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.dark"
) as HTMLSelectElement;
themeEl2.innerHTML = "";
let themeEl2HTML = "";
let themes;
try {
themes = await Misc.getThemesList();
@ -540,40 +536,47 @@ async function fillSettingsPage(): Promise<void> {
);
}
const themeSelectLightData = [];
const themeSelectDarkData = [];
if (themes) {
for (const theme of themes) {
themeEl1HTML += `<option value='${theme.name}'>${theme.name.replace(
/_/g,
" "
)}</option>`;
themeEl2HTML += `<option value='${theme.name}'>${theme.name.replace(
/_/g,
" "
)}</option>`;
themeSelectLightData.push({
value: theme.name,
text: theme.name.replace(/_/g, " "),
selected: theme.name === Config.themeLight,
});
themeSelectDarkData.push({
value: theme.name,
text: theme.name.replace(/_/g, " "),
selected: theme.name === Config.themeDark,
});
}
themeEl1.innerHTML = themeEl1HTML;
themeEl2.innerHTML = themeEl2HTML;
}
$(themeEl1).select2({
width: "100%",
new SlimSelect({
select:
".pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.light",
data: themeSelectLightData,
events: {
afterChange: (newVal): void => {
UpdateConfig.setThemeLight(newVal[0]?.value as string);
},
},
});
$(themeEl2).select2({
width: "100%",
new SlimSelect({
select:
".pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.dark",
data: themeSelectDarkData,
events: {
afterChange: (newVal): void => {
UpdateConfig.setThemeDark(newVal[0]?.value as string);
},
},
});
await Misc.sleep(0);
$(
`.pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.light`
)
.val(Config.themeLight)
.trigger("change.select2");
$(
`.pageSettings .section[data-config-name='autoSwitchThemeInputs'] select.dark`
)
.val(Config.themeDark)
.trigger("change.select2");
const funboxEl = document.querySelector(
".pageSettings .section[data-config-name='funbox'] .buttons"
) as HTMLDivElement;
@ -1257,30 +1260,6 @@ $(".pageSettings .section.updateCookiePreferences button").on("click", () => {
CookiePopup.showSettings();
});
$(".pageSettings .section[data-config-name='autoSwitchThemeInputs']").on(
"change",
`select.light`,
(e) => {
const target = $(e.currentTarget);
if (target.hasClass("disabled") || target.hasClass("no-auto-handle")) {
return;
}
UpdateConfig.setThemeLight(target.val() as string);
}
);
$(".pageSettings .section[data-config-name='autoSwitchThemeInputs']").on(
"change",
`select.dark`,
(e) => {
const target = $(e.currentTarget);
if (target.hasClass("disabled") || target.hasClass("no-auto-handle")) {
return;
}
UpdateConfig.setThemeDark(target.val() as string);
}
);
$(".pageSettings .section.discordIntegration .getLinkAndGoToOauth").on(
"click",
() => {
@ -1314,8 +1293,8 @@ export const page = new Page(
//
},
async () => {
Skeleton.remove("pageSettings");
reset();
Skeleton.remove("pageSettings");
},
async () => {
Skeleton.append("pageSettings", "main");

View file

@ -7,6 +7,7 @@ import QuotesController from "../controllers/quotes-controller";
import * as CaptchaController from "../controllers/captcha-controller";
import * as Skeleton from "./skeleton";
import { isPopupVisible, removeLanguageSize } from "../utils/misc";
import SlimSelect from "slim-select";
const wrapperId = "quoteReportPopupWrapper";
@ -34,6 +35,8 @@ const defaultOptions: Options = {
noAnim: false,
};
let reasonSelect: SlimSelect | undefined = undefined;
export async function show(options = defaultOptions): Promise<void> {
Skeleton.append(wrapperId);
@ -59,9 +62,14 @@ export async function show(options = defaultOptions): Promise<void> {
$("#quoteReportPopup .reason").val("Grammatical error");
$("#quoteReportPopup .comment").val("");
$("#quoteReportPopup .characterCount").text("-");
$("#quoteReportPopup .reason").select2({
minimumResultsForSearch: Infinity,
reasonSelect = new SlimSelect({
select: "#quoteReportPopup .reason",
settings: {
showSearch: false,
},
});
$("#quoteReportPopupWrapper")
.stop(true, true)
.css("opacity", 0)
@ -90,6 +98,8 @@ async function hide(): Promise<void> {
if (state.previousPopupShowCallback) {
state.previousPopupShowCallback();
}
reasonSelect?.destroy();
reasonSelect = undefined;
Skeleton.remove(wrapperId);
}
);

View file

@ -19,6 +19,7 @@ import Ape from "../ape";
import * as Loader from "../elements/loader";
import * as Skeleton from "./skeleton";
import { isPopupVisible } from "../utils/misc";
import SlimSelect from "slim-select";
const wrapperId = "quoteSearchPopupWrapper";
@ -209,6 +210,8 @@ async function updateResults(searchText: string): Promise<void> {
});
}
let lengthSelect: SlimSelect | undefined = undefined;
export async function show(clearText = true): Promise<void> {
Skeleton.append(wrapperId);
@ -233,31 +236,28 @@ export async function show(clearText = true): Promise<void> {
$("#quoteSearchPopup #goToApproveQuotes").addClass("hidden");
}
$("#quoteSearchPopup .quoteLengthFilter").select2({
placeholder: "Filter by length",
maximumSelectionLength: Infinity,
multiple: true,
width: "100%",
lengthSelect = new SlimSelect({
select: "#quoteSearchPopup .quoteLengthFilter",
settings: {
showSearch: false,
placeholderText: "Filter by length",
},
data: [
{
id: 0,
text: "short",
selected: false,
value: "0",
},
{
id: 1,
text: "medium",
selected: false,
value: "1",
},
{
id: 2,
text: "long",
selected: false,
value: "2",
},
{
id: 3,
text: "thicc",
selected: false,
value: "3",
},
],
});
@ -289,6 +289,9 @@ function hide(noAnim = false, focusWords = true): void {
() => {
$("#quoteSearchPopupWrapper").addClass("hidden");
lengthSelect?.destroy();
lengthSelect = undefined;
if (focusWords) {
TestUI.focusWords();
$("#quoteSearchPopup .quoteLengthFilter").val([]);

View file

@ -5,6 +5,7 @@ import * as CaptchaController from "../controllers/captcha-controller";
import * as Misc from "../utils/misc";
import Config from "../config";
import * as Skeleton from "./skeleton";
import SlimSelect from "slim-select";
const wrapperId = "quoteSubmitPopupWrapper";
@ -18,10 +19,11 @@ async function initDropdown(): Promise<void> {
`<option value="${group.name}">${group.name.replace(/_/g, " ")}</option>`
);
}
$("#quoteSubmitPopup #submitQuoteLanguage").select2();
dropdownReady = true;
}
let select: SlimSelect | undefined = undefined;
async function submitQuote(): Promise<void> {
const text = $("#quoteSubmitPopup #submitQuoteText").val() as string;
const source = $("#quoteSubmitPopup #submitQuoteSource").val() as string;
@ -57,6 +59,11 @@ export async function show(noAnim = false): Promise<void> {
"submitQuote"
);
await initDropdown();
select = new SlimSelect({
select: "#quoteSubmitPopup #submitQuoteLanguage",
});
$("#quoteSubmitPopup #submitQuoteLanguage").val(
Misc.removeLanguageSize(Config.language)
);
@ -86,6 +93,8 @@ function hide(): void {
$("#quoteSubmitPopupWrapper").addClass("hidden");
CaptchaController.reset("submitQuote");
Skeleton.remove(wrapperId);
select?.destroy();
select = undefined;
}
);
}

View file

@ -4,6 +4,7 @@ import * as Notifications from "../elements/notifications";
import * as CaptchaController from "../controllers/captcha-controller";
import * as Skeleton from "./skeleton";
import { isPopupVisible } from "../utils/misc";
import SlimSelect from "slim-select";
const wrapperId = "userReportPopupWrapper";
@ -23,6 +24,8 @@ type ShowOptions = {
lbOptOut: boolean;
};
let select: SlimSelect | undefined = undefined;
export async function show(options: ShowOptions): Promise<void> {
Skeleton.append(wrapperId);
if (!isPopupVisible(wrapperId)) {
@ -39,9 +42,14 @@ export async function show(options: ShowOptions): Promise<void> {
$("#userReportPopup .reason").val("Inappropriate name");
$("#userReportPopup .comment").val("");
$("#userReportPopup .characterCount").text("-");
$("#userReportPopup .reason").select2({
minimumResultsForSearch: Infinity,
select = new SlimSelect({
select: "#userReportPopup .reason",
settings: {
showSearch: false,
},
});
$("#userReportPopupWrapper")
.stop(true, true)
.css("opacity", 0)
@ -63,6 +71,8 @@ async function hide(): Promise<void> {
},
125,
() => {
select?.destroy();
select = undefined;
CaptchaController.reset("userReportPopup");
$("#userReportPopupWrapper").addClass("hidden");
Skeleton.remove(wrapperId);

View file

@ -2,6 +2,7 @@ import * as Misc from "../utils/misc";
import * as CustomText from "../test/custom-text";
import * as Notifications from "../elements/notifications";
import * as Skeleton from "./skeleton";
import SlimSelect from "slim-select";
const wrapperId = "wordFilterPopupWrapper";
@ -117,14 +118,6 @@ async function init(): Promise<void> {
return;
}
LanguageList.forEach((language) => {
let prettyLang = language;
prettyLang = prettyLang.replace("_", " ");
$("#wordFilterPopup .languageInput").append(`
<option value=${language}>${prettyLang}</option>
`);
});
try {
LayoutList = await Misc.getLayoutsList();
} catch (e) {
@ -137,9 +130,17 @@ async function init(): Promise<void> {
return;
}
LanguageList.forEach((language) => {
const prettyLang = language.replace(/_/gi, " ");
$("#wordFilterPopup .languageInput").append(`
<option value=${language}>${prettyLang}</option>
`);
});
for (const layout in LayoutList) {
const prettyLayout = layout.replace(/_/gi, " ");
$("#wordFilterPopup .layoutInput").append(`
<option value=${layout}>${layout}</option>
<option value=${layout}>${prettyLayout}</option>
`);
}
@ -153,6 +154,10 @@ async function init(): Promise<void> {
}
}
let languageSelect: SlimSelect | undefined = undefined;
let layoutSelect: SlimSelect | undefined = undefined;
let presetSelect: SlimSelect | undefined = undefined;
let callbackFuncOnHide: (() => void) | undefined = undefined;
export async function show(
@ -163,16 +168,14 @@ export async function show(
if (!Misc.isPopupVisible(wrapperId)) {
await init();
callbackFuncOnHide = callbackOnHide;
$("#wordFilterPopup .languageInput").select2({
width: "100%",
languageSelect = new SlimSelect({
select: "#wordFilterPopup .languageInput",
});
$("#wordFilterPopup .layoutInput").select2({
width: "100%",
layoutSelect = new SlimSelect({
select: "#wordFilterPopup .layoutInput",
});
$("#wordFilterPopup .presetInput").select2({
width: "100%",
presetSelect = new SlimSelect({
select: "#wordFilterPopup .presetInput",
});
$("#wordFilterPopupWrapper .loadingIndicator").addClass("hidden");
$("#wordFilterPopupWrapper .button").removeClass("hidden");
@ -189,12 +192,6 @@ export async function show(
function hide(noAnim = false): void {
if (Misc.isPopupVisible(wrapperId)) {
$("#wordFilterPopup .languageInput").select2("close");
$("#wordFilterPopup .layoutInput").select2("close");
$("#wordFilterPopup .presetInput").select2("close");
$("#wordFilterPopupWrapper")
.stop(true, true)
.css("opacity", 1)
@ -204,6 +201,12 @@ function hide(noAnim = false): void {
},
noAnim ? 0 : 125,
() => {
languageSelect?.destroy();
layoutSelect?.destroy();
presetSelect?.destroy();
languageSelect = undefined;
layoutSelect = undefined;
presetSelect = undefined;
$("#wordFilterPopupWrapper").addClass("hidden");
Skeleton.remove(wrapperId);
if (callbackFuncOnHide) callbackFuncOnHide();
@ -286,10 +289,6 @@ $("#wordFilterPopupWrapper").on("mousedown", (e) => {
}
});
$("#wordFilterPopup .languageInput").one("select2:open", function () {
$("input.select2-search__field").prop("placeholder", "search");
});
$("#wordFilterPopupWrapper .button.addButton").on("mousedown", () => {
$("#wordFilterPopupWrapper .loadingIndicator").removeClass("hidden");
$("#wordFilterPopupWrapper .button").addClass("hidden");

View file

@ -37,7 +37,7 @@ void UpdateConfig.loadFromLocalStorage();
Focus.set(true, true);
$(document).ready(() => {
Misc.loadCSS("/./css/select2.min.css", true);
Misc.loadCSS("/./css/slimselect.min.css", true);
Misc.loadCSS("/./css/balloon.min.css", true);
Misc.loadCSS("/./css/fa.min.css", true);

View file

@ -1,5 +1,6 @@
import Config from "../config";
import * as Notifications from "../elements/notifications";
import SlimSelect from "slim-select";
export default class SettingsGroup<T extends SharedTypes.ConfigValue> {
public configName: string;
@ -25,20 +26,16 @@ export default class SettingsGroup<T extends SharedTypes.ConfigValue> {
this.updateUI();
if (this.mode === "select") {
$(".pageSettings").on(
"change",
`.section[data-config-name='${this.configName}'] select`,
(e) => {
const target = $(e.currentTarget);
if (
target.hasClass("disabled") ||
target.hasClass("no-auto-handle")
) {
return;
}
this.setValue(target.val() as T);
}
const selectElement = document.querySelector(
`.pageSettings .section[data-config-name=${this.configName}] select`
);
selectElement?.addEventListener("change", (e) => {
const target = $(e.target as HTMLSelectElement);
if (target.hasClass("disabled") || target.hasClass("no-auto-handle")) {
return;
}
this.setValue(target.val() as T);
});
} else if (this.mode === "button") {
$(".pageSettings").on(
"click",
@ -83,9 +80,16 @@ export default class SettingsGroup<T extends SharedTypes.ConfigValue> {
`.pageSettings .section[data-config-name='${this.configName}'] button`
).removeClass("active");
if (this.mode === "select") {
$(`.pageSettings .section[data-config-name='${this.configName}'] select`)
.val(this.configValue as string)
.trigger("change.select2");
const select = document.querySelector(
`.pageSettings .section[data-config-name='${this.configName}'] select`
) as HTMLSelectElement;
select.value = this.configValue as string;
//@ts-expect-error
const ss = select.slim as SlimSelect | undefined;
ss?.store.setSelectedBy("value", [this.configValue as string]);
ss?.render.renderValues();
ss?.render.renderOptions(ss.store.getData());
} else if (this.mode === "button") {
$(
// this cant be an object?

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -956,7 +956,9 @@
<span>keymap layout</span>
</div>
<div class="text">Controls which layout is displayed on the keymap.</div>
<select></select>
<div class="inputs">
<select></select>
</div>
</div>
<div class="section fullWidth" data-config-name="keymapStyle">
<div class="groupTitle">

View file

@ -638,7 +638,7 @@
autocomplete="off"
placeholder="Filter by text"
/>
<select class="quoteLengthFilter"></select>
<select class="quoteLengthFilter" multiple></select>
<div id="toggleShowFavorites" class="button">Favorites Only</div>
</div>
<div id="quoteSearchResults" class="quoteSearchResults"></div>

View file

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const { resolve, join } = require("path");
const { resolve } = require("path");
const webpack = require("webpack");
const CopyPlugin = require("copy-webpack-plugin");
const CircularDependencyPlugin = require("circular-dependency-plugin");
@ -115,7 +115,6 @@ const BASE_CONFIG = {
jQuery: "jquery",
jQueryColor: "jquery-color",
jQueryEasing: "jquery.easing",
select2: "select2",
}),
new HtmlWebpackPlugin({
filename: "./index.html",