@fieldia/chatter 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -0
  3. package/package.json +39 -0
  4. package/src/index.d.mts +6 -0
  5. package/src/index.d.ts +6 -0
  6. package/src/index.js +10 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +7 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/activities.d.mts +19 -0
  11. package/src/lib/activities.d.ts +19 -0
  12. package/src/lib/activities.js +145 -0
  13. package/src/lib/activities.js.map +1 -0
  14. package/src/lib/activities.mjs +140 -0
  15. package/src/lib/activities.mjs.map +1 -0
  16. package/src/lib/attachments.d.mts +19 -0
  17. package/src/lib/attachments.d.ts +19 -0
  18. package/src/lib/attachments.js +93 -0
  19. package/src/lib/attachments.js.map +1 -0
  20. package/src/lib/attachments.mjs +89 -0
  21. package/src/lib/attachments.mjs.map +1 -0
  22. package/src/lib/chatter.d.mts +45 -0
  23. package/src/lib/chatter.d.ts +45 -0
  24. package/src/lib/chatter.js +222 -0
  25. package/src/lib/chatter.js.map +1 -0
  26. package/src/lib/chatter.mjs +217 -0
  27. package/src/lib/chatter.mjs.map +1 -0
  28. package/src/lib/followers.d.mts +15 -0
  29. package/src/lib/followers.d.ts +15 -0
  30. package/src/lib/followers.js +96 -0
  31. package/src/lib/followers.js.map +1 -0
  32. package/src/lib/followers.mjs +93 -0
  33. package/src/lib/followers.mjs.map +1 -0
  34. package/src/lib/labels.d.mts +43 -0
  35. package/src/lib/labels.d.ts +43 -0
  36. package/src/lib/labels.js +166 -0
  37. package/src/lib/labels.js.map +1 -0
  38. package/src/lib/labels.mjs +163 -0
  39. package/src/lib/labels.mjs.map +1 -0
  40. package/src/lib/memory.d.mts +22 -0
  41. package/src/lib/memory.d.ts +22 -0
  42. package/src/lib/memory.js +131 -0
  43. package/src/lib/memory.js.map +1 -0
  44. package/src/lib/memory.mjs +128 -0
  45. package/src/lib/memory.mjs.map +1 -0
  46. package/src/lib/mentions.d.mts +18 -0
  47. package/src/lib/mentions.d.ts +18 -0
  48. package/src/lib/mentions.js +94 -0
  49. package/src/lib/mentions.js.map +1 -0
  50. package/src/lib/mentions.mjs +90 -0
  51. package/src/lib/mentions.mjs.map +1 -0
  52. package/src/lib/reactions.d.mts +10 -0
  53. package/src/lib/reactions.d.ts +10 -0
  54. package/src/lib/reactions.js +53 -0
  55. package/src/lib/reactions.js.map +1 -0
  56. package/src/lib/reactions.mjs +49 -0
  57. package/src/lib/reactions.mjs.map +1 -0
  58. package/src/lib/slot.d.mts +17 -0
  59. package/src/lib/slot.d.ts +17 -0
  60. package/src/lib/slot.js +37 -0
  61. package/src/lib/slot.js.map +1 -0
  62. package/src/lib/slot.mjs +34 -0
  63. package/src/lib/slot.mjs.map +1 -0
  64. package/src/lib/source.d.mts +114 -0
  65. package/src/lib/source.d.ts +114 -0
  66. package/src/lib/source.js +9 -0
  67. package/src/lib/source.js.map +1 -0
  68. package/src/lib/source.mjs +8 -0
  69. package/src/lib/source.mjs.map +1 -0
  70. package/src/lib/styles.d.mts +4 -0
  71. package/src/lib/styles.d.ts +4 -0
  72. package/src/lib/styles.js +108 -0
  73. package/src/lib/styles.js.map +1 -0
  74. package/src/lib/styles.mjs +104 -0
  75. package/src/lib/styles.mjs.map +1 -0
@@ -0,0 +1,217 @@
1
+ import { fill } from '@fieldia/core';
2
+ import { installStyles, sanitizeHtml } from '@fieldia/widgets';
3
+ import { activitiesPart } from './activities.mjs';
4
+ import { attachmentList, composerFiles } from './attachments.mjs';
5
+ import { followersPart } from './followers.mjs';
6
+ import { CHATTER_LABELS } from './labels.mjs';
7
+ import { mentions } from './mentions.mjs';
8
+ import { reactionBar } from './reactions.mjs';
9
+ import { installChatterStyles } from './styles.mjs';
10
+ /** What was typed, as HTML: a paragraph for each block, a line break for each line, every character escaped. */
11
+ export function textToHtml(text) {
12
+ const escape = (line) => line.replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[c]);
13
+ return text
14
+ .trim()
15
+ .split(/\n\s*\n/)
16
+ .map((block) => `<p>${block.split('\n').map(escape).join('<br>')}</p>`)
17
+ .join('');
18
+ }
19
+ /** A person's initials, for when there is no picture. */
20
+ export function initials(name) {
21
+ return name
22
+ .split(/\s+/)
23
+ .filter(Boolean)
24
+ .slice(0, 2)
25
+ .map((part) => part[0]?.toUpperCase() ?? '')
26
+ .join('');
27
+ }
28
+ /**
29
+ * A record's conversation beside its form: messages to its followers, notes
30
+ * for the team, and its tracked changes. Plain DOM, so it works in every
31
+ * framework; it talks to the server only through the app's `source`.
32
+ */
33
+ export function mountChatter(host, options) {
34
+ const doc = host.ownerDocument;
35
+ installStyles(doc);
36
+ installChatterStyles(doc);
37
+ const locale = options.locale ?? 'en';
38
+ const labels = { ...CHATTER_LABELS[locale], ...options.labels };
39
+ let record = options.record;
40
+ let destroyed = false;
41
+ function el(tag, attrs = {}, ...children) {
42
+ const node = doc.createElement(tag);
43
+ for (const [name, value] of Object.entries(attrs))
44
+ if (value !== undefined)
45
+ node.setAttribute(name, value);
46
+ node.append(...children);
47
+ return node;
48
+ }
49
+ const context = { doc, labels, locale, source: options.source, icons: options.icons, now: options.now ?? (() => new Date()), record: () => record, el };
50
+ const root = el('section', { class: 'fd-theme fd-chatter', 'aria-label': labels.conversation, dir: options.dir, lang: locale });
51
+ const sendButton = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.sendMessage);
52
+ const noteButton = el('button', { type: 'button', class: 'fd-button' }, labels.logNote);
53
+ const bar = el('div', { class: 'fd-chatter-bar' }, sendButton, noteButton);
54
+ const waiting = el('p', { class: 'fd-chatter-waiting', hidden: '' }, labels.notSaved);
55
+ const empty = el('p', { class: 'fd-chatter-empty', hidden: '' }, labels.empty);
56
+ const list = el('ol', { class: 'fd-chatter-messages' });
57
+ // ---- composing ----------------------------------------------------------------
58
+ let mode = 'message';
59
+ let replyTo = null;
60
+ const box = el('textarea', { class: 'fd-input', rows: '3' });
61
+ // The mention list takes its keys first: Enter picks a person, Escape closes the list, not the composer.
62
+ const mentioning = mentions(context, box);
63
+ const replying = el('p', { class: 'fd-replying', hidden: '' });
64
+ const post = el('button', { type: 'button', class: 'fd-button fd-button-primary' });
65
+ const cancel = el('button', { type: 'button', class: 'fd-button' }, labels.cancel);
66
+ const problem = el('p', { class: 'fd-chatter-problem', role: 'alert', hidden: '' });
67
+ const say = (message) => {
68
+ problem.textContent = message;
69
+ problem.hidden = false;
70
+ };
71
+ const files = composerFiles(context, say);
72
+ const actions = el('div', { class: 'fd-composer-actions' }, post, cancel);
73
+ if (files.element)
74
+ actions.append(el('span', { class: 'fd-spacer' }), files.element);
75
+ const composer = el('div', { class: 'fd-composer', hidden: '' }, replying, box, mentioning.list, files.chips, problem, actions);
76
+ files.takeDropsOn(composer);
77
+ function openComposer(kind, answering = null) {
78
+ mode = kind;
79
+ replyTo = answering;
80
+ replying.hidden = !answering;
81
+ replying.textContent = answering ? fill(labels.replyingTo, { name: answering.author?.name ?? '' }) : '';
82
+ composer.hidden = false;
83
+ composer.classList.toggle('fd-composer-note', kind === 'note');
84
+ box.placeholder = kind === 'note' ? labels.forTeam : labels.forFollowers;
85
+ box.setAttribute('aria-label', kind === 'note' ? labels.logNote : labels.sendMessage);
86
+ post.textContent = kind === 'note' ? labels.log : labels.send;
87
+ problem.hidden = true;
88
+ box.focus();
89
+ }
90
+ function closeComposer() {
91
+ composer.hidden = true;
92
+ box.value = '';
93
+ replyTo = null;
94
+ files.clear();
95
+ mentioning.reset();
96
+ }
97
+ async function submit() {
98
+ const current = record;
99
+ // Words, files or both; and never while a file is still on its way.
100
+ const attachments = files.files();
101
+ if (!current || (!box.value.trim() && !attachments.length) || post.disabled || files.busy())
102
+ return;
103
+ post.disabled = true;
104
+ try {
105
+ const mentioned = mentioning.picked();
106
+ await options.source.post(current, {
107
+ kind: mode,
108
+ body: box.value.trim() ? textToHtml(box.value) : '',
109
+ attachments,
110
+ ...(replyTo ? { parentId: replyTo.id } : {}),
111
+ ...(mentioned.length ? { mentions: mentioned } : {}),
112
+ });
113
+ closeComposer();
114
+ await load();
115
+ }
116
+ catch (error) {
117
+ say(fill(labels.couldNotSend, { reason: error.message }));
118
+ }
119
+ finally {
120
+ post.disabled = false;
121
+ }
122
+ }
123
+ sendButton.addEventListener('click', () => openComposer('message'));
124
+ noteButton.addEventListener('click', () => openComposer('note'));
125
+ post.addEventListener('click', () => void submit());
126
+ cancel.addEventListener('click', closeComposer);
127
+ box.addEventListener('keydown', (event) => {
128
+ if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
129
+ event.preventDefault();
130
+ void submit();
131
+ }
132
+ else if (event.key === 'Escape') {
133
+ event.preventDefault();
134
+ closeComposer();
135
+ }
136
+ });
137
+ // ---- the messages ---------------------------------------------------------------
138
+ const when = new Intl.DateTimeFormat(locale === 'ar' ? 'ar-EG-u-nu-latn' : locale, { dateStyle: 'medium', timeStyle: 'short' });
139
+ function avatar(person) {
140
+ if (person?.avatar)
141
+ return el('img', { class: 'fd-avatar-image', src: person.avatar, alt: '' });
142
+ return el('span', { class: 'fd-avatar-initials', 'aria-hidden': 'true' }, initials(person?.name ?? '?'));
143
+ }
144
+ /** The messages on show, by id: an answer names whom it answers. */
145
+ let shown = new Map();
146
+ function messageItem(message) {
147
+ const head = el('div', { class: 'fd-message-head' }, el('span', { class: 'fd-message-author' }, message.author?.name ?? ''), el('time', { datetime: message.date }, when.format(new Date(message.date))));
148
+ if (message.kind === 'note')
149
+ head.append(el('span', { class: 'fd-message-kind' }, labels.note));
150
+ const body = el('div', { class: 'fd-message-body' });
151
+ body.innerHTML = sanitizeHtml(message.body, doc);
152
+ const content = el('div', { class: 'fd-message-content' }, head);
153
+ const parent = message.parentId != null ? shown.get(message.parentId) : undefined;
154
+ if (parent)
155
+ content.append(el('p', { class: 'fd-message-parent' }, fill(labels.replyingTo, { name: parent.author?.name ?? '' })));
156
+ if (message.body)
157
+ content.append(body);
158
+ if (message.tracking?.length) {
159
+ content.append(el('ul', { class: 'fd-tracking' }, ...message.tracking.map((change) => el('li', {}, `${change.label}: ${change.from ?? '—'} → ${change.to ?? '—'}`))));
160
+ }
161
+ if (message.attachments?.length)
162
+ content.append(attachmentList(context, message.attachments));
163
+ // An event is history, not something to answer or react to.
164
+ if (message.kind !== 'event') {
165
+ const reply = el('button', { type: 'button', class: 'fd-message-reply', 'aria-label': labels.reply }, '↩');
166
+ reply.addEventListener('click', () => openComposer('message', message));
167
+ const reactions = reactionBar(context, message.id, message.reactions ?? []);
168
+ content.append(el('div', { class: 'fd-message-actions' }, ...(reactions ? [reactions] : []), reply));
169
+ }
170
+ return el('li', { class: `fd-message fd-message-${message.kind}`, 'data-message': String(message.id) }, avatar(message.author), content);
171
+ }
172
+ async function load() {
173
+ const current = record;
174
+ waiting.hidden = current !== null;
175
+ bar.hidden = current === null;
176
+ if (!current) {
177
+ closeComposer();
178
+ list.replaceChildren();
179
+ empty.hidden = true;
180
+ if (activities.element)
181
+ activities.element.hidden = true;
182
+ return;
183
+ }
184
+ void activities.load();
185
+ void followers.load();
186
+ const messages = await options.source.messages(current);
187
+ if (destroyed || record !== current)
188
+ return; // another record, or gone, meanwhile
189
+ shown = new Map(messages.map((message) => [message.id, message]));
190
+ list.replaceChildren(...messages.map(messageItem));
191
+ empty.hidden = messages.length > 0;
192
+ }
193
+ // Marking an activity done posts what came of it: the conversation is fetched again.
194
+ const activities = activitiesPart(context, () => load());
195
+ if (activities.button)
196
+ bar.append(activities.button);
197
+ // Who follows sits at the far end of the bar, its list just under it.
198
+ const followers = followersPart(context);
199
+ if (followers.button)
200
+ bar.append(el('span', { class: 'fd-spacer' }), followers.button);
201
+ root.append(bar, ...(followers.element ? [followers.element] : []), waiting, composer, ...(activities.element ? [activities.element] : []), empty, list);
202
+ host.append(root);
203
+ void load();
204
+ return {
205
+ element: root,
206
+ refresh: load,
207
+ async setRecord(next) {
208
+ record = next;
209
+ await load();
210
+ },
211
+ destroy() {
212
+ destroyed = true;
213
+ root.remove();
214
+ },
215
+ };
216
+ }
217
+ //# sourceMappingURL=chatter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatter.mjs","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/chatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAgB,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAsB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAoChD,gHAAgH;AAChH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC;IACzJ,OAAO,IAAI;SACR,IAAI,EAAE;SACN,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;SACtE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,OAAuB;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAkB,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/E,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,SAAS,EAAE,CAAwC,GAAM,EAAE,QAA4C,EAAE,EAAE,GAAG,QAA2B;QACvI,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3G,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;IAExK,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChI,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9G,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAExD,kFAAkF;IAElF,IAAI,IAAI,GAAuB,SAAS,CAAC;IACzC,IAAI,OAAO,GAA0B,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,yGAAyG;IACzG,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE;QAC9B,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;QAC9B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5B,SAAS,YAAY,CAAC,IAAwB,EAAE,YAAmC,IAAI;QACrF,IAAI,GAAG,IAAI,CAAC;QACZ,OAAO,GAAG,SAAS,CAAC;QACpB,QAAQ,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC;QAC7B,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;QACxB,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;QAC/D,GAAG,CAAC,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzE,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtF,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QACtB,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IACD,SAAS,aAAa;QACpB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,KAAK,UAAU,MAAM;QACnB,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,oEAAoE;QACpE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO;QACpG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnD,WAAW;gBACX,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC;YACH,aAAa,EAAE,CAAC;YAChB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,MAAM,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAChD,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oFAAoF;IAEpF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhI,SAAS,MAAM,CAAC,MAAqB;QACnC,IAAI,MAAM,EAAE,MAAM;YAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAChG,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;IAE5D,SAAS,WAAW,CAAC,OAAuB;QAC1C,MAAM,IAAI,GAAG,EAAE,CACb,KAAK,EACL,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAC5B,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EACtE,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5E,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClI,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CACZ,EAAE,CACA,IAAI,EACJ,EAAE,KAAK,EAAE,aAAa,EAAE,EACxB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,IAAI,GAAG,MAAM,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAClH,CACF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9F,4DAA4D;QAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3G,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,yBAAyB,OAAO,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3I,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,OAAO,CAAC,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;QAClC,GAAG,CAAC,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,IAAI,UAAU,CAAC,OAAO;gBAAE,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACzD,OAAO;QACT,CAAC;QACD,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,SAAS,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,CAAC,qCAAqC;QAClF,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,qFAAqF;IACrF,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,UAAU,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,sEAAsE;IACtE,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,SAAS,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACvF,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,KAAK,IAAI,EAAE,CAAC;IAEZ,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,KAAK,CAAC,SAAS,CAAC,IAAI;YAClB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QACD,OAAO;YACL,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ChatterContext } from './chatter.mjs';
2
+ /**
3
+ * Who follows the record: a button with their number, opening the list, where
4
+ * each can be taken away and others found by name and added. Every part the
5
+ * source cannot do is left out, and all of it without `followers`.
6
+ */
7
+ export declare function followersPart(context: ChatterContext): {
8
+ button: null;
9
+ element: null;
10
+ load: () => Promise<undefined>;
11
+ } | {
12
+ button: HTMLButtonElement;
13
+ element: HTMLDivElement;
14
+ load: () => Promise<void>;
15
+ };
@@ -0,0 +1,15 @@
1
+ import type { ChatterContext } from './chatter';
2
+ /**
3
+ * Who follows the record: a button with their number, opening the list, where
4
+ * each can be taken away and others found by name and added. Every part the
5
+ * source cannot do is left out, and all of it without `followers`.
6
+ */
7
+ export declare function followersPart(context: ChatterContext): {
8
+ button: null;
9
+ element: null;
10
+ load: () => Promise<undefined>;
11
+ } | {
12
+ button: HTMLButtonElement;
13
+ element: HTMLDivElement;
14
+ load: () => Promise<void>;
15
+ };
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.followersPart = followersPart;
4
+ const core_1 = require("@fieldia/core");
5
+ const widgets_1 = require("@fieldia/widgets");
6
+ /**
7
+ * Who follows the record: a button with their number, opening the list, where
8
+ * each can be taken away and others found by name and added. Every part the
9
+ * source cannot do is left out, and all of it without `followers`.
10
+ */
11
+ function followersPart(context) {
12
+ const { el, labels, source, doc, icons } = context;
13
+ if (!source.followers)
14
+ return { button: null, element: null, load: async () => undefined };
15
+ const icon = (0, widgets_1.drawIcon)(doc, 'users', icons);
16
+ const count = el('span', { class: 'fd-followers-count' }, '0');
17
+ const button = el('button', { type: 'button', class: 'fd-button fd-followers-toggle', 'aria-expanded': 'false' }, ...(icon ? [icon] : []), count);
18
+ const list = el('ul', { class: 'fd-follower-list' });
19
+ const none = el('p', { class: 'fd-followers-none', hidden: '' }, labels.noFollowers);
20
+ const find = el('input', { type: 'search', class: 'fd-input', placeholder: labels.search, 'aria-label': labels.addFollower });
21
+ const candidates = el('ul', { class: 'fd-follower-candidates', role: 'listbox', 'aria-label': labels.addFollower });
22
+ const adding = source.follow && source.people ? el('div', { class: 'fd-followers-add' }, el('span', { class: 'fd-followers-add-title' }, labels.addFollower), find, candidates) : null;
23
+ const element = el('div', { class: 'fd-followers', hidden: '', role: 'group', 'aria-label': labels.followers }, list, none, ...(adding ? [adding] : []));
24
+ let followers = [];
25
+ let asking = 0;
26
+ function draw() {
27
+ count.textContent = String(followers.length);
28
+ button.setAttribute('aria-label', `${labels.followers}: ${followers.length}`);
29
+ none.hidden = followers.length > 0;
30
+ list.replaceChildren(...followers.map((follower) => {
31
+ const row = el('li', { class: 'fd-follower' }, el('span', { class: 'fd-follower-name' }, follower.person.name));
32
+ if (source.unfollow) {
33
+ const remove = el('button', { type: 'button', class: 'fd-attachment-remove', 'aria-label': (0, core_1.fill)(labels.removeFollower, { name: follower.person.name }) }, '×');
34
+ remove.addEventListener('click', async () => {
35
+ const record = context.record();
36
+ if (!record || !source.unfollow)
37
+ return;
38
+ await source.unfollow(record, follower.id);
39
+ await load();
40
+ });
41
+ row.append(remove);
42
+ }
43
+ return row;
44
+ }));
45
+ }
46
+ async function suggest() {
47
+ if (!source.people)
48
+ return;
49
+ const mine = ++asking;
50
+ const people = await source.people(find.value);
51
+ if (mine !== asking)
52
+ return;
53
+ const following = new Set(followers.map((f) => f.person.id));
54
+ const offered = people.filter((person) => !following.has(person.id)).slice(0, 8);
55
+ candidates.replaceChildren(...(offered.length
56
+ ? offered.map((person) => {
57
+ const option = el('li', { role: 'option', 'aria-selected': 'false' }, person.name);
58
+ option.addEventListener('click', async () => {
59
+ const record = context.record();
60
+ if (!record || !source.follow)
61
+ return;
62
+ await source.follow(record, person.id);
63
+ find.value = '';
64
+ candidates.replaceChildren();
65
+ await load();
66
+ });
67
+ return option;
68
+ })
69
+ : [el('li', { class: 'fd-empty' }, labels.noOneFound)]));
70
+ }
71
+ async function load() {
72
+ const record = context.record();
73
+ if (!record || !source.followers)
74
+ return;
75
+ followers = await source.followers(record);
76
+ if (context.record() === record)
77
+ draw();
78
+ }
79
+ button.addEventListener('click', () => {
80
+ element.hidden = !element.hidden;
81
+ button.setAttribute('aria-expanded', String(!element.hidden));
82
+ if (!element.hidden && adding)
83
+ find.focus();
84
+ });
85
+ find.addEventListener('input', () => void suggest());
86
+ element.addEventListener('keydown', (event) => {
87
+ if (event.key === 'Escape') {
88
+ element.hidden = true;
89
+ button.setAttribute('aria-expanded', 'false');
90
+ button.focus();
91
+ }
92
+ });
93
+ draw();
94
+ return { button, element, load };
95
+ }
96
+ //# sourceMappingURL=followers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followers.js","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/followers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { fill } from '@fieldia/core';
2
+ import { drawIcon } from '@fieldia/widgets';
3
+ /**
4
+ * Who follows the record: a button with their number, opening the list, where
5
+ * each can be taken away and others found by name and added. Every part the
6
+ * source cannot do is left out, and all of it without `followers`.
7
+ */
8
+ export function followersPart(context) {
9
+ const { el, labels, source, doc, icons } = context;
10
+ if (!source.followers)
11
+ return { button: null, element: null, load: async () => undefined };
12
+ const icon = drawIcon(doc, 'users', icons);
13
+ const count = el('span', { class: 'fd-followers-count' }, '0');
14
+ const button = el('button', { type: 'button', class: 'fd-button fd-followers-toggle', 'aria-expanded': 'false' }, ...(icon ? [icon] : []), count);
15
+ const list = el('ul', { class: 'fd-follower-list' });
16
+ const none = el('p', { class: 'fd-followers-none', hidden: '' }, labels.noFollowers);
17
+ const find = el('input', { type: 'search', class: 'fd-input', placeholder: labels.search, 'aria-label': labels.addFollower });
18
+ const candidates = el('ul', { class: 'fd-follower-candidates', role: 'listbox', 'aria-label': labels.addFollower });
19
+ const adding = source.follow && source.people ? el('div', { class: 'fd-followers-add' }, el('span', { class: 'fd-followers-add-title' }, labels.addFollower), find, candidates) : null;
20
+ const element = el('div', { class: 'fd-followers', hidden: '', role: 'group', 'aria-label': labels.followers }, list, none, ...(adding ? [adding] : []));
21
+ let followers = [];
22
+ let asking = 0;
23
+ function draw() {
24
+ count.textContent = String(followers.length);
25
+ button.setAttribute('aria-label', `${labels.followers}: ${followers.length}`);
26
+ none.hidden = followers.length > 0;
27
+ list.replaceChildren(...followers.map((follower) => {
28
+ const row = el('li', { class: 'fd-follower' }, el('span', { class: 'fd-follower-name' }, follower.person.name));
29
+ if (source.unfollow) {
30
+ const remove = el('button', { type: 'button', class: 'fd-attachment-remove', 'aria-label': fill(labels.removeFollower, { name: follower.person.name }) }, '×');
31
+ remove.addEventListener('click', async () => {
32
+ const record = context.record();
33
+ if (!record || !source.unfollow)
34
+ return;
35
+ await source.unfollow(record, follower.id);
36
+ await load();
37
+ });
38
+ row.append(remove);
39
+ }
40
+ return row;
41
+ }));
42
+ }
43
+ async function suggest() {
44
+ if (!source.people)
45
+ return;
46
+ const mine = ++asking;
47
+ const people = await source.people(find.value);
48
+ if (mine !== asking)
49
+ return;
50
+ const following = new Set(followers.map((f) => f.person.id));
51
+ const offered = people.filter((person) => !following.has(person.id)).slice(0, 8);
52
+ candidates.replaceChildren(...(offered.length
53
+ ? offered.map((person) => {
54
+ const option = el('li', { role: 'option', 'aria-selected': 'false' }, person.name);
55
+ option.addEventListener('click', async () => {
56
+ const record = context.record();
57
+ if (!record || !source.follow)
58
+ return;
59
+ await source.follow(record, person.id);
60
+ find.value = '';
61
+ candidates.replaceChildren();
62
+ await load();
63
+ });
64
+ return option;
65
+ })
66
+ : [el('li', { class: 'fd-empty' }, labels.noOneFound)]));
67
+ }
68
+ async function load() {
69
+ const record = context.record();
70
+ if (!record || !source.followers)
71
+ return;
72
+ followers = await source.followers(record);
73
+ if (context.record() === record)
74
+ draw();
75
+ }
76
+ button.addEventListener('click', () => {
77
+ element.hidden = !element.hidden;
78
+ button.setAttribute('aria-expanded', String(!element.hidden));
79
+ if (!element.hidden && adding)
80
+ find.focus();
81
+ });
82
+ find.addEventListener('input', () => void suggest());
83
+ element.addEventListener('keydown', (event) => {
84
+ if (event.key === 'Escape') {
85
+ element.hidden = true;
86
+ button.setAttribute('aria-expanded', 'false');
87
+ button.focus();
88
+ }
89
+ });
90
+ draw();
91
+ return { button, element, load };
92
+ }
93
+ //# sourceMappingURL=followers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followers.mjs","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/followers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ /** Every word the chatter shows. `{name}`, `{n}` and `{date}` are filled in. */
3
+ export interface ChatterLabels {
4
+ conversation: string;
5
+ sendMessage: string;
6
+ logNote: string;
7
+ send: string;
8
+ log: string;
9
+ cancel: string;
10
+ note: string;
11
+ forFollowers: string;
12
+ forTeam: string;
13
+ empty: string;
14
+ notSaved: string;
15
+ attach: string;
16
+ removeAttachment: string;
17
+ react: string;
18
+ reply: string;
19
+ replyingTo: string;
20
+ activities: string;
21
+ scheduleActivity: string;
22
+ activityType: string;
23
+ summary: string;
24
+ dueDate: string;
25
+ assignedTo: string;
26
+ schedule: string;
27
+ markDone: string;
28
+ whatHappened: string;
29
+ done: string;
30
+ cancelActivity: string;
31
+ overdue: string;
32
+ today: string;
33
+ planned: string;
34
+ dueOn: string;
35
+ followers: string;
36
+ addFollower: string;
37
+ removeFollower: string;
38
+ noFollowers: string;
39
+ search: string;
40
+ noOneFound: string;
41
+ couldNotSend: string;
42
+ }
43
+ export declare const CHATTER_LABELS: Record<Locale, ChatterLabels>;
@@ -0,0 +1,43 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ /** Every word the chatter shows. `{name}`, `{n}` and `{date}` are filled in. */
3
+ export interface ChatterLabels {
4
+ conversation: string;
5
+ sendMessage: string;
6
+ logNote: string;
7
+ send: string;
8
+ log: string;
9
+ cancel: string;
10
+ note: string;
11
+ forFollowers: string;
12
+ forTeam: string;
13
+ empty: string;
14
+ notSaved: string;
15
+ attach: string;
16
+ removeAttachment: string;
17
+ react: string;
18
+ reply: string;
19
+ replyingTo: string;
20
+ activities: string;
21
+ scheduleActivity: string;
22
+ activityType: string;
23
+ summary: string;
24
+ dueDate: string;
25
+ assignedTo: string;
26
+ schedule: string;
27
+ markDone: string;
28
+ whatHappened: string;
29
+ done: string;
30
+ cancelActivity: string;
31
+ overdue: string;
32
+ today: string;
33
+ planned: string;
34
+ dueOn: string;
35
+ followers: string;
36
+ addFollower: string;
37
+ removeFollower: string;
38
+ noFollowers: string;
39
+ search: string;
40
+ noOneFound: string;
41
+ couldNotSend: string;
42
+ }
43
+ export declare const CHATTER_LABELS: Record<Locale, ChatterLabels>;