Advertisement
Guest User

Untitled

a guest
Aug 15th, 2021
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. function solve (e) {
  2. const html = {
  3. lectNameField: document.querySelectorAll(`input`)[0],
  4. dateField: document.querySelectorAll(`input`)[1],
  5. moduleNameField: document.getElementsByTagName('select')[0],
  6. modules: document.getElementsByClassName('modules')[0]
  7. }
  8.  
  9. // template for the DOM element for a single lecture - li
  10. // we add our property 'date' for easy sorting
  11. const lectureTemplate = (date, lectureName) => {
  12. const li = document.createElement('li')
  13.  
  14. li.className = 'flex'
  15. li.innerHTML = `<h4>${lectureName} - ${date}</h4>
  16. <button class='red'>Del</button>`
  17. li.date = date
  18.  
  19. return li
  20. }
  21.  
  22. // template for the whole module element - div
  23. // here we reuse the lecture template but we need to append it
  24. // so we can use the .date prop we added to it.
  25. const moduleTemplate = (moduleName, date, lectureName) => {
  26. const moduleDiv = document.createElement('div')
  27. moduleDiv.className = 'module'
  28. moduleDiv.innerHTML = `<h3>${moduleName}</h3>`
  29.  
  30. const moduleLectures = document.createElement('ul')
  31. moduleLectures.appendChild(lectureTemplate(date, lectureName))
  32.  
  33. moduleDiv.appendChild(moduleLectures)
  34.  
  35. return moduleDiv
  36. }
  37.  
  38. // medium-generic fn for a valid input :-D
  39. const isValidInpit = (lectureName, date, moduleName) => lectureName !==
  40. '' && date !== '' && moduleName !== 'Select module'
  41.  
  42.  
  43. // helper functions
  44. const formatDate = (s) => s.replace(/-/g, '/').replace('T', ' - ')
  45. const formatName = (n) => `${n.toLocaleUpperCase()}-MODULE`
  46. const clearInput = () => {
  47. html.lectNameField.value = ''
  48. html.dateField.value = ''
  49. html.moduleNameField.value = 'Select module'
  50. }
  51.  
  52. document.addEventListener('click', (e) => {
  53.  
  54. // on 'Add' Button click
  55. if (e.target.tagName === 'BUTTON' && e.target.innerHTML === 'Add') {
  56. e.preventDefault()
  57. const [lectureName, date, moduleName] = [
  58. html.lectNameField.value,
  59. formatDate(html.dateField.value),
  60. formatName(html.moduleNameField.value)
  61. ]
  62.  
  63. if (isValidInpit(lectureName, date, moduleName)) {
  64. // if there is added module with the same name ->
  65. const sameModule = Array.from(html.modules.children)
  66. .find(x => x.children[0].innerHTML === moduleName)
  67.  
  68. if (sameModule) {
  69. const lecturesContainer = sameModule.children[1]
  70. const lectures = Array.from(lecturesContainer.children)
  71.  
  72. // here we take all lectures, make them array, we push
  73. // the new lecture, sort them by date, and append them
  74. // to the module section
  75. lectures.push(lectureTemplate(date, lectureName))
  76. lectures.sort((a, b) => a.date.localeCompare(b.date))
  77. lectures.forEach(
  78. lecture => lecturesContainer.appendChild(lecture)
  79. )
  80. } else {
  81. // if the module does not exist, we make whole new
  82. // module and append it to the modules section.
  83. html.modules.appendChild(moduleTemplate(
  84. moduleName,
  85. date,
  86. lectureName
  87. ))
  88. }
  89. clearInput()
  90. }
  91. }
  92.  
  93. // on 'Del' button click
  94. if (e.target.tagName === 'BUTTON' && e.target.innerHTML === 'Del') {
  95. const moduleSection = e.target.parentNode.parentNode.parentNode
  96.  
  97. e.target.parentNode.outerHTML = '' // delete lecture element
  98.  
  99. if (moduleSection.children[1].children.length === 0) { // if no more lectures in module
  100. moduleSection.outerHTML = '' // delete module element
  101. }
  102. }
  103. }
  104. )
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement