salix/client/core/src/watcher/index.js

149 lines
4.2 KiB
JavaScript
Raw Normal View History

import {module} from '../module';
2017-02-07 13:34:26 +00:00
import Component from '../lib/component';
import getModifiedData from '../lib/modified';
import copyObject from '../lib/copy';
import isEqual from '../lib/equals';
/**
* Component that checks for changes on a specific model property and
* asks the user to save or discard it when the state changes.
* Also it can save the data to the server when the @url and @idField
* properties are provided.
*/
export default class Watcher extends Component {
2017-02-07 16:38:30 +00:00
constructor($element, $scope, $state, $transitions, $http, vnAppLogger, $translate) {
super($element);
this.$scope = $scope;
this.$state = $state;
this.$http = $http;
2017-02-07 16:38:30 +00:00
this.$translate = $translate;
this.vnAppLogger = vnAppLogger;
this.state = null;
this.deregisterCallback = $transitions.onStart({},
(transition) => this.callback(transition));
this.copyData();
}
$onInit() {
if(this.get) {
this.fetchData();
}
}
$onChanges(changes) {
if(this.data) {
this.copyData();
}
}
$onDestroy() {
this.deregisterCallback();
}
fetchData() {
let id = this.data[this.idField];
return new Promise((resolve, reject) => {
this.$http.get(`${this.url}/${id}`).then(
2017-02-07 16:02:17 +00:00
json => this.writeData(json, resolve),
json => reject(json)
);
});
}
submit() {
2017-02-21 10:36:43 +00:00
if(this.form && !this.form.$valid) {
return new Promise (
(resolve, reject) => this.invalidForm(reject)
);
}
if (!this.dataChanged()) {
2017-02-21 10:36:43 +00:00
return new Promise (
(resolve, reject) => this.noChanges(reject)
2017-02-07 16:38:30 +00:00
);
}
2017-02-21 10:36:43 +00:00
let changedData = getModifiedData(this.data, this.orgData);
if(this.save) {
this.save.model = changedData;
return new Promise((resolve, reject) => {
this.save.accept().then(
json => this.writeData({data: json}, resolve),
json => reject(json)
);
});
}
// XXX: Alternative when mgCrud is not used
let id = this.orgData[this.idField];
if(id) {
return new Promise((resolve, reject) => {
this.$http.put(`${this.url}/${id}`, changedData).then(
2017-02-07 16:02:17 +00:00
json => this.writeData(json, resolve),
json => reject(json)
);
});
}
else {
return new Promise((resolve, reject) => {
this.$http.post(this.url, this.data).then(
2017-02-07 16:02:17 +00:00
json => this.writeData(json, resolve),
json => reject(json)
);
});
}
}
2017-02-07 16:02:17 +00:00
writeData(json, resolve) {
copyObject(json.data, this.data);
this.copyData();
resolve(json);
}
2017-02-21 10:36:43 +00:00
noChanges(resolve) {
this.vnAppLogger.showMessage(
this.$translate.instant('No changes to save')
);
resolve();
}
invalidForm(resolve) {
this.vnAppLogger.showMessage(
this.$translate.instant('Some fields are invalid')
);
resolve();
}
copyData() {
2017-02-07 16:02:17 +00:00
this.orgData = copyObject(this.data);
}
callback(transition) {
if (!this.state && this.dataChanged()) {
this.state = transition.to().name;
2017-02-07 16:38:30 +00:00
this.$scope.confirm.show();
return false;
}
return true;
}
dataChanged() {
return !isEqual(this.data, this.orgData);
}
onConfirmResponse(response) {
if(response == 'ACCEPT') {
copyObject(this.orgData, this.data);
this.$state.go(this.state);
}
else {
this.state = null;
}
}
}
2017-02-07 16:38:30 +00:00
Watcher.$inject = ['$element', '$scope', '$state', '$transitions', '$http', 'vnAppLogger', '$translate'];
module.component('vnWatcher', {
template: require('./index.html'),
bindings: {
url: '@?',
idField: '@?',
data: '<',
2017-02-21 10:36:43 +00:00
form: '<',
save: '<',
get: '=?'
},
controller: Watcher
});