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] | |||
There was a problem hiding this comment.
Looks like there's an extra g here
| description "hashtags list" | ||
|
|
||
| interfaces [ | ||
| -> { Decidim::Core::HashtagInterface } |
There was a problem hiding this comment.
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), |
There was a problem hiding this comment.
Isn't this a duplicate from the index in line 7?
| name "HashtagInterface" | ||
| description "A hashtag" | ||
|
|
||
| field :name, !types.String, "The hashtag's name" |
There was a problem hiding this comment.
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 | ||
|
|
|
|
||
| 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}" } |
There was a problem hiding this comment.
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), |
There was a problem hiding this comment.
Can titles have hashtags? Won't this be weird when rendering?
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 |
| <%= proposal.id %><br /> | ||
| </td> | ||
| <td> | ||
| <%= proposal.title %><br /> |
There was a problem hiding this comment.
Missing <br />? Don't know if it's intended though.
| }).fail(function() { | ||
| cb([]) | ||
| }).always(() => { | ||
| // This function runs Tribute every single time you type somthing |
| 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 |
| } | ||
| }); | ||
|
|
||
| function remoteSearch(text, cb) { |
| end | ||
|
|
||
| def hashtags | ||
| Decidim::Hashtag.where(organization: @organization).where("name like ?", "#{@term}%") |
There was a problem hiding this comment.
to collect hashtags with the names thah begin with 'bla' for example
There was a problem hiding this comment.
Then don't we need something like "name like ?%"?
There was a problem hiding this comment.
Oh, I didn't see the % at the end, sorry.
| name "HashtagInterface" | ||
| description "A hashtag" | ||
|
|
||
| field :name, !types.String, "The hashtag's name" |
There was a problem hiding this comment.
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 |
| HASHTAG_REGEX = /(^|\s)#([a-zA-Z0-9]\w*)/i | ||
|
|
||
| def hashtaggables | ||
| decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable) |
| decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable) | ||
| end | ||
|
|
||
| def hashtagged_types |
There was a problem hiding this comment.
These methods aren't used
| attr_reader :form, :proposal, :attachment | ||
|
|
||
| def create_proposal | ||
| # parsed_title = Decidim::ContentProcessor.parse(form.title, current_organization: current_organization).rewrite |
| # 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 |
There was a problem hiding this comment.
Isn't a bit weird to allow hashtags at titles?
There was a problem hiding this comment.
@decidim/product clarify this please.
There was a problem hiding this comment.
@isaacmg410 @oriolgual I have checked the conversation in the original issue and we agreed to ignore the hashtags in the title: #2458 (comment)
There was a problem hiding this comment.
so that is what we are doing.
Show the hashtag on title ignoring the link 😄
| include Decidim::Searchable | ||
| include Decidim::Traceable | ||
| include Decidim::Loggable | ||
| include Decidim::Hashtaggable |
There was a problem hiding this comment.
Shouldn't this be in another PR?
|
@oriolgual requested changes applied, ready to review and merge |
🎩 What? Why?
This functionality will consist of the development of a new feature Hashtags provide a flexible way to search and filter content.
📌 Related Issues
📋 Subtasks
CHANGELOGentry📷 Screenshots (optional)