Skip to content

Commit 196fa73

Browse files
refactor: fixed scroll behavior to xblock element
1 parent a69278c commit 196fa73

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

cms/static/js/views/pages/container.js

+42-32
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,13 @@ function($, _, Backbone, gettext, BasePage,
137137
if (!data) return;
138138

139139
const xblockElement = this.findXBlockElement(this.targetXBlock);
140-
const xblockWrapper = $("li.studio-xblock-wrapper[data-locator='" + data.payload.locator + "']");
140+
let xblockWrapper;
141+
142+
if (data.payload && data.payload.locator) {
143+
xblockWrapper = $("li.studio-xblock-wrapper[data-locator='" + data.payload.locator + "']");
144+
} else {
145+
xblockWrapper = $();
146+
}
141147

142148
switch (data.type) {
143149
case 'refreshXBlock':
@@ -147,11 +153,11 @@ function($, _, Backbone, gettext, BasePage,
147153
this.refreshXBlock(xblockElement, false);
148154
break;
149155
case 'completeXBlockMoving':
150-
xblockWrapper.hide()
151-
break;
156+
xblockWrapper.hide()
157+
break;
152158
case 'rollbackMovedXBlock':
153-
xblockWrapper.show()
154-
break;
159+
xblockWrapper.show()
160+
break;
155161
case 'updateXBlockName':
156162
case 'addXBlock':
157163
this.createComponent(this, xblockElement, event.data);
@@ -225,24 +231,24 @@ function($, _, Backbone, gettext, BasePage,
225231
}
226232

227233
if (self.options.isIframeEmbed) {
228-
const scrollOffset = parseInt(localStorage.getItem('modalEditLastYPosition'));
229-
if (localStorage.getItem('modalEditLastYPosition')) {
230-
try {
231-
setTimeout(() => {
232-
window.parent.postMessage(
233-
{
234-
type: 'scrollToXBlock',
235-
message: 'Scroll to XBlock',
236-
payload: {scrollOffset}
237-
}, document.referrer
238-
);
239-
localStorage.removeItem('modalEditLastYPosition');
240-
}, 1000);
241-
} catch (e) {
242-
console.error(e);
234+
const scrollOffsetString = localStorage.getItem('modalEditLastYPosition');
235+
const scrollOffset = scrollOffsetString ? parseInt(scrollOffsetString, 10) : 0;
236+
237+
if (scrollOffset) {
238+
try {
239+
window.parent.postMessage(
240+
{
241+
type: 'scrollToXBlock',
242+
message: 'Scroll to XBlock',
243+
payload: { scrollOffset }
244+
}, document.referrer
245+
);
246+
localStorage.removeItem('modalEditLastYPosition');
247+
} catch (e) {
248+
console.error(e);
249+
}
243250
}
244251
}
245-
}
246252
},
247253
block_added: options && options.block_added
248254
});
@@ -476,8 +482,8 @@ function($, _, Backbone, gettext, BasePage,
476482
|| (useNewProblemEditor === 'True' && blockType === 'problem')
477483
) {
478484
var destinationUrl = primaryHeader.attr('authoring_MFE_base_url')
479-
+ '/' + blockType
480-
+ '/' + encodeURI(primaryHeader.attr('data-usage-id'));
485+
+ '/' + blockType
486+
+ '/' + encodeURI(primaryHeader.attr('data-usage-id'));
481487

482488
try {
483489
if (this.options.isIframeEmbed) {
@@ -670,7 +676,7 @@ function($, _, Backbone, gettext, BasePage,
670676
type: 'toggleCourseXBlockDropdown',
671677
message: 'Adjust the height of the dropdown menu',
672678
payload: {
673-
courseXBlockDropdownHeight: courseXBlockDropdownHeight / 2,
679+
courseXBlockDropdownHeight: courseXBlockDropdownHeight / 2,
674680
},
675681
}, document.referrer
676682
);
@@ -804,6 +810,10 @@ function($, _, Backbone, gettext, BasePage,
804810
payload: { courseXBlockDropdownHeight: 0 }
805811
}, document.referrer
806812
);
813+
if (['html', 'problem', 'video'].includes(blockType)) {
814+
const scrollHeight = event.clientY + this.findXBlockElement(event.target).height();
815+
localStorage.setItem('modalEditLastYPosition', scrollHeight.toString());
816+
}
807817
}
808818
} catch (e) {
809819
console.error(e);
@@ -830,13 +840,13 @@ function($, _, Backbone, gettext, BasePage,
830840
type: 'showMoveXBlockModal',
831841
payload: {
832842
sourceXBlockInfo: {
833-
id: sourceXBlockInfo.attributes.id,
834-
displayName: sourceXBlockInfo.attributes.display_name,
843+
id: sourceXBlockInfo.attributes.id,
844+
displayName: sourceXBlockInfo.attributes.display_name,
835845
},
836846
sourceParentXBlockInfo: {
837-
id: sourceParentXBlockInfo.attributes.id,
838-
category: sourceParentXBlockInfo.attributes.category,
839-
hasChildren: sourceParentXBlockInfo.attributes.has_children,
847+
id: sourceParentXBlockInfo.attributes.id,
848+
category: sourceParentXBlockInfo.attributes.category,
849+
hasChildren: sourceParentXBlockInfo.attributes.has_children,
840850
},
841851
},
842852
}, document.referrer
@@ -947,15 +957,15 @@ function($, _, Backbone, gettext, BasePage,
947957
{
948958
type: 'scrollToXBlock',
949959
message: 'Scroll to XBlock',
950-
payload: { scrollOffset }
960+
payload: { scrollOffset: xblockElement.height() }
951961
}, document.referrer
952962
);
953963
} catch (e) {
954964
console.error(e);
955965
}
956966
return window.addEventListener('message', (event) => {
957967
if (event.data && event.data.type === 'completeXBlockDuplicating') {
958-
return self.onNewXBlock(placeholderElement, scrollOffset, true, event.data.payload);
968+
return self.onNewXBlock(placeholderElement, null, true, event.data.payload);
959969
}
960970
});
961971
}
@@ -1112,7 +1122,7 @@ function($, _, Backbone, gettext, BasePage,
11121122
rootLocator = this.xblockView.model.id;
11131123
if (xblockElement.length === 0 || xblockElement.data('locator') === rootLocator) {
11141124
if (block_added) {
1115-
this.render({refresh: true, block_added: block_added});
1125+
this.render({refresh: true, block_added: block_added});
11161126
}
11171127
} else if (parentElement.hasClass('reorderable-container')) {
11181128
this.refreshChildXBlock(xblockElement, block_added, is_duplicate);

0 commit comments

Comments
 (0)