mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-12-01 12:24:28 +01:00
async generation of export and download cached csv using hidden iframe
This commit is contained in:
parent
fa6a54a422
commit
12d8c65fa2
@ -905,8 +905,10 @@ Application.Controllers.controller('ClosePeriodModalController', ['$scope', '$ui
|
||||
}
|
||||
]);
|
||||
|
||||
Application.Controllers.controller('AccountingExportModalController', ['$scope', '$uibModalInstance', 'Invoice', 'AccountingExport', 'growl', '_t',
|
||||
function ($scope, $uibModalInstance, Invoice, AccountingExport, growl, _t) {
|
||||
Application.Controllers.controller('AccountingExportModalController', ['$scope', '$uibModalInstance', 'Invoice', 'Export', 'CSRF', 'growl', '_t',
|
||||
function ($scope, $uibModalInstance, Invoice, Export, CSRF, growl, _t) {
|
||||
// Retrieve Anti-CSRF tokens from cookies
|
||||
CSRF.setMetaTags();
|
||||
|
||||
const SETTINGS = {
|
||||
acd: {
|
||||
@ -920,6 +922,18 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
||||
|
||||
/* PUBLIC SCOPE */
|
||||
|
||||
// API URL where the form will be posted
|
||||
$scope.actionUrl = '/api/accounting/export';
|
||||
|
||||
// Form action on the above URL
|
||||
$scope.method = 'post';
|
||||
|
||||
// Anti-CSRF token to inject into the download form
|
||||
$scope.csrfToken = angular.element('meta[name="csrf-token"]')[0].content;
|
||||
|
||||
// API request body to generate the export
|
||||
$scope.query = null;
|
||||
|
||||
// binding to radio button "export to"
|
||||
$scope.exportTarget = {
|
||||
software: null,
|
||||
@ -947,8 +961,13 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
||||
* Validate the close period creation
|
||||
*/
|
||||
$scope.ok = function () {
|
||||
AccountingExport.export($scope.exportTarget, function(res) {
|
||||
growl.info(_t('invoices.export_is_running'))
|
||||
const statusQry = mkQuery();
|
||||
$scope.query = statusQry;
|
||||
|
||||
Export.status(statusQry).then(function (res) {
|
||||
if (!res.data.exists) {
|
||||
growl.success(_t('invoices.export_is_running'));
|
||||
}
|
||||
$uibModalInstance.close(res);
|
||||
});
|
||||
};
|
||||
@ -964,7 +983,7 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
||||
};
|
||||
|
||||
/**
|
||||
* Will fill the export settings, accordint to the selected software
|
||||
* Will fill the export settings, according to the selected software
|
||||
*/
|
||||
$scope.fillSettings = function() {
|
||||
$scope.exportTarget.settings = SETTINGS[$scope.exportTarget.software];
|
||||
@ -987,6 +1006,24 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Prepare the query for the export API
|
||||
* @returns {{extension: *, query: *, category: string, type: string, key: *}}
|
||||
*/
|
||||
const mkQuery = function() {
|
||||
return {
|
||||
category: 'accounting',
|
||||
type: 'accounting-software',
|
||||
extension: $scope.exportTarget.settings.format,
|
||||
key: $scope.exportTarget.settings.separator,
|
||||
query: JSON.stringify({
|
||||
columns: $scope.exportTarget.settings.columns,
|
||||
encoding: $scope.exportTarget.settings.encoding,
|
||||
date_format: $scope.exportTarget.settings.dateFormat
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
// !!! MUST BE CALLED AT THE END of the controller
|
||||
return initialize();
|
||||
}]);
|
||||
|
@ -1,12 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
Application.Services.factory('AccountingExport', ['$resource', function ($resource) {
|
||||
return $resource('/api/accounting',
|
||||
{}, {
|
||||
export: {
|
||||
method: 'POST',
|
||||
url: '/api/accounting/export'
|
||||
}
|
||||
}
|
||||
);
|
||||
}]);
|
@ -78,6 +78,13 @@
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-warning" ng-click="ok()" ng-disabled="!exportForm.$valid" translate>{{ 'confirm' }}</button>
|
||||
<form role="form" ng-submit="ok()" name="exportFormParams" method="post" action="{{ actionUrl }}" class="inline">
|
||||
<input name="authenticity_token" type="hidden" ng-value="csrfToken"/>
|
||||
<input name="_method" type="hidden" ng-value="method"/>
|
||||
<input name="extension" type="hidden" ng-value="query.extension"/>
|
||||
<input name="key" type="hidden" ng-value="query.key"/>
|
||||
<input name="query" type="hidden" ng-value="query.query"/>
|
||||
<input type="submit" class="btn btn-warning" value="{{ 'confirm' | translate }}" formtarget="export-frame"/>
|
||||
</form>
|
||||
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'cancel' }}</button>
|
||||
</div>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
|
||||
<section class="heading-actions wrapper">
|
||||
<a class="btn btn-default rounded m-t-sm" ng-click="toggleExportModal()"><i class="fa fa-book"></i></a>
|
||||
<iframe name="export-frame" height="0" width="0" class="none" id="accounting-export-frame"></iframe>
|
||||
<a class="btn btn-lg btn-default rounded m-t-sm text-sm" ng-click="closeAnAccountingPeriod()"><i class="fa fa-calendar-check-o"></i> {{ 'invoices.accounting_periods' | translate }}</a>
|
||||
</section>
|
||||
</div>
|
||||
@ -117,7 +118,7 @@
|
||||
|
||||
<uib-tab heading="{{ 'invoices.invoicing_settings' | translate }}">
|
||||
<form class="invoice-placeholder">
|
||||
<div class="invoice-logo" style="background-image: url({{invoice.logo}});">
|
||||
<div class="invoice-logo">
|
||||
<img src="data:image/png;base64," data-src="holder.js/100%x100%/text:/font:FontAwesome/icon" bs-holder ng-if="!invoice.logo" class="img-responsive">
|
||||
<img base-sixty-four-image="invoice.logo" ng-if="invoice.logo && invoice.logo.base64">
|
||||
<div class="tools-box">
|
||||
|
@ -16,13 +16,9 @@ class API::AccountingExportsController < API::ApiController
|
||||
category: 'accounting',
|
||||
export_type: 'accounting-software',
|
||||
user: current_user,
|
||||
extension: params[:settings][:format],
|
||||
query: {
|
||||
columns: params[:settings][:columns],
|
||||
encoding: params[:settings][:encoding],
|
||||
date_format: params[:settings][:dateFormat]
|
||||
}.to_json,
|
||||
key: params[:settings][:separator]
|
||||
extension: params[:extension],
|
||||
query: params[:query],
|
||||
key: params[:key]
|
||||
)
|
||||
if @export.save
|
||||
render json: { export_id: @export.id }, status: :ok
|
||||
|
@ -28,7 +28,13 @@ class API::ExportsController < API::ApiController
|
||||
def status
|
||||
authorize Export
|
||||
|
||||
exports = Export.where(category: params[:category], export_type: params[:type], query: params[:query], key: params[:key])
|
||||
exports = Export.where(
|
||||
category: params[:category],
|
||||
export_type: params[:type],
|
||||
query: params[:query],
|
||||
key: params[:key],
|
||||
extension: params[:extension]
|
||||
)
|
||||
export = retrieve_last_export(exports, params[:category], params[:type])
|
||||
|
||||
if export.nil? || !FileTest.exist?(export.file)
|
||||
|
Loading…
Reference in New Issue
Block a user