Advertisement
Gordon___From

Untitled

Feb 20th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9.  
  10. <style>
  11. * {
  12. margin: 0;
  13. padding: 0;
  14. }
  15.  
  16. #table {
  17. width: 700px;
  18. margin: 0 auto;
  19. }
  20.  
  21. .cell {
  22. position: relative;
  23. float: left;
  24. box-sizing: border-box;
  25. width: 100px;
  26. height: 150px;
  27. border: 1px solid black;
  28. }
  29.  
  30. .event {
  31. box-sizing: border-box;
  32. width: 100%;
  33. height: 5px;
  34. margin: 4px 0;
  35. }
  36.  
  37. .event:first-of-type {
  38. margin-top: 0;
  39. }
  40.  
  41. .event.start {
  42. border-left: 10px solid red;
  43. }
  44.  
  45. .event.end {
  46. border-right: 10px solid blue;
  47. }
  48. </style>
  49. </head>
  50. <body>
  51. <div id="table">
  52.  
  53. </div>
  54.  
  55. <script>
  56. let eventsMock = [
  57. [0,7],
  58. [0,4],
  59. [0,0],
  60. [1,5],
  61. [1,2],
  62. [3,4],
  63. [5,6]
  64. ].map(e => {
  65. return {
  66. 'color': eventColor(),
  67. 'range': e,
  68. }
  69. });
  70.  
  71. // rows result
  72.  
  73. // 0: [0,7]
  74. // 1: [0,4], [5,6]
  75. // 2: [0,0], [1,5]
  76. // 3: [1,2], [3,4]
  77.  
  78. function sortEvents(events) {
  79. let eventsClone = [...events];
  80.  
  81. eventsClone.sort((aEvent, bEvent) => {
  82. let [aStart, aEnd] = aEvent.range;
  83. let [bStart, bEnd] = bEvent.range;
  84.  
  85. if (aStart === bStart && aEnd === bEnd) {
  86. return 0;
  87. }
  88.  
  89. if (aStart < bStart) {
  90. return -1;
  91. }
  92.  
  93. if (aStart === bStart) {
  94. let aLn = aStart + aEnd;
  95. let bLn = bStart + bEnd;
  96.  
  97. return bLn - aLn;
  98. }
  99.  
  100. return 1;
  101. });
  102.  
  103. return eventsClone;
  104. }
  105.  
  106. (function init() {
  107. const month = createTable();
  108. let events = sortEvents(eventsMock);
  109. let eventPositions = getEventPositions(events);
  110.  
  111. eventPositions.map(row => console.log(row))
  112. })();
  113.  
  114. function createTable() {
  115. const week = [];
  116. const tableNode = document.getElementById('table');
  117.  
  118. for (let i = 0; i < 7 * 5; i++) {
  119. const cellNode = document.createElement('div');
  120. cellNode.className = 'cell';
  121. cellNode.innerText = i % 7 + 1;
  122.  
  123. tableNode.appendChild(cellNode);
  124. week.push(cellNode);
  125. }
  126.  
  127. return week;
  128. }
  129.  
  130. function drawEvents(eventRows) {
  131. eventRows.forEach((row, i) => {
  132. row.forEach(event => drawEvent(event, i));
  133. });
  134. }
  135.  
  136. function drawEvent(event, day) {
  137. let [start, end] = event.range;
  138. let color = event.color;
  139.  
  140. for (let i = start; i <= end; i++) {
  141. const dayNode = month[i];
  142. const eventNode = document.createElement('div');
  143.  
  144. eventNode.className = 'event';
  145. setColor(eventNode, color);
  146.  
  147. if (i === start) {
  148. eventNode.classList.add('start')
  149. }
  150.  
  151. if (i === end) {
  152. eventNode.classList.add('end')
  153. }
  154.  
  155. dayNode.appendChild(eventNode);
  156. }
  157. }
  158.  
  159. function getEventPositions(events) {
  160. let eventsByPosition = [];
  161.  
  162. events.forEach(event => {
  163. let rowIndex = 0;
  164. if (!eventsByPosition.length) {
  165. eventsByPosition[0] = [event];
  166. return;
  167. }
  168.  
  169. for (let i = 0; i < eventsByPosition.length; i++) {
  170. let eventsRow = eventsByPosition[i];
  171.  
  172. if (!rowHasOverlap(event, eventsRow)) {
  173. break;
  174. }
  175. rowIndex++;
  176. }
  177.  
  178. eventsByPosition[rowIndex] = eventsByPosition[rowIndex] || [];
  179. eventsByPosition[rowIndex].push(event);
  180. });
  181.  
  182. return eventsByPosition;
  183. }
  184.  
  185. function rowHasOverlap(event, eventsRow) {
  186. for (let i = 0; i < eventsRow.length; i++) {
  187. let eventInRow = eventsRow[i];
  188.  
  189. if (isOverlap(event, eventInRow)) {
  190. return true;
  191. }
  192. }
  193.  
  194. return false;
  195. }
  196.  
  197. function isOverlap(eventA, eventB) {
  198. let [aStart, aEnd] = eventA.range;
  199. let [bStart, bEnd] = eventB.range;
  200.  
  201. let startInside = aStart >= bStart && aStart <= bEnd;
  202. let endInside = aEnd >= bEnd && aEnd <= bEnd;
  203.  
  204. return startInside || endInside;
  205. }
  206.  
  207. function eventColor() {
  208. const colors = ['#bd6c6cdb', '#3e6493db', '#6da855db', '#cd9924db'];
  209. const index = Math.floor(Math.random() * colors.length);
  210.  
  211. return colors[index];
  212. }
  213.  
  214. function setColor(node, color) {
  215. node.style = `background-color: ${color}`
  216. }
  217. </script>
  218. </body>
  219. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement