mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02:00
allow duplicated attribute per note (in effect attributes can be multi-valued). Closes #33
This commit is contained in:
parent
c2a2f195aa
commit
7c74c77a2c
@ -0,0 +1 @@
|
|||||||
|
DROP INDEX IDX_attributes_noteId_name;
|
@ -118,4 +118,3 @@ CREATE INDEX IDX_note_images_noteId ON note_images (noteId);
|
|||||||
CREATE INDEX IDX_note_images_imageId ON note_images (imageId);
|
CREATE INDEX IDX_note_images_imageId ON note_images (imageId);
|
||||||
CREATE INDEX IDX_note_images_noteId_imageId ON note_images (noteId, imageId);
|
CREATE INDEX IDX_note_images_noteId_imageId ON note_images (noteId, imageId);
|
||||||
CREATE INDEX IDX_attributes_noteId ON attributes (noteId);
|
CREATE INDEX IDX_attributes_noteId ON attributes (noteId);
|
||||||
CREATE UNIQUE INDEX IDX_attributes_noteId_name ON attributes (noteId, name);
|
|
||||||
|
@ -28,7 +28,7 @@ const attributesDialog = (function() {
|
|||||||
|
|
||||||
function isValid() {
|
function isValid() {
|
||||||
for (let attrs = self.attributes(), i = 0; i < attrs.length; i++) {
|
for (let attrs = self.attributes(), i = 0; i < attrs.length; i++) {
|
||||||
if (self.isEmptyName(i) || self.isNotUnique(i)) {
|
if (self.isEmptyName(i)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,8 @@ router.get('/', auth.checkApiAuth, wrap(async (req, res, next) => {
|
|||||||
|
|
||||||
const {query, params} = getSearchQuery(attrFilters, searchText);
|
const {query, params} = getSearchQuery(attrFilters, searchText);
|
||||||
|
|
||||||
|
console.log(query, params);
|
||||||
|
|
||||||
const noteIds = await sql.getColumn(query, params);
|
const noteIds = await sql.getColumn(query, params);
|
||||||
|
|
||||||
res.send(noteIds);
|
res.send(noteIds);
|
||||||
@ -152,7 +154,7 @@ function getSearchQuery(attrFilters, searchText) {
|
|||||||
searchParams.push(searchText); // two occurences in searchCondition
|
searchParams.push(searchText); // two occurences in searchCondition
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = `SELECT notes.noteId FROM notes
|
const query = `SELECT DISTINCT notes.noteId FROM notes
|
||||||
${joins.join('\r\n')}
|
${joins.join('\r\n')}
|
||||||
WHERE
|
WHERE
|
||||||
notes.isDeleted = 0
|
notes.isDeleted = 0
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
const build = require('./build');
|
const build = require('./build');
|
||||||
const packageJson = require('../../package');
|
const packageJson = require('../../package');
|
||||||
|
|
||||||
const APP_DB_VERSION = 71;
|
const APP_DB_VERSION = 72;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
app_version: packageJson.version,
|
app_version: packageJson.version,
|
||||||
|
@ -394,8 +394,7 @@
|
|||||||
<td>
|
<td>
|
||||||
<!-- Change to valueUpdate: blur is necessary because jQuery UI autocomplete hijacks change event -->
|
<!-- Change to valueUpdate: blur is necessary because jQuery UI autocomplete hijacks change event -->
|
||||||
<input type="text" class="attribute-name" data-bind="value: name, valueUpdate: 'blur', event: { blur: $parent.attributeChanged }"/>
|
<input type="text" class="attribute-name" data-bind="value: name, valueUpdate: 'blur', event: { blur: $parent.attributeChanged }"/>
|
||||||
|
<div style="color: yellowgreen" data-bind="if: $parent.isNotUnique($index())"><span class="glyphicon glyphicon-info-sign"></span> Duplicate attribute.</div>
|
||||||
<div style="color: red" data-bind="if: $parent.isNotUnique($index())">Attribute name must be unique per note.</div>
|
|
||||||
<div style="color: red" data-bind="if: $parent.isEmptyName($index())">Attribute name can't be empty.</div>
|
<div style="color: red" data-bind="if: $parent.isEmptyName($index())">Attribute name can't be empty.</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user