|
50 | 50 | ); |
51 | 51 | }; |
52 | 52 | }) |
53 | | - .directive('themeDropdown', function ($document) { |
54 | | - return { |
55 | | - restrict: 'A', |
56 | | - link: function ($scope, $element, $attr) { |
57 | | - $element.bind('click', function () { |
58 | | - $element.toggleClass('open'); |
59 | | - $element.addClass('open-recent'); |
60 | | - }); |
61 | | - |
62 | | - $document.bind('click', function () { |
63 | | - if (!$element.hasClass('open-recent')) { |
64 | | - $element.removeClass('open'); |
65 | | - } |
66 | | - $element.removeClass('open-recent'); |
67 | | - }) |
68 | | - } |
69 | | - } |
70 | | - }) |
71 | | - .directive('settingsDropdown', function ($document) { |
72 | | - return { |
73 | | - restrict: 'A', |
74 | | - link: function ($scope, $element, $attr) { |
75 | | - $element.bind('click', function () { |
76 | | - $element.toggleClass('open'); |
77 | | - $element.addClass('open-recent'); |
78 | | - }); |
79 | | - |
80 | | - $document.bind('click', function () { |
81 | | - if (!$element.hasClass('open-recent')) { |
82 | | - $element.removeClass('open'); |
83 | | - } |
84 | | - $element.removeClass('open-recent'); |
85 | | - }) |
86 | | - } |
87 | | - } |
88 | | - }) |
89 | 53 | .directive('filterDropdown', function ($document) { |
90 | 54 | return { |
91 | 55 | restrict: 'A', |
|
145 | 109 | ...GROUPS_FILTER_DEFAULT |
146 | 110 | }; |
147 | 111 |
|
148 | | - const THEMES_DEFAULT = { |
149 | | - light: "Light", |
150 | | - rust: "Rust", |
151 | | - coal: "Coal", |
152 | | - navy: "Navy", |
153 | | - ayu: "Ayu" |
154 | | - }; |
155 | | - $scope.themes = THEMES_DEFAULT; |
156 | | - |
157 | 112 | $scope.versionFilters = { |
158 | 113 | "≥": {enabled: false, minorVersion: null }, |
159 | 114 | "≤": {enabled: false, minorVersion: null }, |
|
339 | 294 | $location.path($scope.search); |
340 | 295 | } |
341 | 296 |
|
342 | | - $scope.selectTheme = function (theme) { |
343 | | - setTheme(theme, true); |
344 | | - } |
345 | | - |
346 | 297 | $scope.toggleLevels = function (value) { |
347 | 298 | const levels = $scope.levels; |
348 | 299 | for (const key in levels) { |
@@ -598,6 +549,8 @@ function setTheme(theme, store) { |
598 | 549 |
|
599 | 550 | if (store) { |
600 | 551 | storeValue("theme", theme); |
| 552 | + } else { |
| 553 | + document.getElementById(`theme-choice`).value = theme; |
601 | 554 | } |
602 | 555 | } |
603 | 556 |
|
@@ -634,6 +587,48 @@ function changeSetting(elem) { |
634 | 587 | } |
635 | 588 | } |
636 | 589 |
|
| 590 | +function onEachLazy(lazyArray, func) { |
| 591 | + const arr = Array.prototype.slice.call(lazyArray); |
| 592 | + for (const el of arr) { |
| 593 | + func(el); |
| 594 | + } |
| 595 | +} |
| 596 | + |
| 597 | +function handleBlur(event) { |
| 598 | + const parent = document.getElementById("settings-dropdown"); |
| 599 | + if (!parent.contains(document.activeElement) && |
| 600 | + !parent.contains(event.relatedTarget) |
| 601 | + ) { |
| 602 | + parent.classList.remove("open"); |
| 603 | + } |
| 604 | +} |
| 605 | + |
| 606 | +function generateSettings() { |
| 607 | + const THEMES = ["Ayu", "Coal", "Light", "Navy", "Rust"]; |
| 608 | + const themesElem = document.getElementById("theme-choice"); |
| 609 | + let children = ''; |
| 610 | + |
| 611 | + for (const theme of THEMES) { |
| 612 | + const id = theme.toLowerCase(); |
| 613 | + children += `<option value="${id}">${theme}</option>`; |
| 614 | + } |
| 615 | + themesElem.innerHTML = children; |
| 616 | + themesElem.onblur = handleBlur; |
| 617 | + |
| 618 | + const settings = document.getElementById("settings-dropdown"); |
| 619 | + const settingsButton = settings.querySelector(".settings-icon") |
| 620 | + settingsButton.onclick = () => settings.classList.toggle("open"); |
| 621 | + settingsButton.onblur = handleBlur; |
| 622 | + const settingsMenu = settings.querySelector(".settings-menu"); |
| 623 | + settingsMenu.onblur = handleBlur; |
| 624 | + onEachLazy( |
| 625 | + settingsMenu.querySelectorAll("input"), |
| 626 | + el => el.onblur = handleBlur, |
| 627 | + ); |
| 628 | +} |
| 629 | + |
| 630 | +generateSettings(); |
| 631 | + |
637 | 632 | // loading the theme after the initial load |
638 | 633 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)"); |
639 | 634 | const theme = loadValue('theme'); |
|
0 commit comments