Commit 1355ede4 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Wipe wall notes feature

Signed-off-by: default avatarDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
parent a5cbb4cb
......@@ -33,6 +33,7 @@ v 7.0.0
- Overall performance improvements
- Skip init script check on omnibus-gitlab
- Be more selective when killing stray Sidekiqs
- Remove wall feature (no data loss - you can take it from database)
v 6.9.2
- Revert the commit that broke the LDAP user filter
......
......@@ -34,8 +34,6 @@ class Dispatcher
new Activities()
when 'projects:new', 'projects:edit'
new Project()
when 'projects:walls:show'
new Wall(project_id)
when 'projects:teams:members:index'
new TeamMembers()
when 'groups:members'
......
class Wall
constructor: (project_id) ->
@project_id = project_id
@note_ids = []
@getContent()
@initRefresh()
@initForm()
#
# Gets an initial set of notes.
#
getContent: ->
Api.notes @project_id, (notes) =>
$.each notes, (i, note) =>
# render note if it not present in loaded list
# or skip if rendered
if $.inArray(note.id, @note_ids) == -1
@note_ids.push(note.id)
@renderNote(note)
@scrollDown()
$("abbr.timeago").timeago()
initRefresh: ->
setInterval =>
@refresh()
, 10000
refresh: ->
@getContent()
scrollDown: ->
notes = $('ul.notes')
$('body, html').scrollTop(notes.height())
initForm: ->
form = $('.wall-note-form')
form.find("#target_type").val('wall')
form.on 'ajax:success', =>
@refresh()
form.find(".js-note-text").val("").trigger("input")
form.on 'ajax:complete', ->
form.find(".js-comment-button").removeAttr('disabled')
form.find(".js-comment-button").removeClass('disabled')
form.on "click", ".js-choose-note-attachment-button", ->
form.find(".js-note-attachment-input").click()
form.on "change", ".js-note-attachment-input", ->
filename = $(this).val().replace(/^.*[\\\/]/, '')
form.find(".js-attachment-filename").text(filename)
form.find('.note_text').keydown (e) ->
if e.ctrlKey && e.keyCode == 13
form.find('.js-comment-button').submit()
form.show()
renderNote: (note) ->
template = @noteTemplate()
template = template.replace('{{author_name}}', note.author.name)
template = template.replace(/{{created_at}}/g, note.created_at)
template = template.replace('{{text}}', simpleFormat(note.body))
if note.attachment
file = '<i class="icon-paper-clip"/><a href="' + gon.relative_url_root + '/files/note/' + note.id + '/' + note.attachment + '">' + note.attachment + '</a>'
else
file = ''
template = template.replace('{{file}}', file)
$('ul.notes').append(template)
noteTemplate: ->
return '<li>
<strong class="wall-author">{{author_name}}</strong>
<span class="wall-text">
{{text}}
<span class="wall-file">{{file}}</span>
</span>
<abbr class="timeago" title="{{created_at}}">{{created_at}}</abbr>
</li>'
@Wall = Wall
.wall-page {
.wall-note-form {
@extend .col-md-12;
margin: 0;
height: 140px;
background: #F9F9F9;
position: fixed;
bottom: 0px;
padding: 3px;
padding-bottom: 25px;
border: 1px solid #DDD;
}
.notes {
margin-bottom: 160px;
background: #FFE;
border: 1px solid #EED;
> li {
@extend .clearfix;
border-bottom: 1px solid #EED;
padding: 10px;
}
.wall-author {
color: #666;
float: left;
font-size: 12px;
width: 120px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.wall-text {
border-left: 1px solid #CCC;
margin-left: 10px;
padding-left: 10px;
float: left;
width: 75%;
}
.wall-file {
margin-left: 8px;
background: #EEE;
}
abbr {
float: right;
color: #AAA;
border: none;
}
}
}
class Projects::WallsController < Projects::ApplicationController
before_filter :module_enabled
respond_to :js, :html
def show
@note = @project.notes.new
respond_to do |format|
format.html
end
end
protected
def module_enabled
return render_404 unless @project.wall_enabled
end
end
......@@ -109,8 +109,6 @@ module EventsHelper
"#{event.note_target_type} ##{truncate event.note_target_iid}"
end
end
elsif event.wall_note?
link_to 'wall', project_wall_path(event.project)
else
content_tag :strong do
"(deleted)"
......
......@@ -139,7 +139,7 @@ module ProjectsHelper
nav_tabs << :settings
end
[:issues, :wiki, :wall, :snippets].each do |feature|
[:issues, :wiki, :snippets].each do |feature|
nav_tabs << feature if project.send :"#{feature}_enabled"
end
......
......@@ -61,7 +61,6 @@ module SearchHelper
{ label: "#{prefix} - Milestones", url: project_milestones_path(@project) },
{ label: "#{prefix} - Snippets", url: project_snippets_path(@project) },
{ label: "#{prefix} - Team", url: project_team_index_path(@project) },
{ label: "#{prefix} - Wall", url: project_wall_path(@project) },
{ label: "#{prefix} - Wiki", url: project_wikis_path(@project) },
]
else
......
......@@ -32,14 +32,5 @@ module Emails
cc: recipient(recipient_id),
subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
def note_wall_email(recipient_id, note_id)
@note = Note.find(note_id)
@project = @note.project
@target_url = project_wall_url(@note.project, anchor: "note_#{@note.id}")
mail(from: sender(@note.author_id),
cc: recipient(recipient_id),
subject: subject("Note on wall"))
end
end
end
......@@ -286,10 +286,6 @@ class Event < ActiveRecord::Base
end.to_s
end
def wall_note?
target.noteable_type.blank?
end
def note_target_type
if target.noteable_type.present?
target.noteable_type.titleize
......
......@@ -251,10 +251,6 @@ class Note < ActiveRecord::Base
for_merge_request? && for_diff_line?
end
def for_wall?
noteable_type.blank?
end
# override to return commits, which are not active record
def noteable
if for_commit?
......@@ -295,8 +291,6 @@ class Note < ActiveRecord::Base
def noteable_type_name
if noteable_type.present?
noteable_type.downcase
else
"wall"
end
end
......
......@@ -31,7 +31,6 @@ class Project < ActiveRecord::Base
default_value_for :archived, false
default_value_for :issues_enabled, true
default_value_for :wall_enabled, true
default_value_for :merge_requests_enabled, true
default_value_for :wiki_enabled, true
default_value_for :snippets_enabled, true
......@@ -39,7 +38,7 @@ class Project < ActiveRecord::Base
ActsAsTaggableOn.strict_case_match = true
attr_accessible :name, :path, :description, :issues_tracker, :label_list,
:issues_enabled, :wall_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id,
:issues_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id,
:wiki_enabled, :visibility_level, :import_url, :last_activity_at, as: [:default, :admin]
attr_accessible :namespace_id, :creator_id, as: :admin
......@@ -98,7 +97,7 @@ class Project < ActiveRecord::Base
exclusion: { in: Gitlab::Blacklist.path },
format: { with: Gitlab::Regex.path_regex,
message: "only letters, digits & '_' '-' '.' allowed. Letter or digit should be first" }
validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
validates :issues_enabled, :merge_requests_enabled,
:wiki_enabled, inclusion: { in: [true, false] }
validates :issues_tracker_id, length: { maximum: 255 }, allow_blank: true
validates :namespace, presence: true
......
......@@ -3,12 +3,9 @@ class NoteObserver < BaseObserver
notification.new_note(note)
# Skip system notes, like status changes and cross-references.
# Skip wall notes to prevent spamming of dashboard
if note.noteable_type.present? && !note.system
unless note.system
event_service.leave_note(note, note.author)
end
unless note.system?
# Create a cross-reference note if this Note contains GFM that names an
# issue, merge request, or commit.
note.references.each do |mentioned|
......
......@@ -106,7 +106,6 @@ class NotificationService
# TODO: split on methods and refactor
#
def new_note(note)
# ignore wall messages
return true unless note.noteable_type.present?
# ignore gitlab service messages
......
......@@ -19,7 +19,6 @@ module Projects
default_opts = {
issues_enabled: default_features.issues,
wiki_enabled: default_features.wiki,
wall_enabled: default_features.wall,
snippets_enabled: default_features.snippets,
merge_requests_enabled: default_features.merge_requests,
visibility_level: default_features.visibility_level
......
......@@ -36,10 +36,6 @@
= nav_link(controller: :wikis) do
= link_to 'Wiki', project_wiki_path(@project, :home)
- if project_nav_tab? :wall
= nav_link(controller: :walls) do
= link_to 'Wall', project_wall_path(@project)
- if project_nav_tab? :snippets
= nav_link(controller: :snippets) do
= link_to 'Snippets', project_snippets_path(@project)
......
New message on the project wall <%= @note.project %>
<%= url_for(project_wall_url(@note.project, anchor: "note_#{@note.id}")) %>
<%= @note.author_name %>
<%= @note.note %>
......@@ -73,13 +73,6 @@
= f.check_box :wiki_enabled
%span.descr Pages for project documentation
.form-group
= f.label :wall_enabled, "Wall", class: 'control-label'
.col-sm-10
.checkbox
= f.check_box :wall_enabled
%span.descr Simple chat system for broadcasting inside project
.form-group
= f.label :snippets_enabled, "Snippets", class: 'control-label'
.col-sm-10
......
%div.wall-page
%ul.notes
- if can? current_user, :write_note, @project
.note-form-holder
= form_for [@project, @note], remote: true, html: { multipart: true, id: nil, class: "new_note wall-note-form" }, authenticity_token: true do |f|
= note_target_fields
.note_text_and_preview
= f.text_area :note, size: 255, class: 'note_text js-note-text js-gfm-input turn-on'
.note-form-actions
.buttons
= f.submit 'Add Comment', class: "btn comment-btn btn-grouped js-comment-button"
.note-form-option
%a.choose-btn.btn.btn-small.js-choose-note-attachment-button
%i.icon-paper-clip
%span Choose File ...
&nbsp;
%span.file_name.js-attachment-filename File name...
= f.file_field :attachment, class: "js-note-attachment-input hidden"
.hint.pull-right CTRL + Enter to send message
.clearfix
......@@ -73,7 +73,6 @@ production: &base
issues: true
merge_requests: true
wiki: true
wall: false
snippets: false
visibility_level: "private" # can be "private" | "internal" | "public"
......
......@@ -95,7 +95,6 @@ Settings.gitlab['default_projects_features'] ||= {}
Settings.gitlab.default_projects_features['issues'] = true if Settings.gitlab.default_projects_features['issues'].nil?
Settings.gitlab.default_projects_features['merge_requests'] = true if Settings.gitlab.default_projects_features['merge_requests'].nil?
Settings.gitlab.default_projects_features['wiki'] = true if Settings.gitlab.default_projects_features['wiki'].nil?
Settings.gitlab.default_projects_features['wall'] = false if Settings.gitlab.default_projects_features['wall'].nil?
Settings.gitlab.default_projects_features['snippets'] = false if Settings.gitlab.default_projects_features['snippets'].nil?
Settings.gitlab.default_projects_features['visibility_level'] = Settings.send(:verify_constant, Gitlab::VisibilityLevel, Settings.gitlab.default_projects_features['visibility_level'], Gitlab::VisibilityLevel::PRIVATE)
Settings.gitlab['repository_downloads_path'] = File.absolute_path(Settings.gitlab['repository_downloads_path'] || 'tmp/repositories', Rails.root)
......
......@@ -209,12 +209,6 @@ Gitlab::Application.routes.draw do
end
end
resource :wall, only: [:show], constraints: {id: /\d+/} do
member do
get 'notes'
end
end
resource :repository, only: [:show] do
member do
get "stats"
......
# Notes
Notes can be wall notes or comments on snippets, issues or merge requests.
## Wall
### List project wall notes
Get a list of project wall notes.
```
GET /projects/:id/notes
```
Parameters:
+ `id` (required) - The ID of a project
```json
[
{
"id": 522,
"body": "The solution is rather tricky",
"attachment": null,
"author": {
"id": 1,
"username": "john_smith",
"email": "john@example.com",
"name": "John Smith",
"state": "active",
"created_at": "2012-05-23T08:00:58Z"
},
"created_at": "2012-11-27T19:16:44Z"
}
]
```
### Get single wall note
Returns a single wall note.
```
GET /projects/:id/notes/:note_id
```
Parameters:
+ `id` (required) - The ID of a project
+ `note_id` (required) - The ID of a wall note
### Create new wall note
Creates a new wall note.
```
POST /projects/:id/notes
```
Parameters:
+ `id` (required) - The ID of a project
+ `body` (required) - The content of a note
Notes are comments on snippets, issues or merge requests.
## Issues
......
......@@ -30,7 +30,6 @@ GET /projects
"path_with_namespace": "diaspora/diaspora-client",
"issues_enabled": true,
"merge_requests_enabled": true,
"wall_enabled": false,
"wiki_enabled": true,
"snippets_enabled": false,
"created_at": "2013-09-30T13: 46: 02Z",
......@@ -66,7 +65,6 @@ GET /projects
"path_with_namespace": "brightbox/puppet",
"issues_enabled": true,
"merge_requests_enabled": true,
"wall_enabled": false,
"wiki_enabled": true,
"snippets_enabled": false,
"created_at": "2013-09-30T13:46:02Z",
......@@ -136,7 +134,6 @@ Parameters:
"path_with_namespace": "diaspora/diaspora-project-site",
"issues_enabled": true,
"merge_requests_enabled": true,
"wall_enabled": false,
"wiki_enabled": true,
"snippets_enabled": false,
"created_at": "2013-09-30T13: 46: 02Z",
......@@ -252,7 +249,6 @@ Parameters:
+ `namespace_id` (optional) - namespace for the new project (defaults to user)
+ `description` (optional) - short project description
+ `issues_enabled` (optional)
+ `wall_enabled` (optional)
+ `merge_requests_enabled` (optional)
+ `wiki_enabled` (optional)
+ `snippets_enabled` (optional)
......@@ -276,7 +272,6 @@ Parameters:
+ `description` (optional) - short project description
+ `default_branch` (optional) - 'master' by default
+ `issues_enabled` (optional)
+ `wall_enabled` (optional)
+ `merge_requests_enabled` (optional)
+ `wiki_enabled` (optional)
+ `snippets_enabled` (optional)
......
......@@ -48,7 +48,6 @@ You can use GFM in
- commit messages
- comments
- wall posts
- issues
- merge requests
- milestones
......
......@@ -13,7 +13,6 @@ If a user is a GitLab administrator they receive all permissions.
|---------------------------------------|---------|------------|-------------|----------|--------|
| Create new issue | ✓ | ✓ | ✓ | ✓ | ✓ |
| Leave comments | ✓ | ✓ | ✓ | ✓ | ✓ |
| Write on project wall | ✓ | ✓ | ✓ | ✓ | ✓ |
| Pull project code | | ✓ | ✓ | ✓ | ✓ |
| Download project | | ✓ | ✓ | ✓ | ✓ |
| Create code snippets | | ✓ | ✓ | ✓ | ✓ |
......
......@@ -26,12 +26,6 @@ This is a separate system for documentation, built right into GitLab.
It is source controlled and is very convenient if you don't want to keep you documentation in your source code, but you do want to keep it in your GitLab project.
## Wall
For simple, project specific conversations, the wall can be used.
It's very lightweight and simple and works well if you're not interested in using issues, but still want to occasionally communicate within a project.
## Snippets
Snippets are little bits of code or text.
......
......@@ -48,7 +48,7 @@ module API
expose :owner, using: Entities::UserBasic, unless: ->(project, options) { project.group }
expose :name, :name_with_namespace
expose :path, :path_with_namespace
expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at
expose :issues_enabled, :merge_requests_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at
expose :namespace
expose :forked_from_project, using: Entities::ForkedFromProject, :if => lambda{ | project, options | project.forked? }
end
......
......@@ -6,55 +6,6 @@ module API
NOTEABLE_TYPES = [Issue, MergeRequest, Snippet]
resource :projects do
# Get a list of project wall notes
#
# Parameters:
# id (required) - The ID of a project
# Example Request:
# GET /projects/:id/notes
get ":id/notes" do
@notes = user_project.notes.common
# Get recent notes if recent = true
@notes = @notes.order('id DESC') if params[:recent]
present paginate(@notes), with: Entities::Note
end
# Get a single project wall note
#
# Parameters:
# id (required) - The ID of a project
# note_id (required) - The ID of a note
# Example Request:
# GET /projects/:id/notes/:note_id
get ":id/notes/:note_id" do
@note = user_project.notes.common.find(params[:note_id])
present @note, with: Entities::Note
end
# Create a new project wall note
#
# Parameters:
# id (required) - The ID of a project
# body (required) - The content of a note
# Example Request:
# POST /projects/:id/notes
post ":id/notes" do
required_attributes! [:body]
@note = user_project.notes.new(note: params[:body])
@note.author = current_user
if @note.save
present @note, with: Entities::Note
else
# :note is exposed as :body, but :note is set on error
bad_request!(:note) if @note.errors[:note].any?
not_found!
end
end
NOTEABLE_TYPES.each do |noteable_type|
noteables_str = noteable_type.to_s.underscore.pluralize
noteable_id_str = "#{noteable_type.to_s.underscore}_id"
......
......@@ -71,7 +71,6 @@ module API
# name (required) - name for new project
# description (optional) - short project description
# issues_enabled (optional)
# wall_enabled (optional)
# merge_requests_enabled (optional)
# wiki_enabled (optional)
# snippets_enabled (optional)
......@@ -86,7 +85,6 @@ module API
:path,
:description,
:issues_enabled,
:wall_enabled,
:merge_requests_enabled,
:wiki_enabled,
:snippets_enabled,
......@@ -114,7 +112,6 @@ module API
# description (optional) - short project description
# default_branch (optional) - 'master' by default
# issues_enabled (optional)
# wall_enabled (optional)
# merge_requests_enabled (optional)
# wiki_enabled (optional)
# snippets_enabled (optional)
......@@ -129,7 +126,6 @@ module API
:description,
:default_branch,
:issues_enabled,
:wall_enabled,
:merge_requests_enabled,
:wiki_enabled,
:snippets_enabled,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment