Skip to content

Commit caec823

Browse files
committed
250822-14:26 merge latest from main
2 parents b0f9052 + 39ea32c commit caec823

9 files changed

Lines changed: 459 additions & 7 deletions

File tree

blocks/form/_form.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@
198198
"telephone-input",
199199
"text-input",
200200
"tnc",
201-
"wizard"
201+
"wizard",
202+
"review"
202203
]
203204
}
204205
]
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
{
2+
"definitions": [
3+
{
4+
"title": "Review",
5+
"id": "review",
6+
"plugins": {
7+
"xwalk": {
8+
"page": {
9+
"resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer",
10+
"template": {
11+
"jcr:title": "Review",
12+
"fieldType": "panel",
13+
"fd:viewType": "review"
14+
}
15+
}
16+
}
17+
}
18+
}
19+
],
20+
"models": [
21+
{
22+
"id": "review",
23+
"fields": [
24+
{
25+
"component": "container",
26+
"name": "basic",
27+
"label": "Basic",
28+
"collapsible": false,
29+
"fields": [
30+
{
31+
"component": "text",
32+
"name": "name",
33+
"label": "Name",
34+
"valueType": "string",
35+
"required": true,
36+
"valueFormat": "regexp",
37+
"validation": {
38+
"regExp": "^[^$].*",
39+
"customErrorMsg": "Name cannot start with $"
40+
}
41+
},
42+
{
43+
"component": "text",
44+
"name": "jcr:title",
45+
"label": "Title",
46+
"valueType": "string"
47+
},
48+
{
49+
"component": "boolean",
50+
"name": "hideTitle",
51+
"label": "Hide title",
52+
"valueType": "boolean"
53+
},
54+
{
55+
"component": "boolean",
56+
"name": "unboundFormElement",
57+
"label": "Mark as Unbound Form Element",
58+
"valueType": "boolean"
59+
},
60+
{
61+
"component": "boolean",
62+
"name": "visible",
63+
"label": "Show Component",
64+
"valueType": "boolean",
65+
"value": true
66+
},
67+
{
68+
"component": "select",
69+
"name": "colspan",
70+
"label": "Column Span",
71+
"valueType": "string",
72+
"value": "12",
73+
"options": [
74+
{
75+
"name": "1 column",
76+
"value": "1"
77+
},
78+
{
79+
"name": "2 column",
80+
"value": "2"
81+
},
82+
{
83+
"name": "3 column",
84+
"value": "3"
85+
},
86+
{
87+
"name": "4 column",
88+
"value": "4"
89+
},
90+
{
91+
"name": "5 column",
92+
"value": "5"
93+
},
94+
{
95+
"name": "6 column",
96+
"value": "6"
97+
},
98+
{
99+
"name": "7 column",
100+
"value": "7"
101+
},
102+
{
103+
"name": "8 column",
104+
"value": "8"
105+
},
106+
{
107+
"name": "9 column",
108+
"value": "9"
109+
},
110+
{
111+
"name": "10 column",
112+
"value": "10"
113+
},
114+
{
115+
"name": "11 column",
116+
"value": "11"
117+
},
118+
{
119+
"name": "12 column",
120+
"value": "12"
121+
}
122+
]
123+
}
124+
]
125+
},
126+
{
127+
"component": "text",
128+
"name": "panelNames",
129+
"label": "Panel Names",
130+
"valueType": "string",
131+
"multi": true,
132+
"required": true
133+
},
134+
{
135+
"...": "../../models/form-common/_help-container.json"
136+
}
137+
]
138+
}
139+
]
140+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
:root {
2+
--color-action-border-primary-disabled: #a3baf9;
3+
}
4+
5+
main .form form .review-container {
6+
display: block;
7+
}
8+
9+
main .form .review-container label {
10+
margin:0;
11+
position: relative;
12+
}
13+
14+
main .form form:not(.edit-mode) .review-container .field-wrapper:not(.panel-wrapper, .plain-text-wrapper, .file-wrapper) {
15+
border-left: 3px solid var(--color-action-border-primary-disabled);
16+
padding-left: 1rem;
17+
padding-right: 1rem;
18+
19+
}
20+
21+
main .form .review-panel-wrapper {
22+
display: grid;
23+
}
24+
25+
main .form .review-panel-wrapper .checkbox-wrapper {
26+
margin: 5px;
27+
}
28+
29+
main .form form.edit-mode .review-container .field-wrapper {
30+
display: none;
31+
}
32+
33+
main .form form.edit-mode .review-container::after {
34+
content: 'Review of selected panels will appear here';
35+
font-size: 20px;
36+
font-weight: 500;
37+
display: flex;
38+
align-items: center;
39+
justify-content: center;
40+
41+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { subscribe } from '../../rules/index.js';
2+
import { generateFormRendition } from '../../form.js';
3+
4+
function createReviewFieldElement(item) {
5+
const {
6+
value, name, fieldType, enumNames,
7+
} = item;
8+
const divElement = document.createElement('div');
9+
divElement.className = `review-field-value ${name}`;
10+
if (fieldType === 'radio-group' || fieldType === 'checkbox-group' || fieldType === 'drop-down') {
11+
const index = item?.enum?.indexOf(value);
12+
if (index !== -1) {
13+
divElement.textContent = enumNames[index] || item?.enum?.[index] || value;
14+
}
15+
} else {
16+
divElement.textContent = value || '';
17+
}
18+
19+
return divElement;
20+
}
21+
22+
function replaceInputs(element, model) {
23+
function processItem(item) {
24+
if (item.isContainer) {
25+
item.items?.forEach(processItem);
26+
return;
27+
}
28+
const { fieldType, id } = item;
29+
30+
if (fieldType === 'button') {
31+
element.querySelector(`[data-id="${id}"]`)?.remove();
32+
return;
33+
}
34+
35+
if (!item.value || !item.id) return;
36+
const divElement = createReviewFieldElement(item);
37+
38+
if (fieldType === 'radio-group' || fieldType === 'checkbox-group') {
39+
const group = element.querySelector(`fieldset[data-id="${id}"]`);
40+
if (group) {
41+
group.querySelectorAll('.radio-wrapper, .checkbox-wrapper').forEach((wrapper) => wrapper.remove());
42+
group.appendChild(divElement);
43+
}
44+
} else if (fieldType === 'checkbox') {
45+
const input = element.querySelector(`input[id="${id}"]`);
46+
if (input) {
47+
const label = input.parentNode.querySelector('label');
48+
input.parentNode.insertBefore(divElement, label.nextSibling);
49+
input.remove();
50+
}
51+
} else {
52+
const input = element.querySelector(`input[id="${id}"], select[id="${id}"], textarea[id="${id}"]`);
53+
input?.parentNode.replaceChild(divElement, input);
54+
}
55+
}
56+
57+
model.items?.forEach(processItem);
58+
return element;
59+
}
60+
61+
function render(element, fd, model) {
62+
if (!model) return;
63+
64+
const { form } = model;
65+
const { properties } = fd;
66+
67+
if (!properties?.panelNames) return;
68+
69+
element.innerHTML = '';
70+
71+
const panelModels = [];
72+
form.visit((field) => {
73+
if (properties.panelNames.includes(field.name)) {
74+
panelModels.push(field);
75+
}
76+
});
77+
78+
panelModels.forEach(async (field) => {
79+
if (!field.isContainer) return;
80+
81+
const panelWrapper = document.createElement('div');
82+
panelWrapper.className = `review-panel-wrapper ${field.name}`;
83+
84+
await generateFormRendition(field.getState(), panelWrapper, form.id);
85+
const decoratedPanel = replaceInputs(panelWrapper, field);
86+
87+
if (!decoratedPanel) return;
88+
89+
element.appendChild(panelWrapper);
90+
});
91+
}
92+
93+
export default function decorate(element, fd, container, formId) {
94+
element.classList.add('review-container');
95+
let fieldModel;
96+
97+
subscribe(element, formId, (_element, model) => {
98+
fieldModel = model;
99+
});
100+
101+
const observer = new IntersectionObserver((entries) => {
102+
entries.forEach((entry) => {
103+
if (entry.isIntersecting) {
104+
render(element, fd, fieldModel);
105+
}
106+
});
107+
}, { threshold: 0.1 });
108+
109+
observer.observe(element);
110+
return element;
111+
}

blocks/form/form.css

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,15 @@ legend {
154154

155155
main .form div .field-description {
156156
background-color: white;
157-
border: 1px solid var(--form-input-border-color);
157+
/* border: 1px solid var(--form-input-border-color);
158158
border-radius: var(--standard-border-radius);
159159
box-shadow: 5px 5px 10px rgba(0,0,0,0.2);
160-
display: none;
160+
display: none; */
161161
padding: 0.5rem 1rem;
162-
position: absolute;
162+
/* position: absolute;
163163
right: -2rem;
164164
top: -3em;
165-
z-index: 10;
165+
z-index: 10; */
166166
}
167167

168168
main .form div.show .field-description {

blocks/form/mappings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { loadCSS } from '../../scripts/aem.js';
22

3-
let customComponents = [];
3+
let customComponents = ['review'];
44
const OOTBComponentDecorators = ['file-input', 'wizard', 'modal', 'tnc', 'toggleable-link', 'rating', 'datetime', 'list', 'location', 'accordion', 'password'];
55

66
export function setCustomComponents(components) {

component-definition.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,22 @@
547547
}
548548
}
549549
},
550+
{
551+
"title": "Review",
552+
"id": "review",
553+
"plugins": {
554+
"xwalk": {
555+
"page": {
556+
"resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer",
557+
"template": {
558+
"jcr:title": "Review",
559+
"fieldType": "panel",
560+
"fd:viewType": "review"
561+
}
562+
}
563+
}
564+
}
565+
},
550566
{
551567
"title": "Terms and conditions",
552568
"id": "tnc",
@@ -659,6 +675,7 @@
659675
}
660676
}
661677
}
678+
<<<<<<< HEAD
662679
},
663680
{
664681
"title": "Order Accordion",
@@ -691,6 +708,8 @@
691708
}
692709
}
693710
}
711+
=======
712+
>>>>>>> main
694713
}
695714
]
696715
}

component-filters.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717
"columns",
1818
"fragment",
1919
"form",
20+
<<<<<<< HEAD
2021
"embed-adaptive-form",
2122
"order-accordion",
2223
"order-status"
24+
=======
25+
"embed-adaptive-form"
26+
>>>>>>> main
2327
]
2428
},
2529
{
@@ -69,7 +73,8 @@
6973
"telephone-input",
7074
"text-input",
7175
"tnc",
72-
"wizard"
76+
"wizard",
77+
"review"
7378
]
7479
}
7580
]

0 commit comments

Comments
 (0)