Browse Source

fix: preserve config.file order when updating

Tienson Qin 5 years ago
parent
commit
bc8463265d

+ 4 - 0
deps.edn

@@ -12,6 +12,10 @@
   datascript-transit/datascript-transit
   {:mvn/version "0.3.0"
    :exclusions [datascript]}
+  lread/rewrite-cljc          {:git/url "https://github.com/lread/rewrite-cljc-playground"
+                               :sha "ba1e4255cd1c1fd09dbe2e90556bfa66d5459234"}
+  borkdude/rewrite-edn        {:git/url "https://github.com/tiensonqin/rewrite-edn"
+                               :sha "b54f2f7528412979795167b342af6b03ba1a1cde"}
   funcool/promesa             {:mvn/version "4.0.2"}
   medley/medley               {:mvn/version "1.2.0"}
   metosin/reitit-frontend     {:mvn/version "0.3.10"}

+ 1 - 1
src/main/frontend/components/settings.cljs

@@ -183,7 +183,7 @@
               (ui/toggle enable-timetracking?
                          (fn []
                            (let [value (not enable-timetracking?)]
-                             (repo-handler/set-config! :feature/enable-timetracking? value))))]]]
+                             (config-handler/set-config! :feature/enable-timetracking? value))))]]]
 
            [:hr]
 

+ 22 - 2
src/main/frontend/handler/config.cljs

@@ -1,7 +1,27 @@
 (ns frontend.handler.config
   (:require [frontend.state :as state]
-            [frontend.handler.repo :as repo-handler]))
+            [frontend.handler.repo :as repo-handler]
+            [borkdude.rewrite-edn :as rewrite]
+            [frontend.config :as config]
+            [frontend.db :as db]))
+
+(defn set-config!
+  [k v]
+  (when-let [repo (state/get-current-repo)]
+    (let [path (str config/app-name "/" config/config-file)]
+      (when-let [config (db/get-file-no-sub path)]
+        (let [config (try
+                       (rewrite/parse-string config)
+                       (catch js/Error e
+                         (println "Parsing config file failed: ")
+                         (js/console.dir e)
+                         {}))
+              ks (if (vector? k) k [k])
+              new-config (rewrite/assoc-in config ks v)]
+          (state/set-config! repo new-config)
+          (let [new-content (str new-config)]
+            (repo-handler/set-config-content! repo path new-content)))))))
 
 (defn toggle-ui-show-brackets! []
   (let [show-brackets? (state/show-brackets?)]
-    (repo-handler/set-config! :ui/show-brackets? (not show-brackets?))))
+    (set-config! :ui/show-brackets? (not show-brackets?))))

+ 3 - 21
src/main/frontend/handler/repo.cljs

@@ -21,7 +21,6 @@
             [frontend.handler.common :as common-handler]
             [frontend.handler.extract :as extract-handler]
             [frontend.ui :as ui]
-            [cljs.reader :as reader]
             [clojure.string :as string]
             [frontend.dicts :as dicts]
             [frontend.helper :as helper]
@@ -494,26 +493,9 @@
          (show-install-error! repo-url (util/format "Failed to clone %s." repo-url)))))))
 
 (defn set-config-content!
-  [repo path new-config]
-  (let [new-content (util/pp-str new-config)]
-    (file-handler/alter-file repo path new-content {:reset? false
-                                                    :re-render-root? false})))
-
-(defn set-config!
-  [k v]
-  (when-let [repo (state/get-current-repo)]
-    (let [path (str config/app-name "/" config/config-file)]
-      (when-let [config (db/get-file-no-sub path)]
-        (let [config (try
-                       (reader/read-string config)
-                       (catch js/Error e
-                         (println "Parsing config file failed: ")
-                         (js/console.dir e)
-                         {}))
-              ks (if (vector? k) k [k])
-              new-config (assoc-in config ks v)]
-          (state/set-config! repo new-config)
-          (set-config-content! repo path new-config))))))
+  [repo path new-content]
+  (file-handler/alter-file repo path new-content {:reset? false
+                                                  :re-render-root? false}))
 
 (defn remove-repo!
   [{:keys [id url] :as repo}]