diff --git a/addons/website/__manifest__.py b/addons/website/__manifest__.py
index a20e686e9ee..8bbf4cae2a6 100644
--- a/addons/website/__manifest__.py
+++ b/addons/website/__manifest__.py
@@ -169,6 +169,7 @@
('remove', 'website/static/src/client_actions/website_preview/website_preview_test_mode.js'),
'website/static/src/client_actions/*/*.scss',
'website/static/src/components/fields/fields.js',
+ 'website/static/src/components/fields/fields.scss',
'website/static/src/components/fullscreen_indication/fullscreen_indication.js',
'website/static/src/components/fullscreen_indication/fullscreen_indication.scss',
'website/static/src/components/website_loader/website_loader.js',
diff --git a/addons/website/static/src/components/fields/fields.js b/addons/website/static/src/components/fields/fields.js
index 93dfb2bea96..35aae70d298 100644
--- a/addons/website/static/src/components/fields/fields.js
+++ b/addons/website/static/src/components/fields/fields.js
@@ -135,3 +135,40 @@ FieldFaPrefix.supportedFieldTypes = ['char'];
FieldFaPrefix.template = 'website.FieldFaPrefix';
fieldRegistry.add('fa_prefix', FieldFaPrefix);
+
+/**
+ * Displays 'Selection' field's values as images to select.
+ * Image src for each value can be added using the option 'images' on field XML.
+ */
+export class ImageRadioField extends Component {
+ setup() {
+ const selection = this.props.record.fields[this.props.name].selection;
+ // Check if value / label exists for each selection item and add the
+ // corresponding image from field options.
+ this.values = selection.filter(item => {
+ return item[0] || item[1];
+ }).map((value, index) => {
+ return [...value, this.props.images && this.props.images[index] || ''];
+ });
+ }
+
+ /**
+ * @param {String} value
+ */
+ onSelectValue(value) {
+ this.props.update(value);
+ }
+}
+ImageRadioField.supportedTypes = ['selection'];
+ImageRadioField.template = 'website.FieldImageRadio';
+ImageRadioField.props = {
+ ...standardFieldProps,
+ images: {type: Array, element: String},
+};
+ImageRadioField.extractProps = ({attrs}) => {
+ return {
+ images: attrs.options.images,
+ };
+};
+
+registry.category("fields").add("image_radio", ImageRadioField);
diff --git a/addons/website/static/src/components/fields/fields.scss b/addons/website/static/src/components/fields/fields.scss
new file mode 100644
index 00000000000..00fa1d96617
--- /dev/null
+++ b/addons/website/static/src/components/fields/fields.scss
@@ -0,0 +1,9 @@
+.o_image_radio_option {
+ cursor: pointer;
+ margin: 1rem 0;
+
+ &.active {
+ border: 4px solid $o-brand-primary;
+ box-shadow: 3px 3px 5px gray;
+ }
+}
diff --git a/addons/website/static/src/components/fields/fields.xml b/addons/website/static/src/components/fields/fields.xml
index 8c2a42f458a..2364ade9278 100644
--- a/addons/website/static/src/components/fields/fields.xml
+++ b/addons/website/static/src/components/fields/fields.xml
@@ -66,4 +66,14 @@
+
+
+
+
+
![]()
+
+
+
+
+
diff --git a/addons/website_slides/static/src/scss/website_slides.scss b/addons/website_slides/static/src/scss/website_slides.scss
index 4dff653aa63..63aa8879e97 100644
--- a/addons/website_slides/static/src/scss/website_slides.scss
+++ b/addons/website_slides/static/src/scss/website_slides.scss
@@ -664,18 +664,6 @@ $line-height-truncate: 1.25em;
}
}
-#slide_channel_add_form input[name="channel_type"]:checked + label {
- border: 4px solid $primary;
- box-shadow: 3px 3px 5px gray;
-}
-
-#slide_channel_add_form label img {
- // make the layout preview images size depending on the screen size
- // so we do not need to scroll on most resolutions
- cursor: pointer;
- height: 20vh;
-}
-
.o_wslides_body .form-control::-webkit-input-placeholder {
color: $gray-500;
}
diff --git a/addons/website_slides/views/slide_channel_add.xml b/addons/website_slides/views/slide_channel_add.xml
index de16bc77011..bd235c426df 100644
--- a/addons/website_slides/views/slide_channel_add.xml
+++ b/addons/website_slides/views/slide_channel_add.xml
@@ -13,7 +13,7 @@
-
+