mirror of
https://github.com/penpot/penpot.git
synced 2025-05-29 10:26:10 +02:00
📎 Port fixes from main branch
This commit is contained in:
parent
43cbe2dd39
commit
965148f3a6
22 changed files with 136 additions and 104 deletions
|
@ -57,8 +57,8 @@
|
||||||
[{:stream labels
|
[{:stream labels
|
||||||
:values [[(str (* (inst-ms (:created-at event)) 1000000))
|
:values [[(str (* (inst-ms (:created-at event)) 1000000))
|
||||||
(str (:message event)
|
(str (:message event)
|
||||||
(when-let [error (:error event)]
|
(when-let [error (:trace event)]
|
||||||
(str "\n" (:trace error))))]]}]}))
|
(str "\n" error)))]]}]}))
|
||||||
|
|
||||||
(defn- send-log
|
(defn- send-log
|
||||||
[{:keys [http-client uri]} payload i]
|
[{:keys [http-client uri]} payload i]
|
||||||
|
|
|
@ -608,7 +608,8 @@
|
||||||
(db/update! conn :profile
|
(db/update! conn :profile
|
||||||
{:props (db/tjson props)}
|
{:props (db/tjson props)}
|
||||||
{:id profile-id})
|
{:id profile-id})
|
||||||
nil)))
|
|
||||||
|
(profile/filter-profile-props props))))
|
||||||
|
|
||||||
|
|
||||||
;; --- MUTATION: Delete Profile
|
;; --- MUTATION: Delete Profile
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
[conn profile]
|
[conn profile]
|
||||||
(merge profile (retrieve-additional-data conn (:id profile))))
|
(merge profile (retrieve-additional-data conn (:id profile))))
|
||||||
|
|
||||||
(defn- filter-profile-props
|
(defn filter-profile-props
|
||||||
[props]
|
[props]
|
||||||
(into {} (filter (fn [[k _]] (simple-ident? k))) props))
|
(into {} (filter (fn [[k _]] (simple-ident? k))) props))
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ services:
|
||||||
- PENPOT_SMTP_PASSWORD=
|
- PENPOT_SMTP_PASSWORD=
|
||||||
- PENPOT_SMTP_SSL=false
|
- PENPOT_SMTP_SSL=false
|
||||||
- PENPOT_SMTP_TLS=false
|
- PENPOT_SMTP_TLS=false
|
||||||
- PENPOT_FLAGS="enable-cors enable-insecure-register enable-terms-and-privacy-checkbox"
|
- PENPOT_FLAGS="enable-cors enable-insecure-register enable-audit-log"
|
||||||
|
|
||||||
# LDAP setup
|
# LDAP setup
|
||||||
- PENPOT_LDAP_HOST=ldap
|
- PENPOT_LDAP_HOST=ldap
|
||||||
|
@ -119,7 +119,7 @@ services:
|
||||||
- PENPOT_SMTP_PASSWORD=
|
- PENPOT_SMTP_PASSWORD=
|
||||||
- PENPOT_SMTP_SSL=false
|
- PENPOT_SMTP_SSL=false
|
||||||
- PENPOT_SMTP_TLS=false
|
- PENPOT_SMTP_TLS=false
|
||||||
- PENPOT_FLAGS="enable-cors"
|
- PENPOT_FLAGS="enable-cors enable-audit-log"
|
||||||
|
|
||||||
# LDAP setup
|
# LDAP setup
|
||||||
- PENPOT_LDAP_HOST=ldap
|
- PENPOT_LDAP_HOST=ldap
|
||||||
|
|
|
@ -185,8 +185,3 @@
|
||||||
grid-column: 1 / span 1;
|
grid-column: 1 / span 1;
|
||||||
z-index: 11;
|
z-index: 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnail-close.invisible {
|
|
||||||
visibility: hidden;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
|
@ -110,7 +110,9 @@
|
||||||
(derive :app.main.data.workspace.persistence/set-file-shard ::generic-action)
|
(derive :app.main.data.workspace.persistence/set-file-shard ::generic-action)
|
||||||
(derive :app.main.data.workspace/create-page ::generic-action)
|
(derive :app.main.data.workspace/create-page ::generic-action)
|
||||||
(derive :app.main.data.workspace/set-workspace-layout ::generic-action)
|
(derive :app.main.data.workspace/set-workspace-layout ::generic-action)
|
||||||
|
(derive :app.main.data.workspace/toggle-layout-flag ::generic-action)
|
||||||
|
(derive :app.main.data.modal/show-modal ::generic-action)
|
||||||
|
(derive :app.main.data.workspace.guides/update-guides ::generic-action)
|
||||||
|
|
||||||
(defmulti process-event ptk/type)
|
(defmulti process-event ptk/type)
|
||||||
(defmethod process-event :default [_] nil)
|
(defmethod process-event :default [_] nil)
|
||||||
|
@ -141,7 +143,8 @@
|
||||||
|
|
||||||
{:type "action"
|
{:type "action"
|
||||||
:name (or (::name mdata) (name type))
|
:name (or (::name mdata) (name type))
|
||||||
:props (merge data (d/without-nils (::props mdata)))
|
:props (merge (d/without-nils data)
|
||||||
|
(d/without-nils (::props mdata)))
|
||||||
:context (d/without-nils
|
:context (d/without-nils
|
||||||
{:event-origin (::origin mdata)
|
{:event-origin (::origin mdata)
|
||||||
:event-namespace (namespace type)
|
:event-namespace (namespace type)
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
(defonce components (atom {}))
|
(defonce components (atom {}))
|
||||||
|
|
||||||
|
;; TODO: rename `:type` to `:name`
|
||||||
|
|
||||||
(defn show
|
(defn show
|
||||||
([props]
|
([props]
|
||||||
(show (uuid/next) (:type props) props))
|
(show (uuid/next) (:type props) props))
|
||||||
|
@ -21,6 +23,10 @@
|
||||||
(show (uuid/next) type props))
|
(show (uuid/next) type props))
|
||||||
([id type props]
|
([id type props]
|
||||||
(ptk/reify ::show-modal
|
(ptk/reify ::show-modal
|
||||||
|
IDeref
|
||||||
|
(-deref [_]
|
||||||
|
(merge (dissoc props :type) {:name type}))
|
||||||
|
|
||||||
ptk/UpdateEvent
|
ptk/UpdateEvent
|
||||||
(update [_ state]
|
(update [_ state]
|
||||||
(assoc state ::modal {:id id
|
(assoc state ::modal {:id id
|
||||||
|
|
|
@ -385,6 +385,20 @@
|
||||||
(rx/empty)))
|
(rx/empty)))
|
||||||
(rx/ignore))))))
|
(rx/ignore))))))
|
||||||
|
|
||||||
|
(defn update-profile-props
|
||||||
|
[props]
|
||||||
|
(ptk/reify ::update-profile-props
|
||||||
|
ptk/UpdateEvent
|
||||||
|
(update [_ state]
|
||||||
|
(update-in state [:profile :props] merge props))
|
||||||
|
|
||||||
|
;; TODO: for the release 1.13 we should skip fetching profile and just use
|
||||||
|
;; the response value of update-profile-props RPC call
|
||||||
|
ptk/WatchEvent
|
||||||
|
(watch [_ _ _]
|
||||||
|
(->> (rp/mutation :update-profile-props {:props props})
|
||||||
|
(rx/map (constantly (fetch-profile)))))))
|
||||||
|
|
||||||
(defn mark-onboarding-as-viewed
|
(defn mark-onboarding-as-viewed
|
||||||
([] (mark-onboarding-as-viewed nil))
|
([] (mark-onboarding-as-viewed nil))
|
||||||
([{:keys [version]}]
|
([{:keys [version]}]
|
||||||
|
@ -451,20 +465,6 @@
|
||||||
(->> (rp/query :team-users {:team-id team-id})
|
(->> (rp/query :team-users {:team-id team-id})
|
||||||
(rx/map #(partial fetched %)))))))
|
(rx/map #(partial fetched %)))))))
|
||||||
|
|
||||||
;; --- Update Nudge
|
|
||||||
|
|
||||||
(defn update-nudge
|
|
||||||
[value]
|
|
||||||
(ptk/reify ::update-nudge
|
|
||||||
ptk/UpdateEvent
|
|
||||||
(update [_ state]
|
|
||||||
(update-in state [:profile :props] assoc :nudge value))
|
|
||||||
ptk/WatchEvent
|
|
||||||
(watch [_ _ _]
|
|
||||||
(let [props {:nudge value}]
|
|
||||||
(->> (rp/mutation :update-profile-props {:props props})
|
|
||||||
(rx/map (constantly (fetch-profile))))))))
|
|
||||||
|
|
||||||
;; --- EVENT: request-account-deletion
|
;; --- EVENT: request-account-deletion
|
||||||
|
|
||||||
(defn request-account-deletion
|
(defn request-account-deletion
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
[app.config :as cfg]
|
[app.config :as cfg]
|
||||||
[app.main.data.events :as ev]
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.messages :as msg]
|
[app.main.data.messages :as msg]
|
||||||
|
[app.main.data.users :as du]
|
||||||
[app.main.data.workspace.bool :as dwb]
|
[app.main.data.workspace.bool :as dwb]
|
||||||
[app.main.data.workspace.changes :as dch]
|
[app.main.data.workspace.changes :as dch]
|
||||||
[app.main.data.workspace.common :as dwc]
|
[app.main.data.workspace.common :as dwc]
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
(ns app.main.data.workspace.shortcuts
|
(ns app.main.data.workspace.shortcuts
|
||||||
(:require
|
(:require
|
||||||
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.shortcuts :as ds]
|
[app.main.data.shortcuts :as ds]
|
||||||
[app.main.data.workspace :as dw]
|
[app.main.data.workspace :as dw]
|
||||||
[app.main.data.workspace.colors :as mdc]
|
[app.main.data.workspace.colors :as mdc]
|
||||||
|
@ -24,6 +25,11 @@
|
||||||
;; Shortcuts
|
;; Shortcuts
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn toggle-layout-flag
|
||||||
|
[flag]
|
||||||
|
(-> (dw/toggle-layout-flag flag)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-shortcuts")))
|
||||||
|
|
||||||
;; Shortcuts format https://github.com/ccampbell/mousetrap
|
;; Shortcuts format https://github.com/ccampbell/mousetrap
|
||||||
|
|
||||||
(def base-shortcuts
|
(def base-shortcuts
|
||||||
|
@ -42,18 +48,18 @@
|
||||||
:toggle-colorpalette {:tooltip (ds/alt "P")
|
:toggle-colorpalette {:tooltip (ds/alt "P")
|
||||||
:command (ds/a-mod "p")
|
:command (ds/a-mod "p")
|
||||||
:fn #(do (r/set-resize-type! :bottom)
|
:fn #(do (r/set-resize-type! :bottom)
|
||||||
(st/emit! (dw/remove-layout-flags :textpalette)
|
(st/emit! (dw/remove-layout-flag :textpalette)
|
||||||
(dw/toggle-layout-flags :colorpalette)))}
|
(toggle-layout-flag :colorpalette)))}
|
||||||
|
|
||||||
:toggle-textpalette {:tooltip (ds/alt "T")
|
:toggle-textpalette {:tooltip (ds/alt "T")
|
||||||
:command (ds/a-mod "t")
|
:command (ds/a-mod "t")
|
||||||
:fn #(do (r/set-resize-type! :bottom)
|
:fn #(do (r/set-resize-type! :bottom)
|
||||||
(st/emit! (dw/remove-layout-flags :colorpalette)
|
(st/emit! (dw/remove-layout-flag :colorpalette)
|
||||||
(dw/toggle-layout-flags :textpalette)))}
|
(toggle-layout-flag :textpalette)))}
|
||||||
|
|
||||||
:toggle-rules {:tooltip (ds/meta-shift "R")
|
:toggle-rules {:tooltip (ds/meta-shift "R")
|
||||||
:command (ds/c-mod "shift+r")
|
:command (ds/c-mod "shift+r")
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :rules))}
|
:fn #(st/emit! (toggle-layout-flag :rules))}
|
||||||
|
|
||||||
:select-all {:tooltip (ds/meta "A")
|
:select-all {:tooltip (ds/meta "A")
|
||||||
:command (ds/c-mod "a")
|
:command (ds/c-mod "a")
|
||||||
|
@ -61,23 +67,23 @@
|
||||||
|
|
||||||
:toggle-grid {:tooltip (ds/meta "'")
|
:toggle-grid {:tooltip (ds/meta "'")
|
||||||
:command (ds/c-mod "'")
|
:command (ds/c-mod "'")
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :display-grid))}
|
:fn #(st/emit! (toggle-layout-flag :display-grid))}
|
||||||
|
|
||||||
:toggle-snap-grid {:tooltip (ds/meta-shift "'")
|
:toggle-snap-grid {:tooltip (ds/meta-shift "'")
|
||||||
:command (ds/c-mod "shift+'")
|
:command (ds/c-mod "shift+'")
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :snap-grid))}
|
:fn #(st/emit! (toggle-layout-flag :snap-grid))}
|
||||||
|
|
||||||
:toggle-snap-guide {:tooltip (ds/meta-shift "G")
|
:toggle-snap-guide {:tooltip (ds/meta-shift "G")
|
||||||
:command (ds/c-mod "shift+G")
|
:command (ds/c-mod "shift+G")
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :snap-guides))}
|
:fn #(st/emit! (toggle-layout-flag :snap-guides))}
|
||||||
|
|
||||||
:toggle-alignment {:tooltip (ds/meta "\\")
|
:toggle-alignment {:tooltip (ds/meta "\\")
|
||||||
:command (ds/c-mod "\\")
|
:command (ds/c-mod "\\")
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :dynamic-alignment))}
|
:fn #(st/emit! (toggle-layout-flag :dynamic-alignment))}
|
||||||
|
|
||||||
:toggle-scale-text {:tooltip "K"
|
:toggle-scale-text {:tooltip "K"
|
||||||
:command "k"
|
:command "k"
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :scale-text))}
|
:fn #(st/emit! (toggle-layout-flag :scale-text))}
|
||||||
|
|
||||||
:increase-zoom {:tooltip "+"
|
:increase-zoom {:tooltip "+"
|
||||||
:command ["+" "="]
|
:command ["+" "="]
|
||||||
|
@ -354,7 +360,7 @@
|
||||||
|
|
||||||
:hide-ui {:tooltip "\\"
|
:hide-ui {:tooltip "\\"
|
||||||
:command "\\"
|
:command "\\"
|
||||||
:fn #(st/emit! (dw/toggle-layout-flags :hide-ui))}
|
:fn #(st/emit! (toggle-layout-flag :hide-ui))}
|
||||||
|
|
||||||
:toggle-focus-mode {:command "f"
|
:toggle-focus-mode {:command "f"
|
||||||
:tooltip "F"
|
:tooltip "F"
|
||||||
|
|
|
@ -217,7 +217,7 @@
|
||||||
|
|
||||||
(mf/defc frame-svg
|
(mf/defc frame-svg
|
||||||
{::mf/wrap [mf/memo]}
|
{::mf/wrap [mf/memo]}
|
||||||
[{:keys [objects frame zoom] :or {zoom 1} :as props}]
|
[{:keys [objects frame zoom show-thumbnails?] :or {zoom 1} :as props}]
|
||||||
(let [frame-id (:id frame)
|
(let [frame-id (:id frame)
|
||||||
include-metadata? (mf/use-ctx export/include-metadata-ctx)
|
include-metadata? (mf/use-ctx export/include-metadata-ctx)
|
||||||
|
|
||||||
|
@ -253,7 +253,13 @@
|
||||||
:xmlns "http://www.w3.org/2000/svg"
|
:xmlns "http://www.w3.org/2000/svg"
|
||||||
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
||||||
:xmlns:penpot (when include-metadata? "https://penpot.app/xmlns")}
|
:xmlns:penpot (when include-metadata? "https://penpot.app/xmlns")}
|
||||||
[:& wrapper {:shape frame :view-box vbox}]]))
|
(if (or (not show-thumbnails?) (nil? (:thumbnail frame)))
|
||||||
|
[:& wrapper {:shape frame :view-box vbox}]
|
||||||
|
|
||||||
|
;; Render the frame thumbnail
|
||||||
|
(let [frame (gsh/transform-shape frame)]
|
||||||
|
[:> shape-container {:shape frame}
|
||||||
|
[:& frame/frame-thumbnail {:shape frame}]]))]))
|
||||||
|
|
||||||
(mf/defc component-svg
|
(mf/defc component-svg
|
||||||
{::mf/wrap [mf/memo #(mf/deferred % ts/idle-then-raf)]}
|
{::mf/wrap [mf/memo #(mf/deferred % ts/idle-then-raf)]}
|
||||||
|
|
|
@ -80,8 +80,9 @@
|
||||||
(let [shape-container (shape-container-factory objects)
|
(let [shape-container (shape-container-factory objects)
|
||||||
frame-shape (frame/frame-shape shape-container)
|
frame-shape (frame/frame-shape shape-container)
|
||||||
frame-wrapper (shape-wrapper-factory frame-shape)]
|
frame-wrapper (shape-wrapper-factory frame-shape)]
|
||||||
(mf/fnc frame-container
|
(mf/fnc frame-container
|
||||||
{::mf/wrap-props false}
|
{::mf/wrap-props false
|
||||||
|
::mf/wrap [mf/memo]}
|
||||||
[props]
|
[props]
|
||||||
(let [shape (unchecked-get props "shape")
|
(let [shape (unchecked-get props "shape")
|
||||||
childs (mapv #(get objects %) (:shapes shape))
|
childs (mapv #(get objects %) (:shapes shape))
|
||||||
|
|
|
@ -72,12 +72,13 @@
|
||||||
[:span.btn-close {:on-click on-close} i/close]]])
|
[:span.btn-close {:on-click on-close} i/close]]])
|
||||||
|
|
||||||
(mf/defc thumbnail-item
|
(mf/defc thumbnail-item
|
||||||
{::mf/wrap [mf/memo #(mf/deferred % ts/idle-then-raf)]}
|
{::mf/wrap [mf/memo
|
||||||
|
#(mf/deferred % ts/idle-then-raf)]}
|
||||||
[{:keys [selected? frame on-click index objects]}]
|
[{:keys [selected? frame on-click index objects]}]
|
||||||
[:div.thumbnail-item {:on-click #(on-click % index)}
|
[:div.thumbnail-item {:on-click #(on-click % index)}
|
||||||
[:div.thumbnail-preview
|
[:div.thumbnail-preview
|
||||||
{:class (dom/classnames :selected selected?)}
|
{:class (dom/classnames :selected selected?)}
|
||||||
[:& render/frame-svg {:frame frame :objects objects}]]
|
[:& render/frame-svg {:frame frame :objects objects :show-thumbnails? true}]]
|
||||||
[:div.thumbnail-info
|
[:div.thumbnail-info
|
||||||
[:span.name {:title (:name frame)} (:name frame)]]])
|
[:span.name {:title (:name frame)} (:name frame)]]])
|
||||||
|
|
||||||
|
@ -101,9 +102,9 @@
|
||||||
(on-close))))]
|
(on-close))))]
|
||||||
|
|
||||||
[:section.viewer-thumbnails
|
[:section.viewer-thumbnails
|
||||||
{:class (dom/classnames :expanded @expanded?
|
{;; This is better as an inline-style so it won't make a reflow of every frame inside
|
||||||
:invisible (not show?))
|
:style {:display (when (not show?) "none")}
|
||||||
|
:class (dom/classnames :expanded @expanded?)
|
||||||
:ref container}
|
:ref container}
|
||||||
|
|
||||||
[:& thumbnails-summary {:on-toggle-expand #(swap! expanded? not)
|
[:& thumbnails-summary {:on-toggle-expand #(swap! expanded? not)
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
[:*
|
[:*
|
||||||
[:& left-toolbar {:layout layout}]
|
[:& left-toolbar {:layout layout}]
|
||||||
(if (:collapse-left-sidebar layout)
|
(if (:collapse-left-sidebar layout)
|
||||||
[:button.collapse-sidebar.collapsed {:on-click #(st/emit! (dw/toggle-layout-flags :collapse-left-sidebar))}
|
[:button.collapse-sidebar.collapsed {:on-click #(st/emit! (dw/toggle-layout-flag :collapse-left-sidebar))}
|
||||||
i/arrow-slide]
|
i/arrow-slide]
|
||||||
[:& left-sidebar {:layout layout}])
|
[:& left-sidebar {:layout layout}])
|
||||||
[:& right-sidebar {:section options-mode
|
[:& right-sidebar {:section options-mode
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
(:require
|
(:require
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
[app.common.spec.page :as csp]
|
[app.common.spec.page :as csp]
|
||||||
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.modal :as modal]
|
[app.main.data.modal :as modal]
|
||||||
[app.main.data.workspace :as dw]
|
[app.main.data.workspace :as dw]
|
||||||
[app.main.data.workspace.interactions :as dwi]
|
[app.main.data.workspace.interactions :as dwi]
|
||||||
|
@ -446,10 +447,10 @@
|
||||||
|
|
||||||
(mf/defc viewport-context-menu
|
(mf/defc viewport-context-menu
|
||||||
[]
|
[]
|
||||||
(let [focus (mf/deref refs/workspace-focus-selected)
|
(let [focus (mf/deref refs/workspace-focus-selected)
|
||||||
|
do-paste #(st/emit! dw/paste)
|
||||||
do-paste (st/emitf dw/paste)
|
do-hide-ui #(st/emit! (-> (dw/toggle-layout-flag :hide-ui)
|
||||||
do-hide-ui (st/emitf (dw/toggle-layout-flags :hide-ui))
|
(vary-meta assoc ::ev/origin "workspace-context-menu")))
|
||||||
do-toggle-focus-mode #(st/emit! (dw/toggle-focus-mode))]
|
do-toggle-focus-mode #(st/emit! (dw/toggle-focus-mode))]
|
||||||
[:*
|
[:*
|
||||||
[:& menu-entry {:title (tr "workspace.shape.menu.paste")
|
[:& menu-entry {:title (tr "workspace.shape.menu.paste")
|
||||||
|
|
|
@ -206,7 +206,13 @@
|
||||||
(fn [item]
|
(fn [item]
|
||||||
(fn [event]
|
(fn [event]
|
||||||
(dom/stop-propagation event)
|
(dom/stop-propagation event)
|
||||||
(reset! show-sub-menu? item))))]
|
(reset! show-sub-menu? item))))
|
||||||
|
|
||||||
|
toggle-flag
|
||||||
|
(mf/use-callback
|
||||||
|
(fn [flag]
|
||||||
|
(-> (dw/toggle-layout-flag flag)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-menu"))))]
|
||||||
|
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
(mf/deps @editing?)
|
(mf/deps @editing?)
|
||||||
|
@ -275,7 +281,7 @@
|
||||||
[:li {:on-click #(st/emit! (dw/select-all))}
|
[:li {:on-click #(st/emit! (dw/select-all))}
|
||||||
[:span (tr "workspace.header.menu.select-all")]
|
[:span (tr "workspace.header.menu.select-all")]
|
||||||
[:span.shortcut (sc/get-tooltip :select-all)]]
|
[:span.shortcut (sc/get-tooltip :select-all)]]
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :scale-text))}
|
[:li {:on-click #(st/emit! (toggle-flag :scale-text))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :scale-text)
|
(if (contains? layout :scale-text)
|
||||||
(tr "workspace.header.menu.disable-scale-text")
|
(tr "workspace.header.menu.disable-scale-text")
|
||||||
|
@ -285,21 +291,22 @@
|
||||||
[:& dropdown {:show (= @show-sub-menu? :view)
|
[:& dropdown {:show (= @show-sub-menu? :view)
|
||||||
:on-close #(reset! show-sub-menu? false)}
|
:on-close #(reset! show-sub-menu? false)}
|
||||||
[:ul.sub-menu.view
|
[:ul.sub-menu.view
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :rules))}
|
[:li {:on-click #(st/emit! (toggle-flag :rules))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :rules)
|
(if (contains? layout :rules)
|
||||||
(tr "workspace.header.menu.hide-rules")
|
(tr "workspace.header.menu.hide-rules")
|
||||||
(tr "workspace.header.menu.show-rules"))]
|
(tr "workspace.header.menu.show-rules"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-rules)]]
|
[:span.shortcut (sc/get-tooltip :toggle-rules)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :display-grid))}
|
[:li {:on-click #(st/emit! (toggle-flag :display-grid))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :display-grid)
|
(if (contains? layout :display-grid)
|
||||||
(tr "workspace.header.menu.hide-grid")
|
(tr "workspace.header.menu.hide-grid")
|
||||||
(tr "workspace.header.menu.show-grid"))]
|
(tr "workspace.header.menu.show-grid"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-grid)]]
|
[:span.shortcut (sc/get-tooltip :toggle-grid)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :sitemap :layers))}
|
[:li {:on-click #(st/emit! (toggle-flag :sitemap)
|
||||||
|
(toggle-flag :layers))}
|
||||||
[:span
|
[:span
|
||||||
(if (or (contains? layout :sitemap) (contains? layout :layers))
|
(if (or (contains? layout :sitemap) (contains? layout :layers))
|
||||||
(tr "workspace.header.menu.hide-layers")
|
(tr "workspace.header.menu.hide-layers")
|
||||||
|
@ -308,8 +315,8 @@
|
||||||
|
|
||||||
[:li {:on-click (fn []
|
[:li {:on-click (fn []
|
||||||
(r/set-resize-type! :bottom)
|
(r/set-resize-type! :bottom)
|
||||||
(st/emit! (dw/remove-layout-flags :textpalette)
|
(st/emit! (dw/remove-layout-flag :textpalette)
|
||||||
(dw/toggle-layout-flags :colorpalette)))}
|
(toggle-flag :colorpalette)))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :colorpalette)
|
(if (contains? layout :colorpalette)
|
||||||
(tr "workspace.header.menu.hide-palette")
|
(tr "workspace.header.menu.hide-palette")
|
||||||
|
@ -318,28 +325,29 @@
|
||||||
|
|
||||||
[:li {:on-click (fn []
|
[:li {:on-click (fn []
|
||||||
(r/set-resize-type! :bottom)
|
(r/set-resize-type! :bottom)
|
||||||
(st/emit! (dw/remove-layout-flags :colorpalette)
|
(st/emit! (dw/remove-layout-flag :colorpalette)
|
||||||
(dw/toggle-layout-flags :textpalette)))}
|
(toggle-flag :textpalette)))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :textpalette)
|
(if (contains? layout :textpalette)
|
||||||
(tr "workspace.header.menu.hide-textpalette")
|
(tr "workspace.header.menu.hide-textpalette")
|
||||||
(tr "workspace.header.menu.show-textpalette"))]
|
(tr "workspace.header.menu.show-textpalette"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-textpalette)]]
|
[:span.shortcut (sc/get-tooltip :toggle-textpalette)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :assets))}
|
[:li {:on-click #(st/emit! (toggle-flag :assets))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :assets)
|
(if (contains? layout :assets)
|
||||||
(tr "workspace.header.menu.hide-assets")
|
(tr "workspace.header.menu.hide-assets")
|
||||||
(tr "workspace.header.menu.show-assets"))]
|
(tr "workspace.header.menu.show-assets"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-assets)]]
|
[:span.shortcut (sc/get-tooltip :toggle-assets)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :display-artboard-names))}
|
[:li {:on-click #(st/emit! (toggle-flag :display-artboard-names))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :display-artboard-names)
|
(if (contains? layout :display-artboard-names)
|
||||||
(tr "workspace.header.menu.hide-artboard-names")
|
(tr "workspace.header.menu.hide-artboard-names")
|
||||||
(tr "workspace.header.menu.show-artboard-names"))]]
|
(tr "workspace.header.menu.show-artboard-names"))]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :hide-ui))}
|
[:li {:on-click #(st/emit! (-> (toggle-flag :hide-ui)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-menu")))}
|
||||||
[:span
|
[:span
|
||||||
(tr "workspace.shape.menu.hide-ui")]
|
(tr "workspace.shape.menu.hide-ui")]
|
||||||
[:span.shortcut (sc/get-tooltip :hide-ui)]]]]
|
[:span.shortcut (sc/get-tooltip :hide-ui)]]]]
|
||||||
|
@ -347,21 +355,21 @@
|
||||||
[:& dropdown {:show (= @show-sub-menu? :preferences)
|
[:& dropdown {:show (= @show-sub-menu? :preferences)
|
||||||
:on-close #(reset! show-sub-menu? false)}
|
:on-close #(reset! show-sub-menu? false)}
|
||||||
[:ul.sub-menu.preferences
|
[:ul.sub-menu.preferences
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :snap-guides))}
|
[:li {:on-click #(st/emit! (toggle-flag :snap-guides))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :snap-guides)
|
(if (contains? layout :snap-guides)
|
||||||
(tr "workspace.header.menu.disable-snap-guides")
|
(tr "workspace.header.menu.disable-snap-guides")
|
||||||
(tr "workspace.header.menu.enable-snap-guides"))]
|
(tr "workspace.header.menu.enable-snap-guides"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-snap-guide)]]
|
[:span.shortcut (sc/get-tooltip :toggle-snap-guide)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :snap-grid))}
|
[:li {:on-click #(st/emit! (toggle-flag :snap-grid))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :snap-grid)
|
(if (contains? layout :snap-grid)
|
||||||
(tr "workspace.header.menu.disable-snap-grid")
|
(tr "workspace.header.menu.disable-snap-grid")
|
||||||
(tr "workspace.header.menu.enable-snap-grid"))]
|
(tr "workspace.header.menu.enable-snap-grid"))]
|
||||||
[:span.shortcut (sc/get-tooltip :toggle-snap-grid)]]
|
[:span.shortcut (sc/get-tooltip :toggle-snap-grid)]]
|
||||||
|
|
||||||
[:li {:on-click #(st/emit! (dw/toggle-layout-flags :dynamic-alignment))}
|
[:li {:on-click #(st/emit! (toggle-flag :dynamic-alignment))}
|
||||||
[:span
|
[:span
|
||||||
(if (contains? layout :dynamic-alignment)
|
(if (contains? layout :dynamic-alignment)
|
||||||
(tr "workspace.header.menu.disable-dynamic-alignment")
|
(tr "workspace.header.menu.disable-dynamic-alignment")
|
||||||
|
@ -410,7 +418,8 @@
|
||||||
[:button.document-history
|
[:button.document-history
|
||||||
{:alt (tr "workspace.sidebar.history" (sc/get-tooltip :toggle-history))
|
{:alt (tr "workspace.sidebar.history" (sc/get-tooltip :toggle-history))
|
||||||
:class (when (contains? layout :document-history) "selected")
|
:class (when (contains? layout :document-history) "selected")
|
||||||
:on-click (st/emitf (dw/toggle-layout-flags :document-history))}
|
:on-click #(st/emit! (-> (dw/toggle-layout-flag :document-history)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-header")))}
|
||||||
i/recent]]
|
i/recent]]
|
||||||
|
|
||||||
[:div.options-section
|
[:div.options-section
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
[app.common.geom.point :as gpt]
|
[app.common.geom.point :as gpt]
|
||||||
[app.common.math :as mth]
|
[app.common.math :as mth]
|
||||||
[app.common.media :as cm]
|
[app.common.media :as cm]
|
||||||
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.workspace :as dw]
|
[app.main.data.workspace :as dw]
|
||||||
[app.main.data.workspace.shortcuts :as sc]
|
[app.main.data.workspace.shortcuts :as sc]
|
||||||
[app.main.refs :as refs]
|
[app.main.refs :as refs]
|
||||||
|
@ -46,16 +47,16 @@
|
||||||
:position (gpt/point x y)}]
|
:position (gpt/point x y)}]
|
||||||
(st/emit! (dw/upload-media-workspace params)))))]
|
(st/emit! (dw/upload-media-workspace params)))))]
|
||||||
|
|
||||||
[:li.tooltip.tooltip-right
|
[:li.tooltip.tooltip-right
|
||||||
{:alt (tr "workspace.toolbar.image" (sc/get-tooltip :insert-image))
|
{:alt (tr "workspace.toolbar.image" (sc/get-tooltip :insert-image))
|
||||||
:on-click on-click}
|
:on-click on-click}
|
||||||
[:*
|
[:*
|
||||||
i/image
|
i/image
|
||||||
[:& file-uploader {:input-id "image-upload"
|
[:& file-uploader {:input-id "image-upload"
|
||||||
:accept cm/str-image-types
|
:accept cm/str-image-types
|
||||||
:multi true
|
:multi true
|
||||||
:ref ref
|
:ref ref
|
||||||
:on-selected on-files-selected}]]]))
|
:on-selected on-files-selected}]]]))
|
||||||
|
|
||||||
(mf/defc left-toolbar
|
(mf/defc left-toolbar
|
||||||
{::mf/wrap [mf/memo]
|
{::mf/wrap [mf/memo]
|
||||||
|
@ -126,8 +127,9 @@
|
||||||
:on-click (fn []
|
:on-click (fn []
|
||||||
(r/set-resize-type! :bottom)
|
(r/set-resize-type! :bottom)
|
||||||
(dom/add-class! (dom/get-element-by-class "color-palette") "fade-out-down")
|
(dom/add-class! (dom/get-element-by-class "color-palette") "fade-out-down")
|
||||||
(ts/schedule 300 #(st/emit! (dw/remove-layout-flags :colorpalette)
|
(ts/schedule 300 #(st/emit! (dw/remove-layout-flag :colorpalette)
|
||||||
(dw/toggle-layout-flags :textpalette))))}
|
(-> (dw/toggle-layout-flag :textpalette)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-left-toolbar")))))}
|
||||||
"Ag"]
|
"Ag"]
|
||||||
|
|
||||||
[:li.tooltip.tooltip-right
|
[:li.tooltip.tooltip-right
|
||||||
|
@ -136,6 +138,7 @@
|
||||||
:on-click (fn []
|
:on-click (fn []
|
||||||
(r/set-resize-type! :bottom)
|
(r/set-resize-type! :bottom)
|
||||||
(dom/add-class! (dom/get-element-by-class "color-palette") "fade-out-down")
|
(dom/add-class! (dom/get-element-by-class "color-palette") "fade-out-down")
|
||||||
(ts/schedule 300 #(st/emit! (dw/remove-layout-flags :textpalette)
|
(ts/schedule 300 #(st/emit! (dw/remove-layout-flag :textpalette)
|
||||||
(dw/toggle-layout-flags :colorpalette))))}
|
(-> (dw/toggle-layout-flag :colorpalette)
|
||||||
|
(vary-meta assoc ::ev/origin "workspace-left-toolbar")))))}
|
||||||
i/palette]]]]))
|
i/palette]]]]))
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
(ns app.main.ui.workspace.nudge
|
(ns app.main.ui.workspace.nudge
|
||||||
(:require
|
(:require
|
||||||
[app.main.data.modal :as modal]
|
[app.main.data.modal :as modal]
|
||||||
[app.main.data.users :as du]
|
[app.main.data.workspace :as dw]
|
||||||
[app.main.refs :as refs]
|
[app.main.refs :as refs]
|
||||||
[app.main.store :as st]
|
[app.main.store :as st]
|
||||||
[app.main.ui.components.numeric-input :refer [numeric-input]]
|
[app.main.ui.components.numeric-input :refer [numeric-input]]
|
||||||
|
@ -19,34 +19,32 @@
|
||||||
[rumext.alpha :as mf])
|
[rumext.alpha :as mf])
|
||||||
(:import goog.events.EventType))
|
(:import goog.events.EventType))
|
||||||
|
|
||||||
|
(defn- on-keydown
|
||||||
|
[event]
|
||||||
|
(when (k/enter? event)
|
||||||
|
(dom/prevent-default event)
|
||||||
|
(dom/stop-propagation event)
|
||||||
|
(modal/hide!)))
|
||||||
|
|
||||||
(mf/defc nudge-modal
|
(mf/defc nudge-modal
|
||||||
{::mf/register modal/components
|
{::mf/register modal/components
|
||||||
::mf/register-as :nudge-option}
|
::mf/register-as :nudge-option}
|
||||||
[]
|
[]
|
||||||
(let [profile (mf/deref refs/profile)
|
(let [profile (mf/deref refs/profile)
|
||||||
nudge (get-in profile [:props :nudge] {:big 10 :small 1})
|
nudge (or (get-in profile [:props :nudge]) {:big 10 :small 1})
|
||||||
update-nudge (fn [value size] (let [update-nudge (if (= :big size)
|
update-big (mf/use-fn #(st/emit! (dw/update-nudge {:big %})))
|
||||||
{:big value :small (:small nudge)}
|
update-small (mf/use-fn #(st/emit! (dw/update-nudge {:small %})))
|
||||||
{:small value :big (:big nudge)})]
|
on-close (mf/use-fn #(modal/hide!))]
|
||||||
(st/emit! (du/update-nudge update-nudge))))
|
|
||||||
update-big (fn [value] (update-nudge value :big))
|
|
||||||
update-small (fn [value] (update-nudge value :small))
|
|
||||||
close #(modal/hide!)]
|
|
||||||
(mf/with-effect
|
(mf/with-effect
|
||||||
(letfn [(on-keydown [event]
|
(->> (events/listen js/document EventType.KEYDOWN on-keydown)
|
||||||
(when (k/enter? event)
|
(partial events/unlistenByKey)))
|
||||||
(dom/prevent-default event)
|
|
||||||
(dom/stop-propagation event)
|
|
||||||
(close)))]
|
|
||||||
(->> (events/listen js/document EventType.KEYDOWN on-keydown)
|
|
||||||
(partial events/unlistenByKey))))
|
|
||||||
|
|
||||||
[:div.nudge-modal-overlay
|
[:div.nudge-modal-overlay
|
||||||
[:div.nudge-modal-container
|
[:div.nudge-modal-container
|
||||||
[:div.nudge-modal-header
|
[:div.nudge-modal-header
|
||||||
[:p.nudge-modal-title (tr "modals.nudge-title")]
|
[:p.nudge-modal-title (tr "modals.nudge-title")]
|
||||||
[:button.modal-close-button {:on-click close} i/close]]
|
[:button.modal-close-button {:on-click on-close} i/close]]
|
||||||
[:div.nudge-modal-body
|
[:div.nudge-modal-body
|
||||||
[:div.input-wrapper
|
[:div.input-wrapper
|
||||||
[:span
|
[:span
|
||||||
|
@ -59,4 +57,4 @@
|
||||||
[:p.nudge-subtitle (tr "modals.big-nudge")]
|
[:p.nudge-subtitle (tr "modals.big-nudge")]
|
||||||
[:> numeric-input {:min 1
|
[:> numeric-input {:min 1
|
||||||
:value (:big nudge)
|
:value (:big nudge)
|
||||||
:on-change update-big}]]]]]]))
|
:on-change update-big}]]]]]]))
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
handle-collapse
|
handle-collapse
|
||||||
(fn []
|
(fn []
|
||||||
(st/emit! (dw/toggle-layout-flags :collapse-left-sidebar)))]
|
(st/emit! (dw/toggle-layout-flag :collapse-left-sidebar)))]
|
||||||
|
|
||||||
[:aside.settings-bar.settings-bar-left {:ref parent-ref
|
[:aside.settings-bar.settings-bar-left {:ref parent-ref
|
||||||
:class (dom/classnames
|
:class (dom/classnames
|
||||||
|
|
|
@ -95,7 +95,7 @@
|
||||||
|
|
||||||
{:keys [on-pointer-down on-lost-pointer-capture on-mouse-move parent-ref size]}
|
{:keys [on-pointer-down on-lost-pointer-capture on-mouse-move parent-ref size]}
|
||||||
(use-resize-hook :palette 72 54 80 :y true :bottom)]
|
(use-resize-hook :palette 72 54 80 :y true :bottom)]
|
||||||
|
|
||||||
[:div.color-palette {:ref parent-ref
|
[:div.color-palette {:ref parent-ref
|
||||||
:class (dom/classnames :no-text (< size 72))
|
:class (dom/classnames :no-text (< size 72))
|
||||||
:style #js {"--height" (str size "px")}}
|
:style #js {"--height" (str size "px")}}
|
||||||
|
|
|
@ -40,4 +40,5 @@
|
||||||
|
|
||||||
|
|
||||||
(defonce storage (atom (load (unchecked-get g/global "localStorage"))))
|
(defonce storage (atom (load (unchecked-get g/global "localStorage"))))
|
||||||
|
|
||||||
(add-watch storage :persistence #(persist js/localStorage %3 %4))
|
(add-watch storage :persistence #(persist js/localStorage %3 %4))
|
||||||
|
|
|
@ -282,4 +282,4 @@
|
||||||
(defn ^:export hide-ui
|
(defn ^:export hide-ui
|
||||||
[]
|
[]
|
||||||
(st/emit!
|
(st/emit!
|
||||||
(dw/toggle-layout-flags :hide-ui)))
|
(dw/toggle-layout-flag :hide-ui)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue