From 9c9d267fe3672f52e2a108e17ad89c6dd2faf654 Mon Sep 17 00:00:00 2001 From: haimre Date: Wed, 2 Feb 2022 12:12:50 +0200 Subject: [PATCH 01/13] first commit --- 1-Vanilla/index.html | 37 +++++++++++++++++++++++++++++++++++++ 1-Vanilla/index.js | 0 1-Vanilla/style.css | 0 3 files changed, 37 insertions(+) create mode 100644 1-Vanilla/index.html create mode 100644 1-Vanilla/index.js create mode 100644 1-Vanilla/style.css diff --git a/1-Vanilla/index.html b/1-Vanilla/index.html new file mode 100644 index 00000000..69f3ba19 --- /dev/null +++ b/1-Vanilla/index.html @@ -0,0 +1,37 @@ + + + + + + + Document + + +

Vanilla TODO List

+
+ +
+
    +
      +
      title
      +
      sub-title
      +
      description
      +
    +
+
+
+ + + \ No newline at end of file diff --git a/1-Vanilla/index.js b/1-Vanilla/index.js new file mode 100644 index 00000000..e69de29b diff --git a/1-Vanilla/style.css b/1-Vanilla/style.css new file mode 100644 index 00000000..e69de29b From 5b5f4a1929a5f6a338e5b52dc8e000c39f91fa54 Mon Sep 17 00:00:00 2001 From: haimre Date: Wed, 2 Feb 2022 12:48:09 +0200 Subject: [PATCH 02/13] menu and list structure --- 1-Vanilla/index.html | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/1-Vanilla/index.html b/1-Vanilla/index.html index 69f3ba19..383a1737 100644 --- a/1-Vanilla/index.html +++ b/1-Vanilla/index.html @@ -6,30 +6,40 @@ Document - -

Vanilla TODO List

+ +
+

Vanilla TODO List

+
- diff --git a/1-Vanilla/index.js b/1-Vanilla/index.js index b772c0dd..6aa42b79 100644 --- a/1-Vanilla/index.js +++ b/1-Vanilla/index.js @@ -1,35 +1,31 @@ -var edited_id = 0; -var edit_mode = false; -var id = 1; - -function add_item(){ +// TODO: +// - split element build to smaller functions +// - add uuid to items +// - change variable names to camelCase +let edited_id = 0; +let editMode = false; +let id = 1; + +function addItem(){ let title = document.getElementById('title-input').value if (title ==''){ - console.log('cant add an item without a title') + alert('cant add an item without a title') return } - if (edit_mode){ - console.log('cant add an item while in edit mode') + if (editMode){ + alert('cant add an item while in edit mode') return } - let subtitle = document.getElementById('subtitle-input').value - let description = document.getElementById('description-input').value + let content = document.getElementById('content-input').value let list = document.getElementById('list') - - let itemElement = create_todo_item_element(id,title,subtitle,description) - - - // finally append item to the list + let itemElement = createTodoItemElement(id,title,content) list.appendChild(itemElement) - // now save to local storage - let itemObject = `title: ${title};subtitle: ${subtitle};description: ${description}` - localStorage.setItem(id,itemObject) + let itemString = `title: ${title};content: ${content}` + localStorage.setItem(id,itemString) // reset menu display - document.getElementById('title-input').value = '' - document.getElementById('subtitle-input').value = '' - document.getElementById('description-input').value = '' + clearMenu() document.getElementById('menu-button').innerText = 'add item' // dont forget to change the id variable @@ -37,154 +33,134 @@ function add_item(){ localStorage.setItem('next_id',id) } -function edit_item(item_id){ - edited_id = item_id - document.getElementById('title-input').value = document.getElementById(`title${item_id}`).innerText - document.getElementById('subtitle-input').value = document.getElementById(`subtitle${item_id}`).innerText - document.getElementById('description-input').value = document.getElementById(`description${item_id}`).innerText - edit_mode = true //to disable item deletion +function sendItemToEdit(itemID){ + edited_id = itemID + document.getElementById('title-input').value = document.getElementById(`title${itemID}`).innerText + document.getElementById('content-input').value = document.getElementById(`content${itemID}`).innerText + editMode = true //to disable item deletion document.getElementById('cancel-button').hidden = false // to exit edit mode document.getElementById('menu-button').innerText = 'add changes' // to save changes and exit edit mode } -function delete_item(item_id){ - if(edit_mode){ - console.log('cant delete while in edit mode') +function deleteItem(itemID){ + if(editMode){ + alert('cant delete while in edit mode') return } - let item = document.getElementById(item_id) + let item = document.getElementById(itemID) let list = document.getElementById('list') // remove from display list.removeChild(item) // remove from item storage - localStorage.removeItem(item_id) + localStorage.removeItem(itemID) } -function cancel_edit(){ - document.getElementById('title-input').value = '' - document.getElementById('subtitle-input').value = '' - document.getElementById('description-input').value = '' - edit_mode = false +function cancelEdit(){ + clearMenu() + editMode = false document.getElementById('menu-button').innerText = 'add item' document.getElementById('cancel-button').hidden = true edited_id = 0 } -function clear_menu(){ +function clearMenu(){ document.getElementById('title-input').value = '' - document.getElementById('subtitle-input').value = '' - document.getElementById('description-input').value = '' + document.getElementById('content-input').value = '' } -function menu_button(){ - if(!edit_mode){ - add_item() +function menuButtonClick(){ + if(!editMode){ + addItem() }else{ if (document.getElementById('title-input').value == ''){ - console.log('cant set an empty title') + alert('cant set an empty title') return } let title = document.getElementById('title-input').value - let subtitle = document.getElementById('subtitle-input').value - let description = document.getElementById('description-input').value + let content = document.getElementById('content-input').value document.getElementById(`title${edited_id}`).innerText = title - document.getElementById(`subtitle${edited_id}`).innerText = subtitle - document.getElementById(`description${edited_id}`).innerText = description + document.getElementById(`content${edited_id}`).innerText = content // now update item in local storage - let itemObject = `title: ${title};subtitle: ${subtitle};description: ${description}` + let itemObject = `title: ${title};content: ${content}` localStorage.setItem(edited_id,itemObject) - document.getElementById('title-input').value = '' - document.getElementById('subtitle-input').value = '' - document.getElementById('description-input').value = '' - edit_mode = false + clearMenu() + editMode = false document.getElementById('menu-button').innerText = 'add item' document.getElementById('cancel-button').hidden = true edited_id = 0 } } -function add_button(caller){ - document.getElementById('title-input').value = '' - document.getElementById('subtitle-input').value = '' - document.getElementById('description-input').value = '' +function addButton(){ + clearMenu() document.getElementById('title-input').focus() } -function create_todo_item_element(item_id,title,subtitle,description){ +function createTodoItemElement(itemID,title,content){ // ol todo-item let itemElement = document.createElement('ol') itemElement.className = 'todo-item' - itemElement.id = item_id; - // input checkbox - let itemCheckboxElement = document.createElement('input') - itemCheckboxElement.type = 'checkbox' - itemCheckboxElement.className = 'item-checkbox' - // div todo-item-text - let itemTextElement = document.createElement('div') - itemTextElement.className = 'todo-item-text' - // item title - let titleElement = document.createElement('div') - titleElement.innerText = title - titleElement.className = 'todo-item-title' - titleElement.id = 'title'+item_id - // item subtitle - let subtitleElement = document.createElement('div') - subtitleElement.innerText = subtitle - subtitleElement.className = 'todo-item-subtitle' - subtitleElement.id = 'subtitle'+item_id - // item description - let descriptionElement = document.createElement('div') - descriptionElement.innerText = description - descriptionElement.className = 'todo-item-description' - descriptionElement.id = 'description'+item_id - // div todo-item-buttons - let itemButtonsElement = document.createElement('div') - itemButtonsElement.className = 'todo-item-buttons' - // button edit - let editButtonElement = document.createElement('button') - editButtonElement.innerText = 'edit' - editButtonElement.className = 'item-edit-button' - editButtonElement.setAttribute('onclick',`edit_item(${item_id})`) - // button delete - let deleteButtonElement = document.createElement('button') - deleteButtonElement.innerText = 'delete' - deleteButtonElement.className = 'item-delete-button' - deleteButtonElement.setAttribute('onclick',`delete_item(${item_id})`) - - // append the text to parent - itemTextElement.appendChild(titleElement) - itemTextElement.appendChild(subtitleElement) - itemTextElement.appendChild(descriptionElement) - // append the buttons to parent - itemButtonsElement.appendChild(editButtonElement) - itemButtonsElement.appendChild(deleteButtonElement) + itemElement.id = itemID; + // input checkbox + let itemCheckboxElement = document.createElement('input') + itemCheckboxElement.type = 'checkbox' + itemCheckboxElement.className = 'item-checkbox' + // div todo-item-text + let itemTextElement = createItemTextElement(itemID,title,content) + let itemButtonsElement = createItemButtonsElement(itemID) //append checkbox, text and buttons to list-item itemElement.appendChild(itemCheckboxElement) itemElement.appendChild(itemTextElement) itemElement.appendChild(itemButtonsElement) - // the itemElement should look like this example: - - //
    - // - //
    - //
    Go for a walk with the dog
    - //
    very fun
    - //
    walk around the block 3 times, bring a doggy bag
    - //
    - //
    - // - // - //
    - //
- return itemElement } +function createItemButtonsElement(itemID){ + + let itemButtonsElement = document.createElement('div') + itemButtonsElement.className = 'todo-item-buttons' + // button edit + let editButtonElement = document.createElement('button') + editButtonElement.innerText = 'edit' + editButtonElement.className = 'item-edit-button' + editButtonElement.setAttribute('onclick',`sendItemToEdit(${itemID})`) + // button delete + let deleteButtonElement = document.createElement('button') + deleteButtonElement.innerText = 'delete' + deleteButtonElement.className = 'item-delete-button' + deleteButtonElement.setAttribute('onclick',`deleteItem(${itemID})`) + // append the buttons to container + itemButtonsElement.appendChild(editButtonElement) + itemButtonsElement.appendChild(deleteButtonElement) + + return itemButtonsElement +} + function createItemTextElement(itemID,title,content){ + + let itemTextElement = document.createElement('div') + itemTextElement.className = 'todo-item-text' + // item title + let titleElement = document.createElement('div') + titleElement.innerText = title + titleElement.className = 'todo-item-title' + titleElement.id = 'title'+itemID + // item content + let contentElement = document.createElement('div') + contentElement.innerText = content + contentElement.className = 'todo-item-content' + contentElement.id = 'content'+itemID + // append text to parent container + itemTextElement.appendChild(titleElement) + itemTextElement.appendChild(contentElement) + + return itemTextElement + } // attach functions to menu buttons window.onload = function(){ - document.getElementById('clear-button').setAttribute('onclick','clear_menu()') - document.getElementById('menu-button').setAttribute('onclick','menu_button()') - document.getElementById('cancel-button').setAttribute('onclick','cancel_edit()') + document.getElementById('clear-button').setAttribute('onclick','clearMenu()') + document.getElementById('menu-button').setAttribute('onclick','menuButtonClick()') + document.getElementById('cancel-button').setAttribute('onclick','cancelEdit()') + document.getElementById('add-button').setAttribute('onclick','addButton()') // load display todo items from local storage let list = document.getElementById('list') if (localStorage.getItem('next_id')==null){ @@ -194,13 +170,12 @@ window.onload = function(){ for (let key in localStorage) { if(isNaN(Number(key))) continue; - let item_string = localStorage.getItem(key) - item_string = item_string.split(';') - let title = item_string[0].split(':')[1] - let subtitle = item_string[1].split(':')[1] - let description = item_string[2].split(':')[1] - let item_element = create_todo_item_element(Number(key),title,subtitle,description) - list.appendChild(item_element) + let itemString = localStorage.getItem(key) + itemString = itemString.split(';') + let title = itemString[0].split(':')[1] + let content = itemString[1].split(':')[1] + let itemElement = createTodoItemElement(Number(key),title,content) + list.appendChild(itemElement) //make sure we get the right id in store for use if(Number(localStorage.getItem('next_id')) <= Number(key)){ localStorage.setItem('next_id',Number(key)+1) diff --git a/1-Vanilla/list-item.html b/1-Vanilla/list-item.html index 0424eceb..8a8c0c2e 100644 --- a/1-Vanilla/list-item.html +++ b/1-Vanilla/list-item.html @@ -3,7 +3,7 @@
title
sub-title
-
description
+
content
diff --git a/1-Vanilla/styles.css b/1-Vanilla/styles.css index f3540071..899cc93b 100644 --- a/1-Vanilla/styles.css +++ b/1-Vanilla/styles.css @@ -36,6 +36,9 @@ input:hover{ display: flex; justify-content: space-around; } +.menu-item{ + margin: 5px; +} .item{ display:flex; flex-direction:column; @@ -67,7 +70,7 @@ input:hover{ .item-checkbox:checked ~div.todo-item-text > .todo-item-subtitle { text-decoration: line-through; } -.item-checkbox:checked ~div.todo-item-text > .todo-item-description { +.item-checkbox:checked ~div.todo-item-text > .todo-item-content { display: none; } .todo-item-text{ @@ -123,7 +126,7 @@ input:hover{ font-weight: thin; padding-left: 15px; } -.todo-item-description{ +.todo-item-content{ font-weight: thin; padding-left: 15px; color: grey; From 719ebf697e9742a98167704615ab4ef2c0fab768 Mon Sep 17 00:00:00 2001 From: haimre Date: Sun, 6 Feb 2022 15:27:21 +0200 Subject: [PATCH 13/13] fix: ID is now random --- 1-Vanilla/index.html | 6 ++---- 1-Vanilla/index.js | 37 ++++++++++++------------------------- 1-Vanilla/styles.css | 20 ++++++++++++++++---- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/1-Vanilla/index.html b/1-Vanilla/index.html index ca8319b2..43b9181e 100644 --- a/1-Vanilla/index.html +++ b/1-Vanilla/index.html @@ -2,9 +2,7 @@ - - @@ -21,8 +19,8 @@

Vanilla TODO List

Edit items and add new items
- - + +