Skip to content

Commit fdcfed3

Browse files
committed
feat(#1): add druxt module components
1 parent f411dec commit fdcfed3

3 files changed

Lines changed: 166 additions & 52 deletions

File tree

Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,12 @@
1-
<template>
2-
<div class="layout_builder">
3-
<template v-for="(section, index) of sections">
4-
<component
5-
:is="componentIs(section.layout_id)"
6-
v-if="componentIs(section.layout_id) !== 'div'"
7-
:key="index"
8-
:section="section"
9-
>
10-
<template
11-
v-for="component of Object.values(section.components)"
12-
#[component.uuid]
13-
>
14-
<component
15-
:is="componentIs(component.configuration.id)"
16-
v-if="componentIs(component.configuration.id) !== 'div'"
17-
:key="component.uuid"
18-
:component="component"
19-
:entity="entity"
20-
/>
21-
22-
<DruxtDebug
23-
v-else
24-
:key="component.uuid"
25-
:summary="`${componentName(component.configuration.id)} missing`"
26-
>
27-
<pre><code>{{ JSON.stringify(component, null, ' ') }}</code></pre>
28-
</DruxtDebug>
29-
</template>
30-
</component>
31-
32-
<DruxtDebug
33-
v-else
34-
:key="index"
35-
:summary="`${componentName(section.layout_id)} missing`"
36-
>
37-
<pre><code>{{ JSON.stringify(section, null, ' ') }}</code></pre>
38-
</DruxtDebug>
39-
</template>
40-
</div>
41-
</template>
42-
431
<script>
44-
import { pascalCase, upperFirst } from 'scule'
2+
import DruxtModule from 'druxt/dist/components/DruxtModule.vue'
3+
// import { pascalCase, upperFirst } from 'scule'
454
465
export default {
476
name: 'DruxtLayoutBuilder',
487
8+
extends: DruxtModule,
9+
4910
props: {
5011
entity: {
5112
type: Object,
@@ -57,15 +18,43 @@ export default {
5718
sections: ({ entity }) => entity.attributes.layout_builder__layout
5819
},
5920
60-
methods: {
61-
componentIs(id) {
62-
const name = this.componentName(id)
63-
return this.$nuxt.$options.components[name] ? name : 'div'
64-
},
65-
66-
componentName(id) {
67-
return `DruxtLayoutBuilder${pascalCase(id.split(':').map((s) => upperFirst(s)).join(''))}`
68-
},
21+
druxt: {
22+
/**
23+
* @param {object} context - The module component ViewModel.
24+
* @returns {ComponentOptions}
25+
*/
26+
componentOptions: ({ entity }) => [
27+
[entity.type],
28+
['default'],
29+
],
30+
31+
/**
32+
* Provides propsData for the DruxtWrapper.
33+
*
34+
* @param {object} context - The module component ViewModel.
35+
* @returns {PropsData}
36+
*/
37+
propsData: ({ entity, sections }) => ({ entity, sections }),
38+
39+
/**
40+
* @return {ScopedSlots} The Scoped slots object.
41+
*/
42+
slots(h) {
43+
const slots = {}
44+
45+
this.sections.forEach((section, index) => {
46+
slots[`section-${index}`] = () => h('DruxtLayoutBuilderSection', {
47+
props: {
48+
entity: this.entity,
49+
section,
50+
}
51+
})
52+
})
53+
54+
slots.default = () => h('div', this.sections.map((section, index) => slots[`section-${index}`]()))
55+
56+
return slots
57+
}
6958
}
7059
}
7160
</script>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<script>
2+
import DruxtModule from 'druxt/dist/components/DruxtModule.vue'
3+
4+
export default {
5+
name: 'DruxtLayoutBuilderComponent',
6+
7+
extends: DruxtModule,
8+
9+
props: {
10+
entity: {
11+
type: Object,
12+
required: true,
13+
},
14+
15+
item: {
16+
type: Object,
17+
required: true,
18+
}
19+
},
20+
21+
// computed: {
22+
// components: ({ section }) => section.components
23+
// },
24+
25+
druxt: {
26+
/**
27+
* @param {object} context - The module component ViewModel.
28+
* @returns {ComponentOptions}
29+
*/
30+
componentOptions: ({ item }) => [
31+
((item.configuration || {}).id || '').split(':'),
32+
[item.region],
33+
[item.uuid],
34+
['default'],
35+
],
36+
37+
/**
38+
* Provides propsData for the DruxtWrapper.
39+
*
40+
* @param {object} context - The module component ViewModel.
41+
* @returns {PropsData}
42+
*/
43+
propsData: ({ entity, item }) => ({ entity, item }),
44+
45+
/**
46+
* @return {ScopedSlots} The Scoped slots object.
47+
*/
48+
slots() {
49+
const slots = {}
50+
51+
// slots.default = () => h('DruxtDebug', {
52+
// props: {
53+
// json: this.item
54+
// }
55+
// })
56+
57+
return slots
58+
}
59+
}
60+
}
61+
</script>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<script>
2+
import DruxtModule from 'druxt/dist/components/DruxtModule.vue'
3+
4+
export default {
5+
name: 'DruxtLayoutBuilderSection',
6+
7+
extends: DruxtModule,
8+
9+
props: {
10+
entity: {
11+
type: Object,
12+
required: true,
13+
},
14+
15+
section: {
16+
type: Object,
17+
required: true,
18+
}
19+
},
20+
21+
computed: {
22+
components: ({ section }) => section.components
23+
},
24+
25+
druxt: {
26+
/**
27+
* @param {object} context - The module component ViewModel.
28+
* @returns {ComponentOptions}
29+
*/
30+
componentOptions: ({ section }) => [
31+
[section.layout_id],
32+
['default'],
33+
],
34+
35+
/**
36+
* Provides propsData for the DruxtWrapper.
37+
*
38+
* @param {object} context - The module component ViewModel.
39+
* @returns {PropsData}
40+
*/
41+
propsData: ({ entity, section }) => ({ entity, section }),
42+
43+
/**
44+
* @return {ScopedSlots} The Scoped slots object.
45+
*/
46+
slots(h) {
47+
const slots = {}
48+
49+
this.components.forEach((component, index) => {
50+
slots[`component-${index}`] = () => h('DruxtLayoutBuilderComponent', {
51+
props: {
52+
entity: this.entity,
53+
item: component,
54+
}
55+
})
56+
})
57+
58+
slots.default = () => h('div', this.components.map((component, index) => slots[`component-${index}`]()))
59+
60+
return slots
61+
}
62+
}
63+
}
64+
</script>

0 commit comments

Comments
 (0)