"Undo" "Redo" Button with icon: in Page top left

 "Undo" "Redo" Button with icon: in Page top left 

Code:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Editable Table with Undo/Redo</title>
</head>
<body style="font-family: Arial, sans-serif;">

<div class="toolbar" style="display: flex; gap: 10px; left: 10px; position: fixed; top: 70px;">
  <button disabled id="undo-btn" onclick="undoChange()" style="background: lightskyblue; border-radius: 7px; color: white; font-size: 20px; padding: 5px; border: 1px solid; border-radius: 7px;">↺ Undo</button>
  <button disabled id="redo-btn" onclick="redoChange()" style="background: lightskyblue; border-radius: 7px; color: white; font-size: 20px; padding: 5px; border: 1px solid; border-radius: 7px;">↻ Redo</button>
</div>

<div class="table-container" style="margin-top: 50px; padding: 10px;">
  <table id="editableTable" style="border-collapse: collapse; width: 100%;">

    <thead>

      <tr>

        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Date</th>

        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Origin</th>

        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Item Type</th>
        
        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Item Category</th>
        
        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Items</th>
        
        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Rate Rs.</th>
        
        <th style="background-color: #f2f2f2; border: 1px solid rgb(221, 221, 221); padding: 8px; text-align: left;">Stock</th>

      </tr>

    </thead>
    <tbody>
      <tr style="background: white">
        <td contenteditable="true" rowspan="50" style="border: 1px solid #ddd; padding: 8px;">22/11/24</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">India</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Non-Veg</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Starter</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Chicken Pockora</td>
        <td type="number" contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">120</td>
        <td type="number" contenteditable="true" style="border:">10</td>
      </tr>
      <tr style="background: #f9f9f9">
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">India</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Non-Veg</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Starter</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Chicken Pockora</td>
        <td type="number" contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">120</td>
        <td type="number" contenteditable="true" style="border:">10</td>
      </tr>
      <tr style="background: white">
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">India</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Non-Veg</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Starter</td>
        <td contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">Chicken Pockora</td>
        <td type="number" contenteditable="true" style="border: 1px solid #ddd; padding: 8px;">120</td>
        <td type="number" contenteditable="true" style="border:">10</td>
      </tr>
    </tbody>
  </table>
</div>

<script>
  let undoStack = [];
  let redoStack = [];

  function saveState(cell) {
    // Save the cell's previous and current state in undo stack
    undoStack.push({
      cell: cell,
      content: cell.dataset.previousValue
    });
    redoStack = []; // Clear redo stack on a new change
    updateButtons();
  }

  // Attach event listeners to editable cells
  document.querySelectorAll('#editableTable td[contenteditable="true"]').forEach(cell => {
    cell.addEventListener('focus', () => {
      cell.dataset.previousValue = cell.innerText; // Save current value before edit
    });
    cell.addEventListener('blur', () => {
      if (cell.innerText !== cell.dataset.previousValue) {
        saveState(cell); // Only save state if content changed
      }
    });
  });

  // Undo function
  function undoChange() {
    if (undoStack.length === 0) return;

    const lastChange = undoStack.pop();
    redoStack.push({
      cell: lastChange.cell,
      content: lastChange.cell.innerText
    });

    // Revert cell content to previous state
    lastChange.cell.innerText = lastChange.content; 
    updateButtons();
  }

  // Redo function
  function redoChange() {
    if (redoStack.length === 0) return;

    const lastRedo = redoStack.pop();
    undoStack.push({
      cell: lastRedo.cell,
      content: lastRedo.cell.innerText
    });

    // Apply the redone content to the cell
    lastRedo.cell.innerText = lastRedo.content;
    updateButtons();
  }

  // Update button states based on stack contents
  function updateButtons() {
    document.getElementById('undo-btn').disabled = undoStack.length === 0;
    document.getElementById('redo-btn').disabled = redoStack.length === 0;
  }
</script>

</body>
</html>

Output:

User Editable Table

Date Origin Item Type Item Category Items Rate Rs. Stock
22/11/24 India Non-Veg Starter Chicken Pockora 120 10
India Non-Veg Starter Chicken Pockora 120 10
India Non-Veg Starter Chicken Pockora 120 10

Comments

Popular posts from this blog

Text Designing "Formatting" HTML elements : html

Click Count Data Page: Spin/Vote