handle saving notes and folders in a uniform way

pull/41/head
Laurent Cozic 2017-05-23 20:36:19 +00:00
parent 56dc74c4cc
commit a88e729812
3 changed files with 58 additions and 5 deletions

View File

@ -90,6 +90,17 @@ class BaseModel {
return model;
}
static diffObjects(oldModel, newModel) {
let output = {};
for (let n in newModel) {
if (!newModel.hasOwnProperty(n)) continue;
if (!(n in oldModel) || newModel[n] !== oldModel[n]) {
output[n] = newModel[n];
}
}
return output;
}
static saveQuery(o, isNew = 'auto') {
if (isNew == 'auto') isNew = !o.id;

View File

@ -5,6 +5,7 @@ import { Log } from 'src/log.js'
import { Note } from 'src/models/note.js'
import { Registry } from 'src/registry.js'
import { ScreenHeader } from 'src/components/screen-header.js';
import { NoteFolderService } from 'src/services/note-folder-service.js';
class NoteScreenComponent extends React.Component {
@ -15,6 +16,7 @@ class NoteScreenComponent extends React.Component {
constructor() {
super();
this.state = { note: Note.new() }
this.originalNote = null;
}
componentWillMount() {
@ -22,6 +24,7 @@ class NoteScreenComponent extends React.Component {
this.setState({ note: Note.new(this.props.folderId) });
} else {
Note.load(this.props.noteId).then((note) => {
this.originalNote = Object.assign({}, note);
this.setState({ note: note });
});
}
@ -44,11 +47,9 @@ class NoteScreenComponent extends React.Component {
}
saveNoteButton_press = () => {
let isNew = !this.state.note.id;
Note.save(this.state.note).then((note) => {
if (isNew) return Note.updateGeolocation(note.id);
}).then(() => {
Registry.synchronizer().start();
NoteFolderService.save('note', this.state.note, this.originalNote).then((note) => {
this.originalNote = Object.assign({}, note);
this.setState({ note: note });
});
}

View File

@ -0,0 +1,41 @@
// A service that handle notes and folders in a uniform way
import { BaseService } from 'src/base-service.js';
import { BaseModel } from 'src/base-model.js';
import { Note } from 'src/models/note.js';
import { Folder } from 'src/models/folder.js';
import { Log } from 'src/log.js';
import { Registry } from 'src/registry.js';
class NoteFolderService extends BaseService {
static save(type, item, oldItem) {
if (oldItem) {
let diff = BaseModel.diffObjects(oldItem, item);
if (!Object.getOwnPropertyNames(diff).length) {
Log.info('Item not changed - not saved');
return Promise.resolve(item);
}
}
let ItemClass = null;
if (type == 'note') {
ItemClass = Note;
} else if (type == 'folder') {
ItemClass = Folder;
}
let isNew = !item.id;
let output = null;
return ItemClass.save(item).then((item) => {
output = item;
if (isNew && type == 'note') return Note.updateGeolocation(item.id);
}).then(() => {
Registry.synchronizer().start();
return output;
});
}
}
export { NoteFolderService };