mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	autocomplete for attribute values, closes #31
This commit is contained in:
		| @@ -106,13 +106,13 @@ const attributesDialog = (function() { | |||||||
|     async function showDialog() { |     async function showDialog() { | ||||||
|         glob.activeDialog = dialogEl; |         glob.activeDialog = dialogEl; | ||||||
|  |  | ||||||
|  |         await attributesModel.loadAttributes(); | ||||||
|  |  | ||||||
|         dialogEl.dialog({ |         dialogEl.dialog({ | ||||||
|             modal: true, |             modal: true, | ||||||
|             width: 800, |             width: 800, | ||||||
|             height: 500 |             height: 500 | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         attributesModel.loadAttributes(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $(document).bind('keydown', 'alt+a', e => { |     $(document).bind('keydown', 'alt+a', e => { | ||||||
| @@ -123,7 +123,8 @@ const attributesDialog = (function() { | |||||||
|  |  | ||||||
|     ko.applyBindings(attributesModel, document.getElementById('attributes-dialog')); |     ko.applyBindings(attributesModel, document.getElementById('attributes-dialog')); | ||||||
|  |  | ||||||
|     $(document).on('focus', '.attribute-name:not(.ui-autocomplete-input)', function (e) { |     $(document).on('focus', '.attribute-name', function (e) { | ||||||
|  |         if (!$(this).hasClass("ui-autocomplete-input")) { | ||||||
|             $(this).autocomplete({ |             $(this).autocomplete({ | ||||||
|                 // shouldn't be required and autocomplete should just accept array of strings, but that fails |                 // shouldn't be required and autocomplete should just accept array of strings, but that fails | ||||||
|                 // because we have overriden filter() function in init.js |                 // because we have overriden filter() function in init.js | ||||||
| @@ -135,6 +136,37 @@ const attributesDialog = (function() { | |||||||
|                 }), |                 }), | ||||||
|                 minLength: 0 |                 minLength: 0 | ||||||
|             }); |             }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $(this).autocomplete("search", $(this).val()); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $(document).on('focus', '.attribute-value', async function (e) { | ||||||
|  |         if (!$(this).hasClass("ui-autocomplete-input")) { | ||||||
|  |             const attributeName = $(this).parent().parent().find('.attribute-name').val(); | ||||||
|  |  | ||||||
|  |             if (attributeName.trim() === "") { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             const attributeValues = await server.get('attributes/values/' + encodeURIComponent(attributeName)); | ||||||
|  |  | ||||||
|  |             if (attributeValues.length === 0) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $(this).autocomplete({ | ||||||
|  |                 // shouldn't be required and autocomplete should just accept array of strings, but that fails | ||||||
|  |                 // because we have overriden filter() function in init.js | ||||||
|  |                 source: attributeValues.map(attr => { | ||||||
|  |                     return { | ||||||
|  |                         label: attr, | ||||||
|  |                         value: attr | ||||||
|  |                     } | ||||||
|  |                 }), | ||||||
|  |                 minLength: 0 | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         $(this).autocomplete("search", $(this).val()); |         $(this).autocomplete("search", $(this).val()); | ||||||
|     }); |     }); | ||||||
|   | |||||||
| @@ -47,8 +47,6 @@ router.put('/notes/:noteId/attributes', auth.checkApiAuth, wrap(async (req, res, | |||||||
| })); | })); | ||||||
|  |  | ||||||
| router.get('/attributes/names', auth.checkApiAuth, wrap(async (req, res, next) => { | router.get('/attributes/names', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||||
|     const noteId = req.params.noteId; |  | ||||||
|  |  | ||||||
|     const names = await sql.getColumn("SELECT DISTINCT name FROM attributes"); |     const names = await sql.getColumn("SELECT DISTINCT name FROM attributes"); | ||||||
|  |  | ||||||
|     for (const attr of attributes.BUILTIN_ATTRIBUTES) { |     for (const attr of attributes.BUILTIN_ATTRIBUTES) { | ||||||
| @@ -62,4 +60,12 @@ router.get('/attributes/names', auth.checkApiAuth, wrap(async (req, res, next) = | |||||||
|     res.send(names); |     res.send(names); | ||||||
| })); | })); | ||||||
|  |  | ||||||
|  | router.get('/attributes/values/:attributeName', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||||
|  |     const attributeName = req.params.attributeName; | ||||||
|  |  | ||||||
|  |     const values = await sql.getColumn("SELECT DISTINCT value FROM attributes WHERE name = ? ORDER BY value", [attributeName]); | ||||||
|  |  | ||||||
|  |     res.send(values); | ||||||
|  | })); | ||||||
|  |  | ||||||
| module.exports = router; | module.exports = router; | ||||||
| @@ -406,7 +406,7 @@ | |||||||
|                 <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> | ||||||
|                 <input type="text" data-bind="value: value, event: { change: $parent.attributeChanged }" style="width: 300px"/> |                 <input type="text" class="attribute-value" data-bind="value: value, event: { change: $parent.attributeChanged }" style="width: 300px"/> | ||||||
|               </td> |               </td> | ||||||
|             </tr> |             </tr> | ||||||
|           </tbody> |           </tbody> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user