refs #3949 textfield, edit and create dialog added
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
parent
9236e3e3e8
commit
c51354b13f
|
@ -5,6 +5,24 @@
|
||||||
form="form"
|
form="form"
|
||||||
save="patch">
|
save="patch">
|
||||||
</vn-watcher>
|
</vn-watcher>
|
||||||
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Companies"
|
||||||
|
data="companies"
|
||||||
|
order="code">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Warehouses"
|
||||||
|
data="warehouses"
|
||||||
|
order="name">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="DmsTypes"
|
||||||
|
data="dmsTypes"
|
||||||
|
order="name">
|
||||||
|
</vn-crud-model>
|
||||||
<form name="form" ng-submit="watcher.submit()" class="vn-w-md">
|
<form name="form" ng-submit="watcher.submit()" class="vn-w-md">
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
|
@ -31,14 +49,14 @@
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Expedition date"
|
label="Expedition date"
|
||||||
ng-model="$ctrl.invoiceIn.issued"
|
ng-model="$ctrl.invoiceIn.issued"
|
||||||
vn-focus
|
vn-focus
|
||||||
rule>
|
rule>
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Operation date"
|
label="Operation date"
|
||||||
ng-model="$ctrl.invoiceIn.operated"
|
ng-model="$ctrl.invoiceIn.operated"
|
||||||
rule>
|
rule>
|
||||||
|
@ -57,17 +75,47 @@
|
||||||
{{id}} - {{name}}
|
{{id}} - {{name}}
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-datalist>
|
</vn-datalist>
|
||||||
|
<vn-textfield
|
||||||
|
label="Document"
|
||||||
|
ng-model="$ctrl.invoiceIn.dmsFk"
|
||||||
|
ng-change="$ctrl.checkFileExists($ctrl.invoiceIn.dmsFk)"
|
||||||
|
rule>
|
||||||
|
<prepend>
|
||||||
|
<vn-icon-button
|
||||||
|
disabled="$ctrl.fileExists"
|
||||||
|
ng-if="$ctrl.invoiceIn.dmsFk"
|
||||||
|
title="{{'Download file' | translate}}"
|
||||||
|
icon="cloud_download"
|
||||||
|
ng-click="$ctrl.downloadFile($ctrl.invoiceIn.dmsFk)">
|
||||||
|
</vn-icon-button>
|
||||||
|
</prepend>
|
||||||
|
<append>
|
||||||
|
<vn-icon-button
|
||||||
|
disabled="$ctrl.fileExists"
|
||||||
|
ng-if="$ctrl.invoiceIn.dmsFk"
|
||||||
|
ng-click="$ctrl.openEditDialog($ctrl.invoiceIn.dmsFk)"
|
||||||
|
icon="edit"
|
||||||
|
title="{{'Edit document' | translate}}">
|
||||||
|
</vn-icon-button>
|
||||||
|
<vn-icon-button
|
||||||
|
ng-if="!$ctrl.invoiceIn.dmsFk"
|
||||||
|
ng-click="$ctrl.openCreateDialog()"
|
||||||
|
icon="add_circle"
|
||||||
|
title="{{'Create document' | translate}}">
|
||||||
|
</vn-icon-button>
|
||||||
|
</append>
|
||||||
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Entry date"
|
label="Entry date"
|
||||||
ng-model="$ctrl.invoiceIn.bookEntried"
|
ng-model="$ctrl.invoiceIn.bookEntried"
|
||||||
rule>
|
rule>
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Accounted date"
|
label="Accounted date"
|
||||||
ng-model="$ctrl.invoiceIn.booked"
|
ng-model="$ctrl.invoiceIn.booked"
|
||||||
rule>
|
rule>
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
|
@ -104,4 +152,166 @@
|
||||||
ng-click="watcher.loadOriginalData()">
|
ng-click="watcher.loadOriginalData()">
|
||||||
</vn-button>
|
</vn-button>
|
||||||
</vn-button-bar>
|
</vn-button-bar>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<!-- Create edit dms dialog -->
|
||||||
|
<vn-dialog
|
||||||
|
vn-id="dmsEditDialog"
|
||||||
|
message="Edit document"
|
||||||
|
on-accept="$ctrl.onEdit()">
|
||||||
|
<tpl-body>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-textfield
|
||||||
|
vn-one
|
||||||
|
vn-focus
|
||||||
|
label="Reference"
|
||||||
|
ng-model="$ctrl.dms.reference"
|
||||||
|
rule>
|
||||||
|
</vn-textfield>
|
||||||
|
<vn-autocomplete vn-one required="true"
|
||||||
|
label="Company"
|
||||||
|
ng-model="$ctrl.dms.companyId"
|
||||||
|
url="Companies"
|
||||||
|
show-field="code"
|
||||||
|
value-field="id">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-autocomplete vn-one required="true"
|
||||||
|
label="Warehouse"
|
||||||
|
ng-model="$ctrl.dms.warehouseId"
|
||||||
|
url="Warehouses"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id">
|
||||||
|
</vn-autocomplete>
|
||||||
|
<vn-autocomplete vn-one required="true"
|
||||||
|
label="Type"
|
||||||
|
ng-model="$ctrl.dms.dmsTypeId"
|
||||||
|
url="DmsTypes"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-textarea
|
||||||
|
vn-one
|
||||||
|
required="true"
|
||||||
|
label="Description"
|
||||||
|
ng-model="$ctrl.dms.description"
|
||||||
|
rule>
|
||||||
|
</vn-textarea>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-input-file
|
||||||
|
vn-one
|
||||||
|
label="File"
|
||||||
|
ng-model="$ctrl.dms.files"
|
||||||
|
on-change="$ctrl.onFileChange($files)"
|
||||||
|
accept="{{$ctrl.allowedContentTypes}}"
|
||||||
|
required="false"
|
||||||
|
multiple="true">
|
||||||
|
<append>
|
||||||
|
<vn-icon vn-none
|
||||||
|
color-marginal
|
||||||
|
title="{{$ctrl.contentTypesInfo}}"
|
||||||
|
icon="info">
|
||||||
|
</vn-icon>
|
||||||
|
</append>
|
||||||
|
</vn-input-file>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-vertical>
|
||||||
|
<vn-check disabled="true"
|
||||||
|
label="Generate identifier for original file"
|
||||||
|
ng-model="$ctrl.dms.hasFile">
|
||||||
|
</vn-check>
|
||||||
|
</vn-vertical>
|
||||||
|
</tpl-body>
|
||||||
|
<tpl-buttons>
|
||||||
|
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
|
||||||
|
<button response="accept" translate>Save</button>
|
||||||
|
</tpl-buttons>
|
||||||
|
</vn-dialog>
|
||||||
|
|
||||||
|
<!-- Create new dms dialog -->
|
||||||
|
<vn-dialog
|
||||||
|
vn-id="dmsCreateDialog"
|
||||||
|
message="Create document"
|
||||||
|
on-accept="$ctrl.onCreate()">
|
||||||
|
<tpl-body>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-textfield
|
||||||
|
vn-one
|
||||||
|
vn-focus
|
||||||
|
label="Reference"
|
||||||
|
ng-model="$ctrl.dms.reference"
|
||||||
|
rule>
|
||||||
|
</vn-textfield>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
label="Company"
|
||||||
|
ng-model="$ctrl.dms.companyId"
|
||||||
|
data="companies"
|
||||||
|
show-field="code"
|
||||||
|
value-field="id"
|
||||||
|
required="true">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
label="Warehouse"
|
||||||
|
ng-model="$ctrl.dms.warehouseId"
|
||||||
|
data="warehouses"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
required="true">
|
||||||
|
</vn-autocomplete>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
label="Type"
|
||||||
|
ng-model="$ctrl.dms.dmsTypeId"
|
||||||
|
data="dmsTypes"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
required="true">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-textarea
|
||||||
|
vn-one
|
||||||
|
label="Description"
|
||||||
|
ng-model="$ctrl.dms.description"
|
||||||
|
required="true"
|
||||||
|
rule>
|
||||||
|
</vn-textarea>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-input-file
|
||||||
|
vn-one
|
||||||
|
label="File"
|
||||||
|
ng-model="$ctrl.dms.files"
|
||||||
|
on-change="$ctrl.onFileChange($files)"
|
||||||
|
accept="{{$ctrl.allowedContentTypes}}"
|
||||||
|
required="true"
|
||||||
|
multiple="true">
|
||||||
|
<append>
|
||||||
|
<vn-icon vn-none
|
||||||
|
color-marginal
|
||||||
|
title="{{$ctrl.contentTypesInfo}}"
|
||||||
|
icon="info">
|
||||||
|
</vn-icon>
|
||||||
|
</append>
|
||||||
|
</vn-input-file>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-vertical>
|
||||||
|
<vn-check
|
||||||
|
label="Generate identifier for original file"
|
||||||
|
ng-model="$ctrl.dms.hasFile">
|
||||||
|
</vn-check>
|
||||||
|
</vn-vertical>
|
||||||
|
</tpl-body>
|
||||||
|
<tpl-buttons>
|
||||||
|
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
|
||||||
|
<button response="accept" translate>Create</button>
|
||||||
|
</tpl-buttons>
|
||||||
|
</vn-dialog>
|
||||||
|
|
|
@ -1,9 +1,177 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
import Section from 'salix/components/section';
|
import Section from 'salix/components/section';
|
||||||
|
import UserError from 'core/lib/user-error';
|
||||||
|
|
||||||
|
class Controller extends Section {
|
||||||
|
constructor($element, $, vnFile) {
|
||||||
|
super($element, $, vnFile);
|
||||||
|
this.vnFile = vnFile;
|
||||||
|
this.getAllowedContentTypes();
|
||||||
|
this._fileExists = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get fileExists() {
|
||||||
|
return this._fileExists;
|
||||||
|
}
|
||||||
|
|
||||||
|
getAllowedContentTypes() {
|
||||||
|
this.$http.get('DmsContainers/allowedContentTypes').then(res => {
|
||||||
|
const contentTypes = res.data.join(', ');
|
||||||
|
this.allowedContentTypes = contentTypes;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkFileExists(dmsId) {
|
||||||
|
if (!dmsId) return;
|
||||||
|
let filter = {
|
||||||
|
fields: ['id']
|
||||||
|
};
|
||||||
|
await this.$http.get(`Dms/${dmsId}`, {filter})
|
||||||
|
.then(() => this._fileExists = false)
|
||||||
|
.catch(() => this._fileExists = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
openEditDialog(dmsId) {
|
||||||
|
this.getFile(dmsId).then(() => this.$.dmsEditDialog.show());
|
||||||
|
}
|
||||||
|
|
||||||
|
openCreateDialog() {
|
||||||
|
this.dms = {
|
||||||
|
reference: null,
|
||||||
|
warehouseId: null,
|
||||||
|
companyId: null,
|
||||||
|
dmsTypeId: null,
|
||||||
|
description: null,
|
||||||
|
hasFile: true,
|
||||||
|
hasFileAttached: true,
|
||||||
|
files: null
|
||||||
|
};
|
||||||
|
this.$.dmsCreateDialog.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFile(dmsId) {
|
||||||
|
const path = `Dms/${dmsId}`;
|
||||||
|
await this.$http.get(path).then(res => {
|
||||||
|
const dms = res.data && res.data;
|
||||||
|
this.dms = {
|
||||||
|
dmsId: dms.id,
|
||||||
|
reference: dms.reference,
|
||||||
|
warehouseId: dms.warehouseFk,
|
||||||
|
companyId: dms.companyFk,
|
||||||
|
dmsTypeId: dms.dmsTypeFk,
|
||||||
|
description: dms.description,
|
||||||
|
hasFile: dms.hasFile,
|
||||||
|
hasFileAttached: false,
|
||||||
|
files: []
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get contentTypesInfo() {
|
||||||
|
return this.$t('ContentTypesInfo', {
|
||||||
|
allowedContentTypes: this.allowedContentTypes
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadFile(dmsId) {
|
||||||
|
this.vnFile.download(`api/dms/${dmsId}/downloadFile`);
|
||||||
|
}
|
||||||
|
|
||||||
|
onFileChange(files) {
|
||||||
|
let hasFileAttached = false;
|
||||||
|
if (files.length > 0)
|
||||||
|
hasFileAttached = true;
|
||||||
|
|
||||||
|
this.$.$applyAsync(() => {
|
||||||
|
this.dms.hasFileAttached = hasFileAttached;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onEdit() {
|
||||||
|
if (!this.dms.companyId)
|
||||||
|
throw new UserError(`The company can't be empty`);
|
||||||
|
if (!this.dms.warehouseId)
|
||||||
|
throw new UserError(`The warehouse can't be empty`);
|
||||||
|
if (!this.dms.dmsTypeId)
|
||||||
|
throw new UserError(`The DMS Type can't be empty`);
|
||||||
|
if (!this.dms.description)
|
||||||
|
throw new UserError(`The description can't be empty`);
|
||||||
|
if (!this.dms.files)
|
||||||
|
throw new UserError(`The files can't be empty`);
|
||||||
|
|
||||||
|
const query = `dms/${this.dms.dmsId}/updateFile`;
|
||||||
|
const options = {
|
||||||
|
method: 'POST',
|
||||||
|
url: query,
|
||||||
|
params: this.dms,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': undefined
|
||||||
|
},
|
||||||
|
transformRequest: files => {
|
||||||
|
const formData = new FormData();
|
||||||
|
|
||||||
|
for (let i = 0; i < files.length; i++)
|
||||||
|
formData.append(files[i].name, files[i]);
|
||||||
|
|
||||||
|
return formData;
|
||||||
|
},
|
||||||
|
data: this.dms.files
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$http(options).then(res => {
|
||||||
|
if (res) {
|
||||||
|
this.vnApp.showSuccess(this.$t('Data saved!'));
|
||||||
|
this.$.watcher.updateOriginalData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onCreate() {
|
||||||
|
if (!this.dms.companyId)
|
||||||
|
throw new UserError(`The company can't be empty`);
|
||||||
|
if (!this.dms.warehouseId)
|
||||||
|
throw new UserError(`The warehouse can't be empty`);
|
||||||
|
if (!this.dms.dmsTypeId)
|
||||||
|
throw new UserError(`The DMS Type can't be empty`);
|
||||||
|
if (!this.dms.description)
|
||||||
|
throw new UserError(`The description can't be empty`);
|
||||||
|
if (!this.dms.files)
|
||||||
|
throw new UserError(`The files can't be empty`);
|
||||||
|
|
||||||
|
const query = `Dms/uploadFile`;
|
||||||
|
const options = {
|
||||||
|
method: 'POST',
|
||||||
|
url: query,
|
||||||
|
params: this.dms,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': undefined
|
||||||
|
},
|
||||||
|
transformRequest: files => {
|
||||||
|
const formData = new FormData();
|
||||||
|
|
||||||
|
for (let i = 0; i < files.length; i++)
|
||||||
|
formData.append(files[i].name, files[i]);
|
||||||
|
|
||||||
|
return formData;
|
||||||
|
},
|
||||||
|
data: this.dms.files
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$http(options).then(res => {
|
||||||
|
if (res) {
|
||||||
|
this.vnApp.showSuccess(this.$t('Data saved!'));
|
||||||
|
this.invoiceIn.dmsFk = res.data[0].id;
|
||||||
|
this.$.watcher.updateOriginalData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Controller.$inject = ['$element', '$scope', 'vnFile'];
|
||||||
|
|
||||||
ngModule.vnComponent('vnInvoiceInBasicData', {
|
ngModule.vnComponent('vnInvoiceInBasicData', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
controller: Section,
|
controller: Controller,
|
||||||
bindings: {
|
bindings: {
|
||||||
invoiceIn: '<'
|
invoiceIn: '<'
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ContentTypesInfo: Allowed file types {{allowedContentTypes}}
|
|
@ -0,0 +1,15 @@
|
||||||
|
Upload file: Subir fichero
|
||||||
|
Edit file: Editar fichero
|
||||||
|
Upload: Subir
|
||||||
|
Document: Documento
|
||||||
|
ContentTypesInfo: "Tipos de archivo permitidos: {{allowedContentTypes}}"
|
||||||
|
Generate identifier for original file: Generar identificador para archivo original
|
||||||
|
File management: Gestión documental
|
||||||
|
Hard copy: Copia
|
||||||
|
This file will be deleted: Este fichero va a ser borrado
|
||||||
|
Are you sure?: Estas seguro?
|
||||||
|
File deleted: Fichero eliminado
|
||||||
|
Remove file: Eliminar fichero
|
||||||
|
Download file: Descargar fichero
|
||||||
|
Edit document: Editar documento
|
||||||
|
Create document: Crear documento
|
Loading…
Reference in New Issue