diff --git a/client/src/campaigns/CUD.js b/client/src/campaigns/CUD.js index c48f2c57..c7d014d4 100644 --- a/client/src/campaigns/CUD.js +++ b/client/src/campaigns/CUD.js @@ -70,15 +70,19 @@ export default class CUD extends Component { }; this.sourceLabels = { + [CampaignSource.CUSTOM]: t('customContent'), + [CampaignSource.CUSTOM_FROM_CAMPAIGN]: t('customContentClonedFromAnotherCampaign'), [CampaignSource.TEMPLATE]: t('template'), [CampaignSource.CUSTOM_FROM_TEMPLATE]: t('customContentClonedFromTemplate'), - [CampaignSource.CUSTOM_FROM_CAMPAIGN]: t('customContentClonedFromAnotherCampaign'), - [CampaignSource.CUSTOM]: t('customContent'), [CampaignSource.URL]: t('url') }; + const sourceLabelsOrder = [ + CampaignSource.CUSTOM, CampaignSource.CUSTOM_FROM_CAMPAIGN , CampaignSource.TEMPLATE, CampaignSource.CUSTOM_FROM_TEMPLATE, CampaignSource.URL + ]; + this.sourceOptions = []; - for (const key in this.sourceLabels) { + for (const key in sourceLabelsOrder) { this.sourceOptions.push({key, label: this.sourceLabels[key]}); } @@ -312,7 +316,7 @@ export default class CUD extends Component { unsubscribe_url: '', - source: CampaignSource.TEMPLATE, + source: CampaignSource.CUSTOM, // This is for CampaignSource.TEMPLATE and CampaignSource.CUSTOM_FROM_TEMPLATE data_sourceTemplate: null, diff --git a/server/config/default.yaml b/server/config/default.yaml index 232d8f6a..39ffb95e 100644 --- a/server/config/default.yaml +++ b/server/config/default.yaml @@ -286,7 +286,7 @@ defaultRoles: permissions: [view, edit, delete, share, createNamespace, createList, createCustomForm, createReport, createReportTemplate, createTemplate, createMosaicoTemplate, createSendConfiguration, createCampaign, manageUsers] children: sendConfiguration: [viewPublic, viewPrivate, edit, delete, share, sendWithoutOverrides, sendWithAllowedOverrides, sendWithAnyOverrides] - list: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] + list: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, viewTestSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] customForm: [view, edit, delete, share] campaign: [view, edit, delete, share, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, send, sendToTestUsers, viewStats, fetchRss] template: [view, edit, delete, share, viewFiles, manageFiles] @@ -301,7 +301,7 @@ defaultRoles: permissions: [view, edit, delete, share, createNamespace, createList, createCustomForm, createReport, createTemplate, createMosaicoTemplate, createCampaign] children: sendConfiguration: [viewPublic, sendWithoutOverrides, sendWithAllowedOverrides] - list: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] + list: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, viewTestSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] customForm: [view, edit, delete, share] campaign: [view, edit, delete, share, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, send, sendToTestUsers, viewStats, fetchRss] template: [view, edit, delete, share, viewFiles, manageFiles] @@ -316,11 +316,21 @@ defaultRoles: permissions: [view, createTemplate, createCampaign] children: sendConfiguration: [viewPublic] - campaign: [view, edit, delete, share, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, sendToTestUsers, fetchRss] - template: [view, edit, delete, share, viewFiles, manageFiles] + campaign: [view, edit, delete, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, sendToTestUsers, viewStats, fetchRss] + template: [view, edit, delete, viewFiles, manageFiles] mosaicoTemplate: [view, viewFiles] namespace: [view, createTemplate, createCampaign] + campaignsViewer: + name: Campaigns Viewer + description: In the respective namespace, the user has permissions to view campaigns and templates in order to be able to replicate them. + permissions: [view, createTemplate, createCampaign] + children: + campaign: [view, viewFiles, viewAttachments, viewTriggers] + template: [view, viewFiles] + mosaicoTemplate: [view, viewFiles] + namespace: [view] + sendConfiguration: master: name: Master @@ -329,17 +339,17 @@ defaultRoles: campaignsCreator: name: Campaigns Creator description: The user can only use the send configuration in setting up a campaign. However, this gives no permission to send. - permissions: [viewPublic] + permissions: [viewPublic, sendWithoutOverrides] list: master: name: Master description: All permissions - permissions: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] + permissions: [view, edit, delete, share, viewFields, manageFields, viewSubscriptions, viewTestSubscriptions, manageSubscriptions, viewSegments, manageSegments, viewImports, manageImports, send, sendToTestUsers] campaignsCreator: name: Campaigns Creator description: The user can only use the list in setting up a campaign and to send email to test users. This gives no permission to view subscriptions or to send to the whole list. - permissions: [view, viewFields, viewSegments, sendToTestUsers] + permissions: [view, viewFields, viewSegments, viewTestSubscriptions, sendToTestUsers] customForm: master: @@ -352,10 +362,14 @@ defaultRoles: name: Master description: All permissions permissions: [view, edit, delete, share, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, send, sendToTestUsers, viewStats, manageMessages, fetchRss] - campaignsCreator: - name: Campaigns Creator + creator: + name: Creator description: The user can setup the campaign but cannot send it. - permissions: [view, edit, delete, share, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, sendToTestUsers, fetchRss] + permissions: [view, edit, delete, viewFiles, manageFiles, viewAttachments, manageAttachments, viewTriggers, manageTriggers, sendToTestUsers, viewStats, fetchRss] + viewer: + name: Viewer + description: The user can view the campaign but cannot edit it or send it. + permissions: [view, viewFiles, viewAttachments, viewTriggers] rssTrigger: name: RSS Campaign Trigger description: Allows triggering a fetch of an RSS campaign @@ -366,6 +380,10 @@ defaultRoles: name: Master description: All permissions permissions: [view, edit, delete, share, viewFiles, manageFiles] + viewer: + name: Viewer + description: The user can view the template but cannot edit it. + permissions: [view, viewFiles] report: master: @@ -384,9 +402,8 @@ defaultRoles: name: Master description: All permissions permissions: [view, edit, delete, share, viewFiles, manageFiles] - campaignsCreator: - name: Campaigns Creator + viewer: + name: Viewer description: The user can use the Mosaico template, but cannot edit it or delete it. permissions: [view, viewFiles] - diff --git a/server/models/shares.js b/server/models/shares.js index 61bf82d1..ce974cf8 100644 --- a/server/models/shares.js +++ b/server/models/shares.js @@ -171,7 +171,6 @@ async function rebuildPermissionsTx(tx, restriction) { } } - // Reset root, own and shared namespaces shares as per the user roles const usersAutoSharesQry = tx('users') .select(['users.id', 'users.role', 'users.namespace']); diff --git a/server/models/subscriptions.js b/server/models/subscriptions.js index e2266080..4867f546 100644 --- a/server/models/subscriptions.js +++ b/server/models/subscriptions.js @@ -358,7 +358,7 @@ async function listDTAjax(context, listId, segmentId, params) { async function listTestUsersDTAjax(context, listCid, params) { return await knex.transaction(async tx => { const list = await lists.getByCidTx(tx, context, listCid); - await shares.enforceEntityPermissionTx(tx, context, 'list', list.id, 'viewSubscriptions'); + await shares.enforceEntityPermissionTx(tx, context, 'list', list.id, 'viewTestSubscriptions'); const listTable = getSubscriptionTableName(list.id);