Add groups of tags to selected collections in Meteor.
The package defines helpers that allow you to add groups of tags to documents in your collections.
meteor add patrickleet:tags
To add tags to selected collection use the Tags.TagsMixin
routine:
MyCollection = new Meteor.Collection("myCollection");
Tags.TagsMixin(MyCollection);
You can now do stuff like this:
MyCollection.addTag('tagName', selector);
MyCollection.addTag('tagName', 'tagGroup', selector);
MyCollection.removeTag('tagName', selector);
MyCollection.removeTag('tagName', 'tagGroup', selector);
By default the above actions are not allowed. To change this behavior you will need to allow actions on tags:
MyCollection.allowTags(function (userId) {
// only allow if user is logged in
return !!userId;
});
To search for all documents with a given tag use:
MyCollection.find({tags:'tagName'});
To search for all documents with a given tag in a group use:
MyCollection.find({tagGroupTags:'tagName'});
Tags are stored as an array on the documents specified by the selector. If you use a tagGroup the group is prefixed by the tagGroup name and also stored on the documents. That means getting the tags for a particular document is as simple as:
MyCollection.addTag('so tag', {_id: 1});
MyCollection.addTag('much meta', {_id: 1});
MyCollection.findOne({_id: 1}).tags; // ['so tag', 'much meta']
MyCollection.addTag('Chelsea', 'neighborhood', {_id: 1});
MyCollection.findOne({_id: 1}).neighborhoodTags; // ['Chelsea']
To see all tagGroups on a document
MyCollection.findOne().tagGroups
This may be useful to loop through and check all of the tag properties of the document
var myDoc = MyCollection.findOne({_id: 1});
_.each(myDoc.tagGroups, function(groupName) {
console.log(myDoc[groupName+'Tags']);
});
Buildings = new Meteor.Collection('buildings');
Tags.TagsMixin(Buildings);
Buildings.allowTags(function (userId) { return true; });
mansionId = Buildings.insert({ name: 'My downtown mansion', type: 'mansion' });
Buildings.addTag('humble', { _id: mansionId });
Buildings.addTag('mansion', { _id: mansionId });
Buildings.addTag('leaks', 'roof', { _id: mansionId });
Buildings.addTag('asbestos', 'roof', { _id: mansionId });
mansion = Buildings.findOne({ _id: mansionId });
mansion.tags; // => [ 'humble', 'mansion' ]
mansion.roofTags; // => [ 'leaks', 'asbestos' ]
mansion.tagGroups; // => [ 'roof' ]
mansion;
// mansion => {
// _id: '6PGs97ZgXigkN44uy',
// name: 'My downtown mansion',
// type: 'mansion',
// tags: [ 'humble', 'mansion' ],
// roofTags: [ 'leaks', 'asbestos' ],
// tagGroups: [ 'roof' ]
// }
lodash.each(mansion.tagGroups, function(groupName) {
console.log( groupName, ':', mansion[groupName+'Tags'] );
});
// console => roof : [ 'leaks', 'asbestos' ]
console.log( 'tags', ':', mansion['tags'] );
// console => tags : [ 'humble', 'mansion' ]
Additionally, you have a read only access to Meteor.tags
collection that keeps record about all tags existing in your database. The records are documents consisting of the following fields:
{
collection : // name of the corresponding collection
createdAt : // the date, this tag was first used
createdBy : // userId
nRefs : // number of references
name : // name of this tag
group : // name of tag group
}
The package is very lightweight, and does not include any UI, as many JQuery plugins work very well already. Here is an example of a UI using selectize: https://gist.github.com/patrickleet/e1c7a05eca86f536e3d4