diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 058920c134..74c9eac71a 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -104,7 +104,6 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'InvenTree.middleware.AuthRequiredMiddleware', - 'InvenTree.middleware.QueryCountMiddleware', ] if DEBUG: diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 0ea90a00ba..699671642f 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -70,6 +70,10 @@ class BuildItemList(generics.ListCreateAPIView): query = BuildItem.objects.all() + query = query.select_related('stock_item') + query = query.prefetch_related('stock_item__part') + query = query.prefetch_related('stock_item__part__category') + if part_pk: query = query.filter(stock_item__part=part_pk) diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index d644cbdc35..dd4a568187 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -45,6 +45,7 @@ class BuildItemSerializer(InvenTreeModelSerializer): part = serializers.IntegerField(source='stock_item.part.pk', read_only=True) part_name = serializers.CharField(source='stock_item.part.full_name', read_only=True) + part_image = serializers.CharField(source='stock_item.part.image.url', read_only=True) stock_item_detail = StockItemSerializerBrief(source='stock_item', read_only=True) class Meta: @@ -54,6 +55,7 @@ class BuildItemSerializer(InvenTreeModelSerializer): 'build', 'part', 'part_name', + 'part_image', 'stock_item', 'stock_item_detail', 'quantity' diff --git a/InvenTree/build/templates/build/allocate.html b/InvenTree/build/templates/build/allocate.html index 6d7017bcf2..3ad123da7f 100644 --- a/InvenTree/build/templates/build/allocate.html +++ b/InvenTree/build/templates/build/allocate.html @@ -10,39 +10,11 @@ InvenTree | Allocate Parts {% include "build/tabs.html" with tab='allocate' %} -

Allocate Parts for Build

- -
-
-
-
-
- - -
-
-
-
- -
-
-

Part

-
-
-

Available

-
-
-

Required

-
-
-

Allocated

-
-
- -{% for bom_item in bom_items.all %} -{% include "build/allocation_item.html" with item=bom_item build=build collapse_id=bom_item.id %} -{% endfor %} - +{% if editing %} +{% include "build/allocate_edit.html" %} +{% else %} +{% include "build/allocate_view.html" %} +{% endif %} {% endblock %} @@ -55,6 +27,8 @@ InvenTree | Allocate Parts {% block js_ready %} {{ block.super }} + {% if editing %} + {% for bom_item in bom_items.all %} loadAllocationTable( @@ -86,4 +60,37 @@ InvenTree | Allocate Parts ); }); + {% else %} + + $("#build-item-table").bootstrapTable({ + url: "{% url 'api-build-item-list' %}", + queryParams: { + build: {{ build.id }}, + }, + search: true, + columns: [ + { + field: 'part_name', + title: 'Part', + formatter: function(value, row, index, field) { + return imageHoverIcon(row.part_image) + value; + } + }, + { + field: 'stock_item_detail.location_name', + title: 'Location', + }, + { + field: 'quantity', + title: 'Quantity Allocated', + }, + ] + }); + + $("#btn-allocate").click(function() { + location.href = "{% url 'build-allocate' build.id %}?edit=1"; + }); + + {% endif %} + {% endblock %} diff --git a/InvenTree/build/templates/build/allocate_edit.html b/InvenTree/build/templates/build/allocate_edit.html new file mode 100644 index 0000000000..3040997fb9 --- /dev/null +++ b/InvenTree/build/templates/build/allocate_edit.html @@ -0,0 +1,32 @@ +

Allocate Stock to Build

+ +
+
+
+
+
+ + +
+
+
+
+ +
+
+

Part

+
+
+

Available

+
+
+

Required

+
+
+

Allocated

+
+
+ +{% for bom_item in bom_items.all %} +{% include "build/allocation_item.html" with item=bom_item build=build collapse_id=bom_item.id %} +{% endfor %} diff --git a/InvenTree/build/templates/build/allocate_view.html b/InvenTree/build/templates/build/allocate_view.html new file mode 100644 index 0000000000..9cef45bbbc --- /dev/null +++ b/InvenTree/build/templates/build/allocate_view.html @@ -0,0 +1,10 @@ +

Stock Allocated to Build

+ +
+
+ +
+
+ + +
\ No newline at end of file diff --git a/InvenTree/build/templates/build/required.html b/InvenTree/build/templates/build/required.html index 831d8d03b3..6ab16032ab 100644 --- a/InvenTree/build/templates/build/required.html +++ b/InvenTree/build/templates/build/required.html @@ -33,4 +33,12 @@ +{% endblock %} + +{% block js_ready %} + +{{ block.super }} + + $("#build-list").bootstrapTable({}); + {% endblock %} \ No newline at end of file diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index 14e22a3fe8..e325d3cc5b 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -294,6 +294,9 @@ class BuildAllocate(DetailView): context['part'] = part context['bom_items'] = bom_items + if str2bool(self.request.GET.get('edit', None)): + context['editing'] = True + return context diff --git a/InvenTree/company/templates/company/detail_part.html b/InvenTree/company/templates/company/detail_part.html index 48e9cb1a77..ec6f80c652 100644 --- a/InvenTree/company/templates/company/detail_part.html +++ b/InvenTree/company/templates/company/detail_part.html @@ -18,7 +18,7 @@
- +
{% endblock %} diff --git a/InvenTree/part/templates/part/stock.html b/InvenTree/part/templates/part/stock.html index e9c22bf1d9..04d1b0278a 100644 --- a/InvenTree/part/templates/part/stock.html +++ b/InvenTree/part/templates/part/stock.html @@ -46,6 +46,7 @@ location_detail: true, part_detail: true, }, + groupByField: 'location', buttons: [ '#stock-options', ], diff --git a/InvenTree/static/css/bootstrap-table-group-by.css b/InvenTree/static/css/bootstrap-table-group-by.css new file mode 100644 index 0000000000..449bc73aa4 --- /dev/null +++ b/InvenTree/static/css/bootstrap-table-group-by.css @@ -0,0 +1,11 @@ +.bootstrap-table .table > tbody > tr.groupBy { + cursor: pointer; +} + +.bootstrap-table .table > tbody > tr.groupBy.expanded { + +} + +.bootstrap-table .table > tbody > tr.hidden + tr.detail-view { + display: none; +} diff --git a/InvenTree/static/css/bootstrap-table.css b/InvenTree/static/css/bootstrap-table.css index 770b6728c3..7a71650329 100644 --- a/InvenTree/static/css/bootstrap-table.css +++ b/InvenTree/static/css/bootstrap-table.css @@ -1 +1,282 @@ -.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.bootstrap-table .table.table-no-bordered>tbody>tr>td:last-child{border-right:none}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:focus{outline:transparent solid 0}.fixed-table-container thead th:first-child:not([data-not-first-th]){border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bs-bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0;padding:0!important}.bootstrap-table .pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}.fixed-table-pagination:after,.fixed-table-toolbar:after{content:"";display:block;clear:both}.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#FFF} \ No newline at end of file +@charset "UTF-8"; +/** + * @author zhixin wen + * version: 1.14.2 + * https://github.com/wenzhixin/bootstrap-table/ + */ +.bootstrap-table .fixed-table-toolbar:after { + content: ""; + display: block; + clear: both; +} +.bootstrap-table .fixed-table-toolbar .bs-bars, +.bootstrap-table .fixed-table-toolbar .search, +.bootstrap-table .fixed-table-toolbar .columns { + position: relative; + margin-top: 10px; + margin-bottom: 10px; +} +.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group { + display: inline-block; + margin-left: -1px !important; +} +.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group:first-child > .btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group:last-child > .btn { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group > .btn { + border-radius: 0; +} +.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu { + text-align: left; + max-height: 300px; + overflow: auto; +} +.bootstrap-table .fixed-table-toolbar .columns label { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; +} +.bootstrap-table .fixed-table-toolbar .columns-left { + margin-right: 5px; +} +.bootstrap-table .fixed-table-toolbar .columns-right { + margin-left: 5px; +} +.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu { + right: 0; + left: auto; +} +.bootstrap-table .fixed-table-container { + position: relative; + clear: both; +} +.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer) { + border-bottom: 1px solid #dee2e6; +} +.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border { + border-left: 1px solid #dee2e6; + border-right: 1px solid #dee2e6; +} +.bootstrap-table .fixed-table-container.fixed-height .table thead th { + border-bottom: 1px solid #dee2e6; +} +.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th { + border-bottom: 1px solid #32383e; +} +.bootstrap-table .fixed-table-container .fixed-table-header { + overflow: hidden; +} +.bootstrap-table .fixed-table-container .fixed-table-body { + overflow-x: auto; + overflow-y: auto; + height: 100%; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading { + align-items: center; + background: #fff; + display: none; + justify-content: center; + position: absolute; + bottom: 0; + width: 100%; + z-index: 1000; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap { + align-items: baseline; + display: flex; + justify-content: center; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text { + font-size: 2rem; + margin-right: 6px; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap { + align-items: center; + display: flex; + justify-content: center; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot, +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap:after, +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap:before { + content: ""; + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: LOADING; + background: #212529; + border-radius: 50%; + display: block; + height: 5px; + margin: 0 4px; + opacity: 0; + width: 5px; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot { + animation-delay: 0.3s; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap:after { + animation-delay: 0.6s; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark { + background: #212529; +} +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot, +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap:after, +.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap:before { + background: #fff; +} +.bootstrap-table .fixed-table-container .table { + width: 100%; + margin-bottom: 0 !important; +} +.bootstrap-table .fixed-table-container .table th, +.bootstrap-table .fixed-table-container .table td { + vertical-align: middle; + box-sizing: border-box; +} +.bootstrap-table .fixed-table-container .table thead th { + vertical-align: bottom; + padding: 0; + margin: 0; +} +.bootstrap-table .fixed-table-container .table thead th:focus { + outline: 0 solid transparent; +} +.bootstrap-table .fixed-table-container .table thead th.detail { + width: 30px; +} +.bootstrap-table .fixed-table-container .table thead th .th-inner { + padding: 0.75rem; + vertical-align: bottom; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.bootstrap-table .fixed-table-container .table thead th .sortable { + cursor: pointer; + background-position: right; + background-repeat: no-repeat; + padding-right: 30px; +} +.bootstrap-table .fixed-table-container .table thead th .both { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC"); +} +.bootstrap-table .fixed-table-container .table thead th .asc { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=="); +} +.bootstrap-table .fixed-table-container .table thead th .desc { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= "); +} +.bootstrap-table .fixed-table-container .table tbody tr.selected td { + background-color: rgba(0, 0, 0, 0.075); +} +.bootstrap-table .fixed-table-container .table tbody tr.no-records-found { + text-align: center; +} +.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title { + font-weight: bold; + display: inline-block; + min-width: 30%; + text-align: left !important; +} +.bootstrap-table .fixed-table-container .table .bs-checkbox { + text-align: center; +} +.bootstrap-table .fixed-table-container .table input[type=radio], +.bootstrap-table .fixed-table-container .table input[type=checkbox] { + margin: 0 auto !important; +} +.bootstrap-table .fixed-table-container .table.table-sm .th-inner { + padding: 0.3rem; +} +.bootstrap-table .fixed-table-container .fixed-table-footer { + overflow: hidden; +} +.bootstrap-table .fixed-table-pagination:after { + content: ""; + display: block; + clear: both; +} +.bootstrap-table .fixed-table-pagination > .pagination-detail, +.bootstrap-table .fixed-table-pagination > .pagination { + margin-top: 10px; + margin-bottom: 10px; +} +.bootstrap-table .fixed-table-pagination > .pagination-detail .pagination-info { + line-height: 34px; + margin-right: 5px; +} +.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list { + display: inline-block; +} +.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list .btn-group { + position: relative; + display: inline-block; + vertical-align: middle; +} +.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list .btn-group .dropdown-menu { + margin-bottom: 0; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination { + margin: 0; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination a { + padding: 6px 12px; + line-height: 1.428571429; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a { + color: #c8c8c8; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a:before { + content: "⬅"; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a:after { + content: "➡"; +} +.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.disabled a { + pointer-events: none; + cursor: default; +} +.bootstrap-table.fullscreen { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100% !important; + background: #FFF; +} + +/* calculate scrollbar width */ +div.fixed-table-scroll-inner { + width: 100%; + height: 200px; +} + +div.fixed-table-scroll-outer { + top: 0; + left: 0; + visibility: hidden; + width: 200px; + height: 150px; + overflow: hidden; +} + +@keyframes LOADING { + 0% { + opacity: 0; + } + 50% { + opacity: 1; + } + to { + opacity: 0; + } +} + +/*# sourceMappingURL=bootstrap-table.css.map */ diff --git a/InvenTree/static/css/inventree.css b/InvenTree/static/css/inventree.css index f4d4bdd26a..0769380fe1 100644 --- a/InvenTree/static/css/inventree.css +++ b/InvenTree/static/css/inventree.css @@ -43,6 +43,12 @@ font-size: 100%; } +/* Bootstrap table overrides */ + +.stock-sub-group td { + background-color: #ebf4f4; +} + /* Force select2 elements in modal forms to be full width */ .select-full-width { width: 100%; diff --git a/InvenTree/static/script/bootstrap/bootstrap-table-group-by.js b/InvenTree/static/script/bootstrap/bootstrap-table-group-by.js new file mode 100644 index 0000000000..09c2d49553 --- /dev/null +++ b/InvenTree/static/script/bootstrap/bootstrap-table-group-by.js @@ -0,0 +1,269 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.bootstrapTableGroupBy = mod.exports; + } +})(this, function () { + 'use strict'; + + /** + * @author: Yura Knoxville + * @version: v1.1.0 + */ + + (function ($) { + + 'use strict'; + + var initBodyCaller, tableGroups; + + // it only does '%s', and return '' when arguments are undefined + var sprintf = function sprintf(str) { + var args = arguments, + flag = true, + i = 1; + + str = str.replace(/%s/g, function () { + var arg = args[i++]; + + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; + }; + + var groupBy = function groupBy(array, f) { + var groups = {}; + array.forEach(function (o) { + var group = f(o); + groups[group] = groups[group] || []; + groups[group].push(o); + }); + + return groups; + }; + + $.extend($.fn.bootstrapTable.defaults, { + groupBy: false, + groupByField: '', + groupByFormatter: undefined + }); + + var BootstrapTable = $.fn.bootstrapTable.Constructor, + _initSort = BootstrapTable.prototype.initSort, + _initBody = BootstrapTable.prototype.initBody, + _updateSelected = BootstrapTable.prototype.updateSelected; + + function isNumeric(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + + BootstrapTable.prototype.initSort = function () { + _initSort.apply(this, Array.prototype.slice.apply(arguments)); + + var that = this; + tableGroups = []; + + /* Sort the items into groups */ + + if (this.options.groupBy && this.options.groupByField !== '') { + + var that = this; + var groups = groupBy(that.data, function (item) { + return [item[that.options.groupByField]]; + }); + + var index = 0; + $.each(groups, function (key, value) { + tableGroups.push({ + id: index, + name: key, + data: value + }); + + value.forEach(function (item) { + if (!item._data) { + item._data = {}; + } + + if (value.length > 1) { + item._data['parent-index'] = index; + } else { + item._data['parent-index'] = null; + } + + item._data['group-data'] = value; + item._data['table'] = that; + }); + + index++; + }); + } + }; + + BootstrapTable.prototype.initBody = function () { + initBodyCaller = true; + + _initBody.apply(this, Array.prototype.slice.apply(arguments)); + + if (this.options.groupBy && this.options.groupByField !== '') { + var that = this, + checkBox = false, + visibleColumns = 0; + + var cols = []; + + this.columns.forEach(function (column) { + if (column.checkbox) { + checkBox = true; + } else { + if (column.visible) { + visibleColumns += 1; + cols.push(column); + } + } + }); + + if (this.options.detailView && !this.options.cardView) { + visibleColumns += 1; + } + + tableGroups.forEach(function (item) { + var html = []; + + html.push(sprintf('', item.id)); + + if (that.options.detailView && !that.options.cardView) { + html.push(''); + } + + if (checkBox) { + html.push('', '', ''); + } + + cols.forEach(function(col) { + var cell = ''; + + if (typeof that.options.groupByFormatter == 'function') { + cell += '' + that.options.groupByFormatter(col.field, item.id, item.data) + ""; + } + + cell += ""; + + html.push(cell); + }); + + /* + var formattedValue = item.name; + if (typeof that.options.groupByFormatter == "function") { + formattedValue = that.options.groupByFormatter(item.name, item.id, item.data); + } + html.push('', formattedValue, ''); + + cols.forEach(function(col) { + html.push('' + item.data[0][col.field] + ''); + }); + */ + + html.push(''); + + if(item.data.length > 1) { + + that.$body.find('tr[data-parent-index=' + item.id + ']').addClass('hidden stock-sub-group'); + + // Insert the group header row before the first item + that.$body.find('tr[data-parent-index=' + item.id + ']:first').before($(html.join(''))); + } + }); + + this.$selectGroup = []; + this.$body.find('[name="btSelectGroup"]').each(function () { + var self = $(this); + + that.$selectGroup.push({ + group: self, + item: that.$selectItem.filter(function () { + return $(this).closest('tr').data('parent-index') === self.closest('tr').data('group-index'); + }) + }); + }); + + this.$container.off('click', '.groupBy').on('click', '.groupBy', function () { + $(this).toggleClass('expanded'); + that.$body.find('tr[data-parent-index=' + $(this).closest('tr').data('group-index') + ']').toggleClass('hidden'); + }); + + this.$container.off('click', '[name="btSelectGroup"]').on('click', '[name="btSelectGroup"]', function (event) { + event.stopImmediatePropagation(); + + var self = $(this); + var checked = self.prop('checked'); + that[checked ? 'checkGroup' : 'uncheckGroup']($(this).closest('tr').data('group-index')); + }); + } + + initBodyCaller = false; + this.updateSelected(); + }; + + BootstrapTable.prototype.updateSelected = function () { + if (!initBodyCaller) { + _updateSelected.apply(this, Array.prototype.slice.apply(arguments)); + + if (this.options.groupBy && this.options.groupByField !== '') { + this.$selectGroup.forEach(function (item) { + var checkGroup = item.item.filter(':enabled').length === item.item.filter(':enabled').filter(':checked').length; + + item.group.prop('checked', checkGroup); + }); + } + } + }; + + BootstrapTable.prototype.getGroupSelections = function (index) { + var that = this; + + return $.grep(this.data, function (row) { + return row[that.header.stateField] && row._data['parent-index'] === index; + }); + }; + + BootstrapTable.prototype.checkGroup = function (index) { + this.checkGroup_(index, true); + }; + + BootstrapTable.prototype.uncheckGroup = function (index) { + this.checkGroup_(index, false); + }; + + BootstrapTable.prototype.checkGroup_ = function (index, checked) { + var rows; + var filter = function filter() { + return $(this).closest('tr').data('parent-index') === index; + }; + + if (!checked) { + rows = this.getGroupSelections(index); + } + + this.$selectItem.filter(filter).prop('checked', checked); + + this.updateRows(); + this.updateSelected(); + if (checked) { + rows = this.getGroupSelections(index); + } + this.trigger(checked ? 'check-all' : 'uncheck-all', rows); + }; + })(jQuery); +}); \ No newline at end of file diff --git a/InvenTree/static/script/bootstrap/bootstrap-table.js b/InvenTree/static/script/bootstrap/bootstrap-table.js new file mode 100644 index 0000000000..4567f29ac9 --- /dev/null +++ b/InvenTree/static/script/bootstrap/bootstrap-table.js @@ -0,0 +1,3770 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.bootstrapTable = mod.exports; + } +})(this, function () { + 'use strict'; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var _slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; + }(); + + function _toConsumableArray(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; + } + + return arr2; + } else { + return Array.from(arr); + } + } + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + /** + * @author zhixin wen + * version: 1.14.2 + * https://github.com/wenzhixin/bootstrap-table/ + */ + + (function ($) { + // TOOLS DEFINITION + // ====================== + + var bootstrapVersion = 4; + try { + var rawVersion = $.fn.dropdown.Constructor.VERSION; + + // Only try to parse VERSION if is is defined. + // It is undefined in older versions of Bootstrap (tested with 3.1.1). + if (rawVersion !== undefined) { + bootstrapVersion = parseInt(rawVersion, 10); + } + } catch (e) { + // ignore + } + + var constants = { + 3: { + theme: 'bootstrap3', + iconsPrefix: 'glyphicon', + icons: { + paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down', + paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up', + refresh: 'glyphicon-refresh icon-refresh', + toggleOff: 'glyphicon-list-alt icon-list-alt', + toggleOn: 'glyphicon-list-alt icon-list-alt', + columns: 'glyphicon-th icon-th', + detailOpen: 'glyphicon-plus icon-plus', + detailClose: 'glyphicon-minus icon-minus', + fullscreen: 'glyphicon-fullscreen' + }, + classes: { + buttonsPrefix: 'btn', + buttons: 'default', + buttonsGroup: 'btn-group', + buttonsDropdown: 'btn-group', + pull: 'pull', + inputGroup: '', + input: 'form-control', + paginationDropdown: 'btn-group dropdown', + dropup: 'dropup', + dropdownActive: 'active', + paginationActive: 'active' + }, + html: { + toobarDropdow: [''], + toobarDropdowItem: '
  • ', + pageDropdown: [''], + pageDropdownItem: '', + dropdownCaret: '', + pagination: ['
      ', '
    '], + paginationItem: '
  • %s
  • ', + icon: '' + } + }, + 4: { + theme: 'bootstrap4', + iconsPrefix: 'fa', + icons: { + paginationSwitchDown: 'fa-caret-square-down', + paginationSwitchUp: 'fa-caret-square-up', + refresh: 'fa-sync', + toggleOff: 'fa-toggle-off', + toggleOn: 'fa-toggle-on', + columns: 'fa-th-list', + fullscreen: 'fa-arrows-alt', + detailOpen: 'fa-plus', + detailClose: 'fa-minus' + }, + classes: { + buttonsPrefix: 'btn', + buttons: 'secondary', + buttonsGroup: 'btn-group', + buttonsDropdown: 'btn-group', + pull: 'float', + inputGroup: '', + input: 'form-control', + paginationDropdown: 'btn-group dropdown', + dropup: 'dropup', + dropdownActive: 'active', + paginationActive: 'active' + }, + html: { + toobarDropdow: [''], + toobarDropdowItem: '', + pageDropdown: [''], + pageDropdownItem: '%s', + dropdownCaret: '', + pagination: ['
      ', '
    '], + paginationItem: '
  • %s
  • ', + icon: '' + } + } + }[bootstrapVersion]; + + var Utils = { + bootstrapVersion: bootstrapVersion, + + sprintf: function sprintf(_str) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var flag = true; + var i = 0; + + var str = _str.replace(/%s/g, function () { + var arg = args[i++]; + + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; + }, + isEmptyObject: function isEmptyObject() { + var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + return function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(obj).length === 0 && obj.constructor === Object; + }, + isNumeric: function isNumeric(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }, + getFieldTitle: function getFieldTitle(list, value) { + for (var _iterator = list, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var item = _ref; + + if (item.field === value) { + return item.title; + } + } + return ''; + }, + setFieldIndex: function setFieldIndex(columns) { + var totalCol = 0; + var flag = []; + + for (var _iterator2 = columns[0], _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var column = _ref2; + + totalCol += column.colspan || 1; + } + + for (var i = 0; i < columns.length; i++) { + flag[i] = []; + for (var j = 0; j < totalCol; j++) { + flag[i][j] = false; + } + } + + for (var _i3 = 0; _i3 < columns.length; _i3++) { + for (var _iterator3 = columns[_i3], _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i4 >= _iterator3.length) break; + _ref3 = _iterator3[_i4++]; + } else { + _i4 = _iterator3.next(); + if (_i4.done) break; + _ref3 = _i4.value; + } + + var r = _ref3; + + var rowspan = r.rowspan || 1; + var colspan = r.colspan || 1; + var index = flag[_i3].indexOf(false); + + if (colspan === 1) { + r.fieldIndex = index; + // when field is undefined, use index instead + if (typeof r.field === 'undefined') { + r.field = index; + } + } + + for (var k = 0; k < rowspan; k++) { + flag[_i3 + k][index] = true; + } + for (var _k = 0; _k < colspan; _k++) { + flag[_i3][index + _k] = true; + } + } + } + }, + getScrollBarWidth: function getScrollBarWidth() { + if (this.cachedWidth === undefined) { + var $inner = $('
    ').addClass('fixed-table-scroll-inner'); + var $outer = $('
    ').addClass('fixed-table-scroll-outer'); + + $outer.append($inner); + $('body').append($outer); + + var w1 = $inner[0].offsetWidth; + $outer.css('overflow', 'scroll'); + var w2 = $inner[0].offsetWidth; + + if (w1 === w2) { + w2 = $outer[0].clientWidth; + } + + $outer.remove(); + this.cachedWidth = w1 - w2; + } + return this.cachedWidth; + }, + calculateObjectValue: function calculateObjectValue(self, name, args, defaultValue) { + var func = name; + + if (typeof name === 'string') { + // support obj.func1.func2 + var names = name.split('.'); + + if (names.length > 1) { + func = window; + for (var _iterator4 = names, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i5 >= _iterator4.length) break; + _ref4 = _iterator4[_i5++]; + } else { + _i5 = _iterator4.next(); + if (_i5.done) break; + _ref4 = _i5.value; + } + + var f = _ref4; + + func = func[f]; + } + } else { + func = window[name]; + } + } + + if (func !== null && (typeof func === 'undefined' ? 'undefined' : _typeof(func)) === 'object') { + return func; + } + + if (typeof func === 'function') { + return func.apply(self, args || []); + } + + if (!func && typeof name === 'string' && this.sprintf.apply(this, [name].concat(_toConsumableArray(args)))) { + return this.sprintf.apply(this, [name].concat(_toConsumableArray(args))); + } + + return defaultValue; + }, + compareObjects: function compareObjects(objectA, objectB, compareLength) { + var aKeys = Object.keys(objectA); + var bKeys = Object.keys(objectB); + + if (compareLength && aKeys.length !== bKeys.length) { + return false; + } + + for (var _iterator5 = aKeys, _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i6 >= _iterator5.length) break; + _ref5 = _iterator5[_i6++]; + } else { + _i6 = _iterator5.next(); + if (_i6.done) break; + _ref5 = _i6.value; + } + + var key = _ref5; + + if (bKeys.indexOf(key) !== -1 && objectA[key] !== objectB[key]) { + return false; + } + } + + return true; + }, + escapeHTML: function escapeHTML(text) { + if (typeof text === 'string') { + return text.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/`/g, '`'); + } + return text; + }, + getRealDataAttr: function getRealDataAttr(dataAttr) { + for (var _iterator6 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(dataAttr), _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i7 >= _iterator6.length) break; + _ref6 = _iterator6[_i7++]; + } else { + _i7 = _iterator6.next(); + if (_i7.done) break; + _ref6 = _i7.value; + } + + var _ref7 = _ref6, + _ref8 = _slicedToArray(_ref7, 2), + attr = _ref8[0], + value = _ref8[1]; + + var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase(); + if (auxAttr !== attr) { + dataAttr[auxAttr] = value; + delete dataAttr[attr]; + } + } + return dataAttr; + }, + getItemField: function getItemField(item, field, escape) { + var value = item; + + if (typeof field !== 'string' || item.hasOwnProperty(field)) { + return escape ? this.escapeHTML(item[field]) : item[field]; + } + + var props = field.split('.'); + for (var _iterator7 = props, _isArray7 = Array.isArray(_iterator7), _i8 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref9; + + if (_isArray7) { + if (_i8 >= _iterator7.length) break; + _ref9 = _iterator7[_i8++]; + } else { + _i8 = _iterator7.next(); + if (_i8.done) break; + _ref9 = _i8.value; + } + + var p = _ref9; + + value = value && value[p]; + } + return escape ? this.escapeHTML(value) : value; + }, + isIEBrowser: function isIEBrowser() { + return navigator.userAgent.indexOf('MSIE ') !== -1 || /Trident.*rv:11\./.test(navigator.userAgent); + }, + findIndex: function findIndex(items, item) { + for (var _iterator8 = items, _isArray8 = Array.isArray(_iterator8), _i9 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref10; + + if (_isArray8) { + if (_i9 >= _iterator8.length) break; + _ref10 = _iterator8[_i9++]; + } else { + _i9 = _iterator8.next(); + if (_i9.done) break; + _ref10 = _i9.value; + } + + var it = _ref10; + + if (JSON.stringify(it) === JSON.stringify(item)) { + return items.indexOf(it); + } + } + return -1; + } + }; + + // BOOTSTRAP TABLE CLASS DEFINITION + // ====================== + + var DEFAULTS = { + height: undefined, + classes: 'table table-bordered table-hover', + theadClasses: '', + rowStyle: function rowStyle(row, index) { + return {}; + }, + rowAttributes: function rowAttributes(row, index) { + return {}; + }, + + undefinedText: '-', + locale: undefined, + sortable: true, + sortClass: undefined, + silentSort: true, + sortName: undefined, + sortOrder: 'asc', + sortStable: false, + rememberOrder: false, + customSort: undefined, + columns: [[]], + data: [], + url: undefined, + method: 'get', + cache: true, + contentType: 'application/json', + dataType: 'json', + ajax: undefined, + ajaxOptions: {}, + queryParams: function queryParams(params) { + return params; + }, + + queryParamsType: 'limit', responseHandler: function responseHandler(res) { + return res; + }, + + totalField: 'total', + dataField: 'rows', + pagination: false, + onlyInfoPagination: false, + paginationLoop: true, + sidePagination: 'client', // client or server + totalRows: 0, + pageNumber: 1, + pageSize: 10, + pageList: [10, 25, 50, 100], + paginationHAlign: 'right', // right, left + paginationVAlign: 'bottom', // bottom, top, both + paginationDetailHAlign: 'left', // right, left + paginationPreText: '‹', + paginationNextText: '›', + paginationSuccessivelySize: 5, // Maximum successively number of pages in a row + paginationPagesBySide: 1, // Number of pages on each side (right, left) of the current page. + paginationUseIntermediate: false, // Calculate intermediate pages for quick access + search: false, + searchOnEnterKey: false, + strictSearch: false, + trimOnSearch: true, + searchAlign: 'right', + searchTimeOut: 500, + searchText: '', + customSearch: undefined, + showHeader: true, + showFooter: false, + footerStyle: function footerStyle(row, index) { + return {}; + }, + + showColumns: false, + minimumCountColumns: 1, + showPaginationSwitch: false, + showRefresh: false, + showToggle: false, + showFullscreen: false, + smartDisplay: true, + escape: false, + idField: undefined, + selectItemName: 'btSelectItem', + clickToSelect: false, + ignoreClickToSelectOn: function ignoreClickToSelectOn(_ref11) { + var tagName = _ref11.tagName; + + return ['A', 'BUTTON'].indexOf(tagName) !== -1; + }, + + singleSelect: false, + checkboxHeader: true, + maintainSelected: false, + uniqueId: undefined, + cardView: false, + detailView: false, + detailFormatter: function detailFormatter(index, row) { + return ''; + }, + detailFilter: function detailFilter(index, row) { + return true; + }, + + toolbar: undefined, + toolbarAlign: 'left', + buttonsToolbar: undefined, + buttonsAlign: 'right', + buttonsPrefix: constants.classes.buttonsPrefix, + buttonsClass: constants.classes.buttons, + icons: constants.icons, + iconSize: undefined, + iconsPrefix: constants.iconsPrefix, onAll: function onAll(name, args) { + return false; + }, + onClickCell: function onClickCell(field, value, row, $element) { + return false; + }, + onDblClickCell: function onDblClickCell(field, value, row, $element) { + return false; + }, + onClickRow: function onClickRow(item, $element) { + return false; + }, + onDblClickRow: function onDblClickRow(item, $element) { + return false; + }, + onSort: function onSort(name, order) { + return false; + }, + onCheck: function onCheck(row) { + return false; + }, + onUncheck: function onUncheck(row) { + return false; + }, + onCheckAll: function onCheckAll(rows) { + return false; + }, + onUncheckAll: function onUncheckAll(rows) { + return false; + }, + onCheckSome: function onCheckSome(rows) { + return false; + }, + onUncheckSome: function onUncheckSome(rows) { + return false; + }, + onLoadSuccess: function onLoadSuccess(data) { + return false; + }, + onLoadError: function onLoadError(status) { + return false; + }, + onColumnSwitch: function onColumnSwitch(field, checked) { + return false; + }, + onPageChange: function onPageChange(number, size) { + return false; + }, + onSearch: function onSearch(text) { + return false; + }, + onToggle: function onToggle(cardView) { + return false; + }, + onPreBody: function onPreBody(data) { + return false; + }, + onPostBody: function onPostBody() { + return false; + }, + onPostHeader: function onPostHeader() { + return false; + }, + onExpandRow: function onExpandRow(index, row, $detail) { + return false; + }, + onCollapseRow: function onCollapseRow(index, row) { + return false; + }, + onRefreshOptions: function onRefreshOptions(options) { + return false; + }, + onRefresh: function onRefresh(params) { + return false; + }, + onResetView: function onResetView() { + return false; + }, + onScrollBody: function onScrollBody() { + return false; + } + }; + + var LOCALES = {}; + LOCALES['en-US'] = LOCALES.en = { + formatLoadingMessage: function formatLoadingMessage() { + return 'Loading, please wait'; + }, + formatRecordsPerPage: function formatRecordsPerPage(pageNumber) { + return pageNumber + ' rows per page'; + }, + formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows) { + return 'Showing ' + pageFrom + ' to ' + pageTo + ' of ' + totalRows + ' rows'; + }, + formatDetailPagination: function formatDetailPagination(totalRows) { + return 'Showing ' + totalRows + ' rows'; + }, + formatSearch: function formatSearch() { + return 'Search'; + }, + formatNoMatches: function formatNoMatches() { + return 'No matching records found'; + }, + formatPaginationSwitch: function formatPaginationSwitch() { + return 'Hide/Show pagination'; + }, + formatRefresh: function formatRefresh() { + return 'Refresh'; + }, + formatToggle: function formatToggle() { + return 'Toggle'; + }, + formatColumns: function formatColumns() { + return 'Columns'; + }, + formatFullscreen: function formatFullscreen() { + return 'Fullscreen'; + }, + formatAllRows: function formatAllRows() { + return 'All'; + } + }; + + $.extend(DEFAULTS, LOCALES['en-US']); + + var COLUMN_DEFAULTS = { + radio: false, + checkbox: false, + checkboxEnabled: true, + field: undefined, + title: undefined, + titleTooltip: undefined, + 'class': undefined, + align: undefined, // left, right, center + halign: undefined, // left, right, center + falign: undefined, // left, right, center + valign: undefined, // top, middle, bottom + width: undefined, + sortable: false, + order: 'asc', // asc, desc + visible: true, + switchable: true, + clickToSelect: true, + formatter: undefined, + footerFormatter: undefined, + events: undefined, + sorter: undefined, + sortName: undefined, + cellStyle: undefined, + searchable: true, + searchFormatter: true, + cardVisible: true, + escape: false, + showSelectTitle: false + }; + + var EVENTS = { + 'all.bs.table': 'onAll', + 'click-cell.bs.table': 'onClickCell', + 'dbl-click-cell.bs.table': 'onDblClickCell', + 'click-row.bs.table': 'onClickRow', + 'dbl-click-row.bs.table': 'onDblClickRow', + 'sort.bs.table': 'onSort', + 'check.bs.table': 'onCheck', + 'uncheck.bs.table': 'onUncheck', + 'check-all.bs.table': 'onCheckAll', + 'uncheck-all.bs.table': 'onUncheckAll', + 'check-some.bs.table': 'onCheckSome', + 'uncheck-some.bs.table': 'onUncheckSome', + 'load-success.bs.table': 'onLoadSuccess', + 'load-error.bs.table': 'onLoadError', + 'column-switch.bs.table': 'onColumnSwitch', + 'page-change.bs.table': 'onPageChange', + 'search.bs.table': 'onSearch', + 'toggle.bs.table': 'onToggle', + 'pre-body.bs.table': 'onPreBody', + 'post-body.bs.table': 'onPostBody', + 'post-header.bs.table': 'onPostHeader', + 'expand-row.bs.table': 'onExpandRow', + 'collapse-row.bs.table': 'onCollapseRow', + 'refresh-options.bs.table': 'onRefreshOptions', + 'reset-view.bs.table': 'onResetView', + 'refresh.bs.table': 'onRefresh', + 'scroll-body.bs.table': 'onScrollBody' + }; + + var BootstrapTable = function () { + function BootstrapTable(el, options) { + _classCallCheck(this, BootstrapTable); + + this.options = options; + this.$el = $(el); + this.$el_ = this.$el.clone(); + this.timeoutId_ = 0; + this.timeoutFooter_ = 0; + + this.init(); + } + + _createClass(BootstrapTable, [{ + key: 'init', + value: function init() { + this.initConstants(); + this.initLocale(); + this.initContainer(); + this.initTable(); + this.initHeader(); + this.initData(); + this.initHiddenRows(); + this.initFooter(); + this.initToolbar(); + this.initPagination(); + this.initBody(); + this.initSearchText(); + this.initServer(); + } + }, { + key: 'initConstants', + value: function initConstants() { + var o = this.options; + this.constants = constants; + + var buttonsPrefix = o.buttonsPrefix ? o.buttonsPrefix + '-' : ''; + this.constants.buttonsClass = [o.buttonsPrefix, buttonsPrefix + o.buttonsClass, Utils.sprintf(buttonsPrefix + '%s', o.iconSize)].join(' ').trim(); + } + }, { + key: 'initLocale', + value: function initLocale() { + if (this.options.locale) { + var locales = $.fn.bootstrapTable.locales; + var parts = this.options.locale.split(/-|_/); + + parts[0] = parts[0].toLowerCase(); + if (parts[1]) { + parts[1] = parts[1].toUpperCase(); + } + + if (locales[this.options.locale]) { + $.extend(this.options, locales[this.options.locale]); + } else if (locales[parts.join('-')]) { + $.extend(this.options, locales[parts.join('-')]); + } else if (locales[parts[0]]) { + $.extend(this.options, locales[parts[0]]); + } + } + } + }, { + key: 'initContainer', + value: function initContainer() { + var topPagination = ['top', 'both'].indexOf(this.options.paginationVAlign) !== -1 ? '
    ' : ''; + var bottomPagination = ['bottom', 'both'].indexOf(this.options.paginationVAlign) !== -1 ? '
    ' : ''; + + this.$container = $('\n
    \n
    \n ' + topPagination + '\n
    \n
    \n
    \n
    \n \n ' + this.options.formatLoadingMessage() + '\n \n \n
    \n
    \n \n
    \n ' + bottomPagination + '\n
    \n '); + + this.$container.insertAfter(this.$el); + this.$tableContainer = this.$container.find('.fixed-table-container'); + this.$tableHeader = this.$container.find('.fixed-table-header'); + this.$tableBody = this.$container.find('.fixed-table-body'); + this.$tableLoading = this.$container.find('.fixed-table-loading'); + this.$tableFooter = this.$container.find('.fixed-table-footer'); + // checking if custom table-toolbar exists or not + if (this.options.buttonsToolbar) { + this.$toolbar = $('body').find(this.options.buttonsToolbar); + } else { + this.$toolbar = this.$container.find('.fixed-table-toolbar'); + } + this.$pagination = this.$container.find('.fixed-table-pagination'); + + this.$tableBody.append(this.$el); + this.$container.after('
    '); + + this.$el.addClass(this.options.classes); + this.$tableLoading.addClass(this.options.classes); + + if (this.options.height) { + this.$tableContainer.addClass('fixed-height'); + + if (this.options.showFooter) { + this.$tableContainer.addClass('has-footer'); + } + + if (this.options.classes.split(' ').indexOf('table-bordered') !== -1) { + this.$tableBody.append('
    '); + this.$tableBorder = this.$tableBody.find('.fixed-table-border'); + this.$tableLoading.addClass('fixed-table-border'); + } + } + } + }, { + key: 'initTable', + value: function initTable() { + var _this = this; + + var columns = []; + var data = []; + + this.$header = this.$el.find('>thead'); + if (!this.$header.length) { + this.$header = $('').appendTo(this.$el); + } else if (this.options.theadClasses) { + this.$header.addClass(this.options.theadClasses); + } + this.$header.find('tr').each(function (i, el) { + var column = []; + + $(el).find('th').each(function (i, el) { + // #2014: getFieldIndex and elsewhere assume this is string, causes issues if not + if (typeof $(el).data('field') !== 'undefined') { + $(el).data('field', '' + $(el).data('field')); + } + column.push($.extend({}, { + title: $(el).html(), + 'class': $(el).attr('class'), + titleTooltip: $(el).attr('title'), + rowspan: $(el).attr('rowspan') ? +$(el).attr('rowspan') : undefined, + colspan: $(el).attr('colspan') ? +$(el).attr('colspan') : undefined + }, $(el).data())); + }); + columns.push(column); + }); + + if (!Array.isArray(this.options.columns[0])) { + this.options.columns = [this.options.columns]; + } + + this.options.columns = $.extend(true, [], columns, this.options.columns); + this.columns = []; + this.fieldsColumnsIndex = []; + + Utils.setFieldIndex(this.options.columns); + + this.options.columns.forEach(function (columns, i) { + columns.forEach(function (_column, j) { + var column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, _column); + + if (typeof column.fieldIndex !== 'undefined') { + _this.columns[column.fieldIndex] = column; + _this.fieldsColumnsIndex[column.field] = column.fieldIndex; + } + + _this.options.columns[i][j] = column; + }); + }); + + // if options.data is setting, do not process tbody data + if (this.options.data.length) { + return; + } + + var m = []; + this.$el.find('>tbody>tr').each(function (y, el) { + var row = {}; + + // save tr's id, class and data-* attributes + row._id = $(el).attr('id'); + row._class = $(el).attr('class'); + row._data = Utils.getRealDataAttr($(el).data()); + + $(el).find('>td').each(function (_x, el) { + var cspan = +$(el).attr('colspan') || 1; + var rspan = +$(el).attr('rowspan') || 1; + var x = _x; + + // skip already occupied cells in current row + for (; m[y] && m[y][x]; x++) {} + // ignore + + + // mark matrix elements occupied by current cell with true + for (var tx = x; tx < x + cspan; tx++) { + for (var ty = y; ty < y + rspan; ty++) { + if (!m[ty]) { + // fill missing rows + m[ty] = []; + } + m[ty][tx] = true; + } + } + + var field = _this.columns[x].field; + + row[field] = $(el).html().trim(); + // save td's id, class and data-* attributes + row['_' + field + '_id'] = $(el).attr('id'); + row['_' + field + '_class'] = $(el).attr('class'); + row['_' + field + '_rowspan'] = $(el).attr('rowspan'); + row['_' + field + '_colspan'] = $(el).attr('colspan'); + row['_' + field + '_title'] = $(el).attr('title'); + row['_' + field + '_data'] = Utils.getRealDataAttr($(el).data()); + }); + data.push(row); + }); + this.options.data = data; + if (data.length) { + this.fromHtml = true; + } + } + }, { + key: 'initHeader', + value: function initHeader() { + var _this2 = this; + + var visibleColumns = {}; + var html = []; + + this.header = { + fields: [], + styles: [], + classes: [], + formatters: [], + events: [], + sorters: [], + sortNames: [], + cellStyles: [], + searchables: [] + }; + + this.options.columns.forEach(function (columns, i) { + html.push(''); + + if (i === 0 && !_this2.options.cardView && _this2.options.detailView) { + html.push('\n
    \n \n '); + } + + columns.forEach(function (column, j) { + var text = ''; + + var halign = ''; // header align style + + var align = ''; // body align style + + var style = ''; + var class_ = Utils.sprintf(' class="%s"', column['class']); + var unitWidth = 'px'; + var width = column.width; + + if (column.width !== undefined && !_this2.options.cardView) { + if (typeof column.width === 'string') { + if (column.width.indexOf('%') !== -1) { + unitWidth = '%'; + } + } + } + if (column.width && typeof column.width === 'string') { + width = column.width.replace('%', '').replace('px', ''); + } + + halign = Utils.sprintf('text-align: %s; ', column.halign ? column.halign : column.align); + align = Utils.sprintf('text-align: %s; ', column.align); + style = Utils.sprintf('vertical-align: %s; ', column.valign); + style += Utils.sprintf('width: %s; ', (column.checkbox || column.radio) && !width ? !column.showSelectTitle ? '36px' : undefined : width ? width + unitWidth : undefined); + + if (typeof column.fieldIndex !== 'undefined') { + _this2.header.fields[column.fieldIndex] = column.field; + _this2.header.styles[column.fieldIndex] = align + style; + _this2.header.classes[column.fieldIndex] = class_; + _this2.header.formatters[column.fieldIndex] = column.formatter; + _this2.header.events[column.fieldIndex] = column.events; + _this2.header.sorters[column.fieldIndex] = column.sorter; + _this2.header.sortNames[column.fieldIndex] = column.sortName; + _this2.header.cellStyles[column.fieldIndex] = column.cellStyle; + _this2.header.searchables[column.fieldIndex] = column.searchable; + + if (!column.visible) { + return; + } + + if (_this2.options.cardView && !column.cardVisible) { + return; + } + + visibleColumns[column.field] = column; + } + + html.push(' 0 ? ' data-not-first-th' : '', '>'); + + html.push(Utils.sprintf('
    ', _this2.options.sortable && column.sortable ? 'sortable both' : '')); + + text = _this2.options.escape ? Utils.escapeHTML(column.title) : column.title; + + var title = text; + if (column.checkbox) { + text = ''; + if (!_this2.options.singleSelect && _this2.options.checkboxHeader) { + text = ''; + } + _this2.header.stateField = column.field; + } + if (column.radio) { + text = ''; + _this2.header.stateField = column.field; + _this2.options.singleSelect = true; + } + if (!text && column.showSelectTitle) { + text += title; + } + + html.push(text); + html.push('
    '); + html.push('
    '); + html.push('
    '); + html.push(''); + }); + html.push(''); + }); + + this.$header.html(html.join('')); + this.$header.find('th[data-field]').each(function (i, el) { + $(el).data(visibleColumns[$(el).data('field')]); + }); + this.$container.off('click', '.th-inner').on('click', '.th-inner', function (e) { + var $this = $(e.currentTarget); + + if (_this2.options.detailView && !$this.parent().hasClass('bs-checkbox')) { + if ($this.closest('.bootstrap-table')[0] !== _this2.$container[0]) { + return false; + } + } + + if (_this2.options.sortable && $this.parent().data().sortable) { + _this2.onSort(e); + } + }); + + this.$header.children().children().off('keypress').on('keypress', function (e) { + if (_this2.options.sortable && $(e.currentTarget).data().sortable) { + var code = e.keyCode || e.which; + if (code === 13) { + // Enter keycode + _this2.onSort(e); + } + } + }); + + $(window).off('resize.bootstrap-table'); + if (!this.options.showHeader || this.options.cardView) { + this.$header.hide(); + this.$tableHeader.hide(); + this.$tableLoading.css('top', 0); + } else { + this.$header.show(); + this.$tableHeader.show(); + this.$tableLoading.css('top', this.$header.outerHeight() + 1); + // Assign the correct sortable arrow + this.getCaret(); + $(window).on('resize.bootstrap-table', function (e) { + return _this2.resetWidth(e); + }); + } + + this.$selectAll = this.$header.find('[name="btSelectAll"]'); + this.$selectAll.off('click').on('click', function (_ref12) { + var currentTarget = _ref12.currentTarget; + + var checked = $(currentTarget).prop('checked'); + _this2[checked ? 'checkAll' : 'uncheckAll'](); + _this2.updateSelected(); + }); + } + }, { + key: 'initFooter', + value: function initFooter() { + if (!this.options.showFooter || this.options.cardView) { + this.$tableFooter.hide(); + } else { + this.$tableFooter.show(); + } + } + }, { + key: 'initData', + value: function initData(data, type) { + if (type === 'append') { + this.options.data = this.options.data.concat(data); + } else if (type === 'prepend') { + this.options.data = [].concat(data).concat(this.options.data); + } else { + this.options.data = data || this.options.data; + } + + this.data = this.options.data; + + if (this.options.sidePagination === 'server') { + return; + } + this.initSort(); + } + }, { + key: 'initSort', + value: function initSort() { + var _this3 = this; + + var name = this.options.sortName; + var order = this.options.sortOrder === 'desc' ? -1 : 1; + var index = this.header.fields.indexOf(this.options.sortName); + var timeoutId = 0; + + if (index !== -1) { + if (this.options.sortStable) { + this.data.forEach(function (row, i) { + if (!row.hasOwnProperty('_position')) { + row._position = i; + } + }); + } + + if (this.options.customSort) { + Utils.calculateObjectValue(this.options, this.options.customSort, [this.options.sortName, this.options.sortOrder, this.data]); + } else { + this.data.sort(function (a, b) { + if (_this3.header.sortNames[index]) { + name = _this3.header.sortNames[index]; + } + var aa = Utils.getItemField(a, name, _this3.options.escape); + var bb = Utils.getItemField(b, name, _this3.options.escape); + var value = Utils.calculateObjectValue(_this3.header, _this3.header.sorters[index], [aa, bb, a, b]); + + if (value !== undefined) { + if (_this3.options.sortStable && value === 0) { + return order * (a._position - b._position); + } + return order * value; + } + + // Fix #161: undefined or null string sort bug. + if (aa === undefined || aa === null) { + aa = ''; + } + if (bb === undefined || bb === null) { + bb = ''; + } + + if (_this3.options.sortStable && aa === bb) { + aa = a._position; + bb = b._position; + } + + // IF both values are numeric, do a numeric comparison + if (Utils.isNumeric(aa) && Utils.isNumeric(bb)) { + // Convert numerical values form string to float. + aa = parseFloat(aa); + bb = parseFloat(bb); + if (aa < bb) { + return order * -1; + } + if (aa > bb) { + return order; + } + return 0; + } + + if (aa === bb) { + return 0; + } + + // If value is not a string, convert to string + if (typeof aa !== 'string') { + aa = aa.toString(); + } + + if (aa.localeCompare(bb) === -1) { + return order * -1; + } + + return order; + }); + } + + if (this.options.sortClass !== undefined) { + clearTimeout(timeoutId); + timeoutId = setTimeout(function () { + _this3.$el.removeClass(_this3.options.sortClass); + var index = _this3.$header.find('[data-field="' + _this3.options.sortName + '"]').index(); + _this3.$el.find('tr td:nth-child(' + (index + 1) + ')').addClass(_this3.options.sortClass); + }, 250); + } + } + } + }, { + key: 'onSort', + value: function onSort(_ref13) { + var type = _ref13.type, + currentTarget = _ref13.currentTarget; + + var $this = type === 'keypress' ? $(currentTarget) : $(currentTarget).parent(); + var $this_ = this.$header.find('th').eq($this.index()); + + this.$header.add(this.$header_).find('span.order').remove(); + + if (this.options.sortName === $this.data('field')) { + this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + this.options.sortName = $this.data('field'); + if (this.options.rememberOrder) { + this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc'; + } else { + this.options.sortOrder = this.columns[this.fieldsColumnsIndex[$this.data('field')]].order; + } + } + this.trigger('sort', this.options.sortName, this.options.sortOrder); + + $this.add($this_).data('order', this.options.sortOrder); + + // Assign the correct sortable arrow + this.getCaret(); + + if (this.options.sidePagination === 'server') { + this.initServer(this.options.silentSort); + return; + } + + this.initSort(); + this.initBody(); + } + }, { + key: 'initToolbar', + value: function initToolbar() { + var _this4 = this; + + var o = this.options; + var html = []; + var timeoutId = 0; + var $keepOpen = void 0; + var $search = void 0; + var switchableCount = 0; + + if (this.$toolbar.find('.bs-bars').children().length) { + $('body').append($(o.toolbar)); + } + this.$toolbar.html(''); + + if (typeof o.toolbar === 'string' || _typeof(o.toolbar) === 'object') { + $(Utils.sprintf('
    ', this.constants.classes.pull, o.toolbarAlign)).appendTo(this.$toolbar).append($(o.toolbar)); + } + + // showColumns, showToggle, showRefresh + html = ['
    ']; + + if (typeof o.icons === 'string') { + o.icons = Utils.calculateObjectValue(null, o.icons); + } + + if (o.showPaginationSwitch) { + html.push(''); + } + + if (o.showRefresh) { + html.push(''); + } + + if (o.showToggle) { + html.push(''); + } + + if (o.showFullscreen) { + html.push(''); + } + + if (o.showColumns) { + html.push('
    \n \n ' + this.constants.html.toobarDropdow[0]); + + this.columns.forEach(function (column, i) { + if (column.radio || column.checkbox) { + return; + } + + if (o.cardView && !column.cardVisible) { + return; + } + + var checked = column.visible ? ' checked="checked"' : ''; + + if (column.switchable) { + html.push(Utils.sprintf(_this4.constants.html.toobarDropdowItem, Utils.sprintf(' %s', column.field, i, checked, column.title))); + switchableCount++; + } + }); + html.push(this.constants.html.toobarDropdow[1], '
    '); + } + + html.push('
    '); + + // Fix #188: this.showToolbar is for extensions + if (this.showToolbar || html.length > 2) { + this.$toolbar.append(html.join('')); + } + + if (o.showPaginationSwitch) { + this.$toolbar.find('button[name="paginationSwitch"]').off('click').on('click', function () { + return _this4.togglePagination(); + }); + } + + if (o.showFullscreen) { + this.$toolbar.find('button[name="fullscreen"]').off('click').on('click', function () { + return _this4.toggleFullscreen(); + }); + } + + if (o.showRefresh) { + this.$toolbar.find('button[name="refresh"]').off('click').on('click', function () { + return _this4.refresh(); + }); + } + + if (o.showToggle) { + this.$toolbar.find('button[name="toggle"]').off('click').on('click', function () { + _this4.toggleView(); + }); + } + + if (o.showColumns) { + $keepOpen = this.$toolbar.find('.keep-open'); + + if (switchableCount <= o.minimumCountColumns) { + $keepOpen.find('input').prop('disabled', true); + } + + $keepOpen.find('li, label').off('click').on('click', function (e) { + e.stopImmediatePropagation(); + }); + $keepOpen.find('input').off('click').on('click', function (_ref14) { + var currentTarget = _ref14.currentTarget; + + var $this = $(currentTarget); + + _this4.toggleColumn($this.val(), $this.prop('checked'), false); + _this4.trigger('column-switch', $this.data('field'), $this.prop('checked')); + }); + } + + if (o.search) { + html = []; + html.push(''); + + this.$toolbar.append(html.join('')); + $search = this.$toolbar.find('.search input'); + $search.off('keyup drop blur').on('keyup drop blur', function (event) { + if (o.searchOnEnterKey && event.keyCode !== 13) { + return; + } + + if ([37, 38, 39, 40].indexOf(event.keyCode) !== -1) { + return; + } + + clearTimeout(timeoutId); // doesn't matter if it's 0 + timeoutId = setTimeout(function () { + _this4.onSearch(event); + }, o.searchTimeOut); + }); + + if (Utils.isIEBrowser()) { + $search.off('mouseup').on('mouseup', function (event) { + clearTimeout(timeoutId); // doesn't matter if it's 0 + timeoutId = setTimeout(function () { + _this4.onSearch(event); + }, o.searchTimeOut); + }); + } + } + } + }, { + key: 'onSearch', + value: function onSearch(_ref15) { + var currentTarget = _ref15.currentTarget, + firedByInitSearchText = _ref15.firedByInitSearchText; + + var text = $(currentTarget).val().trim(); + + // trim search input + if (this.options.trimOnSearch && $(currentTarget).val() !== text) { + $(currentTarget).val(text); + } + + if (text === this.searchText) { + return; + } + this.searchText = text; + this.options.searchText = text; + + if (!firedByInitSearchText) { + this.options.pageNumber = 1; + } + this.initSearch(); + if (firedByInitSearchText) { + if (this.options.sidePagination === 'client') { + this.updatePagination(); + } + } else { + this.updatePagination(); + } + this.trigger('search', text); + } + }, { + key: 'initSearch', + value: function initSearch() { + var _this5 = this; + + if (this.options.sidePagination !== 'server') { + if (this.options.customSearch) { + this.data = Utils.calculateObjectValue(this.options, this.options.customSearch, [this.options.data, this.searchText]); + return; + } + + var s = this.searchText && (this.options.escape ? Utils.escapeHTML(this.searchText) : this.searchText).toLowerCase(); + var f = Utils.isEmptyObject(this.filterColumns) ? null : this.filterColumns; + + // Check filter + this.data = f ? this.options.data.filter(function (item, i) { + for (var key in f) { + if (Array.isArray(f[key]) && !(f[key].indexOf(item[key]) !== -1) || !Array.isArray(f[key]) && item[key] !== f[key]) { + return false; + } + } + return true; + }) : this.options.data; + + this.data = s ? this.data.filter(function (item, i) { + for (var j = 0; j < _this5.header.fields.length; j++) { + if (!_this5.header.searchables[j]) { + continue; + } + + var key = Utils.isNumeric(_this5.header.fields[j]) ? parseInt(_this5.header.fields[j], 10) : _this5.header.fields[j]; + var column = _this5.columns[_this5.fieldsColumnsIndex[key]]; + var value = void 0; + + if (typeof key === 'string') { + value = item; + var props = key.split('.'); + for (var _i10 = 0; _i10 < props.length; _i10++) { + if (value[props[_i10]] !== null) { + value = value[props[_i10]]; + } + } + } else { + value = item[key]; + } + + // Fix #142: respect searchForamtter boolean + if (column && column.searchFormatter) { + value = Utils.calculateObjectValue(column, _this5.header.formatters[j], [value, item, i], value); + } + + if (typeof value === 'string' || typeof value === 'number') { + if (_this5.options.strictSearch) { + if (('' + value).toLowerCase() === s) { + return true; + } + } else { + if (('' + value).toLowerCase().indexOf(s) !== -1) { + return true; + } + } + } + } + return false; + }) : this.data; + } + } + }, { + key: 'initPagination', + value: function initPagination() { + var _this6 = this; + + var o = this.options; + if (!o.pagination) { + this.$pagination.hide(); + return; + } + this.$pagination.show(); + + var html = []; + var $allSelected = false; + var i = void 0; + var from = void 0; + var to = void 0; + var $pageList = void 0; + var $pre = void 0; + var $next = void 0; + var $number = void 0; + var data = this.getData(); + var pageList = o.pageList; + + if (o.sidePagination !== 'server') { + o.totalRows = data.length; + } + + this.totalPages = 0; + if (o.totalRows) { + if (o.pageSize === o.formatAllRows()) { + o.pageSize = o.totalRows; + $allSelected = true; + } else if (o.pageSize === o.totalRows) { + // Fix #667 Table with pagination, + // multiple pages and a search this matches to one page throws exception + var pageLst = typeof o.pageList === 'string' ? o.pageList.replace('[', '').replace(']', '').replace(/ /g, '').toLowerCase().split(',') : o.pageList; + if (pageLst.indexOf(o.formatAllRows().toLowerCase()) !== -1) { + $allSelected = true; + } + } + + this.totalPages = ~~((o.totalRows - 1) / o.pageSize) + 1; + + o.totalPages = this.totalPages; + } + if (this.totalPages > 0 && o.pageNumber > this.totalPages) { + o.pageNumber = this.totalPages; + } + + this.pageFrom = (o.pageNumber - 1) * o.pageSize + 1; + this.pageTo = o.pageNumber * o.pageSize; + if (this.pageTo > o.totalRows) { + this.pageTo = o.totalRows; + } + + var paginationInfo = o.onlyInfoPagination ? o.formatDetailPagination(o.totalRows) : o.formatShowingRows(this.pageFrom, this.pageTo, o.totalRows); + + html.push('
    \n \n ' + paginationInfo + '\n '); + + if (!o.onlyInfoPagination) { + html.push(''); + + var pageNumber = ['\n \n ' + this.constants.html.pageDropdown[0]]; + + if (typeof o.pageList === 'string') { + var list = o.pageList.replace('[', '').replace(']', '').replace(/ /g, '').split(','); + + pageList = []; + for (var _iterator9 = list, _isArray9 = Array.isArray(_iterator9), _i11 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref16; + + if (_isArray9) { + if (_i11 >= _iterator9.length) break; + _ref16 = _iterator9[_i11++]; + } else { + _i11 = _iterator9.next(); + if (_i11.done) break; + _ref16 = _i11.value; + } + + var value = _ref16; + + pageList.push(value.toUpperCase() === o.formatAllRows().toUpperCase() || value.toUpperCase() === 'UNLIMITED' ? o.formatAllRows() : +value); + } + } + + pageList.forEach(function (page, i) { + if (!o.smartDisplay || i === 0 || pageList[i - 1] < o.totalRows) { + var active = void 0; + if ($allSelected) { + active = page === o.formatAllRows() ? _this6.constants.classes.dropdownActive : ''; + } else { + active = page === o.pageSize ? _this6.constants.classes.dropdownActive : ''; + } + pageNumber.push(Utils.sprintf(_this6.constants.html.pageDropdownItem, active, page)); + } + }); + pageNumber.push(this.constants.html.pageDropdown[1] + ''); + + html.push(o.formatRecordsPerPage(pageNumber.join(''))); + html.push('
    '); + + html.push(''); + } + this.$pagination.html(html.join('')); + + var dropupClass = ['bottom', 'both'].indexOf(o.paginationVAlign) !== -1 ? ' ' + this.constants.classes.dropup : ''; + this.$pagination.last().find('.page-list > span').addClass(dropupClass); + + if (!o.onlyInfoPagination) { + $pageList = this.$pagination.find('.page-list a'); + $pre = this.$pagination.find('.page-pre'); + $next = this.$pagination.find('.page-next'); + $number = this.$pagination.find('.page-item').not('.page-next, .page-pre'); + + if (o.smartDisplay) { + if (this.totalPages <= 1) { + this.$pagination.find('div.pagination').hide(); + } + if (pageList.length < 2 || o.totalRows <= pageList[0]) { + this.$pagination.find('span.page-list').hide(); + } + + // when data is empty, hide the pagination + this.$pagination[this.getData().length ? 'show' : 'hide'](); + } + + if (!o.paginationLoop) { + if (o.pageNumber === 1) { + $pre.addClass('disabled'); + } + if (o.pageNumber === this.totalPages) { + $next.addClass('disabled'); + } + } + + if ($allSelected) { + o.pageSize = o.formatAllRows(); + } + // removed the events for last and first, onPageNumber executeds the same logic + $pageList.off('click').on('click', function (e) { + return _this6.onPageListChange(e); + }); + $pre.off('click').on('click', function (e) { + return _this6.onPagePre(e); + }); + $next.off('click').on('click', function (e) { + return _this6.onPageNext(e); + }); + $number.off('click').on('click', function (e) { + return _this6.onPageNumber(e); + }); + } + } + }, { + key: 'updatePagination', + value: function updatePagination(event) { + // Fix #171: IE disabled button can be clicked bug. + if (event && $(event.currentTarget).hasClass('disabled')) { + return; + } + + if (!this.options.maintainSelected) { + this.resetRows(); + } + + this.initPagination(); + if (this.options.sidePagination === 'server') { + this.initServer(); + } else { + this.initBody(); + } + + this.trigger('page-change', this.options.pageNumber, this.options.pageSize); + } + }, { + key: 'onPageListChange', + value: function onPageListChange(event) { + event.preventDefault(); + var $this = $(event.currentTarget); + + $this.parent().addClass(this.constants.classes.dropdownActive).siblings().removeClass(this.constants.classes.dropdownActive); + this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? this.options.formatAllRows() : +$this.text(); + this.$toolbar.find('.page-size').text(this.options.pageSize); + + this.updatePagination(event); + return false; + } + }, { + key: 'onPagePre', + value: function onPagePre(event) { + event.preventDefault(); + if (this.options.pageNumber - 1 === 0) { + this.options.pageNumber = this.options.totalPages; + } else { + this.options.pageNumber--; + } + this.updatePagination(event); + return false; + } + }, { + key: 'onPageNext', + value: function onPageNext(event) { + event.preventDefault(); + if (this.options.pageNumber + 1 > this.options.totalPages) { + this.options.pageNumber = 1; + } else { + this.options.pageNumber++; + } + this.updatePagination(event); + return false; + } + }, { + key: 'onPageNumber', + value: function onPageNumber(event) { + event.preventDefault(); + if (this.options.pageNumber === +$(event.currentTarget).text()) { + return; + } + this.options.pageNumber = +$(event.currentTarget).text(); + this.updatePagination(event); + return false; + } + }, { + key: 'initRow', + value: function initRow(item, i, data, parentDom) { + var _this7 = this; + + var html = []; + var style = {}; + var csses = []; + var data_ = ''; + var attributes = {}; + var htmlAttributes = []; + + if (Utils.findIndex(this.hiddenRows, item) > -1) { + return; + } + + style = Utils.calculateObjectValue(this.options, this.options.rowStyle, [item, i], style); + + if (style && style.css) { + for (var _iterator10 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(style.css), _isArray10 = Array.isArray(_iterator10), _i12 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref17; + + if (_isArray10) { + if (_i12 >= _iterator10.length) break; + _ref17 = _iterator10[_i12++]; + } else { + _i12 = _iterator10.next(); + if (_i12.done) break; + _ref17 = _i12.value; + } + + var _ref18 = _ref17, + _ref19 = _slicedToArray(_ref18, 2), + key = _ref19[0], + value = _ref19[1]; + + csses.push(key + ': ' + value); + } + } + + attributes = Utils.calculateObjectValue(this.options, this.options.rowAttributes, [item, i], attributes); + + if (attributes) { + for (var _iterator11 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(attributes), _isArray11 = Array.isArray(_iterator11), _i13 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref20; + + if (_isArray11) { + if (_i13 >= _iterator11.length) break; + _ref20 = _iterator11[_i13++]; + } else { + _i13 = _iterator11.next(); + if (_i13.done) break; + _ref20 = _i13.value; + } + + var _ref21 = _ref20, + _ref22 = _slicedToArray(_ref21, 2), + _key2 = _ref22[0], + _value2 = _ref22[1]; + + htmlAttributes.push(_key2 + '="' + Utils.escapeHTML(_value2) + '"'); + } + } + + if (item._data && !Utils.isEmptyObject(item._data)) { + for (var _iterator12 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(item._data), _isArray12 = Array.isArray(_iterator12), _i14 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref23; + + if (_isArray12) { + if (_i14 >= _iterator12.length) break; + _ref23 = _iterator12[_i14++]; + } else { + _i14 = _iterator12.next(); + if (_i14.done) break; + _ref23 = _i14.value; + } + + var _ref24 = _ref23, + _ref25 = _slicedToArray(_ref24, 2), + k = _ref25[0], + v = _ref25[1]; + + // ignore data-index + if (k === 'index') { + return; + } + data_ += ' data-' + k + '="' + v + '"'; + } + } + + html.push(''); + + if (this.options.cardView) { + html.push('
    '); + } + + if (!this.options.cardView && this.options.detailView) { + html.push(''); + + if (Utils.calculateObjectValue(null, this.options.detailFilter, [i, item])) { + html.push('\n \n ' + Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.icons.detailOpen) + '\n \n '); + } + + html.push(''); + } + + this.header.fields.forEach(function (field, j) { + var text = ''; + var value_ = Utils.getItemField(item, field, _this7.options.escape); + var value = ''; + var type = ''; + var cellStyle = {}; + var id_ = ''; + var class_ = _this7.header.classes[j]; + var style_ = ''; + var data_ = ''; + var rowspan_ = ''; + var colspan_ = ''; + var title_ = ''; + var column = _this7.columns[j]; + + if (_this7.fromHtml && typeof value_ === 'undefined') { + if (!column.checkbox && !column.radio) { + return; + } + } + + if (!column.visible) { + return; + } + + if (_this7.options.cardView && !column.cardVisible) { + return; + } + + if (column.escape) { + value_ = Utils.escapeHTML(value_); + } + + if (csses.concat([_this7.header.styles[j]]).length) { + style_ = ' style="' + csses.concat([_this7.header.styles[j]]).join('; ') + '"'; + } + // handle td's id and class + if (item['_' + field + '_id']) { + id_ = Utils.sprintf(' id="%s"', item['_' + field + '_id']); + } + if (item['_' + field + '_class']) { + class_ = Utils.sprintf(' class="%s"', item['_' + field + '_class']); + } + if (item['_' + field + '_rowspan']) { + rowspan_ = Utils.sprintf(' rowspan="%s"', item['_' + field + '_rowspan']); + } + if (item['_' + field + '_colspan']) { + colspan_ = Utils.sprintf(' colspan="%s"', item['_' + field + '_colspan']); + } + if (item['_' + field + '_title']) { + title_ = Utils.sprintf(' title="%s"', item['_' + field + '_title']); + } + cellStyle = Utils.calculateObjectValue(_this7.header, _this7.header.cellStyles[j], [value_, item, i, field], cellStyle); + if (cellStyle.classes) { + class_ = ' class="' + cellStyle.classes + '"'; + } + if (cellStyle.css) { + var csses_ = []; + for (var _iterator13 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(cellStyle.css), _isArray13 = Array.isArray(_iterator13), _i15 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref26; + + if (_isArray13) { + if (_i15 >= _iterator13.length) break; + _ref26 = _iterator13[_i15++]; + } else { + _i15 = _iterator13.next(); + if (_i15.done) break; + _ref26 = _i15.value; + } + + var _ref27 = _ref26, + _ref28 = _slicedToArray(_ref27, 2), + _key3 = _ref28[0], + _value3 = _ref28[1]; + + csses_.push(_key3 + ': ' + _value3); + } + style_ = ' style="' + csses_.concat(_this7.header.styles[j]).join('; ') + '"'; + } + + value = Utils.calculateObjectValue(column, _this7.header.formatters[j], [value_, item, i, field], value_); + + if (item['_' + field + '_data'] && !Utils.isEmptyObject(item['_' + field + '_data'])) { + for (var _iterator14 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(item['_' + field + '_data']), _isArray14 = Array.isArray(_iterator14), _i16 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref29; + + if (_isArray14) { + if (_i16 >= _iterator14.length) break; + _ref29 = _iterator14[_i16++]; + } else { + _i16 = _iterator14.next(); + if (_i16.done) break; + _ref29 = _i16.value; + } + + var _ref30 = _ref29, + _ref31 = _slicedToArray(_ref30, 2), + _k2 = _ref31[0], + _v = _ref31[1]; + + // ignore data-index + if (_k2 === 'index') { + return; + } + data_ += ' data-' + _k2 + '="' + _v + '"'; + } + } + + if (column.checkbox || column.radio) { + type = column.checkbox ? 'checkbox' : type; + type = column.radio ? 'radio' : type; + + var c = column['class'] || ''; + var isChecked = value === true || value_ || value && value.checked; + var isDisabled = !column.checkboxEnabled || value && value.disabled; + + text = [_this7.options.cardView ? '
    ' : '', '', _this7.header.formatters[j] && typeof value === 'string' ? value : '', _this7.options.cardView ? '
    ' : ''].join(''); + + item[_this7.header.stateField] = value === true || !!value_ || value && value.checked; + } else { + value = typeof value === 'undefined' || value === null ? _this7.options.undefinedText : value; + + if (_this7.options.cardView) { + var cardTitle = _this7.options.showHeader ? '' + Utils.getFieldTitle(_this7.columns, field) + '' : ''; + + text = '
    ' + cardTitle + '' + value + '
    '; + + if (_this7.options.smartDisplay && value === '') { + text = '
    '; + } + } else { + text = '' + value + ''; + } + } + + html.push(text); + }); + + if (this.options.cardView) { + html.push('
    '); + } + html.push(''); + + return html.join(''); + } + }, { + key: 'initBody', + value: function initBody(fixedScroll) { + var _this8 = this; + + var data = this.getData(); + + this.trigger('pre-body', data); + + this.$body = this.$el.find('>tbody'); + if (!this.$body.length) { + this.$body = $('').appendTo(this.$el); + } + + // Fix #389 Bootstrap-table-flatJSON is not working + if (!this.options.pagination || this.options.sidePagination === 'server') { + this.pageFrom = 1; + this.pageTo = data.length; + } + + var trFragments = $(document.createDocumentFragment()); + var hasTr = false; + + for (var i = this.pageFrom - 1; i < this.pageTo; i++) { + var item = data[i]; + var tr = this.initRow(item, i, data, trFragments); + hasTr = hasTr || !!tr; + if (tr && typeof tr === 'string') { + trFragments.append(tr); + } + } + + // show no records + if (!hasTr) { + this.$body.html('' + Utils.sprintf('%s', this.$header.find('th').length, this.options.formatNoMatches()) + ''); + } else { + this.$body.html(trFragments); + } + + if (!fixedScroll) { + this.scrollTo(0); + } + + // click to select by column + this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (_ref32) { + var currentTarget = _ref32.currentTarget, + type = _ref32.type, + target = _ref32.target; + + var $td = $(currentTarget); + var $tr = $td.parent(); + var $cardviewArr = $(target).parents('.card-views').children(); + var $cardviewTarget = $(target).parents('.card-view'); + var item = _this8.data[$tr.data('index')]; + var index = _this8.options.cardView ? $cardviewArr.index($cardviewTarget) : $td[0].cellIndex; + var fields = _this8.getVisibleFields(); + var field = fields[_this8.options.detailView && !_this8.options.cardView ? index - 1 : index]; + var column = _this8.columns[_this8.fieldsColumnsIndex[field]]; + var value = Utils.getItemField(item, field, _this8.options.escape); + + if ($td.find('.detail-icon').length) { + return; + } + + _this8.trigger(type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td); + _this8.trigger(type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr, field); + + // if click to select - then trigger the checkbox/radio click + if (type === 'click' && _this8.options.clickToSelect && column.clickToSelect && !Utils.calculateObjectValue(_this8.options, _this8.options.ignoreClickToSelectOn, [target])) { + var $selectItem = $tr.find(Utils.sprintf('[name="%s"]', _this8.options.selectItemName)); + if ($selectItem.length) { + $selectItem[0].click(); // #144: .trigger('click') bug + } + } + }); + + this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function (e) { + e.preventDefault(); + + var $this = $(e.currentTarget); // Fix #980 Detail view, when searching, returns wrong row + var $tr = $this.parent().parent(); + var index = $tr.data('index'); + var row = data[index]; + + // remove and update + if ($tr.next().is('tr.detail-view')) { + $this.html(Utils.sprintf(_this8.constants.html.icon, _this8.options.iconsPrefix, _this8.options.icons.detailOpen)); + _this8.trigger('collapse-row', index, row, $tr.next()); + $tr.next().remove(); + } else { + $this.html(Utils.sprintf(_this8.constants.html.icon, _this8.options.iconsPrefix, _this8.options.icons.detailClose)); + $tr.after(Utils.sprintf('', $tr.children('td').length)); + var $element = $tr.next().find('td'); + var content = Utils.calculateObjectValue(_this8.options, _this8.options.detailFormatter, [index, row, $element], ''); + if ($element.length === 1) { + $element.append(content); + } + _this8.trigger('expand-row', index, row, $element); + } + _this8.resetView(); + return false; + }); + + this.$selectItem = this.$body.find(Utils.sprintf('[name="%s"]', this.options.selectItemName)); + this.$selectItem.off('click').on('click', function (e) { + e.stopImmediatePropagation(); + + var $this = $(e.currentTarget); + _this8.check_($this.prop('checked'), $this.data('index')); + }); + + this.header.events.forEach(function (_events, i) { + var events = _events; + if (!events) { + return; + } + // fix bug, if events is defined with namespace + if (typeof events === 'string') { + events = Utils.calculateObjectValue(null, events); + } + + var field = _this8.header.fields[i]; + var fieldIndex = _this8.getVisibleFields().indexOf(field); + + if (fieldIndex === -1) { + return; + } + + if (_this8.options.detailView && !_this8.options.cardView) { + fieldIndex += 1; + } + + var _loop = function _loop() { + if (_isArray15) { + if (_i17 >= _iterator15.length) return 'break'; + _ref33 = _iterator15[_i17++]; + } else { + _i17 = _iterator15.next(); + if (_i17.done) return 'break'; + _ref33 = _i17.value; + } + + var _ref34 = _ref33, + _ref35 = _slicedToArray(_ref34, 2), + key = _ref35[0], + event = _ref35[1]; + + _this8.$body.find('>tr:not(.no-records-found)').each(function (i, tr) { + var $tr = $(tr); + var $td = $tr.find(_this8.options.cardView ? '.card-view' : 'td').eq(fieldIndex); + var index = key.indexOf(' '); + var name = key.substring(0, index); + var el = key.substring(index + 1); + + $td.find(el).off(name).on(name, function (e) { + var index = $tr.data('index'); + var row = _this8.data[index]; + var value = row[field]; + + event.apply(_this8, [e, value, row, index]); + }); + }); + }; + + for (var _iterator15 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(events), _isArray15 = Array.isArray(_iterator15), _i17 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref33; + + var _ret = _loop(); + + if (_ret === 'break') break; + } + }); + + this.updateSelected(); + this.resetView(); + + this.trigger('post-body', data); + } + }, { + key: 'initServer', + value: function initServer(silent, query, url) { + var _this9 = this; + + var data = {}; + var index = this.header.fields.indexOf(this.options.sortName); + + var params = { + searchText: this.searchText, + sortName: this.options.sortName, + sortOrder: this.options.sortOrder + }; + + if (this.header.sortNames[index]) { + params.sortName = this.header.sortNames[index]; + } + + if (this.options.pagination && this.options.sidePagination === 'server') { + params.pageSize = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize; + params.pageNumber = this.options.pageNumber; + } + + if (!(url || this.options.url) && !this.options.ajax) { + return; + } + + if (this.options.queryParamsType === 'limit') { + params = { + search: params.searchText, + sort: params.sortName, + order: params.sortOrder + }; + + if (this.options.pagination && this.options.sidePagination === 'server') { + params.offset = this.options.pageSize === this.options.formatAllRows() ? 0 : this.options.pageSize * (this.options.pageNumber - 1); + params.limit = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize; + if (params.limit === 0) { + delete params.limit; + } + } + } + + if (!Utils.isEmptyObject(this.filterColumnsPartial)) { + params.filter = JSON.stringify(this.filterColumnsPartial, null); + } + + data = Utils.calculateObjectValue(this.options, this.options.queryParams, [params], data); + + $.extend(data, query || {}); + + // false to stop request + if (data === false) { + return; + } + + if (!silent) { + this.showLoading(); + } + var request = $.extend({}, Utils.calculateObjectValue(null, this.options.ajaxOptions), { + type: this.options.method, + url: url || this.options.url, + data: this.options.contentType === 'application/json' && this.options.method === 'post' ? JSON.stringify(data) : data, + cache: this.options.cache, + contentType: this.options.contentType, + dataType: this.options.dataType, + success: function success(_res) { + var res = Utils.calculateObjectValue(_this9.options, _this9.options.responseHandler, [_res], _res); + + _this9.load(res); + _this9.trigger('load-success', res); + if (!silent) { + _this9.hideLoading(); + } + }, + error: function error(jqXHR) { + var data = []; + if (_this9.options.sidePagination === 'server') { + data = {}; + data[_this9.options.totalField] = 0; + data[_this9.options.dataField] = []; + } + _this9.load(data); + _this9.trigger('load-error', jqXHR.status, jqXHR); + if (!silent) _this9.$tableLoading.hide(); + } + }); + + if (this.options.ajax) { + Utils.calculateObjectValue(this, this.options.ajax, [request], null); + } else { + if (this._xhr && this._xhr.readyState !== 4) { + this._xhr.abort(); + } + this._xhr = $.ajax(request); + } + + return data; + } + }, { + key: 'initSearchText', + value: function initSearchText() { + if (this.options.search) { + this.searchText = ''; + if (this.options.searchText !== '') { + var $search = this.$toolbar.find('.search input'); + $search.val(this.options.searchText); + this.onSearch({ currentTarget: $search, firedByInitSearchText: true }); + } + } + } + }, { + key: 'getCaret', + value: function getCaret() { + var _this10 = this; + + this.$header.find('th').each(function (i, th) { + $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === _this10.options.sortName ? _this10.options.sortOrder : 'both'); + }); + } + }, { + key: 'updateSelected', + value: function updateSelected() { + var checkAll = this.$selectItem.filter(':enabled').length && this.$selectItem.filter(':enabled').length === this.$selectItem.filter(':enabled').filter(':checked').length; + + this.$selectAll.add(this.$selectAll_).prop('checked', checkAll); + + this.$selectItem.each(function (i, el) { + $(el).closest('tr')[$(el).prop('checked') ? 'addClass' : 'removeClass']('selected'); + }); + } + }, { + key: 'updateRows', + value: function updateRows() { + var _this11 = this; + + this.$selectItem.each(function (i, el) { + _this11.data[$(el).data('index')][_this11.header.stateField] = $(el).prop('checked'); + }); + } + }, { + key: 'resetRows', + value: function resetRows() { + for (var _iterator16 = this.data, _isArray16 = Array.isArray(_iterator16), _i18 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { + var _ref36; + + if (_isArray16) { + if (_i18 >= _iterator16.length) break; + _ref36 = _iterator16[_i18++]; + } else { + _i18 = _iterator16.next(); + if (_i18.done) break; + _ref36 = _i18.value; + } + + var row = _ref36; + + this.$selectAll.prop('checked', false); + this.$selectItem.prop('checked', false); + if (this.header.stateField) { + row[this.header.stateField] = false; + } + } + this.initHiddenRows(); + } + }, { + key: 'trigger', + value: function trigger(_name) { + var _options; + + var name = _name + '.bs.table'; + + for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key4 = 1; _key4 < _len2; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + + (_options = this.options)[BootstrapTable.EVENTS[name]].apply(_options, args); + this.$el.trigger($.Event(name), args); + + this.options.onAll(name, args); + this.$el.trigger($.Event('all.bs.table'), [name, args]); + } + }, { + key: 'resetHeader', + value: function resetHeader() { + var _this12 = this; + + // fix #61: the hidden table reset header bug. + // fix bug: get $el.css('width') error sometime (height = 500) + clearTimeout(this.timeoutId_); + this.timeoutId_ = setTimeout(function () { + return _this12.fitHeader(); + }, this.$el.is(':hidden') ? 100 : 0); + } + }, { + key: 'fitHeader', + value: function fitHeader() { + var _this13 = this; + + if (this.$el.is(':hidden')) { + this.timeoutId_ = setTimeout(function () { + return _this13.fitHeader(); + }, 100); + return; + } + + var fixedBody = this.$tableBody.get(0); + var scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? Utils.getScrollBarWidth() : 0; + + this.$el.css('margin-top', -this.$header.outerHeight()); + + var focused = $(':focus'); + if (focused.length > 0) { + var $th = focused.parents('th'); + if ($th.length > 0) { + var dataField = $th.attr('data-field'); + if (dataField !== undefined) { + var $headerTh = this.$header.find('[data-field=\'' + dataField + '\']'); + if ($headerTh.length > 0) { + $headerTh.find(':input').addClass('focus-temp'); + } + } + } + } + + this.$header_ = this.$header.clone(true, true); + this.$selectAll_ = this.$header_.find('[name="btSelectAll"]'); + this.$tableHeader.css('margin-right', scrollWidth).find('table').css('width', this.$el.outerWidth()).html('').attr('class', this.$el.attr('class')).append(this.$header_); + + this.$tableLoading.css('width', this.$el.outerWidth()); + + var focusedTemp = $('.focus-temp:visible:eq(0)'); + if (focusedTemp.length > 0) { + focusedTemp.focus(); + this.$header.find('.focus-temp').removeClass('focus-temp'); + } + + // fix bug: $.data() is not working as expected after $.append() + this.$header.find('th[data-field]').each(function (i, el) { + _this13.$header_.find(Utils.sprintf('th[data-field="%s"]', $(el).data('field'))).data($(el).data()); + }); + + var visibleFields = this.getVisibleFields(); + var $ths = this.$header_.find('th'); + var $tr = this.$body.find('>tr:first-child:not(.no-records-found)'); + + while ($tr.length && $tr.find('>td[colspan]:not([colspan="1"])').length) { + $tr = $tr.next(); + } + + $tr.find('> *').each(function (i, el) { + var $this = $(el); + var index = i; + + if (_this13.options.detailView && !_this13.options.cardView) { + if (i === 0) { + var $thDetail = $ths.filter('.detail'); + var _zoomWidth = $thDetail.width() - $thDetail.find('.fht-cell').width(); + $thDetail.find('.fht-cell').width($this.innerWidth() - _zoomWidth); + } + index = i - 1; + } + + if (index === -1) { + return; + } + + var $th = _this13.$header_.find(Utils.sprintf('th[data-field="%s"]', visibleFields[index])); + if ($th.length > 1) { + $th = $($ths[$this[0].cellIndex]); + } + + var zoomWidth = $th.width() - $th.find('.fht-cell').width(); + $th.find('.fht-cell').width($this.innerWidth() - zoomWidth); + }); + + this.horizontalScroll(); + this.trigger('post-header'); + } + }, { + key: 'resetFooter', + value: function resetFooter() { + var data = this.getData(); + var html = []; + + if (!this.options.showFooter || this.options.cardView) { + // do nothing + return; + } + + if (!this.options.cardView && this.options.detailView) { + html.push('
    '); + } + + for (var _iterator17 = this.columns, _isArray17 = Array.isArray(_iterator17), _i19 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { + var _ref37; + + if (_isArray17) { + if (_i19 >= _iterator17.length) break; + _ref37 = _iterator17[_i19++]; + } else { + _i19 = _iterator17.next(); + if (_i19.done) break; + _ref37 = _i19.value; + } + + var column = _ref37; + + var falign = ''; + + var valign = ''; + var csses = []; + var style = {}; + var class_ = Utils.sprintf(' class="%s"', column['class']); + + if (!column.visible) { + continue; + } + + if (this.options.cardView && !column.cardVisible) { + return; + } + + falign = Utils.sprintf('text-align: %s; ', column.falign ? column.falign : column.align); + valign = Utils.sprintf('vertical-align: %s; ', column.valign); + + style = Utils.calculateObjectValue(null, this.options.footerStyle, [column]); + + if (style && style.css) { + for (var _iterator18 = function (target) { + return Object.keys(target).map(function (key) { + return [key, target[key]]; + }); + }(style.css), _isArray18 = Array.isArray(_iterator18), _i20 = 0, _iterator18 = _isArray18 ? _iterator18 : _iterator18[Symbol.iterator]();;) { + var _ref38; + + if (_isArray18) { + if (_i20 >= _iterator18.length) break; + _ref38 = _iterator18[_i20++]; + } else { + _i20 = _iterator18.next(); + if (_i20.done) break; + _ref38 = _i20.value; + } + + var _ref39 = _ref38, + _ref40 = _slicedToArray(_ref39, 2), + _key5 = _ref40[0], + value = _ref40[1]; + + csses.push(_key5 + ': ' + value); + } + } + if (style && style.classes) { + class_ = Utils.sprintf(' class="%s"', column['class'] ? [column['class'], style.classes].join(' ') : style.classes); + } + + html.push(''); + html.push('
    '); + + html.push(Utils.calculateObjectValue(column, column.footerFormatter, [data], '')); + + html.push('
    '); + html.push('
    '); + html.push('
    '); + html.push(''); + } + + this.$tableFooter.find('tr').html(html.join('')); + this.$tableFooter.show(); + this.fitFooter(); + } + }, { + key: 'fitFooter', + value: function fitFooter() { + var _this14 = this; + + if (this.$el.is(':hidden')) { + setTimeout(function () { + return _this14.fitFooter(); + }, 100); + return; + } + + var fixedBody = this.$tableBody.get(0); + var scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? Utils.getScrollBarWidth() : 0; + + this.$tableFooter.css('margin-right', scrollWidth).find('table').css('width', this.$el.outerWidth()).attr('class', this.$el.attr('class')); + + var visibleFields = this.getVisibleFields(); + var $ths = this.$tableFooter.find('th'); + var $tr = this.$body.find('>tr:first-child:not(.no-records-found)'); + + while ($tr.length && $tr.find('>td[colspan]:not([colspan="1"])').length) { + $tr = $tr.next(); + } + + $tr.find('> *').each(function (i, el) { + var $this = $(el); + var index = i; + + if (_this14.options.detailView && !_this14.options.cardView) { + if (i === 0) { + var $thDetail = $ths.filter('.detail'); + var _zoomWidth2 = $thDetail.width() - $thDetail.find('.fht-cell').width(); + $thDetail.find('.fht-cell').width($this.innerWidth() - _zoomWidth2); + } + index = i - 1; + } + + if (index === -1) { + return; + } + + var $th = $ths.eq(i); + var zoomWidth = $th.width() - $th.find('.fht-cell').width(); + $th.find('.fht-cell').width($this.innerWidth() - zoomWidth); + }); + + this.horizontalScroll(); + } + }, { + key: 'horizontalScroll', + value: function horizontalScroll() { + var _this15 = this; + + // horizontal scroll event + // TODO: it's probably better improving the layout than binding to scroll event + + this.trigger('scroll-body'); + this.$tableBody.off('scroll').on('scroll', function (_ref41) { + var currentTarget = _ref41.currentTarget; + + if (_this15.options.showHeader && _this15.options.height) { + _this15.$tableHeader.scrollLeft($(currentTarget).scrollLeft()); + } + + if (_this15.options.showFooter && !_this15.options.cardView) { + _this15.$tableFooter.scrollLeft($(currentTarget).scrollLeft()); + } + }); + } + }, { + key: 'toggleColumn', + value: function toggleColumn(index, checked, needUpdate) { + if (index === -1) { + return; + } + this.columns[index].visible = checked; + this.initHeader(); + this.initSearch(); + this.initPagination(); + this.initBody(); + + if (this.options.showColumns) { + var $items = this.$toolbar.find('.keep-open input').prop('disabled', false); + + if (needUpdate) { + $items.filter(Utils.sprintf('[value="%s"]', index)).prop('checked', checked); + } + + if ($items.filter(':checked').length <= this.options.minimumCountColumns) { + $items.filter(':checked').prop('disabled', true); + } + } + } + }, { + key: 'getVisibleFields', + value: function getVisibleFields() { + var visibleFields = []; + + for (var _iterator19 = this.header.fields, _isArray19 = Array.isArray(_iterator19), _i21 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { + var _ref42; + + if (_isArray19) { + if (_i21 >= _iterator19.length) break; + _ref42 = _iterator19[_i21++]; + } else { + _i21 = _iterator19.next(); + if (_i21.done) break; + _ref42 = _i21.value; + } + + var field = _ref42; + + var column = this.columns[this.fieldsColumnsIndex[field]]; + + if (!column.visible) { + continue; + } + visibleFields.push(field); + } + return visibleFields; + } + }, { + key: 'resetView', + value: function resetView(params) { + var padding = 0; + + if (params && params.height) { + this.options.height = params.height; + } + + this.$selectAll.prop('checked', this.$selectItem.length > 0 && this.$selectItem.length === this.$selectItem.filter(':checked').length); + + if (this.options.cardView) { + // remove the element css + this.$el.css('margin-top', '0'); + this.$tableContainer.css('padding-bottom', '0'); + this.$tableFooter.hide(); + return; + } + + if (this.options.showHeader && this.options.height) { + this.$tableHeader.show(); + this.resetHeader(); + padding += this.$header.outerHeight(true); + } else { + this.$tableHeader.hide(); + this.trigger('post-header'); + } + + if (this.options.showFooter) { + this.resetFooter(); + if (this.options.height) { + padding += this.$tableFooter.outerHeight(true); + } + } + + if (this.options.height) { + var toolbarHeight = this.$toolbar.outerHeight(true); + var paginationHeight = this.$pagination.outerHeight(true); + var height = this.options.height - toolbarHeight - paginationHeight; + var tableHeight = this.$tableBody.find('table').outerHeight(true); + this.$tableContainer.css('height', height + 'px'); + this.$tableBorder && this.$tableBorder.css('height', height - tableHeight - padding - 1 + 'px'); + } + + // Assign the correct sortable arrow + this.getCaret(); + this.$tableContainer.css('padding-bottom', padding + 'px'); + this.trigger('reset-view'); + } + }, { + key: 'getData', + value: function getData(useCurrentPage) { + var data = this.options.data; + if (this.searchText || this.options.sortName || !Utils.isEmptyObject(this.filterColumns) || !Utils.isEmptyObject(this.filterColumnsPartial)) { + data = this.data; + } + + if (useCurrentPage) { + return data.slice(this.pageFrom - 1, this.pageTo); + } + + return data; + } + }, { + key: 'load', + value: function load(_data) { + var fixedScroll = false; + var data = _data; + + // #431: support pagination + if (this.options.pagination && this.options.sidePagination === 'server') { + this.options.totalRows = data[this.options.totalField]; + } + + fixedScroll = data.fixedScroll; + data = Array.isArray(data) ? data : data[this.options.dataField]; + + this.initData(data); + this.initSearch(); + this.initPagination(); + this.initBody(fixedScroll); + } + }, { + key: 'append', + value: function append(data) { + this.initData(data, 'append'); + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'prepend', + value: function prepend(data) { + this.initData(data, 'prepend'); + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'remove', + value: function remove(params) { + var len = this.options.data.length; + var i = void 0; + var row = void 0; + + if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) { + return; + } + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (!row.hasOwnProperty(params.field)) { + continue; + } + if (params.values.indexOf(row[params.field]) !== -1) { + this.options.data.splice(i, 1); + if (this.options.sidePagination === 'server') { + this.options.totalRows -= 1; + } + } + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'removeAll', + value: function removeAll() { + if (this.options.data.length > 0) { + this.options.data.splice(0, this.options.data.length); + this.initSearch(); + this.initPagination(); + this.initBody(true); + } + } + }, { + key: 'getRowByUniqueId', + value: function getRowByUniqueId(_id) { + var uniqueId = this.options.uniqueId; + var len = this.options.data.length; + var id = _id; + var dataRow = null; + var i = void 0; + var row = void 0; + var rowUniqueId = void 0; + + for (i = len - 1; i >= 0; i--) { + row = this.options.data[i]; + + if (row.hasOwnProperty(uniqueId)) { + // uniqueId is a column + rowUniqueId = row[uniqueId]; + } else if (row._data && row._data.hasOwnProperty(uniqueId)) { + // uniqueId is a row data property + rowUniqueId = row._data[uniqueId]; + } else { + continue; + } + + if (typeof rowUniqueId === 'string') { + id = id.toString(); + } else if (typeof rowUniqueId === 'number') { + if (Number(rowUniqueId) === rowUniqueId && rowUniqueId % 1 === 0) { + id = parseInt(id); + } else if (rowUniqueId === Number(rowUniqueId) && rowUniqueId !== 0) { + id = parseFloat(id); + } + } + + if (rowUniqueId === id) { + dataRow = row; + break; + } + } + + return dataRow; + } + }, { + key: 'removeByUniqueId', + value: function removeByUniqueId(id) { + var len = this.options.data.length; + var row = this.getRowByUniqueId(id); + + if (row) { + this.options.data.splice(this.options.data.indexOf(row), 1); + } + + if (len === this.options.data.length) { + return; + } + + this.initSearch(); + this.initPagination(); + this.initBody(true); + } + }, { + key: 'updateByUniqueId', + value: function updateByUniqueId(params) { + var allParams = Array.isArray(params) ? params : [params]; + + for (var _iterator20 = allParams, _isArray20 = Array.isArray(_iterator20), _i22 = 0, _iterator20 = _isArray20 ? _iterator20 : _iterator20[Symbol.iterator]();;) { + var _ref43; + + if (_isArray20) { + if (_i22 >= _iterator20.length) break; + _ref43 = _iterator20[_i22++]; + } else { + _i22 = _iterator20.next(); + if (_i22.done) break; + _ref43 = _i22.value; + } + + var _params = _ref43; + + if (!_params.hasOwnProperty('id') || !_params.hasOwnProperty('row')) { + continue; + } + + var rowId = this.options.data.indexOf(this.getRowByUniqueId(_params.id)); + + if (rowId === -1) { + continue; + } + $.extend(this.options.data[rowId], _params.row); + } + + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'refreshColumnTitle', + value: function refreshColumnTitle(params) { + if (!params.hasOwnProperty('field') || !params.hasOwnProperty('title')) { + return; + } + + this.columns[this.fieldsColumnsIndex[params.field]].title = this.options.escape ? Utils.escapeHTML(params.title) : params.title; + + if (this.columns[this.fieldsColumnsIndex[params.field]].visible) { + var header = this.options.height !== undefined ? this.$tableHeader : this.$header; + header.find('th[data-field]').each(function (i, el) { + if ($(el).data('field') === params.field) { + $($(el).find('.th-inner')[0]).text(params.title); + return false; + } + }); + } + } + }, { + key: 'insertRow', + value: function insertRow(params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) { + return; + } + this.options.data.splice(params.index, 0, params.row); + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'updateRow', + value: function updateRow(params) { + var allParams = Array.isArray(params) ? params : [params]; + + for (var _iterator21 = allParams, _isArray21 = Array.isArray(_iterator21), _i23 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) { + var _ref44; + + if (_isArray21) { + if (_i23 >= _iterator21.length) break; + _ref44 = _iterator21[_i23++]; + } else { + _i23 = _iterator21.next(); + if (_i23.done) break; + _ref44 = _i23.value; + } + + var _params2 = _ref44; + + if (!_params2.hasOwnProperty('index') || !_params2.hasOwnProperty('row')) { + continue; + } + $.extend(this.options.data[_params2.index], _params2.row); + } + + this.initSearch(); + this.initPagination(); + this.initSort(); + this.initBody(true); + } + }, { + key: 'initHiddenRows', + value: function initHiddenRows() { + this.hiddenRows = []; + } + }, { + key: 'showRow', + value: function showRow(params) { + this.toggleRow(params, true); + } + }, { + key: 'hideRow', + value: function hideRow(params) { + this.toggleRow(params, false); + } + }, { + key: 'toggleRow', + value: function toggleRow(params, visible) { + var row = void 0; + + if (params.hasOwnProperty('index')) { + row = this.getData()[params.index]; + } else if (params.hasOwnProperty('uniqueId')) { + row = this.getRowByUniqueId(params.uniqueId); + } + + if (!row) { + return; + } + + var index = Utils.findIndex(this.hiddenRows, row); + + if (!visible && index === -1) { + this.hiddenRows.push(row); + } else if (visible && index > -1) { + this.hiddenRows.splice(index, 1); + } + this.initBody(true); + } + }, { + key: 'getHiddenRows', + value: function getHiddenRows(show) { + if (show) { + this.initHiddenRows(); + this.initBody(true); + return; + } + var data = this.getData(); + var rows = []; + + for (var _iterator22 = data, _isArray22 = Array.isArray(_iterator22), _i24 = 0, _iterator22 = _isArray22 ? _iterator22 : _iterator22[Symbol.iterator]();;) { + var _ref45; + + if (_isArray22) { + if (_i24 >= _iterator22.length) break; + _ref45 = _iterator22[_i24++]; + } else { + _i24 = _iterator22.next(); + if (_i24.done) break; + _ref45 = _i24.value; + } + + var row = _ref45; + + if (this.hiddenRows.indexOf(row) !== -1) { + rows.push(row); + } + } + this.hiddenRows = rows; + return rows; + } + }, { + key: 'mergeCells', + value: function mergeCells(options) { + var row = options.index; + var col = this.getVisibleFields().indexOf(options.field); + var rowspan = options.rowspan || 1; + var colspan = options.colspan || 1; + var i = void 0; + var j = void 0; + var $tr = this.$body.find('>tr'); + + if (this.options.detailView && !this.options.cardView) { + col += 1; + } + + var $td = $tr.eq(row).find('>td').eq(col); + + if (row < 0 || col < 0 || row >= this.data.length) { + return; + } + + for (i = row; i < row + rowspan; i++) { + for (j = col; j < col + colspan; j++) { + $tr.eq(i).find('>td').eq(j).hide(); + } + } + + $td.attr('rowspan', rowspan).attr('colspan', colspan).show(); + } + }, { + key: 'updateCell', + value: function updateCell(params) { + if (!params.hasOwnProperty('index') || !params.hasOwnProperty('field') || !params.hasOwnProperty('value')) { + return; + } + this.data[params.index][params.field] = params.value; + + if (params.reinit === false) { + return; + } + this.initSort(); + this.initBody(true); + } + }, { + key: 'updateCellById', + value: function updateCellById(params) { + var _this16 = this; + + if (!params.hasOwnProperty('id') || !params.hasOwnProperty('field') || !params.hasOwnProperty('value')) { + return; + } + var allParams = Array.isArray(params) ? params : [params]; + + allParams.forEach(function (_ref46) { + var id = _ref46.id, + field = _ref46.field, + value = _ref46.value; + + var rowId = _this16.options.data.indexOf(_this16.getRowByUniqueId(id)); + + if (rowId === -1) { + return; + } + _this16.data[rowId][field] = value; + }); + + if (params.reinit === false) { + return; + } + this.initSort(); + this.initBody(true); + } + }, { + key: 'getOptions', + value: function getOptions() { + // deep copy and remove data + var options = JSON.parse(JSON.stringify(this.options)); + delete options.data; + return options; + } + }, { + key: 'getSelections', + value: function getSelections() { + var _this17 = this; + + // fix #2424: from html with checkbox + return this.options.data.filter(function (row) { + return row[_this17.header.stateField] === true; + }); + } + }, { + key: 'getAllSelections', + value: function getAllSelections() { + var _this18 = this; + + return this.options.data.filter(function (row) { + return row[_this18.header.stateField]; + }); + } + }, { + key: 'checkAll', + value: function checkAll() { + this.checkAll_(true); + } + }, { + key: 'uncheckAll', + value: function uncheckAll() { + this.checkAll_(false); + } + }, { + key: 'checkInvert', + value: function checkInvert() { + var $items = this.$selectItem.filter(':enabled'); + var checked = $items.filter(':checked'); + $items.each(function (i, el) { + $(el).prop('checked', !$(el).prop('checked')); + }); + this.updateRows(); + this.updateSelected(); + this.trigger('uncheck-some', checked); + checked = this.getSelections(); + this.trigger('check-some', checked); + } + }, { + key: 'checkAll_', + value: function checkAll_(checked) { + var rows = void 0; + if (!checked) { + rows = this.getSelections(); + } + this.$selectAll.add(this.$selectAll_).prop('checked', checked); + this.$selectItem.filter(':enabled').prop('checked', checked); + this.updateRows(); + if (checked) { + rows = this.getSelections(); + } + this.trigger(checked ? 'check-all' : 'uncheck-all', rows); + } + }, { + key: 'check', + value: function check(index) { + this.check_(true, index); + } + }, { + key: 'uncheck', + value: function uncheck(index) { + this.check_(false, index); + } + }, { + key: 'check_', + value: function check_(checked, index) { + var $el = this.$selectItem.filter('[data-index="' + index + '"]'); + var row = this.data[index]; + + if ($el.is(':radio') || this.options.singleSelect) { + for (var _iterator23 = this.options.data, _isArray23 = Array.isArray(_iterator23), _i25 = 0, _iterator23 = _isArray23 ? _iterator23 : _iterator23[Symbol.iterator]();;) { + var _ref47; + + if (_isArray23) { + if (_i25 >= _iterator23.length) break; + _ref47 = _iterator23[_i25++]; + } else { + _i25 = _iterator23.next(); + if (_i25.done) break; + _ref47 = _i25.value; + } + + var r = _ref47; + + r[this.header.stateField] = false; + } + this.$selectItem.filter(':checked').not($el).prop('checked', false); + } + + row[this.header.stateField] = checked; + $el.prop('checked', checked); + this.updateSelected(); + this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el); + } + }, { + key: 'checkBy', + value: function checkBy(obj) { + this.checkBy_(true, obj); + } + }, { + key: 'uncheckBy', + value: function uncheckBy(obj) { + this.checkBy_(false, obj); + } + }, { + key: 'checkBy_', + value: function checkBy_(checked, obj) { + var _this19 = this; + + if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) { + return; + } + + var rows = []; + this.options.data.forEach(function (row, i) { + if (!row.hasOwnProperty(obj.field)) { + return false; + } + if (obj.values.indexOf(row[obj.field]) !== -1) { + var $el = _this19.$selectItem.filter(':enabled').filter(Utils.sprintf('[data-index="%s"]', i)).prop('checked', checked); + row[_this19.header.stateField] = checked; + rows.push(row); + _this19.trigger(checked ? 'check' : 'uncheck', row, $el); + } + }); + this.updateSelected(); + this.trigger(checked ? 'check-some' : 'uncheck-some', rows); + } + }, { + key: 'destroy', + value: function destroy() { + this.$el.insertBefore(this.$container); + $(this.options.toolbar).insertBefore(this.$el); + this.$container.next().remove(); + this.$container.remove(); + this.$el.html(this.$el_.html()).css('margin-top', '0').attr('class', this.$el_.attr('class') || ''); // reset the class + } + }, { + key: 'showLoading', + value: function showLoading() { + this.$tableLoading.css('display', 'flex'); + } + }, { + key: 'hideLoading', + value: function hideLoading() { + this.$tableLoading.css('display', 'none'); + } + }, { + key: 'togglePagination', + value: function togglePagination() { + this.options.pagination = !this.options.pagination; + this.$toolbar.find('button[name="paginationSwitch"]').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.pagination ? this.options.icons.paginationSwitchDown : this.options.icons.paginationSwitchUp)); + this.updatePagination(); + } + }, { + key: 'toggleFullscreen', + value: function toggleFullscreen() { + this.$el.closest('.bootstrap-table').toggleClass('fullscreen'); + this.resetView(); + } + }, { + key: 'refresh', + value: function refresh(params) { + if (params && params.url) { + this.options.url = params.url; + } + if (params && params.pageNumber) { + this.options.pageNumber = params.pageNumber; + } + if (params && params.pageSize) { + this.options.pageSize = params.pageSize; + } + this.trigger('refresh', this.initServer(params && params.silent, params && params.query, params && params.url)); + } + }, { + key: 'resetWidth', + value: function resetWidth() { + if (this.options.showHeader && this.options.height) { + this.fitHeader(); + } + if (this.options.showFooter && !this.options.cardView) { + this.fitFooter(); + } + } + }, { + key: 'showColumn', + value: function showColumn(field) { + this.toggleColumn(this.fieldsColumnsIndex[field], true, true); + } + }, { + key: 'hideColumn', + value: function hideColumn(field) { + this.toggleColumn(this.fieldsColumnsIndex[field], false, true); + } + }, { + key: 'getHiddenColumns', + value: function getHiddenColumns() { + return this.columns.filter(function (_ref48) { + var visible = _ref48.visible; + return !visible; + }); + } + }, { + key: 'getVisibleColumns', + value: function getVisibleColumns() { + return this.columns.filter(function (_ref49) { + var visible = _ref49.visible; + return visible; + }); + } + }, { + key: 'toggleAllColumns', + value: function toggleAllColumns(visible) { + for (var _iterator24 = this.columns, _isArray24 = Array.isArray(_iterator24), _i26 = 0, _iterator24 = _isArray24 ? _iterator24 : _iterator24[Symbol.iterator]();;) { + var _ref50; + + if (_isArray24) { + if (_i26 >= _iterator24.length) break; + _ref50 = _iterator24[_i26++]; + } else { + _i26 = _iterator24.next(); + if (_i26.done) break; + _ref50 = _i26.value; + } + + var column = _ref50; + + column.visible = visible; + } + + this.initHeader(); + this.initSearch(); + this.initPagination(); + this.initBody(); + if (this.options.showColumns) { + var $items = this.$toolbar.find('.keep-open input').prop('disabled', false); + + if ($items.filter(':checked').length <= this.options.minimumCountColumns) { + $items.filter(':checked').prop('disabled', true); + } + } + } + }, { + key: 'showAllColumns', + value: function showAllColumns() { + this.toggleAllColumns(true); + } + }, { + key: 'hideAllColumns', + value: function hideAllColumns() { + this.toggleAllColumns(false); + } + }, { + key: 'filterBy', + value: function filterBy(columns) { + this.filterColumns = Utils.isEmptyObject(columns) ? {} : columns; + this.options.pageNumber = 1; + this.initSearch(); + this.updatePagination(); + } + }, { + key: 'scrollTo', + value: function scrollTo(_value) { + if (typeof _value === 'undefined') { + return this.$tableBody.scrollTop(); + } + + var value = _value; + if (typeof _value === 'string' && _value === 'bottom') { + value = this.$tableBody[0].scrollHeight; + } + this.$tableBody.scrollTop(value); + } + }, { + key: 'getScrollPosition', + value: function getScrollPosition() { + return this.scrollTo(); + } + }, { + key: 'selectPage', + value: function selectPage(page) { + if (page > 0 && page <= this.options.totalPages) { + this.options.pageNumber = page; + this.updatePagination(); + } + } + }, { + key: 'prevPage', + value: function prevPage() { + if (this.options.pageNumber > 1) { + this.options.pageNumber--; + this.updatePagination(); + } + } + }, { + key: 'nextPage', + value: function nextPage() { + if (this.options.pageNumber < this.options.totalPages) { + this.options.pageNumber++; + this.updatePagination(); + } + } + }, { + key: 'toggleView', + value: function toggleView() { + this.options.cardView = !this.options.cardView; + this.initHeader(); + // Fixed remove toolbar when click cardView button. + // this.initToolbar(); + this.$toolbar.find('button[name="toggle"]').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.cardView ? this.options.icons.toggleOn : this.options.icons.toggleOff)); + this.initBody(); + this.trigger('toggle', this.options.cardView); + } + }, { + key: 'refreshOptions', + value: function refreshOptions(options) { + // If the objects are equivalent then avoid the call of destroy / init methods + if (Utils.compareObjects(this.options, options, true)) { + return; + } + this.options = $.extend(this.options, options); + this.trigger('refresh-options', this.options); + this.destroy(); + this.init(); + } + }, { + key: 'resetSearch', + value: function resetSearch(text) { + var $search = this.$toolbar.find('.search input'); + $search.val(text || ''); + this.onSearch({ currentTarget: $search }); + } + }, { + key: 'expandRow_', + value: function expandRow_(expand, index) { + var $tr = this.$body.find(Utils.sprintf('> tr[data-index="%s"]', index)); + if ($tr.next().is('tr.detail-view') === !expand) { + $tr.find('> td > .detail-icon').click(); + } + } + }, { + key: 'expandRow', + value: function expandRow(index) { + this.expandRow_(true, index); + } + }, { + key: 'collapseRow', + value: function collapseRow(index) { + this.expandRow_(false, index); + } + }, { + key: 'expandAllRows', + value: function expandAllRows(isSubTable) { + var _this20 = this; + + if (isSubTable) { + var $tr = this.$body.find(Utils.sprintf('> tr[data-index="%s"]', 0)); + var detailIcon = null; + var executeInterval = false; + var idInterval = -1; + + if (!$tr.next().is('tr.detail-view')) { + $tr.find('> td > .detail-icon').click(); + executeInterval = true; + } else if (!$tr.next().next().is('tr.detail-view')) { + $tr.next().find('.detail-icon').click(); + executeInterval = true; + } + + if (executeInterval) { + try { + idInterval = setInterval(function () { + detailIcon = _this20.$body.find('tr.detail-view').last().find('.detail-icon'); + if (detailIcon.length > 0) { + detailIcon.click(); + } else { + clearInterval(idInterval); + } + }, 1); + } catch (ex) { + clearInterval(idInterval); + } + } + } else { + var trs = this.$body.children(); + for (var i = 0; i < trs.length; i++) { + this.expandRow_(true, $(trs[i]).data('index')); + } + } + } + }, { + key: 'collapseAllRows', + value: function collapseAllRows(isSubTable) { + if (isSubTable) { + this.expandRow_(false, 0); + } else { + var trs = this.$body.children(); + for (var i = 0; i < trs.length; i++) { + this.expandRow_(false, $(trs[i]).data('index')); + } + } + } + }, { + key: 'updateFormatText', + value: function updateFormatText(name, text) { + if (this.options[Utils.sprintf('format%s', name)]) { + if (typeof text === 'string') { + this.options[Utils.sprintf('format%s', name)] = function () { + return text; + }; + } else if (typeof text === 'function') { + this.options[Utils.sprintf('format%s', name)] = text; + } + } + this.initToolbar(); + this.initPagination(); + this.initBody(); + } + }]); + + return BootstrapTable; + }(); + + BootstrapTable.DEFAULTS = DEFAULTS; + BootstrapTable.LOCALES = LOCALES; + BootstrapTable.COLUMN_DEFAULTS = COLUMN_DEFAULTS; + BootstrapTable.EVENTS = EVENTS; + + // BOOTSTRAP TABLE PLUGIN DEFINITION + // ======================= + + var allowedMethods = ['getOptions', 'getSelections', 'getAllSelections', 'getData', 'load', 'append', 'prepend', 'remove', 'removeAll', 'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId', 'getRowByUniqueId', 'showRow', 'hideRow', 'getHiddenRows', 'mergeCells', 'refreshColumnTitle', 'checkAll', 'uncheckAll', 'checkInvert', 'check', 'uncheck', 'checkBy', 'uncheckBy', 'refresh', 'resetView', 'resetWidth', 'destroy', 'showLoading', 'hideLoading', 'showColumn', 'hideColumn', 'getHiddenColumns', 'getVisibleColumns', 'showAllColumns', 'hideAllColumns', 'filterBy', 'scrollTo', 'getScrollPosition', 'selectPage', 'prevPage', 'nextPage', 'togglePagination', 'toggleView', 'refreshOptions', 'resetSearch', 'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows', 'updateFormatText', 'updateCellById']; + + $.BootstrapTable = BootstrapTable; + $.fn.bootstrapTable = function (option) { + for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key6 = 1; _key6 < _len3; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } + + var value = void 0; + + this.each(function (i, el) { + var data = $(el).data('bootstrap.table'); + var options = $.extend({}, BootstrapTable.DEFAULTS, $(el).data(), (typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object' && option); + + if (typeof option === 'string') { + var _data2; + + if (!(allowedMethods.indexOf(option) !== -1)) { + throw new Error('Unknown method: ' + option); + } + + if (!data) { + return; + } + + value = (_data2 = data)[option].apply(_data2, args); + + if (option === 'destroy') { + $(el).removeData('bootstrap.table'); + } + } + + if (!data) { + $(el).data('bootstrap.table', data = new $.BootstrapTable(el, options)); + } + }); + + return typeof value === 'undefined' ? this : value; + }; + + $.fn.bootstrapTable.Constructor = BootstrapTable; + $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS; + $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS; + $.fn.bootstrapTable.locales = BootstrapTable.LOCALES; + $.fn.bootstrapTable.methods = allowedMethods; + $.fn.bootstrapTable.utils = Utils; + + // BOOTSTRAP TABLE INIT + // ======================= + + $(function () { + $('[data-toggle="table"]').bootstrapTable(); + }); + })(jQuery); +}); \ No newline at end of file diff --git a/InvenTree/static/script/bootstrap/bootstrap-table.min.js b/InvenTree/static/script/bootstrap/bootstrap-table.min.js deleted file mode 100644 index ae407d4cc3..0000000000 --- a/InvenTree/static/script/bootstrap/bootstrap-table.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* -* bootstrap-table - v1.12.1 - 2018-03-12 -* https://github.com/wenzhixin/bootstrap-table -* Copyright (c) 2018 zhixin wen -* Licensed MIT License -*/ -!function(a){"use strict";var b=3;try{b=parseInt(a.fn.dropdown.Constructor.VERSION,10)}catch(c){}var d={3:{buttonsClass:"default",iconsPrefix:"glyphicon",icons:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggleOff:"glyphicon-list-alt icon-list-alt",toggleOn:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus",fullscreen:"glyphicon-fullscreen"},pullClass:"pull",toobarDropdowHtml:['"],toobarDropdowItemHtml:'
  • ',pageDropdownHtml:['"],pageDropdownItemHtml:''},4:{buttonsClass:"secondary",iconsPrefix:"fa",icons:{paginationSwitchDown:"fa-toggle-down",paginationSwitchUp:"fa-toggle-up",refresh:"fa-refresh",toggleOff:"fa-toggle-off",toggleOn:"fa-toggle-on",columns:"fa-th-list",detailOpen:"fa-plus",detailClose:"fa-minus",fullscreen:"fa-arrows-alt"},pullClass:"float",toobarDropdowHtml:['"],toobarDropdowItemHtml:'',pageDropdownHtml:['"],pageDropdownItemHtml:'%s'}}[b],e=null,f=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},g=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},h=function(b){var c,d,e,f=0,g=[];for(c=0;cd;d++)g[c][d]=!1;for(c=0;ce;e++)g[c+e][k]=!0;for(e=0;j>e;e++)g[c][k+e]=!0}},i=function(){if(null===e){var b,c,d=a("

    ").addClass("fixed-table-scroll-inner"),f=a("

    ").addClass("fixed-table-scroll-outer");f.append(d),a("body").append(f),b=d[0].offsetWidth,f.css("overflow","scroll"),c=d[0].offsetWidth,b===c&&(c=f[0].clientWidth),f.remove(),e=b-c}return e},j=function(b,c,d,e){var g=c;if("string"==typeof c){var h=c.split(".");h.length>1?(g=window,a.each(h,function(a,b){g=g[b]})):g=window[c]}return"object"==typeof g?g:"function"==typeof g?g.apply(b,d||[]):!g&&"string"==typeof c&&f.apply(this,[c].concat(d))?f.apply(this,[c].concat(d)):e},k=function(b,c,d){var e=Object.getOwnPropertyNames||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},f=e(b),g=e(c),h="";if(d&&f.length!==g.length)return!1;for(var i=0;i-1&&b[h]!==c[h])return!1;return!0},l=function(a){return"string"==typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/`/g,"`"):a},m=function(a){for(var b in a){var c=b.split(/(?=[A-Z])/).join("-").toLowerCase();c!==b&&(a[c]=a[b],delete a[b])}return a},n=function(a,b,c){var d=a;if("string"!=typeof b||a.hasOwnProperty(b))return c?l(a[b]):a[b];var e=b.split(".");for(var f in e)e.hasOwnProperty(f)&&(d=d&&d[e[f]]);return c?l(d):d},o=function(){return!!(navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./))},p=function(){Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable("toString"),c=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],d=c.length;return function(e){if("object"!=typeof e&&("function"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var f,g,h=[];for(f in e)a.call(e,f)&&h.push(f);if(b)for(g=0;d>g;g++)a.call(e,c[g])&&h.push(c[g]);return h}}())},q=function(b,c){this.options=c,this.$el=a(b),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()};q.DEFAULTS={classes:"table table-hover",sortClass:void 0,locale:void 0,height:void 0,undefinedText:"-",sortName:void 0,sortOrder:"asc",sortStable:!1,rememberOrder:!1,striped:!1,columns:[[]],data:[],totalField:"total",dataField:"rows",method:"get",url:void 0,ajax:void 0,cache:!0,contentType:"application/json",dataType:"json",ajaxOptions:{},queryParams:function(a){return a},queryParamsType:"limit",responseHandler:function(a){return a},pagination:!1,onlyInfoPagination:!1,paginationLoop:!0,sidePagination:"client",totalRows:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationPreText:"‹",paginationNextText:"›",search:!1,searchOnEnterKey:!1,strictSearch:!1,searchAlign:"right",selectItemName:"btSelectItem",showHeader:!0,showFooter:!1,showColumns:!1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,showFullscreen:!1,smartDisplay:!0,escape:!1,minimumCountColumns:1,idField:void 0,uniqueId:void 0,cardView:!1,detailView:!1,detailFormatter:function(){return""},detailFilter:function(){return!0},trimOnSearch:!0,clickToSelect:!1,singleSelect:!1,toolbar:void 0,toolbarAlign:"left",buttonsToolbar:void 0,buttonsAlign:"right",checkboxHeader:!0,sortable:!0,silentSort:!0,maintainSelected:!1,searchTimeOut:500,searchText:"",iconSize:void 0,buttonsClass:d.buttonsClass,iconsPrefix:d.iconsPrefix,icons:d.icons,customSearch:a.noop,customSort:a.noop,ignoreClickToSelectOn:function(b){return a.inArray(b.tagName,["A","BUTTON"])},rowStyle:function(){return{}},rowAttributes:function(){return{}},footerStyle:function(){return{}},onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onRefresh:function(){return!1},onResetView:function(){return!1},onScrollBody:function(){return!1}},q.LOCALES={},q.LOCALES["en-US"]=q.LOCALES.en={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return f("%s rows per page",a)},formatShowingRows:function(a,b,c){return f("Showing %s to %s of %s rows",a,b,c)},formatDetailPagination:function(a){return f("Showing %s rows",a)},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatFullscreen:function(){return"Fullscreen"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"}},a.extend(q.DEFAULTS,q.LOCALES["en-US"]),q.COLUMN_DEFAULTS={radio:!1,checkbox:!1,checkboxEnabled:!0,field:void 0,title:void 0,titleTooltip:void 0,"class":void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,width:void 0,sortable:!1,order:"asc",visible:!0,switchable:!0,clickToSelect:!0,formatter:void 0,footerFormatter:void 0,events:void 0,sorter:void 0,sortName:void 0,cellStyle:void 0,searchable:!0,searchFormatter:!0,cardVisible:!0,escape:!1,showSelectTitle:!1},q.EVENTS={"all.bs.table":"onAll","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView","refresh.bs.table":"onRefresh","scroll-body.bs.table":"onScrollBody"},q.prototype.init=function(){this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initHiddenRows(),this.initFooter(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()},q.prototype.initLocale=function(){if(this.options.locale){var b=this.options.locale.split(/-|_/);b[0].toLowerCase(),b[1]&&b[1].toUpperCase(),a.fn.bootstrapTable.locales[this.options.locale]?a.extend(this.options,a.fn.bootstrapTable.locales[this.options.locale]):a.fn.bootstrapTable.locales[b.join("-")]?a.extend(this.options,a.fn.bootstrapTable.locales[b.join("-")]):a.fn.bootstrapTable.locales[b[0]]&&a.extend(this.options,a.fn.bootstrapTable.locales[b[0]])}},q.prototype.initContainer=function(){this.$container=a(['
    ','
    ',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
    ':"",'
    ','
    ','
    ','
    ',this.options.formatLoadingMessage(),"
    ","
    ",'',"
    ","bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
    ':"","
    "].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.options.buttonsToolbar?a("body").find(this.options.buttonsToolbar):this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('
    '),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},q.prototype.initTable=function(){var b=this,c=[],d=[];if(this.$header=this.$el.find(">thead"),this.$header.length||(this.$header=a("").appendTo(this.$el)),this.$header.find("tr").each(function(){var b=[];a(this).find("th").each(function(){"undefined"!=typeof a(this).data("field")&&a(this).data("field",a(this).data("field")+""),b.push(a.extend({},{title:a(this).html(),"class":a(this).attr("class"),titleTooltip:a(this).attr("title"),rowspan:a(this).attr("rowspan")?+a(this).attr("rowspan"):void 0,colspan:a(this).attr("colspan")?+a(this).attr("colspan"):void 0},a(this).data()))}),c.push(b)}),a.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=a.extend(!0,[],c,this.options.columns),this.columns=[],this.fieldsColumnsIndex=[],h(this.options.columns),a.each(this.options.columns,function(c,d){a.each(d,function(d,e){e=a.extend({},q.COLUMN_DEFAULTS,e),"undefined"!=typeof e.fieldIndex&&(b.columns[e.fieldIndex]=e,b.fieldsColumnsIndex[e.field]=e.fieldIndex),b.options.columns[c][d]=e})}),!this.options.data.length){var e=[];this.$el.find(">tbody>tr").each(function(c){var f={};f._id=a(this).attr("id"),f._class=a(this).attr("class"),f._data=m(a(this).data()),a(this).find(">td").each(function(d){for(var g,h,i=a(this),j=+i.attr("colspan")||1,k=+i.attr("rowspan")||1;e[c]&&e[c][d];d++);for(g=d;d+j>g;g++)for(h=c;c+k>h;h++)e[h]||(e[h]=[]),e[h][g]=!0;var l=b.columns[d].field;f[l]=a(this).html(),f["_"+l+"_id"]=a(this).attr("id"),f["_"+l+"_class"]=a(this).attr("class"),f["_"+l+"_rowspan"]=a(this).attr("rowspan"),f["_"+l+"_colspan"]=a(this).attr("colspan"),f["_"+l+"_title"]=a(this).attr("title"),f["_"+l+"_data"]=m(a(this).data())}),d.push(f)}),this.options.data=d,d.length&&(this.fromHtml=!0)}},q.prototype.initHeader=function(){var b=this,c={},d=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},a.each(this.options.columns,function(e,g){d.push(""),0===e&&!b.options.cardView&&b.options.detailView&&d.push(f('
    ',b.options.columns.length)),a.each(g,function(a,e){var g="",h="",i="",j="",k=f(' class="%s"',e["class"]),m=(b.options.sortOrder||e.order,"px"),n=e.width;if(void 0===e.width||b.options.cardView||"string"==typeof e.width&&-1!==e.width.indexOf("%")&&(m="%"),e.width&&"string"==typeof e.width&&(n=e.width.replace("%","").replace("px","")),h=f("text-align: %s; ",e.halign?e.halign:e.align),i=f("text-align: %s; ",e.align),j=f("vertical-align: %s; ",e.valign),j+=f("width: %s; ",!e.checkbox&&!e.radio||n?n?n+m:void 0:e.showSelectTitle?void 0:"36px"),"undefined"!=typeof e.fieldIndex){if(b.header.fields[e.fieldIndex]=e.field,b.header.styles[e.fieldIndex]=i+j,b.header.classes[e.fieldIndex]=k,b.header.formatters[e.fieldIndex]=e.formatter,b.header.events[e.fieldIndex]=e.events,b.header.sorters[e.fieldIndex]=e.sorter,b.header.sortNames[e.fieldIndex]=e.sortName,b.header.cellStyles[e.fieldIndex]=e.cellStyle,b.header.searchables[e.fieldIndex]=e.searchable,!e.visible)return;if(b.options.cardView&&!e.cardVisible)return;c[e.field]=e}d.push(""),d.push(f('
    ',b.options.sortable&&e.sortable?"sortable both":"")),g=b.options.escape?l(e.title):e.title;var o=g;e.checkbox&&(g="",!b.options.singleSelect&&b.options.checkboxHeader&&(g=''),b.header.stateField=e.field),e.radio&&(g="",b.header.stateField=e.field,b.options.singleSelect=!0),!g&&e.showSelectTitle&&(g+=o),d.push(g),d.push("
    "),d.push('
    '),d.push("
    "),d.push("")}),d.push("")}),this.$header.html(d.join("")),this.$header.find("th[data-field]").each(function(){a(this).data(c[a(this).data("field")])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(c){var d=a(this);return b.options.detailView&&!d.parent().hasClass("bs-checkbox")&&d.closest(".bootstrap-table")[0]!==b.$container[0]?!1:void(b.options.sortable&&d.parent().data().sortable&&b.onSort(c))}),this.$header.children().children().off("keypress").on("keypress",function(c){if(b.options.sortable&&a(this).data().sortable){var d=c.keyCode||c.which;13==d&&b.onSort(c)}}),a(window).off("resize.bootstrap-table"),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",this.$header.outerHeight()+1),this.getCaret(),a(window).on("resize.bootstrap-table",a.proxy(this.resetWidth,this))),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$selectAll.off("click").on("click",function(){var c=a(this).prop("checked");b[c?"checkAll":"uncheckAll"](),b.updateSelected()})},q.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},q.prototype.initData=function(a,b){this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):a||this.options.data,this.data=this.options.data,"server"!==this.options.sidePagination&&this.initSort()},q.prototype.initSort=function(){var b=this,c=this.options.sortName,d="desc"===this.options.sortOrder?-1:1,e=a.inArray(this.options.sortName,this.header.fields),g=0;return this.options.customSort!==a.noop?void this.options.customSort.apply(this,[this.options.sortName,this.options.sortOrder]):void(-1!==e&&(this.options.sortStable&&a.each(this.data,function(a,b){b._position=a}),this.data.sort(function(f,g){b.header.sortNames[e]&&(c=b.header.sortNames[e]);var h=n(f,c,b.options.escape),i=n(g,c,b.options.escape),k=j(b.header,b.header.sorters[e],[h,i,f,g]);return void 0!==k?b.options.sortStable&&0===k?f._position-g._position:d*k:((void 0===h||null===h)&&(h=""),(void 0===i||null===i)&&(i=""),b.options.sortStable&&h===i?(h=f._position,i=g._position,f._position-g._position):a.isNumeric(h)&&a.isNumeric(i)?(h=parseFloat(h),i=parseFloat(i),i>h?-1*d:d):h===i?0:("string"!=typeof h&&(h=h.toString()),-1===h.localeCompare(i)?-1*d:d))}),void 0!==this.options.sortClass&&(clearTimeout(g),g=setTimeout(function(){b.$el.removeClass(b.options.sortClass);var a=b.$header.find(f('[data-field="%s"]',b.options.sortName).index()+1);b.$el.find(f("tr td:nth-child(%s)",a)).addClass(b.options.sortClass)},250))))},q.prototype.onSort=function(b){var c="keypress"===b.type?a(b.currentTarget):a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder=this.options.rememberOrder?"asc"===c.data("order")?"desc":"asc":this.columns[this.fieldsColumnsIndex[c.data("field")]].order),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaret(),"server"===this.options.sidePagination?void this.initServer(this.options.silentSort):(this.initSort(),void this.initBody())},q.prototype.initToolbar=function(){var b,c,e=this,g=[],h=0,i=0;this.$toolbar.find(".bs-bars").children().length&&a("body").append(a(this.options.toolbar)),this.$toolbar.html(""),("string"==typeof this.options.toolbar||"object"==typeof this.options.toolbar)&&a(f('
    ',d.pullClass,this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),g=[f('
    ',this.options.buttonsAlign,d.pullClass,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=j(null,this.options.icons)),this.options.showPaginationSwitch&&g.push(f('"),this.options.showFullscreen&&this.$toolbar.find('button[name="fullscreen"]').off("click").on("click",a.proxy(this.toggleFullscreen,this)),this.options.showRefresh&&g.push(f('"),this.options.showToggle&&g.push(f('"),this.options.showFullscreen&&g.push(f('"),this.options.showColumns&&(g.push(f('
    ',this.options.formatColumns()),'",d.toobarDropdowHtml[0]),a.each(this.columns,function(a,b){if(!(b.radio||b.checkbox||e.options.cardView&&!b.cardVisible)){var c=b.visible?' checked="checked"':"";b.switchable&&(g.push(f(d.toobarDropdowItemHtml,f(' %s',b.field,a,c,b.title))),i++)}}),g.push(d.toobarDropdowHtml[1],"
    ")),g.push("
    "),(this.showToolbar||g.length>2)&&this.$toolbar.append(g.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){e.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),i<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);e.toggleColumn(a(this).val(),b.prop("checked"),!1),e.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(g=[],g.push(f('"),this.$toolbar.append(g.join("")),c=this.$toolbar.find(".search input"),c.off("keyup drop blur").on("keyup drop blur",function(b){e.options.searchOnEnterKey&&13!==b.keyCode||a.inArray(b.keyCode,[37,38,39,40])>-1||(clearTimeout(h),h=setTimeout(function(){e.onSearch(b)},e.options.searchTimeOut))}),o()&&c.off("mouseup").on("mouseup",function(a){clearTimeout(h),h=setTimeout(function(){e.onSearch(a)},e.options.searchTimeOut)}))},q.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.searchText=c,this.options.pageNumber=1,this.initSearch(),b.firedByInitSearchText?"client"===this.options.sidePagination&&this.updatePagination():this.updatePagination(),this.trigger("search",c))},q.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){if(this.options.customSearch!==a.noop)return void window[this.options.customSearch].apply(this,[this.searchText]);var c=this.searchText&&(this.options.escape?l(this.searchText):this.searchText).toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(b){for(var c in d)if(a.isArray(d[c])&&-1===a.inArray(b[c],d[c])||!a.isArray(d[c])&&b[c]!==d[c])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,e){for(var f=0;f-1&&(m=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}if(this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),l.push(f('
    ',d.pullClass,this.options.paginationDetailHAlign),'',this.options.onlyInfoPagination?this.options.formatDetailPagination(this.options.totalRows):this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),""),!this.options.onlyInfoPagination){l.push('');var q=[f('',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'",d.pageDropdownHtml[0]];if("string"==typeof this.options.pageList){var r=this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").split(",");o=[],a.each(r,function(a,b){o.push(b.toUpperCase()===k.options.formatAllRows().toUpperCase()||"UNLIMITED"===b.toUpperCase()?k.options.formatAllRows():+b)})}for(a.each(o,function(a,b){if(!k.options.smartDisplay||0===a||o[a-1]"),l.push(this.options.formatRecordsPerPage(q.join(""))),l.push(""),l.push("
    ",f('")}this.$pagination.html(l.join("")),this.options.onlyInfoPagination||(g=this.$pagination.find(".page-list a"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-item").not(".page-next, .page-pre"),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(o.length<2||this.options.totalRows<=o[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),this.options.paginationLoop||(1===this.options.pageNumber&&h.addClass("disabled"),this.options.pageNumber===this.totalPages&&i.addClass("disabled")),m&&(this.options.pageSize=this.options.formatAllRows()),g.off("click").on("click",a.proxy(this.onPageListChange,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageNumber,this)))},q.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},q.prototype.onPageListChange=function(b){b.preventDefault();var c=a(b.currentTarget);return c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b),!1},q.prototype.onPagePre=function(a){return a.preventDefault(),this.options.pageNumber-1===0?this.options.pageNumber=this.options.totalPages:this.options.pageNumber--,this.updatePagination(a),!1},q.prototype.onPageNext=function(a){return a.preventDefault(),this.options.pageNumber+1>this.options.totalPages?this.options.pageNumber=1:this.options.pageNumber++,this.updatePagination(a),!1},q.prototype.onPageNumber=function(b){return b.preventDefault(),this.options.pageNumber!==+a(b.currentTarget).text()?(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b),!1):void 0},q.prototype.initRow=function(b,c){var d,e=this,h=[],i={},k=[],m="",o={},p=[];if(!(a.inArray(b,this.hiddenRows)>-1)){if(i=j(this.options,this.options.rowStyle,[b,c],i),i&&i.css)for(d in i.css)k.push(d+": "+i.css[d]);if(o=j(this.options,this.options.rowAttributes,[b,c],o))for(d in o)p.push(f('%s="%s"',d,l(o[d])));return b._data&&!a.isEmptyObject(b._data)&&a.each(b._data,function(a,b){"index"!==a&&(m+=f(' data-%s="%s"',a,b))}),h.push(""),this.options.cardView&&h.push(f('
    ',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&(h.push(""),j(null,this.options.detailFilter,[c,b])&&h.push('',f('',this.options.iconsPrefix,this.options.icons.detailOpen),""),h.push("")),a.each(this.header.fields,function(d,m){var o="",p=n(b,m,e.options.escape),q="",r="",s={},t="",u=e.header.classes[d],v="",w="",x="",y="",z=e.columns[d]; - -if((!e.fromHtml||"undefined"!=typeof p||z.checkbox||z.radio)&&z.visible&&(!e.options.cardView||z.cardVisible)){if(z.escape&&(p=l(p)),i=f('style="%s"',k.concat(e.header.styles[d]).join("; ")),b["_"+m+"_id"]&&(t=f(' id="%s"',b["_"+m+"_id"])),b["_"+m+"_class"]&&(u=f(' class="%s"',b["_"+m+"_class"])),b["_"+m+"_rowspan"]&&(w=f(' rowspan="%s"',b["_"+m+"_rowspan"])),b["_"+m+"_colspan"]&&(x=f(' colspan="%s"',b["_"+m+"_colspan"])),b["_"+m+"_title"]&&(y=f(' title="%s"',b["_"+m+"_title"])),s=j(e.header,e.header.cellStyles[d],[p,b,c,m],s),s.classes&&(u=f(' class="%s"',s.classes)),s.css){var A=[];for(var B in s.css)A.push(B+": "+s.css[B]);i=f('style="%s"',A.concat(e.header.styles[d]).join("; "))}q=j(z,e.header.formatters[d],[p,b,c,m],p),b["_"+m+"_data"]&&!a.isEmptyObject(b["_"+m+"_data"])&&a.each(b["_"+m+"_data"],function(a,b){"index"!==a&&(v+=f(' data-%s="%s"',a,b))}),z.checkbox||z.radio?(r=z.checkbox?"checkbox":r,r=z.radio?"radio":r,o=[f(e.options.cardView?'
    ':'',z["class"]||""),"",e.header.formatters[d]&&"string"==typeof q?q:"",e.options.cardView?"
    ":""].join(""),b[e.header.stateField]=q===!0||!!p||q&&q.checked):(q="undefined"==typeof q||null===q?e.options.undefinedText:q,o=e.options.cardView?['
    ',e.options.showHeader?f('%s',i,g(e.columns,"field","title",m)):"",f('%s',q),"
    "].join(""):[f("",t,u,i,v,w,x,y),q,""].join(""),e.options.cardView&&e.options.smartDisplay&&""===q&&(o='
    ')),h.push(o)}}),this.options.cardView&&h.push("
    "),h.push(""),h.join(" ")}},q.prototype.initBody=function(b){var c=this,d=this.getData();this.trigger("pre-body",d),this.$body=this.$el.find(">tbody"),this.$body.length||(this.$body=a("").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=d.length);for(var e,g=a(document.createDocumentFragment()),h=this.pageFrom-1;h'+f('%s',this.$header.find("th").length,this.options.formatNoMatches())+""),this.$body.html(g),b||this.scrollTo(0),this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(b){var d=a(this),e=d.parent(),g=c.data[e.data("index")],h=d[0].cellIndex,i=c.getVisibleFields(),j=i[c.options.detailView&&!c.options.cardView?h-1:h],k=c.columns[c.fieldsColumnsIndex[j]],l=n(g,j,c.options.escape);if(!d.find(".detail-icon").length&&(c.trigger("click"===b.type?"click-cell":"dbl-click-cell",j,l,g,d),c.trigger("click"===b.type?"click-row":"dbl-click-row",g,e,j),"click"===b.type&&c.options.clickToSelect&&k.clickToSelect&&c.options.ignoreClickToSelectOn(b.target))){var m=e.find(f('[name="%s"]',c.options.selectItemName));m.length&&m[0].click()}}),this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(b){b.preventDefault();var e=a(this),g=e.parent().parent(),h=g.data("index"),i=d[h];if(g.next().is("tr.detail-view"))e.find("i").attr("class",f("%s %s",c.options.iconsPrefix,c.options.icons.detailOpen)),c.trigger("collapse-row",h,i,g.next()),g.next().remove();else{e.find("i").attr("class",f("%s %s",c.options.iconsPrefix,c.options.icons.detailClose)),g.after(f('',g.find("td").length));var k=g.next().find("td"),l=j(c.options,c.options.detailFormatter,[h,i,k],"");1===k.length&&k.append(l),c.trigger("expand-row",h,i,k)}return c.resetView(),!1}),this.$selectItem=this.$body.find(f('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var d=a(this),e=d.prop("checked"),f=c.data[d.data("index")];(a(this).is(":radio")||c.options.singleSelect)&&a.each(c.options.data,function(a,b){b[c.header.stateField]=!1}),f[c.header.stateField]=e,c.options.singleSelect&&(c.$selectItem.not(this).each(function(){c.data[a(this).data("index")][c.header.stateField]=!1}),c.$selectItem.filter(":checked").not(this).prop("checked",!1)),c.updateSelected(),c.trigger(e?"check":"uncheck",f,d)}),a.each(this.header.events,function(b,d){if(d){"string"==typeof d&&(d=j(null,d));var e=c.header.fields[b],f=a.inArray(e,c.getVisibleFields());if(-1!==f){c.options.detailView&&!c.options.cardView&&(f+=1);for(var g in d)c.$body.find(">tr:not(.no-records-found)").each(function(){var b=a(this),h=b.find(c.options.cardView?".card-view":"td").eq(f),i=g.indexOf(" "),j=g.substring(0,i),k=g.substring(i+1),l=d[g];h.find(k).off(j).on(j,function(a){var d=b.data("index"),f=c.data[d],g=f[e];l.apply(this,[a,g,f,d])})})}}}),this.updateSelected(),this.resetView(),this.trigger("post-body",d)},q.prototype.initServer=function(b,c,d){var e,f=this,g={},h=a.inArray(this.options.sortName,this.header.fields),i={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};this.header.sortNames[h]&&(i.sortName=this.header.sortNames[h]),this.options.pagination&&"server"===this.options.sidePagination&&(i.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,i.pageNumber=this.options.pageNumber),(d||this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&"server"===this.options.sidePagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,0===i.limit&&delete i.limit)),a.isEmptyObject(this.filterColumnsPartial)||(i.filter=JSON.stringify(this.filterColumnsPartial,null)),g=j(this.options,this.options.queryParams,[i],g),a.extend(g,c||{}),g!==!1&&(b||this.$tableLoading.show(),e=a.extend({},j(null,this.options.ajaxOptions),{type:this.options.method,url:d||this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(g):g,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=j(f.options,f.options.responseHandler,[a],a),f.load(a),f.trigger("load-success",a),b||f.$tableLoading.hide()},error:function(a){var c=[];"server"===f.options.sidePagination&&(c={},c[f.options.totalField]=0,c[f.options.dataField]=[]),f.load(c),f.trigger("load-error",a.status,a),b||f.$tableLoading.hide()}}),this.options.ajax?j(this,this.options.ajax,[e],null):(this._xhr&&4!==this._xhr.readyState&&this._xhr.abort(),this._xhr=a.ajax(e))))},q.prototype.initSearchText=function(){if(this.options.search&&(this.searchText="",""!==this.options.searchText)){var a=this.$toolbar.find(".search input");a.val(this.options.searchText),this.onSearch({currentTarget:a,firedByInitSearchText:!0})}},q.prototype.getCaret=function(){var b=this;a.each(this.$header.find("th"),function(c,d){a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field")===b.options.sortName?b.options.sortOrder:"both")})},q.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).closest("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},q.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},q.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),b.header.stateField&&(c[b.header.stateField]=!1)}),this.initHiddenRows()},q.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[q.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},q.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},q.prototype.fitHeader=function(){var b,c,d,e,g=this;if(g.$el.is(":hidden"))return void(g.timeoutId_=setTimeout(a.proxy(g.fitHeader,g),100));if(b=this.$tableBody.get(0),c=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.outerHeight()?i():0,this.$el.css("margin-top",-this.$header.outerHeight()),d=a(":focus"),d.length>0){var h=d.parents("th");if(h.length>0){var j=h.attr("data-field");if(void 0!==j){var k=this.$header.find("[data-field='"+j+"']");k.length>0&&k.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":c}).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_),e=a(".focus-temp:visible:eq(0)"),e.length>0&&(e.focus(),this.$header.find(".focus-temp").removeClass("focus-temp")),this.$header.find("th[data-field]").each(function(){g.$header_.find(f('th[data-field="%s"]',a(this).data("field"))).data(a(this).data())});var l=this.getVisibleFields(),m=this.$header_.find("th");this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(b){var c=a(this),d=b;if(g.options.detailView&&!g.options.cardView&&(0===b&&g.$header_.find("th.detail").find(".fht-cell").width(c.innerWidth()),d=b-1),-1!==d){var e=g.$header_.find(f('th[data-field="%s"]',l[d]));e.length>1&&(e=a(m[c[0].cellIndex]));var h=e.width()-e.find(".fht-cell").width();e.find(".fht-cell").width(c.innerWidth()-h)}}),this.horizontalScroll(),this.trigger("post-header")},q.prototype.resetFooter=function(){var b=this,c=b.getData(),d=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&d.push('
     
    '),a.each(this.columns,function(a,e){var g,h="",i="",k=[],l={},m=f(' class="%s"',e["class"]);if(e.visible&&(!b.options.cardView||e.cardVisible)){if(h=f("text-align: %s; ",e.falign?e.falign:e.align),i=f("vertical-align: %s; ",e.valign),l=j(null,b.options.footerStyle),l&&l.css)for(g in l.css)k.push(g+": "+l.css[g]);d.push(""),d.push('
    '),d.push(j(e,e.footerFormatter,[c]," ")||" "),d.push("
    "),d.push('
    '),d.push(""),d.push("")}}),this.$tableFooter.find("tr").html(d.join("")),this.$tableFooter.show(),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},q.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?i():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(c){var d=a(this);b.eq(c).find(".fht-cell").width(d.innerWidth())}),void this.horizontalScroll())},q.prototype.horizontalScroll=function(){var b=this;b.trigger("scroll-body"),this.$tableBody.off("scroll").on("scroll",function(){b.options.showHeader&&b.options.height&&b.$tableHeader.scrollLeft(a(this).scrollLeft()),b.options.showFooter&&!b.options.cardView&&b.$tableFooter.scrollLeft(a(this).scrollLeft())})},q.prototype.toggleColumn=function(a,b,c){if(-1!==a&&(this.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var d=this.$toolbar.find(".keep-open input").prop("disabled",!1);c&&d.filter(f('[value="%s"]',a)).prop("checked",b),d.filter(":checked").length<=this.options.minimumCountColumns&&d.filter(":checked").prop("disabled",!0)}},q.prototype.getVisibleFields=function(){var b=this,c=[];return a.each(this.header.fields,function(a,d){var e=b.columns[b.fieldsColumnsIndex[d]];e.visible&&c.push(d)}),c},q.prototype.resetView=function(a){var b=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var c=this.$toolbar.outerHeight(!0),d=this.$pagination.outerHeight(!0),e=this.options.height-c-d;this.$tableContainer.css("height",e+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),this.$tableContainer.css("padding-bottom","0"),void this.$tableFooter.hide()):(this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),b+=this.$header.outerHeight()):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(b+=this.$tableFooter.outerHeight()+1)),this.getCaret(),this.$tableContainer.css("padding-bottom",b+"px"),void this.trigger("reset-view"))},q.prototype.getData=function(b){var c=this.options.data;return(this.searchText||this.options.sortName||!a.isEmptyObject(this.filterColumns)||!a.isEmptyObject(this.filterColumnsPartial))&&(c=this.data),b?c.slice(this.pageFrom-1,this.pageTo):c},q.prototype.load=function(b){var c=!1;this.options.pagination&&"server"===this.options.sidePagination?(this.options.totalRows=b[this.options.totalField],c=b.fixedScroll,b=b[this.options.dataField]):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},q.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&(this.options.data.splice(c,1),"server"===this.options.sidePagination&&(this.options.totalRows-=1));e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}},q.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},q.prototype.getRowByUniqueId=function(a){var b,c,d,e=this.options.uniqueId,f=this.options.data.length,g=null;for(b=f-1;b>=0;b--){if(c=this.options.data[b],c.hasOwnProperty(e))d=c[e];else{if(!c._data.hasOwnProperty(e))continue;d=c._data[e]}if("string"==typeof d?a=a.toString():"number"==typeof d&&(Number(d)===d&&d%1===0?a=parseInt(a):d===Number(d)&&0!==d&&(a=parseFloat(a))),d===a){g=c;break}}return g},q.prototype.removeByUniqueId=function(a){var b=this.options.data.length,c=this.getRowByUniqueId(a);c&&this.options.data.splice(this.options.data.indexOf(c),1),b!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},q.prototype.updateByUniqueId=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;d.hasOwnProperty("id")&&d.hasOwnProperty("row")&&(e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&a.extend(c.options.data[e],d.row))}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.refreshColumnTitle=function(b){if(b.hasOwnProperty("field")&&b.hasOwnProperty("title")&&(this.columns[this.fieldsColumnsIndex[b.field]].title=this.options.escape?l(b.title):b.title,this.columns[this.fieldsColumnsIndex[b.field]].visible)){var c=void 0!==this.options.height?this.$tableHeader:this.$header;c.find("th[data-field]").each(function(){return a(this).data("field")===b.field?(a(a(this).find(".th-inner")[0]).text(b.title),!1):void 0})}},q.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.options.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},q.prototype.updateRow=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){d.hasOwnProperty("index")&&d.hasOwnProperty("row")&&a.extend(c.options.data[d.index],d.row)}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.initHiddenRows=function(){this.hiddenRows=[]},q.prototype.showRow=function(a){this.toggleRow(a,!0)},q.prototype.hideRow=function(a){this.toggleRow(a,!1)},q.prototype.toggleRow=function(b,c){var d,e;b.hasOwnProperty("index")?d=this.getData()[b.index]:b.hasOwnProperty("uniqueId")&&(d=this.getRowByUniqueId(b.uniqueId)),d&&(e=a.inArray(d,this.hiddenRows),c||-1!==e?c&&e>-1&&this.hiddenRows.splice(e,1):this.hiddenRows.push(d),this.initBody(!0))},q.prototype.getHiddenRows=function(){var b=this,c=this.getData(),d=[];return a.each(c,function(c,e){a.inArray(e,b.hiddenRows)>-1&&d.push(e)}),this.hiddenRows=d,d},q.prototype.mergeCells=function(b){var c,d,e,f=b.index,g=a.inArray(b.field,this.getVisibleFields()),h=b.rowspan||1,i=b.colspan||1,j=this.$body.find(">tr");if(this.options.detailView&&!this.options.cardView&&(g+=1),e=j.eq(f).find(">td").eq(g),!(0>f||0>g||f>=this.data.length)){for(c=f;f+h>c;c++)for(d=g;g+i>d;d++)j.eq(c).find(">td").eq(d).hide();e.attr("rowspan",h).attr("colspan",i).show()}},q.prototype.updateCell=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("field")&&a.hasOwnProperty("value")&&(this.data[a.index][a.field]=a.value,a.reinit!==!1&&(this.initSort(),this.initBody(!0)))},q.prototype.updateCellById=function(b){var c=this;if(b.hasOwnProperty("id")&&b.hasOwnProperty("field")&&b.hasOwnProperty("value")){var d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&(c.data[e][d.field]=d.value)}),b.reinit!==!1&&(this.initSort(),this.initBody(!0))}},q.prototype.getOptions=function(){return a.extend(!0,{},this.options)},q.prototype.getSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]===!0})},q.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},q.prototype.checkAll=function(){this.checkAll_(!0)},q.prototype.uncheckAll=function(){this.checkAll_(!1)},q.prototype.checkInvert=function(){var b=this,c=b.$selectItem.filter(":enabled"),d=c.filter(":checked");c.each(function(){a(this).prop("checked",!a(this).prop("checked"))}),b.updateRows(),b.updateSelected(),b.trigger("uncheck-some",d),d=b.getSelections(),b.trigger("check-some",d)},q.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectAll.add(this.$selectAll_).prop("checked",a),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},q.prototype.check=function(a){this.check_(!0,a)},q.prototype.uncheck=function(a){this.check_(!1,a)},q.prototype.check_=function(a,b){var c=this.$selectItem.filter(f('[data-index="%s"]',b)).prop("checked",a);this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b],c)},q.prototype.checkBy=function(a){this.checkBy_(!0,a)},q.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},q.prototype.checkBy_=function(b,c){if(c.hasOwnProperty("field")&&c.hasOwnProperty("values")){var d=this,e=[];a.each(this.options.data,function(g,h){if(!h.hasOwnProperty(c.field))return!1;if(-1!==a.inArray(h[c.field],c.values)){var i=d.$selectItem.filter(":enabled").filter(f('[data-index="%s"]',g)).prop("checked",b);h[d.header.stateField]=b,e.push(h),d.trigger(b?"check":"uncheck",h,i)}}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",e)}},q.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},q.prototype.showLoading=function(){this.$tableLoading.show()},q.prototype.hideLoading=function(){this.$tableLoading.hide()},q.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},q.prototype.toggleFullscreen=function(){this.$el.closest(".bootstrap-table").toggleClass("fullscreen")},q.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url),a&&a.pageNumber&&(this.options.pageNumber=a.pageNumber),a&&a.pageSize&&(this.options.pageSize=a.pageSize),this.initServer(a&&a.silent,a&&a.query,a&&a.url),this.trigger("refresh",a)},q.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&!this.options.cardView&&this.fitFooter()},q.prototype.showColumn=function(a){this.toggleColumn(this.fieldsColumnsIndex[a],!0,!0)},q.prototype.hideColumn=function(a){this.toggleColumn(this.fieldsColumnsIndex[a],!1,!0)},q.prototype.getHiddenColumns=function(){return a.grep(this.columns,function(a){return!a.visible})},q.prototype.getVisibleColumns=function(){return a.grep(this.columns,function(a){return a.visible})},q.prototype.toggleAllColumns=function(b){var c=this;if(a.each(this.columns,function(a){c.columns[a].visible=b}),this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns){var d=this.$toolbar.find(".keep-open input").prop("disabled",!1);d.filter(":checked").length<=this.options.minimumCountColumns&&d.filter(":checked").prop("disabled",!0)}},q.prototype.showAllColumns=function(){this.toggleAllColumns(!0)},q.prototype.hideAllColumns=function(){this.toggleAllColumns(!1)},q.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},q.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},q.prototype.getScrollPosition=function(){return this.scrollTo()},q.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},q.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},q.prototype.nextPage=function(){this.options.pageNumber tr[data-index="%s"]',b));c.next().is("tr.detail-view")===(a?!1:!0)&&c.find("> td > .detail-icon").click()},q.prototype.expandRow=function(a){this.expandRow_(!0,a)},q.prototype.collapseRow=function(a){this.expandRow_(!1,a)},q.prototype.expandAllRows=function(b){if(b){var c=this.$body.find(f('> tr[data-index="%s"]',0)),d=this,e=null,g=!1,h=-1;if(c.next().is("tr.detail-view")?c.next().next().is("tr.detail-view")||(c.next().find(".detail-icon").click(),g=!0):(c.find("> td > .detail-icon").click(),g=!0),g)try{h=setInterval(function(){e=d.$body.find("tr.detail-view").last().find(".detail-icon"),e.length>0?e.click():clearInterval(h)},1)}catch(i){clearInterval(h)}}else for(var j=this.$body.children(),k=0;k' + loc.description + ''); + html += makeOption(loc.pk, loc.pathstring + ' - ' + loc.description + ''); } html += "
    "; @@ -312,10 +312,18 @@ function moveStockItems(items, options) { var item = items[i]; + var name = item.part__IPN; + + if (name) { + name += ' | '; + } + + name += item.part__name; + html += ""; - html += "" + item.part.full_name + ""; - html += "" + item.location.pathstring + ""; + html += "" + name + ""; + html += "" + item.location__path + ""; html += "" + item.quantity + ""; html += ""; @@ -372,14 +380,74 @@ function moveStockItems(items, options) { function loadStockTable(table, options) { + var params = options.params || {}; + + // Aggregate stock items + //params.aggregate = true; + table.bootstrapTable({ sortable: true, search: true, method: 'get', pagination: true, - pageSize: 50, + pageSize: 25, rememberOrder: true, - queryParams: options.params, + formatNoMatches: function() { + return 'No stock items matching query'; + }, + customSort: customGroupSorter, + groupBy: true, + groupByField: options.groupByField || 'part', + groupByFormatter: function(field, id, data) { + + var row = data[0]; + + if (field == 'part__name') { + + var name = row.part__IPN; + + if (name) { + name += ' | '; + } + + name += row.part__name; + + return imageHoverIcon(row.part__image) + name + ' (' + data.length + ' items)'; + } + else if (field == 'part__description') { + return row.part__description; + } + else if (field == 'quantity') { + var stock = 0; + + data.forEach(function(item) { + stock += item.quantity; + }); + + return stock; + } else if (field == 'location__path') { + /* Determine how many locations */ + var locations = []; + + data.forEach(function(item) { + var loc = item.location; + + if (!locations.includes(loc)) { + locations.push(loc); + } + }); + + if (locations.length > 1) { + return "In " + locations.length + " locations"; + } else { + // A single location! + return renderLink(row.location__path, '/stock/location/' + row.location + '/') + } + } + else { + return ''; + } + }, columns: [ { checkbox: true, @@ -392,47 +460,66 @@ function loadStockTable(table, options) { visible: false, }, { - field: 'part_detail', + field: 'part__name', title: 'Part', sortable: true, formatter: function(value, row, index, field) { - return imageHoverIcon(value.image_url) + renderLink(value.full_name, value.url + 'stock/'); + + var name = row.part__IPN; + + if (name) { + name += ' | '; + } + + name += row.part__name; + + return imageHoverIcon(row.part__image) + renderLink(name, '/part/' + row.part + '/stock/'); } }, { - field: 'part_detail.description', + field: 'part__description', title: 'Description', sortable: true, }, { - field: 'location_detail', + field: 'quantity', + title: 'Stock', + sortable: true, + formatter: function(value, row, index, field) { + + var val = value; + + // If there is a single unit with a serial number, use the serial number + if (row.serial && row.quantity == 1) { + val = '# ' + row.serial; + } + + var text = renderLink(val, '/stock/item/' + row.pk + '/'); + + text = text + "" + row.status_text + ""; + return text; + } + }, + { + field: 'location__path', title: 'Location', sortable: true, formatter: function(value, row, index, field) { if (value) { - return renderLink(value.pathstring, value.url); + return renderLink(value, '/stock/location/' + row.location + '/'); } else { return 'No stock location set'; } } }, - { - field: 'quantity', - title: 'Quantity', - sortable: true, - formatter: function(value, row, index, field) { - var text = renderLink(value, row.url); - text = text + "" + row.status_text + ""; - return text; - } - }, { field: 'notes', title: 'Notes', } ], url: options.url, + queryParams: params, }); if (options.buttons) { diff --git a/InvenTree/static/script/inventree/tables.js b/InvenTree/static/script/inventree/tables.js index 979a7d5a21..59bc446d5e 100644 --- a/InvenTree/static/script/inventree/tables.js +++ b/InvenTree/static/script/inventree/tables.js @@ -37,3 +37,74 @@ function linkButtonsToSelection(table, buttons) { enableButtons(buttons, table.bootstrapTable('getSelections').length > 0); }); } + + +function isNumeric(n) { + return !isNaN(parseFloat(n)) && isFinite(n); +} + + +function customGroupSorter(sortName, sortOrder, sortData) { + + console.log('got here'); + + var order = sortOrder === 'desc' ? -1 : 1; + + sortData.sort(function(a, b) { + + // Extract default field values + var aa = a[sortName]; + var bb = b[sortName]; + + // Extract parent information + var aparent = a._data && a._data['parent-index']; + var bparent = b._data && b._data['parent-index']; + + // If either of the comparisons are in a group + if (aparent || bparent) { + + // If the parents are different (or one item does not have a parent, + // then we need to extract the parent value for the selected column. + + if (aparent != bparent) { + if (aparent) { + aa = a._data['table'].options.groupByFormatter(sortName, 0, a._data['group-data']); + } + + if (bparent) { + bb = b._data['table'].options.groupByFormatter(sortName, 0, b._data['group-data']); + } + } + } + + if (aa === undefined || aa === null) { + aa = ''; + } + if (bb === undefined || bb === null) { + bb = ''; + } + + if (isNumeric(aa) && isNumeric(bb)) { + if (aa < bb) { + return order * -1; + } else if (aa > bb) { + return order; + } else { + return 0; + } + } + + aa = aa.toString(); + bb = bb.toString(); + + var cmp = aa.localeCompare(bb); + + if (cmp === -1) { + return order * -1; + } else if (cmp === 1) { + return order; + } else { + return 0; + } + }); +} \ No newline at end of file diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index ec998dde41..7fa88a646f 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -5,6 +5,7 @@ JSON API for the Stock app from django_filters.rest_framework import FilterSet, DjangoFilterBackend from django_filters import NumberFilter +from django.conf import settings from django.conf.urls import url, include from django.urls import reverse @@ -20,6 +21,8 @@ from .serializers import StockTrackingSerializer from InvenTree.views import TreeSerializer from InvenTree.helpers import str2bool +import os + from rest_framework.serializers import ValidationError from rest_framework.views import APIView from rest_framework.response import Response @@ -241,6 +244,7 @@ class StockList(generics.ListCreateAPIView): - POST: Create a new StockItem Additional query parameters are available: + - aggregate: If 'true' then stock items are aggregated by Part and Location - location: Filter stock by location - category: Filter by parts belonging to a certain category - supplier: Filter by supplier @@ -257,6 +261,53 @@ class StockList(generics.ListCreateAPIView): kwargs['context'] = self.get_serializer_context() return self.serializer_class(*args, **kwargs) + def list(self, request, *args, **kwargs): + + queryset = self.filter_queryset(self.get_queryset()) + + # Instead of using the DRF serializer to LIST, + # we will serialize the objects manually. + # This is significantly faster + + data = queryset.values( + 'pk', + 'quantity', + 'serial', + 'batch', + 'status', + 'notes', + 'location', + 'location__name', + 'location__description', + 'part', + 'part__IPN', + 'part__name', + 'part__description', + 'part__image', + 'part__category', + 'part__category__name', + 'part__category__description', + ) + + # Reduce the number of lookups we need to do for categories + # Cache location lookups for this query + locations = {} + + for item in data: + item['part__image'] = os.path.join(settings.MEDIA_URL, item['part__image']) + + loc_id = item['location'] + + if loc_id: + if loc_id not in locations: + locations[loc_id] = StockLocation.objects.get(pk=loc_id).pathstring + + item['location__path'] = locations[loc_id] + else: + item['location__path'] = None + + return Response(data) + def get_queryset(self): """ If the query includes a particular location, @@ -264,7 +315,7 @@ class StockList(generics.ListCreateAPIView): """ # Start with all objects - stock_list = StockItem.objects.all() + stock_list = StockItem.objects.filter(customer=None, belongs_to=None) # Does the client wish to filter by the Part ID? part_id = self.request.query_params.get('part', None) @@ -310,8 +361,14 @@ class StockList(generics.ListCreateAPIView): if supplier_id: stock_list = stock_list.filter(supplier_part__supplier=supplier_id) - # Pre-fetch related objects for better response time - stock_list = self.get_serializer_class().setup_eager_loading(stock_list) + # Also ensure that we pre-fecth all the related items + stock_list = stock_list.prefetch_related( + 'part', + 'part__category', + 'location' + ) + + stock_list = stock_list.order_by('part__name') return stock_list diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index f6651f6dd4..4efa347ecd 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -183,6 +183,9 @@ class StockItem(models.Model): def get_absolute_url(self): return reverse('stock-item-detail', kwargs={'pk': self.id}) + def get_part_name(self): + return self.part.full_name + class Meta: unique_together = [ ('part', 'serial'), diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index ddf06a3db7..21f2ef4e9e 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -57,17 +57,10 @@ class StockItemSerializer(serializers.ModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True) + part_name = serializers.CharField(source='get_part_name', read_only=True) + part_detail = PartBriefSerializer(source='part', many=False, read_only=True) location_detail = LocationBriefSerializer(source='location', many=False, read_only=True) - - @staticmethod - def setup_eager_loading(queryset): - queryset = queryset.prefetch_related('part') - queryset = queryset.prefetch_related('part__stock_items') - queryset = queryset.prefetch_related('part__category') - queryset = queryset.prefetch_related('location') - - return queryset def __init__(self, *args, **kwargs): @@ -88,6 +81,7 @@ class StockItemSerializer(serializers.ModelSerializer): 'pk', 'url', 'part', + 'part_name', 'part_detail', 'supplier_part', 'location', diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index dd2f8bd706..cc58d27197 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -30,6 +30,7 @@ + @@ -87,8 +88,9 @@ InvenTree - + +