Commit graph

42 commits

Author SHA1 Message Date
John McLear
25c43140bc
feat(userlist): click a user to open chat with @<name> prefilled (#7660)
* feat(userlist): click a user to open chat with @<name> prefilled

Newcomers to a multi-user pad regularly fail to discover the chat
panel and the @-mention convention. Make the user list itself the
discovery affordance: clicking another user's row opens chat (if
hidden) and prefills the input with "@<their_name> ", ready to send.

The skin gets a small visual cue — pointer cursor on .usertdname and
an underline on hover — so the affordance is visible without
requiring a redesign. The color swatch keeps its own click semantics
(color picker), so the swatch cell is excluded from the new handler.

To let bot/AI plugins substitute their trigger string for an
otherwise-useless @-mention of the bot's display name (e.g.
"@AI Assistant" → "@ai"), this adds a new client-side hook,
chatPrefillFromUser, that takes {authorId, name, prefill} and lets
the first plugin to return a non-empty string override the default
prefill. Documented in doc/api/hooks_client-side.md alongside
chatSendMessage.

Plugin errors in the hook are caught — a misbehaving plugin can't
break the click. If chat is hidden by pad settings, chat.show() is
a no-op and the click effectively does nothing, which matches the
existing behavior of "no chat means no chat-related affordances".

The new prefill never clobbers a real partial message in the input;
if the user was mid-typing something, the @-mention is appended
rather than replacing.

* fix(userlist): don't steal rename focus + add Playwright coverage

Two follow-ups on review of the click-to-chat handler:

1. Bug (Qodo, correctness): clicking the rename <input> on an unnamed
   user's row triggered the new row handler, which then focused
   #chatinput and made it impossible to name unnamed users from the
   user list. Add an early-return that skips form controls inside
   the row (input/textarea/select/button/a/[contenteditable=true]).
   The swatch was already excluded; this widens the same idea to
   anything that's interactive on its own merits.

2. Test coverage: add a frontend Playwright spec
   (userlist_click_to_chat.spec.ts) covering the supported flows
   and the new regression:
   - clicking another named user opens chat and prefills "@<name> "
   - clicking the swatch opens color picker, not chat
   - clicking the rename <input> on an unnamed user keeps focus
     on the input (regression test for the bug above)
   - partial chat message is preserved when prefilling

* test: stabilise the partial-message preservation case

The 'partial message in chat input is preserved when prefilling'
case was flaking on CI. Three small changes:

- Seed the chat input with fill() rather than click() + keyboard.type().
  Earlier the test was racing chat.focus()'s own setTimeout(100) — when
  the keyboard.type started before that timer fired, the typing landed
  in whatever element had focus at the time, which wasn't always the
  chat input. fill() bypasses focus state entirely.
- Wait for the chat box to be visible before filling, so we don't race
  the chaticon click handler.
- Replace the two sequential expect/wait pairs after the daveRow click
  with one waitForFunction that asserts both 'hi there' and '@Dave' are
  in the input together. The prefill is async (setTimeout(50) inside
  the click handler), so a combined wait is more reliable than checking
  one piece, then snapshotting and asserting the other.

The other three cases in this file passed unchanged on CI; only this
fourth one was racy.

* fix: don't commit local .claude worktrees / var state

These were accidentally added in ffe947706 by an over-broad git add -A.
Both paths are workspace-local and unrelated to this PR.
2026-05-03 05:40:44 +01:00
John McLear
649f960341
Add docs for aceRegisterLineAttributes hook (#7512)
* Add docs for aceRegisterLineAttributes hook

Documents the new hook in both .md and .adoc client-side hook references.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix: correct source file path from .js to .ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:48:33 +01:00
SamTV12345
d004d19dd7
Added vitepress for documentation. (#6270) 2024-03-23 20:58:05 +01:00
SamTV12345
dc0db68515
Added docs as asciidoctor with cross platform support. (#5733)
* Added docs as asciidoctor with cross platform support.

* Fixed release script with new doc building mechanism.
2023-06-21 13:13:31 +01:00
Richard Hansen
9fbd2e5c3d chat: New chatSendMessage client-side hook 2021-11-01 01:54:28 -04:00
Richard Hansen
4c2f7f9a11 chat: Rename userId to authorId, userName to displayName 2021-11-01 01:54:28 -04:00
Richard Hansen
f1f4ed7c58 chat: Allow chatNewMessage hook to control rendering 2021-11-01 01:54:28 -04:00
Richard Hansen
2597b940f4 chat: Give chatNewMessage hook access to the raw message object 2021-11-01 01:54:28 -04:00
Richard Hansen
c8dbf35fe4 docs: Improve chatNewMessage client-side hook documentation 2021-11-01 01:54:28 -04:00
Richard Hansen
0d65dc8a44 pad: Add clientVars to postAceInit hook context
This allows plugins to avoid the `clientVars` global variable.
2021-08-25 14:59:17 -04:00
Richard Hansen
74554d36a5 chat: Allow chatNewMessage hook to modify more values 2021-04-11 06:20:29 +02:00
Richard Hansen
e3a47e48f9 contentcollector: Fix collectContentLineText hook
Before, the hook always ignored the return values provided by the hook
functions. Now the hook functions can change the text by either
returning a string or setting `context.text` to the desired value.

Also drop the `styl` and `cls` context properties. They were never
documented and they were always null.
2021-01-27 04:59:36 +00:00
Richard Hansen
bfe813fca2 docs: Wrap long lines and fix whitespace 2021-01-22 02:25:48 -05:00
Neil Oosten
7a999ee398 hooks: allow to set the duration of the gritter notification when a new chat message arrives
This is done adding a new "duration" parameter to the chatNewMessage() client
side hook.
2020-03-27 02:39:29 +01:00
muxator
8a01a5e437 doc: fix numbering in chatNewMessage() client hook parameters
This was originally introduced in bcb92f25a6 ("Refactor chat notifications and
the chatNewMessage hook") from 2013-03-19.
2020-03-27 02:39:29 +01:00
John McLear
6fd2bf4472 hooks: introduce goToRevisionEvent(), a new client-side hook
This hook gets fired both on timeslider load (as timeslider shows a new
revision) and when the new revision is showed to a user.
2020-03-24 23:46:17 +01:00
HairyFotr
fce55df2b7 Fix typos 2019-01-16 11:14:04 +01:00
Luiza Pagliari
69ac8e1722 Include usage example for aceRegisterNonScrollableEditEvents 2016-06-20 06:31:11 -03:00
Luiza Pagliari
3fb695a7a0 Create hook to register events that won't scroll editor after aceEditEvt 2016-03-30 11:51:18 -03:00
Mikk Andresen
4ad759dd25 Add postToolbarInit documentation and usage examples 2015-12-18 13:33:49 +02:00
Mikk Andresen
03a4828d31 Update aceEditorCSS hook documentation 2015-12-02 13:15:27 +02:00
Xavid
008d4e653c Add a aceSelectionChanged hook to allow plugins to react when the cursor
location changes.
2015-07-11 11:33:20 -04:00
Luiza Pagliari
6bd2013c71 Fixing documentation of collectContentPre 2015-05-15 11:18:58 -03:00
John McLear
b4163fc862 fix docs 2015-04-23 17:27:54 +01:00
Thomas Muehlichen
1e8e64d675 feature #2567 added documentation 2015-03-31 10:50:20 +02:00
John McLear
b8ac349b53 Update hooks_client-side.md 2015-01-26 16:07:46 +00:00
John McLear
2c3ce30fed docs 2015-01-26 02:42:48 +00:00
John McLear
b94a525e07 docs 2014-12-09 01:35:59 +00:00
John McLear
df205a4ef4 docs 2014-03-05 21:44:22 +00:00
j@mailb.org
bc5dc74f90 pass pad in postAceInit hook
no way for plugins to access current pad otherwise.
2013-06-17 15:52:51 +02:00
Chia-liang Kao
8f262d0ede document aceSetAuthorStyle 2013-06-15 11:07:13 +08:00
Marcel Klehr
bcb92f25a6 Refactor chat notifications and the chatNewMessage hook 2013-03-19 20:21:27 +01:00
John McLear
8406cc95ab docs for hook 2013-03-19 03:43:38 +00:00
John McLear
716cac9c95 timeslider init hook docs 2013-02-27 15:17:22 +00:00
Gedion
61022be6e4 added comments to ace exposed methods 2012-10-01 19:14:27 -05:00
Gedion
3fe3df91ae update docs for new hooks and ace exposures 2012-09-30 17:13:14 -05:00
Marcel Klehr
40572b13b9 Document, how return values of hooks are handled. 2012-09-12 17:15:38 +02:00
Mark Holmquist
17375b2eed Fix doc format, add in makefile for docs
OK, first up, SOMEBODY *cough*analphabet*cough* screwed up the docs
by making them all use the wrong heading level. Not cool, guy. I
had to change them so they would compile right.

But anyway, now the docs will build into sexy-looking HTML and will
shortly be hosted on marktraceur.info.

Fixed the makefile to work properly.

Run:
 * `make clean` for removing old doc-build(s)
 * `make docs` for running new doc-build(s)
2012-08-13 21:11:39 -07:00
Marcel Klehr
98cdb96ac3 Document 'documentReady' client hook. 2012-08-12 21:29:21 +02:00
Mark Holmquist
14da09dddd Add in docs for the new hook I just added 2012-08-10 09:49:43 -07:00
Marcel Klehr
70fb765118 Restructure headings. 2012-08-07 20:19:37 +02:00
Marcel Klehr
5fac05a395 Add docs. 2012-08-03 22:04:06 +02:00