mirror of
https://github.com/penpot/penpot.git
synced 2025-02-03 21:09:00 -05:00
132 lines
4.2 KiB
Text
132 lines
4.2 KiB
Text
|
(ns uxbox.ui.workspace.leftsidebar
|
||
|
(:require [sablono.core :as html :refer-macros [html]]
|
||
|
[rum.core :as rum]
|
||
|
[cuerdas.core :as str]
|
||
|
[uxbox.rstore :as rs]
|
||
|
[uxbox.data.projects :as dp]
|
||
|
[uxbox.ui.icons :as i]
|
||
|
[uxbox.ui.keyboard :as k]
|
||
|
[uxbox.ui.mixins :as mx]
|
||
|
[uxbox.ui.workspace.base :as wb]
|
||
|
[uxbox.ui.dom :as dom]
|
||
|
[uxbox.ui.util :as util]))
|
||
|
|
||
|
(defn- project-sidebar-pageitem-render
|
||
|
[own parent page numpages]
|
||
|
(letfn [(on-edit [e]
|
||
|
(let [data {:edit true :form page}]
|
||
|
(reset! parent data)))]
|
||
|
|
||
|
(let [curpage (rum/react wb/page-state)
|
||
|
active? (= (:id curpage) (:id page))
|
||
|
deletable? (> numpages 1)
|
||
|
navigate #(rs/emit! (dp/go-to-project (:project page) (:id page)))
|
||
|
delete #(rs/emit! (dp/delete-page (:id page)))]
|
||
|
(html
|
||
|
[:li.single-page
|
||
|
{:class (when active? "current")
|
||
|
:on-click navigate}
|
||
|
[:div.tree-icon i/page]
|
||
|
[:span (:name page)]
|
||
|
[:div.options
|
||
|
[:div {:on-click on-edit} i/pencil]
|
||
|
[:div {:class (when-not deletable? "hide")
|
||
|
:on-click delete}
|
||
|
i/trash]]]))))
|
||
|
|
||
|
(def project-sidebar-pageitem
|
||
|
(util/component
|
||
|
{:render project-sidebar-pageitem-render
|
||
|
:name "project-sidebar-pageitem"
|
||
|
:mixins [rum/reactive]}))
|
||
|
|
||
|
(defn- project-sidebar-pagelist-render
|
||
|
[own parent]
|
||
|
(let [project (rum/react wb/project-state)
|
||
|
pages (rum/react wb/pages-state)
|
||
|
name (:name project)]
|
||
|
(html
|
||
|
[:div.project-bar-inside
|
||
|
[:span.project-name name]
|
||
|
[:ul.tree-view
|
||
|
(for [page pages]
|
||
|
(let [component (project-sidebar-pageitem parent page (count pages))]
|
||
|
(rum/with-key component (str (:id page)))))]
|
||
|
[:button.btn-primary.btn-small
|
||
|
{:on-click #(reset! parent {:edit true :form {}})}
|
||
|
"+ Add new page"]])))
|
||
|
|
||
|
(def project-sidebar-pagelist
|
||
|
(util/component
|
||
|
{:render project-sidebar-pagelist-render
|
||
|
:name "project-sidebar-pagelist"
|
||
|
:mixins [rum/reactive]}))
|
||
|
|
||
|
(defn- project-sidebar-form-render
|
||
|
[own parent]
|
||
|
(let [form (:form @parent)
|
||
|
project @wb/project-state]
|
||
|
(letfn [(on-change [e]
|
||
|
(let [value (dom/event->value e)]
|
||
|
(swap! parent assoc-in [:form :name] value)))
|
||
|
(persist []
|
||
|
(if (nil? (:id form))
|
||
|
(let [data {:project (:id project)
|
||
|
:width (:width project)
|
||
|
:height (:height project)
|
||
|
:name (:name form)}]
|
||
|
(rs/emit! (dp/create-page data))
|
||
|
(reset! parent {:edit false}))
|
||
|
(do
|
||
|
(rs/emit! (dp/update-page-name (:id form) (:name form)))
|
||
|
(reset! parent {:edit false}))))
|
||
|
(on-save [e]
|
||
|
(persist))
|
||
|
(on-key-up [e]
|
||
|
(when (k/enter? e)
|
||
|
(persist)))
|
||
|
(on-cancel [e]
|
||
|
(reset! parent {:edit false}))]
|
||
|
(html
|
||
|
[:div.project-bar-inside
|
||
|
[:input.input-text
|
||
|
{:name "test"
|
||
|
:auto-focus true
|
||
|
:placeholder "Page title"
|
||
|
:type "text"
|
||
|
:value (get-in @parent [:form :name] "")
|
||
|
:on-change on-change
|
||
|
:on-key-up on-key-up}]
|
||
|
[:button.btn-primary.btn-small
|
||
|
{:disabled (str/empty? (str/trim (get-in @parent [:form :name] "")))
|
||
|
:on-click on-save}
|
||
|
"Save"]
|
||
|
[:button.btn-delete.btn-small
|
||
|
{:on-click on-cancel}
|
||
|
"Cancel"]]))))
|
||
|
|
||
|
(def project-sidebar-form
|
||
|
(util/component
|
||
|
{:render project-sidebar-form-render
|
||
|
:name "project-sidebar-form"
|
||
|
:mixins [rum/reactive]}))
|
||
|
|
||
|
(defn left-sidebar-render
|
||
|
[own]
|
||
|
(let [local (:rum/local own)
|
||
|
workspace (rum/react wb/workspace-state)
|
||
|
project (rum/react wb/project-state)]
|
||
|
(html
|
||
|
[:div#project-bar.project-bar
|
||
|
(when-not (:pagesbar-enabled workspace false)
|
||
|
{:class "toggle"})
|
||
|
(if (:edit @local)
|
||
|
(project-sidebar-form local)
|
||
|
(project-sidebar-pagelist local))])))
|
||
|
|
||
|
(def left-sidebar
|
||
|
(util/component
|
||
|
{:render left-sidebar-render
|
||
|
:name "left-sidebar"
|
||
|
:mixins [rum/reactive (mx/local {:edit false :form {}})]}))
|