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 = '