Skip to content

Commit

Permalink
Only set default template for pages when no template is currently sel…
Browse files Browse the repository at this point in the history
…ected (#5148)

* Use the default type dropdown also for pages

* Add default type to metadata response

* Adjust frontend to changes in metadata API

* Use passed default type in ResourceFormStore

* Make statement to determine default template easier

* Use default template for snippets as well
  • Loading branch information
danrot committed Mar 27, 2020
1 parent 3ec4c69 commit e326d2b
Show file tree
Hide file tree
Showing 20 changed files with 181 additions and 352 deletions.
Expand Up @@ -38,6 +38,11 @@ class StructureFormMetadataLoader implements FormMetadataLoaderInterface, CacheW
*/
private $webspaceManager;

/**
* @var string[]
*/
private $defaultTypes;

/**
* @var string[]
*/
Expand All @@ -57,13 +62,15 @@ public function __construct(
StructureMetadataFactoryInterface $structureMetadataFactory,
FormMetadataMapper $formMetadataMapper,
WebspaceManagerInterface $webspaceManager,
array $defaultTypes,
array $locales,
string $cacheDir,
bool $debug
) {
$this->structureMetadataFactory = $structureMetadataFactory;
$this->formMetadataMapper = $formMetadataMapper;
$this->webspaceManager = $webspaceManager;
$this->defaultTypes = $defaultTypes;
$this->locales = $locales;
$this->cacheDir = $cacheDir;
$this->debug = $debug;
Expand All @@ -86,9 +93,13 @@ public function getMetadata(string $key, string $locale, array $metadataOptions
if (isset($metadataOptions['webspace'])) {
$webspace = $this->webspaceManager->findWebspaceByKey($metadataOptions['webspace']);

$form->setDefaultType($webspace->getDefaultTemplate($key));

foreach ($webspace->getExcludedTemplates() as $excludedTemplate) {
$form->removeForm($excludedTemplate);
}
} elseif (isset($this->defaultTypes[$key])) {
$form->setDefaultType($this->defaultTypes[$key]);
}

return $form;
Expand Down
Expand Up @@ -22,6 +22,11 @@ class TypedFormMetadata extends AbstractMetadata
*/
private $forms = [];

/**
* @var string
*/
private $defaultType;

public function addForm($key, FormMetadata $form): void
{
$this->forms[$key] = $form;
Expand All @@ -39,4 +44,14 @@ public function getForms(): array
{
return $this->forms;
}

public function setDefaultType(string $defaultType): void
{
$this->defaultType = $defaultType;
}

public function getDefaultType(): string
{
return $this->defaultType;
}
}
1 change: 1 addition & 0 deletions src/Sulu/Bundle/AdminBundle/Resources/config/services.xml
Expand Up @@ -99,6 +99,7 @@
<argument type="service" id="sulu_page.structure.factory"/>
<argument type="service" id="sulu_admin.form_metadata.form_metadata_mapper"/>
<argument type="service" id="sulu_core.webspace.webspace_manager"/>
<argument>%sulu.content.structure.default_types%</argument>
<argument>%sulu_core.locales%</argument>
<argument>%sulu.cache_dir%/form-structures</argument>
<argument>%kernel.debug%</argument>
Expand Down
Expand Up @@ -4,7 +4,7 @@ import type {IObservableValue} from 'mobx'; // eslint-disable-line import/named
import Ajv from 'ajv';
import jsonpointer from 'json-pointer';
import ResourceStore from '../../../stores/ResourceStore';
import type {FormStoreInterface, RawSchema, SchemaEntry, SchemaTypes} from '../types';
import type {FormStoreInterface, RawSchema, SchemaEntry, SchemaType, SchemaTypes} from '../types';
import AbstractFormStore from './AbstractFormStore';
import metadataStore from './metadataStore';

Expand All @@ -18,7 +18,7 @@ export default class ResourceFormStore extends AbstractFormStore implements Form
formKey: string;
options: Object;
@observable type: string;
@observable types: SchemaTypes = {};
@observable types: {[key: string]: SchemaType} = {};
@observable schemaLoading: boolean = true;
@observable typesLoading: boolean = true;
schemaDisposer: ?() => void;
Expand Down Expand Up @@ -52,7 +52,12 @@ export default class ResourceFormStore extends AbstractFormStore implements Form
}
}

@action handleSchemaTypeResponse = (types: SchemaTypes) => {
@action handleSchemaTypeResponse = (schemaTypes: ?SchemaTypes) => {
const {
types = {},
defaultType,
} = schemaTypes || {};

this.types = types;
this.typesLoading = false;

Expand All @@ -61,8 +66,7 @@ export default class ResourceFormStore extends AbstractFormStore implements Form
when(
() => !this.resourceStore.loading,
(): void => {
const defaultType = Object.keys(this.types)[0]; // TODO get correct default type if available
this.setType(this.resourceStore.data[TYPE] ? this.resourceStore.data[TYPE] : defaultType);
this.setType(this.resourceStore.data[TYPE] || defaultType || Object.keys(this.types)[0]);
}
);
}
Expand Down
Expand Up @@ -5,24 +5,26 @@ import type {RawSchema, SchemaTypes} from '../types';
const FORM_TYPE = 'form';

class MetadataStore {
getSchemaTypes(formKey: string, metadataOptions: ?Object): Promise<SchemaTypes> {
getSchemaTypes(formKey: string, metadataOptions: ?Object): Promise<?SchemaTypes> {
return metadataStore.loadMetadata(FORM_TYPE, formKey, metadataOptions)
.then((configuration) => {
const {types} = configuration;
const {defaultType, types} = configuration;

if (!types) {
return {};
return null;
}

const schemaTypes = {};
Object.keys(types).forEach((key) => {
schemaTypes[key] = {
key,
title: types[key].title || key,
};
});

return schemaTypes;
return {
defaultType,
types: Object.keys(types).reduce((transformedTypes, key) => {
transformedTypes[key] = {
key,
title: types[key].title || key,
};

return transformedTypes;
}, {}),
};
});
}

Expand Down
Expand Up @@ -29,7 +29,7 @@ beforeEach(() => {
// $FlowFixMe
metadataStore.getJsonSchema = jest.fn().mockReturnValue(Promise.resolve({}));
// $FlowFixMe
metadataStore.getSchemaTypes = jest.fn().mockReturnValue(Promise.resolve({}));
metadataStore.getSchemaTypes = jest.fn().mockReturnValue(Promise.resolve(null));
});

test('Create data object for schema', (done) => {
Expand All @@ -48,9 +48,6 @@ test('Create data object for schema', (done) => {
},
};

const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
metadataStore.getSchema.mockReturnValue(metadataPromise);

Expand Down Expand Up @@ -118,9 +115,6 @@ test('Evaluate all disabledConditions and visibleConditions for schema', () => {
},
};

const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
metadataStore.getSchema.mockReturnValue(metadataPromise);

Expand Down Expand Up @@ -243,9 +237,6 @@ test('Evaluate disabledConditions and visibleConditions for schema with locale',
},
};

const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
metadataStore.getSchema.mockReturnValue(metadataPromise);

Expand All @@ -268,9 +259,6 @@ test('Evaluate disabledConditions and visibleConditions when changing locale', (
},
};

const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
metadataStore.getSchema.mockReturnValue(metadataPromise);

Expand Down Expand Up @@ -348,8 +336,11 @@ test('Set template property of ResourceStore from the loaded data', () => {
const metadata = {};

const schemaTypesPromise = Promise.resolve({
type1: {},
type2: {},
defaultType: 'type1',
types: {
type1: {},
type2: {},
},
});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

Expand Down Expand Up @@ -394,7 +385,7 @@ test('Create data object for schema with sections', () => {
},
};

const schemaTypesPromise = Promise.resolve({});
const schemaTypesPromise = Promise.resolve(null);
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
Expand Down Expand Up @@ -429,9 +420,6 @@ test('Change schema should keep data', (done) => {
slogan: 'Slogan',
});

const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(metadata);
metadataStore.getSchema.mockReturnValue(metadataPromise);

Expand All @@ -450,7 +438,6 @@ test('Change schema should keep data', (done) => {
});

test('Change type should update schema and data', (done) => {
const schemaTypesPromise = Promise.resolve({});
const sidebarMetadata = {
title: {
label: 'Title',
Expand All @@ -470,7 +457,6 @@ test('Change type should update schema and data', (done) => {
slogan: 'Slogan',
});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
metadataStore.getSchema.mockReturnValue(sidebarPromise);
metadataStore.getJsonSchema.mockReturnValue(jsonSchemaPromise);
const resourceFormStore = new ResourceFormStore(resourceStore, 'snippets');
Expand Down Expand Up @@ -506,7 +492,7 @@ test('types property should be returning types from server', () => {
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
};
const promise = Promise.resolve(types);
const promise = Promise.resolve({defaultType: 'sidebar', types});
metadataStore.getSchemaTypes.mockReturnValue(promise);

const resourceFormStore = new ResourceFormStore(new ResourceStore('snippets', '1'), 'snippets');
Expand All @@ -527,7 +513,10 @@ test('Type should be set from response', () => {
});

const schemaTypesPromise = Promise.resolve({
sidebar: {},
defaultType: 'sidebar',
types: {
sidebar: {},
},
});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
const resourceFormStore = new ResourceFormStore(resourceStore, 'snippets');
Expand All @@ -543,7 +532,7 @@ test('Type should not be set from response if types are not supported', () => {
template: 'sidebar',
});

const schemaTypesPromise = Promise.resolve({});
const schemaTypesPromise = Promise.resolve(null);
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
const resourceFormStore = new ResourceFormStore(resourceStore, 'snippets');

Expand All @@ -559,8 +548,11 @@ test('Changing type should set the appropriate property in the ResourceStore', (
});

const schemaTypesPromise = Promise.resolve({
sidebar: {},
footer: {},
defaultType: 'sidebar',
types: {
sidebar: {},
footer: {},
},
});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

Expand All @@ -582,7 +574,7 @@ test('Changing type should set the appropriate property in the ResourceStore', (
test('Changing type should throw an exception if types are not supported', () => {
const resourceStore = new ResourceStore('snippets', '1');

const schemaTypesPromise = Promise.resolve({});
const schemaTypesPromise = Promise.resolve(null);
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const resourceFormStore = new ResourceFormStore(resourceStore, 'snippets');
Expand Down Expand Up @@ -1169,9 +1161,6 @@ test('Return all the values for a given tag within blocks', () => {
});

test('Return SchemaEntry for given schemaPath', (done) => {
const schemaTypesPromise = Promise.resolve({});
metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

const metadataPromise = Promise.resolve(
{
title: {
Expand Down Expand Up @@ -1239,8 +1228,11 @@ test('Remember fields being finished as modified fields and forget about them af

test('Set new type after copying from different locale', () => {
const schemaTypesPromise = Promise.resolve({
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
types: {
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
},
defaultType: 'sidebar',
});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
Expand All @@ -1262,8 +1254,10 @@ test('Set new type after copying from different locale', () => {

test('HasTypes return true when types are set', () => {
const schemaTypesPromise = Promise.resolve({
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
types: {
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
},
});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
Expand All @@ -1277,7 +1271,7 @@ test('HasTypes return true when types are set', () => {
});

test('HasTypes return false when types are not set', () => {
const schemaTypesPromise = Promise.resolve({});
const schemaTypesPromise = Promise.resolve({types: {}});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);

Expand All @@ -1289,10 +1283,13 @@ test('HasTypes return false when types are not set', () => {
});
});

test('Set type to first one if data has no template set', () => {
test.each(['sidebar', 'footer'])('Set type to given default if data has no template set', (defaultType) => {
const schemaTypesPromise = Promise.resolve({
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
types: {
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
},
defaultType,
});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
Expand All @@ -1301,14 +1298,17 @@ test('Set type to first one if data has no template set', () => {
const resourceFormStore = new ResourceFormStore(resourceStore, 'snippets');

return schemaTypesPromise.then(() => {
expect(resourceFormStore.type).toEqual('sidebar');
expect(resourceFormStore.type).toEqual(defaultType);
});
});

test('Set type to the template value if set', () => {
const schemaTypesPromise = Promise.resolve({
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
types: {
sidebar: {key: 'sidebar', title: 'Sidebar'},
footer: {key: 'footer', title: 'Footer'},
},
defaultType: 'footer',
});

metadataStore.getSchemaTypes.mockReturnValue(schemaTypesPromise);
Expand Down

0 comments on commit e326d2b

Please sign in to comment.