saving attributes

This commit is contained in:
azivner 2018-01-11 21:40:09 -05:00
parent 8fe6a9353a
commit 231c245c87
3 changed files with 87 additions and 31 deletions

View file

@ -2,19 +2,38 @@
const attributesDialog = (function() {
const dialogEl = $("#attributes-dialog");
const attributesModel = new AttributesModel();
function AttributesModel(attributes) {
const model = this;
function AttributesModel() {
const self = this;
this.attributes = ko.observableArray(attributes);
this.attributes = ko.observableArray();
this.loadAttributes = async function() {
const noteId = noteEditor.getCurrentNoteId();
const attributes = await server.get('notes/' + noteId + '/attributes');
this.attributes(attributes);
};
this.addNewRow = function() {
model.attributes.push({
self.attributes.push({
attribute_id: '',
name: '',
value: ''
});
}
};
this.save = async function() {
const noteId = noteEditor.getCurrentNoteId();
const attributes = await server.put('notes/' + noteId + '/attributes', this.attributes());
self.attributes(attributes);
showMessage("Attributes have been saved.");
};
}
async function showDialog() {
@ -26,11 +45,7 @@ const attributesDialog = (function() {
height: 700
});
const noteId = noteEditor.getCurrentNoteId();
const attributes = await server.get('notes/' + noteId + '/attributes');
ko.applyBindings(new AttributesModel(attributes));
attributesModel.loadAttributes();
}
$(document).bind('keydown', 'alt+a', e => {
@ -39,6 +54,8 @@ const attributesDialog = (function() {
e.preventDefault();
});
ko.applyBindings(attributesModel);
return {
showDialog
};

View file

@ -4,6 +4,8 @@ const express = require('express');
const router = express.Router();
const sql = require('../../services/sql');
const auth = require('../../services/auth');
const sync_table = require('../../services/sync_table');
const utils = require('../../services/utils');
const wrap = require('express-promise-wrap').wrap;
router.get('/:noteId/attributes', auth.checkApiAuth, wrap(async (req, res, next) => {
@ -12,4 +14,35 @@ router.get('/:noteId/attributes', auth.checkApiAuth, wrap(async (req, res, next)
res.send(await sql.getAll("SELECT * FROM attributes WHERE note_id = ? ORDER BY date_created", [noteId]));
}));
router.put('/:noteId/attributes', auth.checkApiAuth, wrap(async (req, res, next) => {
const noteId = req.params.noteId;
const attributes = req.body;
const now = utils.nowDate();
await sql.doInTransaction(async () => {
for (const attr of attributes) {
if (attr.attribute_id) {
await sql.execute("UPDATE attributes SET name = ?, value = ?, date_modified = ? WHERE attribute_id = ?",
[attr.name, attr.value, now, attr.attribute_id]);
}
else {
attr.attribute_id = utils.newAttributeId();
await sql.insert("attributes", {
attribute_id: attr.attribute_id,
note_id: noteId,
name: attr.name,
value: attr.value,
date_created: now,
date_modified: now
});
}
await sync_table.addAttributeSync(attr.attribute_id);
}
});
res.send(await sql.getAll("SELECT * FROM attributes WHERE note_id = ? ORDER BY date_created", [noteId]));
}));
module.exports = router;

View file

@ -341,28 +341,34 @@
</div>
<div id="attributes-dialog" title="Note attributes" style="display: none; padding: 20px;">
<button class="btn-small" data-bind="click: addNewRow">Add new attribute</button>
<div style="display: flex; justify-content: space-between; padding: 15px; padding-top: 0;">
<button class="btn-default" data-bind="click: addNewRow">Add new attribute</button>
<table id="attributes-table" class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Value</th>
</tr>
</thead>
<tbody data-bind="foreach: attributes">
<tr>
<td data-bind="text: attribute_id"></td>
<td>
<input type="text" data-bind="value: name"/>
</td>
<td>
<input type="text" data-bind="value: value"/>
</td>
</tr>
</tbody>
</table>
<button class="btn-primary" data-bind="click: save">Save</button>
</div>
<div style="height: 97%; overflow: auto">
<table id="attributes-table" class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Value</th>
</tr>
</thead>
<tbody data-bind="foreach: attributes">
<tr>
<td data-bind="text: attribute_id"></td>
<td>
<input type="text" data-bind="value: name"/>
</td>
<td>
<input type="text" data-bind="value: value" style="width: 300px"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="tooltip" style="display: none;"></div>