From 4d2ddffbde9d19453273d8192bd15d8459a4cff5 Mon Sep 17 00:00:00 2001 From: Kevin Custer Date: Sat, 31 Jul 2021 16:50:38 -0400 Subject: [PATCH 1/3] Dependency update --- Gemfile.lock | 18 ++++---- yarn.lock | 113 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 75 insertions(+), 56 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a95b3ba..4ff6c70 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -68,14 +68,14 @@ GEM public_suffix (>= 2.0.2, < 5.0) ast (2.4.2) aws-eventstream (1.1.1) - aws-partitions (1.479.0) - aws-sdk-core (3.117.0) + aws-partitions (1.482.0) + aws-sdk-core (3.119.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.44.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (1.46.0) + aws-sdk-core (~> 3, >= 3.119.0) aws-sigv4 (~> 1.1) aws-sdk-s3 (1.87.0) aws-sdk-core (~> 3, >= 3.109.0) @@ -133,8 +133,8 @@ GEM figaro (1.2.0) thor (>= 0.14.0, < 2) foreman (0.87.2) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (0.5.1) + activesupport (>= 5.0) hiredis (0.6.3) i18n (1.8.10) concurrent-ruby (~> 1.0) @@ -227,7 +227,7 @@ GEM ffi (~> 1.0) recaptcha (5.6.0) json - redis (4.3.1) + redis (4.4.0) regexp_parser (2.1.1) request_store (1.5.0) rack (>= 1.4) @@ -252,13 +252,13 @@ GEM rspec-mocks (~> 3.10) rspec-support (~> 3.10) rspec-support (3.10.2) - rubocop (1.18.3) + rubocop (1.18.4) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.7.0, < 2.0) + rubocop-ast (>= 1.8.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) rubocop-ast (1.8.0) diff --git a/yarn.lock b/yarn.lock index 6b9d585..a998a20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1007,9 +1007,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "16.4.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.1.tgz#9fad171a5b701613ee8a6f4ece3c88b1034b1b03" - integrity sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q== + version "16.4.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.8.tgz#ef4974f47524448428542365db2fe7b638f928e5" + integrity sha512-VL7RZyCpfYEmbyd3/Eq5RNYhZt7yoL1JThZQ3KzimzhLya2Qa86U1ZZmioNWAAjiz99z1ED1xF9NUV2srvfVrA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1418,9 +1418,9 @@ babel-plugin-polyfill-corejs2@^0.2.2: semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" - integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + version "0.2.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" @@ -1639,9 +1639,9 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4 node-releases "^1.1.71" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" @@ -1799,9 +1799,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001246" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001246.tgz#fe17d9919f87124d6bb416ef7b325356d69dc76c" - integrity sha512-Tc+ff0Co/nFNbLOrziBXmMVtpt9S2c2Y+Z9Nk9Khj09J+0zR9ejvIW5qkZAErCbOrVODCx/MN+GpB5FNBs5GFA== + version "1.0.30001248" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz#26ab45e340f155ea5da2920dadb76a533cb8ebce" + integrity sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -2076,17 +2076,17 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.14.0, core-js-compat@^3.15.0: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" - integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== + version "3.16.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.0.tgz#fced4a0a534e7e02f7e084bff66c701f8281805f" + integrity sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q== dependencies: browserslist "^4.16.6" semver "7.0.0" core-js@^3.12.1: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" - integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== + version "3.16.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.0.tgz#1d46fb33720bc1fa7f90d20431f36a5540858986" + integrity sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g== core-util-is@~1.0.0: version "1.0.2" @@ -2562,9 +2562,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.723: - version "1.3.785" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz#79f546c69a6be4f30913aaace361bc746f26df48" - integrity sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg== + version "1.3.792" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.792.tgz#791b0d8fcf7411885d086193fb49aaef0c1594ca" + integrity sha512-RM2O2xrNarM7Cs+XF/OE2qX/aBROyOZqqgP+8FXMXSuWuUqCfUUzg7NytQrzZU3aSqk1Qq6zqnVkJsbfMkIatg== elliptic@^6.5.3: version "6.5.4" @@ -2630,9 +2630,9 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + version "1.18.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.4.tgz#c6b7a1acd6bb1c8b5afeb54a53c46ad02fab346d" + integrity sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -2640,11 +2640,12 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: get-intrinsic "^1.1.1" has "^1.0.3" has-symbols "^1.0.2" + internal-slot "^1.0.3" is-callable "^1.2.3" is-negative-zero "^2.0.1" is-regex "^1.1.3" is-string "^1.0.6" - object-inspect "^1.10.3" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" @@ -2947,9 +2948,9 @@ findup-sync@^3.0.0: resolve-dir "^1.0.1" flatted@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" - integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== flatten@^1.0.2: version "1.0.3" @@ -3049,7 +3050,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -3464,6 +3465,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -4087,17 +4097,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - mime-db "1.48.0" + mime-db "1.49.0" mime@1.6.0: version "1.6.0" @@ -4399,7 +4409,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.10.3: +object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== @@ -5809,9 +5819,9 @@ sass-loader@10.1.1: semver "^7.3.2" sass@^1.32.13: - version "1.35.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.35.2.tgz#b732314fcdaf7ef8d0f1698698adc378043cb821" - integrity sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw== + version "1.37.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.37.0.tgz#f1b03a9d072ee9053a29d125c8130c78e92827c2" + integrity sha512-B+Tu6cSAG8ffs/cqsZl/bgSH2pCmavDaPTYAoW8QA1qNHh/RqndNfVKuABKYkLjUQ5aq/BnCENVpE80cqdSM1w== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -5987,6 +5997,15 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -6339,9 +6358,9 @@ tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + version "6.1.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.2.tgz#1f045a90a6eb23557a603595f41a16c57d47adc6" + integrity sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -6610,9 +6629,9 @@ url-loader@^4.1.0: schema-utils "^3.0.0" url-parse@^1.4.3, url-parse@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" - integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From 8c72351859a6096964628158458c3ecc04c2e5db Mon Sep 17 00:00:00 2001 From: Kevin Custer Date: Sat, 31 Jul 2021 20:24:58 -0400 Subject: [PATCH 2/3] Revert commit 02ac7c7 to re-add Stimulus Reflex - this was a development artifact mistakenly merged into main --- Gemfile | 1 + Gemfile.lock | 9 ++++++ app/channels/application_cable/connection.rb | 15 +++++++++ app/controllers/transactions_controller.rb | 21 ++++++++++-- app/helpers/transactions_helper.rb | 28 ++++++++++++++++ app/javascript/channels/consumer.js | 6 ++++ app/javascript/channels/index.js | 5 +++ .../controllers/application_controller.js | 32 +++++++++++++++++++ app/javascript/controllers/index.js | 4 +++ app/javascript/packs/application.js | 2 ++ app/models/transaction.rb | 13 ++++---- app/reflexes/application_reflex.rb | 15 +++++++++ app/reflexes/transaction_reflex.rb | 21 ++++++++++++ .../components/_pagination.html.erb | 7 ++-- .../transactions/components/_search.html.erb | 11 ++++--- .../components/_transactionList.html.erb | 20 ++++++++++-- config/initializers/stimulus_reflex.rb | 32 +++++++++++++++++++ package.json | 1 + yarn.lock | 28 +++++++++++++--- 19 files changed, 248 insertions(+), 23 deletions(-) create mode 100644 app/javascript/channels/consumer.js create mode 100644 app/javascript/channels/index.js create mode 100644 app/reflexes/application_reflex.rb create mode 100644 app/reflexes/transaction_reflex.rb create mode 100644 config/initializers/stimulus_reflex.rb diff --git a/Gemfile b/Gemfile index ff8f937..56918cc 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ gem 'puma', '~> 5.1.1' gem 'rails', '~> 6.1.0' gem 'recaptcha', '~> 5.6.0' gem 'redis', '>= 4.0', require: ['redis', 'redis/connection/hiredis'] +gem 'stimulus_reflex', '~> 3.4.0' gem 'webpacker', '~> 5.2.1' group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 4ff6c70..7f7fda8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,6 +92,8 @@ GEM debug_inspector (>= 0.0.1) builder (3.2.4) byebug (11.1.3) + cable_ready (4.4.6) + rails (>= 5.2) capybara (3.35.3) addressable mini_mime (>= 0.1.3) @@ -297,6 +299,12 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) + stimulus_reflex (3.4.0) + cable_ready (>= 4.4) + nokogiri + rack + rails (>= 5.2) + redis thor (1.1.0) tzinfo (2.0.4) concurrent-ruby (~> 1.0) @@ -358,6 +366,7 @@ DEPENDENCIES spring spring-commands-rspec spring-watcher-listen + stimulus_reflex (~> 3.4.0) webdrivers webpacker (~> 5.2.1) diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb index 8d6c2a1..424c8f2 100644 --- a/app/channels/application_cable/connection.rb +++ b/app/channels/application_cable/connection.rb @@ -2,5 +2,20 @@ module ApplicationCable class Connection < ActionCable::Connection::Base + identified_by :current_user + + def connect + self.current_user = find_verified_user + end + + protected + + def find_verified_user + if (current_user = env['warden'].user) + current_user + else + reject_unauthorized_connection + end + end end end diff --git a/app/controllers/transactions_controller.rb b/app/controllers/transactions_controller.rb index 682c0fc..2df5d9a 100644 --- a/app/controllers/transactions_controller.rb +++ b/app/controllers/transactions_controller.rb @@ -10,8 +10,17 @@ class TransactionsController < ApplicationController # Index action to render all transactions def index - @transactions = @account.transactions.search(params[:description]).with_balance.desc - @pagy, @transactions = pagy(@transactions, page: session[:trx_index_page], items: 15) + @query = session[:query] + @order_by = permitted_column_name(session[:order_by]) + @direction = permitted_direction(session[:direction]) + @page = (session[:page] || 1).to_i + + transactions = @account.transactions.order(pending: :desc, @order_by => @direction, id: :desc) + transactions = transactions.search(@query) if @query.present? + pages = (transactions.count / Pagy::VARS[:items].to_f).ceil + + @page = 1 if @page > pages + @pagy, @transactions = pagy(transactions, page: @page) @transactions = @transactions.decorate @stashes = @account.stashes.order(id: :asc).decorate @@ -81,6 +90,14 @@ def destroy private + def permitted_column_name(column_name) + %w[trx_date description amount].find { |permitted| column_name == permitted } || 'trx_date' + end + + def permitted_direction(direction) + %w[asc desc].find { |permitted| direction == permitted } || 'desc' + end + def transaction_params params.require(:transaction) \ .permit(:trx_date, :description, :amount, :trx_type, :memo, :attachment, :page, :pending, :locked, :transfer) diff --git a/app/helpers/transactions_helper.rb b/app/helpers/transactions_helper.rb index 45c430f..3052761 100644 --- a/app/helpers/transactions_helper.rb +++ b/app/helpers/transactions_helper.rb @@ -2,4 +2,32 @@ module TransactionsHelper include Pagy::Frontend + + def column_css(column_name) + return 'has-text-white sortable sort-selected' if column_name.to_s == @order_by + + 'has-text-white sortable' + end + + def arrow(column_name) + return 'fa-sort' if column_name.to_s != @order_by + + @direction == 'desc' ? 'fa-sort-down' : 'fa-sort-up' + end + + def direction + @direction == 'asc' ? 'desc' : 'asc' + end + + def pagy_get_params(params) + params.merge query: @query, order_by: @order_by, direction: @direction + end + + def prev_page + @pagy.prev || 1 + end + + def next_page + @pagy.next || @pagy.last + end end diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js new file mode 100644 index 0000000..a788f17 --- /dev/null +++ b/app/javascript/channels/consumer.js @@ -0,0 +1,6 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. + +import { createConsumer } from '@rails/actioncable' + +export default createConsumer() \ No newline at end of file diff --git a/app/javascript/channels/index.js b/app/javascript/channels/index.js new file mode 100644 index 0000000..700d745 --- /dev/null +++ b/app/javascript/channels/index.js @@ -0,0 +1,5 @@ +// Load all the channels within this directory and all subdirectories. +// Channel files must be named *_channel.js. + +const channels = require.context('.', true, /_channel\.js$/) +channels.keys().forEach(channels) \ No newline at end of file diff --git a/app/javascript/controllers/application_controller.js b/app/javascript/controllers/application_controller.js index c68e272..26ee7d0 100644 --- a/app/javascript/controllers/application_controller.js +++ b/app/javascript/controllers/application_controller.js @@ -1,4 +1,5 @@ import { Controller } from 'stimulus' +import StimulusReflex from 'stimulus_reflex' /* This is your application's ApplicationController. * All StimulusReflex controllers should inherit from this class. @@ -13,5 +14,36 @@ import { Controller } from 'stimulus' */ export default class extends Controller { connect () { + StimulusReflex.register(this) + } + + /* Application wide lifecycle methods. + * Use these methods to handle lifecycle concerns for the entire application. + * Using the lifecycle is optional, so feel free to delete these stubs if you don't need them. + * + * Arguments: + * + * element - the element that triggered the reflex + * may be different than the Stimulus controller's this.element + * + * reflex - the name of the reflex e.g. "ExampleReflex#demo" + * + * error - error message from the server + */ + + beforeReflex (element, reflex) { + // document.body.classList.add('wait') + } + + reflexSuccess (element, reflex, error) { + // show success message etc... + } + + reflexError (element, reflex, error) { + // show error message etc... + } + + afterReflex (element, reflex) { + // document.body.classList.remove('wait') } } diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index 6f53d84..ab0c2f1 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -3,7 +3,11 @@ import { Application } from "stimulus" import { definitionsFromContext } from "stimulus/webpack-helpers" +import StimulusReflex from 'stimulus_reflex' +import consumer from '../channels/consumer' +import controller from './application_controller' const application = Application.start() const context = require.context("controllers", true, /_controller\.js$/) application.load(definitionsFromContext(context)) +StimulusReflex.initialize(application, { consumer, controller, debug: false }) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 8f7efc6..a545d03 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,7 +1,9 @@ // Core libraries require("turbolinks").start() require("@rails/ujs").start() +require("@rails/actioncable") require("@rails/activestorage").start() +require("channels") require.context("../application/images", true) import "@fortawesome/fontawesome-free/js/all" diff --git a/app/models/transaction.rb b/app/models/transaction.rb index 8c7818e..684c156 100644 --- a/app/models/transaction.rb +++ b/app/models/transaction.rb @@ -33,13 +33,12 @@ class Transaction < ApplicationRecord scope :current_day, -> { where('created_at > ?', 18.hours.ago) } scope :pending, -> { where(pending: true) } - def self.search(description) - if description - where('description ILIKE ?', "%#{description}%") - else - all - end - end + scope :search, lambda { |query| + query = sanitize_sql_like(query) + where(arel_table[:description] + .lower + .matches("%#{query.downcase}%")) + } # Determine the transaction_type for existing records based on amount def transaction_type diff --git a/app/reflexes/application_reflex.rb b/app/reflexes/application_reflex.rb new file mode 100644 index 0000000..0f22e29 --- /dev/null +++ b/app/reflexes/application_reflex.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class ApplicationReflex < StimulusReflex::Reflex + # Put application wide Reflex behavior in this file. + # + # Example: + # + # # If your ActionCable connection is: `identified_by :current_user` + # delegate :current_user, to: :connection + # + # Learn more at: https://docs.stimulusreflex.com + + # Devise authentication for stimulus reflex + delegate :current_user, to: :connection +end diff --git a/app/reflexes/transaction_reflex.rb b/app/reflexes/transaction_reflex.rb new file mode 100644 index 0000000..09e1343 --- /dev/null +++ b/app/reflexes/transaction_reflex.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# Reflex for Transactions to allow various functionality in the transaction list +class TransactionReflex < ApplicationReflex + def search + session[:query] = element[:value].strip + end + + def search_reset + session[:query] = '' + end + + def order + session[:order_by] = element.dataset['column-name'] + session[:direction] = element.dataset['direction'] + end + + def paginate + session[:page] = element.dataset[:page].to_i + end +end diff --git a/app/views/transactions/components/_pagination.html.erb b/app/views/transactions/components/_pagination.html.erb index 3742a90..520af3f 100644 --- a/app/views/transactions/components/_pagination.html.erb +++ b/app/views/transactions/components/_pagination.html.erb @@ -3,8 +3,8 @@