liquid_feedback_frontend
annotate static/js/dragdrop.js @ 19:00d1004545f1
Dynamic interface using XMLHttpRequests, and many other changes
Bugfixes:
- Only allow voting on admitted initiatives
- Repaired issue search
- Don't display delegations for closed issues on member page
- Don't show revoke link in initiative, when issue is already half_frozen
- Localization for voting JavaScript
- Display author of suggestions
Disclosure of voting data after voting is finished:
- Possibility to inspect every ballot including preferences
- Show number of voters preferring one initiative to another initiative
Interface behaviour changes:
- Reversed default order of drafts
- Default order of suggestions changed
- Show new drafts of initiatives only once per day in timeline
Accessibility:
- Barrier-free voting implemented
- POST links are now accessible without JavaScript
- Changed gray for unsatisfied supporters in bar graph to a lighter gray
Other interface improvements:
- Optical enhancements
- Dynamic interface using XMLHttpRequests
- Show usage terms in about section
- Show own membership in area listing
- Show uninformed supporters greyed out and marked with yellow question mark
- Warning box in non-admitted initiatives
- When voted, don't display voting notice and change label of voting link
- Show object counts in more tabulator heads
- Enlarged member statement input field
Miscellaneous:
- Code cleanup
- Added README file containing installation instructions
- Use new WebMCP function ui.filters{...} instead of own ui.filter and ui.order functions
Bugfixes:
- Only allow voting on admitted initiatives
- Repaired issue search
- Don't display delegations for closed issues on member page
- Don't show revoke link in initiative, when issue is already half_frozen
- Localization for voting JavaScript
- Display author of suggestions
Disclosure of voting data after voting is finished:
- Possibility to inspect every ballot including preferences
- Show number of voters preferring one initiative to another initiative
Interface behaviour changes:
- Reversed default order of drafts
- Default order of suggestions changed
- Show new drafts of initiatives only once per day in timeline
Accessibility:
- Barrier-free voting implemented
- POST links are now accessible without JavaScript
- Changed gray for unsatisfied supporters in bar graph to a lighter gray
Other interface improvements:
- Optical enhancements
- Dynamic interface using XMLHttpRequests
- Show usage terms in about section
- Show own membership in area listing
- Show uninformed supporters greyed out and marked with yellow question mark
- Warning box in non-admitted initiatives
- When voted, don't display voting notice and change label of voting link
- Show object counts in more tabulator heads
- Enlarged member statement input field
Miscellaneous:
- Code cleanup
- Added README file containing installation instructions
- Use new WebMCP function ui.filters{...} instead of own ui.filter and ui.order functions
| author | bsw/jbe |
|---|---|
| date | Sat Feb 20 22:10:31 2010 +0100 (2010-02-20) |
| parents | 8d91bccab0bf |
| children | 7492497005bd |
| rev | line source |
|---|---|
| bsw/jbe@5 | 1 window.addEventListener("load", function(event) { |
| bsw/jbe@5 | 2 var originalElement; |
| bsw/jbe@5 | 3 var draggedElement; |
| bsw/jbe@5 | 4 var mouseX; |
| bsw/jbe@5 | 5 var mouseY; |
| bsw/jbe@5 | 6 var mouseOffsetX; |
| bsw/jbe@5 | 7 var mouseOffsetY; |
| bsw/jbe@5 | 8 var elementOffsetX; |
| bsw/jbe@5 | 9 var elementOffsetY; |
| bsw/jbe@5 | 10 var dropFunc; |
| bsw/jbe@5 | 11 var dragElement = function(element, func) { |
| bsw/jbe@5 | 12 //if (typeof(element) == "string") element = document.getElementById(element); |
| bsw/jbe@5 | 13 originalElement = element; |
| bsw/jbe@5 | 14 draggedElement = originalElement.cloneNode(true); |
| bsw/jbe@5 | 15 originalElement.style.visibility = "hidden"; |
| bsw/jbe@5 | 16 draggedElement.style.margin = 0; |
| bsw/jbe@5 | 17 draggedElement.style.position = "absolute"; |
| bsw/jbe@5 | 18 draggedElement.style.left = elementOffsetX = originalElement.offsetLeft; |
| bsw/jbe@5 | 19 draggedElement.style.top = elementOffsetY = originalElement.offsetTop; |
| bsw/jbe@5 | 20 draggedElement.style.width = originalElement.clientWidth; |
| bsw/jbe@5 | 21 draggedElement.style.height = originalElement.clientHeight; |
| bsw/jbe@5 | 22 draggedElement.style.backgroundColor = "#eee"; |
| bsw/jbe@5 | 23 draggedElement.style.opacity = 0.8; |
| bsw/jbe@5 | 24 originalElement.offsetParent.appendChild(draggedElement); |
| bsw/jbe@5 | 25 // workaround for wrong clientWidth and clientHeight information: |
| bsw/jbe@5 | 26 draggedElement.style.width = 2*originalElement.clientWidth - draggedElement.clientWidth; |
| bsw/jbe@5 | 27 draggedElement.style.height = 2*originalElement.clientHeight - draggedElement.clientHeight; |
| bsw/jbe@5 | 28 mouseOffsetX = mouseX; |
| bsw/jbe@5 | 29 mouseOffsetY = mouseY; |
| bsw/jbe@5 | 30 dropFunc = func; |
| bsw/jbe@5 | 31 }; |
| bsw/jbe@5 | 32 window.addEventListener("mousemove", function(event) { |
| bsw/jbe@5 | 33 mouseX = event.pageX; |
| bsw/jbe@5 | 34 mouseY = event.pageY; |
| bsw/jbe@5 | 35 if (draggedElement) { |
| bsw/jbe@5 | 36 draggedElement.style.left = elementOffsetX + mouseX - mouseOffsetX; |
| bsw/jbe@5 | 37 draggedElement.style.top = elementOffsetY + mouseY - mouseOffsetY; |
| bsw/jbe@5 | 38 } |
| bsw/jbe@5 | 39 }, true); |
| bsw/jbe@5 | 40 var mouseDrop = function(event) { |
| bsw/jbe@5 | 41 if (draggedElement) { |
| bsw/jbe@5 | 42 dropFunc( |
| bsw/jbe@5 | 43 originalElement, |
| bsw/jbe@5 | 44 elementOffsetX + mouseX - mouseOffsetX, |
| bsw/jbe@5 | 45 elementOffsetY + mouseY - mouseOffsetY |
| bsw/jbe@5 | 46 ); |
| bsw/jbe@5 | 47 originalElement.style.visibility = ''; |
| bsw/jbe@5 | 48 draggedElement.parentNode.removeChild(draggedElement); |
| bsw/jbe@5 | 49 originalElement = null; |
| bsw/jbe@5 | 50 draggedElement = null; |
| bsw/jbe@5 | 51 } |
| bsw/jbe@5 | 52 }; |
| bsw/jbe@5 | 53 window.addEventListener("mouseup", mouseDrop, true); |
| bsw/jbe@5 | 54 window.addEventListener("mousedown", mouseDrop, true); |
| bsw/jbe@5 | 55 var elements = document.getElementsByTagName("*"); |
| bsw/jbe@5 | 56 for (var i=0; i<elements.length; i++) { |
| bsw/jbe@5 | 57 var element = elements[i]; |
| bsw/jbe@5 | 58 if (element.className == "movable") { |
| bsw/jbe@5 | 59 element.addEventListener("mousedown", function(event) { |
| bsw/jbe@5 | 60 event.target.style.cursor = "move"; |
| bsw/jbe@5 | 61 dragElement(event.currentTarget, function(element, dropX, dropY) { |
| bsw/jbe@6 | 62 event.target.style.cursor = ''; |
| bsw/jbe@5 | 63 elementDropped(element, dropX, dropY); |
| bsw/jbe@5 | 64 }); |
| bsw/jbe@5 | 65 event.preventDefault(); |
| bsw/jbe@5 | 66 }, false); |
| bsw/jbe@5 | 67 } else if (element.className == "clickable") { |
| bsw/jbe@5 | 68 element.addEventListener("mousedown", function(event) { |
| bsw/jbe@5 | 69 event.stopPropagation(); |
| bsw/jbe@5 | 70 }, false); |
| bsw/jbe@5 | 71 } |
| bsw/jbe@5 | 72 } |
| bsw/jbe@5 | 73 }, false); |