ideasbugs 0.9.0 → 0.10.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 722346f32d21b2a7007ffb9b04aeda8bf66e8194dc3eaa544bc3ea4bbdb2fe47
4
- data.tar.gz: ca6574200a4e00570ed5a26aa9f4ed758c06192789336f4852622766b471fb5e
3
+ metadata.gz: d3b0669f68f65a7cef3986dac6a2ca57938b1d38942338283593e026003e2688
4
+ data.tar.gz: ed01d83195291ee4cdc81bbf43f043d520c772155780c14a9e070fe0c1e4a2a4
5
5
  SHA512:
6
- metadata.gz: aede97be97f27ce8e4cb615efc2e4ffb864ac7b1a7d09a1c6dc67fe2429a2ebb42cc01b2e65541d41a4a2908406fef9d6a90ae886a1e87ce93d78e51f3ca9d30
7
- data.tar.gz: e1266b1bd43e2a14b5ad92c1fd1f29752bb13ee925d46a1a5939dc9ec3570d625b0d49b8e6de3d17e7cb054e4d066e86493abc8ec26043c567aa6062ffb06ed5
6
+ metadata.gz: 866b49d6047d00eaef7b79bf419fd8d0762e7ab1a5c1ea45c04b6cb121aa7f929c7049ca41bd9dfe7759bedf2fb46d69d6b8b017cf5e612a6be5046008472217
7
+ data.tar.gz: 8f25c5e661173324bce15de5ab9ca6e077d04da693231e3df9cf4e46f5a053062e678a2a8c82caedb2e1b47d2539b81036c97c496eb489f32888b2b1c2b0be4a
data/AGENTS.md CHANGED
@@ -177,6 +177,6 @@ Conventions this codebase holds to — follow them rather than the first thing t
177
177
  - **Attachments stream through the engine's gate**, never a public blob URL.
178
178
  - **The widget is plain JS served same-origin by the engine** — no build step, no framework.
179
179
  - **The dummy app pins `config.active_job.queue_adapter = :test`.** Do not remove it or let it drift back to the `:async` default. Attaching a screenshot enqueues Active Storage's analysis job, and `:async` runs it on a background thread that checks out its own connection — writes no test transaction covers, landing in the middle of whatever runs next. That is a suite that fails order-dependently in a test which never created a row, and it is miserable to trace back.
180
- - **`lib/ideasbugs/dashboard.css` is half shared.** Everything above the `GEM-SPECIFIC` banner is the design system all five gems in the family ship — the same tokens, the same `.page-head`/`.tabs`/`.filters`/`.card`/`.badge`/`button`, the same `.dashboard-shell` + `.record-row` + `.detail-panel` two-pane dashboard — identical in every repo apart from the `ib` prefix. Diff it against a sibling before changing it, and carry the change to the other four. Anything only this gem has goes below the banner. New dashboard markup reuses the shared class names rather than inventing a domain-specific one.
180
+ - **`lib/ideasbugs/dashboard.css` is half shared.** Everything above the `GEM-SPECIFIC` banner is the design system all five gems in the family ship — the same tokens, the same `.page-head`/`.tabs`/`.filters`/`.card`/`.badge`/`button`/`.status-switch`, the same `.dashboard-shell` + `.record-row` + `.detail-panel` two-pane dashboard — identical in every repo apart from the `ib` prefix. Diff it against a sibling before changing it, and carry the change to the other four. Anything only this gem has goes below the banner. New dashboard markup reuses the shared class names rather than inventing a domain-specific one.
181
181
  - Every user-facing change bumps `lib/ideasbugs/version.rb` and adds a `CHANGELOG.md` entry that says what it costs, not only what it adds.
182
182
  - Commit messages are prose that explains the tradeoff — read `git log` before writing one.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.10.1
4
+
5
+ - **The demo inbox now teaches the Ideasbugs workflow.** Its open, in-review,
6
+ and resolved records form a short path through captured request context,
7
+ triage, kinds and sections, search, production authorization, attribution,
8
+ and gated screenshots instead of posing as unrelated customer reports.
9
+ - `ideasbugs:seed_demo` keeps the existing demo identities, so rerunning it
10
+ upgrades those three rows in place. That also means it overwrites edits made
11
+ to the gem-owned demo rows; real feedback is not touched.
12
+
13
+ ## 0.10.0
14
+
15
+ - **Triage is one switch now.** Open, In review and Resolved sit in a single pill
16
+ in the panel heading — the status the report is in is lit in that status's
17
+ colour, the other two are one click away. It replaces the row of `Mark in
18
+ review` / `Mark resolved` / `Reopen` buttons under the message, which grew a
19
+ button per status and read as three unrelated actions rather than one control.
20
+ The status badge left the heading with them: the switch already says it.
21
+ - **The switch is the family's, not this gem's.** It lives in the shared core of
22
+ `dashboard.css` as `.status-switch`, the same component livechat's
23
+ open/resolved switch now uses, so a third gem that needs one inherits it.
24
+ - No JavaScript: each segment is a submit button in one form, and the lit segment
25
+ is a `type="button"` so clicking the status a report already has cannot re-file
26
+ it. If you styled the old `.actions` status buttons, that is the breaking
27
+ change — `PATCH /feedbacks/:id` with `feedback[status]` is unchanged, so any
28
+ script or link that drove triage still works.
29
+
3
30
  ## 0.9.0
4
31
 
5
32
  - **One design system across the family.** The stylesheet now opens with a
@@ -4,11 +4,25 @@
4
4
  <span class="badge kind-<%= feedback.kind.to_s.parameterize %>">
5
5
  <%= t("ideasbugs.kinds.#{feedback.kind}", default: feedback.kind.humanize) %>
6
6
  </span>
7
- <span class="badge status-<%= feedback.status %>">
8
- <%= t("ideasbugs.statuses.#{feedback.status}", default: feedback.status.humanize) %>
9
- </span>
10
7
  <span class="case-id">#<%= feedback.id %></span>
11
8
  </h1>
9
+
10
+ <%# The shared status switch, carrying the status the heading badge used to
11
+ state: the current one is lit and inert, every other one is a submit
12
+ that files the report under it. One form, no JS. %>
13
+ <%= form_with url: feedback_path(feedback), method: :patch, class: 'status-switch' do %>
14
+ <% Ideasbugs::Feedback::STATUSES.each do |status| %>
15
+ <% label = t("ideasbugs.statuses.#{status}", default: status.humanize) %>
16
+ <% if status == feedback.status %>
17
+ <button type="button" class="status-<%= status %> current" aria-current="true"><%= label %></button>
18
+ <% else %>
19
+ <button name="feedback[status]" value="<%= status %>" class="status-<%= status %>"
20
+ aria-label="<%= t("ideasbugs.dashboard.move_to_#{status}", default: "Mark #{status.humanize.downcase}") %>">
21
+ <%= label %>
22
+ </button>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
12
26
  </div>
13
27
 
14
28
  <div class="detail-scroll">
@@ -49,13 +63,9 @@
49
63
  <% end %>
50
64
  </div>
51
65
 
66
+ <%# Status lives in the switch in the heading; only what a switch cannot say
67
+ is left here. %>
52
68
  <div class="actions">
53
- <% (Ideasbugs::Feedback::STATUSES - [feedback.status]).each do |status| %>
54
- <%= button_to t("ideasbugs.dashboard.move_to_#{status}", default: "Mark #{status.humanize.downcase}"),
55
- feedback_path(feedback),
56
- method: :patch, params: { feedback: { status: status } },
57
- class: ('primary' if status == 'resolved') %>
58
- <% end %>
59
69
  <%= button_to t('ideasbugs.dashboard.delete', default: 'Delete'),
60
70
  feedback_path(feedback),
61
71
  method: :delete, class: 'danger',
@@ -144,6 +144,19 @@
144
144
  & .actions form { display: inline; }
145
145
  & .form-actions { padding-top: 12px; }
146
146
 
147
+ /* Status switch: one pill holding every state a record can be in, the state it
148
+ is in now lit. Each other segment is a submit button, so moving a record
149
+ takes one click and no JavaScript; the current segment is a `type="button"`
150
+ so clicking it cannot re-file the record it is already filed under. Two
151
+ states or five, the pill sizes itself. A gem tints the lit segment with its
152
+ own status colour — see the `GEM-SPECIFIC` section. */
153
+ & .status-switch { display: inline-flex; flex: 0 0 auto; margin: 0; padding: 3px; border: 1px solid var(--ib-border); border-radius: 999px; background: var(--ib-bg); }
154
+ & .status-switch button { min-height: 30px; padding: 0 12px; border: 0; border-radius: 999px; background: none; color: var(--ib-muted); font-size: 13px; font-weight: 700; white-space: nowrap; transition: background .16s ease, color .16s ease; }
155
+ & .status-switch button:hover { border: 0; background: color-mix(in srgb, var(--ib-muted) 12%, transparent); color: var(--ib-text); }
156
+ & .status-switch button.current { background: var(--ib-surface); color: var(--ib-text); box-shadow: 0 1px 2px rgba(15, 23, 42, .12); cursor: default; }
157
+ & .status-switch button.current:hover { background: var(--ib-surface); }
158
+ & .panel-head .status-switch { margin-left: auto; }
159
+
147
160
  & .card { overflow: hidden; border: 1px solid var(--ib-border); border-radius: 12px; background: var(--ib-surface); }
148
161
  & .card.pad { padding: 16px; overflow: visible; }
149
162
  & table { width: 100%; border-collapse: collapse; }
@@ -266,6 +279,7 @@
266
279
  & .dashboard-detail .detail-panel { min-height: calc(100vh - 64px); }
267
280
  & .mobile-back { display: block; flex: 0 0 auto; margin: 4px 0 10px; font-size: 13px; }
268
281
  & .panel-head h1 { font-size: 18px; }
282
+ & .status-switch button { padding: 0 9px; font-size: 12px; }
269
283
  & dl { grid-template-columns: 1fr; gap: 3px; }
270
284
  & dd { margin-bottom: 8px; }
271
285
  }
@@ -294,6 +308,12 @@
294
308
  & .badge.status-in_review { background: var(--ib-in-review); }
295
309
  & .badge.status-resolved { background: var(--ib-resolved); }
296
310
 
311
+ /* The lit segment of the status switch carries the same colour as the badge
312
+ for that status, so the panel and the queue agree at a glance. */
313
+ & .status-switch button.current.status-open { color: var(--ib-open); }
314
+ & .status-switch button.current.status-in_review { color: var(--ib-in-review); }
315
+ & .status-switch button.current.status-resolved { color: var(--ib-resolved); }
316
+
297
317
  & .shots { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 8px; }
298
318
  & .shots img { max-width: 280px; max-height: 200px; border: 1px solid var(--ib-border); border-radius: 8px; }
299
319
  }
@@ -6,29 +6,35 @@ module Ideasbugs
6
6
  {
7
7
  seed_id: 'checkout-error',
8
8
  kind: 'bug',
9
- section: 'Checkout',
10
- message: 'The payment form shows "Something went wrong" after entering a valid card.',
9
+ section: '1. Try triage',
10
+ message: 'Start here: this open bug shows what the widget captures kind, section, page URL, ' \
11
+ 'browser context, and an author when you configure one. Move it to In review as your ' \
12
+ 'first triage action.',
11
13
  status: 'open',
12
- page_url: '/checkout',
13
- author_label: 'Demo Customer'
14
+ page_url: '/checkout?demo=ideasbugs',
15
+ author_label: 'Demo customer · open this first'
14
16
  },
15
17
  {
16
18
  seed_id: 'saved-filters',
17
19
  kind: 'feature',
18
- section: 'Reports',
19
- message: 'It would save time if I could save this report filter and reuse it next week.',
20
+ section: '2. Shape the inbox',
21
+ message: 'This feature request is already In review so you can compare workflow states. Set ' \
22
+ 'config.sections to your product areas, adjust config.kinds if needed, then use the board ' \
23
+ 'filters and search to keep recurring themes visible.',
20
24
  status: 'in_review',
21
- page_url: '/reports/revenue',
22
- author_label: 'Demo Product Manager'
25
+ page_url: '/reports?demo=ideasbugs',
26
+ author_label: 'Demo product manager · compare states'
23
27
  },
24
28
  {
25
29
  seed_id: 'export-confusing',
26
30
  kind: 'other',
27
- section: 'Settings',
28
- message: 'The CSV export worked, but I expected the button to say when the file was ready.',
31
+ section: '3. Ship safely',
32
+ message: 'This resolved item is your launch checklist: render ideasbugs_tag, set authorize_admin ' \
33
+ 'before production, and configure current_user plus author_label when you want attributed ' \
34
+ 'feedback. Screenshots remain behind the dashboard gate.',
29
35
  status: 'resolved',
30
- page_url: '/settings/exports',
31
- author_label: 'Demo Admin'
36
+ page_url: '/settings?demo=ideasbugs',
37
+ author_label: 'Demo admin · launch checklist'
32
38
  }
33
39
  ].freeze
34
40
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ideasbugs
4
- VERSION = '0.9.0'
4
+ VERSION = '0.10.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ideasbugs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yaroslav Shmarov
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  - !ruby/object:Gem::Version
121
121
  version: '0'
122
122
  requirements: []
123
- rubygems_version: 3.6.9
123
+ rubygems_version: 4.0.10
124
124
  specification_version: 4
125
125
  summary: 'In-app product feedback collection for Rails: a drop-in widget and a built-in
126
126
  triage dashboard.'