From d70a32ef9d575142fa60bf119744e282a24141cf Mon Sep 17 00:00:00 2001 From: Matthew Huebert Date: Tue, 30 Jan 2024 15:39:09 +0100 Subject: [PATCH] :entity/admission-policy + fixes - new project with membership - trim read-only text field values - video fields: fix :field/wrap to skip nil urls --- deps.edn | 3 +- src/sb/app/board/ui.cljc | 1 + src/sb/app/field/ui.cljc | 6 +- src/sb/app/membership/data.cljc | 4 +- src/sb/app/project/data.cljc | 4 +- src/sb/app/project/ui.cljc | 121 ++++++++++++++++---------------- 6 files changed, 73 insertions(+), 66 deletions(-) diff --git a/deps.edn b/deps.edn index 54b15de7..b856ed6a 100644 --- a/deps.edn +++ b/deps.edn @@ -65,7 +65,8 @@ net.cgrand/macrovich {:mvn/version "0.2.1"} reagent/reagent {:mvn/version "1.1.1"} thheller/shadow-cljs {:mvn/version "2.25.7"} - net.clojars.wkok/openai-clojure {:mvn/version "0.5.0"}} + net.clojars.wkok/openai-clojure {:mvn/version "0.5.0"} + net.cgrand/xforms {:mvn/version "0.19.6"}} :aliases {:uberjar {:exec-fn sb.build/uberjar} :aot {:exec-fn sb.build/aot} diff --git a/src/sb/app/board/ui.cljc b/src/sb/app/board/ui.cljc index 216f7050..e972d0c5 100644 --- a/src/sb/app/board/ui.cljc +++ b/src/sb/app/board/ui.cljc @@ -115,6 +115,7 @@ :keys [entity/id]} (project.data/new! nil {:entity/parent board-id :entity/title (t :tr/untitled) + :entity/admission-policy :admission-policy/open :entity/draft? true})] (when id (routing/nav! `project.ui/show {:project-id id})) diff --git a/src/sb/app/field/ui.cljc b/src/sb/app/field/ui.cljc index b7b56fe1..dcee96ef 100644 --- a/src/sb/app/field/ui.cljc +++ b/src/sb/app/field/ui.cljc @@ -198,7 +198,9 @@ (if multi-line? {:Meta-Enter save} {:Enter save}) - keybindings)))}))]) + keybindings)))}) + (cond-> (not can-edit?) + (update :value #(some-> % str/trim))))]) ;; show pencil when value is modified (when (and (or focused? (:touched ?field)) (io/closest ?field :field/persisted?) @@ -277,7 +279,7 @@ (when can-edit? (text-field ?field (merge props {:field/label false - :field/wrap (fn [v] {:video/url v}) + :field/wrap (fn [v] (when-not (str/blank? v) {:video/url v})) :field/unwrap :video/url :placeholder "YouTube or Vimeo url"})))]))) diff --git a/src/sb/app/membership/data.cljc b/src/sb/app/membership/data.cljc index 8f7830ef..02705937 100644 --- a/src/sb/app/membership/data.cljc +++ b/src/sb/app/membership/data.cljc @@ -168,10 +168,10 @@ ;:entity-id [:entity/id #uuid "a1630339-64b3-3604-8110-0f22355e12be"] :search-term "matt"})) -(defn new-entity-with-membership [entity account-id roles] +(defn new-entity-with-membership [entity member-id roles] {:entity/id (random-uuid) :entity/kind :membership - :membership/member (sch/wrap-id account-id) + :membership/member (sch/wrap-id member-id) :membership/entity entity :membership/roles roles}) diff --git a/src/sb/app/project/data.cljc b/src/sb/app/project/data.cljc index 7db53522..094f9485 100644 --- a/src/sb/app/project/data.cljc +++ b/src/sb/app/project/data.cljc @@ -123,7 +123,9 @@ ;; TODO ;; verify that user is allowed to create a new project in parent (let [project (dl/new-entity project :project :by account-id) - membership (member.data/new-entity-with-membership project account-id #{:role/admin})] + membership (member.data/new-entity-with-membership project + (az/membership-id account-id (:entity/parent project)) + #{:role/admin})] (validate/assert project :project/as-map) (db/transact! [membership]) {:entity/id (:entity/id project)})) \ No newline at end of file diff --git a/src/sb/app/project/ui.cljc b/src/sb/app/project/ui.cljc index 8f793ac2..9e144f90 100644 --- a/src/sb/app/project/ui.cljc +++ b/src/sb/app/project/ui.cljc @@ -137,66 +137,67 @@ "Visitor" #{}} "Current User") field-params {:membership/roles roles :field/can-edit? can-edit?}] - [:div.flex-v.gap-6.pb-6.rounded-lg.relative - (when (:project/sticky? project) - {:class "outline outline-4" - :style {:outline-color (-> project :entity/parent :board/sticky-color) - :margin 4}}) - ;; title row - [:div.flex-v - (when (:entity/draft? project) - [:div.border-b-2.border-dashed.px-body.py-3.flex-center.gap-3 - [:div.mr-auto.text-gray-500 "Draft - only visible to you."] - [field.ui/action-btn {:on-click #(entity.data/save-attribute! nil (:entity/id project) :entity/draft? false) - :classes {:btn "btn-primary px-4 py-2" - :progress-bar "text-[rgba(255,255,255,0.5)]"}} - (t :tr/publish)]]) - [:div.flex - [:h1.font-medium.text-2xl.flex-auto.px-body.flex.items-center.pt-6 - [entity.ui/persisted-attr project :entity/title (merge field-params - {:field/label false - :field/multi-line? false - :field/unstyled? (some-> (:entity/title project) - (not= "Untitled"))})]] - - - [:div.flex.px-1.rounded-bl-lg.border-b.border-l.absolute.top-0.right-0 - dev-panel - - (when (:role/board-admin roles) - ;; - archive - [radix/dropdown-menu - {:trigger [:div.flex.items-center [icons/ellipsis-horizontal "rotate-90 icon-gray"]] - :items [[{} [entity.ui/persisted-attr project :project/sticky? (assoc field-params :field/label "Sticky?")]]]}]) - - [radix/tooltip "Back to board" - [:a.modal-title-icon {:href (routing/entity-path (:entity/parent project) 'ui/show)} - [icons/arrow-left]]] - (when (:entity/id project) - [radix/tooltip "Link to project" - [:a.modal-title-icon {:href (routing/entity-path project :show)} - [icons/link-2]]]) - [radix/dialog-close - [:div.modal-title-icon [icons/close]]]]]] - - [:div.px-body.flex-v.gap-6 - - [entity.ui/persisted-attr project :project/badges field-params] - [entity.ui/persisted-attr project :entity/description (merge field-params - {:field/label false - :placeholder "Description"})] - [entity.ui/persisted-attr project :entity/video field-params] - - [entity.ui/persisted-attr project - :entity/field-entries - {:entity/fields (->> project :entity/parent :entity/project-fields) - :membership/roles roles - :field/can-edit? can-edit?}] - - [project-members project field-params] - - [:section.flex-v.gap-2.items-start - [manage-community-actions project (:project/community-actions project)]]]])) + [:<> + (when (:entity/draft? project) + [:div.border-b-2.border-dashed.px-body.py-2.flex-center.gap-3.bg-gray-100 + [:div.mr-auto.text-gray-500 "Draft - only visible to you."] + [field.ui/action-btn {:on-click #(entity.data/save-attribute! nil (:entity/id project) :entity/draft? false) + :classes {:btn "btn-primary px-4 py-1" + :progress-bar "text-[rgba(255,255,255,0.5)]"}} + (t :tr/publish)]]) + [:div.flex-v.gap-6.pb-6.rounded-lg.relative + (when (:project/sticky? project) + {:class "outline outline-4" + :style {:outline-color (-> project :entity/parent :board/sticky-color) + :margin 4}}) + ;; title row + [:div.flex-v.mt-6 + [:div.flex + [:h1.font-medium.text-2xl.flex-auto.px-body.flex.items-center.pt-6 + [entity.ui/persisted-attr project :entity/title (merge field-params + {:field/label false + :field/multi-line? false + :field/unstyled? (some-> (:entity/title project) + (not= "Untitled"))})]] + + + [:div.flex.px-1.rounded-bl-lg.border-b.border-l.absolute.top-0.right-0 + dev-panel + + (when (:role/board-admin roles) + ;; - archive + [radix/dropdown-menu + {:trigger [:div.flex.items-center [icons/ellipsis-horizontal "rotate-90 icon-gray"]] + :items [[{} [entity.ui/persisted-attr project :project/sticky? (assoc field-params :field/label "Sticky?")]]]}]) + + [radix/tooltip "Back to board" + [:a.modal-title-icon {:href (routing/entity-path (:entity/parent project) 'ui/show)} + [icons/arrow-left]]] + (when (:entity/id project) + [radix/tooltip "Link to project" + [:a.modal-title-icon {:href (routing/entity-path project :show)} + [icons/link-2]]]) + [radix/dialog-close + [:div.modal-title-icon [icons/close]]]]]] + + [:div.px-body.flex-v.gap-6 + + [entity.ui/persisted-attr project :project/badges field-params] + [entity.ui/persisted-attr project :entity/description (merge field-params + {:field/label false + :placeholder "Description"})] + [entity.ui/persisted-attr project :entity/video field-params] + + [entity.ui/persisted-attr project + :entity/field-entries + {:entity/fields (->> project :entity/parent :entity/project-fields) + :membership/roles roles + :field/can-edit? can-edit?}] + + [project-members project field-params] + + #_[:section.flex-v.gap-2.items-start + [manage-community-actions project (:project/community-actions project)]]]]])) (defn membership-colors [membership] (into []