Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Only set default template for pages when no template is currently selected #5148

Merged
merged 6 commits into from Mar 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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));
alexander-schranz marked this conversation as resolved.
Show resolved Hide resolved

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