🎉 Group color assets

This commit is contained in:
Andrés Moya 2021-05-11 13:44:49 +02:00 committed by Andrey Antukh
parent 83bca7fb10
commit c858707c39
4 changed files with 89 additions and 34 deletions

View file

@ -90,6 +90,7 @@
;;; COLORS ;;; COLORS
(s/def :internal.color/name ::string) (s/def :internal.color/name ::string)
(s/def :internal.color/path (s/nilable ::string))
(s/def :internal.color/value (s/nilable ::string)) (s/def :internal.color/value (s/nilable ::string))
(s/def :internal.color/color (s/nilable ::string)) (s/def :internal.color/color (s/nilable ::string))
(s/def :internal.color/opacity (s/nilable ::safe-number)) (s/def :internal.color/opacity (s/nilable ::safe-number))
@ -98,13 +99,13 @@
(s/def ::color (s/def ::color
(s/keys :opt-un [::id (s/keys :opt-un [::id
:internal.color/name :internal.color/name
:internal.color/path
:internal.color/value :internal.color/value
:internal.color/color :internal.color/color
:internal.color/opacity :internal.color/opacity
:internal.color/gradient])) :internal.color/gradient]))
;;; SHADOW EFFECT ;;; SHADOW EFFECT
(s/def :internal.shadow/id uuid?) (s/def :internal.shadow/id uuid?)

View file

@ -371,10 +371,6 @@
// overflow-y: scroll; // overflow-y: scroll;
// } // }
.asset-list {
margin-top: $medium;
}
.asset-list-item { .asset-list-item {
display: flex; display: flex;
align-items: center; align-items: center;

View file

@ -93,7 +93,7 @@
:id id}] :id id}]
(rx/of #(assoc-in % [:workspace-local :color-for-rename] id) (rx/of #(assoc-in % [:workspace-local :color-for-rename] id)
(dch/commit-changes {:redo-changes [rchg] (dch/commit-changes {:redo-changes [rchg]
:undo-chages [uchg] :undo-changes [uchg]
:origin it}))))))) :origin it})))))))
(defn add-recent-color (defn add-recent-color
[color] [color]
@ -104,7 +104,7 @@
(let [rchg {:type :add-recent-color (let [rchg {:type :add-recent-color
:color color}] :color color}]
(rx/of (dch/commit-changes {:redo-changes [rchg] (rx/of (dch/commit-changes {:redo-changes [rchg]
:undo-chages [] :undo-changes []
:origin it})))))) :origin it}))))))
(def clear-color-for-rename (def clear-color-for-rename
@ -120,13 +120,15 @@
(ptk/reify ::update-color (ptk/reify ::update-color
ptk/WatchEvent ptk/WatchEvent
(watch [it state stream] (watch [it state stream]
(let [prev (get-in state [:workspace-data :colors id]) (let [[path name] (cp/parse-path-name (:name color))
color (assoc color :path path :name name)
prev (get-in state [:workspace-data :colors id])
rchg {:type :mod-color rchg {:type :mod-color
:color color} :color color}
uchg {:type :mod-color uchg {:type :mod-color
:color prev}] :color prev}]
(rx/of (dch/commit-changes {:redo-changes [rchg] (rx/of (dch/commit-changes {:redo-changes [rchg]
:undo-chages [uchg] :undo-changes [uchg]
:origin it}) :origin it})
(sync-file (:current-file-id state) file-id)))))) (sync-file (:current-file-id state) file-id))))))
@ -142,7 +144,7 @@
uchg {:type :add-color uchg {:type :add-color
:color prev}] :color prev}]
(rx/of (dch/commit-changes {:redo-changes [rchg] (rx/of (dch/commit-changes {:redo-changes [rchg]
:undo-chages [uchg] :undo-changes [uchg]
:origin it})))))) :origin it}))))))
(defn add-media (defn add-media

View file

@ -499,7 +499,8 @@
(mf/defc color-item (mf/defc color-item
[{:keys [color local? file-id selected-colors multi-colors? multi-assets? [{:keys [color local? file-id selected-colors multi-colors? multi-assets?
on-asset-click on-assets-delete on-clear-selection colors locale] :as props}] on-asset-click on-assets-delete on-clear-selection on-group
colors locale] :as props}]
(let [rename? (= (:color-for-rename @refs/workspace-local) (:id color)) (let [rename? (= (:color-for-rename @refs/workspace-local) (:id color))
id (:id color) id (:id color)
input-ref (mf/use-ref) input-ref (mf/use-ref)
@ -623,17 +624,24 @@
[(t locale "workspace.assets.rename") rename-color-clicked]) [(t locale "workspace.assets.rename") rename-color-clicked])
(when-not (or multi-colors? multi-assets?) (when-not (or multi-colors? multi-assets?)
[(t locale "workspace.assets.edit") edit-color-clicked]) [(t locale "workspace.assets.edit") edit-color-clicked])
[(t locale "workspace.assets.delete") delete-color]]}])])) [(t locale "workspace.assets.delete") delete-color]
(when-not multi-assets?
[(tr "workspace.assets.group") on-group])]}])]))
(mf/defc colors-box (mf/defc colors-box
[{:keys [file-id local? colors locale open? selected-assets [{:keys [file-id local? colors locale open? selected-assets
on-asset-click on-assets-delete on-clear-selection] :as props}] on-asset-click on-assets-delete on-clear-selection] :as props}]
(let [selected-colors (:colors selected-assets) (let [state (mf/use-state {:folded-groups empty-folded-groups})
selected-colors (:colors selected-assets)
multi-colors? (> (count selected-colors) 1) multi-colors? (> (count selected-colors) 1)
multi-assets? (or (not (empty? (:components selected-assets))) multi-assets? (or (not (empty? (:components selected-assets)))
(not (empty? (:graphics selected-assets))) (not (empty? (:graphics selected-assets)))
(not (empty? (:typographies selected-assets)))) (not (empty? (:typographies selected-assets))))
groups (group-assets colors)
folded-groups (:folded-groups @state)
add-color add-color
(mf/use-callback (mf/use-callback
(mf/deps file-id) (mf/deps file-id)
@ -651,7 +659,39 @@
:on-accept add-color :on-accept add-color
:data {:color "#406280" :data {:color "#406280"
:opacity 1} :opacity 1}
:position :right})))] :position :right})))
create-group
(mf/use-callback
(mf/deps colors selected-colors on-clear-selection file-id)
(fn [name]
(on-clear-selection)
(st/emit! (dwu/start-undo-transaction))
(apply st/emit!
(->> colors
(filter #(contains? selected-colors (:id %)))
(map #(dwl/update-color
(assoc % :name
(str name " / "
(cp/merge-path-item (:path %) (:name %))))
file-id))))
(st/emit! (dwu/commit-undo-transaction))))
on-fold-group
(mf/use-callback
(mf/deps groups folded-groups)
(fn [path]
(fn [event]
(dom/stop-propagation event)
(swap! state update :folded-groups
toggle-folded-group path))))
on-group
(mf/use-callback
(mf/deps colors selected-colors)
(fn [event]
(dom/stop-propagation event)
(modal/show! :create-group-dialog {:create create-group})))]
[:div.asset-section [:div.asset-section
[:div.asset-title {:class (when (not open?) "closed")} [:div.asset-title {:class (when (not open?) "closed")}
@ -661,24 +701,41 @@
(when local? (when local?
[:div.assets-button {:on-click add-color-clicked} i/plus])] [:div.assets-button {:on-click add-color-clicked} i/plus])]
(when open? (when open?
[:div.asset-list (for [group groups]
(for [color colors] (let [path (first group)
(let [color (cond-> color colors (second group)
(:value color) (assoc :color (:value color) :opacity 1) group-open? (not (contains? folded-groups path))]
(:value color) (dissoc :value) [:*
true (assoc :file-id file-id))] (when-not (empty? path)
[:& color-item {:key (:id color) (let [[other-path last-path truncated] (cp/compact-path path 35)]
:color color [:div.group-title {:class (when-not group-open? "closed")
:file-id file-id :on-click (on-fold-group path)}
:local? local? [:span i/arrow-slide]
:selected-colors selected-colors (when-not (empty? other-path)
:multi-colors? multi-colors? [:span.dim {:title (when truncated path)}
:multi-assets? multi-assets? other-path "\u00A0/\u00A0"])
:on-asset-click on-asset-click [:span {:title (when truncated path)}
:on-assets-delete on-assets-delete last-path]]))
:on-clear-selection on-clear-selection (when group-open?
:colors colors [:div.asset-list
:locale locale}]))])])) (for [color colors]
(let [color (cond-> color
(:value color) (assoc :color (:value color) :opacity 1)
(:value color) (dissoc :value)
true (assoc :file-id file-id))]
[:& color-item {:key (:id color)
:color color
:file-id file-id
:local? local?
:selected-colors selected-colors
:multi-colors? multi-colors?
:multi-assets? multi-assets?
:on-asset-click on-asset-click
:on-assets-delete on-assets-delete
:on-clear-selection on-clear-selection
:on-group on-group
:colors colors
:locale locale}]))])])))]))
;; ---- Typography box ---- ;; ---- Typography box ----
@ -817,7 +874,6 @@
(vals (get-in state [:workspace-libraries id :data :colors]))))) (vals (get-in state [:workspace-libraries id :data :colors])))))
st/state =)) st/state =))
(defn file-media-ref (defn file-media-ref
[id] [id]
(l/derived (fn [state] (l/derived (fn [state]
@ -860,7 +916,7 @@
(sort-by #(str/lower (:name %)) comp-fn)))) (sort-by #(str/lower (:name %)) comp-fn))))
(mf/defc file-library (mf/defc file-library
[{:keys [file local? default-open? filters locale] :as props}] [{:keys [file local? default-open? filters locale] :as props}]
(let [open-file (mf/deref (open-file-ref (:id file))) (let [open-file (mf/deref (open-file-ref (:id file)))
open? (-> open-file open? (-> open-file
:library :library