Table editable
Bootstrap table editable
Note: This documentation is for an older version of Bootstrap (v.4). A
newer version is available for Bootstrap 5. We recommend migrating to the latest version of our product - Material Design for
Bootstrap 5.
Go to docs v.5
With an Editable Bootstrap Table, you can add and remove rows, plus and change text and information within cells. In-place editing on your website - based on JavaScript - is now easier and quicker.
Note: If you need more advanced functionality, have a look at our Table editor plugin.
Basic example
<!-- Editable table -->
<div class="card">
<h3 class="card-header text-center font-weight-bold text-uppercase py-4">
Editable table
</h3>
<div class="card-body">
<div id="table" class="table-editable">
<span class="table-add float-right mb-3 mr-2"
><a href="#!" class="text-success"
><i class="fas fa-plus fa-2x" aria-hidden="true"></i></a
></span>
<table class="table table-bordered table-responsive-md table-striped text-center">
<thead>
<tr>
<th class="text-center">Person Name</th>
<th class="text-center">Age</th>
<th class="text-center">Company Name</th>
<th class="text-center">Country</th>
<th class="text-center">City</th>
<th class="text-center">Sort</th>
<th class="text-center">Remove</th>
</tr>
</thead>
<tbody>
<tr>
<td class="pt-3-half" contenteditable="true">Aurelia Vega</td>
<td class="pt-3-half" contenteditable="true">30</td>
<td class="pt-3-half" contenteditable="true">Deepends</td>
<td class="pt-3-half" contenteditable="true">Spain</td>
<td class="pt-3-half" contenteditable="true">Madrid</td>
<td class="pt-3-half">
<span class="table-up"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-up" aria-hidden="true"></i></a
></span>
<span class="table-down"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-down" aria-hidden="true"></i></a
></span>
</td>
<td>
<span class="table-remove"
><button type="button" class="btn btn-danger btn-rounded btn-sm my-0">
Remove
</button></span
>
</td>
</tr>
<!-- This is our clonable table line -->
<tr>
<td class="pt-3-half" contenteditable="true">Guerra Cortez</td>
<td class="pt-3-half" contenteditable="true">45</td>
<td class="pt-3-half" contenteditable="true">Insectus</td>
<td class="pt-3-half" contenteditable="true">USA</td>
<td class="pt-3-half" contenteditable="true">San Francisco</td>
<td class="pt-3-half">
<span class="table-up"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-up" aria-hidden="true"></i></a
></span>
<span class="table-down"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-down" aria-hidden="true"></i></a
></span>
</td>
<td>
<span class="table-remove"
><button type="button" class="btn btn-danger btn-rounded btn-sm my-0">
Remove
</button></span
>
</td>
</tr>
<!-- This is our clonable table line -->
<tr>
<td class="pt-3-half" contenteditable="true">Guadalupe House</td>
<td class="pt-3-half" contenteditable="true">26</td>
<td class="pt-3-half" contenteditable="true">Isotronic</td>
<td class="pt-3-half" contenteditable="true">Germany</td>
<td class="pt-3-half" contenteditable="true">Frankfurt am Main</td>
<td class="pt-3-half">
<span class="table-up"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-up" aria-hidden="true"></i></a
></span>
<span class="table-down"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-down" aria-hidden="true"></i></a
></span>
</td>
<td>
<span class="table-remove"
><button type="button" class="btn btn-danger btn-rounded btn-sm my-0">
Remove
</button></span
>
</td>
</tr>
<!-- This is our clonable table line -->
<tr class="hide">
<td class="pt-3-half" contenteditable="true">Elisa Gallagher</td>
<td class="pt-3-half" contenteditable="true">31</td>
<td class="pt-3-half" contenteditable="true">Portica</td>
<td class="pt-3-half" contenteditable="true">United Kingdom</td>
<td class="pt-3-half" contenteditable="true">London</td>
<td class="pt-3-half">
<span class="table-up"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-up" aria-hidden="true"></i></a
></span>
<span class="table-down"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-down" aria-hidden="true"></i></a
></span>
</td>
<td>
<span class="table-remove"
><button type="button" class="btn btn-danger btn-rounded btn-sm my-0">
Remove
</button></span
>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- Editable table -->
.pt-3-half { padding-top: 1.4rem; }
const $tableID = $('#table'); const $BTN = $('#export-btn'); const $EXPORT = $('#export');
const newTr = `
<tr class="hide">
<td class="pt-3-half" contenteditable="true">Example</td>
<td class="pt-3-half" contenteditable="true">Example</td>
<td class="pt-3-half" contenteditable="true">Example</td>
<td class="pt-3-half" contenteditable="true">Example</td>
<td class="pt-3-half" contenteditable="true">Example</td>
<td class="pt-3-half">
<span class="table-up"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-up" aria-hidden="true"></i></a
></span>
<span class="table-down"
><a href="#!" class="indigo-text"
><i class="fas fa-long-arrow-alt-down" aria-hidden="true"></i></a
></span>
</td>
<td>
<span class="table-remove"
><button
type="button"
class="btn btn-danger btn-rounded btn-sm my-0 waves-effect waves-light"
>
Remove
</button></span
>
</td>
</tr>
`; $('.table-add').on('click', 'i', () => { const $clone = $tableID.find('tbody
tr').last().clone(true).removeClass('hide table-line'); if ($tableID.find('tbody tr').length
=== 0) { $('tbody').append(newTr); } $tableID.find('table').append($clone); });
$tableID.on('click', '.table-remove', function () { $(this).parents('tr').detach(); });
$tableID.on('click', '.table-up', function () { const $row = $(this).parents('tr'); if
($row.index() === 0) { return; } $row.prev().before($row.get(0)); }); $tableID.on('click',
'.table-down', function () { const $row = $(this).parents('tr');
$row.next().after($row.get(0)); }); // A few jQuery helpers for exporting only jQuery.fn.pop
= [].pop; jQuery.fn.shift = [].shift; $BTN.on('click', () => { const $rows =
$tableID.find('tr:not(:hidden)'); const headers = []; const data = []; // Get the headers
(add special header logic here) $($rows.shift()).find('th:not(:empty)').each(function () {
headers.push($(this).text().toLowerCase()); }); // Turn all existing rows into a loopable
array $rows.each(function () { const $td = $(this).find('td'); const h = {}; // Use the
headers from earlier to name our hash keys headers.forEach((header, i) => { h[header] =
$td.eq(i).text(); }); data.push(h); }); // Output the result
$EXPORT.text(JSON.stringify(data)); });
Advanced example - table editor
The table editor is an extension that allows you to create customized, fully editable tables.
Getting started: download & setup
Download
All of the components and features are a part of the MDBootstrap package.
MDBootstrap (Material Design for Bootstrap) is an MIT Licensed framework - free for personal & commercial use.
It combines the esthetic of Material Design and the functionalities of the newest Bootstrap.
Click on the button below to visit the Getting Started Page, where you can download the latest MDBootstrap package.
MDBootstrap Download MDBootstrap AboutMDB Pro
Using components and features labeled as MDB Pro component requires the MDB Pro package - a powerful UI Kit containing over 10,000 components, dozens of plugins and much more cool features.
Click the button below to learn more about the MDBootstrap Pro package.
MDBootstrap ProTutorials
If you need any additional help, use our "5 min Quick Start" guide or start full Bootstrap tutorial.
5 min Quick Start Full Bootstrap TutorialCompilation & Customization
To reduce the weight of MDBootstrap package even more, you can compile your own, custom package containing only those components and features that you need.
If you need additional help with compiling your custom package, please use our Compilation & Customization tutorial.
Compilation & Customization tutorialMap of dependencies of SCSS files in MDBootstrap:
Legend:
'-->' means 'required'
All free and pro files require files from 'core' catalog
'none' means 'this component doesn't require anything except core files'
A file wrapped by `< >` means that this file make the base component prettier but it isn't necessary for the proper working
All PRO components require 'pro/_variables.scss' file
scss/
|
|-- core/
| |
| |-- bootstrap/
| | |-- _functions.scss
| | |-- _variables.scss
| |
| |-- _colors.scss
| |-- _global.scss
| |-- _helpers.scss
| |-- _masks.scss
| |-- _mixins.scss
| |-- _typography.scss
| |-- _variables.scss
| |-- _waves.scss
|
|-- free/
| |-- _animations-basic.scss --> none
| |-- _animations-extended.scss --> _animations-basic.scss
| |-- _buttons.scss --> none
| |-- _cards.scss --> none <_buttons.scss>
| |-- _dropdowns.scss --> none <_buttons.scss>
| |-- _input-group.scss --> _forms.scss, _buttons.scss, _dropdowns.scss
| |-- _navbars.scss --> none <_buttons.scss, _forms.scss, _input-group.scss>
| |-- _pagination.scss --> none
| |-- _badges.scss --> none
| |-- _modals.scss --> _buttons.scss, _forms.scss (PRO --> _tabs.scss)
| |-- _carousels.scss --> <_buttons.scss>
| |-- _forms.scss --> none
| |-- _msc.scss --> none <_buttons.scss, _forms.scss, _cards.scss>
| |-- _footers.scss none <_buttons.scss> (PRO: )
| |-- _list-group.scss --> none
| |-- _tables.scss --> none (PRO: _material-select.scss, pro/_forms.scss, _checkbox.scss, pro/_buttons.scss, pro/_cards.scss, _pagination.scss, pro/_msc.scss)
| |-- _depreciated.scss
|
|-- pro/
| |
| |-- picker/
| | |-- _default.scss --> none
| | |-- _default-time.scss --> _default.scss, free/_forms.scss, free/_buttons.scss, pro/_buttons.scss, free/_cards.scss
| | |-- _default-date.scss --> _default.scss, free/_forms.scss
| |
| |-- sections/
| | |-- _templates.scss --> _sidenav.scss
| | |-- _social.scss --> free/_cards.scss, free/ _forms.scss, free/_buttons.scss, pro/_buttons.scss,
| | |-- _team.scss --> free/_buttons.scss, pro/_buttons.scss, free/_cards.scss, pro/_cards.scss
| | |-- _testimonials.scss --> free/_carousels.scss, pro/_carousels.scss, free/_buttons.scss, pro/_buttons.scss
| | |-- _magazine.scss --> _badges.scss
| | |-- _pricing.scss --> free/_buttons.scss, pro/_buttons.scss
| | |-- _contacts.scss --> free/_forms.scss, pro/_forms.scss, free/_buttons.scss, pro/_buttons.scss
| |
| |-- _variables.scss
| |-- _buttons.scss --> free/_buttons.scss, pro/_msc.scss, _checkbox.scss, _radio.scss
| |-- _social-buttons.scss --> free/_buttons.scss, pro/_buttons.scss
| |-- _tabs.scss --> _cards.scss
| |-- _cards.scss --> free/_cards.scss <_buttons.scss, _social-buttons.scss>
| |-- _dropdowns.scss --> free/_dropdowns.scss, free/_buttons.scss
| |-- _navbars.scss --> free/_navbars.scss (PRO: )
| |-- _scrollspy.scss --> none
| |-- _lightbox.scss --> none
| |-- _chips.scss --> none
| |-- _msc.scss --> none
| |-- _forms.scss --> none
| |-- _radio.scss --> none
| |-- _checkbox.scss --> none
| |-- _material-select.scss --> none
| |-- _switch.scss --> none
| |-- _file-input.scss --> free/_forms.scss, free/_buttons.scss
| |-- _range.scss --> none
| |-- _input-group.scss --> free/_input-group.scss and the same what free input group, _checkbox.scss, _radio.scss
| |-- _autocomplete.scss --> free/_forms.scss
| |-- _accordion.scss --> pro/_animations.scss, free/_cards.scss
| |-- _parallax.scss --> none
| |-- _sidenav.scss --> free/_forms.scss, pro/_animations.scss, sections/_templates.scss
| |-- _ecommerce.scss --> free/_cards.scss, pro/_cards.scss, free/_buttons.scss, pro/_buttons.scss, pro/_msc.scss
| |-- _carousels.scss --> free/_carousels.scss, free/_cards.scss, free/_buttons.scss
| |-- _steppers.scss --> free/_buttons.scss
| |-- _blog.scss --> none
| |-- _toasts.scss --> free/_buttons.scss
| |-- _animations.scss --> none
| |-- _charts.scss --> none
| |-- _progress.scss --> none
| |-- _scrollbar.scss --> none
| |-- _skins.scss --> none
| |-- _depreciated.scss
|
`-- _custom-skin.scss
`-- _custom-styles.scss
`-- _custom-variables.scss
`-- mdb.scss
Map of dependencies of JavaScript modules in MDBootstrap:
Legend:
'-->' means 'required'
All files require jQuery and bootstrap.js
js/
├── dist/
│ ├── buttons.js
│ ├── cards.js
│ ├── character-counter.js
│ ├── chips.js
│ ├── collapsible.js --> vendor/velocity.js
│ ├── dropdown.js --> Popper.js, jquery.easing.js
│ ├── file-input.js
│ ├── forms-free.js
│ ├── material-select.js --> dropdown.js
│ ├── mdb-autocomplete.js
│ ├── preloading.js
│ ├── range-input.js --> vendor/velocity.js
│ ├── scrolling-navbar.js
│ ├── sidenav.js --> vendor/velocity.js, vendor/hammer.js, vendor/jquery.hammer.js
│ └── smooth-scroll.js
├── _intro-mdb-pro.js
├── modules.js
├── src/
│ ├── buttons.js
│ ├── cards.js
│ ├── character-counter.js
│ ├── chips.js
│ ├── collapsible.js --> vendor/velocity.js
│ ├── dropdown.js --> Popper.js, jquery.easing.js
│ ├── file-input.js
│ ├── forms-free.js
│ ├── material-select.js --> dropdown.js
│ ├── mdb-autocomplete.js
│ ├── preloading.js
│ ├── range-input.js --> vendor/velocity.js
│ ├── scrolling-navbar.js
│ ├── sidenav.js --> vendor/velocity.js, vendor/hammer.js, vendor/jquery.hammer.js
│ └── smooth-scroll.js
└── vendor/
├── addons/
│ ├── datatables.js
│ └── datatables.min.js
├── chart.js
├── enhanced-modals.js
├── hammer.js
├── jarallax.js
├── jarallax-video.js --> vendor/jarallax.js
├── jquery.easing.js
├── jquery.easypiechart.js
├── jquery.hammer.js --> vendor/hammer.js
├── jquery.sticky.js
├── lightbox.js
├── picker-date.js --> vendor/picker.js
├── picker.js
├── picker-time.js --> vendor/picker.js
├── scrollbar.js
├── scrolling-navbar.js
├── toastr.js
├── velocity.js
├── waves.js
└── wow.js
Integrations with Angular, React or Vue
Apart from the standard Bootstrap integration (using jQuery), MDBootstrap also integrates with Angular, React and Vue.
About MDB Angular About MDB React About MDB VueExclusive resources
MDBootstrap is a platform for web creators and MDB packages are only a part of it.
If you sign up you'll gain free access to other useful tools & resources including:
- Community developed components & design projects
- Technical support & community forum
- CLI interface & free project hosting
- Helpful articles & news agregators
...and much more!
Don't hesitate and sign up now!
Sign up now