From a5b90023187254c1457005b017a8f588792e6ca9 Mon Sep 17 00:00:00 2001 From: smarcet Date: Fri, 23 Feb 2024 17:17:17 -0300 Subject: [PATCH] feat: access rule updates for sponsors group --- .env.example | 4 +-- src/access-routes.yml | 22 ++++++++++-- src/components/forms/sponsor-form.js | 47 +++++++++++++------------ src/components/nav-menu/index.js | 2 +- src/models/member.js | 21 +++++++++++ src/pages/sponsors/edit-sponsor-page.js | 11 +++--- src/pages/sponsors/sponsor-list-page.js | 29 +++++++++------ 7 files changed, 94 insertions(+), 42 deletions(-) diff --git a/.env.example b/.env.example index a3cc79482..e344e73ca 100644 --- a/.env.example +++ b/.env.example @@ -11,9 +11,9 @@ OS_BASE_URL= SCOPES_BASE_REALM=${API_BASE_URL} SCOPES="profile openid offline_access ${SCOPES_BASE_REALM}/summits/delete-event ${SCOPES_BASE_REALM}/summits/write ${SCOPES_BASE_REALM}/summits/write-event ${SCOPES_BASE_REALM}/summits/read/all ${SCOPES_BASE_REALM}/summits/read ${SCOPES_BASE_REALM}/summits/publish-event ${SCOPES_BASE_REALM}/members/read ${SCOPES_BASE_REALM}/members/read/me ${SCOPES_BASE_REALM}/speakers/write ${SCOPES_BASE_REALM}/attendees/write ${SCOPES_BASE_REALM}/members/write ${SCOPES_BASE_REALM}/organizations/write ${SCOPES_BASE_REALM}/organizations/read ${SCOPES_BASE_REALM}/summits/write-presentation-materials ${SCOPES_BASE_REALM}/summits/registration-orders/update ${SCOPES_BASE_REALM}/summits/registration-orders/delete ${SCOPES_BASE_REALM}/summits/registration-orders/create/offline ${SCOPES_BASE_REALM}/summits/badge-scans/read entity-updates/publish ${SCOPES_BASE_REALM}/audit-logs/read" GOOGLE_API_KEY= -ALLOWED_USER_GROUPS="super-admins administrators summit-front-end-administrators summit-room-administrators track-chairs-admins" +ALLOWED_USER_GROUPS="super-admins administrators summit-front-end-administrators summit-room-administrators track-chairs-admins sponsors" APP_CLIENT_NAME = "openstack" PUBLIC_STORAGES="S3 SWIFT" OAUTH2_FLOW="code" TIMEINTERVALSINCE1970_API_URL=https://timeintervalsince1970.dev.fnopen.com -SIGNAGE_ABLY_API_KEY= \ No newline at end of file +SIGNAGE_ABLY_API_KEY= diff --git a/src/access-routes.yml b/src/access-routes.yml index aff6ee406..9f7e28874 100644 --- a/src/access-routes.yml +++ b/src/access-routes.yml @@ -11,11 +11,28 @@ sponsors: - super-admins - administrators - summit-front-end-administrators + - sponsors + +sponsors-add: + - super-admins + - administrators + - summit-front-end-administrators + +sponsors-edit: + - super-admins + - administrators + - summit-front-end-administrators + +sponsors-delete: + - super-admins + - administrators + - summit-front-end-administrators admin-sponsors: - super-admins - administrators - - + - summit-front-end-administrators + general: - super-admins - administrators @@ -23,6 +40,7 @@ general: - summit-room-administrators - summit-registration-administrators - track-chairs-admins + - sponsors audit-log: - super-admins @@ -207,4 +225,4 @@ progress-flags: signage: - super-admins - administrators - - summit-front-end-administrators \ No newline at end of file + - summit-front-end-administrators diff --git a/src/components/forms/sponsor-form.js b/src/components/forms/sponsor-form.js index 4ec54949f..bb4fe7cb2 100644 --- a/src/components/forms/sponsor-form.js +++ b/src/components/forms/sponsor-form.js @@ -170,8 +170,8 @@ class SponsorForm extends React.Component { } handleAdvertisementAdd(ev) { - const {entity, history} = this.props; - ev.preventDefault(); + const {entity, history} = this.props; + ev.preventDefault(); history.push(`/app/summits/${entity.summit_id}/sponsors/${entity.id}/ads/new`); } @@ -234,7 +234,7 @@ class SponsorForm extends React.Component { confirmButtonText: T.translate("general.yes_delete") }).then(function(result){ if (result.value) { - collection === 'ads' ? onAdvertisementDelete(element) + collection === 'ads' ? onAdvertisementDelete(element) : collection === 'materials' ? onMaterialDelete(element) : @@ -246,7 +246,7 @@ class SponsorForm extends React.Component { render() { const {entity, showSection} = this.state; - const { currentSummit, sponsorships, onCreateCompany } = this.props; + const { currentSummit, onCreateCompany, canEditSponsors } = this.props; const advertisement_columns = [ { columnKey: 'link', value: T.translate("edit_sponsor.link") }, @@ -317,14 +317,14 @@ class SponsorForm extends React.Component {
- {entity.id !== 0 && + {entity.id !== 0 && canEditSponsors &&
@@ -345,13 +345,13 @@ class SponsorForm extends React.Component {
} - {entity.id !== 0 && + {entity.id !== 0 && canEditSponsors && <>
- +
@@ -366,7 +366,7 @@ class SponsorForm extends React.Component { value={entity.marquee} onChange={this.handleChange} className="form-control" - /> + />
@@ -381,9 +381,9 @@ class SponsorForm extends React.Component {
-
+
- +
@@ -422,7 +422,7 @@ class SponsorForm extends React.Component {
-
+
@@ -464,7 +464,7 @@ class SponsorForm extends React.Component {

-
+

-
+

-
+
+
} - -
-
- + {canEditSponsors && +
+
+ +
-
+ } ); } diff --git a/src/components/nav-menu/index.js b/src/components/nav-menu/index.js index 2468e1605..b82c477b3 100644 --- a/src/components/nav-menu/index.js +++ b/src/components/nav-menu/index.js @@ -176,7 +176,7 @@ class NavMenu extends React.Component { }, {name: 'sponsors', iconClass: 'fa-handshake-o', accessRoute: 'sponsors', childs: [ - {name:'sponsor_list', linkUrl:`summits/${summit_id}/sponsors`, accessRoute: 'admin-sponsors'}, + {name:'sponsor_list', linkUrl:`summits/${summit_id}/sponsors`, accessRoute: 'sponsors'}, {name:'sponsorship_list', linkUrl:`summits/${summit_id}/sponsorships`, accessRoute: 'admin-sponsors'}, {name:'badge_scans', linkUrl:`summits/${summit_id}/badge-scans`, accessRoute: 'sponsors'}, ] diff --git a/src/models/member.js b/src/models/member.js index 3b7d24950..8082cfe2c 100644 --- a/src/models/member.js +++ b/src/models/member.js @@ -73,6 +73,27 @@ class Member { } return false; } + + canAddSponsors(){ + for (var i in this._member.groups) { + if (access['sponsors-add'].includes(this._member.groups[i].code)) return true; + } + return false; + } + + canEditSponsors(){ + for (var i in this._member.groups) { + if (access['sponsors-edit'].includes(this._member.groups[i].code)) return true; + } + return false; + } + + canDeleteSponsors(){ + for (var i in this._member.groups) { + if (access['sponsors-delete'].includes(this._member.groups[i].code)) return true; + } + return false; + } } export default Member; diff --git a/src/pages/sponsors/edit-sponsor-page.js b/src/pages/sponsors/edit-sponsor-page.js index 5f69b3bb5..fe2ae280f 100644 --- a/src/pages/sponsors/edit-sponsor-page.js +++ b/src/pages/sponsors/edit-sponsor-page.js @@ -13,7 +13,6 @@ import React from 'react' import { connect } from 'react-redux'; -import { Breadcrumb } from 'react-breadcrumbs'; import T from "i18n-react/dist/i18n-react"; import SponsorForm from '../../components/forms/sponsor-form'; import { @@ -33,6 +32,7 @@ import { updateSponsorAdsOrder, updateSponsorMaterialOrder } from "../../actions/sponsor-actions"; +import Member from "../../models/member"; class EditSponsorPage extends React.Component { @@ -61,9 +61,10 @@ class EditSponsorPage extends React.Component { } render() { - const { currentSummit, entity, errors, match, history, sponsorships } = this.props; + const { currentSummit, entity, errors, history, sponsorships, member } = this.props; const title = (entity.id) ? T.translate("general.edit") : T.translate("general.add"); - + const memberObj = new Member(member); + const canEditSponsors = memberObj.canEditSponsors(); return (

{title} {T.translate("edit_sponsor.sponsor")}

@@ -89,6 +90,7 @@ class EditSponsorPage extends React.Component { getSponsorAdvertisements={this.props.getSponsorAdvertisements} getSponsorMaterials={this.props.getSponsorMaterials} getSponsorSocialNetworks={this.props.getSponsorSocialNetworks} + canEditSponsors={canEditSponsors} /> }
@@ -96,9 +98,10 @@ class EditSponsorPage extends React.Component { } } -const mapStateToProps = ({ currentSummitState, currentSponsorState, currentSummitSponsorshipListState }) => ({ +const mapStateToProps = ({ loggedUserState, currentSummitState, currentSponsorState, currentSummitSponsorshipListState }) => ({ currentSummit: currentSummitState.currentSummit, sponsorships: currentSummitSponsorshipListState.sponsorships, + member : loggedUserState.member, ...currentSponsorState }); diff --git a/src/pages/sponsors/sponsor-list-page.js b/src/pages/sponsors/sponsor-list-page.js index 6fec781d3..188740a4c 100644 --- a/src/pages/sponsors/sponsor-list-page.js +++ b/src/pages/sponsors/sponsor-list-page.js @@ -18,6 +18,7 @@ import Swal from "sweetalert2"; import {SortableTable} from 'openstack-uicore-foundation/lib/components'; import { getSummitById } from '../../actions/summit-actions'; import { getSponsors, deleteSponsor, updateSponsorOrder } from "../../actions/sponsor-actions"; +import Member from "../../models/member"; class SponsorListPage extends React.Component { @@ -68,7 +69,10 @@ class SponsorListPage extends React.Component { } render(){ - const {currentSummit, sponsors, totalSponsors, allSponsorships} = this.props; + const {currentSummit, sponsors, totalSponsors, member} = this.props; + const memberObj = new Member(member); + const canAddSponsors = memberObj.canAddSponsors(); + const canDeleteSponsors = memberObj.canDeleteSponsors(); const columns = [ { columnKey: 'id', value: T.translate("sponsor_list.id") }, @@ -79,10 +83,13 @@ class SponsorListPage extends React.Component { const table_options = { actions: { edit: { onClick: this.handleEdit }, - delete: { onClick: this.handleDelete } } }; + if(canDeleteSponsors){ + table_options.actions = {...table_options.actions, delete: { onClick: this.handleDelete }}; + } + if(!currentSummit.id) return (
); let sortedSponsors = [...sponsors]; @@ -93,14 +100,15 @@ class SponsorListPage extends React.Component { return(

{T.translate("sponsor_list.sponsor_list")} ({totalSponsors})

-
-
- + {canAddSponsors && +
+
+ +
-
- + } {sponsors.length === 0 &&
{T.translate("sponsor_list.no_sponsors")}
} @@ -122,9 +130,10 @@ class SponsorListPage extends React.Component { } } -const mapStateToProps = ({ currentSummitState, currentSponsorListState, currentSummitSponsorshipListState }) => ({ +const mapStateToProps = ({ loggedUserState, currentSummitState, currentSponsorListState, currentSummitSponsorshipListState }) => ({ currentSummit : currentSummitState.currentSummit, allSponsorships : currentSummitSponsorshipListState.sponsorships, + member : loggedUserState.member, ...currentSponsorListState })