add custom fields support to the generic csv importer

This commit is contained in:
binsky 2021-03-24 15:23:26 +01:00
parent 3c07c5edaf
commit 5894608d9c
6 changed files with 39 additions and 7 deletions

View file

@ -1347,7 +1347,8 @@
clear: both; }
input[type="checkbox"] {
min-height: inherit; }
min-height: inherit;
cursor: pointer; }
.alert {
padding: 15px;

File diff suppressed because one or more lines are too long

View file

@ -61,6 +61,11 @@
label: 'Custom field',
prop: 'custom_field'
},
{
label: 'Custom fields',
prop: 'custom_fields',
matching: ['custom_fields', 'customFields']
},
{
label: 'Notes',
prop: 'description',
@ -102,6 +107,25 @@
'value': row[k],
'secret': 0
});
} else if(field === 'custom_fields'){
if (row[k] !== undefined && (typeof row[k] === 'string' || row[k] instanceof String) && row[k].length > 1){
try {
row[k] = JSON.parse(row[k]);
for(var i = 0; k < row[k].length; i++){
_credential.custom_fields.push({
'label': row[k][i].label,
'value': row[k][i].value,
'secret': row[k][i].secret,
'field_type': row[k][i].field_type,
});
}
} catch (e) {
// ignore row[k], it contains no valid json data
// console.error(e);
}
} else {
_credential.custom_fields = row[k];
}
} else if(field === 'tags'){
if( row[k]) {
var tags = row[k].split(',');
@ -124,7 +148,6 @@
$scope.import_fields = [];
$scope.inspected_credential = false;
$scope.matched = false;
$scope.skipFirstRow = false;
var file_data = file.data.split(',');
file_data = decodeURIComponent(escape(window.atob(file_data[1])));
/** global: Papa */
@ -147,6 +170,12 @@
if($scope.matched){
$scope.inspectCredential(results.data[1]);
}
for(var j = 0; j < results.data.length; j++){
if (results.data[j].length === 1 && results.data[j][0].length === 0) {
results.data.splice(j,j);
}
}
$scope.parsed_csv = results.data;
$scope.$apply();
}
@ -191,6 +220,7 @@
});
};
$scope.skipFirstRow = true;
$scope.importing = false;
$scope.startCSVImport = function () {
$scope.importing = true;
@ -204,4 +234,4 @@
$scope.inspectCredential($scope.parsed_csv[start]);
};
}]);
}());
}());

View file

@ -63,7 +63,7 @@ angular.module('views/partials/forms/settings/general_settings.html', []).run(['
angular.module('views/partials/forms/settings/generic_csv_import.html', []).run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('views/partials/forms/settings/generic_csv_import.html',
'<div ng-controller="GenericCsvImportCtrl"><div class="row"><div class="col-xs-12 col-md-3"><div>{{ \'select.csv\' | translate}} <input type="file" file-select accept=".csv" success="csvLoaded"></div><div ng-show="parsed_csv"><span translate="parsed.csv.rows" translate-value-rows="{{ parsed_csv.length }}"></span></div><div ng-show="parsed_csv"><input type="checkbox" ng-model="skipFirstRow" ng-checked="matched"> {{ \'skip.first.row\' | translate}}</div><div ng-show="import_fields.indexOf(\'label\') === -1 && parsed_csv"><b>{{ \'import.csv.label.req\' | translate}}</b></div><div ng-show="import_fields.indexOf(\'label\') !== -1 && parsed_csv"><button class="btn btn-success" ng-disabled="importing" ng-click="startCSVImport()"><i class="fa fa-spinner fa-spin" ng-show="importing"></i> {{ (importing) ? (\'import.importing\' | translate) : (\'import.start\' | translate) }}</button></div><div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div><div class="col-xs-12 col-md-9" ng-show="parsed_csv"><b>{{ \'first.five.lines\' | translate }}</b><br>{{ \'assign.column\' | translate }}<div class="import-table-outter"><table class="import-table"><tr ng-repeat="line in parsed_csv | limitTo:5"><td class="inspect"><i class="fa fa-search" ng-click="inspectCredential(line)" ng-if="($index > 0 && matched && import_fields.length > 0) || ($index >= 0 && !matched && import_fields.length > 0)"></i></td><td ng-repeat="prop in line track by $index">{{line[$index]}}</td></tr><tr ng-repeat="line in parsed_csv | limitTo:1"><td></td><td ng-repeat="prop in line track by $index"><select ng-model="import_fields[$index]" ng-change="updateExample()" ng-options="property.prop as property.label for property in credentialProperties"></select></td></tr></table></div><div ng-show="inspected_credential && import_fields.length > 0"><b>{{ \'example.credential\' | translate}}</b><div credential-template="inspected_credential" show-label></div></div></div></div></div>');
'<div ng-controller="GenericCsvImportCtrl"><div class="row"><div class="col-xs-12 col-md-3"><div>{{ \'select.csv\' | translate}} <input type="file" file-select accept=".csv" success="csvLoaded"></div><div ng-show="parsed_csv"><span translate="parsed.csv.rows" translate-value-rows="{{ parsed_csv.length }}"></span></div><div ng-show="parsed_csv"><input type="checkbox" ng-model="skipFirstRow"> {{ \'skip.first.row\' | translate}}</div><div ng-show="import_fields.indexOf(\'label\') === -1 && parsed_csv"><b>{{ \'import.csv.label.req\' | translate}}</b></div><div ng-show="import_fields.indexOf(\'label\') !== -1 && parsed_csv"><button class="btn btn-success" ng-disabled="importing" ng-click="startCSVImport()"><i class="fa fa-spinner fa-spin" ng-show="importing"></i> {{ (importing) ? (\'import.importing\' | translate) : (\'import.start\' | translate) }}</button></div><div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div><div class="col-xs-12 col-md-9" ng-show="parsed_csv"><b>{{ \'first.five.lines\' | translate }}</b><br>{{ \'assign.column\' | translate }}<div class="import-table-outter"><table class="import-table"><tr ng-repeat="line in parsed_csv | limitTo:5"><td class="inspect"><i class="fa fa-search" ng-click="inspectCredential(line)" ng-if="($index > 0 && matched && import_fields.length > 0) || ($index >= 0 && !matched && import_fields.length > 0)"></i></td><td ng-repeat="prop in line track by $index">{{line[$index]}}</td></tr><tr ng-repeat="line in parsed_csv | limitTo:1"><td></td><td ng-repeat="prop in line track by $index"><select ng-model="import_fields[$index]" ng-change="updateExample()" ng-options="property.prop as property.label for property in credentialProperties"></select></td></tr></table></div><div ng-show="inspected_credential && import_fields.length > 0"><b>{{ \'example.credential\' | translate}}</b><div credential-template="inspected_credential" show-label></div></div></div></div></div>');
}]);
angular.module('views/partials/forms/settings/import.html', []).run(['$templateCache', function($templateCache) {

View file

@ -119,6 +119,7 @@
//Fix NC fucking up our style
input[type="checkbox"]{
min-height: inherit;
cursor: pointer;
}
.alert {
padding: 15px;

View file

@ -11,7 +11,7 @@
</span>
</div>
<div ng-show="parsed_csv">
<input type="checkbox" ng-model="skipFirstRow" ng-checked="matched"> {{ 'skip.first.row' | translate}}
<input type="checkbox" ng-model="skipFirstRow"> {{ 'skip.first.row' | translate}}
</div>
<div ng-show="import_fields.indexOf('label') === -1 && parsed_csv">
<b>{{ 'import.csv.label.req' | translate}}</b>
@ -65,4 +65,4 @@
</div>
</div>
</div>
</div>