Add prompt for tags too

This commit is contained in:
Jorge Manrubia
2025-07-01 14:58:24 +02:00
parent 60d243da52
commit cae01b777e
12 changed files with 64 additions and 16 deletions
@@ -2,7 +2,7 @@ class Prompts::Collections::UsersController < ApplicationController
include CollectionScoped
def index
@users = @collection.users
@users = @collection.users.alphabetically
if stale? etag: @users
render layout: false
@@ -0,0 +1,9 @@
class Prompts::TagsController < ApplicationController
def index
@tags = Tag.all.alphabetically
if stale? etag: @tags
render layout: false
end
end
end
+1 -1
View File
@@ -1,6 +1,6 @@
class Prompts::UsersController < ApplicationController
def index
@users = User.all
@users = User.all.alphabetically
if stale? etag: @users
render layout: false
+4
View File
@@ -7,6 +7,10 @@ module RichTextHelper
content_tag "lexical-prompt", "", trigger: "@", src: prompts_users_path, name: "mention"
end
def tags_prompt
content_tag "lexical-prompt", "", trigger: "#", src: prompts_tags_path, name: "tag"
end
def cards_prompt
content_tag "lexical-prompt", "", trigger: "#", src: prompts_cards_path, name: "card", "insert-editable-text": true, "remote-filtering": true
end
+2 -1
View File
@@ -146,7 +146,8 @@ class Command::Ai::Translator
* ❗ Once you produce a valid context **or** command list, do not add a fallback /search.
---------------------- RESOLVE COMMAND ARGUMENTS ----------------------
* A person can be express by its name or via a global ID URL like gid://fizzy/User/773524000?tenant=37signals.
* A person can be expressed by its name or via a global ID URL like gid://fizzy/User/1234?tenant=37signals.
* A tag can be expressed by its text or via a global ID URL like gid://fizzy/Tag/5678?tenant=37signals.
-------------------- COMMAND INTERPRETATION RULES --------------------
* /user <Name> → open that persons profile or activity feed.
+7 -6
View File
@@ -24,11 +24,12 @@ class Command::Parser
ActionText::Content.new(string).to_plain_text
end
private
def parse_command(string)
rich_text_command = as_plain_text_with_attachable_references(string)
plain_text_command = as_plain_text(string)
Rails.logger.info "COMMANDS: #{rich_text_command} AND #{plain_text_command}"
parse_plain_text_command(plain_text_command) || parse_rich_text_command(rich_text_command)
end
@@ -36,10 +37,10 @@ class Command::Parser
command_name, *_ = string.strip.split(" ")
case command_name
when /^#/
Command::FilterByTag.new(tag_title: tag_title_from(string), params: filter.as_params)
when /^@/
Command::GoToUser.new(user_id: context.find_user(command_name)&.id)
when /^#/
Command::FilterByTag.new(tag_title: tag_title_from(string), params: filter.as_params)
when /^@/
Command::GoToUser.new(user_id: context.find_user(command_name)&.id)
end
end
@@ -88,7 +89,7 @@ class Command::Parser
end
def tag_title_from(string)
string.gsub(/^#/, "")
context.find_tag(string)&.title || string.gsub(/^#/, "")
end
def parse_free_string(string)
+9 -3
View File
@@ -29,11 +29,12 @@ class Command::Parser::Context
end
def find_user(string)
string = string.delete_prefix("@")
if string.starts_with?("gid://")
User.find_by_id(GlobalID::Locator.locate(string).id)
else
string_without_at = string.delete_prefix("@")
User.all.find { |user| user.mentionable_handles.include?(string_without_at.downcase) }
User.all.find { |user| user.mentionable_handles.include?(string.downcase) }
end
end
@@ -44,7 +45,12 @@ class Command::Parser::Context
end
def find_tag(string)
Tag.find_by_title(string)
string = string.delete_prefix("#")
if string.starts_with?("gid://")
Tag.find_by_id(GlobalID::Locator.locate(string).id)
else
Tag.find_by_title(string)
end
end
def find_collection(string)
+6 -1
View File
@@ -1,5 +1,5 @@
class Tag < ApplicationRecord
include Filterable
include ActionText::Attachable, Filterable
has_many :taggings, dependent: :destroy
has_many :cards, through: :taggings
@@ -13,4 +13,9 @@ class Tag < ApplicationRecord
def hashtag
"#" + title
end
# TODO: Move to attachable along with the concern
def attachable_plain_text_representation(...)
"##{title}"
end
end
+15 -3
View File
@@ -4,7 +4,19 @@
data: {
controller: "form",
terminal_target: "form",
action: "turbo:submit-start->terminal#commandSubmitted turbo:submit-end->terminal#focus keydown.meta+k@document->terminal#focus:prevent keydown.ctrl+k@document->terminal#focus:prevent keydown.enter->terminal#executeCommand keydown.esc->terminal#hideMenus turbo:submit-end->terminal#handleCommandResponse"
action: "
keydown.enter->terminal#submitCommand
keydown.up->toggle-class#add:prevent
keydown.up->navigable-list#selectCurrentOrReset:stop
terminal#hideError
turbo:submit-start->terminal#commandSubmitted
turbo:submit-end->terminal#focus
keydown.meta+k@document->terminal#focus:prevent
keydown.ctrl+k@document->terminal#focus:prevent
keydown.enter->terminal#executeCommand
keydown.esc->terminal#hideMenus
turbo:submit-end->terminal#handleCommandResponse
"
} do %>
<label class="terminal__label txt-nowrap" for="fizzy_do">Fizzy do &gt;</label>
@@ -13,12 +25,12 @@
class: "terminal__input input fill-transparent unpad",
"single-line": true,
data: {
terminal_target: "input",
action: "keydown.enter->terminal#submitCommand keydown.up->toggle-class#add:prevent keydown.up->navigable-list#selectCurrentOrReset:stop terminal#hideError"
terminal_target: "input"
},
placeholder: platform.desktop? ? "Press #{ hotkey_label(["ctrl", "K"]) } to search or type commands…" : "Search or type commands…",
spellcheck: "false" do %>
<%= global_mentions_prompt %>
<%= tags_prompt %>
<% end %>
<%= hidden_field_tag "confirmed", nil, data: { terminal_target: "confirmation" } %>
+8
View File
@@ -0,0 +1,8 @@
<lexical-prompt-item search="<%= tag.title %>" sgid="<%= tag.attachable_sgid %>">
<template type="menu">
#<%= tag.title %>
</template>
<template type="editor">
#<%= tag.title %>
</template>
</lexical-prompt-item>
+1
View File
@@ -0,0 +1 @@
<%= render partial: "prompts/tags/tag", collection: @tags %>
+1
View File
@@ -117,6 +117,7 @@ Rails.application.routes.draw do
namespace :prompts do
resources :cards
resources :users
resources :tags
resources :collections do
scope module: :collections do