Skip to content

Hashtags Feature applied to Proposals #3959

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 21 commits into from
Aug 30, 2018
Merged

Hashtags Feature applied to Proposals #3959

merged 21 commits into from
Aug 30, 2018

Conversation

isaacmg410
Copy link
Contributor

@isaacmg410 isaacmg410 commented Aug 3, 2018

🎩 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

  • Add CHANGELOG entry
  • Add hashtags features to proposals
  • Add documentation regarding the feature
  • Add tests

📷 Screenshots (optional)

Description

@ghost ghost assigned isaacmg410 Aug 3, 2018
@ghost ghost added the status: WIP label Aug 3, 2018
@isaacmg410
Copy link
Contributor Author

@decidim/lot-core I would appreciate a pre-review of this PR.
I will try to make more smaller PRs for a better 😄

@@ -0,0 +1,16 @@
# frozen_string_literal: true

class CreateDecidimHashtagggings < ActiveRecord::Migration[5.2]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like there's an extra g here

description "hashtags list"

interfaces [
-> { Decidim::Core::HashtagInterface }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this a duplicate from the index in line 7?

name "HashtagInterface"
description "A hashtag"

field :name, !types.String, "The hashtag's name"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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}" }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can titles have hashtags? Won't this be weird when rendering?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong docs

@@ -6,7 +6,7 @@
<%= proposal.id %><br />
</td>
<td>
<%= proposal.title %><br />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing <br />? Don't know if it's intended though.

}).fail(function() {
cb([])
}).always(() => {
// This function runs Tribute every single time you type somthing
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nickname or hashtag?

}
});

function remoteSearch(text, cb) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicated function?

end

def hashtags
Decidim::Hashtag.where(organization: @organization).where("name like ?", "#{@term}%")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why use like?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to collect hashtags with the names thah begin with 'bla' for example

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then don't we need something like "name like ?%"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I didn't see the % at the end, sorry.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't worry 😄

name "HashtagInterface"
description "A hashtag"

field :name, !types.String, "The hashtag's name"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/User/Hashtag

HASHTAG_REGEX = /(^|\s)#([a-zA-Z0-9]\w*)/i

def hashtaggables
decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we memoize this?

decidim_hashtaggings.includes(:decidim_hashtaggable).collect(&:decidim_hashtaggable)
end

def hashtagged_types
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't a bit weird to allow hashtags at titles?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@decidim/product clarify this please.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@isaacmg410 @oriolgual I have checked the conversation in the original issue and we agreed to ignore the hashtags in the title: #2458 (comment)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that is what we are doing.
Show the hashtag on title ignoring the link 😄

@isaacmg410 isaacmg410 changed the title [WIP] Hashtags Feature applied to Proposals Hashtags Feature applied to Proposals Aug 27, 2018
@@ -17,6 +17,7 @@ class Meeting < Meetings::ApplicationRecord
include Decidim::Searchable
include Decidim::Traceable
include Decidim::Loggable
include Decidim::Hashtaggable
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be in another PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are right!

@isaacmg410
Copy link
Contributor Author

@oriolgual requested changes applied, ready to review and merge

@ghost ghost assigned oriolgual Aug 29, 2018
@ghost ghost added the status: WIP label Aug 29, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants