journal.cljs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. (ns frontend.components.journal
  2. (:require [rum.core :as rum]
  3. [frontend.util :as util :refer-macros [profile]]
  4. [frontend.date :as date]
  5. [frontend.db-mixins :as db-mixins]
  6. [frontend.handler.notification :as notification]
  7. [frontend.handler.repo :as repo-handler]
  8. [frontend.handler.page :as page-handler]
  9. [frontend.handler.editor :as editor-handler]
  10. [frontend.handler.ui :as ui-handler]
  11. [frontend.db :as db]
  12. [frontend.state :as state]
  13. [clojure.string :as string]
  14. [frontend.ui :as ui]
  15. [frontend.format :as format]
  16. [frontend.components.content :as content]
  17. [frontend.components.hiccup :as hiccup]
  18. [frontend.components.editor :as editor]
  19. [frontend.components.reference :as reference]
  20. [frontend.components.page :as page]
  21. [frontend.components.onboarding :as onboarding]
  22. [frontend.utf8 :as utf8]
  23. [goog.object :as gobj]
  24. [clojure.string :as string]))
  25. (rum/defc blocks-inner < rum/static
  26. {:did-mount (fn [state]
  27. (let [[blocks _ page] (:rum/args state)
  28. first-title (second (first (:block/title (first blocks))))
  29. journal? (and (string? first-title)
  30. (date/valid-journal-title? first-title))]
  31. (when (and journal?
  32. (= (string/lower-case first-title) (string/lower-case page)))
  33. (notification/show!
  34. [:div
  35. [:p
  36. (util/format
  37. "It seems that you have multiple journals for the same day \"%s\"."
  38. first-title)]
  39. (ui/button "Go to files"
  40. :href "/all-files"
  41. :on-click notification/clear!)]
  42. :error
  43. false)))
  44. state)}
  45. [blocks encoded-page-name page]
  46. (let [start-level (or (:block/level (first blocks)) 1)]
  47. (content/content
  48. encoded-page-name
  49. {:hiccup (hiccup/->hiccup blocks
  50. {:id encoded-page-name
  51. :start-level 2
  52. :editor-box editor/box}
  53. {})})))
  54. (rum/defc blocks-cp < rum/reactive db-mixins/query
  55. {}
  56. [repo page encoded-page-name format]
  57. (let [raw-blocks (db/get-page-blocks repo page)
  58. blocks (->>
  59. (db/with-dummy-block raw-blocks format nil true)
  60. (db/with-block-refs-count repo))]
  61. (blocks-inner blocks encoded-page-name page)))
  62. (rum/defc journal-cp < rum/reactive
  63. [[title format]]
  64. (let [;; Don't edit the journal title
  65. page (string/lower-case title)
  66. repo (state/sub :git/current-repo)
  67. encoded-page-name (util/encode-str page)
  68. today? (= (string/lower-case title)
  69. (string/lower-case (date/journal-name)))
  70. intro? (and (not (state/logged?))
  71. today?)]
  72. [:div.flex-1.journal.page {:class (if intro? "intro" "")}
  73. (ui/foldable
  74. [:a.initial-color.title
  75. {:href (str "/page/" encoded-page-name)
  76. :on-click (fn [e]
  77. (util/stop e)
  78. (when (gobj/get e "shiftKey")
  79. (when-let [page (db/pull [:page/name title])]
  80. (state/sidebar-add-block!
  81. (state/get-current-repo)
  82. (:db/id page)
  83. :page
  84. {:page page
  85. :journal? true}))))}
  86. [:h1.title
  87. (util/capitalize-all title)]]
  88. (blocks-cp repo page encoded-page-name format))
  89. (page/today-queries repo today? false)
  90. (reference/references title false)
  91. (when intro?
  92. (onboarding/intro))]))
  93. (rum/defc journals <
  94. {:did-mount (fn [state]
  95. (editor-handler/open-last-block! true)
  96. state)}
  97. [latest-journals]
  98. [:div#journals
  99. (ui/infinite-list
  100. (for [[journal-name format] latest-journals]
  101. [:div.journal.content {:key journal-name}
  102. (journal-cp [journal-name format])])
  103. {:on-load (fn []
  104. (page-handler/load-more-journals!))})])
  105. (rum/defc all-journals < rum/reactive db-mixins/query
  106. []
  107. (let [journals-length (state/sub :journals-length)
  108. latest-journals (db/get-latest-journals (state/get-current-repo) journals-length)]
  109. (journals latest-journals)))