diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 5faee0a0c..f2cafd5de 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -47,7 +47,6 @@ [app.main.data.workspace.collapse :as dwco] [app.main.data.workspace.drawing :as dwd] [app.main.data.workspace.edition :as dwe] - [app.main.data.workspace.fix-bool-contents :as fbc] [app.main.data.workspace.fix-broken-shapes :as fbs] [app.main.data.workspace.fix-deleted-fonts :as fdf] [app.main.data.workspace.groups :as dwg] @@ -129,7 +128,6 @@ (when (and (not (boolean (-> state :profile :props :v2-info-shown))) (features/active-feature? state "components/v2")) (modal/show :v2-info {})) - (fbc/fix-bool-contents) (fdf/fix-deleted-fonts) (fbs/fix-broken-shapes))))) diff --git a/frontend/src/app/main/data/workspace/fix_bool_contents.cljs b/frontend/src/app/main/data/workspace/fix_bool_contents.cljs deleted file mode 100644 index 5cb1c493a..000000000 --- a/frontend/src/app/main/data/workspace/fix_bool_contents.cljs +++ /dev/null @@ -1,95 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) KALEIDOS INC - -(ns app.main.data.workspace.fix-bool-contents - (:require - [app.common.data :as d] - [app.common.geom.shapes :as gsh] - [app.main.data.changes :as dch] - [app.main.data.workspace.shapes :as dwsh] - [app.main.data.workspace.state-helpers :as wsh] - [beicon.v2.core :as rx] - [potok.v2.core :as ptk])) - -;; This event will update the file so the boolean data has a pre-generated path data -;; to increase performance. -;; For new shapes this will be generated in the :reg-objects but we need to do this for -;; old files. - -;; FIXME: Remove me after June 2022 - -(defn fix-bool-contents - "This event will calculate the bool content and update the page. This is kind of a 'addhoc' migration - to fill the optional value 'bool-content'" - [] - - (letfn [(should-migrate-shape? [shape] - (and (= :bool (:type shape)) (not (contains? shape :bool-content)))) - - (should-migrate-component? [component] - (->> (:objects component) - (vals) - (d/seek should-migrate-shape?))) - - (update-shape [shape objects] - (cond-> shape - (should-migrate-shape? shape) - (assoc :bool-content (gsh/calc-bool-content shape objects)))) - - (migrate-component [component] - (-> component - (update - :objects - (fn [objects] - (d/mapm #(update-shape %2 objects) objects))))) - - (update-library - [library] - (-> library - (d/update-in-when - [:data :components] - (fn [components] - (d/mapm #(migrate-component %2) components)))))] - - (ptk/reify ::fix-bool-contents - ptk/UpdateEvent - (update [_ state] - ;; Update (only-local) the imported libraries - (-> state - (d/update-when - :workspace-libraries - (fn [libraries] (d/mapm #(update-library %2) libraries))))) - - ptk/WatchEvent - (watch [it state _] - (let [objects (wsh/lookup-page-objects state) - - ids (into #{} - (comp (filter should-migrate-shape?) (map :id)) - (vals objects)) - - components (->> (wsh/lookup-local-components state) - (vals) - (filter should-migrate-component?)) - - component-changes - (into [] - (map (fn [component] - {:type :mod-component - :id (:id component) - :objects (-> component migrate-component :objects)})) - components)] - - (rx/of (dwsh/update-shapes ids #(update-shape % objects) {:reg-objects? false - :save-undo? false - :ignore-tree true})) - - (if (empty? component-changes) - (rx/empty) - (rx/of (dch/commit-changes {:origin it - :redo-changes component-changes - :undo-changes [] - :save-undo? false})))))))) diff --git a/frontend/src/app/main/data/workspace/fix_deleted_fonts.cljs b/frontend/src/app/main/data/workspace/fix_deleted_fonts.cljs index f79db6867..75f7c83d2 100644 --- a/frontend/src/app/main/data/workspace/fix_deleted_fonts.cljs +++ b/frontend/src/app/main/data/workspace/fix_deleted_fonts.cljs @@ -6,11 +6,9 @@ (ns app.main.data.workspace.fix-deleted-fonts (:require - [app.common.data :as d] [app.common.files.helpers :as cfh] [app.common.text :as txt] [app.main.data.changes :as dwc] - [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.state-helpers :as wsh] [app.main.fonts :as fonts] [beicon.v2.core :as rx] @@ -22,14 +20,7 @@ ;; - Moving files from one team to another in the same instance ;; - Custom fonts are explicitly deleted in the team area -(defn has-invalid-font-family - [node] - (let [fonts (deref fonts/fontsdb)] - (and - (some? (:font-family node)) - (nil? (get fonts (:font-id node)))))) - -(defn calculate-alternative-font-id +(defn- calculate-alternative-font-id [value] (let [fonts (deref fonts/fontsdb)] (->> (vals fonts) @@ -37,39 +28,44 @@ (first) :id))) -(defn should-fix-deleted-font-shape? +(defn- has-invalid-font-family? + [node] + (let [fonts (deref fonts/fontsdb) + font-family (:font-family node) + alternative-font-id (calculate-alternative-font-id font-family)] + (and (some? font-family) + (nil? (get fonts (:font-id node))) + (some? alternative-font-id)))) + +(defn- should-fix-deleted-font-shape? [shape] (let [text-nodes (txt/node-seq txt/is-text-node? (:content shape))] - (and (cfh/text-shape? shape) (some has-invalid-font-family text-nodes)))) + (and (cfh/text-shape? shape) + (some has-invalid-font-family? text-nodes)))) -(defn should-fix-deleted-font-component? +(defn- should-fix-deleted-font-component? [component] - (->> (:objects component) - (vals) - (d/seek should-fix-deleted-font-shape?))) + (let [xf (comp (map val) + (filter should-fix-deleted-font-shape?))] + (first (sequence xf (:objects component))))) -(defn should-fix-deleted-font-typography? - [typography] - (let [fonts (deref fonts/fontsdb)] - (nil? (get fonts (:font-id typography))))) - -(defn fix-deleted-font +(defn- fix-deleted-font [node] (let [alternative-font-id (calculate-alternative-font-id (:font-family node))] (cond-> node (some? alternative-font-id) (assoc :font-id alternative-font-id)))) -(defn fix-deleted-font-shape +(defn- fix-deleted-font-shape [shape] - (let [transform (partial txt/transform-nodes has-invalid-font-family fix-deleted-font)] + (let [transform (partial txt/transform-nodes has-invalid-font-family? fix-deleted-font)] (update shape :content transform))) -(defn fix-deleted-font-component +(defn- fix-deleted-font-component [component] (update component :objects (fn [objects] - (d/mapm #(fix-deleted-font-shape %2) objects)))) + (update-vals objects fix-deleted-font-shape)))) (defn fix-deleted-font-typography [typography] @@ -77,54 +73,60 @@ (cond-> typography (some? alternative-font-id) (assoc :font-id alternative-font-id)))) +(defn- generate-deleted-font-shape-changes + [{:keys [objects id]}] + (sequence + (comp (map val) + (filter should-fix-deleted-font-shape?) + (map (fn [shape] + {:type :mod-obj + :id (:id shape) + :page-id id + :operations [{:type :set + :attr :content + :val (:content (fix-deleted-font-shape shape))} + {:type :set + :attr :position-data + :val nil}]}))) + objects)) + +(defn- generate-deleted-font-components-changes + [state] + (sequence + (comp (map val) + (filter should-fix-deleted-font-component?) + (map (fn [component] + {:type :mod-component + :id (:id component) + :objects (-> (fix-deleted-font-component component) :objects)}))) + (wsh/lookup-local-components state))) + +(defn- generate-deleted-font-typography-changes + [state] + (sequence + (comp (map val) + (filter has-invalid-font-family?) + (map (fn [typography] + {:type :mod-typography + :typography (fix-deleted-font-typography typography)}))) + (get-in state [:workspace-data :typographies]))) + (defn fix-deleted-fonts [] (ptk/reify ::fix-deleted-fonts ptk/WatchEvent (watch [it state _] - (let [objects (wsh/lookup-page-objects state) - - ids (into #{} - (comp (filter should-fix-deleted-font-shape?) (map :id)) - (vals objects)) - - components (->> (wsh/lookup-local-components state) - (vals) - (filter should-fix-deleted-font-component?)) - - component-changes - (into [] - (map (fn [component] - {:type :mod-component - :id (:id component) - :objects (-> (fix-deleted-font-component component) :objects)})) - components) - - typographies (->> (get-in state [:workspace-data :typographies]) - (vals) - (filter should-fix-deleted-font-typography?)) - - typography-changes - (into [] - (map (fn [typography] - {:type :mod-typography - :typography (fix-deleted-font-typography typography)})) - typographies)] - - (rx/concat - (rx/of (dwsh/update-shapes ids #(fix-deleted-font-shape %) {:reg-objects? false - :save-undo? false - :ignore-tree true})) - (if (empty? component-changes) - (rx/empty) - (rx/of (dwc/commit-changes {:origin it - :redo-changes component-changes - :undo-changes [] - :save-undo? false}))) - - (if (empty? typography-changes) - (rx/empty) - (rx/of (dwc/commit-changes {:origin it - :redo-changes typography-changes - :undo-changes [] - :save-undo? false})))))))) + (let [data (get state :workspace-data) + shape-changes (mapcat generate-deleted-font-shape-changes (vals (:pages-index data))) + components-changes (generate-deleted-font-components-changes state) + typography-changes (generate-deleted-font-typography-changes state) + changes (concat shape-changes + components-changes + typography-changes)] + (if (seq changes) + (rx/of (dwc/commit-changes + {:origin it + :redo-changes (vec changes) + :undo-changes [] + :save-undo? false})) + (rx/empty))))))