find_in_page.cljs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. (ns frontend.components.find-in-page
  2. (:require [rum.core :as rum]
  3. [frontend.ui :as ui]
  4. [frontend.state :as state]
  5. [frontend.util :as util]
  6. [frontend.handler.search :as search-handler :refer [debounced-search]]
  7. [goog.dom :as gdom]
  8. [frontend.mixins :as mixins]
  9. [clojure.string :as string]))
  10. (rum/defc search-input
  11. [q matches]
  12. [:div.flex.w-48.relative
  13. [:input#search-in-page-input.form-input.block.sm:text-sm.sm:leading-5.my-2.border-none.mr-4.outline-none
  14. {:auto-focus true
  15. :placeholder "Find in page"
  16. :aria-label "Find in page"
  17. :value q
  18. :on-change (fn [e]
  19. (let [value (util/evalue e)]
  20. (state/set-state! [:ui/find-in-page :q] value)
  21. (debounced-search)))}]
  22. (when-not (string/blank? q)
  23. (when-let [total (:matches matches)]
  24. [:div.text-sm.absolute.top-2.right-0.py-2.px-4
  25. (:activeMatchOrdinal matches 0)
  26. "/"
  27. total]))])
  28. (rum/defc search-inner < rum/static
  29. (mixins/event-mixin
  30. (fn [state]
  31. (mixins/hide-when-esc-or-outside
  32. state
  33. :node (gdom/getElement "search-in-page")
  34. :on-hide (fn []
  35. (search-handler/electron-exit-find-in-page!)))))
  36. [{:keys [matches match-case? q]}]
  37. [:div#search-in-page.flex.flex-row.absolute.top-2.right-4.shadow-lg.px-2.py-1.faster-fade-in.items-center
  38. (search-input q matches)
  39. (ui/button
  40. (ui/icon "letter-case")
  41. :on-click (fn []
  42. (state/update-state! [:ui/find-in-page :match-case?] not)
  43. (debounced-search))
  44. :intent "link"
  45. :small? true
  46. :class (str (when match-case? "active ") "text-lg"))
  47. (ui/button
  48. (ui/icon "caret-up")
  49. :on-click (fn []
  50. (state/set-state! [:ui/find-in-page :backward?] true)
  51. (debounced-search))
  52. :intent "link"
  53. :small? true
  54. :class "text-lg"
  55. :title "Previous result")
  56. (ui/button
  57. (ui/icon "caret-down")
  58. :on-click (fn []
  59. (state/set-state! [:ui/find-in-page :backward?] false)
  60. (debounced-search))
  61. :intent "link"
  62. :small? true
  63. :class "text-lg"
  64. :title "Next result")
  65. (ui/button
  66. (ui/icon "x")
  67. :on-click (fn []
  68. (search-handler/electron-exit-find-in-page!))
  69. :intent "link"
  70. :small? true
  71. :class "text-lg"
  72. :title "Close")])
  73. (rum/defc search < rum/reactive
  74. []
  75. (let [{:keys [active?] :as opt} (state/sub :ui/find-in-page)]
  76. (when active?
  77. (search-inner opt))))