Skip to content

Commit

Permalink
Hide publish related toolbar buttons if permission is missing
Browse files Browse the repository at this point in the history
  • Loading branch information
danrot committed Aug 12, 2019
1 parent c0fc004 commit 315e35a
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 54 deletions.
Expand Up @@ -40,7 +40,7 @@ jest.mock('../../../../views/Form', () => jest.fn(function() {
this.submit = jest.fn();
}));

function createSaveWithPublishingToolbarAction() {
function createSaveWithPublishingToolbarAction(options = {}) {
const resourceStore = new ResourceStore('test');
const resourceFormStore = new ResourceFormStore(resourceStore, 'test');
const router = new Router({});
Expand All @@ -51,7 +51,7 @@ function createSaveWithPublishingToolbarAction() {
router,
});

return new SaveWithPublishingToolbarAction(resourceFormStore, form, router, [], {});
return new SaveWithPublishingToolbarAction(resourceFormStore, form, router, [], options);
}

test('Return item config with correct disabled, loading, icon, type and value', () => {
Expand Down Expand Up @@ -150,6 +150,33 @@ test('Return item config with all options disabled when not dirty and data was n
}));
});

test('Return item config without publish specific options if condition is no met', () => {
const editToolbarAction = createSaveWithPublishingToolbarAction({publish_display_condition: '_permission.live'});

expect(editToolbarAction.getToolbarItemConfig().options).toEqual([
expect.objectContaining({
label: 'sulu_admin.save_draft',
}),
]);
});

test('Return item config with publish specific options if condition is met', () => {
const editToolbarAction = createSaveWithPublishingToolbarAction({publish_display_condition: '_permission.live'});
editToolbarAction.resourceFormStore.resourceStore.data._permission = {live: true};

expect(editToolbarAction.getToolbarItemConfig().options).toEqual([
expect.objectContaining({
label: 'sulu_admin.save_draft',
}),
expect.objectContaining({
label: 'sulu_admin.save_publish',
}),
expect.objectContaining({
label: 'sulu_admin.publish',
}),
]);
});

test('Return item config with loading button when saving flag is set', () => {
const publishableSaveToolbarAction = createSaveWithPublishingToolbarAction();
publishableSaveToolbarAction.resourceFormStore.resourceStore.saving = true;
Expand Down
@@ -1,39 +1,51 @@
// @flow
import jexl from 'jexl';
import {translate} from '../../../utils/Translator';
import AbstractFormToolbarAction from './AbstractFormToolbarAction';

export default class SaveWithPublishingToolbarAction extends AbstractFormToolbarAction {
getToolbarItemConfig() {
const {
publish_display_condition: publishDisplayCondition,
} = this.options;

const {dirty, data, saving} = this.resourceFormStore;

const options = [
{
label: translate('sulu_admin.save_draft'),
disabled: !dirty,
onClick: () => {
this.form.submit('draft');
},
},
];

if (!publishDisplayCondition || jexl.evalSync(publishDisplayCondition, this.resourceFormStore.data)) {
options.push({
label: translate('sulu_admin.save_publish'),
disabled: !dirty,
onClick: () => {
this.form.submit('publish');
},
});

options.push({
label: translate('sulu_admin.publish'),
// TODO do not hardcode "publishedState" but use metadata instead
disabled: dirty || data.publishedState === undefined || !!data.publishedState,
onClick: () => {
this.form.submit('publish');
},
});
}

return {
type: 'dropdown',
label: translate('sulu_admin.save'),
icon: 'su-save',
loading: saving,
options: [
{
label: translate('sulu_admin.save_draft'),
disabled: !dirty,
onClick: () => {
this.form.submit('draft');
},
},
{
label: translate('sulu_admin.save_publish'),
disabled: !dirty,
onClick: () => {
this.form.submit('publish');
},
},
{
label: translate('sulu_admin.publish'),
// TODO do not hardcode "publishedState" but use metadata instead
disabled: dirty || data.publishedState === undefined || !!data.publishedState,
onClick: () => {
this.form.submit('publish');
},
},
],
options,
};
}
}
12 changes: 9 additions & 3 deletions src/Sulu/Bundle/PageBundle/Admin/PageAdmin.php
Expand Up @@ -111,10 +111,16 @@ public function getRoutes(): array
$firstWebspace = current($this->webspaceManager->getWebspaceCollection()->getWebspaces());

$formToolbarActionsWithType = [
'sulu_admin.save_with_publishing',
'sulu_admin.save_with_publishing' => [
'publish_display_condition' => '(!_permissions || _permissions.live)',
],
'sulu_page.templates',
'sulu_admin.delete',
'sulu_page.edit',
'sulu_admin.delete' => [
'display_condition' => '(!_permissions || _permissions.delete) && url != "/"'
],
'sulu_page.edit' => [
'publish_display_condition' => '(!_permissions || _permissions.live)',
],
];

$formToolbarActionsWithoutType = [
Expand Down
1 change: 1 addition & 0 deletions src/Sulu/Bundle/PageBundle/Resources/js/package.json
Expand Up @@ -6,6 +6,7 @@
"dependencies": {
"classnames": "^2.2.5",
"fast-deep-equal": "^1.0.0",
"jexl": "^2.1.0",
"textversionjs": "^1.1.3",
"url-search-params-polyfill": "^2.0.0"
},
Expand Down
Expand Up @@ -56,7 +56,7 @@ jest.mock('sulu-admin-bundle/views/Form/Form', () => jest.fn(function() {
this.showSuccessSnackbar = jest.fn();
}));

function createEditToolbarAction(locales) {
function createEditToolbarAction(locales, options = {}) {
const resourceStore = new ResourceStore('test');
const formStore = new ResourceFormStore(resourceStore, 'test');
const router = new Router({});
Expand All @@ -67,7 +67,7 @@ function createEditToolbarAction(locales) {
router,
});

return new EditToolbarAction(formStore, form, router, locales, {});
return new EditToolbarAction(formStore, form, router, locales, options);
}

test('Return enabled item config', () => {
Expand Down Expand Up @@ -97,6 +97,33 @@ test('Return enabled item config', () => {
}));
});

test('Return item config without publish specific options if condition is no met', () => {
const editToolbarAction = createEditToolbarAction(['en', 'de'], {publish_display_condition: '_permission.live'});

expect(editToolbarAction.getToolbarItemConfig().options).toEqual([
expect.objectContaining({
label: 'sulu_admin.copy_locale',
}),
]);
});

test('Return item config with publish specific options if condition is met', () => {
const editToolbarAction = createEditToolbarAction(['en', 'de'], {publish_display_condition: '_permission.live'});
editToolbarAction.resourceFormStore.resourceStore.data._permission = {live: true};

expect(editToolbarAction.getToolbarItemConfig().options).toEqual([
expect.objectContaining({
label: 'sulu_admin.copy_locale',
}),
expect.objectContaining({
label: 'sulu_page.delete_draft',
}),
expect.objectContaining({
label: 'sulu_page.unpublish',
}),
]);
});

test('Return disabled delete draft and unpublish items when page is not published', () => {
const editToolbarAction = createEditToolbarAction(['en', 'de']);
editToolbarAction.resourceFormStore.resourceStore.id = 5;
Expand Down
@@ -1,6 +1,7 @@
// @flow
import React, {Fragment} from 'react';
import {action, observable} from 'mobx';
import jexl from 'jexl';
import {Dialog} from 'sulu-admin-bundle/components';
import {ResourceRequester} from 'sulu-admin-bundle/services';
import {translate} from 'sulu-admin-bundle/utils';
Expand Down Expand Up @@ -79,36 +80,46 @@ export default class EditToolbarAction extends AbstractFormToolbarAction {
}

getToolbarItemConfig() {
const {
publish_display_condition: publishDisplayCondition,
} = this.options;

const {id, data} = this.resourceFormStore;

const {published, publishedState} = data;

const options = [
{
disabled: !id,
label: translate('sulu_admin.copy_locale'),
onClick: action(() => {
this.showCopyLocaleDialog = true;
}),
},
];

if (!publishDisplayCondition || jexl.evalSync(publishDisplayCondition, this.resourceFormStore.data)) {
options.push({
disabled: !id || !published || publishedState,
label: translate('sulu_page.delete_draft'),
onClick: action(() => {
this.showDeleteDraftDialog = true;
}),
});
options.push({
disabled: !id || !published,
label: translate('sulu_page.unpublish'),
onClick: action(() => {
this.showUnpublishDialog = true;
}),
});
}

return {
type: 'dropdown',
label: translate('sulu_admin.edit'),
icon: 'su-pen',
options: [
{
disabled: !id,
label: translate('sulu_admin.copy_locale'),
onClick: action(() => {
this.showCopyLocaleDialog = true;
}),
},
{
disabled: !id || !published || publishedState,
label: translate('sulu_page.delete_draft'),
onClick: action(() => {
this.showDeleteDraftDialog = true;
}),
},
{
disabled: !id || !published,
label: translate('sulu_page.unpublish'),
onClick: action(() => {
this.showUnpublishDialog = true;
}),
},
],
options,
};
}

Expand Down

0 comments on commit 315e35a

Please sign in to comment.