# HG changeset patch # User Marcin Kuzminski # Date 2011-11-13 00:16:12 # Node ID 7276b170ce8bc19c9e2af165131aad9a33c20371 # Parent e86191684f4b3e742d6826b151008ef25951ba1a #71 code-review - simple inline comments diff --git a/rhodecode/controllers/changeset.py b/rhodecode/controllers/changeset.py --- a/rhodecode/controllers/changeset.py +++ b/rhodecode/controllers/changeset.py @@ -98,13 +98,17 @@ class ChangesetController(BaseRepoContro c.cut_off = False # defines if cut off limit is reached c.comments = [] - + c.inline_comments = [] + c.inline_cnt = 0 # Iterate over ranges (default changeset view is always one changeset) for changeset in c.cs_ranges: c.comments.extend(ChangesetCommentsModel()\ .get_comments(c.rhodecode_db_repo.repo_id, changeset.raw_id)) - + inlines = ChangesetCommentsModel()\ + .get_inline_comments(c.rhodecode_db_repo.repo_id, + changeset.raw_id) + c.inline_comments.extend(inlines) c.changes[changeset.raw_id] = [] try: changeset_parent = changeset.parents[0] @@ -199,6 +203,11 @@ class ChangesetController(BaseRepoContro c.changes[changeset.raw_id].append(('removed', node, None, None, None, (0, 0))) + # count inline comments + for path, lines in c.inline_comments: + for comments in lines.values(): + c.inline_cnt += len(comments) + if len(c.cs_ranges) == 1: c.changeset = c.cs_ranges[0] c.changes = c.changes[c.changeset.raw_id] diff --git a/rhodecode/model/comment.py b/rhodecode/model/comment.py --- a/rhodecode/model/comment.py +++ b/rhodecode/model/comment.py @@ -49,18 +49,18 @@ class ChangesetCommentsModel(BaseModel): :param f_path: :param line_no: """ + if text: + comment = ChangesetComment() + comment.repo_id = repo_id + comment.user_id = user_id + comment.revision = revision + comment.text = text + comment.f_path = f_path + comment.line_no = line_no - comment = ChangesetComment() - comment.repo_id = repo_id - comment.user_id = user_id - comment.revision = revision - comment.text = text - comment.f_path = f_path - comment.line_no = line_no - - self.sa.add(comment) - self.sa.commit() - return comment + self.sa.add(comment) + self.sa.commit() + return comment def delete(self, comment_id): """ @@ -81,13 +81,13 @@ class ChangesetCommentsModel(BaseModel): .filter(ChangesetComment.line_no == None)\ .filter(ChangesetComment.f_path == None).all() - def get_comments_for_file(self, repo_id, f_path, raw_id): + def get_inline_comments(self, repo_id, revision): comments = self.sa.query(ChangesetComment)\ .filter(ChangesetComment.repo_id == repo_id)\ - .filter(ChangesetComment.commit_id == raw_id)\ - .filter(ChangesetComment.f_path == f_path).all() + .filter(ChangesetComment.revision == revision).all() + + paths = defaultdict(lambda:defaultdict(list)) - d = defaultdict(list) for co in comments: - d[co.line_no].append(co) - return d.items() + paths[co.f_path][co.line_no].append(co) + return paths.items() diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -1101,11 +1101,11 @@ class ChangesetComment(Base, BaseModel): comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True) repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False) revision = Column('revision', String(40), nullable=False) - line_no = Column('line_no', Integer(), nullable=True) - f_path = Column('f_path', String(1000), nullable=True) + line_no = Column('line_no', Unicode(10), nullable=True) + f_path = Column('f_path', Unicode(1000), nullable=True) user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False) - text = Column('text', String(25000), nullable=False) - modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) + text = Column('text', Unicode(25000), nullable=False) + modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now) author = relationship('User') repo = relationship('Repository') diff --git a/rhodecode/public/css/diff.css b/rhodecode/public/css/diff.css --- a/rhodecode/public/css/diff.css +++ b/rhodecode/public/css/diff.css @@ -117,4 +117,13 @@ cursor: pointer; .line{ padding:0; margin:0; -} \ No newline at end of file +} + +.line.highlight{ + background-color:#FFFFCC; + cursor: pointer; + background-image:url("../images/icons/comment_add.png"); + background-repeat:no-repeat; + background-position: right; + background-position: 100% 50%; +} diff --git a/rhodecode/public/css/style.css b/rhodecode/public/css/style.css --- a/rhodecode/public/css/style.css +++ b/rhodecode/public/css/style.css @@ -1853,20 +1853,24 @@ h3.files_location { .cs_files .changes { float: right; + color:#003367; + } .cs_files .changes .added { background-color: #BBFFBB; float: left; text-align: center; - font-size: 90%; + font-size: 9px; + padding: 2px 0px 2px 0px; } .cs_files .changes .deleted { background-color: #FF8888; float: left; text-align: center; - font-size: 90%; + font-size: 9px; + padding: 2px 0px 2px 0px; } .cs_files .cs_added { @@ -3270,7 +3274,10 @@ div.rst-block pre { .comments .comments-number{ padding:0px 0px 10px 0px; font-weight: bold; -} + color: #666; + font-size: 16px; +} +/** comment form **/ .comment-form .clearfix{ background: #EEE; @@ -3332,3 +3339,59 @@ form.comment-form { position: absolute; right:40px; } + + + +/** comment inline form **/ + +.comment-inline-form .clearfix{ + background: #EEE; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + padding: 5px; +} + +div.comment-inline-form { + margin-top: 5px; + padding:2px 6px 8px 6px; +} + +.comment-inline-form strong { + display: block; + margin-bottom: 15px; +} + +.comment-inline-form textarea { + width: 100%; + height: 100px; + font-family: 'Monaco', 'Courier', 'Courier New', monospace; +} + +form.comment-inline-form { + margin-top: 10px; + margin-left: 10px; +} + +.comment-inline-form-submit { + margin-top: 5px; + margin-left: 525px; +} + +.file-comments { + display: none; +} + +.comment-inline-form .comment { + margin-left: 10px; +} + +.comment-inline-form .comment-help{ + padding: 0px 0px 2px 0px; + color: #666666; + font-size: 10px; +} + +.comment-inline-form .comment-button{ + padding-top:5px; +} \ No newline at end of file diff --git a/rhodecode/public/js/rhodecode.js b/rhodecode/public/js/rhodecode.js --- a/rhodecode/public/js/rhodecode.js +++ b/rhodecode/public/js/rhodecode.js @@ -298,3 +298,41 @@ var ajaxPOST = function(url,postData,suc var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); }; + +/** comments **/ +var removeInlineForm = function(form) { + form.parentNode.removeChild(form); +} + +var createInlineForm = function(parent_tr, f_path, line) { + var form = document.createElement('tr'); + YUD.addClass(form, 'comment-form-inline'); + var tmpl = YUD.get('comment-inline-form-template').innerHTML; + tmpl = tmpl.format(f_path, line); + form.innerHTML = ''+ + ''+ + '{0}'.format(tmpl); + + // create event for hide button + form = new YAHOO.util.Element(form); + var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]); + form_hide_button.on('click', function(e) { + var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode; + removeInlineForm(newtr); + YUD.removeClass(parent_tr, 'form-open'); + }); + return form +} +var getLineNo = function(tr) { + var line; + var o = tr.children[0].id.split('_'); + var n = tr.children[1].id.split('_'); + + if (n.length == 2) { + line = n[1]; + } else if (o.length == 2) { + line = o[1]; + } + + return line +} \ No newline at end of file diff --git a/rhodecode/templates/changeset/changeset.html b/rhodecode/templates/changeset/changeset.html --- a/rhodecode/templates/changeset/changeset.html +++ b/rhodecode/templates/changeset/changeset.html @@ -114,38 +114,52 @@ ${h.link_to_if(change!='removed',h.safe_unicode(filenode.path),h.url('files_home',repo_name=c.repo_name, revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))} - %if 1: » ${h.link_to(_('diff'), h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff'))} » ${h.link_to(_('raw diff'), h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw'))} » ${h.link_to(_('download diff'), h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download'))} - %endif -
- %if diff: - ${diff|n} - %else: - ${_('No changes in this file')} - %endif +
+
+ %if diff: + ${diff|n} + %else: + ${_('No changes in this file')} + %endif
%endif %endfor <%namespace name="comment" file="/changeset/changeset_file_comment.html"/> + ## template for inline comment form + ${comment.comment_inline_form()}
-
${len(c.comments)} comment(s)
+
${len(c.comments)} comment(s) (${c.inline_cnt} ${_('inline')})
+ + %for path, lines in c.inline_comments: +
+ % for line,comments in lines.iteritems(): +
+ %for co in comments: + ${comment.comment_block(co)} + %endfor +
+ %endfor +
+ %endfor + %for co in c.comments: ${comment.comment_block(co)} %endfor %if c.rhodecode_user.username != 'default':
${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=c.changeset.raw_id))} - Leave a comment + ${_('Leave a comment')}
${_('Comments parsed using RST syntax')}
${h.textarea('text')} @@ -167,7 +181,34 @@ n.parentNode.removeChild(n); } ajaxPOST(url,postData,success); - } + } + + YUE.onDOMReady(function(){ + YUE.on(YUQ('.line'),'mouseenter',function(e){ + var tr = e.currentTarget; + if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context')){ + return + } + YUD.addClass(tr,'highlight'); + }); + YUE.on(YUQ('.line'),'mouseleave',function(e){ + YUD.removeClass(e.currentTarget,'highlight'); + }); + + YUE.on(YUQ('.line'),'click',function(e){ + var tr = e.currentTarget; + if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context')){ + return + } + YUD.addClass(tr,'form-open'); + var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0]; + var f_path = YUD.getAttribute(node,'path'); + var lineno = getLineNo(tr); + var form = createInlineForm(tr, f_path, lineno); + YUD.insertAfter(form,tr); + }) + }) +
diff --git a/rhodecode/templates/changeset/changeset_file_comment.html b/rhodecode/templates/changeset/changeset_file_comment.html --- a/rhodecode/templates/changeset/changeset_file_comment.html +++ b/rhodecode/templates/changeset/changeset_file_comment.html @@ -13,7 +13,7 @@ ${h.short_id(co.revision)} %if co.f_path: ${_(' in file ')} - ${co.f_path}:L${co.line_no} + ${co.f_path}:L ${co.line_no} %endif ${h.age(co.modified_at)} @@ -28,4 +28,25 @@ ${h.rst(co.text)|n}
+ + + + +<%def name="comment_inline_form()"> + \ No newline at end of file