@shardworks/spider-apparatus 0.1.139 → 0.1.140

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.
package/dist/types.d.ts CHANGED
@@ -442,6 +442,8 @@ export interface ChoiceQuestionSpec {
442
442
  label: string;
443
443
  /** Optional long-form context, explanation, or instructions for this question. */
444
444
  details?: string;
445
+ /** Optional classification tags for filtering and grouping in the UI. */
446
+ tags?: string[];
445
447
  /** Key → display label options map. */
446
448
  options: Record<string, string>;
447
449
  /** When true, the patron can supply a freeform answer instead of selecting. */
@@ -453,6 +455,8 @@ export interface BooleanQuestionSpec {
453
455
  label: string;
454
456
  /** Optional long-form context, explanation, or instructions for this question. */
455
457
  details?: string;
458
+ /** Optional classification tags for filtering and grouping in the UI. */
459
+ tags?: string[];
456
460
  }
457
461
  export interface TextQuestionSpec {
458
462
  type: 'text';
@@ -460,6 +464,8 @@ export interface TextQuestionSpec {
460
464
  label: string;
461
465
  /** Optional long-form context, explanation, or instructions for this question. */
462
466
  details?: string;
467
+ /** Optional classification tags for filtering and grouping in the UI. */
468
+ tags?: string[];
463
469
  }
464
470
  export type QuestionSpec = ChoiceQuestionSpec | BooleanQuestionSpec | TextQuestionSpec;
465
471
  /** Discriminated choice answer — selected from options or freeform custom. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shardworks/spider-apparatus",
3
- "version": "0.1.139",
3
+ "version": "0.1.140",
4
4
  "license": "ISC",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,13 +19,13 @@
19
19
  "hono": "^4.7.11",
20
20
  "yaml": "^2.0.0",
21
21
  "zod": "4.3.6",
22
- "@shardworks/nexus-core": "0.1.139",
23
- "@shardworks/stacks-apparatus": "0.1.139",
24
- "@shardworks/fabricator-apparatus": "0.1.139",
25
- "@shardworks/clerk-apparatus": "0.1.139",
26
- "@shardworks/tools-apparatus": "0.1.139",
27
- "@shardworks/codexes-apparatus": "0.1.139",
28
- "@shardworks/animator-apparatus": "0.1.139"
22
+ "@shardworks/fabricator-apparatus": "0.1.140",
23
+ "@shardworks/nexus-core": "0.1.140",
24
+ "@shardworks/stacks-apparatus": "0.1.140",
25
+ "@shardworks/clerk-apparatus": "0.1.140",
26
+ "@shardworks/animator-apparatus": "0.1.140",
27
+ "@shardworks/codexes-apparatus": "0.1.140",
28
+ "@shardworks/tools-apparatus": "0.1.140"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "25.5.0"
@@ -184,3 +184,131 @@ describe('feedback.js custom choice option', () => {
184
184
  );
185
185
  });
186
186
  });
187
+
188
+ // ── Tag badge rendering ──────────────────────────────────────────────
189
+
190
+ describe('feedback.js tag badge rendering', () => {
191
+ it('defines a renderTags helper function', () => {
192
+ assert.match(
193
+ feedbackJs,
194
+ /function renderTags\(spec\)/,
195
+ 'must define a renderTags helper function',
196
+ );
197
+ });
198
+
199
+ it('renders tag badges with the .tag CSS class', () => {
200
+ assert.match(
201
+ feedbackJs,
202
+ /class="tag"/,
203
+ 'must render tags with class="tag"',
204
+ );
205
+ });
206
+
207
+ it('returns empty string when spec.tags is falsy or empty', () => {
208
+ assert.match(
209
+ feedbackJs,
210
+ /!spec\.tags\s*\|\|\s*spec\.tags\.length\s*===\s*0.*return\s*''/,
211
+ 'renderTags must return empty string for falsy or empty tags',
212
+ );
213
+ });
214
+
215
+ it('calls renderTags in choice question renderer after question-label', () => {
216
+ assert.match(
217
+ feedbackJs,
218
+ /question-label.*?<\/span>'\s*\+\s*renderTags\(spec\)\s*\+\s*'<\/div>/,
219
+ 'choice renderer must call renderTags after question-label span',
220
+ );
221
+ });
222
+
223
+ it('calls renderTags in boolean question renderer after boolean-label', () => {
224
+ assert.match(
225
+ feedbackJs,
226
+ /boolean-label.*?<\/span>'\s*\+\s*renderTags\(spec\)/,
227
+ 'boolean renderer must call renderTags after boolean-label span',
228
+ );
229
+ });
230
+
231
+ it('calls renderTags in text question renderer after label', () => {
232
+ assert.match(
233
+ feedbackJs,
234
+ /<\/label>'\s*\n\s*\+\s*renderTags\(spec\)\s*\n\s*\+\s*'<textarea/,
235
+ 'text renderer must call renderTags between label and textarea',
236
+ );
237
+ });
238
+ });
239
+
240
+ // ── Tag filter toolbar ───────────────────────────────────────────────
241
+
242
+ describe('feedback.js tag filter toolbar', () => {
243
+ it('creates toolbar element with tag-filter-toolbar ID', () => {
244
+ assert.match(
245
+ feedbackJs,
246
+ /id\s*=\s*'tag-filter-toolbar'/,
247
+ 'must create a toolbar element with id tag-filter-toolbar',
248
+ );
249
+ });
250
+
251
+ it('creates tag filter buttons with tag-filter-btn class', () => {
252
+ assert.match(
253
+ feedbackJs,
254
+ /tag-filter-btn/,
255
+ 'must create buttons with tag-filter-btn class',
256
+ );
257
+ });
258
+
259
+ it('stores active tag filter state in activeTagFilters variable', () => {
260
+ assert.match(
261
+ feedbackJs,
262
+ /var activeTagFilters\s*=\s*\{\}/,
263
+ 'must declare activeTagFilters state variable',
264
+ );
265
+ });
266
+
267
+ it('defines an applyTagFilters function', () => {
268
+ assert.match(
269
+ feedbackJs,
270
+ /function applyTagFilters\(\)/,
271
+ 'must define an applyTagFilters function',
272
+ );
273
+ });
274
+
275
+ it('sorts tags alphabetically for toolbar display', () => {
276
+ assert.match(
277
+ feedbackJs,
278
+ /Object\.keys\(tagSet\)\.sort\(\)/,
279
+ 'must sort tags alphabetically using .sort()',
280
+ );
281
+ });
282
+
283
+ it('includes a clear filters button with tag-filter-clear class', () => {
284
+ assert.match(
285
+ feedbackJs,
286
+ /tag-filter-clear/,
287
+ 'must include a clear filters element with tag-filter-clear class',
288
+ );
289
+ });
290
+
291
+ it('displays showing count with tag-filter-count class', () => {
292
+ assert.match(
293
+ feedbackJs,
294
+ /tag-filter-count/,
295
+ 'must include a count display with tag-filter-count class',
296
+ );
297
+ });
298
+
299
+ it('clears activeTagFilters in navigateToList', () => {
300
+ assert.match(
301
+ feedbackJs,
302
+ /activeTagFilters\s*=\s*\{\};\s*\n\s*detailView/,
303
+ 'navigateToList must reset activeTagFilters before hiding detail view',
304
+ );
305
+ });
306
+
307
+ it('removes existing toolbar before re-rendering', () => {
308
+ assert.match(
309
+ feedbackJs,
310
+ /getElementById\('tag-filter-toolbar'\);\s*\n\s*if\s*\(oldToolbar\)\s*oldToolbar\.remove\(\)/,
311
+ 'renderDetail must remove existing tag-filter-toolbar on re-render',
312
+ );
313
+ });
314
+ });
@@ -7,6 +7,50 @@
7
7
  margin-bottom: 12px;
8
8
  }
9
9
 
10
+ /* ── Tag filter toolbar ─────────────────────────────────────────────── */
11
+
12
+ .tag-filter-btn {
13
+ padding: 4px 10px;
14
+ font-size: 11px;
15
+ font-family: inherit;
16
+ border: 1px solid var(--border);
17
+ border-radius: 4px;
18
+ background: var(--surface);
19
+ color: var(--text-dim);
20
+ cursor: pointer;
21
+ transition: all 0.15s;
22
+ }
23
+ .tag-filter-btn:hover {
24
+ border-color: var(--cyan);
25
+ color: var(--text);
26
+ }
27
+ .tag-filter-btn.active {
28
+ background: var(--cyan);
29
+ border-color: var(--cyan);
30
+ color: var(--bg);
31
+ }
32
+
33
+ .tag-filter-count {
34
+ font-size: 11px;
35
+ color: var(--text-dim);
36
+ margin-left: auto;
37
+ }
38
+
39
+ .tag-filter-clear {
40
+ padding: 4px 10px;
41
+ font-size: 11px;
42
+ font-family: inherit;
43
+ border: 1px solid var(--border);
44
+ border-radius: 4px;
45
+ background: transparent;
46
+ color: var(--text-dim);
47
+ cursor: pointer;
48
+ }
49
+ .tag-filter-clear:hover {
50
+ color: var(--text);
51
+ border-color: var(--text-dim);
52
+ }
53
+
10
54
  /* ── Request cards (list view) ───────────────────────────────────────── */
11
55
 
12
56
  .request-card {
@@ -76,6 +120,20 @@
76
120
  color: var(--text-bright);
77
121
  }
78
122
 
123
+ /* ── Tag badges ─────────────────────────────────────────────────────── */
124
+
125
+ .tag {
126
+ display: inline-block;
127
+ padding: 2px 8px;
128
+ font-size: 11px;
129
+ font-weight: 500;
130
+ color: var(--text-dim);
131
+ background: var(--surface2);
132
+ border-radius: 4px;
133
+ margin-left: 6px;
134
+ vertical-align: middle;
135
+ }
136
+
79
137
  /* ── Choice option rows ──────────────────────────────────────────────── */
80
138
 
81
139
  .option {
@@ -8,6 +8,7 @@
8
8
  var localAnswers = {};
9
9
  var pollTimer = null;
10
10
  var debounceTimers = {};
11
+ var activeTagFilters = {};
11
12
 
12
13
  // ── API endpoints ──────────────────────────────────────────────────────
13
14
 
@@ -186,6 +187,70 @@
186
187
  }
187
188
  questionsContainer.innerHTML = html;
188
189
 
190
+ // Tag filter toolbar
191
+ var oldToolbar = document.getElementById('tag-filter-toolbar');
192
+ if (oldToolbar) oldToolbar.remove();
193
+
194
+ var tagSet = {};
195
+ for (var t = 0; t < qKeys.length; t++) {
196
+ var qSpec = req.questions[qKeys[t]];
197
+ if (qSpec.tags && qSpec.tags.length > 0) {
198
+ for (var tt = 0; tt < qSpec.tags.length; tt++) {
199
+ tagSet[qSpec.tags[tt]] = true;
200
+ }
201
+ }
202
+ }
203
+ var allTags = Object.keys(tagSet).sort();
204
+
205
+ if (allTags.length > 0) {
206
+ var toolbar = document.createElement('div');
207
+ toolbar.id = 'tag-filter-toolbar';
208
+ toolbar.className = 'toolbar';
209
+
210
+ for (var b = 0; b < allTags.length; b++) {
211
+ var btn = document.createElement('button');
212
+ btn.className = 'tag-filter-btn' + (activeTagFilters[allTags[b]] ? ' active' : '');
213
+ btn.setAttribute('data-tag', allTags[b]);
214
+ btn.textContent = allTags[b];
215
+ toolbar.appendChild(btn);
216
+ }
217
+
218
+ var countSpan = document.createElement('span');
219
+ countSpan.className = 'tag-filter-count';
220
+ countSpan.style.display = 'none';
221
+ toolbar.appendChild(countSpan);
222
+
223
+ var clearBtn = document.createElement('button');
224
+ clearBtn.className = 'tag-filter-clear';
225
+ clearBtn.textContent = 'Clear filters';
226
+ clearBtn.style.display = 'none';
227
+ toolbar.appendChild(clearBtn);
228
+
229
+ toolbar.addEventListener('click', function (e) {
230
+ if (e.target.matches('.tag-filter-btn')) {
231
+ var tag = e.target.getAttribute('data-tag');
232
+ if (activeTagFilters[tag]) {
233
+ delete activeTagFilters[tag];
234
+ e.target.classList.remove('active');
235
+ } else {
236
+ activeTagFilters[tag] = true;
237
+ e.target.classList.add('active');
238
+ }
239
+ applyTagFilters();
240
+ } else if (e.target.matches('.tag-filter-clear')) {
241
+ activeTagFilters = {};
242
+ var btns = toolbar.querySelectorAll('.tag-filter-btn');
243
+ for (var j = 0; j < btns.length; j++) {
244
+ btns[j].classList.remove('active');
245
+ }
246
+ applyTagFilters();
247
+ }
248
+ });
249
+
250
+ questionsContainer.parentNode.insertBefore(toolbar, questionsContainer);
251
+ applyTagFilters();
252
+ }
253
+
189
254
  // Action bar
190
255
  if (isPending) {
191
256
  var total = qKeys.length;
@@ -212,7 +277,7 @@
212
277
  var isCustomSelected = answer != null && 'custom' in answer;
213
278
 
214
279
  var html = '<div class="question-card' + readonlyClass + '" data-question-key="' + esc(qKey) + '">'
215
- + '<div class="question-header"><span class="question-label">' + esc(spec.label) + '</span></div>'
280
+ + '<div class="question-header"><span class="question-label">' + esc(spec.label) + '</span>' + renderTags(spec) + '</div>'
216
281
  + '<div class="options-list">';
217
282
 
218
283
  var optKeys = Object.keys(spec.options);
@@ -264,7 +329,7 @@
264
329
  var html = '<div class="question-card' + readonlyClass + '" data-question-key="' + esc(qKey) + '">'
265
330
  + '<div class="boolean-item' + stateClass + '" data-question-key="' + esc(qKey) + '">'
266
331
  + '<div class="boolean-toggle">' + icon + '</div>'
267
- + '<span class="boolean-label">' + esc(spec.label) + '</span>'
332
+ + '<span class="boolean-label">' + esc(spec.label) + '</span>' + renderTags(spec)
268
333
  + '</div>';
269
334
 
270
335
  html += renderDetails(spec);
@@ -279,6 +344,7 @@
279
344
  var html = '<div class="question-card' + readonlyClass + '" data-question-key="' + esc(qKey) + '">'
280
345
  + '<div class="text-question">'
281
346
  + '<label>' + esc(spec.label) + '</label>'
347
+ + renderTags(spec)
282
348
  + '<textarea data-question-key="' + esc(qKey) + '" data-text-input="true">'
283
349
  + esc(answer) + '</textarea>'
284
350
  + '</div>';
@@ -288,6 +354,17 @@
288
354
  return html;
289
355
  }
290
356
 
357
+ // ── Shared tag badge renderer ───────────────────────────────────────────
358
+
359
+ function renderTags(spec) {
360
+ if (!spec.tags || spec.tags.length === 0) return '';
361
+ var html = '';
362
+ for (var i = 0; i < spec.tags.length; i++) {
363
+ html += '<span class="tag">' + esc(spec.tags[i]) + '</span>';
364
+ }
365
+ return html;
366
+ }
367
+
291
368
  // ── Shared details renderer ────────────────────────────────────────────
292
369
 
293
370
  function renderDetails(spec) {
@@ -298,6 +375,59 @@
298
375
  + '</details>';
299
376
  }
300
377
 
378
+ // ── Tag filter application ─────────────────────────────────────────────
379
+
380
+ function applyTagFilters() {
381
+ var cards = questionsContainer.querySelectorAll('.question-card');
382
+ var filterKeys = Object.keys(activeTagFilters);
383
+ var toolbar = document.getElementById('tag-filter-toolbar');
384
+
385
+ if (filterKeys.length === 0) {
386
+ for (var i = 0; i < cards.length; i++) {
387
+ cards[i].style.display = '';
388
+ }
389
+ if (toolbar) {
390
+ var countEl = toolbar.querySelector('.tag-filter-count');
391
+ var clearEl = toolbar.querySelector('.tag-filter-clear');
392
+ if (countEl) countEl.style.display = 'none';
393
+ if (clearEl) clearEl.style.display = 'none';
394
+ }
395
+ return;
396
+ }
397
+
398
+ var visibleCount = 0;
399
+ var totalCount = cards.length;
400
+ for (var i = 0; i < cards.length; i++) {
401
+ var qKey = cards[i].getAttribute('data-question-key');
402
+ var spec = currentRequest.questions[qKey];
403
+ var match = false;
404
+ if (spec && spec.tags) {
405
+ for (var j = 0; j < spec.tags.length; j++) {
406
+ if (activeTagFilters[spec.tags[j]]) {
407
+ match = true;
408
+ break;
409
+ }
410
+ }
411
+ }
412
+ if (match) {
413
+ cards[i].style.display = '';
414
+ visibleCount++;
415
+ } else {
416
+ cards[i].style.display = 'none';
417
+ }
418
+ }
419
+
420
+ if (toolbar) {
421
+ var countEl = toolbar.querySelector('.tag-filter-count');
422
+ var clearEl = toolbar.querySelector('.tag-filter-clear');
423
+ if (countEl) {
424
+ countEl.textContent = 'Showing ' + visibleCount + ' of ' + totalCount;
425
+ countEl.style.display = '';
426
+ }
427
+ if (clearEl) clearEl.style.display = '';
428
+ }
429
+ }
430
+
301
431
  // ── Auto-save ──────────────────────────────────────────────────────────
302
432
 
303
433
  function saveAnswer(questionKey, body, newLocalVal) {
@@ -371,6 +501,7 @@
371
501
  clearTimeout(debounceTimers[dKeys[i]]);
372
502
  }
373
503
  debounceTimers = {};
504
+ activeTagFilters = {};
374
505
 
375
506
  detailView.style.display = 'none';
376
507
  listView.style.display = '';