@@ -31,83 +31,76 @@ export const stripOutBlockNamespace = (name, id) => {
31
31
return nameWithoutBlock . match ( / ] / gi) . length > 1 ? nameWithoutBlock . replace ( ']' , '' ) : nameWithoutBlock . slice ( 0 , - 1 )
32
32
}
33
33
34
- export const buildBlock = ( block , rootState , isRepeater = false ) => {
35
- const repeaterIds = Object . keys ( rootState . repeaters . repeaters ) ;
36
- const repeaters = Object . assign ( { } , ...repeaterIds . filter ( repeaterKey => {
37
- return repeaterKey . startsWith ( 'blocks-' + block . id + '|' )
34
+ export const buildBlock = ( block , rootState , isRepeater = false , childKey ) => {
35
+ const parentRepeaters = rootState . repeaters . repeaters ;
36
+ const repeaterIds = Object . keys ( parentRepeaters ) ;
37
+ const prefix = 'blocks-' + block . id + '|' ;
38
+ const repeaters = repeaterIds . filter ( repeaterKey => {
39
+ return repeaterKey . startsWith ( prefix )
38
40
} )
39
- . map ( repeaterKey => {
40
- return {
41
- [ repeaterKey . replace ( 'blocks-' + block . id + '|' , '' ) ] : rootState . repeaters . repeaters [ repeaterKey ] . map ( repeaterItem => {
42
- return buildBlock ( repeaterItem , rootState , true )
43
- } )
44
- }
45
- } ) )
41
+ . reduce ( ( acc , repeaterKey ) => {
42
+ acc [ repeaterKey . replace ( prefix , '' ) ] = parentRepeaters [ repeaterKey ] . map ( repeaterItem => {
43
+ return buildBlock ( repeaterItem , rootState , true )
44
+ } )
45
+
46
+ return acc
47
+ } , { } )
46
48
47
49
const blockIds = Object . keys ( rootState . blocks . blocks ) ;
48
- const blocks = Object . assign ( { } , ...blockIds . filter ( blockKey => {
49
- return blockKey . startsWith ( 'blocks-' + block . id )
50
- } ) . map ( blockKey => {
50
+ const blocks = blockIds . filter ( blockKey => {
51
+ return blockKey . startsWith ( prefix )
52
+ } ) . reduce ( ( acc , blockKey ) => {
53
+ acc . push ( ...rootState . blocks . blocks [ blockKey ] . map ( repeaterItem => {
54
+ if ( isRepeater ) {
55
+ repeaterItem = { ...repeaterItem , name : repeaterItem . name . replace ( prefix , '' ) }
56
+ }
57
+ return buildBlock ( repeaterItem , rootState , false , blockKey . replace ( prefix , '' ) )
58
+ } ) ) ;
59
+ return acc ;
60
+ } , [ ] )
61
+
62
+ // retrieve all fields for this block and clean up field names
63
+ const content = rootState . form . fields . filter ( ( field ) => {
64
+ return isBlockField ( field . name , block . id )
65
+ } ) . map ( ( field ) => {
51
66
return {
52
- [ blockKey . replace ( 'blocks-' + block . id + '|' , '' ) ] : rootState . blocks . blocks [ blockKey ] . map ( repeaterItem => {
53
- return buildBlock ( repeaterItem , rootState )
54
- } )
67
+ name : stripOutBlockNamespace ( field . name , block . id ) ,
68
+ value : field . value
55
69
}
56
- } ) )
70
+ } ) . reduce ( ( content , field ) => {
71
+ content [ field . name ] = field . value
72
+ return content
73
+ } , { } ) ;
57
74
58
- return {
75
+ const base = {
59
76
id : block . id ,
60
- type : block . type ,
61
- is_repeater : isRepeater ,
62
77
editor_name : block . name ,
63
- // retrieve all fields for this block and clean up field names
64
- content : rootState . form . fields . filter ( ( field ) => {
65
- return isBlockField ( field . name , block . id )
66
- } ) . map ( ( field ) => {
67
- return {
68
- name : stripOutBlockNamespace ( field . name , block . id ) ,
69
- value : field . value
70
- }
71
- } ) . reduce ( ( content , field ) => {
72
- content [ field . name ] = field . value
73
- return content
74
- } , { } ) ,
75
78
medias : gatherSelected ( rootState . mediaLibrary . selected , block ) ,
76
79
browsers : gatherSelected ( rootState . browser . selected , block ) ,
77
80
// gather repeater blocks from the repeater store module
78
- blocks : { ...repeaters , ...blocks }
81
+ blocks,
82
+ repeaters,
79
83
}
84
+ return isRepeater
85
+ ? { ...content , ...base , is_repeater : true , repeater_target_id : block . repeater_target_id }
86
+ : { ...base , type : block . type , content, child_key : childKey }
80
87
}
81
88
82
89
export const isBlockEmpty = ( blockData ) => {
83
90
return isEmpty ( blockData . content ) && isEmpty ( blockData . browsers ) && isEmpty ( blockData . medias ) && isEmpty ( blockData . blocks )
84
91
}
85
92
86
93
export const gatherRepeaters = ( rootState ) => {
87
- return Object . assign ( { } , ... Object . keys ( rootState . repeaters . repeaters ) . filter ( repeaterKey => {
94
+ return Object . keys ( rootState . repeaters . repeaters ) . filter ( repeaterKey => {
88
95
// we start by filtering out repeater blocks
89
96
return ! repeaterKey . startsWith ( 'blocks-' )
90
- } ) . map ( repeater => {
91
- return {
92
- [ repeater ] : rootState . repeaters . repeaters [ repeater ] . map ( repeaterItem => {
93
- // and for each repeater we build a block for each item
94
- const repeaterBlock = buildBlock ( repeaterItem , rootState )
95
-
96
- // we want to inline fields in the repeater object
97
- // and we don't need the type of component used
98
- const fields = repeaterBlock . content
99
- delete repeaterBlock . content
100
- delete repeaterBlock . type
101
-
102
- // and lastly we want to keep the id to update existing items
103
- fields . id = repeaterItem . id
104
- // If the repeater has a target id we are referencing an existing item.
105
- fields . repeater_target_id = repeaterItem . repeater_target_id ?? null
106
-
107
- return Object . assign ( repeaterBlock , fields )
108
- } )
109
- }
110
- } ) )
97
+ } ) . reduce ( ( acc , repeater ) => {
98
+ acc [ repeater ] = rootState . repeaters . repeaters [ repeater ] . map ( repeaterItem => {
99
+ // and for each repeater we build a block for each item
100
+ return buildBlock ( repeaterItem , rootState , true )
101
+ } )
102
+ return acc ;
103
+ } , { } )
111
104
}
112
105
113
106
export const gatherBlocks = ( rootState ) => {
@@ -124,7 +117,7 @@ export const gatherBlocks = (rootState) => {
124
117
}
125
118
126
119
export const getFormFields = ( rootState ) => {
127
- const fields = rootState . form . fields . filter ( ( field ) => {
120
+ return rootState . form . fields . filter ( ( field ) => {
128
121
// we start by filtering out blocks related form fields
129
122
return ! field . name . startsWith ( 'blocks[' ) && ! field . name . startsWith ( 'mediaMeta[' )
130
123
} ) . reduce ( ( fields , field ) => {
@@ -133,12 +126,10 @@ export const getFormFields = (rootState) => {
133
126
fields [ field . name ] = field . value
134
127
return fields
135
128
} , { } )
136
-
137
- return fields
138
129
}
139
130
140
131
export const getModalFormFields = ( rootState ) => {
141
- const fields = rootState . form . modalFields . filter ( ( field ) => {
132
+ return rootState . form . modalFields . filter ( ( field ) => {
142
133
// we start by filtering out blocks related form fields
143
134
return ! field . name . startsWith ( 'blocks[' ) && ! field . name . startsWith ( 'mediaMeta[' )
144
135
} ) . reduce ( ( fields , field ) => {
@@ -147,8 +138,6 @@ export const getModalFormFields = (rootState) => {
147
138
fields [ field . name ] = field . value
148
139
return fields
149
140
} , { } )
150
-
151
- return fields
152
141
}
153
142
154
143
export const getFormData = ( rootState ) => {
@@ -159,7 +148,7 @@ export const getFormData = (rootState) => {
159
148
// - publication properties
160
149
// - selected medias and browsers
161
150
// - created blocks and repeaters
162
- const data = Object . assign ( fields , {
151
+ return Object . assign ( fields , {
163
152
cmsSaveType : rootState . form . type ,
164
153
published : rootState . publication . published ,
165
154
public : rootState . publication . visibility === 'public' ,
@@ -172,6 +161,4 @@ export const getFormData = (rootState) => {
172
161
blocks : gatherBlocks ( rootState ) ,
173
162
repeaters : gatherRepeaters ( rootState )
174
163
} )
175
-
176
- return data
177
164
}
0 commit comments