2015-12-18 17:42:42 +02:00
|
|
|
(ns uxbox.ui.workspace.pagesmngr
|
2015-12-17 17:32:06 +02:00
|
|
|
(: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]))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(defn- page-item-render
|
2015-12-17 17:32:06 +02:00
|
|
|
[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")
|
2015-12-18 17:42:42 +02:00
|
|
|
:key (str (:id page))
|
2015-12-17 17:32:06 +02:00
|
|
|
: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]]]))))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(def page-item
|
2015-12-17 17:32:06 +02:00
|
|
|
(util/component
|
2015-12-18 17:42:42 +02:00
|
|
|
{:render page-item-render
|
|
|
|
:name "page-item"
|
2015-12-17 17:32:06 +02:00
|
|
|
:mixins [rum/reactive]}))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(defn- page-list-render
|
2015-12-17 17:32:06 +02:00
|
|
|
[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]
|
2015-12-18 17:42:42 +02:00
|
|
|
(-> (page-item parent page (count pages))
|
|
|
|
(rum/with-key (:id page))))]
|
2015-12-17 17:32:06 +02:00
|
|
|
[:button.btn-primary.btn-small
|
|
|
|
{:on-click #(reset! parent {:edit true :form {}})}
|
|
|
|
"+ Add new page"]])))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(def page-list
|
2015-12-17 17:32:06 +02:00
|
|
|
(util/component
|
2015-12-18 17:42:42 +02:00
|
|
|
{:render page-list-render
|
|
|
|
:name "page-list"
|
2015-12-17 17:32:06 +02:00
|
|
|
:mixins [rum/reactive]}))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(defn- page-form-render
|
2015-12-17 17:32:06 +02:00
|
|
|
[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"]]))))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(def page-form
|
2015-12-17 17:32:06 +02:00
|
|
|
(util/component
|
2015-12-18 17:42:42 +02:00
|
|
|
{:render page-form-render
|
|
|
|
:name "page-form"
|
2015-12-17 17:32:06 +02:00
|
|
|
:mixins [rum/reactive]}))
|
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(defn pagesmngr-render
|
2015-12-17 17:32:06 +02:00
|
|
|
[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)
|
2015-12-18 17:42:42 +02:00
|
|
|
(page-form local)
|
|
|
|
(page-list local))])))
|
2015-12-17 17:32:06 +02:00
|
|
|
|
2015-12-18 17:42:42 +02:00
|
|
|
(def pagesmngr
|
2015-12-17 17:32:06 +02:00
|
|
|
(util/component
|
2015-12-18 17:42:42 +02:00
|
|
|
{:render pagesmngr-render
|
|
|
|
:name "pagesmngr"
|
2015-12-17 17:32:06 +02:00
|
|
|
:mixins [rum/reactive (mx/local {:edit false :form {}})]}))
|