Skip to content
This repository was archived by the owner on Nov 29, 2023. It is now read-only.

Commit a1ce9cc

Browse files
committed
- add form initialized event
- post all events as messages to parent window when in iframe. - handle setfields message posted from the parent window
1 parent 658aba9 commit a1ce9cc

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

public/js/src/module/controller-webform.js

+52-12
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ function init(formEl, data, loadErrors = []) {
140140
if (loadErrors.length > 0) {
141141
throw loadErrors;
142142
}
143-
143+
form.view.html.dispatchEvent(events.FormInitialized());
144144
return form;
145145
});
146146
}
@@ -821,17 +821,16 @@ function _setEventHandlers(survey) {
821821
});
822822

823823
if (inIframe() && settings.parentWindowOrigin) {
824-
document.addEventListener(
825-
events.SubmissionSuccess().type,
826-
postEventAsMessageToParentWindow
827-
);
828-
document.addEventListener(
829-
events.Edited().type,
830-
postEventAsMessageToParentWindow
831-
);
832-
document.addEventListener(
833-
events.Close().type,
834-
postEventAsMessageToParentWindow
824+
Object.keys(events).forEach((eventName) => {
825+
document.addEventListener(
826+
events[eventName]().type,
827+
postEventAsMessageToParentWindow
828+
);
829+
});
830+
window.addEventListener(
831+
'message',
832+
processMessageFromParentWindow,
833+
false
835834
);
836835
}
837836

@@ -918,9 +917,50 @@ function postEventAsMessageToParentWindow(event) {
918917
}
919918
}
920919

920+
/**
921+
* Handles messages from parent window when in iframe.
922+
* https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event
923+
*
924+
* @param {Object} event The dispatched event object for the message
925+
* @param {String} event.origin The origin of the window that sent the message
926+
* @param {Object} event.source The window object that sent the message
927+
* @param {Object} event.data The object passed from the other window
928+
* @param {String} event.data.type The type (or command) of the message passed. Currently the only supported type is 'setfields'
929+
* @param {Object} event.data.content Type specific content of the message.
930+
* For the setfields type, it is expected to be a key / value map of field paths and their URI encoded values that should be set.
931+
*/
932+
function processMessageFromParentWindow(event) {
933+
const { origin, data: payload } = event;
934+
935+
if (origin !== settings.parentWindowOrigin) {
936+
// bail, if the message is not sent from the expected origin
937+
return;
938+
}
939+
940+
const { type, content } = payload;
941+
942+
switch (type) {
943+
case 'setfields':
944+
Object.keys(content).forEach((fieldName) => {
945+
const inputs = document.getElementsByName(fieldName);
946+
inputs.forEach((inputElement) => {
947+
form.input.setVal(
948+
inputElement,
949+
decodeURIComponent(content[fieldName])
950+
);
951+
inputElement.dispatchEvent(events.Change());
952+
});
953+
});
954+
break;
955+
default:
956+
break;
957+
}
958+
}
959+
921960
export default {
922961
init,
923962
setLogoutLinkVisibility,
924963
inIframe,
925964
postEventAsMessageToParentWindow,
965+
processMessageFromParentWindow,
926966
};

public/js/src/module/event.js

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ events.ApplicationUpdated = function () {
2020
return new CustomEvent('applicationupdated', { bubbles: true });
2121
};
2222

23+
events.FormInitialized = function () {
24+
return new CustomEvent('forminitialized', { bubbles: true });
25+
};
26+
2327
events.FormUpdated = function () {
2428
return new CustomEvent('formupdated', { bubbles: true });
2529
};

0 commit comments

Comments
 (0)