Commit 9265de3d authored by gitlabhq's avatar gitlabhq
Browse files

snippets are ready

parent 526ad466
$(document).ready(function(){
$("#snippets-table .snippet").live('click', function(e){
if(e.target.nodeName != "A" && e.target.nodeName != "INPUT") {
location.href = $(this).attr("url");
e.stopPropagation();
return false;
}
});
});
......@@ -22,8 +22,8 @@ td.linenos{
.highlight{
background:none;
padding:10px 0px 0px 0;
margin-left:10px;
padding:10px 0px 0px 10px;
margin-left:0px;
}
.highlight pre{
}
......@@ -43,7 +43,7 @@ td.linenos {
}
td.code .highlight {
overflow-x: scroll;
overflow: auto;
}
table.highlighttable pre{
padding:0;
......
......@@ -310,6 +310,7 @@ input.ssh_project_url {
}
#projects-list .project,
#snippets-table .snippet,
#issues-table .issue{
cursor:pointer;
......@@ -360,6 +361,8 @@ input.ssh_project_url {
.user_new,
.edit_user,
.new_project,
.new_snippet,
.edit_snippet,
.edit_project {
input[type='text'],
input[type='email'],
......
// Place all the styles related to the Snippets controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
......@@ -41,6 +41,8 @@ def notify
Notify.note_commit_email(u, @note).deliver
when "Issue" then
Notify.note_issue_email(u, @note).deliver
when "Snippet"
true
else
Notify.note_wall_email(u, @note).deliver
end
......
class SnippetsController < ApplicationController
before_filter :authenticate_user!
before_filter :project
# Authorize
before_filter :add_project_abilities
before_filter :authorize_read_snippet!
before_filter :authorize_write_snippet!, :only => [:new, :create, :close, :edit, :update, :sort]
respond_to :html
def index
@snippets = @project.snippets
end
def new
@snippet = @project.snippets.new
end
def create
@snippet = @project.snippets.new(params[:snippet])
@snippet.author = current_user
@snippet.save
if @snippet.valid?
redirect_to [@project, @snippet]
else
respond_with(@snippet)
end
end
def edit
@snippet = @project.snippets.find(params[:id])
end
def update
@snippet = @project.snippets.find(params[:id])
@snippet.update_attributes(params[:snippet])
if @snippet.valid?
redirect_to [@project, @snippet]
else
respond_with(@snippet)
end
end
def show
@snippet = @project.snippets.find(params[:id])
@notes = @snippet.notes
@note = @project.notes.new(:noteable => @snippet)
end
def destroy
@snippet = @project.snippets.find(params[:id])
authorize_admin_snippet! unless @snippet.author == current_user
@snippet.destroy
respond_to do |format|
format.js { render :nothing => true }
end
end
end
......@@ -53,7 +53,7 @@ def search_autocomplete_source
[projects, default_nav, project_nav].flatten.to_json
end
def handle_file_type(file_name, mime_type)
def handle_file_type(file_name, mime_type = nil)
if file_name =~ /(\.rb|\.ru|\.rake|Rakefile|\.gemspec|\.rbx|Gemfile)$/
:ruby
elsif file_name =~ /\.py$/
......
module SnippetsHelper
end
......@@ -12,6 +12,7 @@ def self.project_abilities(user, project)
rules << [
:read_project,
:read_issue,
:read_snippet,
:read_team_member,
:read_note
] if project.readers.include?(user)
......@@ -19,12 +20,14 @@ def self.project_abilities(user, project)
rules << [
:write_project,
:write_issue,
:write_snippet,
:write_note
] if project.writers.include?(user)
rules << [
:admin_project,
:admin_issue,
:admin_snippet,
:admin_team_member,
:admin_note
] if project.admins.include?(user)
......
......@@ -7,6 +7,7 @@ class Project < ActiveRecord::Base
has_many :users_projects, :dependent => :destroy
has_many :users, :through => :users_projects
has_many :notes, :dependent => :destroy
has_many :snippets, :dependent => :destroy
validates :name,
:uniqueness => true,
......
class Snippet < ActiveRecord::Base
belongs_to :project
belongs_to :author, :class_name => "User"
has_many :notes, :as => :noteable
attr_protected :author, :author_id, :project, :project_id
validates_presence_of :project_id
validates_presence_of :author_id
validates :title,
:presence => true,
:length => { :within => 0..255 }
validates :file_name,
:presence => true,
:length => { :within => 0..255 }
validates :content,
:presence => true,
:length => { :within => 0..10000 }
def self.content_types
[
".rb", ".py", ".pl", ".scala", ".c", ".cpp", ".java",
".haml", ".html", ".sass", ".scss", ".xml", ".php", ".erb",
".js", ".sh", ".coffee", ".yml", ".md"
]
end
end
= form_for(@project, :remote => true) do |f|
%div.form_content
- if @project.new_record?
%h1 New Project
- else
- unless @project.new_record?
%h1 Edit Project
- if @project.errors.any?
#error_explanation
......
......@@ -18,6 +18,11 @@
Wall
- if @project.common_notes.count > 0
%span{ :class => "top_menu_count" }= @project.common_notes.count
%span
= link_to project_snippets_path(@project), :class => (controller.controller_name == "snippets") ? "current" : nil do
Snippets
- if @project.snippets.count > 0
%span{ :class => "top_menu_count" }= @project.snippets.count
- if @commit
%span= link_to truncate(commit_name(@project,@commit), :length => 15), project_commit_path(@project, :id => @commit.id), :class => current_page?(:controller => "commits", :action => "show", :project_id => @project, :id => @commit.id) ? "current" : nil
......
%div
= form_for [@project, @snippet] do |f|
-if @snippet.errors.any?
%ul
- @snippet.errors.full_messages.each do |msg|
%li= msg
%table.round-borders
%tr
%td= f.label :title
%td= f.text_field :title, :placeholder => "Example Snippet"
%tr
%td= f.label :file_name
%td= f.text_field :file_name, :placeholder => "example.rb"
%tr
%td{:colspan => 2}
= f.label :content, "Code"
%br
= f.text_area :content, :style => "height:240px;width:932px;"
.actions.prepend-top
= f.submit 'Save', :class => "lbutton vm"
%tr{ :id => dom_id(snippet), :class => "snippet", :url => project_snippet_path(@project, snippet) }
%td
= image_tag gravatar_icon(snippet.author.email), :class => "left", :width => 40, :style => "padding:0 5px;"
= truncate snippet.author.name, :lenght => 20
%td= html_escape snippet.title
%td= html_escape snippet.file_name
%td
- if can?(current_user, :admin_snippet, @project) || snippet.author == current_user
= link_to 'Edit', edit_project_snippet_path(@project, snippet), :class => "lbutton positive"
- if can?(current_user, :admin_snippet, @project) || snippet.author == current_user
= link_to 'Destroy', [@project, snippet], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "lbutton delete-snippet negative", :id => "destroy_snippet_#{snippet.id}"
= render "snippets/form"
%div
- if can? current_user, :write_snippet, @project
.left= link_to 'New Snippet', new_project_snippet_path(@project), :class => "lbutton vm"
%table.round-borders#snippets-table
%tr
%th Author
%th Title
%th File name
%th
= render @snippets
:javascript
$('.delete-snippet').live('ajax:success', function() {
$(this).closest('tr').fadeOut(); });
= render "snippets/form"
%h2
= "Snippet ##{@snippet.id} - #{@snippet.title}"
.view_file
.view_file_header
%strong
= @snippet.file_name
%br/
.view_file_content
- ft = handle_file_type(@snippet.file_name)
:erb
<%= raw Albino.colorize(@snippet.content, ft, :html, 'utf-8', "linenos=True") %>
- if can?(current_user, :admin_snippet, @project) || @snippet.author == current_user
= link_to 'Edit', edit_project_snippet_path(@project, @snippet), :class => "lbutton positive"
- if can?(current_user, :admin_snippet, @project) || @snippet.author == current_user
= link_to 'Destroy', [@project, @snippet], :confirm => 'Are you sure?', :method => :delete, :class => "lbutton delete-snippet negative", :id => "destroy_snippet_#{@snippet.id}"
%br
.snippet_notes= render "notes/notes"
.clear
......@@ -38,6 +38,8 @@
}
end
resources :snippets
resources :commits
resources :team_members
resources :issues do
......
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