diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index 43425d449..2723206e7 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -242,59 +242,88 @@ (if (= (:type shape) :frame) (d/merge shape attrs) shape)))))))) -(defn change-stroke - ([ids attrs index] (change-stroke ids attrs index nil)) - ([ids attrs index options] - (ptk/reify ::change-stroke + +(def ^:private stroke-style-attrs + [:stroke-style + :stroke-alignment + :stroke-width + :stroke-cap-start + :stroke-cap-end]) + +(defn- build-stroke-style-attrs + [stroke] + (let [attrs (select-keys stroke stroke-style-attrs)] + (cond-> attrs + (not (contains? attrs :stroke-width)) + (assoc :stroke-width 1) + + (not (contains? attrs :stroke-style)) + (assoc :stroke-style :solid) + + (not (contains? attrs :stroke-alignment)) + (assoc :stroke-alignment :inner) + + :always + (d/without-nils)))) + +(defn change-stroke-color + ([ids color index] (change-stroke-color ids color index nil)) + ([ids color index options] + (ptk/reify ::change-stroke-color ptk/WatchEvent (watch [_ _ _] - (let [color-attrs (cond-> {} - (contains? attrs :color) - (assoc :stroke-color (:color attrs)) + (rx/of (dwsh/update-shapes + ids + (fn [shape] + (let [stroke (get-in shape [:strokes index]) + attrs (cond-> (build-stroke-style-attrs stroke) + (contains? color :color) + (assoc :stroke-color (:color color)) - (contains? attrs :id) - (assoc :stroke-color-ref-id (:id attrs)) + (contains? color :id) + (assoc :stroke-color-ref-id (:id color)) - (contains? attrs :file-id) - (assoc :stroke-color-ref-file (:file-id attrs)) + (contains? color :file-id) + (assoc :stroke-color-ref-file (:file-id color)) - (contains? attrs :gradient) - (assoc :stroke-color-gradient (:gradient attrs)) + (contains? color :gradient) + (assoc :stroke-color-gradient (:gradient color)) - (contains? attrs :opacity) - (assoc :stroke-opacity (:opacity attrs)) + (contains? color :opacity) + (assoc :stroke-opacity (:opacity color)) - (contains? attrs :image) - (assoc :stroke-image (:image attrs))) + (contains? color :image) + (assoc :stroke-image (:image color)) - attrs (-> - (merge attrs color-attrs) - (dissoc :image) - (dissoc :gradient))] + :always + (d/without-nils))] + (cond-> shape + (not (contains? shape :strokes)) + (assoc :strokes []) - (rx/of (dwsh/update-shapes - ids - (fn [shape] - (let [new-attrs (merge (get-in shape [:strokes index]) attrs) - new-attrs (cond-> new-attrs - (not (contains? new-attrs :stroke-width)) - (assoc :stroke-width 1) + :always + (assoc-in [:strokes index] attrs)))) + options)))))) - (not (contains? new-attrs :stroke-style)) - (assoc :stroke-style :solid) +(defn change-stroke-attrs + ([ids attrs index] (change-stroke-attrs ids attrs index nil)) + ([ids attrs index options] + (ptk/reify ::change-stroke-attrs + ptk/WatchEvent + (watch [_ _ _] + (rx/of (dwsh/update-shapes + ids + (fn [shape] + (let [stroke (get-in shape [:strokes index]) + style-attrs (build-stroke-style-attrs stroke) + attrs (merge stroke style-attrs attrs)] + (cond-> shape + (not (contains? shape :strokes)) + (assoc :strokes []) - (not (contains? new-attrs :stroke-alignment)) - (assoc :stroke-alignment :inner) - - :always - (d/without-nils))] - (cond-> shape - (not (contains? shape :strokes)) - (assoc :strokes []) - - :always - (assoc-in [:strokes index] new-attrs)))) - options))))))) + :always + (assoc-in [:strokes index] attrs))))) + options))))) (defn change-shadow [ids attrs index] @@ -495,7 +524,7 @@ (rx/map (fn [{:keys [shape-id index] :as operation}] (case (:prop operation) :fill (change-fill [shape-id] new-color index) - :stroke (change-stroke [shape-id] new-color index) + :stroke (change-stroke-color [shape-id] new-color index) :shadow (change-shadow [shape-id] new-color index) :content (dwt/update-text-with-function shape-id @@ -533,7 +562,7 @@ (recur (rest pending) result))))] (if stroke? - (rx/of (change-stroke ids color 0)) + (rx/of (change-stroke-color ids color 0)) (rx/of (change-fill ids color 0))))))) (declare activate-colorpicker-color) diff --git a/frontend/src/app/main/router.cljs b/frontend/src/app/main/router.cljs index 2639834ee..39e06b812 100644 --- a/frontend/src/app/main/router.cljs +++ b/frontend/src/app/main/router.cljs @@ -30,8 +30,9 @@ (defn resolve ([router id] (resolve router id {})) ([router id params] - (when-let [match (r/match-by-name router id)] - (r/match->path match params)))) + (when router + (when-let [match (r/match-by-name router id)] + (r/match->path match params))))) (defn create [routes] diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs index 1e5d5fb1e..05c61615a 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs @@ -56,7 +56,7 @@ (mf/use-fn (mf/deps ids) (fn [index color] - (st/emit! (dc/change-stroke ids color index)))) + (st/emit! (dc/change-stroke-color ids color index)))) on-remove @@ -77,7 +77,7 @@ (fn [index color] (let [color (-> color (assoc :id nil :file-id nil))] - (st/emit! (dc/change-stroke ids color index))))) + (st/emit! (dc/change-stroke-color ids color index))))) handle-reorder (mf/use-fn @@ -90,17 +90,17 @@ (mf/use-fn (mf/deps ids) (fn [index value] - (st/emit! (dc/change-stroke ids {:stroke-style value} index)))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-style value} index)))) on-stroke-alignment-change (fn [index value] (when-not (str/empty? value) - (st/emit! (dc/change-stroke ids {:stroke-alignment value} index)))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-alignment value} index)))) on-stroke-width-change (fn [index value] (when-not (str/empty? value) - (st/emit! (dc/change-stroke ids {:stroke-width value} index)))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-width value} index)))) open-caps-select (fn [caps-state] @@ -128,11 +128,11 @@ on-stroke-cap-start-change (fn [index value] - (st/emit! (dc/change-stroke ids {:stroke-cap-start value} index))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-cap-start value} index))) on-stroke-cap-end-change (fn [index value] - (st/emit! (dc/change-stroke ids {:stroke-cap-end value} index))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-cap-end value} index))) on-stroke-cap-switch (fn [index] @@ -140,8 +140,8 @@ stroke-cap-end (get-in values [:strokes index :stroke-cap-end])] (when (and (not= stroke-cap-start :multiple) (not= stroke-cap-end :multiple)) - (st/emit! (dc/change-stroke ids {:stroke-cap-start stroke-cap-end - :stroke-cap-end stroke-cap-start} index))))) + (st/emit! (dc/change-stroke-attrs ids {:stroke-cap-start stroke-cap-end + :stroke-cap-end stroke-cap-start} index))))) on-add-stroke (fn [_] (st/emit! (dc/add-stroke ids {:stroke-alignment :inner diff --git a/frontend/src/app/main/ui/workspace/tokens/changes.cljs b/frontend/src/app/main/ui/workspace/tokens/changes.cljs index 163e9f068..6724f2541 100644 --- a/frontend/src/app/main/ui/workspace/tokens/changes.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/changes.cljs @@ -147,7 +147,7 @@ (defn update-stroke-color [value shape-ids] - (update-color wdc/change-stroke value shape-ids)) + (update-color wdc/change-stroke-color value shape-ids)) (defn update-fill-stroke [value shape-ids attributes] (ptk/reify ::update-fill-stroke diff --git a/frontend/test/frontend_tests/basic_shapes_test.cljs b/frontend/test/frontend_tests/basic_shapes_test.cljs index 158ca488c..6b7d9e912 100644 --- a/frontend/test/frontend_tests/basic_shapes_test.cljs +++ b/frontend/test/frontend_tests/basic_shapes_test.cljs @@ -48,7 +48,7 @@ (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)))))))) -(t/deftest test-update-stroke +(t/deftest test-update-stroke-color ;; Old shapes without stroke-alignment are rendered as if it is centered (t/async done @@ -62,7 +62,7 @@ ;; ==== Action events - [(dc/change-stroke #{(cthi/id :shape1)} {:color "#FABADA"} 0)]] + [(dc/change-stroke-color #{(cthi/id :shape1)} {:color "#FABADA"} 0)]] (ths/run-store store done events @@ -77,6 +77,8 @@ first)] ;; ==== Check - (println stroke') + ;; (println stroke') (t/is (some? shape1')) - (t/is (= (:stroke-alignment stroke') :inner)))))))) + (t/is (= (:stroke-alignment stroke') :inner)) + (t/is (= (:stroke-color stroke') "#FABADA")) + (t/is (= (:stroke-width stroke') 2)))))))) diff --git a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs index 522428723..f73ba9669 100644 --- a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs +++ b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs @@ -23,11 +23,9 @@ _ (set! st/state store) - context (api/create-context "TEST") - - page (. context -currentPage) - - shape (.createRectangle context) + ^js context (api/create-context "TEST") + ^js page (. context -currentPage) + ^js shape (.createRectangle context) get-shape-path #(vector :workspace-data :pages-index (aget page "$id") :objects (aget shape "$id") %)]