Confirmed users
1,198
edits
(tags_collapsed will be a param instead) |
|||
(17 intermediate revisions by the same user not shown) | |||
Line 27: | Line 27: | ||
** the list of tags shown by autocomplete will be sorted with the most frequently used tags sorted first | ** the list of tags shown by autocomplete will be sorted with the most frequently used tags sorted first | ||
** refreshes the list of current tags for the comment (via ajax) | ** refreshes the list of current tags for the comment (via ajax) | ||
* tags can not contain spaces, and have a limited range of valid characters - [\w\d\._-] | * tags can not contain spaces, and have a limited range of valid characters - [\w\d\._-] | ||
* min tag length: 3 character; max tag length: 24 characters | * min tag length: 3 character; max tag length: 24 characters | ||
* add a group which governs who can | * a comment cannot have more than 10 tags | ||
* group membership is required, just being able to edit a bug is not sufficient (ie. reporters without | * add a group bz_comment_taggers which governs who can tag comments, users with editbugs become members of this group by default | ||
* group membership is required, just being able to edit a bug is not sufficient (ie. reporters without bz_comment_taggers will not be able to add tags) | |||
* tags are visible to any account, except anon (ie. you must be logged in to bugzilla for the tags to show) | * tags are visible to any account, except anon (ie. you must be logged in to bugzilla for the tags to show) | ||
* anyone with | * anyone with bz_comment_taggers can add or remove tags without restriction | ||
* tags can only be added to a bug once, adding an existing tag is a no-op | * tags can only be added to a bug once, adding an existing tag is a no-op | ||
* tags which match Regexp::Common::RE_PROFANITY will not be allowed | * tags which match Regexp::Common::RE_PROFANITY will not be allowed | ||
Line 40: | Line 40: | ||
* tags are added and removed via ajax, changes are immediately visible to the changer without refreshing the page | * tags are added and removed via ajax, changes are immediately visible to the changer without refreshing the page | ||
* tags added by other users (or on other tabs) will not be visible without a page refresh, or clicking on the tag [icon] | * tags added by other users (or on other tabs) will not be visible without a page refresh, or clicking on the tag [icon] | ||
* tags changes are added to | * tags changes are added to longdescs_tags_activity | ||
* comment_tags_activity will be displayed merged with bug_activity on the bug's history page | |||
* some tags will result in the comment being collapsed by default when a page is initially displayed | * some tags will result in the comment being collapsed by default when a page is initially displayed | ||
** the list of tags this applies to is governed by an admin configured param | ** the list of tags this applies to is governed by an admin configured param | ||
Line 63: | Line 64: | ||
=== Schema === | === Schema === | ||
''tags'' will contain a comma separated list of tags. this approach will be faster. | |||
==== longdescs ==== | |||
add a new column to longdescs. | |||
==== | tags | varchar(255) | ||
==== longdescs_tags ==== | |||
quick lookup for autocomplete, updated when tags are added or removed from comments. the 'weight' is the count of instances of the tag; autocomplete will sort most frequently used tags first. | quick lookup for autocomplete, updated when tags are added or removed from comments. the 'weight' is the count of instances of the tag; autocomplete will sort most frequently used tags first. | ||
id | AUTOINC PK | |||
tag | VARCHAR(24) | |||
weight | INTEGER | |||
==== longdescs_tags_activity ==== | |||
history of comment tag changes. | |||
id | AUTOINC PK | |||
bug_id | FOREIGN KEY --> bugs.bug_id | |||
comment_id | FOREIGN KEY --> longdescs.comment_id | |||
who | FOREIGN KEY --> profiles.userid | |||
bug_when | DATETIME | |||
removed | VARCHAR(24) | |||
added | VARCHAR(24) | |||
=== WebService Methods === | |||
within the '''CommentTag''' class: | |||
'''search(substring):(tag[,tag..])''' | |||
params | |||
''substring'' | string, sub-string to search, min 2 characters | |||
returns | |||
an array of tags (strings) which contain the sub-string | |||
sorted by weight (most frequently used first) | |||
'''get(comment_id):(tag[,tag..])''' | |||
params | |||
''comment_id'' | int, longdescs.comment_id | |||
returns | |||
an array of tags (strings) applied to the comment, or an empty array | |||
sorted alphabetically | |||
'''add(comment_id, tag)''' | |||
params | |||
''comment_id'' | int, longdescs.comment_id | |||
''tag'' | string, tag to add | |||
returns | |||
an array of tags (strings) applied to the comment, or an empty array | |||
sorted alphabetically | |||
'''remove(comment_id, tag)''' | |||
params | |||
| | ''comment_id'' | int, longdescs.comment_id | ||
| tag | ''tag'' | string, tag to add | ||
returns | |||
an array of tags (strings) applied to the comment, or an empty array | |||
sorted alphabetically |