Commit Graph

129 Commits

Author SHA1 Message Date
Ahmed Ejaz
f44476b9af 11068: code refactoring
- Make use of reflexes when deleting the product and variant
- Add reflex dataset param to confirm_modal_component
2023-12-20 12:54:54 +05:00
Ahmed Ejaz
9cf51f3453 11068: add success and failure messages 2023-12-20 12:54:54 +05:00
Ahmed Ejaz
1936adc82f 11068: fix lint issues 2023-12-20 12:54:54 +05:00
Ahmed Ejaz
26d102f66b 11068: update product/varaint delete actions 2023-12-20 12:54:54 +05:00
Ahmed Ejaz
05e7674805 #11068: add delete variant and product reflexes 2023-12-20 12:54:54 +05:00
Ahmed Ejaz
5d90993f21 11068, apply delete_modals partial 2023-12-20 12:54:54 +05:00
Maikel Linke
b33910d5b4 Disconnect Connected App as enterprise user
The app has to provide a webhook URL to be notified when the app is
disconnected. Once we have better token management, we would have a
unique token per app and could revoke it. But for now it's just a
request to disconnect the app.
2023-12-20 15:29:28 +11:00
Maikel Linke
35ca66cbb7 Respond fast by rendering only partial 2023-12-15 12:34:40 +11:00
Maikel Linke
1d7f96e965 Broadcast connected app to all user tabs 2023-12-15 12:34:40 +11:00
Maikel Linke
12e5a0d1e1 Query webhook to connect app 2023-12-15 11:50:04 +11:00
Maikel Linke
4eb273b06e Create ConnectedApp with a reflex
I would have like to use a standard form to submit to the reflex but the
whole enterprise settings tab is in a form already and HTML doesn't
allow nested forms. While it does still work in browsers, it would have
added much more HTML to set up a form with a hidden input field instead
of just one additional data attribute.

The whole page is rendered by the controller again but the reflex root
attribute ensures that only parts of this tab are replaced. Otherwise
unsaved data on other tabs could be replaced and the page actually
becomes blank because AngularJS doesn't play well with the morph.
2023-12-15 11:50:04 +11:00
David Cook
0f46da07b2 Render flashes along with table
It doesn't matter where the flash messages appear in the HTML (thanks to fixed positioning), so why not keep it simple and send them with the main response.

preventDefault in case we are inside a form, so the button doesn't submit it.
2023-12-06 15:13:15 +11:00
David Cook
54d61cd24d Don't show flashes until everything else is done.
Mario reported that it was showing before the loading spinner had gone.
Technically the loading spinner doesn't hide until after the reflex is finished, but hopefully this is close enough.
2023-12-06 10:12:17 +11:00
David Cook
6dc04c458c Show saving success message in flash
I don't know if this is the best way to do it with SR, but it works..
2023-12-06 10:12:17 +11:00
David Cook
eccfe96a5b Use form hash structure
The array format is generally fine, but to properly support checkboxes, we need this format with hash keys.
https://guides.rubyonrails.org/form_helpers.html#understanding-parameter-naming-conventions
2023-11-28 10:44:34 +11:00
Neal Chambers
69e7419a45 Safely autocorrect Style/NegatedIfElseCondition
Inspecting 1509 files
....................................................................................................................................................................................................................C........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................C.......................................................................................................................................................

Offenses:

app/mailers/spree/shipment_mailer.rb:15:25: C: [Corrected] Style/NegatedIfElseCondition: Invert the negated condition and swap the ternary branches.
      default_subject = !@delivery ? t('.picked_up_subject') : default_i18n_subject
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
spec/support/matchers/table_matchers.rb:34:5: C: [Corrected] Style/NegatedIfElseCondition: Invert the negated condition and swap the if-else branches.
    if rows.count != expected_table.count ...
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1509 files inspected, 2 offenses detected, 2 offenses corrected
2023-11-10 09:13:57 +09:00
David Cook
f05d27b58b Show error message summary at top of form 2023-11-03 14:32:58 +11:00
David Cook
a0b64cb58a Remove unnecessary set_locale calls
The locale is now set in ApplicationReflex
2023-10-13 15:54:24 +02:00
David Cook
2915048afa Always set locale for reflexes
I considered using I18nHelper like we do in controllers, but that is for choosing a locale, which we don't need to do for reflexes.
2023-10-13 15:54:24 +02:00
Mohamed ABDELLANI
614c8a5060 update order mailer to check if invoices feature is enabled for the current user 2023-10-08 21:47:17 +02:00
Mohamed ABDELLANI
adecf64cf3 update bulk invoice job to check if the invoices feature is enabled for the current user 2023-10-08 21:47:17 +02:00
Neal Chambers
ed06edda3f Fix Style/HashSyntax 2023-09-13 16:45:00 +09:00
David Cook
ef63c520c0 Aggregate errors 2023-08-22 11:40:58 +10:00
David Cook
a70f392654 Show error messages
It's kinda hard to test reflexes..
2023-08-22 11:40:58 +10:00
David Cook
71c36585bc Retain order when saving.
Perhaps this should be tested in the system spec too ("I can rename a product and still see it after saving"). But I'd like to find the compromise to avoid bulking up system specs too much. I think it's covered well enough by the reflex spec?
2023-08-22 11:40:58 +10:00
David Cook
ae3cd6f7e0 Add bulk_update product form for product name
(For now at least,) we use one big standard Rails form, and ModelSet to update each record.
Submitting with Reflex allows us to manage the loading state along with the rest of the page (although I would rather use the built in HTTP POST standard).

Aria-label makes it a bit easier for testing (and accessibility software of course!). Technically it should have been aria-labelledby="id_of_column_header" but that would have resulted in more HTML and processing, which seemed silly.

Best viewed with whitespace ignored.
2023-08-22 11:40:58 +10:00
Jean-Baptiste Bellet
1a8a4ee72b Change size of pagination
"it becomes extremely long for big catalogues"
2023-08-17 09:26:10 +02:00
David Cook
e816228959 Sort products by name in ascending order
The order is specified above in fetch_products. I'm guessing this line was unintentional?

Original requirment doesn't say ascending but I think it's safe to assume (issue#10694).
2023-08-15 08:36:22 +02:00
Jean-Baptiste Bellet
3b68674896 Remove new_products_page and all associated controller/components/
new_products_page` is dead, long live `admin_style_v3` !
2023-08-10 10:02:45 +02:00
Mohamed ABDELLANI
7daa4d3a63 simplify filtering condition to select only invoiceable orders on OrdersReflex 2023-08-03 14:52:45 +01:00
Neal Chambers
60cd84d565 Safely autocorrect Naming/BlockForwarding
Inspecting 1480 files
...................................................................................................................................................................C.......C..........C...............................................................................................................................................................................................................C...........................................................................................................C.........C...............................................................................................................................................................................................................................................................C........................................CC...C............................................................................................................................................................................................................................................................................................................................C.....................................................................................................................................................................................................C..............C.........C..CC.......C.....................................................................................................C...............

Offenses:

app/helpers/application_helper.rb:41:32: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def ng_form_for(name, *args, &block)
                               ^^^^^^
app/helpers/application_helper.rb:44:75: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    form_for(name, *(args << options.merge(builder: AngularFormBuilder)), &block)
                                                                          ^^^^^^
app/helpers/application_helper.rb:49:37: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def method_missing(method, *args, &block)
                                    ^^^^^^
app/helpers/link_helper.rb:4:57: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def link_to_service(baseurl, name, html_options = {}, &block)
                                                        ^^^^^^
app/helpers/link_helper.rb:8:51: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    link_to ext_url(baseurl, name), html_options, &block
                                                  ^^^^^^
app/helpers/spree/admin/base_helper.rb:6:56: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
      def field_container(model, method, options = {}, &block)
                                                       ^^^^^^
app/helpers/spree/admin/base_helper.rb:13:29: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
                    capture(&block),
                            ^^^^^^
app/reflexes/application_reflex.rb:29:19: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def with_locale(&block)
                  ^^^^^^
app/reflexes/application_reflex.rb:30:43: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    I18n.with_locale(current_user.locale, &block)
                                          ^^^^^^
app/services/cache_service.rb:8:43: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def self.cache(cache_key, options = {}, &block)
                                          ^^^^^^
app/services/cache_service.rb:9:48: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    Rails.cache.fetch cache_key.to_s, options, &block
                                               ^^^^^^
app/services/cache_service.rb:14:58: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def self.cached_data_by_class(cache_key, cached_class, &block)
                                                         ^^^^^^
app/services/cache_service.rb:16:23: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
                      &block
                      ^^^^^^
app/services/cache_service.rb:25:34: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def self.home_stats(statistic, &block)
                                 ^^^^^^
app/services/cache_service.rb:28:47: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
                      race_condition_ttl: 10, &block)
                                              ^^^^^^
app/services/current_order_locker.rb:12:31: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def self.around(controller, &block)
                              ^^^^^^
app/services/current_order_locker.rb:13:55: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    lock_order_and_variants(controller.current_order, &block)
                                                      ^^^^^^
lib/reporting/reports/enterprise_fee_summary/scope.rb:392:28: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
        def chain_to_scope(&block)
                           ^^^^^^
lib/reporting/reports/enterprise_fee_summary/scope.rb:393:41: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
          @scope = @scope.instance_eval(&block)
                                        ^^^^^^
lib/spree/core/controller_helpers/respond_with.rb:7:34: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    def respond_with(*resources, &block)
                                 ^^^^^^
lib/spree/core/controller_helpers/respond_with.rb:13:64: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
      return unless (collector = retrieve_collector_from_mimes(&block))
                                                               ^^^^^^
lib/spree/core/delegate_belongs_to.rb:80:39: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    def class_def(name, method = nil, &blk)
                                      ^^^^
lib/spree/core/delegate_belongs_to.rb:81:54: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
      class_eval { method.nil? ? define_method(name, &blk) : define_method(name, method) }
                                                     ^^^^
lib/spree/core/environment_extension.rb:22:31: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
      def create_method(name, &block)
                              ^^^^^^
lib/spree/core/environment_extension.rb:23:51: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
        self.class.__send__(:define_method, name, &block)
                                                  ^^^^^^
spec/models/enterprise_caching_spec.rb:144:13: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def later(&block)
            ^^^^^^
spec/models/enterprise_caching_spec.rb:145:36: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    Timecop.travel(1.day.from_now, &block)
                                   ^^^^^^
spec/support/embedded_pages_helper.rb:5:26: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    def on_embedded_page(&block)
                         ^^^^^^
spec/support/embedded_pages_helper.rb:6:28: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
      within_frame :frame, &block
                           ^^^^^^
spec/support/preferences_helper.rb:11:31: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def reset_spree_preferences(&config_block)
                              ^^^^^^^^^^^^^
spec/support/preferences_helper.rb:16:33: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    configure_spree_preferences(&config_block) if block_given?
                                ^^^^^^^^^^^^^
spec/support/request/shop_workflow.rb:87:37: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def within_variant(variant = nil, &block)
                                    ^^^^^^
spec/support/request/shop_workflow.rb:90:22: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    within(selector, &block)
                     ^^^^^^
spec/support/request/ui_component_helper.rb:4:23: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def browse_as_small(&block)
                      ^^^^^^
spec/support/request/ui_component_helper.rb:5:39: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    browse_with_window_size(640, 480, &block)
                                      ^^^^^^
spec/support/request/ui_component_helper.rb:8:24: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def browse_as_medium(&block)
                       ^^^^^^
spec/support/request/ui_component_helper.rb:9:40: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    browse_with_window_size(1024, 768, &block)
                                       ^^^^^^
spec/support/request/web_helper.rb:52:23: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def within_row(num, &block)
                      ^^^^^^
spec/support/request/web_helper.rb:53:54: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    within("table.index tbody tr:nth-child(#{num})", &block)
                                                     ^^^^^^
spec/swagger_helper.rb:77:19: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def param(args, &block)
                  ^^^^^^
spec/swagger_helper.rb:78:45: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
    public_send(:let, args) { instance_eval(&block) }
                                            ^^^^^^
spec/system/support/capybara_setup.rb:20:27: C: [Corrected] Naming/BlockForwarding: Use anonymous block forwarding.
  def using_session(name, &block)
                          ^^^^^^

1480 files inspected, 42 offenses detected, 42 offenses corrected
2023-07-30 21:29:19 +09:00
Jean-Baptiste Bellet
3fab9714f5 Use a constant as the search_key 2023-07-19 14:58:40 +02:00
Jean-Baptiste Bellet
2697a637a9 Use the OpenFoodNetwork::Permissions helper
To retrieve only primary producers
2023-07-19 14:58:40 +02:00
jibees
3245f7ff99 Update app/reflexes/products_reflex.rb
Co-authored-by: David Cook <david@redcliffs.net>
2023-07-19 14:58:40 +02:00
Jean-Baptiste Bellet
90c6398197 Simplify and call methods directly via before_reflex 2023-07-19 14:58:40 +02:00
Jean-Baptiste Bellet
b3bdba3a9b Better use merge! instead of q = q.merge 2023-07-19 14:58:40 +02:00
Jean-Baptiste Bellet
fac02c794c Search through more attributes than only name
Copy/paste from `app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee`
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
5a8a187f54 Add clear search button and action 2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
333dc11fc1 Manage form params vs. URL params. And replace state with params.
"One needs to understand what the source of the params in a reflex is. And there are two sources:

the closest form
the url of the currently displayed page"

Source: https://github.com/stimulusreflex/stimulus_reflex/issues/290#issuecomment-683334963
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
bfe1884ab5 Can filter by categories 2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
f58cf2d3b2 Can filter by producer
Not sur the request nor the `producers` in the reflex should be like this. This is a proof of concept, and should probably be reviewed

Fix linter issues
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
643897abb2 Add search functionnality 2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
c786f300ca Have a tiny url state management by using replace_state of cable_ready 2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
3da6e02192 Call pagination via perPage param: no state to manage, use param 2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
61d1f30e04 Rename productsV3 to products: avoid upper|lower case issues
This is causing some issues, misunderstandings around case.

Therefore, directly use the Reflex, and lifecycle methods `beforeFetch` and `afterFetch` are called, even if we use the Reflex (and not the js controller methods). This is pretty handy.

+ adds some id to pagination element (https://docs.stimulusreflex.com/guide/reflexes.html#declaring-a-reflex-in-html-with-data-attributes)

Global documentation: https://docs.stimulusreflex.com/guide/reflexes.html
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
574adb88d2 Add a per page component
This is still a WIP.
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
5aebbe4102 use beforeFetch and afterFetch lifecycle methods
+ Move outside `Admin` module the reflex

Therefore, this reflex should be _equivalent_ to its javascript controller: `ProductsV3` (relation is made through names)

Remove unwanted line

Actually call StimulusJS controller instead of calling the reflex itself

In order to have this "showLoading", "hideLoading" behavior.

It seems to be possible to directly use the Reflex itself (use `data-reflex` instead of `data-action`) but I can't make it work: the `stimulus-controller:after` event is never broadcasted/catched (but `stimulus-controller:before` yes...)

Documentation:
https://docs.stimulusreflex.com/guide/reflexes.html#understanding-stimulusreflex-controllers
https://docs.stimulusreflex.com/guide/lifecycle.html#generic-life-cycle-methods

Maybe @dacook if you want to have a look...
2023-07-19 14:58:39 +02:00
Jean-Baptiste Bellet
47f21cb59e Add pagination with pagy
For `admin_style_v3` use `<` and `>` for next and previous link

instead of `next` and `previous` string

Extract a mixin for a default box-shadow

Maybe this needs to be redefined. Let's see how next things goes.

When a table is followed by a pagination, remove its margin-bottom + border

Finally, design the pagination component

Add sorting/pagination module, on top of table

We use `cablea_ready.replace`, so need to add `#products-content` id

Use a `pagy` partial with reflex action, instead of the legacy one

- revert the legacy one to its previous state
 - in reflex, fetch product with page attribute, 1 by default

Move `pagy` into `admin/shared/v3/` to be reusable

+ use fontawesome icons for next and previous page

Remove useless line
2023-07-19 14:58:39 +02:00
David Cook
6a2025b271 Add products table
With ellipsis clipping for long lines.
2023-06-28 09:59:57 +10:00
David Cook
809c15b197 Load products page with reflex
We will add the products in the next commit.
2023-06-28 09:59:57 +10:00