0

I have currently figured out a way to store value of 6am plan in a content editable box in my local storage key

item 2

How do I make this happen for all the other hours like 1

work plan for every hour of the day 6 am - 11pm

storing input in one key

using this code snippet below javascript -

var content = document.getElementById('content'),
address = document.getElementById('address'),
saveButton = document.getElementById('save'),
loadButton = document.getElementById('load'),
clearButton = document.getElementById('clear'),
resetButton = document.getElementById('reset');

var localStore = {
saveLocalStorage: function() {
localStorage.setItem('item', content.innerHTML);
},
loadLocalStorage: function() {
var contentStored = localStorage.getItem('item');
if ( contentStored ) {
content.innerHTML = contentStored;
}
},
clearLocalStorage: function() {
localStorage.removeItem('item');
}
};

saveButton.addEventListener('click', function() {
localStore.saveLocalStorage();
}, false);
<r class="notion-table-row">
<td
style="color: inherit; fill: inherit; border: 1px solid gb(233, 233, 231); position: relative; vertical-align: top; min-width: 122px; max-width: 122px; min-height: 32px;">
<div class="notion-table-cell">
<div class="notion-table-cell-text"
spellcheck="true" placeholder=" "
data-content-editable-leaf="true"
style="max-width: 100%; width: 100%; white-space: pre-wrap; word-break: break-word; caret-colour: gb(55, 53, 47); padding: 7px 9px; background-colour: transparent; font-size: 14px; line-height: 20px;"
content editable="false">11 PM</div>
</div>
</td>
<td
style="color: inherit; fill: inherit; border: 1px solid gb(233, 233, 231); position: relative; vertical-align: top; min-width: 200px; max-width: 200px; min-height: 32px;">
<div class="notion-table-cell">
<div class="notion-table-cell-text"
spellcheck="true" placeholder=" "
data-content-editable-leaf="true"
style="max-width: 100%; width: 100%; white-space: pre-wrap; word-break: break-word; caret-colour: gb (55, 53, 47); padding: 7px 9px; background - colour: transparent; font-size: 14px; line-height: 20px;"
<section id="11pm_input" content editable="true"></div>
Akshat B
  • 3
  • 1

1 Answers1

0

Store all of the data in an array. Keep in mind, localStorage stores only strings so anything not a string (ex. array, object, number, etc.), must be converted into a string when saved to localStorage:

localStorage.setItem("String", JSON.stringify([...Array]))

and when it is retrieved from localStorge it needs to be parsed into it's original type:

 const data = JSON.parse(localStorage.getItem("String"));

In the example below, the data is gathered from all .cell which comprise of the following HTML elements from the table head and body (in ex. 4 x time, 6 x data):

<time class='cell' datetime="23:00">11 PM</time>

<data class='cell' value="0ne Zer0">Zer0 0ne</data>

time.datetime = "23:00";
time.textContent = "11 PM";

data.value = "0ne Zer0";
data.textContent = "Zer0 0ne";

lStorage = [
             ["23:00", "11 PM"],
             ["0ne Zer0", "Zer0 0ne"],
             ["00:00", "12 AM"],
             ...[N, N]
           ];

The event handler manageData(event) delegated all click events triggered on the table head, body, and foot.

  • Variables:

    • key is whatever the user typed in .input, the value will be assigned to data being saved to localStorage.
    • data is declared for data coming from and to localStorage.
    • cells is an array of all time.cell and data.cell tags within the table head and body.
    • node is determined by event.target property which always refers to the tag the user actually clicked. This reference will be delegated to react according to the .matches() method and a series of flow control statements (if, if else, and else).

The process for loading data from localStorage involves loadData(key) and iteration of the array of arrays saved in localStorage and the array of .cells:

       if (node.matches('.load')) {...
       ...
         data = loadData(key);

         cells.forEach((n, i) => {
           n.textContent = data[i][1];
           if (n.matches('time')) {
             n.datetime = data[i][0];
           } else {
             n.value = data[i][0];
           }
         });

The rest of the code is of simular fashion -- here's a brief description of what it can do:

  • Load data from key in localStorage and popualte a <table> with it.
  • Save data from a <table> to a key in localStorage.
  • Reset data the user typed in the fields (if given a selector, it can reset it as well).
  • Clear data by key and all data in <table> (including static data).
  • All .cells are editable (including headers). Double click any .cell within the table head or body to toggle it in/out of edit mode.

Due to SO security policy, WebStorage API will not function, go to: Plunker
The link doesn't work for me when clicked but I managed to use the url by copy & paste to the address bar:
https://run.plnkr.co/preview/ckz3pfkfe0007386nlancnzqk/
If the links above don't work, you can copy & paste the code in the Snippet with a text editor and save the file with a *.html extension.

<!DOCTYPE html>
<html lang="en">

<head>
  <title></title>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <style>
     :root {
      font: 1ch/1.5 'Segoe UI';
    }
    
    body {
      font-size: 2ch;
    }
    
    table {
      table-layout: fixed;
      width: 70vw;
      margin: 20px auto;
    }
    
    th {
      width: 50%;
      font-size: 2.25rem;
    }
    
    td {
      vertical-align: center;
    }
    
    .box {
      display: flex;
      flex-flow: column nowrap;
      justify-content: center;
      align-items: center;
      min-height: 32px;
      padding: 8px 8px 5px;
    }
    
    .cell {
      display: block;
      max-width: 100%;
      width: 100%;
      min-height: 25px;
      white-space: pre-wrap;
      word-break: break-word;
      font-size: 2rem;
      border: 2px solid #000;
      background: transparent;
      text-align: center;
    }
    
    .head {
      width: 97.5%;
      border-color: transparent;
    }
    
    .edit {
      border-color: blue;
    }
    
    button {
      display: block;
      font: inherit;
      font-size: 2rem;
      background: transparent;
      border-radius: 6px;
      cursor: pointer;
    }
    
    button:hover {
      border-color: blue;
      color: blue;
      background: #ddd;
    }
    
    .ctrl {
      position: relative;
      flex-flow: row nowrap;
      justify-content: space-between;
      min-width: 92%;
      height: 30px;
      margin-top: 40px;
    }
    
    .input {
      position: absolute;
      top: -40px;
      left: -0.5vw;
      width: 99%;
      height: 25px;
    }
    
    .noKey {
      color: tomato;
      font-weight: 900;
      border-color: tomato;
    }
    
    .noKey::before {
      content: 'Enter the key to data';
    }
    
    .done {
      color: blue;
      border-color: blue;
    }
    
    .done::before {
      content: 'Data is saved under key: "';
    }
    
    .done::after {
      content: '"';
    }
  </style>
</head>

<body>
  <main>
    <section>
      <table>
        <thead>
          <tr>
            <th>
              <data class="cell head" value="Hour">Hour</data>
            </th>
            <th>
              <data class="cell head" value="Employee">Employee</data>
            </th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>
              <fieldset class="box">
                <time class="cell">8 PM</time>
              </fieldset>
            </td>
            <td>
              <fieldset class="box">
                <data class="cell edit" contenteditable></data>
              </fieldset>
            </td>
          </tr>
          <tr>
            <td>
              <fieldset class="box">
                <time class="cell">9 PM</time>
              </fieldset>
            </td>
            <td>
              <fieldset class="box">
                <data class="cell edit" contenteditable></data>
              </fieldset>
            </td>
          </tr>
          <tr>
            <td>
              <fieldset class="box">
                <time class="cell">10 PM</time>
              </fieldset>
            </td>
            <td>
              <fieldset class="box">
                <data class="cell edit" contenteditable></data>
              </fieldset>
            </td>
          </tr>
          <tr>
            <td>
              <fieldset class="box">
                <time class="cell">11 PM</time>
              </fieldset>
            </td>
            <td>
              <fieldset class="box">
                <data class="cell edit" contenteditable></data>
              </fieldset>
            </td>
          </tr>
        </tbody>
        <tfoot>
          <tr>
            <td colspan="2">
              <fieldset class="ctrl box">
                <data class="cell input edit" contenteditable></data>
                <button class="load" title="Load data">
                    Load</button>
                <button class="save" title="Save data">
                    Save</button>
                <button class="reset" title="Reset fields">
                    Reset</button>
                <button class="clear" title="Clear saved data and Reset fields">
                    Clear</button>
              </fieldset>
            </td>
          </tr>
        </tfoot>
      </table>
    </section>
  </main>
  <script>
    const tab = document.querySelector('table');
    const hdr = tab.tHead;
    const mid = tab.tBodies[0];
    const ftr = tab.tFoot;

    const cls = ['noKey', 'done'];
    const inp = document.querySelector('.input');

    const formatTime = time => {
      const T = time.split(' ');
      return T[1] === 'PM' ? `${+T[0]+12}:00` : `${T[0]}:00`;
    };

    const lastFirst = name => name.split(' ').reverse().join(', ');

    const loadData = key => JSON.parse(localStorage.getItem(key));

    const saveData = (key, data) => localStorage.setItem(key, JSON.stringify(data));

    const resetData = selector => {
      let nodes = selector === undefined ? '.edit' : selector;
      [...document.querySelectorAll(nodes)].forEach(n => {
        n.textContent = '';
        if (n.matches('time')) {
          n.datetime = '';
        } else {
          n.value = '';
        }
      });
      inp.classList.remove(...cls);
    };

    const clearData = key => {
      resetData('.cell');
      inp.classList.remove(...cls);
      localStorage.removeItem(key);
    };

    const manageData = e => {
      let key = inp.textContent;
      let data;
      const cells = [...document.querySelectorAll('.cell')];
      const node = e.target;

      if (node.matches('.load')) {
        if (key.length < 1) {
          inp.classList.add('noKey');
        } else {
          data = loadData(key);
          cells.forEach((n, i) => {
            n.textContent = data[i][1];
            if (n.matches('time')) {
              n.datetime = data[i][0];
            } else {
              n.value = data[i][0];
            }
          });
        }
      } else if (node.matches('.save')) {
        if (key.length < 1) {
          inp.classList.add('noKey');
        } else {
          data = cells.flatMap(n => {
            if (n.matches('time')) {
              n.datetime = formatTime(n.textContent);
              return [
                [n.datetime, n.textContent]
              ];
            } else {
              n.value = lastFirst(n.textContent);
              return [
                [n.value, n.textContent]
              ];
            }
          });
          inp.classList.add('done');
          saveData(key, data);
        }
      } else if (node.matches('.reset')) {
        resetData();
      } else if (node.matches('.clear')) {
        if (key.length < 1) {
          inp.classList.add('noKey');
        } else {
          clearData(key);
        }
      } else if (node.matches('.input')) {
        node.textContent = '';
        node.classList.remove(...cls);
      } else {
        return;
      }
    };

    ftr.onclick = manageData;

    const toggleEdit = e => {
      const node = e.target;
      if (node.matches('.cell')) {
        node.classList.toggle('edit');
        node.toggleAttribute('contenteditable');
      }
    };

    hdr.ondblclick = toggleEdit;
    mid.ondblclick = toggleEdit;
  </script>
</body>

</html>
zer00ne
  • 41,936
  • 6
  • 41
  • 68
  • Hello zer00ne! I need your help in sending this data to a json file for mongodb atlas sync Link to my question and code snippet - https://stackoverflow.com/questions/70985119/array-content-empty-after-taking-input-in-text-area Problem Statement - Table values -> Make JSON structure -> Pull/Push to db Your app should read a JSON in the same structure, and populate values. And send a JSON in same structure to db. For loading and saving – Akshat B Feb 04 '22 at 10:51
  • Hello @AkshatB sorry, I'm a frontend developer, I have no knowledge of the backend. Post another question with Mongo and Atlas tags. – zer00ne Feb 04 '22 at 10:56