Hashtags Feature applied to Proposals #3959
Conversation
@decidim/lot-core I would appreciate a pre-review of this PR. |
@@ -0,0 +1,16 @@ | |||
# frozen_string_literal: true | |||
|
|||
class CreateDecidimHashtagggings < ActiveRecord::Migration[5.2] |
mrcasals
Aug 6, 2018
Contributor
Looks like there's an extra g
here
Looks like there's an extra g
here
description "hashtags list" | ||
|
||
interfaces [ | ||
-> { Decidim::Core::HashtagInterface } |
mrcasals
Aug 6, 2018
Contributor
Will this interface be used by other types? If it won't, then I suggest putting the fields definition directly to the type to reduce complexity.
Will this interface be used by other types? If it won't, then I suggest putting the fields definition directly to the type to reduce complexity.
t.references :decidim_hashtag, index: true | ||
t.references :decidim_hashtaggable, polymorphic: true, index: { name: "idx_hashtaggins_on_hashtaggable_type_and_hashtaggable_id" } | ||
end | ||
add_index :decidim_hashtaggings, %w(decidim_hashtaggable_id decidim_hashtaggable_type), |
mrcasals
Aug 6, 2018
Contributor
Isn't this a duplicate from the index in line 7?
Isn't this a duplicate from the index in line 7?
name "HashtagInterface" | ||
description "A hashtag" | ||
|
||
field :name, !types.String, "The hashtag's name" |
mrcasals
Aug 6, 2018
Contributor
I suggest moving this to the HashtagType
and deleting this file.
I suggest moving this to the HashtagType
and deleting this file.
# hashtag with a global id. | ||
# | ||
# @return [String] the content with the hashtags replaced by a global id | ||
|
mrcasals
Aug 6, 2018
Contributor
Remove extra white line
Remove extra white line
|
||
context "when hashtagging a non created hashtag" do | ||
let(:hashtag3) { create(:hashtag, organization: organization) } | ||
let(:content) { "This text hashtagiing a non created hashtag: ##{hashtag3.name}" } |
mrcasals
Aug 6, 2018
Contributor
hashtag3
does exist in the DB, so this test is wrong.
hashtag3
does exist in the DB, so this test is wrong.
title: @form.title, | ||
description: @form.description, | ||
# title: @form.title, | ||
title: parser.parse(@form.title), |
mrcasals
Aug 6, 2018
Contributor
Can titles have hashtags? Won't this be weird when rendering?
Can titles have hashtags? Won't this be weird when rendering?
isaacmg410
Aug 20, 2018
Author
Contributor
a long time ago, @xabier said that fields were title and body...
Maybe @decidim/product can clarify
a long time ago, @xabier said that fields were title and body...
Maybe @decidim/product can clarify
# parsed_title = Decidim::ContentProcessor.parse(form.title, current_organization: current_organization).rewrite | ||
# parsed_body = Decidim::ContentProcessor.parse(form.body, current_organization: current_organization).rewrite | ||
|
||
parsed_title = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.title, current_organization: current_organization).rewrite |
mrcasals
Aug 6, 2018
Contributor
Move these 2 lines inside the attributes
method and you won't need to pass those as params
Move these 2 lines inside the attributes
method and you won't need to pass those as params
renderer.render.html_safe | ||
end | ||
|
||
# This methods return the plain title |
mrcasals
Aug 6, 2018
Contributor
Wrong docs
Wrong docs
@@ -6,7 +6,7 @@ | |||
<%= proposal.id %><br /> | |||
</td> | |||
<td> | |||
<%= proposal.title %><br /> |
mrcasals
Aug 6, 2018
Contributor
Missing <br />
? Don't know if it's intended though.
Missing <br />
? Don't know if it's intended though.
}).fail(function() { | ||
cb([]) | ||
}).always(() => { | ||
// This function runs Tribute every single time you type somthing |
oriolgual
Aug 6, 2018
Member
s/somthing/something 🤓
s/somthing/something
if ($(this.current.element).hasClass("editor-container")) { | ||
let quill = this.current.element.__quill; | ||
quill.insertText(cursor - 1, `#${item.original.name} `, Quill.sources.API); | ||
// cursor position + nickname length + "@" sign + space |
oriolgual
Aug 6, 2018
Member
Nickname or hashtag?
Nickname or hashtag?
} | ||
}); | ||
|
||
function remoteSearch(text, cb) { |
oriolgual
Aug 6, 2018
Member
Duplicated function?
Duplicated function?
end | ||
|
||
def hashtags | ||
Decidim::Hashtag.where(organization: @organization).where("name like ?", "#{@term}%") |
oriolgual
Aug 6, 2018
Member
Why use like
?
Why use like
?
isaacmg410
Aug 20, 2018
Author
Contributor
to collect hashtags with the names thah begin with 'bla' for example
to collect hashtags with the names thah begin with 'bla' for example
oriolgual
Aug 27, 2018
Member
Then don't we need something like "name like ?%"
?
Then don't we need something like "name like ?%"
?
oriolgual
Aug 27, 2018
Member
Oh, I didn't see the %
at the end, sorry.
Oh, I didn't see the %
at the end, sorry.
isaacmg410
Aug 27, 2018
Author
Contributor
Don't worry 😄
Don't worry
name "HashtagInterface" | ||
description "A hashtag" | ||
|
||
field :name, !types.String, "The hashtag's name" |
oriolgual
Aug 6, 2018
Member
Since this interface won't be used anywhere else, you can drop it and move the field to the type
Since this interface won't be used anywhere else, you can drop it and move the field to the type
# | ||
# @see BaseRenderer Examples of how to use a content renderer | ||
class HashtagRenderer < BaseRenderer | ||
# Matches a global id representing a Decidim::User |
oriolgual
Aug 6, 2018
Member
s/User/Hashtag
s/User/Hashtag
HASHTAG_REGEX = /(^|\s)#([a-zA-Z0-9]\w*)/i | ||
|
||
def hashtaggables | ||
decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable) |
oriolgual
Aug 6, 2018
Member
Should we memoize this?
Should we memoize this?
decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable) | ||
end | ||
|
||
def hashtagged_types |
oriolgual
Aug 6, 2018
Member
These methods aren't used
These methods aren't used
@@ -40,17 +40,23 @@ def call | |||
attr_reader :form, :proposal, :attachment | |||
|
|||
def create_proposal | |||
# parsed_title = Decidim::ContentProcessor.parse(form.title, current_organization: current_organization).rewrite |
oriolgual
Aug 6, 2018
Member
Remove this?
Remove this?
# parsed_title = Decidim::ContentProcessor.parse(form.title, current_organization: current_organization).rewrite | ||
# parsed_body = Decidim::ContentProcessor.parse(form.body, current_organization: current_organization).rewrite | ||
|
||
parsed_title = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.title, current_organization: current_organization).rewrite |
oriolgual
Aug 6, 2018
Member
Isn't a bit weird to allow hashtags at titles?
Isn't a bit weird to allow hashtags at titles?
isaacmg410
Aug 20, 2018
Author
Contributor
@decidim/product clarify this please.
@decidim/product clarify this please.
carolromero
Aug 20, 2018
Member
@isaacmg410 @oriolgual I have checked the conversation in the original issue and we agreed to ignore the hashtags in the title: #2458 (comment)
@isaacmg410 @oriolgual I have checked the conversation in the original issue and we agreed to ignore the hashtags in the title: #2458 (comment)
isaacmg410
Aug 20, 2018
Author
Contributor
so that is what we are doing.
Show the hashtag on title ignoring the link 😄
so that is what we are doing.
Show the hashtag on title ignoring the link
@@ -17,6 +17,7 @@ class Meeting < Meetings::ApplicationRecord | |||
include Decidim::Searchable | |||
include Decidim::Traceable | |||
include Decidim::Loggable | |||
include Decidim::Hashtaggable |
oriolgual
Aug 27, 2018
Member
Shouldn't this be in another PR?
Shouldn't this be in another PR?
isaacmg410
Aug 27, 2018
Author
Contributor
You are right!
You are right!
@oriolgual requested changes applied, ready to review and merge |
006a084
into
master
This functionality will consist of the development of a new feature Hashtags provide a flexible way to search and filter content.
CHANGELOG
entry