Browse Source

fix: can't switch between org and md

Tienson Qin 4 years ago
parent
commit
b71ae70491

+ 1 - 1
src/main/frontend/commands.cljs

@@ -194,7 +194,7 @@
   ([type]
    (->block type nil))
   ([type optional]
-   (let [format (get state/get-edit-block :block/format :markdown)
+   (let [format (get (state/get-edit-block) :block/format :markdown)
          org? (= format :org)
          t (string/lower-case type)
          markdown-src? (and (= format :markdown) (= t "src"))

+ 0 - 497
src/main/frontend/components/page.cljs.~e600c29046589a778b9a28a2122606358d7ab458~

@@ -1,497 +0,0 @@
-(ns frontend.components.page
-  (:require [rum.core :as rum]
-            [frontend.util :as util :refer-macros [profile]]
-            [frontend.util.marker :as marker]
-            [frontend.tools.html-export :as html-export]
-            [frontend.handler.file :as file]
-            [frontend.handler.page :as page-handler]
-            [frontend.handler.ui :as ui-handler]
-            [frontend.handler.common :as common-handler]
-            [frontend.handler.route :as route-handler]
-            [frontend.handler.graph :as graph-handler]
-            [frontend.handler.notification :as notification]
-            [frontend.handler.editor :as editor-handler]
-            [frontend.state :as state]
-            [clojure.string :as string]
-            [frontend.components.block :as block]
-            [frontend.components.editor :as editor]
-            [frontend.components.reference :as reference]
-            [frontend.components.svg :as svg]
-            [frontend.components.export :as export]
-            [frontend.extensions.graph-2d :as graph-2d]
-            [frontend.ui :as ui]
-            [frontend.components.content :as content]
-            [frontend.config :as config]
-            [frontend.db :as db]
-            [frontend.db.model :as model]
-            [frontend.db.utils :as db-utils]
-            [frontend.mixins :as mixins]
-            [frontend.db-mixins :as db-mixins]
-            [goog.dom :as gdom]
-            [goog.object :as gobj]
-            [frontend.utf8 :as utf8]
-            [frontend.date :as date]
-            [frontend.graph :as graph]
-            [frontend.format.mldoc :as mldoc]
-            [cljs-time.coerce :as tc]
-            [cljs-time.core :as t]
-            [cljs.pprint :as pprint]
-            [frontend.context.i18n :as i18n]
-            [reitit.frontend.easy :as rfe]
-            [frontend.text :as text]
-            [frontend.modules.shortcut.core :as shortcut]
-            [frontend.handler.block :as block-handler]))
-
-(defn- get-page-name
-  [state]
-  (let [route-match (first (:rum/args state))]
-    (get-in route-match [:parameters :path :name])))
-
-(defn- get-blocks
-  [repo page-name page-original-name block? block-id]
-  (when page-name
-    (if block?
-      (db/get-block-and-children repo block-id)
-      (do
-        (page-handler/add-page-to-recent! repo page-original-name)
-        (db/get-page-blocks repo page-name)))))
-
-(defn- open-first-block!
-  [state]
-  (let [blocks (nth (:rum/args state) 1)
-        block (first blocks)]
-    (when (:block/dummy? block)
-      (editor-handler/edit-block! block :max (:block/format block) (:block/uuid block))))
-  state)
-(rum/defc page-blocks-inner <
-  {:did-mount open-first-block!
-   :did-update open-first-block!}
-  [page-name page-blocks hiccup sidebar?]
-  [:div.page-blocks-inner
-   (rum/with-key
-     (content/content page-name
-                      {:hiccup   hiccup
-                       :sidebar? sidebar?})
-     (str page-name "-hiccup"))])
-
-(declare page)
-
-(defn- get-page-format
-  [page-name]
-  (let [block? (util/uuid-string? page-name)
-        block-id (and block? (uuid page-name))
-        page (if block-id
-               (:block/name (:block/page (db/entity [:block/uuid block-id])))
-               page-name)]
-    (db/get-page-format page)))
-
-(rum/defc page-blocks-cp < rum/reactive
-  db-mixins/query
-  [repo page-e sidebar?]
-  (let [page-name (or (:block/name page-e)
-                      (str (:block/uuid page-e)))
-        page-original-name (or (:block/original-name page-e) page-name)
-        format (get-page-format page-name)
-        journal? (db/journal-page? page-name)
-        block? (util/uuid-string? page-name)
-        block-id (and block? (uuid page-name))
-        raw-page-blocks (get-blocks repo page-name page-original-name block? block-id)
-        page-blocks (block-handler/with-dummy-block raw-page-blocks format
-                      (if (empty? raw-page-blocks)
-                        {:block/page {:db/id (:db/id page-e)}
-                         :block/file {:db/id (:db/id (:block/file page-e))}})
-                      {:journal? journal?
-                       :page-name page-name})
-        hiccup-config {:id (if block? (str block-id) page-name)
-                       :sidebar? sidebar?
-                       :block? block?
-                       :editor-box editor/box
-                       :page page}
-        hiccup-config (common-handler/config-with-document-mode hiccup-config)
-        hiccup (block/->hiccup page-blocks hiccup-config {})]
-    (page-blocks-inner page-name page-blocks hiccup sidebar?)))
-
-(defn contents-page
-  [page]
-  (when-let [repo (state/get-current-repo)]
-    (page-blocks-cp repo page true)))
-
-(rum/defc today-queries < rum/reactive
-  [repo today? sidebar?]
-  (when (and today? (not sidebar?))
-    (let [queries (state/sub [:config repo :default-queries :journals])]
-      (when (seq queries)
-        [:div#today-queries.mt-10
-         (for [{:keys [title] :as query} queries]
-           (rum/with-key
-             (block/custom-query {:attr {:class "mt-10"}
-                                  :editor-box editor/box
-                                  :page page} query)
-             (str repo "-custom-query-" (:query query))))]))))
-
-(defn- delete-page!
-  [page-name]
-  (page-handler/delete! page-name
-                        (fn []
-                          (notification/show! (str "Page " page-name " was deleted successfully!")
-                                              :success)))
-  (state/close-modal!)
-  (route-handler/redirect-to-home!))
-
-(defn delete-page-dialog
-  [page-name]
-  (fn [close-fn]
-    (rum/with-context [[t] i18n/*tongue-context*]
-      [:div
-       [:div.sm:flex.sm:items-start
-        [:div.mx-auto.flex-shrink-0.flex.items-center.justify-center.h-12.w-12.rounded-full.bg-red-100.sm:mx-0.sm:h-10.sm:w-10
-         [:svg.h-6.w-6.text-red-600
-          {:stroke "currentColor", :view-box "0 0 24 24", :fill "none"}
-          [:path
-           {:d
-            "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
-            :stroke-width "2"
-            :stroke-linejoin "round"
-            :stroke-linecap "round"}]]]
-        [:div.mt-3.text-center.sm:mt-0.sm:ml-4.sm:text-left
-         [:h3#modal-headline.text-lg.leading-6.font-medium
-          (t :page/delete-confirmation)]]]
-
-       [:div.mt-5.sm:mt-4.sm:flex.sm:flex-row-reverse
-        [:span.flex.w-full.rounded-md.shadow-sm.sm:ml-3.sm:w-auto
-         [:button.inline-flex.justify-center.w-full.rounded-md.border.border-transparent.px-4.py-2.bg-indigo-600.text-base.leading-6.font-medium.text-white.shadow-sm.hover:bg-indigo-500.focus:outline-none.focus:border-indigo-700.focus:shadow-outline-indigo.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
-          {:type "button"
-           :on-click (fn []
-                       (delete-page! page-name))}
-          (t :yes)]]
-        [:span.mt-3.flex.w-full.rounded-md.shadow-sm.sm:mt-0.sm:w-auto
-         [:button.inline-flex.justify-center.w-full.rounded-md.border.border-gray-300.px-4.py-2.bg-white.text-base.leading-6.font-medium.text-gray-700.shadow-sm.hover:text-gray-500.focus:outline-none.focus:border-blue-300.focus:shadow-outline-blue.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
-          {:type "button"
-           :on-click close-fn}
-          (t :cancel)]]]])))
-
-(rum/defcs rename-page-dialog-inner <
-  (shortcut/disable-all-shortcuts)
-  (rum/local "" ::input)
-  [state title page-name close-fn]
-  (let [input (get state ::input)]
-    (rum/with-context [[t] i18n/*tongue-context*]
-      [:div.w-full.sm:max-w-lg.sm:w-96
-       [:div.sm:flex.sm:items-start
-        [:div.mt-3.text-center.sm:mt-0.sm:text-left
-         [:h3#modal-headline.text-lg.leading-6.font-medium
-          (t :page/rename-to title)]]]
-
-       [:input.form-input.block.w-full.sm:text-sm.sm:leading-5.my-2
-        {:auto-focus true
-         :on-change (fn [e]
-                      (reset! input (util/evalue e)))}]
-
-       [:div.mt-5.sm:mt-4.sm:flex.sm:flex-row-reverse
-        [:span.flex.w-full.rounded-md.shadow-sm.sm:ml-3.sm:w-auto
-         [:button.inline-flex.justify-center.w-full.rounded-md.border.border-transparent.px-4.py-2.bg-indigo-600.text-base.leading-6.font-medium.text-white.shadow-sm.hover:bg-indigo-500.focus:outline-none.focus:border-indigo-700.focus:shadow-outline-indigo.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
-          {:type "button"
-           :on-click (fn []
-                       (let [value (string/trim @input)]
-                         (when-not (string/blank? value)
-                           (page-handler/rename! page-name value)
-                           (state/close-modal!))))}
-          (t :submit)]]
-        [:span.mt-3.flex.w-full.rounded-md.shadow-sm.sm:mt-0.sm:w-auto
-         [:button.inline-flex.justify-center.w-full.rounded-md.border.border-gray-300.px-4.py-2.bg-white.text-base.leading-6.font-medium.text-gray-700.shadow-sm.hover:text-gray-500.focus:outline-none.focus:border-blue-300.focus:shadow-outline-blue.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
-          {:type "button"
-           :on-click close-fn}
-          (t :cancel)]]]])))
-
-(defn rename-page-dialog
-  [title page-name]
-  (fn [close-fn]
-    (rename-page-dialog-inner title page-name close-fn)))
-
-(defn tagged-pages
-  [repo tag]
-  (let [pages (db/get-tag-pages repo tag)]
-    (when (seq pages)
-      [:div.references.mt-6.flex-1.flex-row
-       [:div.content
-        (ui/foldable
-         [:h2.font-bold.opacity-50 (util/format "Pages tagged with \"%s\"" tag)]
-         [:ul.mt-2
-          (for [[original-name name] pages]
-            [:li {:key (str "tagged-page-" name)}
-             [:a {:href (rfe/href :page {:name name})}
-              original-name]])] false)]])))
-
-;; A page is just a logical block
-(rum/defcs page < rum/reactive
-  [state {:keys [repo page-name preview?] :as option}]
-  (when-let [path-page-name (or page-name
-                                (get-page-name state)
-                                (state/get-current-page))]
-    (let [current-repo (state/sub :git/current-repo)
-         repo (or repo current-repo)
-         page-name (string/lower-case path-page-name)
-         block? (util/uuid-string? page-name)
-         block-id (and block? (uuid page-name))
-         format (let [page (if block-id
-                             (:block/name (:block/page (db/entity [:block/uuid block-id])))
-                             page-name)]
-                  (db/get-page-format page))
-         journal? (db/journal-page? page-name)
-         sidebar? (:sidebar? option)]
-     (rum/with-context [[t] i18n/*tongue-context*]
-       (let [route-page-name path-page-name
-             page (if block?
-                    (->> (:db/id (:block/page (db/entity repo [:block/uuid block-id])))
-                         (db/entity repo))
-                    (db/entity repo [:block/name page-name]))
-             ;; TODO: replace page with frontend.format.block/page->map
-             page (if page page (do
-                                  (db/transact! repo [{:block/name page-name
-                                                       :block/original-name path-page-name
-                                                       :block/uuid (db/new-block-id)}])
-                                  (db/entity repo [:block/name page-name])))
-             {:keys [title] :as properties} (:block/properties page)
-             page-name (:block/name page)
-             page-original-name (:block/original-name page)
-             title (or title page-original-name page-name)
-             today? (and
-                     journal?
-                     (= page-name (string/lower-case (date/journal-name))))
-             developer-mode? (state/sub [:ui/developer-mode?])
-             public? (true? (:public properties))]
-         [:div.flex-1.page.relative (if (seq (:block/tags page))
-                                      (let [page-names (model/get-page-names-by-ids (map :db/id (:block/tags page)))]
-                                        {:data-page-tags (text/build-data-value page-names)})
-                                      {})
-          [:div.relative
-           (when (and (not sidebar?)
-                      (not block?))
-             [:div.flex.flex-row.space-between
-              [:div.flex-1.flex-row
-               [:a {:on-click (fn [e]
-                                (.preventDefault e)
-                                (when (gobj/get e "shiftKey")
-                                  (when-let [page (db/pull repo '[*] [:block/name page-name])]
-                                    (state/sidebar-add-block!
-                                     repo
-                                     (:db/id page)
-                                     :page
-                                     {:page page}))))}
-                [:h1.title {:style {:margin-left -2}}
-                 (if page-original-name
-                   (if (and (string/includes? page-original-name "[[")
-                            (string/includes? page-original-name "]]"))
-                     (let [ast (mldoc/->edn page-original-name (mldoc/default-config format))]
-                       (block/markup-element-cp {} (ffirst ast)))
-                     page-original-name)
-                   (or
-                    page-name
-                    path-page-name))]]]
-              (when (not config/publishing?)
-                (let [contents? (= (string/lower-case (str page-name)) "contents")
-                      links (fn [] (->>
-                                   [(when-not contents?
-                                      {:title   (t :page/add-to-contents)
-                                       :options {:on-click (fn [] (page-handler/handle-add-page-to-contents! page-original-name))}})
-
-                                    {:title "Go to presentation mode"
-                                     :options {:on-click (fn []
-                                                           (state/sidebar-add-block!
-                                                            repo
-                                                            (:db/id page)
-                                                            :page-presentation
-                                                            {:page page}))}}
-                                    (when-not contents?
-                                      {:title   (t :page/rename)
-                                       :options {:on-click #(state/set-modal! (rename-page-dialog title page-name))}})
-
-                                    (when-let [file-path (and (util/electron?) (page-handler/get-page-file-path))]
-                                      [{:title   (t :page/open-in-finder)
-                                        :options {:on-click #(js/window.apis.showItemInFolder file-path)}}
-                                       {:title   (t :page/open-with-default-app)
-                                        :options {:on-click #(js/window.apis.openPath file-path)}}])
-
-                                    (when-not contents?
-                                      {:title   (t :page/delete)
-                                       :options {:on-click #(state/set-modal! (delete-page-dialog page-name))}})
-
-                                    (when (state/get-current-page)
-                                      {:title   (t :export)
-                                       :options {:on-click #(state/set-modal! export/export-page)}})
-
-                                    (when (util/electron?)
-                                      {:title   (t (if public? :page/make-private :page/make-public))
-                                       :options {:on-click
-                                                 (fn []
-                                                   (page-handler/update-public-attribute!
-                                                    page-name
-                                                    (if public? false true))
-                                                   (state/close-modal!))}})
-
-                                    (when developer-mode?
-                                      {:title   "(Dev) Show page data"
-                                       :options {:on-click (fn []
-                                                             (let [page-data (with-out-str (pprint/pprint (db/pull (:db/id page))))]
-                                                               (println page-data)
-                                                               (notification/show!
-                                                                [:div
-                                                                 [:pre.code page-data]
-                                                                 [:br]
-                                                                 (ui/button "Copy to clipboard"
-                                                                   :on-click #(.writeText js/navigator.clipboard page-data))]
-                                                                :success
-                                                                false)))}})]
-                                   (flatten)
-                                   (remove nil?)))]
-                  [:div.flex.flex-row
-                   [:a.opacity-30.hover:opacity-100.page-op.mr-1
-                    {:title "Search in current page"
-                     :on-click #(route-handler/go-to-search! :page)}
-                    svg/search]
-                   (ui/dropdown-with-links
-                    (fn [{:keys [toggle-fn]}]
-                      [:a.cp__vertial-menu-button
-                       {:title    "More options"
-                        :on-click toggle-fn}
-                       (svg/vertical-dots nil)])
-                    links
-                    {:modal-class (util/hiccup->class
-                                   "origin-top-right.absolute.right-0.top-10.mt-2.rounded-md.shadow-lg.whitespace-no-wrap.dropdown-overflow-auto.page-drop-options")
-                     :z-index     1})]))])
-           [:div
-            (when (and repo (not block?))
-              (let [alias (db/get-page-alias-names repo page-name)]
-                (when (seq alias)
-                  [:div.text-sm.ml-1.mb-4 {:key "page-file"}
-                   [:span.opacity-50 "Alias: "]
-                   (for [item alias]
-                     [:a.ml-1.mr-1 {:href (rfe/href :page {:name item})}
-                      item])])))
-
-            (when (and block? (not sidebar?))
-              (let [config {:id "block-parent"
-                            :block? true}]
-                [:div.mb-4
-                 (block/block-parents config repo block-id format)]))
-
-            ;; blocks
-            (let [page (if block?
-                         (db/entity repo [:block/uuid block-id])
-                         page)]
-              (page-blocks-cp repo page sidebar?))]]
-
-          (when-not block?
-            (today-queries repo today? sidebar?))
-
-          (tagged-pages repo page-name)
-
-          ;; referenced blocks
-          [:div {:key "page-references"}
-           (rum/with-key
-             (reference/references route-page-name false)
-             (str route-page-name "-refs"))]
-
-          ;; TODO: or we can lazy load them
-          (when-not sidebar?
-            [:div {:key "page-unlinked-references"}
-             (reference/unlinked-references route-page-name)])])))))
-
-(defonce layout (atom [js/window.outerWidth js/window.outerHeight]))
-
-(defonce graph-ref (atom nil))
-(defonce show-journal? (atom false))
-
-(rum/defcs global-graph < rum/reactive
-  (mixins/event-mixin
-   (fn [state]
-     (mixins/listen state js/window "resize"
-                    (fn [e]
-                      (reset! layout [js/window.outerWidth js/window.outerHeight])))))
-  [state]
-  (let [theme (state/sub :ui/theme)
-        sidebar-open? (state/sub :ui/sidebar-open?)
-        [width height] (rum/react layout)
-        dark? (= theme "dark")
-        graph (graph-handler/build-global-graph theme (rum/react show-journal?))]
-    (rum/with-context [[t] i18n/*tongue-context*]
-      [:div.relative#global-graph
-       (if (seq (:nodes graph))
-         (graph-2d/graph
-          (graph/build-graph-opts
-           graph
-           dark?
-           {:width (if (and (> width 1280) sidebar-open?)
-                     (- width 24 600)
-                     (- width 24))
-            :height height
-            :ref (fn [v] (reset! graph-ref v))
-            :ref-atom graph-ref}))
-         [:div.ls-center.mt-20
-          [:p.opacity-70.font-medium "Empty"]])
-       [:div.absolute.top-10.left-5
-        [:div.flex.flex-col
-         [:a.text-sm.font-medium
-          {:on-click (fn [_e]
-                       (swap! show-journal? not))}
-          (str (t :page/show-journals)
-               (if @show-journal? " (ON)"))]]]])))
-
-(rum/defc all-pages < rum/reactive
-  ;; {:did-mount (fn [state]
-  ;;               (let [current-repo (state/sub :git/current-repo)]
-  ;;                 (js/setTimeout #(db/remove-orphaned-pages! current-repo) 0))
-  ;;               state)}
-  []
-  (let [current-repo (state/sub :git/current-repo)]
-    (rum/with-context [[t] i18n/*tongue-context*]
-      [:div.flex-1
-       [:h1.title (t :all-pages)]
-       (when current-repo
-         (let [pages (page-handler/get-pages-with-modified-at current-repo)]
-           [:table.table-auto
-            [:thead
-             [:tr
-              [:th (t :block/name)]
-              [:th (t :file/last-modified-at)]]]
-            [:tbody
-             (for [page pages]
-               [:tr {:key page}
-                [:td [:a {:on-click (fn [e]
-                                      (let [repo (state/get-current-repo)
-                                            page (db/pull repo '[*] [:block/name (string/lower-case page)])]
-                                        (when (gobj/get e "shiftKey")
-                                          (state/sidebar-add-block!
-                                           repo
-                                           (:db/id page)
-                                           :page
-                                           {:page page}))))
-                          :href (rfe/href :page {:name page})}
-                      page]]
-                [:td [:span.text-gray-500.text-sm
-                      (t :file/no-data)]]])]]))])))
-
-(rum/defcs new < rum/reactive
-  (rum/local "" ::title)
-  (mixins/event-mixin
-   (fn [state]
-     (mixins/on-enter state
-                      :node (gdom/getElement "page-title")
-                      :on-enter (fn []
-                                  (let [title @(get state ::title)]
-                                    (when-not (string/blank? title)
-                                      (page-handler/create! title)))))))
-  [state]
-  (rum/with-context [[t] i18n/*tongue-context*]
-    (let [title (get state ::title)]
-      [:div#page-new.flex-1.flex-col {:style {:flex-wrap "wrap"}}
-       [:div.mt-10.mb-2 {:style {:font-size "1.5rem"}}
-        (t :page/new-title)]
-       [:input#page-title.focus:outline-none.ml-1
-        {:style {:border "none"
-                 :font-size "1.8rem"
-                 :max-width 300}
-         :auto-focus true
-         :auto-complete "off"
-         :on-change (fn [e]
-                      (reset! title (util/evalue e)))}]])))

+ 6 - 3
src/main/frontend/db/model.cljs

@@ -318,9 +318,12 @@
 (defn get-page-format
   [page-name]
   (or
-   (when-let [file (:block/file (db-utils/entity [:block/name page-name]))]
-     (when-let [path (:file/path (db-utils/entity (:db/id file)))]
-       (format/get-format path)))
+   (let [page (db-utils/entity [:block/name page-name])]
+     (or
+      (:block/format page)
+      (when-let [file (:block/file page)]
+        (when-let [path (:file/path (db-utils/entity (:db/id file)))]
+          (format/get-format path)))))
    :markdown))
 
 (defn page-alias-set

+ 2 - 1
src/main/frontend/handler/page.cljs

@@ -69,8 +69,9 @@
            :or {redirect? true}}]
    (let [title (string/trim title)
          page (string/lower-case title)
-         tx (block/page-name->map title true)
          format (state/get-preferred-format)
+         tx (-> (block/page-name->map title true)
+                (assoc :block/format format))
          page-entity [:block/uuid (:block/uuid tx)]
          create-title-property? (and title (util/include-windows-reserved-chars? title))
          default-properties (default-properties-block title format page-entity)