scinote-web/app/assets/javascripts/repositories/repository_datatable.js
artoscinote 81a9a7225b
Version 1.25.0 (#4087)
* Add initial implementation of inventory stock management [SCI-6402]

* Add stock column type (#3786)

* Add stock column type

* Create new stock column [SCI-6410]

* Small fixed for stock column [SCI-6410]

* Add stock column validations [SCI-6410]

Co-authored-by: Anton <anton@scinote.net>

* Add stock table renders [SCI-6412] (#3787)

Co-authored-by: Anton <anton@scinote.net>

* Implemented stock management modal [SCI-6417] (#3788)

* Implement inventory stock management modal [SCI-6417]

* Add generalized validation mechanic, some bugfixes [SCI-6417]

* Fix permission check and method name in RepositoryStockValue [SCI-6417]

* Add stock and consumption to assigned items section [SCI-6434] (#3793)

* Added UPDATE_STOCK_CONSUMPTION to MyModule permissons [SCI-6418] (#3781)

* Fix invalid return in reports jobs [SCI-6409] (#3777)

* Added UPDATE_STOCK_CONSUMPTION to MyModule permissons [SCI-6418]

* Add current/new amount section to stock [SCI-6416] (#3791)

Co-authored-by: Anton <anton@scinote.net>

* Task stock consumption modal[SCI-6444][SCI-6445] (#3798)

Add main logic for consumption on task [SCI-6444]

Co-authored-by: Anton <anton@scinote.net>

* Add stock management columns to snapshots [SCI-6448]

* Handle stock management in full table views [SCI-6440]

* Implement stock management activities [SCI-6452] (#3810)

* Implement stock management activities [SCI-6452]

* PR code fixes [SCI-6452]

* Implement import for repository stock values [SCI-6461] (#3818)

* Add permissions checking to assigned items view on tasks [SCI-6435] (#3801)

* Add front-end validation for comments field [SCI-6464] (#3829)

Co-authored-by: Anton <anton@scinote.net>

* Add stock consumption to pdf and docx [SCI-6460] (#3816)

Co-authored-by: Anton <anton@scinote.net>

* Add support of repository snapshots to assigned items section [SCI-6439] (#3828)

* Change subject of Repository (#3838)

* Fixed full view assigned items modal stock consumption (#3846)

* Implement repository snapshots displaying on assigned items full view modal [SCI-6442] (#3862)

* Implement low stock threshold column [SCI-6555] (#3907)

* Stock column fixes [SCI-6455] (#3878)

* Fix issues with stock column management [SCI-6455]

* Refactor stock column in datatables [SCI-6455]

* Fix tests [SCI-6486] (#3913)

* Fix tests [SCI-6486]

* Fix rspec tests [SCI-6486]

Co-authored-by: Anton <anton@scinote.net>

* Implement basic logic for Date/DateTime/Stock reminders [SCI-6554] (#3911)

* Implement basic logic for Date/DateTime/Stock reminders [SCI-6554]

* Implement bell icon [SCI-6500]

* Refactor reminder cells scope [SCI-6554]

* Add red dot for date/datetime reminder [SCI-6499] (#3924)

Co-authored-by: Anton <anton@scinote.net>

* Add reminders to stock modal [SCI-6557] (#3917)

Co-authored-by: Anton <anton@scinote.net>

* Add flyout for repository reminders [SCI-6501] (#3926)

Co-authored-by: Anton <anton@scinote.net>

* Fix moving experiment [SCI-6602] (#3927)

* Update Rails to 6.1.4.7 [SCI-6615] (#3928)

* Task inventory activity for assigned item consumption [SCI-6453] (#3830)

* Add task inventory activity [SCI-6453]

* Apply user's time zone in advanced filters for time data type [SCI-6585] (#3930)

* Bump version to 1.24.2

* Implement hidden repository cell reminders [SCI-6504] (#3933)

* Low stock flyout reminders [SCI-6502] (#3932)

* Display low stock flyout reminder [SCI-6502]

* Display low stock flyout reminder [SCI-6502]

* Adapt showing stock reminders for every bell icon click [SCI-6502]

* Correct hound error [SCI-6502]

* Fix event registration for fetching reminder data [SCI-6502]

* Fix event registration for fetching reminder data [SCI-6502]

* Fix hound [SCI-6502]

* Remove not needed line [SCI-6502]

* Add reminder template [SCI-6502]

* Add clearing messages [SCI-6502]

* Displaying low stock warning [SCI-6497] (#3912)

* Low stock warning [SCI-6497

* Fix some bugs [SCI-6497]

* Fix to long line [SCI-6497]

* Clean not needed information in renderes [SCI-6497]

* Icon bell reminder for an assigned item on the task [SCI-6506] (#3929)

* Add bell icon on assigned task [SCI-6506]

* Add flyout and improve quering [SCI-6506]

* Refactor repository toolbar [SCI-6545] (#3943)

Co-authored-by: Anton <anton@scinote.net>

* Add datetime reminders to columns modal [SCI-6556] (#3934)

Co-authored-by: Anton <anton@scinote.net>

* Hide reminders for archived repositories [SCI-6609] (#3941)

* Hide reminders for archived repositories [SCI-6609]

* Always pass repository in datatable helper [SCI-6609]

* Handle locked stock consumption state [SCI-6608] (#3942)

* Change env variable name for s3 bucket region [SCI-6603] (#3944)

* Add last_transition_error column to tasks [SCI-6610] (#3949)

* Add microtransactions to stock consumptions [SCI-6626] (#3948)

Co-authored-by: Anton <anton@scinote.net>

* Date remidner flyout [SCI-6503] (#3937)

* Implement date reminder flyout [SCI-6503]

* Show only days left for date reminder [SCI-6503]

* Pluralize day in reminders [SCI-6503]

* Create partials for different reminders [SCI-6503]

* Unify css for reminder [SCI-6503]

* Add micro interactions for stock modal [SCI-6625] (#3947)

Co-authored-by: Anton <anton@scinote.net>

* Hide options to add New Tags for users without permissions on Task level [SCI-6573] (#3945)

* Bump lodash-es from 4.17.15 to 4.17.21 (#3939)

Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.15 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.21)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Implement clearing hidden repository reminders [SCI-6507] (#3936)

* Add stock filters [SCI-6547] (#3938)

Co-authored-by: Anton <anton@scinote.net>

* Fix assign view for task repository [SCI-6648] (#3954)

Co-authored-by: Anton <anton@scinote.net>

* Add micro-interactions to reminders flyout [SCI-6627] (#3951)

Co-authored-by: Anton <anton@scinote.net>

* Improve error reporting in task status transition [SCI-6611] (#3952)

* Add ordering to global search results [SCI-6639] (#3960)

* Fix multiple stock bugs [SCI-6651] (#3959)

Co-authored-by: Anton <anton@scinote.net>

* Fix large previews for csv files [SCI-6619] (#3961)

* Add alias to cell sort query, to prevent join conflicts [SCI-6649] (#3953)

* Add alias to cell sort query, to prevent join conflicts [SCI-6649]

* Added value_type to join condition to make use of DB index [SCI-6649]

* Update front end validation for columns managment [SCI-6657] (#3962)

Co-authored-by: Anton <anton@scinote.net>

* Print protocol smart annotation and table improvements [SCI-6566] (#3925)

* Improve table printing in the print menu [SCI-6566]

* Open smart annotation in new tab for print view [SCI-6566]

* Unify naming of same parameter [SCI-6566]

* Fix typo [SCI-6566]

* Fix hound errors [SCI-6566]

* Add stock management toggling [SCI-6653] (#3967)

Co-authored-by: Anton <anton@scinote.net>

* Fix caching of an experiment card dropdown [SCI-6606] (#3963)

* Add stock consumption permission to user roles [SCI-6665] (#3966)

* Show archive icon only on archived projects in the header [SCI-6617] (#3965)

* Fix assigned items fullview modal [SCI-6664] (#3968)

* Implement hide all repository reminders button [SCI-6505] (#3940)

* Viewer role does not see any tasks in archived project [SCI-6616] (#3958)

* Fix viewer role not see any tasks in archived project [SCI-6616]

* Fix rollback for add read archive permission migration [SCI-6616]

* Stock modal bugs [SCI-6667] (#3970)

Co-authored-by: Anton <anton@scinote.net>

* Always use Tika text extractor in server mode [SCI-6658] (#3957)

* Implement stock consumption via the API [SCI-6642] (#3964)

* Implement stock consumption via the API [SCI-6642]

* Remove unnecessary attribute from InventoryItemSerializer [SCI-6642]

* Amend permission check, add nested transaction support to consume_stock method [SCI-6642]

* Toolbar fixes [SCI-6670] (#3973)

Co-authored-by: Anton <anton@scinote.net>

* Make stock column work properly with different orders [SCI-6677] (#3974)

* Fix filters loading for stock filter [SCI-6687] (#3975)

Co-authored-by: Anton <anton@scinote.net>

* Hide reminders and disable stock consumption for archived items [SCI-6689] (#3978)

* Fix red dot for datetime columns [SCI-6684] (#3977)

Co-authored-by: Anton <anton@scinote.net>

* Fix saving of inventory date time reminders saving [SCI-6672] (#3976)

* Bump puma from 5.6.2 to 5.6.4 (#3972)

Bumps [puma](https://github.com/puma/puma) from 5.6.2 to 5.6.4.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v5.6.2...v5.6.4)

---
updated-dependencies:
- dependency-name: puma
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Don't load reminders if the stock feature is disabled [SCI-6673] (#3981)

* Don't load reminders if the stock feature is disabled [SCI-6673]

* Don't load reminders if the stock feature is disabled [SCI-6673]

* Unify stock management enabled check [6673]

* Update repository card view for stock [SCI-6685] (#3982)

Co-authored-by: Anton <anton@scinote.net>

* Disable stock managememnt for all tables in my module context [SCI-6692] (#3983)

* Implement failed snapshot pop-up on task screen [SCI-6612] (#3950)

* Implement failed snapshot pop-up on task screen [SCI-6612]

* Copy change [SCI-6612]

* Proper handling of snapshot transition error [SCI-6612]

* Move modal auto open logic to JS file [SCI-6612]

* Remove unnecessary .html_safe [SCI-6612]

* Fix assigning and consuming items [SCI-6686] (#3985)

* Repository toolbar CSS fixes [SCI-6676] (#3984)

Co-authored-by: Anton <anton@scinote.net>

* Add basic validation to reminder value to prevent integer overflow errors [SCI-6693] (#3986)

* Fix reminder dropdown on task screen [SCI-6678] (#3987)

Co-authored-by: Anton <anton@scinote.net>

* Fix inventory sorting with date time reminders [SCI-6683] (#3980)

* Fix css stock modal [SCI-6675] (#3989)

Co-authored-by: Anton <anton@scinote.net>

* Stock column management UX/UI fixes [SCI-6674] (#3979)

* Fix red dot for dates in repository [SCI-6696] (#3991)

Co-authored-by: Anton <anton@scinote.net>

* Added styling for failed snapshots in sidebar [SCI-6636] (#3990)

* Added styling for failed snapshots in sidebar [SCI-6636]

* Simplify markup for failed icon [SCI-6636]

* Turn off autocomplete for stock amount/reminder [SCI-6694] (#3988)

* Override error styling in stock column management [SCI-6674] (#3995)

* Fix repository full view tables without stock management [SCI-6703] (#3994)

* Add pagination to projects list [SCI-6655]

* Add reminder preset to date(time) reminders [SCI-6693] (#3996)

* Fix color on consumption link [SCI-6686] (#3992)

* Fix sorting by date time columns in inventories [SCI-6683] (#4002)

* Improve loading of the dashboard [SCI-6618] (#4001)

* Stock modal UX fixes [SCI-6714] (#3998)

Co-authored-by: Anton <anton@scinote.net>

* Fix css for stotck modal [SCI-6698] (#3999)

Co-authored-by: Anton <anton@scinote.net>

* API: add endpoint for updating of stock [SCI-6549] (#3955)

* Add test for Stock repository cell [SCI-6549]

* Create and update stock inventory cell [SCI-6549]

* Fix hound errors [SCI-6549]

* Fix ledger recording [SCI-6549]

* Fix api endpoint [SCI-6549]

* Fix hound [SCI-6549]

* Fix collapsing of assigned items tables [SCI-6705] (#4000)

* API: add endpoint for creating stock column [SCI-6550] (#3956)

* Add test for repositoty stock column api [SCI-6550]

* Create and update stock column [SCI-6550]

* Change stock unit [SCI-6550]

* Fix hound [SCI-6550]

* Fix on delete [SCI-6550]

* Fix houd [SCI-6550]

* Removed autofocus clear on open reminder flyout [SCI-6690] (#4003)

* Removed clear autofocus on open reminder flyout [SCI-6690]

* Fix hound [SCI-6690]

* Adding/changing stock consumption [SCI-6708] (#4005)

* Adding/changing stock consumption [SCI-6708]

* Fix hound [SCI-6708]

* Remove date red dots for snapshots [SCI-6715] (#4004)

Co-authored-by: Anton <anton@scinote.net>

* Add snapshot error message below task status [SCI-6614] (#4009)

* Add repository snapshot error modal [SCI-6613] (#3993)

* Bump nokogiri from 1.13.3 to 1.13.4 (#4008)

Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.3 to 1.13.4.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.13.4/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.3...v1.13.4)

---
updated-dependencies:
- dependency-name: nokogiri
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add pagination for experiments [SCI-6656]

* Fix sorting by time and time range columns [SCI-6683] (#4011)

* Bump moment from 2.24.0 to 2.29.2 (#4006)

Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.2)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Align items in assigned item section [SCI-6707] (#4007)

* Add locking and unique index to repository row assigning [SCI-6591] (#3921)

* tmp (#3935)

* Revert "tmp (#3935)" (#4014)

This reverts commit 043086d55f.

* Move cursor to end of value when focusing consumption amount [SCI-6727] (#4013)

* Fix removing stock reminder threshold [SCI-6724] (#4010)

* Stock small ux fixes [SCI-6714] (#4015)

Co-authored-by: Anton <anton@scinote.net>

* Add aibility to delete stock column [SCI-6723] (#4017)

Co-authored-by: Anton <anton@scinote.net>

* Fix red dot for date reminders [SCI-6696] (#4016)

Co-authored-by: Anton <anton@scinote.net>

* Change the way setting stock works [SCI-6730] (#4018)

* Fix error modal opening on successful snapshot [SCI-6726] (#4019)

* Refactor and fix display of stock warnings and stock consumption [SCI-6734] (#4021)

* Refactor and fix how stock consumption is displayed [SCI-6734]

* Refactor and fix display of stock warnings [SCI-6734]

* Fix stock consumption in reports [SCI-6735]

* Fix markup

* Focus authenticator code field [SCI-6716] (#4022)

* Hide reminders settings and red dots if stock is disabled [SCI-6673] (#4024)

* Fix decimals in stock consumption modal [SCI-6732]

* Add edit title for stock consumption modal [SCI-6731]

* Highlight negative stock in modal with red [SCI-6729]

* Stock management test [SCI-6420] (#3946)

* Initial test for stock management

* Repository stock values adding [does not work] SCI-6420

* Fix typos SCI-6420

* Fix test [SCI-6420]

* Test changes [SCI-6402]

* Remove locking test [SCI-6420]

* Remove lock [SCI-6420]

* Remove serializer [SCI-6420]

* Fix stock test and add ledger creation on consume [SCI-6420]

* Fix inviting users to team [SCI-6725] (#4026)

* Improve stock ledger records creation [SCI-6419]

* Fix stock modal add/remove value preset value [SCI-6740]

* API GET repository stock column output fix [SCI-6550] (#4030)

* Add include stock unit items to Stock column get [SCI-6550]

* Fix stock column test [SCI-6550]

* Fix hound [SCI-6550]

* Move list-type column includes to param, unify naming [SCI-6738] (#4036)

* Add default includes for inventory columns with lists [SCI-6738]

* Move list-type column includes to param, unify naming [SCI-6738]

* Fix snapshot consumption display [SCI-6734] (#4035)

* Fix decimal render function [SCI-6742] (#4037)

Co-authored-by: Anton <anton@scinote.net>

* Add comment to repository stock activities [SCI-6746]

* Fix default stock column default units selection [SCI-6744]

* Add negative validation for stock [SCI-6743]

* Highlight negative value in consumption modal [SCI-6741]

* Fix snapshot creation with stock consumption [SCI-6762]

* Update stock value without reloading the table [SCI-6745] (#4041)

* Allow tag creation on task level if you have permission [SCI-6573] (#4031)

* Enable team normal user to edit repository files [SCI-6765] (#4049)

* Add negative validation for treshold [SCI-6743]

* Copy fix [SCI-6762] (#4048)

* Add bell icon for negative stock [SCI-6770]

* Fix formatting of stock consumption on tasks [SCI-6737] (#4050)

* Fix duplicated inventories on tasks for export all [SCI-6776]

* Stock / stock consumption display fixes [SCI-6771] (#4054)

* Fix blank stock consumption representation in reports [SCI-6769]

* Upgrade Rails to 6.1.5.1

* Show last page message only after second page [SCI-6761]

* Small CSS fixes for repository [SCI-6767]

* Added validations for date(time) column reminder [SCI-6775] (#4063)

* Upgrade Ruby to 2.7.6

* Open repository on print view [SCI-6566] (#4055)

* Fix saving of new date time columns with reminders [SCI-6774] (#4068)

* Improve input field for adding new team [SCI-6155]

* Allow deleteion of stock columns when stock management is disabled [SCI-6800]

* Update default label template [SCI-6763] (#4064)

* Stock editing and reminder fixes [SCI-6803] (#4078)

* Fix stock editing after adding new value [SCI-6803]

* Don't load reminders for snapshots [SCI-6803]

* Improve loading time of canvas view/edit [SCI-6797]

* Fix stock consumption rounding [SCI-6807]

* Fix displaying of stock consumption units [SCI-6795]

* Fix task dropdown actions [SCI-6817]

* Fix archived tasks view [SCI-6822]

* Fix display of repository snapshot with stock consumption [SCI-6824]

* Fix duplicated counters on task card [SCI-6825]

* Bump version to 1.25.0

Co-authored-by: Oleksii Kriuchykhin <okriuchykhin@biosistemika.com>
Co-authored-by: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com>
Co-authored-by: Anton <anton@scinote.net>
Co-authored-by: ajugo <andrej.jugovic7@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-11 10:39:51 +02:00

898 lines
30 KiB
JavaScript

/*
globals I18n _ SmartAnnotation FilePreviewModal animateSpinner DataTableHelpers
HelperModule RepositoryDatatableRowEditor prepareRepositoryHeaderForExport
initAssignedTasksDropdown initBMTFilter initReminderDropdown
*/
//= require jquery-ui/widgets/sortable
//= require repositories/row_editor.js
var RepositoryDatatable = (function(global) {
'use strict';
var TABLE_ID = '';
var TABLE_WRAPPER_ID = '.repository-table';
var TABLE = null;
var EDITABLE = false;
var SELECT_ALL_SELECTOR = '#checkbox > input[name=select_all]';
const STATUS_POLLING_INTERVAL = 10000;
var rowsSelected = [];
var rowsLocked = [];
// Tells whether we're currently viewing or editing table
var currentMode = 'viewMode';
// Extend datatables API with searchable options
// (http://stackoverflow.com/questions/39912395/datatables-dynamically-set-columns-searchable)
$.fn.dataTable.Api.register('isColumnSearchable()', function(colSelector) {
var idx = this.column(colSelector).index();
return this.settings()[0].aoColumns[idx].bSearchable;
});
$.fn.dataTable.Api
.register('setColumnSearchable()', function(colSelector, value) {
if (value !== this.isColumnSearchable(colSelector)) {
let idx = this.column(colSelector).index();
this.settings()[0].aoColumns[idx].bSearchable = value;
if (value === true) {
this.rows().invalidate();
}
}
return value;
});
// Enable/disable edit button
function updateButtons() {
if (currentMode === 'viewMode') {
$(TABLE_WRAPPER_ID).removeClass('editing');
$('#saveCancel').hide();
$('.manage-repo-column-index').prop('disabled', false);
$('#addRepositoryRecord').prop('disabled', false);
$('.dataTables_length select').prop('disabled', false);
$('#repository-acitons-dropdown').prop('disabled', false);
$('#repository-columns-dropdown').find('.dropdown-toggle').prop('disabled', false);
$('th').removeClass('disable-click');
$('.repository-row-selector').prop('disabled', false);
$('.dataTables_filter input').prop('disabled', false);
$('#addRepositoryRecord').show();
if (!$('#saveRepositoryFilters').hasClass('hidden')) {
$('#saveRepositoryFilters').show();
}
$('#hideRepositoryReminders').show();
$('#importRecordsButton').show();
if (rowsSelected.length === 0) {
$('#exportRepositoriesButton').addClass('disabled');
$('#copyRepositoryRecords').prop('disabled', true);
$('#editRepositoryRecord').prop('disabled', true);
$('#archiveRepositoryRecordsButton').prop('disabled', true);
$('#restoreRepositoryRecords').prop('disabled', true);
$('#deleteRepositoryRecords').prop('disabled', true);
$('#editDeleteCopy').hide();
$('#toolbarPrintLabel').hide();
} else {
if (rowsSelected.length === 1) {
$('#editRepositoryRecord').prop('disabled', false);
} else {
$('#editRepositoryRecord').prop('disabled', true);
}
$('#exportRepositoriesButton').removeClass('disabled');
$('#archiveRepositoryRecordsButton').prop('disabled', false);
$('#copyRepositoryRecords').prop('disabled', false);
$('#restoreRepositoryRecords').prop('disabled', false);
$('#deleteRepositoryRecords').prop('disabled', false);
$('#importRecordsButton').hide();
if (rowsSelected.some(r=> rowsLocked.indexOf(r) >= 0)) { // Some selected rows is rowsLocked
$('#editRepositoryRecord').prop('disabled', true);
$('#archiveRepositoryRecordsButton').prop('disabled', true);
}
$('#editDeleteCopy').show();
$('#toolbarPrintLabel').show();
}
} else if (currentMode === 'editMode') {
$(TABLE_WRAPPER_ID).addClass('editing');
$('#importRecordsButton').hide();
$('#editDeleteCopy').hide();
$('#addRepositoryRecord').hide();
$('#hideRepositoryReminders').hide();
if (!$('#saveRepositoryFilters').hasClass('hidden')) {
$('#saveRepositoryFilters').hide();
}
$('#saveCancel').show();
$('.manage-repo-column-index').prop('disabled', true);
$('#repository-acitons-dropdown').prop('disabled', true);
$('.dataTables_length select').prop('disabled', true);
$('#addRepositoryRecord').prop('disabled', true);
$('#editRepositoryRecord').prop('disabled', true);
$('#archiveRepositoryRecordsButton').prop('disabled', true);
$('#assignRepositoryRecords').prop('disabled', true);
$('#unassignRepositoryRecords').prop('disabled', true);
$('#repository-columns-dropdown').find('.dropdown-toggle').prop('disabled', true);
$('th').addClass('disable-click');
$('.repository-row-selector').prop('disabled', true);
$('.dataTables_filter input').prop('disabled', true);
$('#toolbarPrintLabel').hide();
}
$('#toolbarPrintLabel').data('rows', JSON.stringify(rowsSelected));
}
function clearRowSelection() {
$('.dt-body-center .repository-row-selector').prop('checked', false);
$('.dt-body-center .repository-row-selector').closest('tr').removeClass('selected');
rowsSelected = [];
}
function disableCheckboxToggleOnCheckboxPreview() {
$('.checklist-dropdown').click(function(e) {
$(e.currentTarget).closest('tr').find('.repository-row-selector').trigger('click');
});
}
function changeToViewMode() {
currentMode = 'viewMode';
// Table specific stuff
TABLE.button(0).enable(true);
$(TABLE_WRAPPER_ID).find('tr').removeClass('blocked');
updateButtons();
disableCheckboxToggleOnCheckboxPreview();
}
function changeToEditMode() {
currentMode = 'editMode';
// Table specific stuff
TABLE.button(0).enable(false);
clearRowSelection();
$(TABLE_WRAPPER_ID).find('tr:not(.editing)').addClass('blocked');
updateButtons();
}
// Updates "Select all" control in a data table
function updateDataTableSelectAllCtrl() {
var $table = TABLE.table().node();
var $header = TABLE.table().header();
var $chkboxAll = $('.repository-row-selector', $table);
var $chkboxChecked = $('.repository-row-selector:checked', $table);
var chkboxSelectAll = $(SELECT_ALL_SELECTOR, $header).get(0);
// If none of the checkboxes are checked
if ($chkboxChecked.length === 0) {
chkboxSelectAll.checked = false;
if ('indeterminate' in chkboxSelectAll) {
chkboxSelectAll.indeterminate = false;
}
// If all of the checkboxes are checked
} else if ($chkboxChecked.length === $chkboxAll.length) {
chkboxSelectAll.checked = true;
if ('indeterminate' in chkboxSelectAll) {
chkboxSelectAll.indeterminate = false;
}
// If some of the checkboxes are checked
} else {
chkboxSelectAll.checked = true;
if ('indeterminate' in chkboxSelectAll) {
chkboxSelectAll.indeterminate = true;
}
}
}
function initRowSelection() {
// Handle clicks on checkbox
$(TABLE_ID).on('change', '.repository-row-selector', function(ev) {
var $row;
var data;
var rowId;
var index;
if (currentMode !== 'viewMode') {
return;
}
// Get row ID
$row = $(this).closest('tr');
data = TABLE.row($row).data();
rowId = data.DT_RowId;
// Determine whether row ID is in the list of selected row IDs
index = $.inArray(rowId, rowsSelected);
// If checkbox is checked and row ID is not in list of selected row IDs
if (this.checked && index === -1) {
rowsSelected.push(rowId);
// Otherwise, if checkbox is not checked and row ID is in list of selected row IDs
} else if (!this.checked && index !== -1) {
rowsSelected.splice(index, 1);
}
if (this.checked) {
$row.addClass('selected');
} else {
$row.removeClass('selected');
}
updateDataTableSelectAllCtrl();
ev.stopPropagation();
updateButtons();
// Update number of selected records info
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
});
// Handle click on "Select all" control
$(SELECT_ALL_SELECTOR).change(function(ev) {
if (this.checked) {
$('.repository-row-selector:not(:checked)').trigger('click');
} else {
$('.repository-row-selector:checked').trigger('click');
}
// Prevent click event from propagating to parent
ev.stopPropagation();
});
}
function checkAvailableColumns() {
$.ajax({
url: $(TABLE_ID).data('available-columns'),
type: 'GET',
dataType: 'json',
success: function(data) {
var columnsIds = data.columns;
var presentColumns = $(TABLE_ID).data('repository-columns-ids');
if (!_.isEqual(columnsIds.sort(), presentColumns.sort())) {
alert($(TABLE_ID).data('columns-changed'));
animateSpinner();
location.reload();
}
},
error: function() {
location.reload();
}
});
}
function initItemEditIcon() {
$(TABLE_ID).on('click', '.repository-row-edit-icon', function(ev) {
let rowId = $(ev.target).closest('tr').attr('id');
let row = TABLE.row(`#${rowId}`);
$(row.node()).find('.repository-row-selector').trigger('click');
checkAvailableColumns();
$(TABLE_ID).find('.repository-row-edit-icon').remove();
RepositoryDatatableRowEditor.switchRowToEditMode(row);
changeToEditMode();
});
}
function initSaveButton() {
$(TABLE_WRAPPER_ID).on('click', '#saveRecord', function() {
var $table = $(TABLE_ID);
RepositoryDatatableRowEditor.validateAndSubmit($table);
});
}
function resetTableView() {
var filterSaveButtonVisible = !$('#saveRepositoryFilters').hasClass('hidden');
$.getJSON($(TABLE_ID).data('toolbar-url'), (data) => {
$('#toolbarButtonsDatatable').remove();
$(data.html).appendTo('div.toolbar');
if (filterSaveButtonVisible) {
$('#saveRepositoryFilters').removeClass('hidden');
}
if (typeof initBMTFilter === 'function') initBMTFilter();
});
TABLE.ajax.reload(null, false);
changeToViewMode();
SmartAnnotation.closePopup();
animateSpinner(null, false);
}
function initCancelButton() {
$(TABLE_WRAPPER_ID).on('click', '#cancelSave', function() {
resetTableView();
});
}
function appendInput(form, val, name) {
$(form).append(
$('<input>').attr('type', 'hidden').attr('name', name).val(val)
);
}
function initHeaderTooltip() {
// Fix compatibility of fixed table header and column names modal-tooltip
$('.modal-tooltip').off();
$('.modal-tooltip').hover(function() {
var $tooltip = $(this).find('.modal-tooltiptext');
var offsetLeft = $tooltip.offset().left;
var offsetTop = $tooltip.offset().top;
if ((offsetLeft + 200) > $(window).width()) {
offsetLeft -= 150;
}
$('body').append($tooltip);
$tooltip.css('background-color', '#d2d2d2');
$tooltip.css('border-radius', '6px');
$tooltip.css('color', '#333');
$tooltip.css('display', 'block');
$tooltip.css('left', offsetLeft + 'px');
$tooltip.css('padding', '5px');
$tooltip.css('position', 'absolute');
$tooltip.css('text-align', 'center');
$tooltip.css('top', offsetTop + 'px');
$tooltip.css('visibility', 'visible');
$tooltip.css('width', '200px');
$tooltip.css('word-wrap', 'break-word');
$(this).data('dropdown-tooltip', $tooltip);
}, function() {
$(this).append($(this).data('dropdown-tooltip'));
$(this).data('dropdown-tooltip').removeAttr('style');
});
}
function initExportActions() {
$('#exportRepositoriesButton').on('click', function() {
$('#exportRepositoryModal').modal('show');
});
$('form#form-export').off().submit(function() {
var form = this;
if (currentMode === 'viewMode') {
// Remove all hidden fields
$(form).find('input[name=row_ids\\[\\]]').remove();
$(form).find('input[name=header_ids\\[\\]]').remove();
// Append visible column information
$('table' + TABLE_ID + ' thead tr th').each(function() {
var th = $(this);
var val = prepareRepositoryHeaderForExport(th);
if (val) {
appendInput(form, val, 'header_ids[]');
}
});
// Append records
$.each(rowsSelected, function(index, rowId) {
appendInput(form, rowId, 'row_ids[]');
});
}
})
.on('ajax:beforeSend', function() {
animateSpinner(null, true);
})
.on('ajax:complete', function() {
$('#exportRepositoryModal').modal('hide');
animateSpinner(null, false);
})
.on('ajax:success', function(ev, data) {
HelperModule.flashAlertMsg(data.message, 'success');
})
.on('ajax:error', function(ev, data) {
HelperModule.flashAlertMsg(data.responseJSON.message, 'danger');
});
}
// Adjust columns width in table header
function adjustTableHeader() {
TABLE.columns.adjust();
$('.dropdown-menu').parent()
.on('shown.bs.dropdown hidden.bs.dropdown', function() {
TABLE.columns.adjust();
});
}
function checkSnapshottingStatus() {
$.getJSON($(TABLE_ID).data('status-url'), (statusData) => {
if (statusData.snapshot_provisioning) {
setTimeout(() => { checkSnapshottingStatus(); }, STATUS_POLLING_INTERVAL);
} else {
EDITABLE = statusData.editable;
$('.repository-provisioning-notice').remove();
resetTableView();
}
});
}
function dataTableInit() {
TABLE = $(TABLE_ID).DataTable({
dom: "R<'repository-toolbar hidden'<'repository-search-container'f>>t<'pagination-row hidden'<'pagination-info'li><'pagination-actions'p>>",
stateSave: true,
processing: true,
serverSide: true,
sScrollX: '100%',
sScrollXInner: '100%',
order: $(TABLE_ID).data('default-order'),
stateDuration: 0,
colReorder: {
fixedColumnsLeft: 2,
realtime: false
},
destroy: true,
ajax: {
url: $(TABLE_ID).data('source'),
contentType: 'application/json',
data: function(d) {
d.archived = $('.repository-show').hasClass('archived');
if ($('[data-external-ids]').length) {
d.external_ids = $('[data-external-ids]').attr('data-external-ids').split(',');
}
if ($('[data-repository-filter-json]').attr('data-repository-filter-json')) {
d.advanced_search = JSON.parse($('[data-repository-filter-json]').attr('data-repository-filter-json'));
}
return JSON.stringify(d);
},
global: false,
type: 'POST'
},
columnDefs: [{
// Checkbox column needs special handling
targets: 0,
visible: true,
searchable: false,
orderable: false,
className: 'dt-body-center',
sWidth: '1%',
render: function(data, type, row) {
return `<input class='repository-row-selector sci-checkbox' type='checkbox' data-editable="${row.recordEditable}">
<span class='sci-checkbox-label'></span>`;
}
}, {
// Assigned column is not searchable
targets: 1,
visible: true,
searchable: false,
orderable: true,
className: 'assigned-column',
sWidth: '1%',
render: function(data, type, row) {
let content = $.fn.dataTable.render.AssignedTasksValue(data, row);
let icon;
if (!row.recordEditable) {
icon = `<i class="repository-row-lock-icon fas fa-lock" title="${I18n.t('repositories.table.locked_item')}"></i>`;
} else if (EDITABLE) {
icon = '<i class="repository-row-edit-icon fas fa-pencil-alt" data-view-mode="active"></i>';
} else {
icon = '';
}
content = icon + content;
return content;
}
}, {
// Name column is clickable
targets: 3,
visible: true,
render: function(data, type, row) {
return "<a href='" + row.recordInfoUrl + "'"
+ "class='record-info-link'>" + data + '</a>';
}
}, {
// Added on column
targets: 4,
class: 'added-on',
visible: true
}, {
targets: '_all',
render: function(data) {
if (typeof data === 'object' && $.fn.dataTable.render[data.value_type]) {
return $.fn.dataTable.render[data.value_type](data);
}
return data;
}
},
{
targets: 'row-stock',
className: 'item-stock',
sWidth: '1%',
render: function(data) {
return $.fn.dataTable.render.RepositoryStockValue(data);
}
}],
language: {
emptyTable: I18n.t('repositories.show.no_items'),
zeroRecords: I18n.t('repositories.show.no_items_matched')
},
rowCallback: function(row, data) {
$(row).attr('data-editable', data.recordEditable);
$(row).attr('data-manage-stock-url', data.manageStockUrl);
// Get row ID
let rowId = data.DT_RowId;
// If row ID is in the list of selected row IDs
if ($.inArray(rowId, rowsSelected) !== -1) {
$(row).find('input[type="checkbox"]').prop('checked', true);
$(row).addClass('selected');
}
},
columns: (function() {
var columns = $(TABLE_ID).data('default-table-columns');
var customColumns = $(TABLE_ID).find('thead th[data-type]');
for (let i = 0; i < columns.length; i += 1) {
columns[i].data = String(i);
columns[i].defaultContent = '';
}
customColumns.each((i, column) => {
var columnData = $(column).data('type') === 'RepositoryStockValue' ? 'stock' : String(columns.length);
columns.push({
visible: true,
searchable: true,
data: columnData,
defaultContent: $.fn.dataTable.render['default' + column.dataset.type](column.id)
});
});
return columns;
}()),
drawCallback: function() {
animateSpinner(this, false);
changeToViewMode();
updateDataTableSelectAllCtrl();
// Prevent row toggling when selecting user smart annotation link
SmartAnnotation.preventPropagation('.atwho-user-popover');
// Show number of selected rows near pages info
$('#repository-table_info').append('<span id="selected_info"></span>');
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
checkArchivedColumnsState();
},
preDrawCallback: function() {
var archived = $('.repository-show').hasClass('archived');
TABLE.context[0].oLanguage.sEmptyTable = archived ? I18n.t('repositories.show.no_archived_items') : I18n.t('repositories.show.no_items');
TABLE.context[0].oLanguage.sZeroRecords = archived ? I18n.t('repositories.show.no_archived_items_matched') : I18n.t('repositories.show.no_items_matched');
animateSpinner(this);
$('.record-info-link').off('click');
},
stateLoadCallback: function(settings, callback) {
var repositoryId = $(TABLE_ID).data('repository-id');
$.ajax({
url: '/repositories/' + repositoryId + '/state_load',
data: {},
dataType: 'json',
type: 'POST',
success: function(json) {
var archived = $('.repository-show').hasClass('archived');
if (json.state.columns[6]) json.state.columns[6].visible = archived;
if (json.state.columns[7]) json.state.columns[7].visible = archived;
if (json.state.search) delete json.state.search;
callback(json.state);
}
});
},
stateSaveCallback: function(settings, data) {
// Send an Ajax request to the server with the state object
let repositoryId = $(TABLE_ID).data('repository-id');
$.ajax({
url: '/repositories/' + repositoryId + '/state_save',
contentType: 'application/json',
data: JSON.stringify({ state: data }),
dataType: 'json',
type: 'POST'
});
},
fnInitComplete: function() {
initHeaderTooltip();
disableCheckboxToggleOnCheckboxPreview();
DataTableHelpers.initSearchField(
$(TABLE_ID).closest('.dataTables_wrapper'),
I18n.t('repositories.show.filter_inventory_items')
);
let toolBar = $($('#repositoryToolbar').html());
toolBar.find('.toolbar-search').html($('.repository-search-container'));
$('.repository-toolbar').html(toolBar);
if (typeof initBMTFilter === 'function') initBMTFilter();
RepositoryDatatableRowEditor.initFormSubmitAction(TABLE);
initExportActions();
initItemEditIcon();
initSaveButton();
initCancelButton();
DataTableHelpers.initLengthAppearance($(TABLE_ID).closest('.dataTables_wrapper'));
$('<img class="barcode-scanner" src="/images/icon_small/barcode.png"></img>').appendTo($('.search-container'));
if ($('.repository-show').length) {
$('.dataTables_scrollBody, .dataTables_scrollHead').css('overflow', '');
}
$('.repository-toolbar, .pagination-row').removeClass('hidden');
$(TABLE_ID).find('tr[data-editable=false]').each(function(_, e) {
rowsLocked.push(parseInt($(e).attr('id'), 10));
});
// go back to manage columns index in modal, on column save, after table loads
$('#manage-repository-column .back-to-column-modal').trigger('click');
initAssignedTasksDropdown(TABLE_ID);
initReminderDropdown(TABLE_ID);
renderFiltersDropdown();
setTimeout(function() {
adjustTableHeader();
}, 500);
}
});
// hack to replace filter placeholder
$('.dataTables_filter .form-control').attr('placeholder', $('.dataTables_filter label').text());
$('.dataTables_filter label').contents().filter(function() {
return this.nodeType === 3;
}).remove();
// Handle click on table cells with checkboxes
$(TABLE_ID).on('click', 'tbody td', function(ev) {
// Skip if clicking on selector checkbox, edit icon or link
if ($(ev.target).is('.row-reminders-icon, .repository-row-selector, .repository-row-edit-icon, a')) return;
$(this).parent().find('.repository-row-selector').trigger('click');
});
// Handling of special errors
$(TABLE_ID).on('xhr.dt', function(e, settings, json) {
if (json.custom_error) {
json.data = [];
json.recordsFiltered = 0;
json.recordsTotal = 0;
TABLE.one('draw', function() {
$('#filtersDropdownButton').removeClass('active-filters');
$('#saveRepositoryFilters').addClass('hidden');
$('.repository-table-error').addClass('active').text(json.custom_error);
});
}
})
initRowSelection();
$(window).resize(() => {
setTimeout(() => {
adjustTableHeader();
}, 500);
});
return TABLE;
}
global.onClickDeleteRecord = function() {
animateSpinner();
$.ajax({
url: $('table' + TABLE_ID).data('delete-record'),
type: 'POST',
dataType: 'json',
data: { selected_rows: rowsSelected },
success: function(data) {
HelperModule.flashAlertMsg(data.flash, data.color);
rowsSelected = [];
resetTableView();
},
error: function(ev) {
if (ev.status === 403) {
HelperModule.flashAlertMsg(I18n.t('repositories.js.permission_error'), ev.responseJSON.style);
} else {
animateSpinner(null, false);
HelperModule.flashAlertMsg(ev.responseJSON.flash, 'danger');
}
}
});
};
$('.repository-show')
.on('click', '#addRepositoryRecord', function() {
checkAvailableColumns();
RepositoryDatatableRowEditor.addNewRow(TABLE);
changeToEditMode();
})
.on('click', '#copyRepositoryRecords', function() {
animateSpinner();
$.ajax({
url: $('table' + TABLE_ID).data('copy-records'),
type: 'POST',
dataType: 'json',
data: { selected_rows: rowsSelected },
success: function(data) {
HelperModule.flashAlertMsg(data.flash, 'success');
rowsSelected = [];
resetTableView();
},
error: function(ev) {
if (ev.status === 403) {
HelperModule.flashAlertMsg(I18n.t('repositories.js.permission_error'), ev.responseJSON.style);
} else {
animateSpinner(null, false);
HelperModule.flashAlertMsg(ev.responseJSON.flash, 'danger');
}
}
});
})
.on('click', '#archiveRepositoryRecordsButton', function() {
animateSpinner();
$.ajax({
url: $('table' + TABLE_ID).data('archive-records'),
type: 'POST',
dataType: 'json',
data: { selected_rows: rowsSelected },
success: function(data) {
HelperModule.flashAlertMsg(data.flash, 'success');
rowsSelected = [];
resetTableView();
},
error: function(ev) {
if (ev.status === 403) {
HelperModule.flashAlertMsg(
I18n.t('repositories.js.permission_error'), ev.responseJSON.style
);
} else if (ev.status === 422) {
HelperModule.flashAlertMsg(
ev.responseJSON.error, 'danger'
);
animateSpinner(null, false);
}
}
});
})
.on('click', '#restoreRepositoryRecords', function() {
animateSpinner();
$.ajax({
url: $('table' + TABLE_ID).data('restore-records'),
type: 'POST',
dataType: 'json',
data: { selected_rows: rowsSelected },
success: function(data) {
HelperModule.flashAlertMsg(data.flash, 'success');
rowsSelected = [];
resetTableView();
},
error: function(ev) {
if (ev.status === 403) {
HelperModule.flashAlertMsg(
I18n.t('repositories.js.permission_error'), ev.responseJSON.style
);
} else if (ev.status === 422) {
HelperModule.flashAlertMsg(
ev.responseJSON.error, 'danger'
);
animateSpinner(null, false);
}
}
});
})
.on('click', '#editRepositoryRecord', function() {
checkAvailableColumns();
if (rowsSelected.length !== 1) {
return;
}
let row = TABLE.row('#' + rowsSelected[0]);
$(TABLE_ID).find('.repository-row-edit-icon').remove();
RepositoryDatatableRowEditor.switchRowToEditMode(row);
changeToEditMode();
adjustTableHeader();
})
.on('click', '#deleteRepositoryRecords', function() {
$('#deleteRepositoryRecord').modal('show');
})
.on('click', '#hideRepositoryReminders', function() {
var visibleReminderRepositoryRowIds = $('.row-reminders-dropdown').map(
function() { return $(this).closest('[role=row]').attr('id'); }
).toArray();
$.ajax({
type: 'POST',
url: $(this).data('hideRemindersUrl'),
dataType: 'json',
data: {
visible_reminder_repository_row_ids: visibleReminderRepositoryRowIds
},
success: function() {
$('#hideRepositoryReminders').remove();
TABLE.ajax.reload();
}
});
});
// Handle enter key
$(document).off('keypress').keypress(function(event) {
var keycode = (event.keyCode ? event.keyCode : event.which);
if (currentMode === 'editMode' && keycode === '13') {
$('#saveRecord').click();
}
});
global.clearFileInput = function(el) {
var parent = $(el).closest('div.repository-input-file-field');
var input = parent.find('input:file')[0];
// hide clear button
$(parent.find('a[data-action="removeAsset"]')[0]).hide();
// reset value
input.value = '';
// add flag
$(input).attr('remove', true);
// clear fileName
$(parent.find('.file-name-label')[0]).text(I18n.t('general.file.no_file_chosen'));
$(parent.find('.form-group')[0]).removeClass('has-error');
parent.removeClass('has-error');
$(parent.find('.help-block')[0]).remove();
};
function init(id) {
TABLE_ID = id;
EDITABLE = $(TABLE_ID).data('editable');
TABLE = dataTableInit();
if ($(TABLE_ID).data('snapshot-provisioning')) {
setTimeout(() => { checkSnapshottingStatus(); }, STATUS_POLLING_INTERVAL);
}
}
function destroy() {
if (TABLE !== null) {
TABLE.destroy();
TABLE = null;
}
TABLE_ID = '';
}
function redrawTableOnSidebarToggle() {
$('#wrapper').on('sideBar::hide sideBar::hidden', function() {
var orgignalWidth = $('.repository-show .dataTables_scrollHead .table.dataTable').width();
var windowWidth = $(window).width();
if (windowWidth > orgignalWidth + 363) {
$('.repository-show .dataTables_scrollHead')
.find('.table.dataTable').css('width', (orgignalWidth + 280) + 'px');
}
document.documentElement.style.setProperty('--repository-sidebar-margin', '83px');
});
$('#wrapper').on('sideBar::show', function() {
var orgignalWidth = $('.repository-show .dataTables_scrollHead .table.dataTable').width();
var windowWidth = $(window).width();
if (windowWidth > orgignalWidth + 83) {
$('.repository-show .dataTables_scrollHead')
.find('.table.dataTable').css('width', (orgignalWidth - 280) + 'px');
}
document.documentElement.style.setProperty('--repository-sidebar-margin', '363px');
});
$('#wrapper').on('sideBar::hidden sideBar::shown', function() {
adjustTableHeader();
});
}
function checkArchivedColumnsState() {
var archived = $('.repository-show').hasClass('archived');
$.each(TABLE.context[0].aoColumns, function(i, column) {
if (['archived-on', 'archived-by'].includes(column.nTh.id)) {
TABLE.column(column.idx).visible(archived);
}
});
}
function renderFiltersDropdown() {
let dropdown = $('#repositoryFilterTemplate').html();
$('.toolbar-filters').html(dropdown);
if (typeof initRepositoryFilter === 'function') initRepositoryFilter();
}
return Object.freeze({
init: init,
destroy: destroy,
reload: function() {
TABLE.ajax.reload();
clearRowSelection();
},
redrawTableOnSidebarToggle: redrawTableOnSidebarToggle,
checkAvailableColumns: checkAvailableColumns
});
}(window));