From a2584796216c6f9a51917b13445d224eb8a3ca8d Mon Sep 17 00:00:00 2001 From: Tomas Bures Date: Mon, 29 Jul 2019 09:24:50 +0200 Subject: [PATCH] Various fixes in the UI. Check permissions mechanism reworked to allow specifying permission checks already in menu structure. --- client/src/campaigns/CUD.js | 12 +- client/src/campaigns/List.js | 28 +--- client/src/campaigns/root.js | 18 ++- client/src/lib/form.js | 4 +- client/src/lib/modals.js | 38 +++-- client/src/lib/namespace.js | 26 ++- client/src/lib/page-common.js | 213 ++++++++++++++++--------- client/src/lib/page.js | 5 +- client/src/lib/permissions.js | 6 +- client/src/lib/tree.js | 46 ++++-- client/src/lists/CUD.js | 8 +- client/src/lists/List.js | 37 ++--- client/src/lists/forms/CUD.js | 7 +- client/src/lists/forms/List.js | 28 +--- client/src/lists/root.js | 31 +++- client/src/namespaces/CUD.js | 6 +- client/src/namespaces/List.js | 28 +--- client/src/namespaces/root.js | 14 +- client/src/reports/CUD.js | 8 +- client/src/reports/List.js | 42 ++--- client/src/reports/root.js | 35 +++- client/src/reports/templates/CUD.js | 14 +- client/src/reports/templates/List.js | 28 +--- client/src/send-configurations/CUD.js | 7 +- client/src/send-configurations/List.js | 28 +--- client/src/send-configurations/root.js | 14 +- client/src/shares/Share.js | 1 - client/src/templates/CUD.js | 5 +- client/src/templates/List.js | 42 ++--- client/src/templates/mosaico/CUD.js | 11 +- client/src/templates/mosaico/List.js | 28 +--- client/src/templates/root.js | 32 +++- client/src/users/CUD.js | 7 +- client/src/users/root.js | 9 +- server/config/default.yaml | 12 +- server/models/mosaico-templates.js | 1 - server/routes/rest/shares.js | 5 +- 37 files changed, 485 insertions(+), 399 deletions(-) diff --git a/client/src/campaigns/CUD.js b/client/src/campaigns/CUD.js index f2465c04..c48f2c57 100644 --- a/client/src/campaigns/CUD.js +++ b/client/src/campaigns/CUD.js @@ -22,7 +22,7 @@ import { withFormErrorHandlers } from '../lib/form'; import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; -import {NamespaceSelect, validateNamespace} from '../lib/namespace'; +import {getDefaultNamespace, NamespaceSelect, validateNamespace} from '../lib/namespace'; import {DeleteModalDialog} from "../lib/modals"; import mailtrainConfig from 'mailtrainConfig'; import {getTagLanguages, getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers'; @@ -109,6 +109,7 @@ export default class CUD extends Component { static propTypes = { action: PropTypes.string.isRequired, entity: PropTypes.object, + permissions: PropTypes.object, type: PropTypes.number } @@ -176,7 +177,12 @@ export default class CUD extends Component { } for (const overridable of campaignOverridables) { - data[overridable + '_overriden'] = data[overridable + '_override'] !== null; + if (data[overridable + '_override'] === null) { + data[overridable + '_override'] = ''; + data[overridable + '_overriden'] = false; + } else { + data[overridable + '_overriden'] = true; + } } const lsts = []; @@ -297,7 +303,7 @@ export default class CUD extends Component { lists: [lstUid], send_configuration: null, - namespace: mailtrainConfig.user.namespace, + namespace: getDefaultNamespace(this.props.permissions), subject: '', diff --git a/client/src/campaigns/List.js b/client/src/campaigns/List.js index 745b67fa..574a9016 100644 --- a/client/src/campaigns/List.js +++ b/client/src/campaigns/List.js @@ -4,15 +4,15 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; import {ButtonDropdown, Icon} from '../lib/bootstrap-components'; import {DropdownLink, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; -import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import {withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; import moment from 'moment'; import {CampaignSource, CampaignStatus, CampaignType} from "../../../shared/campaigns"; -import {checkPermissions} from "../lib/permissions"; import {getCampaignLabels} from "./helpers"; import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; import styles from "./styles.scss"; +import PropTypes from 'prop-types'; @withComponentMixins([ withTranslation, @@ -34,28 +34,16 @@ export default class List extends Component { tableRestActionDialogInit(this); } - @withAsyncErrorHandler - async fetchPermissions() { - const result = await checkPermissions({ - createCampaign: { - entityTypeId: 'namespace', - requiredOperations: ['createCampaign'] - } - }); - - this.setState({ - createPermitted: result.data.createCampaign - }); - } - - componentDidMount() { - // noinspection JSIgnoredPromiseFromCall - this.fetchPermissions(); + static propTypes = { + permissions: PropTypes.object } render() { const t = this.props.t; + const permissions = this.props.permissions; + const createPermitted = permissions.createCampaign; + const columns = [ { data: 1, title: t('name') }, { data: 2, title: t('id'), render: data => {data}, className: styles.tblCol_id }, @@ -153,7 +141,7 @@ export default class List extends Component {
{tableRestActionDialogRender(this)} - {this.state.createPermitted && + {createPermitted && {t('regular')} {t('rss')} diff --git a/client/src/campaigns/root.js b/client/src/campaigns/root.js index 8c075ca9..324522a0 100644 --- a/client/src/campaigns/root.js +++ b/client/src/campaigns/root.js @@ -17,6 +17,7 @@ import {SubscriptionStatus} from "../../../shared/lists"; import StatisticsOpened from "./StatisticsOpened"; import StatisticsLinkClicks from "./StatisticsLinkClicks"; import {ellipsizeBreadcrumbLabel} from "../lib/helpers" +import {namespaceCheckPermissions} from "../lib/namespace"; function getMenus(t) { const aggLabels = { @@ -28,7 +29,14 @@ function getMenus(t) { 'campaigns': { title: t('campaigns'), link: '/campaigns', - panelComponent: CampaignsList, + checkPermissions: { + createCampaign: { + entityTypeId: 'namespace', + requiredOperations: ['createCampaign'] + }, + ...namespaceCheckPermissions('createCampaign') + }, + panelRender: props => , children: { ':campaignId([0-9]+)': { title: resolved => t('campaignName', {name: ellipsizeBreadcrumbLabel(resolved.campaign.name)}), @@ -94,7 +102,7 @@ function getMenus(t) { title: t('edit'), link: params => `/campaigns/${params.campaignId}/edit`, visible: resolved => resolved.campaign.permissions.includes('edit'), - panelRender: props => + panelRender: props => }, content: { title: t('content'), @@ -153,15 +161,15 @@ function getMenus(t) { }, 'create-regular': { title: t('createRegularCampaign'), - panelRender: props => + panelRender: props => }, 'create-rss': { title: t('createRssCampaign'), - panelRender: props => + panelRender: props => }, 'create-triggered': { title: t('createTriggeredCampaign'), - panelRender: props => + panelRender: props => } } } diff --git a/client/src/lib/form.js b/client/src/lib/form.js index 892e5919..3de5f745 100644 --- a/client/src/lib/form.js +++ b/client/src/lib/form.js @@ -818,7 +818,7 @@ class TreeTableSelect extends Component { dataUrl: PropTypes.string, data: PropTypes.array, help: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), - format: PropTypes.string + format: PropTypes.string, } async onSelectionChangedAsync(sel) { @@ -835,7 +835,7 @@ class TreeTableSelect extends Component { const className = owner.addFormValidationClass('' , id); return wrapInput(id, htmlId, owner, props.format, '', props.label, props.help, - + ); } } diff --git a/client/src/lib/modals.js b/client/src/lib/modals.js index 993bd9a6..76b99a65 100644 --- a/client/src/lib/modals.js +++ b/client/src/lib/modals.js @@ -89,7 +89,7 @@ export class RestActionModalDialog extends Component { const t = this.props.t; return ( -