- <% if th.length > Constants::NAME_TRUNCATION_LENGTH_DROPDOWN %> -
diff --git a/Gemfile b/Gemfile
index 53331e430..ffa953863 100644
--- a/Gemfile
+++ b/Gemfile
@@ -51,7 +51,7 @@ gem 'ajax-datatables-rails', '~> 0.3.1'
gem 'commit_param_routing' # Enables different submit actions in the same form to route to different actions in controller
gem 'kaminari'
gem "i18n-js", ">= 3.0.0.rc11" # Localization in javascript files
-gem 'roo', '~> 2.1.0' # Spreadsheet parser
+gem 'roo', '~> 2.7.1' # Spreadsheet parser
gem 'wicked_pdf'
gem 'silencer' # Silence certain Rails logs
gem 'wkhtmltopdf-heroku'
@@ -64,6 +64,7 @@ gem 'sneaky-save', git: 'https://github.com/einzige/sneaky-save'
gem 'rails_autolink', '~> 1.1', '>= 1.1.6'
gem 'delayed_paperclip'
gem 'rubyzip'
+gem 'activerecord-import'
gem 'paperclip', '~> 5.1' # File attachment, image attachment library
gem 'aws-sdk', '~> 2'
diff --git a/Gemfile.lock b/Gemfile.lock
index d7da8b688..24eeb6100 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -7,7 +7,7 @@ GIT
GIT
remote: https://github.com/einzige/sneaky-save
- revision: e7c77674abe74d598dfd58db7c680dd85936f207
+ revision: 7e7596720e76a3c243042be2f5f916525b143a54
specs:
sneaky-save (0.1.2)
activerecord (>= 3.2.0)
@@ -56,6 +56,8 @@ GEM
activemodel (= 5.1.1)
activesupport (= 5.1.1)
arel (~> 8.0)
+ activerecord-import (0.19.1)
+ activerecord (>= 3.2)
activesupport (5.1.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
@@ -70,26 +72,28 @@ GEM
ast (2.3.0)
auto_strip_attributes (2.1.0)
activerecord (>= 3.0)
- autoprefixer-rails (7.1.1.2)
+ autoprefixer-rails (7.1.2.4)
execjs
autosize-rails (1.18.17)
rails (>= 3.1)
awesome_print (1.8.0)
- aws-sdk (2.2.37)
- aws-sdk-resources (= 2.2.37)
- aws-sdk-core (2.2.37)
+ aws-sdk (2.10.21)
+ aws-sdk-resources (= 2.10.21)
+ aws-sdk-core (2.10.21)
+ aws-sigv4 (~> 1.0)
jmespath (~> 1.0)
- aws-sdk-resources (2.2.37)
- aws-sdk-core (= 2.2.37)
+ aws-sdk-resources (2.10.21)
+ aws-sdk-core (= 2.10.21)
+ aws-sigv4 (1.0.1)
babel-source (5.8.35)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
base62 (1.0.0)
bcrypt (3.1.11)
- better_errors (2.1.1)
+ better_errors (2.3.0)
coderay (>= 1.0.0)
- erubis (>= 2.6.6)
+ erubi (>= 1.0.0)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
@@ -102,9 +106,9 @@ GEM
bootstrap_form (2.7.0)
builder (3.2.3)
byebug (9.0.6)
- capybara (2.14.4)
+ capybara (2.15.1)
addressable
- mime-types (>= 1.16)
+ mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
@@ -169,15 +173,14 @@ GEM
devise (>= 4.0.0)
diff-lcs (1.3)
docile (1.1.5)
- erubi (1.6.0)
- erubis (2.7.0)
+ erubi (1.6.1)
execjs (2.7.0)
factory_girl (4.8.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
railties (>= 3.0.0)
- faker (1.7.3)
+ faker (1.8.4)
i18n (~> 0.5)
ffi (1.9.18)
figaro (1.1.1)
@@ -188,8 +191,8 @@ GEM
globalid (0.4.0)
activesupport (>= 4.2.0)
hammerjs-rails (2.0.4)
- i18n (0.8.4)
- i18n-js (3.0.0)
+ i18n (0.8.6)
+ i18n-js (3.0.1)
i18n (~> 0.6, >= 0.6.6)
introjs-rails (1.0.0)
sass-rails (>= 3.2)
@@ -236,17 +239,18 @@ GEM
method_source (0.8.2)
mime-types (1.25.1)
mimemagic (0.3.2)
+ mini_mime (0.1.3)
mini_portile2 (2.2.0)
- minitest (5.10.2)
+ minitest (5.10.3)
momentjs-rails (2.17.1)
railties (>= 3.1)
multi_json (1.12.1)
multi_test (0.1.2)
- nested_form_fields (0.8)
+ nested_form_fields (0.8.1)
coffee-rails (>= 3.2.1)
jquery-rails
rails (>= 3.2.0)
- newrelic_rpm (4.2.0.334)
+ newrelic_rpm (4.3.0.335)
nio4r (2.1.0)
nokogiri (1.8.0)
mini_portile2 (~> 2.2.0)
@@ -260,7 +264,7 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
- parallel (1.11.2)
+ parallel (1.12.0)
parser (2.4.0.0)
ast (~> 2.2)
pg (0.21.0)
@@ -318,7 +322,7 @@ GEM
rainbow (2.2.2)
rake
rake (12.0.0)
- rb-fsevent (0.9.8)
+ rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rdoc (4.3.0)
@@ -332,7 +336,7 @@ GEM
lazy_priority_queue (~> 0.1.0)
stream (~> 0.5.0)
rkelly-remix (0.0.7)
- roo (2.1.1)
+ roo (2.7.1)
nokogiri (~> 1)
rubyzip (~> 1.1, < 2.0.0)
rspec-core (3.6.0)
@@ -367,7 +371,7 @@ GEM
crass (~> 1.0.2)
nokogiri (>= 1.4.4)
nokogumbo (~> 1.4.1)
- sass (3.4.24)
+ sass (3.4.25)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
@@ -380,7 +384,7 @@ GEM
sdoc (0.4.2)
json (~> 1.7, >= 1.7.7)
rdoc (~> 4.0)
- shoulda-matchers (3.1.1)
+ shoulda-matchers (3.1.2)
activesupport (>= 4.0.0)
silencer (1.0.1)
simple_token_authentication (1.15.1)
@@ -413,8 +417,8 @@ GEM
stream (0.5)
thor (0.19.4)
thread_safe (0.3.6)
- tilt (2.0.7)
- tinymce-rails (4.6.4)
+ tilt (2.0.8)
+ tinymce-rails (4.6.5)
railties (>= 3.1.1)
turbolinks (5.0.1)
turbolinks-source (~> 5)
@@ -446,6 +450,7 @@ PLATFORMS
ruby
DEPENDENCIES
+ activerecord-import
ajax-datatables-rails (~> 0.3.1)
aspector
auto_strip_attributes (~> 2.1)
@@ -506,7 +511,7 @@ DEPENDENCIES
recaptcha
remotipart (~> 1.2)
rgl
- roo (~> 2.1.0)
+ roo (~> 2.7.1)
rspec-rails
rubocop
ruby-graphviz (~> 1.2)
@@ -536,4 +541,4 @@ RUBY VERSION
ruby 2.4.1p111
BUNDLED WITH
- 1.15.1
+ 1.15.3
diff --git a/VERSION b/VERSION
new file mode 100644
index 000000000..81f363239
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.12.3
diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js
index d6150415e..fed0920ed 100644
--- a/app/assets/javascripts/repositories/index.js
+++ b/app/assets/javascripts/repositories/index.js
@@ -18,7 +18,7 @@
$('#form-records-file').on('ajax:success', function(ev, data) {
$('#modal-import-records').modal('hide');
$(data.html).appendTo('body').promise().done(function() {
- $('#parse-records_modal')
+ $('#parse-records-modal')
.modal('show')
.on('hidden.bs.modal', function() {
animateSpinner();
@@ -26,6 +26,11 @@
});
repositoryRecordsImporter();
});
+ }).on('ajax:error', function(ev, data) {
+ $(this).find('.form-group').addClass('has-error');
+ $(this).find('.form-group').find('.help-block').remove();
+ $(this).find('.form-group').append("" +
+ data.responseJSON.message + '');
});
}
@@ -41,8 +46,10 @@
success: function (data) {
var tabBody = $(pane.context.hash).find(".tab-content-body");
tabBody.html(data.html);
- pane.tab('show').promise().done(function() {
+ pane.tab('show').promise().done(function(el) {
initImportRecordsModal();
+ RepositoryDatatable.destroy()
+ RepositoryDatatable.init(el.attr('data-repo-table'));
});
},
error: function (error) {
diff --git a/app/assets/javascripts/repositories/my_module_repository.js b/app/assets/javascripts/repositories/my_module_repository.js
new file mode 100644
index 000000000..cc22b599c
--- /dev/null
+++ b/app/assets/javascripts/repositories/my_module_repository.js
@@ -0,0 +1,10 @@
+(function() {
+ 'use strict';
+
+ // initialze repository datatable
+ $(document).ready(function() {
+ RepositoryDatatable.destroy()
+ RepositoryDatatable.init($('#content').attr('data-repo-id'));
+ onClickToggleAssignedRecords();
+ });
+})();
diff --git a/app/assets/javascripts/repositories/repository_datatable.js b/app/assets/javascripts/repositories/repository_datatable.js
index e9202369f..ca0ce5600 100644
--- a/app/assets/javascripts/repositories/repository_datatable.js
+++ b/app/assets/javascripts/repositories/repository_datatable.js
@@ -1,862 +1,866 @@
//= require jquery-ui/widgets/sortable
-// 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)) {
- var idx = this.column(colSelector).index();
- this.settings()[0].aoColumns[idx].bSearchable = value;
- if (value === true) {
- this.rows().invalidate();
- }
- }
- return value;
+var RepositoryDatatable = (function(global) {
+ 'use strict';
+
+ var TABLE_ID = '';
+ var TABLE = {};
+
+ // 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;
});
-
-var rowsSelected = [];
-
-// Tells whether we're currently viewing or editing table
-var currentMode = 'viewMode';
-
-// Tells what action will execute by pressing on save button (update/create)
-var saveAction = 'update';
-var selectedRecord;
-
-// Helps saving correct table state
-var myData;
-var loadFirstTime = true;
-
-var table;
-var originalHeader;
-
-// Tells whether to filter only assigned repository records
-var viewAssigned;
-
-function dataTableInit() {
- // Make a copy of original repository table header
- originalHeader = $('#repository-table thead').children().clone();
- viewAssigned = 'assigned';
- table = $('#repository-table').DataTable({
- order: [[2, 'desc']],
- dom: "R<'row'<'col-sm-9-custom toolbar'l><'col-sm-3-custom'f>>tpi",
- stateSave: true,
- processing: true,
- serverSide: true,
- sScrollX: '100%',
- sScrollXInner: '100%',
- scrollY: '64vh',
- scrollCollapse: true,
- colReorder: {
- fixedColumnsLeft: 2,
- realtime: false
- },
- destroy: true,
- ajax: {
- url: $('#repository-table').data('source'),
- data: function(d) {
- d.assigned = viewAssigned;
- },
- global: false,
- type: 'POST'
- },
- columnDefs: [{
- targets: 0,
- searchable: false,
- orderable: false,
- className: 'dt-body-center',
- sWidth: '1%',
- render: function() {
- return "";
+ $.fn.dataTable.Api
+ .register('setColumnSearchable()', function(colSelector, value) {
+ if (value !== this.isColumnSearchable(colSelector)) {
+ var idx = this.column(colSelector).index();
+ this.settings()[0].aoColumns[idx].bSearchable = value;
+ if (value === true) {
+ this.rows().invalidate();
+ }
+ }
+ return value;
+ });
+
+ var rowsSelected = [];
+
+ // Tells whether we're currently viewing or editing table
+ var currentMode = 'viewMode';
+
+ // Tells what action will execute by pressing on save button (update/create)
+ var saveAction = 'update';
+ var selectedRecord;
+
+ // Helps saving correct table state
+ var myData;
+ var loadFirstTime = true;
+
+ var originalHeader;
+
+ // Tells whether to filter only assigned repository records
+ var viewAssigned;
+
+ function dataTableInit() {
+ // Make a copy of original repository table header
+ originalHeader = $(TABLE_ID + ' thead').children().clone();
+ viewAssigned = 'assigned';
+ TABLE = $(TABLE_ID).DataTable({
+ order: [[2, 'desc']],
+ dom: "R<'row'<'col-sm-9-custom toolbar'l><'col-sm-3-custom'f>>tpi",
+ stateSave: true,
+ processing: true,
+ serverSide: true,
+ sScrollX: '100%',
+ sScrollXInner: '100%',
+ scrollY: '64vh',
+ scrollCollapse: true,
+ colReorder: {
+ fixedColumnsLeft: 2,
+ realtime: false
+ },
+ destroy: true,
+ ajax: {
+ url: $(TABLE_ID).data('source'),
+ data: function(d) {
+ d.assigned = viewAssigned;
+ },
+ global: false,
+ type: 'POST'
+ },
+ columnDefs: [{
+ targets: 0,
+ searchable: false,
+ orderable: false,
+ className: 'dt-body-center',
+ sWidth: '1%',
+ render: function() {
+ return "";
+ }
+ }, {
+ targets: 1,
+ searchable: false,
+ orderable: true,
+ sWidth: '1%'
+ }],
+ rowCallback: function(row, data) {
+ // Get row ID
+ var 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 numOfColumns = $(TABLE_ID).data('num-columns');
+ var columns = [];
+ for (var i = 0; i < numOfColumns; i++) {
+ var visible = (i <= 4);
+ var searchable = (i > 0 && i <= 4);
+ columns.push({
+ data: String(i),
+ defaultContent: '',
+ visible: visible,
+ searchable: searchable
+ });
+ }
+ return columns;
+ })(),
+ fnDrawCallback: function() {
+ animateSpinner(this, false);
+ changeToViewMode();
+ updateButtons();
+ 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('');
+ $('#selected_info').html(' (' +
+ rowsSelected.length +
+ ' entries selected)');
+ initRowSelection();
+ initHeaderTooltip();
+ },
+ preDrawCallback: function() {
+ animateSpinner(this);
+ },
+ stateLoadCallback: function() {
+ // Send an Ajax request to the server to get the data. Note that
+ // this is a synchronous request since the data is expected back from the
+ // function
+ var repositoryId = $(TABLE_ID).data('repository-id');
+ $.ajax({
+ url: '/repositories/' + repositoryId + '/state_load',
+ data: {},
+ async: false,
+ dataType: 'json',
+ type: 'POST',
+ success: function(json) {
+ myData = json.state;
+ }
+ });
+ return myData;
+ },
+ stateSaveCallback: function(settings, data) {
+ // Send an Ajax request to the server with the state object
+ var repositoryId = $(TABLE_ID).data('repository-id');
+ // Save correct data
+ if (loadFirstTime === true) {
+ data = myData;
+ }
+ $.ajax({
+ url: '/repositories/' + repositoryId + '/state_save',
+ data: { state: data },
+ dataType: 'json',
+ type: 'POST'
+ });
+ loadFirstTime = false;
+ initHeaderTooltip();
+ },
+ fnInitComplete: function(oSettings) {
+ // Reload correct column order and visibility (if you refresh page)
+ // First two columns are fixed
+ TABLE.column(0).visible(true);
+ TABLE.column(1).visible(true);
+ for (var i = 2; i < TABLE.columns()[0].length; i++) {
+ var visibility = false;
+ if (myData.columns[i]) {
+ visibility = myData.columns[i].visible;
+ }
+ if (typeof (visibility) === 'string') {
+ visibility = (visibility === 'true');
+ }
+ TABLE.column(i).visible(visibility);
+ TABLE.setColumnSearchable(i, visibility);
+ }
+ oSettings._colReorder.fnOrder(myData.ColReorder);
+ TABLE.on('mousedown', function() {
+ $('#repository-columns-dropdown').removeClass('open');
+ });
+ initHeaderTooltip();
+ initRowSelection();
+ bindExportActions();
+ }
+ });
+
+ // Append button to inner toolbar in table
+ $('div.toolbarButtons').appendTo('div.toolbar');
+ $('div.toolbarButtons').show();
+
+ // Handle click on table cells with checkboxes
+ $(TABLE_ID).on('click', 'tbody td', function(e) {
+ if ($(e.target).is('.repository-row-selector')) {
+ // Skip if clicking on selector checkbox
+ return;
+ }
+ $(this).parent().find('.repository-row-selector').trigger('click');
+ });
+
+ TABLE.on('column-reorder', function() {
+ initRowSelection();
+ });
+
+ $('#assignRepositories, #unassignRepositories').click(function() {
+ animateLoading();
+ });
+
+ // Timeout for table header scrolling
+ setTimeout(function() {
+ TABLE.columns.adjust();
+ }, 10);
+
+ return TABLE;
+ }
+
+ // Enables noSearchHidden plugin
+ $.fn.dataTable.defaults.noSearchHidden = true;
+
+ function bindExportActions() {
+ $('form#form-export').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
+ $('.active table' + TABLE_ID + ' thead tr th').each(function() {
+ var th = $(this);
+ var val;
+ switch ($(th).attr('id')) {
+ case 'checkbox':
+ val = -1;
+ break;
+ case 'assigned':
+ val = -2;
+ break;
+ case 'row-name':
+ val = -3;
+ break;
+ case 'added-by':
+ val = -4;
+ break;
+ case 'added-on':
+ val = -5;
+ break;
+ default:
+ val = th.attr('id');
+ }
+
+ if (val) {
+ appendInput(form, val, 'header_ids[]');
+ }
+ });
+
+ // Append records
+ $.each(rowsSelected, function(index, rowId) {
+ appendInput(form, rowId, 'row_ids[]');
+ });
+ }
+ });
+ }
+
+
+ function appendInput(form, val, name) {
+ $(form).append(
+ $('')
+ .attr('type', 'hidden')
+ .attr('name', name)
+ .val(val)
+ );
+ }
+
+ function initRowSelection() {
+ // Handle clicks on checkbox
+ $('.dt-body-center .repository-row-selector').change(function(e) {
+ if (currentMode !== 'viewMode') {
+ return false;
}
- }, {
- targets: 1,
- searchable: false,
- orderable: true,
- sWidth: '1%'
- }],
- rowCallback: function(row, data) {
// Get row ID
+ var $row = $(this).closest('tr');
+ var data = TABLE.row($row).data();
var 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');
+ // Determine whether row ID is in the list of selected row IDs
+ var 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);
}
- },
- columns: (function() {
- var numOfColumns = $('#repository-table').data('num-columns');
- var columns = [];
- for (var i = 0; i < numOfColumns; i++) {
- var visible = (i <= 4);
- var searchable = (i > 0 && i <= 4);
- columns.push({
- data: String(i),
- defaultContent: '',
- visible: visible,
- searchable: searchable
- });
+
+ if (this.checked) {
+ $row.addClass('selected');
+ } else {
+ $row.removeClass('selected');
}
- return columns;
- })(),
- fnDrawCallback: function() {
- animateSpinner(this, false);
- changeToViewMode();
+
+ updateDataTableSelectAllCtrl();
+
+ e.stopPropagation();
updateButtons();
- updateDataTableSelectAllCtrl(table);
- // 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('');
- $('#selected_info').html(' (' +
- rowsSelected.length +
- ' entries selected)');
- initRowSelection();
- initHeaderTooltip();
- },
- preDrawCallback: function() {
- animateSpinner(this);
- },
- stateLoadCallback: function() {
- // Send an Ajax request to the server to get the data. Note that
- // this is a synchronous request since the data is expected back from the
- // function
- var repositoryId = $('#repository-table').data('repository-id');
- $.ajax({
- url: '/repositories/' + repositoryId + '/state_load',
- data: {},
- async: false,
- dataType: 'json',
- type: 'POST',
- success: function(json) {
- myData = json.state;
- }
- });
- return myData;
- },
- stateSaveCallback: function(settings, data) {
- // Send an Ajax request to the server with the state object
- var repositoryId = $('#repository-table').data('repository-id');
- // Save correct data
- if (loadFirstTime === true) {
- data = myData;
- }
- $.ajax({
- async: false,
- url: '/repositories/' + repositoryId + '/state_save',
- data: {state: data},
- dataType: 'json',
- type: 'POST'
- });
- loadFirstTime = false;
- initHeaderTooltip();
- },
- fnInitComplete: function(oSettings) {
- // Reload correct column order and visibility (if you refresh page)
- // First two columns are fixed
- table.column(0).visible(true);
- table.column(1).visible(true);
- for (var i = 2; i < table.columns()[0].length; i++) {
- var visibility = false;
- if (myData.columns[i]) {
- visibility = myData.columns[i].visible;
- }
- if (typeof (visibility) === 'string') {
- visibility = (visibility === 'true');
- }
- table.column(i).visible(visibility);
- table.setColumnSearchable(i, visibility);
- }
- oSettings._colReorder.fnOrder(myData.ColReorder);
- table.on('mousedown', function() {
- $('#repository-columns-dropdown').removeClass('open');
- });
- initHeaderTooltip();
- initRowSelection();
- }
- });
-
- // Append button to inner toolbar in table
- $('div.toolbarButtons').appendTo('div.toolbar');
- $('div.toolbarButtons').show();
-
- // Handle click on table cells with checkboxes
- $('#repository-table').on('click', 'tbody td', function(e) {
- if ($(e.target).is('.repository-row-selector')) {
- // Skip if clicking on selector checkbox
- return;
- }
- $(this).parent().find('.repository-row-selector').trigger('click');
- });
-
- table.on('column-reorder', function() {
- initRowSelection();
- });
-
- $('#assignRepositories, #unassignRepositories').click(function() {
- animateLoading();
- });
-
- return table;
-}
-
-table = dataTableInit();
-
-// Timeout for table header scrolling
-setTimeout(function() {
- table.columns.adjust();
-}, 10);
-
-// Enables noSearchHidden plugin
-$.fn.dataTable.defaults.noSearchHidden = true;
-
-$('form#form-export').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
- $('.active table#repository-table thead tr th').each(function() {
- var th = $(this);
- var val;
- switch ($(th).attr('id')) {
- case 'checkbox':
- val = -1;
- break;
- case 'assigned':
- val = -2;
- break;
- case 'row-name':
- val = -3;
- break;
- case 'added-by':
- val = -4;
- break;
- case 'added-on':
- val = -5;
- break;
- default:
- val = th.attr('id');
- }
-
- if (val) {
- appendInput(form, val, 'header_ids[]');
- }
+ // Update number of selected records info
+ $('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
});
- // Append records
- $.each(rowsSelected, function(index, rowId) {
- appendInput(form, rowId, 'row_ids[]');
+ // Handle click on "Select all" control
+ $('.dataTables_scrollHead input[name="select_all"]').change(function(e) {
+ if (this.checked) {
+ $('.repository-row-selector:not(:checked)').trigger('click');
+ } else {
+ $('.repository-row-selector:checked').trigger('click');
+ }
+ // Prevent click event from propagating to parent
+ e.stopPropagation();
});
}
-});
-function appendInput(form, val, name) {
- $(form).append(
- $('')
- .attr('type', 'hidden')
- .attr('name', name)
- .val(val)
- );
-}
+ // 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 = $('input[name="select_all"]', $header).get(0);
-function initRowSelection() {
- // Handle clicks on checkbox
- $('.dt-body-center .repository-row-selector').change(function(e) {
- if (currentMode !== 'viewMode') {
- return false;
- }
- // Get row ID
- var $row = $(this).closest('tr');
- var data = table.row($row).data();
- var rowId = data.DT_RowId;
+ // If none of the checkboxes are checked
+ if ($chkboxChecked.length === 0) {
+ chkboxSelectAll.checked = false;
+ if ('indeterminate' in chkboxSelectAll) {
+ chkboxSelectAll.indeterminate = false;
+ }
- // Determine whether row ID is in the list of selected row IDs
- var index = $.inArray(rowId, rowsSelected);
+ // If all of the checkboxes are checked
+ } else if ($chkboxChecked.length === $chkboxAll.length) {
+ chkboxSelectAll.checked = true;
+ if ('indeterminate' in chkboxSelectAll) {
+ chkboxSelectAll.indeterminate = false;
+ }
- // 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');
+ // If some of the checkboxes are checked
} else {
- $row.removeClass('selected');
+ chkboxSelectAll.checked = true;
+ if ('indeterminate' in chkboxSelectAll) {
+ chkboxSelectAll.indeterminate = true;
+ }
}
+ }
- updateDataTableSelectAllCtrl(table);
+ 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;
+ if ((offsetLeft + 200) > $(window).width()) {
+ offsetLeft -= 150;
+ }
+ var offsetTop = $tooltip.offset().top;
+ var width = 200;
- e.stopPropagation();
+ // set tooltip params in the table body
+ if ($(this).parents(TABLE_ID).length) {
+ offsetLeft = $(TABLE_ID).offset().left + 100;
+ width = $(TABLE_ID).width() - 200;
+ }
+ $('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', width + 'px');
+ $tooltip.css('word-wrap', 'break-word');
+ $tooltip.css('z-index', '4');
+ $(this).data('dropdown-tooltip', $tooltip);
+ }, function() {
+ $(this).append($(this).data('dropdown-tooltip'));
+ $(this).data('dropdown-tooltip').removeAttr('style');
+ });
+ }
+
+ global.onClickAddRecord = function() {
+ changeToEditMode();
updateButtons();
- // Update number of selected records info
- $('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
- });
- // Handle click on "Select all" control
- $('.dataTables_scrollHead input[name="select_all"]').change(function(e) {
- if (this.checked) {
- $('.repository-row-selector:not(:checked)').trigger('click');
- } else {
- $('.repository-row-selector:checked').trigger('click');
+ saveAction = 'create';
+ var tr = document.createElement('tr');
+ if (TABLE.column(1).visible() === false) {
+ TABLE.column(1).visible(true);
}
- // Prevent click event from propagating to parent
- e.stopPropagation();
- });
-}
-
-// Updates "Select all" control in a data table
-function updateDataTableSelectAllCtrl(table) {
- 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 = $('input[name="select_all"]', $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 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;
- if ((offsetLeft + 200) > $(window).width()) {
- offsetLeft -= 150;
- }
- var offsetTop = $tooltip.offset().top;
- var width = 200;
-
- // set tooltip params in the table body
- if ( $(this).parents('#repository-table').length ) {
- offsetLeft = $('#repository-table').offset().left + 100;
- width = $('#repository-table').width() - 200;
- }
- $('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', width + 'px');
- $tooltip.css('word-wrap', 'break-word');
- $tooltip.css('z-index', '4');
- $(this).data('dropdown-tooltip', $tooltip);
- }, function() {
- $(this).append($(this).data('dropdown-tooltip'));
- $(this).data('dropdown-tooltip').removeAttr('style');
- });
-}
-
-function onClickAddRecord() {
- changeToEditMode();
- updateButtons();
-
- saveAction = 'create';
- var tr = document.createElement('tr');
- if (table.column(1).visible() === false) {
- table.column(1).visible(true);
- }
- $('table#repository-table thead tr').children('th').each(function() {
- var th = $(this);
- var td;
- var input;
- if ($(th).attr('id') === 'checkbox') {
- td = createTdElement('');
- $(td).html($('#saveRecord').clone());
- tr.appendChild(td);
- } else if ($(th).attr('id') === 'assigned') {
- td = createTdElement('');
- $(td).html($('#cancelSave').clone());
- tr.appendChild(td);
- } else if ($(th).attr('id') === 'row-name') {
- input = changeToInputField('repository_row', 'name', '');
- tr.appendChild(createTdElement(input));
- } else if ($(th).hasClass('repository-column')) {
- input = changeToInputField('repository_cell', th.attr('id'), '');
- tr.appendChild(createTdElement(input));
- } else {
- // Column we don't care for, just add empty td
- tr.appendChild(createTdElement(''));
- }
- });
- $('table#repository-table').prepend(tr);
- selectedRecord = tr;
-
- // initialize smart annotation
- _.each($('[data-object="repository_cell"]'), function(el) {
- if (_.isUndefined($(el).data('atwho'))) {
- SmartAnnotation.init(el);
- }
- });
- // Adjust columns width in table header
- adjustTableHeader();
-}
-
-(function onClickToggleAssignedRecords() {
- $('.repository-assign-group > .btn').click(function() {
- $('.btn-group > .btn').removeClass('active btn-primary');
- $('.btn-group > .btn').addClass('btn-default');
- $(this).addClass('active btn-primary');
- });
-
- $('#assigned-repo-records').on('click', function() {
- viewAssigned = 'assigned';
- table.ajax.reload(function() {
- initRowSelection();
- }, false);
- });
- $('#all-repo-records').on('click', function() {
- viewAssigned = 'all';
- table.ajax.reload(function() {
- initRowSelection();
- }, false);
- });
-})();
-
-function onClickAssignRecords() {
- animateSpinner();
- $.ajax({
- url: $('#assignRepositoryRecords').data('assign-url'),
- type: 'POST',
- dataType: 'json',
- data: {selected_rows: rowsSelected},
- success: function(data) {
- HelperModule.flashAlertMsg(data.flash, 'success');
- onClickCancel();
- clearRowSelection();
- },
- error: function(data) {
- HelperModule.flashAlertMsg(data.responseJSON.flash, 'danger');
- onClickCancel();
- clearRowSelection();
- }
- });
-}
-
-function onClickUnassignRecords() {
- animateSpinner();
- $.ajax({
- url: $('#unassignRepositoryRecords').data('unassign-url'),
- type: 'POST',
- dataType: 'json',
- data: {selected_rows: rowsSelected},
- success: function(data) {
- HelperModule.flashAlertMsg(data.flash, 'success');
- onClickCancel();
- clearRowSelection();
- },
- error: function(data) {
- HelperModule.flashAlertMsg(data.responseJSON.flash, 'danger');
- onClickCancel();
- clearRowSelection();
- }
- });
-}
-
-function onClickDeleteRecord() {
- animateSpinner();
- $.ajax({
- url: $('table#repository-table').data('delete-record'),
- type: 'POST',
- dataType: 'json',
- data: {selected_rows: rowsSelected},
- success: function(data) {
- HelperModule.flashAlertMsg(data.flash, data.color);
- rowsSelected = [];
- onClickCancel();
- },
- error: function(e) {
- if (e.status === 403) {
- HelperModule.flashAlertMsg(
- I18n.t('repositories.js.permission_error'), e.responseJSON.style
- );
+ $('table' + TABLE_ID + ' thead tr').children('th').each(function() {
+ var th = $(this);
+ var td;
+ var input;
+ if ($(th).attr('id') === 'checkbox') {
+ td = createTdElement('');
+ $(td).html($('#saveRecord').clone());
+ tr.appendChild(td);
+ } else if ($(th).attr('id') === 'assigned') {
+ td = createTdElement('');
+ $(td).html($('#cancelSave').clone());
+ tr.appendChild(td);
+ } else if ($(th).attr('id') === 'row-name') {
+ input = changeToInputField('repository_row', 'name', '');
+ tr.appendChild(createTdElement(input));
+ } else if ($(th).hasClass('repository-column')) {
+ input = changeToInputField('repository_cell', th.attr('id'), '');
+ tr.appendChild(createTdElement(input));
+ } else {
+ // Column we don't care for, just add empty td
+ tr.appendChild(createTdElement(''));
}
- }
- });
-}
+ });
+ $('table' + TABLE_ID).prepend(tr);
+ selectedRecord = tr;
-// Edit record
-function onClickEdit() {
- if (rowsSelected.length !== 1) {
- return;
+ // initialize smart annotation
+ _.each($('[data-object="repository_cell"]'), function(el) {
+ if (_.isUndefined($(el).data('atwho'))) {
+ SmartAnnotation.init(el);
+ }
+ });
+ // Adjust columns width in table header
+ adjustTableHeader();
}
- var row = table.row('#' + rowsSelected[0]);
- var node = row.node();
- var rowData = row.data();
+ global.onClickToggleAssignedRecords = function() {
+ $('.repository-assign-group > .btn').click(function() {
+ $('.btn-group > .btn').removeClass('active btn-primary');
+ $('.btn-group > .btn').addClass('btn-default');
+ $(this).addClass('active btn-primary');
+ });
- $(node).find('td input').trigger('click');
- selectedRecord = node;
-
- clearAllErrors();
- changeToEditMode();
- updateButtons();
- saveAction = 'update';
-
- $.ajax({
- url: rowData.recordEditUrl,
- type: 'GET',
- dataType: 'json',
- success: function(data) {
- if (table.column(1).visible() === false) {
- table.column(1).visible(true);
- }
- // Show save and cancel buttons in first two columns
- $(node).children('td').eq(0).html($('#saveRecord').clone());
- $(node).children('td').eq(1).html($('#cancelSave').clone());
-
- // Record name column
- var colIndex = getColumnIndex('#row-name');
- if (colIndex) {
- $(node).children('td').eq(colIndex)
- .html(changeToInputField('repository_row', 'name',
- data.repository_row.name));
- }
-
- // Take care of custom cells
- var cells = data.repository_row.repository_cells;
- $(node).children('td').each(function(i) {
- var td = $(this);
- var rawIndex = table.column.index('fromVisible', i);
- var colHeader = table.column(rawIndex).header();
- if ($(colHeader).hasClass('repository-column')) {
- // Check if cell on this record exists
- var cell = cells[$(colHeader).attr('id')];
- if (cell) {
- td.html(changeToInputField('repository_cell',
- $(colHeader).attr('id'),
- cell.value));
- } else {
- td.html(changeToInputField('repository_cell',
- $(colHeader).attr('id'), ''));
- }
- }
- });
-
- // initialize smart annotation
- SmartAnnotation.init($('[data-object="repository_cell"]'));
- _.each($('[data-object="repository_cell"]'), function(el) {
- if (_.isUndefined($(el).data('atwho'))) {
- SmartAnnotation.init(el);
- }
- });
- // Adjust columns width in table header
- adjustTableHeader();
- updateButtons();
- },
- error: function(e) {
- if (e.status === 403) {
- HelperModule.flashAlertMsg(
- I18n.t('repositories.js.permission_error'), e.responseJSON.style
- );
- changeToViewMode();
- updateButtons();
- }
- }
- });
-}
-
-// Save record
-function onClickSave() {
- var node;
- var rowData;
- if (saveAction === 'update') {
- var row = table.row(selectedRecord);
- node = row.node();
- rowData = row.data();
- } else if (saveAction === 'create') {
- node = selectedRecord;
- }
- // First fetch all the data in input fields
- var data = {
- request_url: $('#repository-table').data('current-uri'),
- repository_row_id: $(selectedRecord).attr('id'),
- repository_row: {},
- repository_cells: {}
+ $('#assigned-repo-records').on('click', function() {
+ viewAssigned = 'assigned';
+ TABLE.ajax.reload(function() {
+ initRowSelection();
+ }, false);
+ });
+ $('#all-repo-records').on('click', function() {
+ viewAssigned = 'all';
+ TABLE.ajax.reload(function() {
+ initRowSelection();
+ }, false);
+ });
};
- // Direct record attributes
- // Record name
- data.repository_row.name = $('td input[data-object = repository_row]').val();
-
- // Custom cells
- $(node).find('td input[data-object = repository_cell]').each(function() {
- // Send data only and only if cell is not empty
- if ($(this).val().trim()) {
- data.repository_cells[$(this).attr('name')] = $(this).val();
- }
- });
-
- var url;
- var type;
- if (saveAction === 'update') {
- url = rowData.recordUpdateUrl;
- type = 'PUT';
- } else {
- type = 'POST';
- url = $('table#repository-table').data('create-record');
+ global.onClickAssignRecords = function() {
+ animateSpinner();
+ $.ajax({
+ url: $('#assignRepositoryRecords').data('assign-url'),
+ type: 'POST',
+ dataType: 'json',
+ data: { selected_rows: rowsSelected },
+ success: function(data) {
+ HelperModule.flashAlertMsg(data.flash, 'success');
+ onClickCancel();
+ clearRowSelection();
+ },
+ error: function(data) {
+ HelperModule.flashAlertMsg(data.responseJSON.flash, 'danger');
+ onClickCancel();
+ clearRowSelection();
+ }
+ });
}
- $.ajax({
- url: url,
- type: type,
- dataType: 'json',
- data: data,
- success: function(data) {
- HelperModule.flashAlertMsg(data.flash, 'success');
- onClickCancel();
- },
- error: function(e) {
- var data = e.responseJSON;
- clearAllErrors();
- if (e.status === 404) {
- HelperModule.flashAlertMsg(
- I18n.t('repositories.js.not_found_error'), 'danger'
- );
- changeToViewMode();
- updateButtons();
- } else if (e.status === 403) {
- HelperModule.flashAlertMsg(
- I18n.t('repositories.js.permission_error'), 'danger'
- );
- changeToViewMode();
- updateButtons();
- } else if (e.status === 400) {
- if (data.default_fields) {
- var defaultFields = data.default_fields;
+ global.onClickUnassignRecords = function() {
+ animateSpinner();
+ $.ajax({
+ url: $('#unassignRepositoryRecords').data('unassign-url'),
+ type: 'POST',
+ dataType: 'json',
+ data: {selected_rows: rowsSelected},
+ success: function(data) {
+ HelperModule.flashAlertMsg(data.flash, 'success');
+ onClickCancel();
+ clearRowSelection();
+ },
+ error: function(data) {
+ HelperModule.flashAlertMsg(data.responseJSON.flash, 'danger');
+ onClickCancel();
+ clearRowSelection();
+ }
+ });
+ }
- // Validate record name
- if (defaultFields.name) {
- var input = $(selectedRecord).find('input[name = name]');
+ 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 = [];
+ onClickCancel();
+ },
+ error: function(e) {
+ if (e.status === 403) {
+ HelperModule.flashAlertMsg(
+ I18n.t('repositories.js.permission_error'), e.responseJSON.style
+ );
+ }
+ }
+ });
+ }
- if (input) {
- input.closest('.form-group').addClass('has-error');
- input.parent().append("" +
- defaultFields.name + '
');
- }
- }
+ // Edit record
+ global.onClickEdit = function() {
+ if (rowsSelected.length !== 1) {
+ return;
+ }
+
+ var row = TABLE.row('#' + rowsSelected[0]);
+ var node = row.node();
+ var rowData = row.data();
+
+ $(node).find('td input').trigger('click');
+ selectedRecord = node;
+
+ clearAllErrors();
+ changeToEditMode();
+ updateButtons();
+ saveAction = 'update';
+
+ $.ajax({
+ url: rowData.recordEditUrl,
+ type: 'GET',
+ dataType: 'json',
+ success: function(data) {
+ if (TABLE.column(1).visible() === false) {
+ TABLE.column(1).visible(true);
+ }
+ // Show save and cancel buttons in first two columns
+ $(node).children('td').eq(0).html($('#saveRecord').clone());
+ $(node).children('td').eq(1).html($('#cancelSave').clone());
+
+ // Record name column
+ var colIndex = getColumnIndex('#row-name');
+ if (colIndex) {
+ $(node).children('td').eq(colIndex)
+ .html(changeToInputField('repository_row', 'name',
+ data.repository_row.name));
}
- // Validate custom cells
- $.each(data.repository_cells || [], function(key, val) {
- $.each(val, function(key, val) {
- var input = $(selectedRecord).find('input[name=' + key + ']');
- if (input) {
- input.closest('.form-group').addClass('has-error');
- input.parent().append("" +
- val.data[0] + '
');
+ // Take care of custom cells
+ var cells = data.repository_row.repository_cells;
+ $(node).children('td').each(function(i) {
+ var td = $(this);
+ var rawIndex = TABLE.column.index('fromVisible', i);
+ var colHeader = TABLE.column(rawIndex).header();
+ if ($(colHeader).hasClass('repository-column')) {
+ // Check if cell on this record exists
+ var cell = cells[$(colHeader).attr('id')];
+ if (cell) {
+ td.html(changeToInputField('repository_cell',
+ $(colHeader).attr('id'),
+ cell.value));
+ } else {
+ td.html(changeToInputField('repository_cell',
+ $(colHeader).attr('id'), ''));
}
- });
+ }
});
- }
- }
- });
-}
-// Enable/disable edit button
-function updateButtons() {
- if (currentMode === 'viewMode') {
- $('#addRepositoryRecord').removeClass('disabled');
- $('#addRepositoryRecord').prop('disabled', false);
- $('#addNewColumn').removeClass('disabled');
- $('#addNewColumn').prop('disabled', false);
- $('#repository-columns-dropdown')
- .find('.dropdown-toggle')
- .prop('disabled', false);
- $('th').removeClass('disable-click');
- $('.repository-row-selector').removeClass('disabled');
- $('.repository-row-selector').prop('disabled', false);
- if (rowsSelected.length === 0) {
- $('#editRepositoryRecord').prop('disabled', true);
+ // initialize smart annotation
+ _.each($('[data-object="repository_cell"]'), function(el) {
+ if (_.isUndefined($(el).data('atwho'))) {
+ SmartAnnotation.init(el);
+ }
+ });
+ // Adjust columns width in table header
+ adjustTableHeader();
+ updateButtons();
+ },
+ error: function(e) {
+ if (e.status === 403) {
+ HelperModule.flashAlertMsg(
+ I18n.t('repositories.js.permission_error'), e.responseJSON.style
+ );
+ changeToViewMode();
+ updateButtons();
+ }
+ }
+ });
+ }
+
+ // Save record
+ global.onClickSave = function() {
+ var node;
+ var rowData;
+ if (saveAction === 'update') {
+ var row = TABLE.row(selectedRecord);
+ node = row.node();
+ rowData = row.data();
+ } else if (saveAction === 'create') {
+ node = selectedRecord;
+ }
+ // First fetch all the data in input fields
+ var data = {
+ request_url: $(TABLE_ID).data('current-uri'),
+ repository_row_id: $(selectedRecord).attr('id'),
+ repository_row: {},
+ repository_cells: {}
+ };
+
+ // Direct record attributes
+ // Record name
+ data.repository_row.name = $('td input[data-object = repository_row]').val();
+
+ // Custom cells
+ $(node).find('td input[data-object = repository_cell]').each(function() {
+ // Send data only and only if cell is not empty
+ if ($(this).val().trim()) {
+ data.repository_cells[$(this).attr('name')] = $(this).val();
+ }
+ });
+
+ var url;
+ var type;
+ if (saveAction === 'update') {
+ url = rowData.recordUpdateUrl;
+ type = 'PUT';
+ } else {
+ type = 'POST';
+ url = $('table' + TABLE_ID).data('create-record');
+ }
+ $.ajax({
+ url: url,
+ type: type,
+ dataType: 'json',
+ data: data,
+ success: function(data) {
+ HelperModule.flashAlertMsg(data.flash, 'success');
+ SmartAnnotation.closePopup();
+ onClickCancel();
+ },
+ error: function(e) {
+ SmartAnnotation.closePopup();
+ var data = e.responseJSON;
+ clearAllErrors();
+
+ if (e.status === 404) {
+ HelperModule.flashAlertMsg(
+ I18n.t('repositories.js.not_found_error'), 'danger'
+ );
+ changeToViewMode();
+ updateButtons();
+ } else if (e.status === 403) {
+ HelperModule.flashAlertMsg(
+ I18n.t('repositories.js.permission_error'), 'danger'
+ );
+ changeToViewMode();
+ updateButtons();
+ } else if (e.status === 400) {
+ if (data.default_fields) {
+ var defaultFields = data.default_fields;
+
+ // Validate record name
+ if (defaultFields.name) {
+ var input = $(selectedRecord).find('input[name = name]');
+
+ if (input) {
+ input.closest('.form-group').addClass('has-error');
+ input.parent().append("" +
+ defaultFields.name + '
');
+ }
+ }
+ }
+
+ // Validate custom cells
+ $.each(data.repository_cells || [], function(key, val) {
+ $.each(val, function(key, val) {
+ var input = $(selectedRecord).find('input[name=' + key + ']');
+ if (input) {
+ input.closest('.form-group').addClass('has-error');
+ input.parent().append("" +
+ val.data[0] + '
');
+ }
+ });
+ });
+ }
+ }
+ });
+ }
+
+ // Enable/disable edit button
+ function updateButtons() {
+ if (currentMode === 'viewMode') {
+ $('#addRepositoryRecord').removeClass('disabled');
+ $('#addRepositoryRecord').prop('disabled', false);
+ $('#addNewColumn').removeClass('disabled');
+ $('#addNewColumn').prop('disabled', false);
+ $('#repository-columns-dropdown')
+ .find('.dropdown-toggle')
+ .prop('disabled', false);
+ $('th').removeClass('disable-click');
+ $('.repository-row-selector').removeClass('disabled');
+ $('.repository-row-selector').prop('disabled', false);
+ if (rowsSelected.length === 0) {
+ $('#editRepositoryRecord').prop('disabled', true);
+ $('#editRepositoryRecord').addClass('disabled');
+ $('#deleteRepositoryRecordsButton').prop('disabled', true);
+ $('#deleteRepositoryRecordsButton').addClass('disabled');
+ $('#exportRepositoriesButton').addClass('disabled');
+ $('#exportRepositoriesButton').prop('disabled', true);
+ $('#exportRepositoriesButton').off('click');
+ $('#export-repositories').off('click');
+ $('#assignRepositoryRecords').addClass('disabled');
+ $('#assignRepositoryRecords').prop('disabled', true);
+ $('#unassignRepositoryRecords').addClass('disabled');
+ $('#unassignRepositoryRecords').prop('disabled', true);
+ } else {
+ if (rowsSelected.length === 1) {
+ $('#editRepositoryRecord').prop('disabled', false);
+ $('#editRepositoryRecord').removeClass('disabled');
+ } else {
+ $('#editRepositoryRecord').prop('disabled', true);
+ $('#editRepositoryRecord').addClass('disabled');
+ }
+ $('#deleteRepositoryRecordsButton').prop('disabled', false);
+ $('#deleteRepositoryRecordsButton').removeClass('disabled');
+ $('#exportRepositoriesButton').removeClass('disabled');
+ $('#exportRepositoriesButton').prop('disabled', false);
+ $('#exportRepositoriesButton').on('click', function() {
+ $('#exportRepositoryModal').modal('show');
+ });
+ $('#export-repositories').on('click', function() {
+ animateSpinner(null, true);
+ $('#form-export').submit();
+ });
+ $('#assignRepositoryRecords').removeClass('disabled');
+ $('#assignRepositoryRecords').prop('disabled', false);
+ $('#unassignRepositoryRecords').removeClass('disabled');
+ $('#unassignRepositoryRecords').prop('disabled', false);
+ }
+ } else if (currentMode === 'editMode') {
+ $('#addRepositoryRecord').addClass('disabled');
+ $('#addRepositoryRecord').prop('disabled', true);
$('#editRepositoryRecord').addClass('disabled');
- $('#deleteRepositoryRecordsButton').prop('disabled', true);
+ $('#editRepositoryRecord').prop('disabled', true);
+ $('#addNewColumn').addClass('disabled');
+ $('#addNewColumn').prop('disabled', true);
$('#deleteRepositoryRecordsButton').addClass('disabled');
+ $('#deleteRepositoryRecordsButton').prop('disabled', true);
$('#exportRepositoriesButton').addClass('disabled');
- $('#exportRepositoriesButton').prop('disabled', true);
$('#exportRepositoriesButton').off('click');
$('#export-repositories').off('click');
$('#assignRepositoryRecords').addClass('disabled');
$('#assignRepositoryRecords').prop('disabled', true);
$('#unassignRepositoryRecords').addClass('disabled');
$('#unassignRepositoryRecords').prop('disabled', true);
- } else {
- if (rowsSelected.length === 1) {
- $('#editRepositoryRecord').prop('disabled', false);
- $('#editRepositoryRecord').removeClass('disabled');
- } else {
- $('#editRepositoryRecord').prop('disabled', true);
- $('#editRepositoryRecord').addClass('disabled');
- }
- $('#deleteRepositoryRecordsButton').prop('disabled', false);
- $('#deleteRepositoryRecordsButton').removeClass('disabled');
- $('#exportRepositoriesButton').removeClass('disabled');
- $('#exportRepositoriesButton').prop('disabled', false);
- $('#exportRepositoriesButton').on('click', function() {
- $('#exportRepositoryModal').modal('show');
- });
- $('#export-repositories').on('click', function() {
- animateSpinner(null, true);
- $('#form-export').submit();
- });
- $('#assignRepositoryRecords').removeClass('disabled');
- $('#assignRepositoryRecords').prop('disabled', false);
- $('#unassignRepositoryRecords').removeClass('disabled');
- $('#unassignRepositoryRecords').prop('disabled', false);
+ $('#repository-columns-dropdown').find('.dropdown-toggle')
+ .prop('disabled', true);
+ $('th').addClass('disable-click');
+ $('.repository-row-selector').addClass('disabled');
+ $('.repository-row-selector').prop('disabled', true);
}
- } else if (currentMode === 'editMode') {
- $('#addRepositoryRecord').addClass('disabled');
- $('#addRepositoryRecord').prop('disabled', true);
- $('#editRepositoryRecord').addClass('disabled');
- $('#editRepositoryRecord').prop('disabled', true);
- $('#addNewColumn').addClass('disabled');
- $('#addNewColumn').prop('disabled', true);
- $('#deleteRepositoryRecordsButton').addClass('disabled');
- $('#deleteRepositoryRecordsButton').prop('disabled', true);
- $('#exportRepositoriesButton').addClass('disabled');
- $('#exportRepositoriesButton').off('click');
- $('#export-repositories').off('click');
- $('#assignRepositoryRecords').addClass('disabled');
- $('#assignRepositoryRecords').prop('disabled', true);
- $('#unassignRepositoryRecords').addClass('disabled');
- $('#unassignRepositoryRecords').prop('disabled', true);
- $('#repository-columns-dropdown').find('.dropdown-toggle')
- .prop('disabled', true);
- $('th').addClass('disable-click');
- $('.repository-row-selector').addClass('disabled');
- $('.repository-row-selector').prop('disabled', true);
}
-}
-// Clear all has-error tags
-function clearAllErrors() {
- // Remove any validation errors
- $(selectedRecord).find('.has-error').each(function() {
- $(this).removeClass('has-error');
- $(this).find('span').remove();
- });
- // Remove any alerts
- $('#alert-container').find('div').remove();
-}
-
-function clearRowSelection() {
- $('.dt-body-center .repository-row-selector').prop('checked', false);
- $('.dt-body-center .repository-row-selector').closest('tr')
- .removeClass('selected');
- rowsSelected = [];
-}
-
-// Restore previous table
-function onClickCancel() {
- if ($('#assigned').text().length === 0) {
- table.column(1).visible(false);
- }
- table.ajax.reload(function() {
- initRowSelection();
- }, false);
- changeToViewMode();
- updateButtons();
- animateSpinner(null, false);
-}
-
-// Handle enter key
-$(document).off('keypress').keypress(function(event) {
- var keycode = (event.keyCode ? event.keyCode : event.which);
- if (currentMode === 'editMode' && keycode === '13') {
- $('#saveRecord').click();
- return false;
- }
-});
-
-// Helper functions
-function getColumnIndex(id) {
- if (id < 0) {
- return false;
- }
- return table.column(id).index('visible');
-}
-
-// Takes object and surrounds it with input
-function changeToInputField(object, name, value) {
- return "
<%= t('teams.parse_sheet.example_value') %>
+<%= t('teams.parse_sheet.example_value') %>
+ <%= td %>| <%= t("repositories.table.added_on") %> | <%= t("repositories.table.added_by") %> | - <% repository.repository_columns.each do |column| %> + <% repository.repository_columns.order(:id).each do |column| %><%= 'data-deletable' if can_delete_column_in_repository(column) %> @@ -35,6 +35,3 @@ |
|---|
<%= t('teams.parse_sheet.example_value') %>
+<%= t('teams.parse_sheet.example_value') %>
+ <%= td %>