Add improved abstraction for team permissions

Relevant changes:
- replace user-viewer? with can-edit removing many double
  negations on the code
- always use team permissions making the permissions access uniform
  around all the code
- expose team permissions to ui tree through ctx/team-permissions
  context
This commit is contained in:
Andrey Antukh 2024-10-18 16:23:24 +02:00 committed by Alonso Torres
parent b3fcbd91e4
commit d6da8afdce
29 changed files with 412 additions and 391 deletions

View file

@ -255,28 +255,30 @@
(mf/defc rol-info
{::mf/wrap-props false}
[{:keys [member team on-set-admin on-set-editor on-set-owner on-set-viewer profile]}]
(let [member-is-owner? (:is-owner member)
member-is-admin? (and (:is-admin member) (not member-is-owner?))
member-is-editor? (and (:can-edit member) (and (not member-is-admin?) (not member-is-owner?)))
show? (mf/use-state false)
(let [member-is-owner (:is-owner member)
member-is-admin (and (:is-admin member) (not member-is-owner))
member-is-editor (and (:can-edit member) (and (not member-is-admin) (not member-is-owner)))
show? (mf/use-state false)
you-owner? (dm/get-in team [:permissions :is-owner])
you-admin? (dm/get-in team [:permissions :is-admin])
is-you? (= (:id profile) (:id member))
permissions (:permissions team)
is-owner (:is-owner permissions)
is-admin (:is-admin permissions)
can-change-rol? (or you-owner? you-admin?)
not-superior? (or you-owner? (and can-change-rol? (or member-is-admin? member-is-editor?)))
is-you (= (:id profile) (:id member))
role (cond
member-is-owner? "labels.owner"
member-is-admin? "labels.admin"
member-is-editor? "labels.editor"
:else "labels.viewer")
can-change-rol (or is-owner is-admin)
not-superior (or is-admin (and can-change-rol (or member-is-admin member-is-editor)))
on-show (mf/use-fn #(reset! show? true))
on-hide (mf/use-fn #(reset! show? false))]
role (cond
member-is-owner "labels.owner"
member-is-admin "labels.admin"
member-is-editor "labels.editor"
:else "labels.viewer")
on-show (mf/use-fn #(reset! show? true))
on-hide (mf/use-fn #(reset! show? false))]
[:*
(if (and can-change-rol? not-superior? (not (and is-you? you-owner?)))
(if (and can-change-rol not-superior (not (and is-you is-owner)))
[:div {:class (stl/css :rol-selector :has-priv)
:on-click on-show}
[:span {:class (stl/css :rol-label)} (tr role)]
@ -295,7 +297,7 @@
[:li {:on-click on-set-viewer
:class (stl/css :rol-dropdown-item)}
(tr "labels.viewer")]
(when you-owner?
(when is-owner
[:li {:on-click (partial on-set-owner member)
:class (stl/css :rol-dropdown-item)}
(tr "labels.owner")])]]]))
@ -320,7 +322,6 @@
:on-click on-show}
menu-icon]
[:& dropdown {:show @show? :on-close on-hide}
[:ul {:class (stl/css :actions-dropdown)}
(when is-you?
@ -910,12 +911,13 @@
(tr "dashboard.webhooks.create")]])
(mf/defc webhook-actions
{::mf/wrap-props false}
[{:keys [on-edit on-delete can-edit?]}]
{::mf/props :obj
::mf/private true}
[{:keys [on-edit on-delete can-edit]}]
(let [show? (mf/use-state false)
on-show (mf/use-fn #(reset! show? true))
on-hide (mf/use-fn #(reset! show? false))]
(if can-edit?
(if can-edit
[:*
[:button {:class (stl/css :menu-btn)
:on-click on-show}
@ -948,7 +950,7 @@
creator-id (:profile-id webhook)
profile (mf/deref refs/profile)
user-id (:id profile)
can-edit? (or (:can-edit permissions)
can-edit (or (:can-edit permissions)
(= creator-id user-id))
on-edit
(mf/use-fn
@ -1002,8 +1004,8 @@
[:div {:class (stl/css :table-field :actions)}
[:& webhook-actions
{:on-edit on-edit
:can-edit? can-edit?
:on-delete on-delete}]]]))
:on-delete on-delete
:can-edit can-edit}]]]))
(mf/defc webhooks-list
{::mf/wrap-props false}
@ -1053,9 +1055,9 @@
stats (mf/deref refs/dashboard-team-stats)
you-owner? (get-in team [:permissions :is-owner])
you-admin? (get-in team [:permissions :is-admin])
can-edit? (or you-owner? you-admin?)
permissions (:permissions team)
can-edit (or (:is-owner permissions)
(:is-admin permissions))
on-image-click
(mf/use-callback #(dom/click (mf/ref-val finput)))
@ -1086,13 +1088,13 @@
[:div {:class (stl/css :block-text)}
(:name team)]
[:div {:class (stl/css :team-icon)}
(when can-edit?
(when can-edit
[:button {:class (stl/css :update-overlay)
:on-click on-image-click}
image-icon])
[:img {:class (stl/css :team-image)
:src (cfg/resolve-team-photo-url team)}]
(when can-edit?
(when can-edit
[:& file-uploader {:accept "image/jpeg,image/png"
:multi false
:ref finput