Skip to content

Commit

Permalink
Merge branch 'main' of github.com:fastruby/points into ROAD-534-add-a…
Browse files Browse the repository at this point in the history
…pproved-attribute-to-stories
  • Loading branch information
arielj committed Oct 9, 2023
2 parents 740ea12 + 3c7786f commit 48cbbb2
Show file tree
Hide file tree
Showing 23 changed files with 381 additions and 19 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ gem "bootstrap-sass", "3.4.1"
# Use sqlite3 as the database for Active Record
# gem 'sqlite3'
# Use Puma as the app server
gem "puma", "~> 6.2"
gem "puma", "~> 6.3"
# Use SCSS for stylesheets
gem "sass-rails", "~> 5.0"
# Use Uglifier as compressor for JavaScript assets
Expand Down
6 changes: 3 additions & 3 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ GEM
newrelic_rpm (9.1.0)
next_rails (1.2.2)
colorize (>= 0.8.1)
nio4r (2.5.8)
nio4r (2.5.9)
nokogiri (1.14.3-arm64-darwin)
racc (~> 1.4)
nokogiri (1.14.3-x86_64-darwin)
Expand Down Expand Up @@ -238,7 +238,7 @@ GEM
ast (~> 2.4.1)
pg (1.4.6)
public_suffix (5.0.1)
puma (6.2.1)
puma (6.3.1)
nio4r (~> 2.0)
pundit (2.3.0)
activesupport (>= 3.0.0)
Expand Down Expand Up @@ -429,7 +429,7 @@ DEPENDENCIES
next_rails
ombu_labs-auth
pg
puma (~> 6.2)
puma (~> 6.3)
pundit (~> 2.2)
rack-mini-profiler
rails (~> 7.0.2)
Expand Down
2 changes: 1 addition & 1 deletion app/assets/javascripts/project.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ const filterStories = () => {
const storyTitle = element
.querySelector("td:first-child")
.innerText.toLowerCase();
if (storyTitle.includes(searchTerm)) {
if (storyTitle.includes(searchTerm) || element.id.replace(/\D/g, '').includes(searchTerm)) {
cl.remove("hidden");
} else {
cl.add("hidden");
Expand Down
43 changes: 39 additions & 4 deletions app/assets/stylesheets/stories.scss
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
word-break: break-all;
}

.story-description, .extra-info, .story_preview {
.story-description,
.extra-info,
.story_preview {
margin-bottom: 25px;
font-size: 15px;
p{
p {
margin-top: 1em;
}
em {
Expand Down Expand Up @@ -55,7 +57,6 @@
margin-bottom: 1.5em;
}


.modal p {
padding-bottom: 1.3em;
}
Expand Down Expand Up @@ -100,7 +101,8 @@
grid-area: extra-preview;
}

.extra_info_preview .content, .story_preview .content {
.extra_info_preview .content,
.story_preview .content {
overflow: auto;
max-height: min(50vh, 700px);
// prevent long links from overflowing
Expand Down Expand Up @@ -132,3 +134,36 @@
align-items: center;
gap: 1rem;
}

.comments-section {
margin: 16px 0;

.comment-card {
margin: 8px 0;

.bold {
font-weight: bold;
}

.link-blue {
color: blue;
}
}
}

.comment-form-container {
margin: 8px 0;
width: 50%;

.bold {
font-weight: bold;
}
}

#comment_body {
margin: 10px 0;
}

input.button.green {
width: auto;
}
59 changes: 59 additions & 0 deletions app/controllers/comments_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
class CommentsController < ApplicationController
before_action :authenticate_user!
before_action :load_story_and_project
before_action :find_comment, only: [:edit, :update, :destroy]

def edit
end

def create
@comment = current_user.comments.build(story: @story)
@comment.attributes = comment_params
saved = @comment.save
if saved
flash[:success] = "Comment created!"
else
flash[:error] = @comment.errors.full_messages
end

redirect_to project_story_path(@comment.story.project_id, @comment.story_id)
end

def update
updated = @comment.update(comment_params)
if updated
flash[:success] = "Comment updated!"
redirect_to project_story_path(@comment.story.project_id, @comment.story_id)
else
flash[:error] = @comment.errors.full_messages
render :edit
end
end

def destroy
@comment.destroy
flash[:success] = "Comment deleted!"
redirect_to project_story_path(@comment.story.project_id, @comment.story_id)
end

private

def find_comment
@comment = current_user.comments.where(story_id: params[:story_id]).find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:error] = "Comment not found"
redirect_to project_story_path(params[:project_id], params[:story_id])
end

def load_story_and_project
@project = Project.find(params[:project_id])
@story = Story.find(params[:story_id])
rescue ActiveRecord::RecordNotFound
flash[:error] = "Project or Story not found"
redirect_to projects_path
end

def comment_params
params.require(:comment).permit(:body)
end
end
25 changes: 20 additions & 5 deletions app/controllers/stories_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ def bulk_destroy

def show
@estimate = Estimate.find_by(story: @story, user: current_user)
@comments = @story.comments.includes(:user).order(:created_at)
@comment = Comment.new
end

def update
Expand Down Expand Up @@ -85,12 +87,25 @@ def import
end

def export
csv = CSV.generate(headers: true) { |csv|
csv << CSV_HEADERS
@project.stories.by_position.each do |story|
csv << story.attributes.slice(*CSV_HEADERS)
csv = if params[:export_with_comments] == "1"
CSV.generate(headers: true) do |csv|
csv << CSV_HEADERS + ["comment"]
@project.stories.includes(:comments).by_position.each do |story|
comments = []
story.comments.each do |comment|
comments << "#{comment.user.name}: #{comment.body}"
end
csv << [story.id, story.title, story.description, story.position] + comments
end
end
}
else
CSV.generate(headers: true) do |csv|
csv << CSV_HEADERS
@project.stories.by_position.each do |story|
csv << story.attributes.slice(*CSV_HEADERS)
end
end
end
filename = "#{@project.title.gsub(/[^\w]/, "_")}-#{Time.now.to_formatted_s(:short).tr(" ", "_")}.csv"
send_data csv, filename: filename
end
Expand Down
5 changes: 5 additions & 0 deletions app/models/comment.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Comment < ApplicationRecord
belongs_to :story
belongs_to :user
validates :body, presence: true
end
1 change: 1 addition & 0 deletions app/models/story.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ class Story < ApplicationRecord
belongs_to :project
has_many :estimates
has_many :users, through: :estimates
has_many :comments

before_create :add_position

Expand Down
1 change: 1 addition & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ class User < ApplicationRecord
include OmbuLabsAuthenticable

has_many :estimates
has_many :comments
end
7 changes: 7 additions & 0 deletions app/views/comments/_comment.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<div class="comment-card">
<p class="bold"><%= comment.user.name %>: <%= markdown(comment.body) %> <%= comment.created_at %><p>
<% if current_user == comment.user %>
<%= link_to "Edit Comment", edit_project_story_comment_path(project, story, comment), class: "link-blue" %> |
<%= link_to "Delete", project_story_comment_path(project, story, comment), method: :delete, data: { confirm: "Are you sure?" }, title: "Delete" %>
<% end %>
</div>
5 changes: 5 additions & 0 deletions app/views/comments/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<%= form_with model: [project, story, comment] do |form| %>
<%= form.text_area :body, rows: 6 %>
<%= form.submit class: "button green"%>
<%= link_to "Back", project_story_path(project, story), id: "back", class: "button" if ["edit", "update"].include?(action_name) %>
<% end %>
4 changes: 4 additions & 0 deletions app/views/comments/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<div class="container">
<h2 class="new-edit-title">Edit Comment</h2>
<%= render partial: "form", locals: {story: @story, comment: @comment, project: @project} %>
</div>
9 changes: 8 additions & 1 deletion app/views/projects/_import_export.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@
<h4 class="my-0 font-weight-normal">Export CSV</h4>
</div>
<div class="card-body">
<%= link_to 'Export', export_project_stories_path(@project), class: "button green" %>
<%= form_with url: export_project_stories_path(@project), method: :get do |f| %>
<%= f.submit "Export", class: "button green", data: { disable_with: false } %>
<br/>
<%= f.label :export_with_comments do %>
<%= f.check_box :export_with_comments %>
Export with comments
<% end %>
<% end %>
</div>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/views/projects/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<h1 class="dashboard-title"><%= render partial: "shared/project_title", locals: {allow_edit: true, project: @project} %></h1>

<div class="search-field">
<%= label_tag 'title_contains', "Filter by title" %>
<%= label_tag 'title_contains', "Filter by title or ID" %>
<%= search_field_tag 'title_contains', nil, onkeyup: "filterStories()" %>
</div>
</div>
Expand All @@ -29,7 +29,7 @@
<tr class="project-table__row project-table__row--story" id="<%= dom_id(story)%>" data-status="<%= story.status %>">
<td class="project-table__cell">
<input type="checkbox" name="stories[]" value="<%= story.id %>">
<%= link_to story.title, [story.project, story] %>
<%= link_to "#{story.id} - #{story.title}", [story.project, story] %>
<button class="copy-link btn-clipboard" data-clipboard-text="<%= project_story_url(@project, story) %>" title='Copy story'><i class="fa fa-link"></i><span class= "popup">Copied to clipboard</span></button>
</td>
<td class="project-table__cell status"><%= status_label(story) %></td>
Expand Down
14 changes: 13 additions & 1 deletion app/views/stories/show.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div class="container">
<h1 class="dashboard-title"><%= render "shared/project_title", project: @project %></h1>

<%= render "shared/story", story: @story %>
<%= render partial: "shared/story", locals: { story: @story } %>

<div class="btn-group">
<%= link_to 'Back', project_path(@project), id: "back", class: "button" %>
Expand All @@ -10,4 +10,16 @@
<%= link_to "Delete", project_story_path(@project.id, @story), method: :delete, data: { confirm: "Are you sure?", story_id: @story.id }, class: "button red", remote: true , title: "Delete" %>
<% end %>
</div>

<div class="comments-section">
<h4>Comments</h4>
<% @comments.each do |comment| %>
<%= render partial: "comments/comment", locals: { story: @story, project: @project, comment: comment } %>
<% end %>
</div>

<div class="comment-form-container">
<p class="bold">Add a new comment</p>
<%= render partial: "comments/form", locals: { story: @story, project: @project, comment: @comment } %>
</div>
</div>
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
get :export, on: :collection
resources :estimates, except: [:index, :show]
put :move
resources :comments, only: [:create, :edit, :update, :destroy]
end
resource :action_plan, only: [:show]
end
Expand Down
10 changes: 10 additions & 0 deletions db/migrate/20230908142819_create_comments.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class CreateComments < ActiveRecord::Migration[7.0]
def change
create_table :comments do |t|
t.text :body
t.integer :story_id
t.integer :user_id
t.timestamps
end
end
end
10 changes: 9 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,18 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.0].define(version: 2023_08_31_175732) do
ActiveRecord::Schema[7.0].define(version: 2023_09_08_142819) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"

create_table "comments", force: :cascade do |t|
t.text "body"
t.integer "story_id"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "estimates", force: :cascade do |t|
t.integer "best_case_points"
t.integer "worst_case_points"
Expand Down
Loading

0 comments on commit 48cbbb2

Please sign in to comment.