diff.cljs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. (ns frontend.components.diff
  2. (:require [clojure.string :as string]
  3. [frontend.diff :as diff]
  4. [frontend.handler.file :as file]
  5. [frontend.state :as state]
  6. [frontend.ui :as ui]
  7. [frontend.util :as util]
  8. [logseq.shui.ui :as shui]
  9. [medley.core :as medley]
  10. [rum.core :as rum]))
  11. (defonce disk-value (atom nil))
  12. (defonce db-value (atom nil))
  13. (rum/defc diff-cp
  14. [diff]
  15. [:div
  16. (for [[idx {:keys [added removed value]}] diff]
  17. (let [bg-color (cond
  18. added "#057a55"
  19. removed "#d61f69"
  20. :else
  21. "initial")]
  22. [:span.diff {:key idx
  23. :style {:background-color bg-color}}
  24. value]))])
  25. (rum/defcs local-file < rum/reactive
  26. {:will-unmount (fn [state]
  27. (reset! disk-value nil)
  28. (reset! db-value nil)
  29. state)}
  30. [state repo path disk-content db-content]
  31. (when (nil? @disk-value)
  32. (reset! disk-value disk-content)
  33. (reset! db-value db-content))
  34. [:div.cp__diff-file
  35. [:div.cp__diff-file-header
  36. [:span.cp__diff-file-header-content.pl-1
  37. (shui/tabler-icon "info-triangle")
  38. [:span (str "File " path "has been modified on the disk.")]]]
  39. [:div.p-4
  40. (when (not= (string/trim disk-content) (string/trim db-content))
  41. (ui/foldable
  42. (shui/button {:variant :link :class "!px-0"} "Check diff")
  43. (fn []
  44. (let [local-content (or db-content "")
  45. content (or disk-content "")
  46. diff (medley/indexed (diff/diff local-content content))
  47. diff? (some (fn [[_idx {:keys [added removed]}]]
  48. (or added removed))
  49. diff)]
  50. (when diff?
  51. [:div.overflow-y-scroll.flex.flex-col
  52. [:div {:style {:max-height "65vh"}}
  53. (diff-cp diff)]])))
  54. {:default-collapsed? true
  55. :title-trigger? true}))
  56. [:hr]
  57. [:div.flex.flex-col.mt-4.sm:flex-row
  58. [:div.flex-1
  59. [:div.mb-2 "On disk:"]
  60. [:textarea.overflow-auto
  61. {:value (rum/react disk-value)
  62. :on-change (fn [e]
  63. (reset! disk-value (util/evalue e)))}
  64. disk-content]
  65. (ui/button "Select this"
  66. :on-click
  67. (fn []
  68. (when-let [value @disk-value]
  69. (file/alter-file repo path value
  70. {:re-render-root? true
  71. :skip-compare? true}))
  72. (shui/dialog-close!)))]
  73. [:div.flex-1.mt-8.sm:ml-4.sm:mt-0
  74. [:div.mb-2 "In Logseq:"]
  75. [:textarea.overflow-auto
  76. {:value (rum/react db-value)
  77. :on-change (fn [e]
  78. (prn "new-value: " (util/evalue e))
  79. (reset! db-value (util/evalue e)))}
  80. db-content]
  81. (ui/button "Select this"
  82. :on-click
  83. (fn []
  84. (when-let [value @db-value]
  85. (file/alter-file repo path value
  86. {:re-render-root? true
  87. :skip-compare? true}))
  88. (shui/dialog-close!)))]]]])