source_monitor 0.12.2 → 0.12.3

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: 5d486150a247d6426c77e40b7306301bd967eb1a80c72b41d34848e61dc80da9
4
- data.tar.gz: e03c6a89c6489c5eebe80c92114eca5fd50c4392cb91fc8af6ab910bdf799f83
3
+ metadata.gz: a6bd1ceac36f485b9a9dffbd4c9665082496268093ff999b4d80ce21e973c904
4
+ data.tar.gz: 613a81d29bf56f6206a65299fc0784fc79e4137434dedbc6ae0d49dcde73d881
5
5
  SHA512:
6
- metadata.gz: 63bae750930fe17357756931c8c800f67583d57c64e45e3fc9617497b2b9deeef44faa9dedfe5d20d41724cba1710d8193d93fd4c308ad7c62b63ddccf24cb20
7
- data.tar.gz: 5efdcf7a4ec4cc880f04d0df60f33ce3c488817682040ae49cc31a00f4107180c0c9e65fc6f72505abc182bc5b301f50dbad8c5dc3455252b01c593a34105b9f
6
+ metadata.gz: bfa2c1455721d08030777b3aaf93db2440716d93102e5ae1464ed63d6f4da8d38024af56f76b2fb263c902d3a0ca7ce4e53955a97686baaa42539cd9e3be6dd7
7
+ data.tar.gz: 1540e2e2595f91e4aec25c6772cdc54dc6a1636dd5d605874b0afe05f2ca6773e1adfb4e06df25df9343d69a9b3c2d6501b66aa29525a7413e2d71de24ae9fbb
@@ -2,6 +2,15 @@
2
2
 
3
3
  Version-specific migration notes for each major/minor version transition. Agents should reference this file when guiding users through multi-version upgrades.
4
4
 
5
+ ## 0.12.2 to 0.12.3
6
+
7
+ **Key changes:**
8
+ - UI fixes: menu icon rendering (gear -> vertical ellipsis), modal Stimulus controller scope, cross-page select-all for bulk scraping recommendations
9
+
10
+ **Action items:**
11
+ 1. `bundle update source_monitor`
12
+ 2. No migrations, config changes, or breaking changes.
13
+
5
14
  ## 0.12.1 to 0.12.2
6
15
 
7
16
  **Key changes:**
data/CHANGELOG.md CHANGED
@@ -15,6 +15,15 @@ All notable changes to this project are documented below. The format follows [Ke
15
15
 
16
16
  - No unreleased changes yet.
17
17
 
18
+ ## [0.12.3] - 2026-03-16
19
+
20
+ ### Added
21
+ - Cross-page "select all" for scraping recommendations — banner appears when candidates span multiple pages, backend resolves all candidates via query
22
+
23
+ ### Fixed
24
+ - Source action dropdown icon rendered as gear instead of vertical ellipsis (three dots)
25
+ - "Enable Scraping" button did not open confirmation modal — Stimulus controller scope and missing `stop` method fixed
26
+
18
27
  ## [0.12.2] - 2026-03-15
19
28
 
20
29
  ### Fixed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- source_monitor (0.12.2)
4
+ source_monitor (0.12.3)
5
5
  cssbundling-rails (~> 1.4)
6
6
  faraday (~> 2.9)
7
7
  faraday-follow_redirects (~> 0.4)
data/README.md CHANGED
@@ -9,8 +9,8 @@ SourceMonitor is a production-ready Rails 8 mountable engine for ingesting, norm
9
9
  In your host Rails app:
10
10
 
11
11
  ```bash
12
- bundle add source_monitor --version "~> 0.12.2"
13
- # or add `gem "source_monitor", "~> 0.12.2"` manually, then run:
12
+ bundle add source_monitor --version "~> 0.12.3"
13
+ # or add `gem "source_monitor", "~> 0.12.3"` manually, then run:
14
14
  bundle install
15
15
  ```
16
16
 
@@ -46,7 +46,7 @@ This exposes `bin/source_monitor` (via Bundler binstubs) so you can run the guid
46
46
  Before running any SourceMonitor commands inside your host app, add the gem and install dependencies:
47
47
 
48
48
  ```bash
49
- bundle add source_monitor --version "~> 0.12.2"
49
+ bundle add source_monitor --version "~> 0.12.3"
50
50
  # or edit your Gemfile, then run
51
51
  bundle install
52
52
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.2
1
+ 0.12.3
@@ -1280,6 +1280,11 @@ video {
1280
1280
  border-color: rgb(221 214 254 / var(--tw-border-opacity, 1));
1281
1281
  }
1282
1282
 
1283
+ .fm-admin .border-violet-100 {
1284
+ --tw-border-opacity: 1;
1285
+ border-color: rgb(237 233 254 / var(--tw-border-opacity, 1));
1286
+ }
1287
+
1283
1288
  .fm-admin .bg-amber-100 {
1284
1289
  --tw-bg-opacity: 1;
1285
1290
  background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1));
@@ -1861,6 +1866,11 @@ video {
1861
1866
  color: rgb(161 98 7 / var(--tw-text-opacity, 1));
1862
1867
  }
1863
1868
 
1869
+ .fm-admin .text-violet-900 {
1870
+ --tw-text-opacity: 1;
1871
+ color: rgb(76 29 149 / var(--tw-text-opacity, 1));
1872
+ }
1873
+
1864
1874
  .fm-admin .underline {
1865
1875
  text-decoration-line: underline;
1866
1876
  }
@@ -2059,6 +2069,11 @@ video {
2059
2069
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
2060
2070
  }
2061
2071
 
2072
+ .fm-admin .hover\:text-violet-600:hover {
2073
+ --tw-text-opacity: 1;
2074
+ color: rgb(124 58 237 / var(--tw-text-opacity, 1));
2075
+ }
2076
+
2062
2077
  .fm-admin .hover\:underline:hover {
2063
2078
  text-decoration-line: underline;
2064
2079
  }
@@ -2706,6 +2706,9 @@ var modal_controller_default = class extends Controller {
2706
2706
  this.close(event);
2707
2707
  }
2708
2708
  }
2709
+ stop(event) {
2710
+ event.stopPropagation();
2711
+ }
2709
2712
  handleEscape(event) {
2710
2713
  if (event.key === "Escape") {
2711
2714
  this.close(event);
@@ -2796,7 +2799,15 @@ var confirm_navigation_controller_default = class extends Controller {
2796
2799
 
2797
2800
  // app/assets/javascripts/source_monitor/controllers/select_all_controller.js
2798
2801
  var select_all_controller_default = class extends Controller {
2799
- static targets = ["master", "item", "actionBar", "count"];
2802
+ static targets = [
2803
+ "master",
2804
+ "item",
2805
+ "actionBar",
2806
+ "count",
2807
+ "crossPageBanner",
2808
+ "selectAllPagesInput"
2809
+ ];
2810
+ static values = { totalCandidates: Number };
2800
2811
  connect() {
2801
2812
  this.syncMaster();
2802
2813
  this.updateActionBar();
@@ -2815,12 +2826,50 @@ var select_all_controller_default = class extends Controller {
2815
2826
  if (checkbox.disabled) return;
2816
2827
  checkbox.checked = checked;
2817
2828
  });
2829
+ if (!checked) {
2830
+ this.deselectAllPages();
2831
+ }
2818
2832
  this.updateActionBar();
2819
2833
  }
2820
2834
  toggleItem() {
2835
+ this.deselectAllPages();
2821
2836
  this.syncMaster();
2822
2837
  this.updateActionBar();
2823
2838
  }
2839
+ selectAllPages() {
2840
+ if (this.hasSelectAllPagesInputTarget) {
2841
+ this.selectAllPagesInputTarget.disabled = false;
2842
+ }
2843
+ if (this.hasCrossPageBannerTarget) {
2844
+ this.crossPageBannerTarget.dataset.selected = "true";
2845
+ const deselect = this.crossPageBannerTarget.querySelector(
2846
+ "[data-role='deselect']"
2847
+ );
2848
+ const select = this.crossPageBannerTarget.querySelector(
2849
+ "[data-role='select']"
2850
+ );
2851
+ if (deselect) deselect.classList.remove("hidden");
2852
+ if (select) select.classList.add("hidden");
2853
+ }
2854
+ this.updateCount();
2855
+ }
2856
+ deselectAllPages() {
2857
+ if (this.hasSelectAllPagesInputTarget) {
2858
+ this.selectAllPagesInputTarget.disabled = true;
2859
+ }
2860
+ if (this.hasCrossPageBannerTarget) {
2861
+ this.crossPageBannerTarget.dataset.selected = "false";
2862
+ const deselect = this.crossPageBannerTarget.querySelector(
2863
+ "[data-role='deselect']"
2864
+ );
2865
+ const select = this.crossPageBannerTarget.querySelector(
2866
+ "[data-role='select']"
2867
+ );
2868
+ if (deselect) deselect.classList.add("hidden");
2869
+ if (select) select.classList.remove("hidden");
2870
+ }
2871
+ this.updateCount();
2872
+ }
2824
2873
  syncMaster() {
2825
2874
  if (!this.hasMasterTarget) return;
2826
2875
  const selectable = this.itemTargets.filter((checkbox) => !checkbox.disabled);
@@ -2830,15 +2879,36 @@ var select_all_controller_default = class extends Controller {
2830
2879
  updateActionBar() {
2831
2880
  if (!this.hasActionBarTarget) return;
2832
2881
  const checkedCount = this.itemTargets.filter((cb) => cb.checked).length;
2833
- if (this.hasCountTarget) {
2834
- this.countTarget.textContent = checkedCount;
2835
- }
2882
+ this.updateCount();
2883
+ this.updateCrossPageBanner();
2836
2884
  if (checkedCount > 0) {
2837
2885
  this.actionBarTarget.classList.remove("hidden");
2838
2886
  } else {
2839
2887
  this.actionBarTarget.classList.add("hidden");
2840
2888
  }
2841
2889
  }
2890
+ updateCount() {
2891
+ if (!this.hasCountTarget) return;
2892
+ const isAllPages = this.hasCrossPageBannerTarget && this.crossPageBannerTarget.dataset.selected === "true";
2893
+ if (isAllPages && this.hasTotalCandidatesValue) {
2894
+ this.countTarget.textContent = this.totalCandidatesValue;
2895
+ } else {
2896
+ const checkedCount = this.itemTargets.filter((cb) => cb.checked).length;
2897
+ this.countTarget.textContent = checkedCount;
2898
+ }
2899
+ }
2900
+ updateCrossPageBanner() {
2901
+ if (!this.hasCrossPageBannerTarget) return;
2902
+ const selectable = this.itemTargets.filter((cb) => !cb.disabled);
2903
+ const allChecked = selectable.length > 0 && selectable.every((cb) => cb.checked);
2904
+ const hasMorePages = this.hasTotalCandidatesValue && this.totalCandidatesValue > selectable.length;
2905
+ if (allChecked && hasMorePages) {
2906
+ this.crossPageBannerTarget.classList.remove("hidden");
2907
+ } else {
2908
+ this.crossPageBannerTarget.classList.add("hidden");
2909
+ this.deselectAllPages();
2910
+ }
2911
+ }
2842
2912
  };
2843
2913
 
2844
2914
  // app/assets/javascripts/source_monitor/controllers/filter_submit_controller.js