Commit ae1774cb authored by Ludovic Kiefer's avatar Ludovic Kiefer

erp5_run_my_doc: use stateChange events instead of gadget scope variables to move the slides

parent f5f63e55
...@@ -497,23 +497,27 @@ ...@@ -497,23 +497,27 @@
function recordSlidePosition(gadget) { function recordSlidePosition(gadget) {
// [x,y] coordinates of the slides // [x,y] coordinates of the slides
gadget.slide_coordinate = []; var slide_coordinate = [],
// store the data-slide-index of slides in the order we want to show them // store the data-slide-index of slides in the order we want to show them
// the key is the slide position into the list // the key is the slide position into the list
// the value is the value of its data-slide-index converted to int // the value is the value of its data-slide-index converted to int
gadget.slide_order = []; slide_order = [],
gadget.slide_order_start = []; //used to restore the slides positions //used to restore the slides positions
//slide_order_start = [],
// Don't forget that the last element is the "add slide" button // Don't forget that the last element is the "add slide" button
var slide_list = gadget.element.querySelector("div.slide_list").children, slide_list = gadget.element.querySelector("div.slide_list").children,
i, i,
coordinate; coordinate;
for (i = 0; i < slide_list.length - 1; i += 1) { for (i = 0; i < slide_list.length - 1; i += 1) {
coordinate = slide_list[i].getBoundingClientRect(); coordinate = slide_list[i].getBoundingClientRect();
gadget.slide_coordinate[i] = [coordinate.x, coordinate.y]; slide_coordinate[i] = [coordinate.x, coordinate.y];
gadget.slide_order[i] = i; slide_order[i] = i;
gadget.slide_order_start[i] = i;
} }
gadget.changeState({
slide_coordinate: slide_coordinate,
slide_order: slide_order,
hovered_slide: -2 //prevent the slide list DOM to be reloaded
});
} }
function moveSlide(gadget, dragged_id, hovered_id) { function moveSlide(gadget, dragged_id, hovered_id) {
...@@ -525,48 +529,50 @@ ...@@ -525,48 +529,50 @@
i, i,
dragged_index, dragged_index,
hovered_index, hovered_index,
slide_order = gadget.state.slide_order.slice(),
moved, moved,
slide, slide,
pos_x, pos_x,
pos_y; pos_y;
// reset slides positions on dragend event // reset slides positions on dragend event
if (dragged_id === -1) { if (dragged_id === -1 || hovered_id === -1) {
for (j = 0; j < gadget.slide_order.length; j += 1) { for (j = 0; j < slide_order.length; j += 1) {
gadget.slide_order[j] = gadget.slide_order_start[j]; slide_order[j] = j;
slide_list[j].style.left = "0"; slide_list[j].style.left = "0";
slide_list[j].style.top = "0"; slide_list[j].style.top = "0";
slide_list[j].style.position = "relative"; slide_list[j].style.position = "relative";
} }
gadget.changeState({
slide_order: slide_order,
hovered_slide: -2
});
return; return;
} }
// we move this slide (position in the list of slides) // we move this slide (position in the list of slides)
dragged_index = gadget.slide_order.indexOf(dragged_id); dragged_index = slide_order.indexOf(dragged_id);
// over this slide (position in the list of slides) // over this slide (position in the list of slides)
hovered_index = gadget.slide_order.indexOf(hovered_id); hovered_index = slide_order.indexOf(hovered_id);
// drop the moved slide from the list // drop the moved slide from the list
moved = gadget.slide_order.splice(dragged_index, 1); moved = slide_order.splice(dragged_index, 1);
// insert the moved slide on the right position into the list // insert the moved slide on the right position into the list
gadget.slide_order.splice(hovered_index, 0, moved[0]); slide_order.splice(hovered_index, 0, moved[0]);
// where to drop the slide (on drop event) for (i = 0; i < slide_order.length; i += 1) {
gadget.hovered_slide = hovered_index.toString();
for (i = 0; i < gadget.slide_order.length; i += 1) {
// Find slide that should be shown at that index // Find slide that should be shown at that index
slide = slide_list[gadget.slide_order[i]]; slide = slide_list[slide_order[i]];
//displace the slide at this relative position (CSS only, DOM unchanged) //displace the slide at this relative position (CSS only, DOM unchanged)
pos_x = gadget.slide_coordinate[ pos_x = gadget.state.slide_coordinate[slide_order[i]][0];
gadget.slide_order[i] pos_y = gadget.state.slide_coordinate[slide_order[i]][1];
][0]; slide.style.left = (gadget.state.slide_coordinate[i][0] -
pos_y = gadget.slide_coordinate[
gadget.slide_order[i]
][1];
slide.style.left = (gadget.slide_coordinate[i][0] -
pos_x).toString() + "px"; pos_x).toString() + "px";
slide.style.top = (gadget.slide_coordinate[i][1] - slide.style.top = (gadget.state.slide_coordinate[i][1] -
pos_y).toString() + "px"; pos_y).toString() + "px";
slide.style.position = "relative"; slide.style.position = "relative";
} }
gadget.changeState({
slide_order: slide_order,
hovered_slide: -2
});
} }
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
...@@ -636,13 +642,24 @@ ...@@ -636,13 +642,24 @@
var gadget = this, var gadget = this,
display_step = gadget.state.display_step, display_step = gadget.state.display_step,
slide_dialog = gadget.state.slide_dialog, slide_dialog = gadget.state.slide_dialog,
hovered = gadget.state.hovered_slide,
dragged = gadget.state.dragged_slide,
queue = getTranslationDict(gadget); queue = getTranslationDict(gadget);
if (display_step === DISPLAY_LIST) { if (display_step === DISPLAY_LIST) {
return queue // hovered==2 prevent the refresh of the list when passing parameters
.push(function (translation_dict) { if (hovered !== -2) {
return renderSlideList(gadget, translation_dict); if (dragged === undefined || dragged === -1) {
}); return queue
.push(function (translation_dict) {
return renderSlideList(gadget, translation_dict);
});
}
if (hovered !== dragged || hovered === -1) {
moveSlide(gadget, dragged, hovered);
}
}
return queue;
} }
if (display_step === DISPLAY_SLIDE) { if (display_step === DISPLAY_SLIDE) {
...@@ -807,16 +824,25 @@ ...@@ -807,16 +824,25 @@
return; return;
} }
evt.target.classList.add('drag'); evt.target.classList.add('drag');
recordSlidePosition(this); recordSlidePosition(gadget);
// Store index of the dragged slide // Store index of the dragged slide
evt.dataTransfer.effectAllowed = 'move'; evt.dataTransfer.effectAllowed = 'move';
evt.dataTransfer.setData('application/x-dragged-slide', evt.dataTransfer.setData('application/x-dragged-slide',
evt.target.getAttribute('data-slide-index')); evt.target.getAttribute('data-slide-index')
gadget.dragged_slide = evt.target.getAttribute('data-slide-index'); );
gadget.changeState({
dragged_slide: parseInt(
evt.target.getAttribute('data-slide-index'),
10
),
hovered_slide: -2
});
}, false, false) }, false, false)
.onEvent("dragend", function (evt) { .onEvent("dragend", function (evt) {
moveSlide(this, -1, -1); this.changeState({
dragged_slide: -1
});
var closest_section = evt.target.closest('section'); var closest_section = evt.target.closest('section');
if (closest_section === null) { if (closest_section === null) {
return; return;
...@@ -837,43 +863,46 @@ ...@@ -837,43 +863,46 @@
.onEvent("dragenter", function (evt) { .onEvent("dragenter", function (evt) {
var closest_section = evt.target.closest('section'), var closest_section = evt.target.closest('section'),
gadget, hovered,
dragged, gadget = this;
hovered;
if (closest_section === null) { if (closest_section === null) {
return; return;
} }
// Provide a visual feedback to the user hovered = parseInt(
// Showing where the slide can be dropped closest_section.getAttribute('data-slide-index'),
gadget = this; 10
dragged = gadget.dragged_slide; );
hovered = closest_section.getAttribute('data-slide-index'); if (!isNaN(hovered)) {
if (dragged !== hovered) { gadget.changeState({
if (closest_section.getAttribute('data-slide-index')) { hovered_slide: parseInt(
moveSlide(this, parseInt(dragged, 10), parseInt(hovered, 10)); closest_section.getAttribute('data-slide-index'),
} 10
)
});
} }
}, false, false) }, false, false)
.onEvent("dragleave", function (evt) { .onEvent("dragleave", function (evt) {
var gadget = this,
closest_section,
closest_slidelist;
//exits if mouse is indirectly over a section //exits if mouse is indirectly over a section
if (evt.relatedTarget) { if (evt.relatedTarget) {
var closest_section = evt.relatedTarget.closest('section'), closest_section = evt.relatedTarget.closest('section');
closest_slidelist;
if (closest_section !== null) { if (closest_section !== null) {
return; return;
} }
closest_slidelist = evt.relatedTarget.closest('div.slide_list'); closest_slidelist = evt.relatedTarget.closest('div.slide_list');
if (closest_slidelist === null) { if (closest_slidelist === null) {
// We are no longer over the slides, reset slide's positions // We are no longer over the slides, reset slide's positions
moveSlide(this, -1, -1); gadget.changeState({
hovered_slide: -1
});
} }
} }
}, false, false) }, false, false)
.onEvent("drop", function (evt) { .onEvent("drop", function (evt) {
var gadget = this, var gadget = this,
tag_name = evt.target.closest('section').tagName, tag_name = evt.target.closest('section').tagName,
...@@ -890,17 +919,9 @@ ...@@ -890,17 +919,9 @@
} }
source_index = evt.dataTransfer.getData('application/x-dragged-slide'); source_index = evt.dataTransfer.getData('application/x-dragged-slide');
if (source_index !== null) {
if (source_index && gadget.hovered_slide) { destination_index =
source_index = parseInt( gadget.state.slide_order.indexOf(parseInt(source_index, 10));
source_index,
10
);
destination_index = parseInt(
gadget.hovered_slide,
10
);
slide_list = getSlideElementList(gadget.state.value); slide_list = getSlideElementList(gadget.state.value);
if (source_index !== destination_index) { if (source_index !== destination_index) {
slide_list.splice( slide_list.splice(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment