Explorar o código

fix: hidden page names displayed in references or query results

ref LOG-2854
Tienson Qin %!s(int64=2) %!d(string=hai) anos
pai
achega
9c251ff413

+ 15 - 3
src/main/frontend/components/block.cljs

@@ -3542,6 +3542,15 @@
                                      :navigating-block *navigating-block
                                      :navigated? navigated?))]))
 
+(defn hidden-page->source-page
+  [page]
+  (or
+   (when-let [page-uuid (get-in (db/entity (:db/id page)) [:block/metadata :source-page-id])]
+     (db/entity [:block/uuid page-uuid]))
+
+   ;; FIXME: what if the source page has been deleted?
+   page))
+
 ;; headers to hiccup
 (defn ->hiccup
   [blocks config option]
@@ -3555,7 +3564,8 @@
         (for [[page blocks] blocks]
           (ui/lazy-visible
            (fn []
-             (let [alias? (:block/alias? page)
+             (let [page (hidden-page->source-page page)
+                   alias? (:block/alias? page)
                    page (db/entity (:db/id page))
                    blocks (tree/non-consecutive-blocks->vec-tree blocks)
                    parent-blocks (group-by :block/parent blocks)]
@@ -3585,7 +3595,8 @@
         (for [[page page-blocks] blocks]
           (ui/lazy-visible
            (fn []
-             (let [alias? (:block/alias? page)
+             (let [page (hidden-page->source-page page)
+                   alias? (:block/alias? page)
                    page (db/entity (:db/id page))
                    ;; FIXME: parents need to be sorted
                    parent-blocks (group-by :block/parent page-blocks)]
@@ -3614,7 +3625,8 @@
      [:div.flex.flex-col
       (let [blocks (sort-by (comp :block/journal-day first) > blocks)]
         (for [[page blocks] blocks]
-          (let [blocks (remove nil? blocks)]
+          (let [page (hidden-page->source-page page)
+                blocks (remove nil? blocks)]
             (when (seq blocks)
               (let [alias? (:block/alias? page)
                     page (db/entity (:db/id page))

+ 22 - 18
src/main/frontend/components/property/value.cljs

@@ -399,24 +399,28 @@
 (rum/defc property-block-value < rum/reactive
   [value block property block-cp editor-box opts page-cp editor-id]
   (let [v-block (db/entity [:block/uuid value])
-        class? (contains? (:block/type v-block) "class")]
-    (cond
-      (:block/page v-block)
-      (property-normal-block-value value block-cp editor-box)
-
-      (and class? (seq (:properties (:block/schema v-block))))
-      (let [template-instance-block (create-new-block-from-template! block property v-block)]
-        (property-template-value {:editor-id editor-id}
-                                 (:block/uuid template-instance-block)
-                                 opts))
-
-      ;; page/class/etc.
-      (:block/name v-block)
-      (page-cp {:disable-preview? true
-                :hide-close-button? true
-                :tag? class?} v-block)
-      :else
-      (js/console.error "Invalid property value: " v-block))))
+        class? (contains? (:block/type v-block) "class")
+        invalid-warning [:div.warning.text-sm
+                         "Invalid block value, please delete the current property."]]
+    (if v-block
+      (cond
+        (:block/page v-block)
+        (property-normal-block-value value block-cp editor-box)
+
+        (and class? (seq (:properties (:block/schema v-block))))
+        (let [template-instance-block (create-new-block-from-template! block property v-block)]
+          (property-template-value {:editor-id editor-id}
+                                   (:block/uuid template-instance-block)
+                                   opts))
+
+        ;; page/class/etc.
+        (:block/name v-block)
+        (page-cp {:disable-preview? true
+                  :hide-close-button? true
+                  :tag? class?} v-block)
+        :else
+        invalid-warning)
+      invalid-warning)))
 
 (rum/defc select-item
   [property type value {:keys [page-cp inline-text]}]

+ 4 - 1
src/main/frontend/handler/common/page.cljs

@@ -275,6 +275,7 @@
       (and (contains? (:block/type page) "class")
            (seq (model/get-tag-blocks repo (:block/name page))))
       {:msg "Page content deleted but unable to delete this page because blocks are tagged with this page"}
+
       (contains? (:block/type page) "property")
       (cond (seq (model/get-classes-with-property (:block/uuid page)))
             {:msg "Page content deleted but unable to delete this page because classes use this property"}
@@ -282,8 +283,10 @@
                  (filter (fn [[_ v]] (if (seq? v) (seq v) (some? v))))
                  seq)
             {:msg "Page content deleted but unable to delete this page because blocks use this property"})
-      (seq (:block/_refs page))
+
+      (or (seq (:block/_refs page)) (contains? (:block/type page) "hidden"))
       {:msg "Page content deleted but unable to delete this page because there're still references to it"})
+
     (catch :default e
       (log/error :exception e)
       (state/pub-event! [:capture-error {:error e}])

+ 6 - 2
src/main/frontend/handler/property.cljs

@@ -180,7 +180,9 @@
         page-entity (db/entity [:block/name page-name])
         page (or page-entity
                  (-> (block/page-name->map page-name true)
-                     (assoc :block/type #{"hidden"} :block/format :markdown)))
+                     (assoc :block/type #{"hidden"}
+                            :block/format :markdown
+                            :block/metadata {:source-page-id current-page-id})))
         page-tx (when-not page-entity page)
         page-id [:block/uuid (:block/uuid page)]
         parent-id (db/new-block-id)
@@ -214,7 +216,9 @@
         page-entity (db/entity [:block/name page-name])
         page (or page-entity
                  (-> (block/page-name->map page-name true)
-                     (assoc :block/type #{"hidden"} :block/format :markdown)))
+                     (assoc :block/type #{"hidden"}
+                            :block/format :markdown
+                            :block/metadata {:source-page-id current-page-id})))
         page-tx (when-not page-entity page)
         page-id [:block/uuid (:block/uuid page)]
         block-id (db/new-block-id)