avo 2.9.1.pre4 → 2.9.1.pre7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54eda8fa10cea4ba07b9d007cf414b7b0a1a4cbd042894db52a3287a2f0d5691
4
- data.tar.gz: 21797dd1428f4cb126d2004adc9634212febc37eaa7ab052ee4a850522e5c918
3
+ metadata.gz: d1125e5ae529c104548f0c947d1f878be1fa5aafc821d745df6c7a09077c1cb8
4
+ data.tar.gz: c85ba14cf3905f39ba12c688166ee88819c33c8b07af4507accdedfb8463311f
5
5
  SHA512:
6
- metadata.gz: 04146f273dd93c0e23844b904f4b4d424002797232a0e38364a9ecfe94b00cb8da759a58f34efe96477dd502f450384bba7e0556be1dae9b086dd3a195476ea1
7
- data.tar.gz: 29ad039a5d2892867e764a876bd85b06ff61641d453f6caa903fa53a035bd3250e0219ab97aa13ef16497ac250fecc8932a63f0e7cdfb28646cb603e72226b11
6
+ metadata.gz: 587d36901f4ef5b250200c1903c7e7a8833933e9ff4a1fe565fe79ffef96abc9583eea274bc94e0ffbd62f29c1a567a7f5b758cf934bf04a09284e943cc6203e
7
+ data.tar.gz: 2efbbc0b87bff85f640e1a591c4341f39c1588938d3e7553600a069fc1f9d4b6fe79f3723d0c60972bffeee54c3dd4d3946e22871900bec6efcfa42ce652400a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- avo (2.9.1.pre4)
4
+ avo (2.9.1.pre7)
5
5
  active_link_to
6
6
  addressable
7
7
  breadcrumbs_on_rails
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::BaseComponent < ViewComponent::Base
4
- delegate :view_context, to: Avo::App
5
-
6
4
  def has_with_trial(ability)
7
5
  ::Avo::App.license.has_with_trial(ability)
8
6
  end
@@ -3,7 +3,7 @@
3
3
  data-key-value-target="controller"
4
4
  data-options="<%= @field.options.to_json %>"
5
5
  data-input-classes="<%= input_classes %>"
6
- data-editable="<%= @view.in?([:edit, :create]) %>"
6
+ data-editable="<%= @view.in?([:edit, :new]) %>"
7
7
  >
8
8
  <div class="w-full flex flex-col">
9
9
  <div class="flex w-full">
@@ -14,7 +14,7 @@
14
14
  <div class="w-1/2 py-3 px-3 uppercase font-semibold text-xs text-white">
15
15
  <%= @field.value_label %>
16
16
  </div>
17
- <% if @view.in?([:edit, :create]) %>
17
+ <% if @view.in?([:edit, :new]) %>
18
18
  <div class="flex items-center justify-center p-2 px-3 border-l border-gray-600">
19
19
  <a href="javascript:void(0);"
20
20
  title="<%= @field.action_text %>"
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Avo::Index::Ordering::ButtonComponent < Avo::Index::Ordering::BaseComponent
4
+ delegate :view_context, to: ::Avo::App
5
+
4
6
  attr_accessor :resource
5
7
  attr_accessor :reflection
6
8
  attr_accessor :direction
@@ -46,7 +46,7 @@
46
46
  }
47
47
  %>
48
48
  <%= hidden_field_tag :turbo_frame, params[:turbo_frame], id: "turbo_frame_detach_#{@resource.model.id}" if params[:turbo_frame] %>
49
- <%= hidden_field_tag :referrer, request.fullpath, id: "referrer_detach_#{@resource.model.id}" if params[:turbo_frame] %>
49
+ <%= hidden_field_tag :referrer, referrer_path, id: "referrer_detach_#{@resource.model.id}" if params[:turbo_frame] %>
50
50
  <% end %>
51
51
  <% end %>
52
52
 
@@ -71,7 +71,7 @@
71
71
  %>
72
72
  <%= form.hidden_field :view_type, value: params[:view_type], id: "turbo_view_type_#{@resource.model.id}" if params[:view_type] %>
73
73
  <%= form.hidden_field :turbo_frame, value: params[:turbo_frame], id: "turbo_frame_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
74
- <%= form.hidden_field :referrer, value: request.fullpath, id: "referrer_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
74
+ <%= form.hidden_field :referrer, value: referrer_path, id: "referrer_destroy_#{@resource.model.id}" if params[:turbo_frame] %>
75
75
  <% end %>
76
76
  <% end %>
77
77
  </div>
@@ -41,7 +41,7 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
41
41
  end
42
42
 
43
43
  def edit_path
44
- #Add the `view` param to let Avo know where to redirect back when the user clicks the `Cancel` button.
44
+ # Add the `view` param to let Avo know where to redirect back when the user clicks the `Cancel` button.
45
45
  args = {via_view: 'index'}
46
46
 
47
47
  if @parent_model.present?
@@ -71,4 +71,8 @@ class Avo::Index::ResourceControlsComponent < Avo::ResourceComponent
71
71
  def is_has_many_association
72
72
  @reflection.is_a?(::ActiveRecord::Reflection::HasManyReflection) || @reflection.is_a?(::ActiveRecord::Reflection::ThroughReflection)
73
73
  end
74
+
75
+ def referrer_path
76
+ Avo::App.root_path(paths: ['resources', params[:resource_name], params[:id], params[:related_name]], query: request.query_parameters.to_h)
77
+ end
74
78
  end
@@ -0,0 +1,80 @@
1
+ import { AttributeObserver } from '@stimulus/mutation-observers'
2
+ import { Controller } from '@hotwired/stimulus'
3
+ import { castBoolean } from '../helpers/cast_boolean'
4
+
5
+ export default class extends Controller {
6
+ static targets = ['tab'];
7
+
8
+ static values = {
9
+ activeTab: String,
10
+ };
11
+
12
+ get currentTab() {
13
+ return this.tabTargets.find(
14
+ (element) => element.dataset.tabId === this.activeTabValue,
15
+ )
16
+ }
17
+
18
+ targetTab(id) {
19
+ return this.tabTargets.find((element) => element.dataset.tabId === id)
20
+ }
21
+
22
+ changeTab(e) {
23
+ e.preventDefault()
24
+
25
+ const { params } = e
26
+ const { id } = params
27
+
28
+ this.setTheTargetPanelHeight(id)
29
+
30
+ this.hideTabs()
31
+ this.showTab(id)
32
+ this.markTabLoaded(id)
33
+
34
+ this.activeTabValue = id
35
+ }
36
+
37
+ /**
38
+ * Sets the target container height to the previous panel height so we don't get jerky tab changes.
39
+ */
40
+ setTheTargetPanelHeight(id) {
41
+ // We don't need to add a height to this panel because it was loaded before
42
+ if (castBoolean(this.targetTab(id).dataset.loaded)) {
43
+ return
44
+ }
45
+
46
+ // Get the height of the active panel
47
+ const { height } = this.currentTab.getBoundingClientRect()
48
+ // Set it to the target panel
49
+ this.targetTab(id).style.height = `${height}px`
50
+
51
+ // Wait until the panel loaded it's content and then remove the forced height
52
+ const observer = new AttributeObserver(this.targetTab(id), 'busy', {
53
+ elementUnmatchedAttribute: () => {
54
+ // The content is not available in an instant so delay the height reset a bit.
55
+ setTimeout(() => {
56
+ this.targetTab(id).style.height = ''
57
+ }, 300)
58
+ if (observer) observer.stop()
59
+ },
60
+ })
61
+ observer.start()
62
+ }
63
+
64
+ markTabLoaded(id) {
65
+ this.targetTab(id).dataset.loaded = true
66
+ }
67
+
68
+ showTab(id) {
69
+ this.tabTargets.forEach((element) => {
70
+ if (element.dataset.tabId === id) {
71
+ element.classList.remove('hidden')
72
+ }
73
+ })
74
+ // this.tabTargets.map((element) => element.clasList.add('hidden'))
75
+ }
76
+
77
+ hideTabs() {
78
+ this.tabTargets.map((element) => element.classList.add('hidden'))
79
+ }
80
+ }
data/lib/avo/app.rb CHANGED
@@ -30,17 +30,20 @@ module Avo
30
30
  end
31
31
 
32
32
  # Renerate a dynamic root path using the URIService
33
- def root_path(paths: [], **args)
34
- Avo::Services::URIService.parse(view_context.avo.root_url.to_s).append_paths(paths).to_s
33
+ def root_path(paths: [], query: {}, **args)
34
+ Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
35
+ .append_paths(paths)
36
+ .append_query(query)
37
+ .to_s
35
38
  end
36
39
 
37
40
  def init(request:, context:, current_user:, view_context:, params:)
38
41
  self.error_messages = []
39
- self.request = request
40
42
  self.context = context
41
43
  self.current_user = current_user
42
- self.view_context = view_context
43
44
  self.params = params
45
+ self.request = request
46
+ self.view_context = view_context
44
47
 
45
48
  self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
46
49
  self.translation_enabled = license.has(:localization)
@@ -31,7 +31,7 @@ module Avo
31
31
  def frame_url
32
32
  Avo::Services::URIService.parse(@resource.record_path)
33
33
  .append_path(id.to_s)
34
- .append_query("turbo_frame=#{turbo_frame.to_s}").to_s
34
+ .append_query(turbo_frame: turbo_frame.to_s).to_s
35
35
  end
36
36
 
37
37
  # The value
@@ -24,7 +24,7 @@ module Avo
24
24
  def frame_url
25
25
  Avo::Services::URIService.parse(@resource.record_path)
26
26
  .append_paths(id, value.id)
27
- .append_query("turbo_frame=#{turbo_frame}")
27
+ .append_query(turbo_frame: turbo_frame)
28
28
  .to_s
29
29
  end
30
30
 
@@ -5,7 +5,12 @@ class Avo::Menu::Builder
5
5
  end
6
6
  end
7
7
 
8
+ delegate :context, to: Avo::App
9
+ delegate :current_user, to: Avo::App
10
+ delegate :params, to: Avo::App
11
+ delegate :request, to: Avo::App
8
12
  delegate :root_path, to: Avo::App
13
+ delegate :view_context, to: Avo::App
9
14
 
10
15
  def initialize(name: nil, items: [])
11
16
  @menu = Avo::Menu::Menu.new
@@ -7,35 +7,65 @@ module Avo
7
7
  end
8
8
  end
9
9
 
10
- attr_reader = :uri
10
+ attr_reader :uri
11
11
 
12
12
  def initialize(path = '')
13
13
  @uri = Addressable::URI.parse(path)
14
14
  end
15
15
 
16
16
  def append_paths(*paths)
17
- paths = Array.wrap(paths)
18
-
19
- # abort 11.inspect
17
+ paths = Array.wrap(paths).flatten
20
18
 
21
19
  return self if paths.blank?
22
- # abort 12.inspect
23
20
 
24
- @uri.merge!(path: @uri.path.concat("/#{paths.join("/")}"))
21
+ # Add the intermediary forward slash
22
+ @uri.path = @uri.path.concat("/") unless @uri.path.ends_with? "/"
23
+
24
+ # Add the paths to the URI
25
+ @uri.merge!(path: @uri.path.concat(join_paths(paths)))
26
+
25
27
  self
26
28
  end
27
29
  alias_method :append_path, :append_paths
28
30
 
29
- def append_query(*params)
30
- params = Array.wrap(params)
31
+ def append_query(params)
32
+ params = if params.is_a? Hash
33
+ params.map do |key, value|
34
+ "#{key}=#{value}"
35
+ end
36
+ else
37
+ {}
38
+ end
39
+
40
+ return self if params.blank?
41
+
42
+ # Add the query params to the URI
43
+ @uri.merge!(query: [@uri.query, *params].compact.join("&"))
31
44
 
32
- @uri.merge!(query: [@uri.query, *params].join("&"))
33
45
  self
34
46
  end
35
47
 
36
48
  def to_s
37
49
  @uri.to_s
38
50
  end
51
+
52
+ private
53
+
54
+ def join_paths(paths)
55
+ paths.map do |path|
56
+ sanitize_path path
57
+ end
58
+ .join("/")
59
+ end
60
+
61
+ # Removes the forward slash if it's present at the start of the path
62
+ def sanitize_path(path)
63
+ if path.to_s.starts_with? '/'
64
+ path = path[1..-1]
65
+ end
66
+
67
+ path
68
+ end
39
69
  end
40
70
  end
41
71
  end
data/lib/avo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Avo
2
- VERSION = "2.9.1.pre4" unless const_defined?(:VERSION)
2
+ VERSION = "2.9.1.pre7" unless const_defined?(:VERSION)
3
3
  end
@@ -0,0 +1,115 @@
1
+ fr:
2
+ avo:
3
+ dashboard: 'Tableau de bord'
4
+ dashboards: 'Tableaux de bord'
5
+ choose_a_country: 'Sélectionnez un pays'
6
+ choose_an_option: 'Sélectionnez une option'
7
+ are_you_sure_you_want_to_run_this_option: 'Etes-vous sûr de vouloir exécuter cette action ?'
8
+ are_you_sure_detach_item: 'Êtes-vous sûr de vouloir détacher %{item}.'
9
+ run: 'Exécuter'
10
+ cancel: 'Annuler'
11
+ action_ran_successfully: "L'action s'est exécutée avec succès !"
12
+ details: "détails"
13
+ unauthorized: 'Non autorisé'
14
+ attachment_class_attached: '%{attachment_class} attaché.'
15
+ attachment_class_detached: '%{attachment_class} détaché.'
16
+ resource_updated: 'Ressource mise à jour'
17
+ resource_created: 'Ressource créee'
18
+ resource_destroyed: 'Ressource détruite'
19
+ switch_to_view: "Passez à la vue %{view_type}"
20
+ click_to_reveal_filters: "Cliquez pour révéler les filtres"
21
+ attachment_destroyed: 'Pièce jointe détruite'
22
+ failed_to_find_attachment: 'Impossible de trouver la pièce jointe'
23
+ you_missed_something_check_form: 'Vous avez peut-être oublié quelque chose. Veuillez vérifier le formulaire'
24
+ remove_selection: 'Supprimer la sélection'
25
+ select_item: 'Sélectionnez un élément'
26
+ select_all: 'Sélectionner tout sur la page'
27
+ delete_file: 'Supprimer le fichier'
28
+ delete: 'supprimer'
29
+ delete_item: 'Supprimer %{item}'
30
+ download_item: 'Télécharger %{item}'
31
+ download_file: 'Télécharger le fichier'
32
+ download: 'Télécharger'
33
+ view: 'Vue'
34
+ view_item: 'voir %{item}'
35
+ edit: 'éditer'
36
+ edit_item: 'éditer %{item}'
37
+ detach_item: 'détacher %{item}'
38
+ number_of_items:
39
+ zero: 'aucun %{item}'
40
+ one: 'un %{item}'
41
+ other: '%{count} %{item}'
42
+ x_items_more:
43
+ zero: 'aucun élément supplémentaire'
44
+ one: 'un élément de plus'
45
+ other: '%{count} éléments en plus'
46
+ are_you_sure: 'Êtes-vous sûr ?'
47
+ filters: 'Filtres'
48
+ per_page: 'Par page'
49
+ more: 'Plus'
50
+ attach: 'Attacher'
51
+ cancel: 'Annuler'
52
+ save: 'Enregistrer'
53
+ attach_and_attach_another: 'joindre et joindre un autre'
54
+ hide_content: 'Cacher le contenu'
55
+ show_content: 'Afficher le contenu'
56
+ no_related_item_found: "Aucun %{item} apparenté n'a été trouvé"
57
+ no_item_found: 'Aucun %{item} trouvé'
58
+ loading: 'Chargement'
59
+ confirm: 'Confirmer'
60
+ actions: 'Actions'
61
+ resources: 'Ressources'
62
+ oops_nothing_found: "Oups ! Rien n'a été trouvé..."
63
+ type_to_search: 'Type à rechercher.'
64
+ and_x_other_resources: 'et %{count} autres ressources'
65
+ go_back: 'Retourner en arrière'
66
+ home: 'Accueil'
67
+ new: 'Nouveau'
68
+ attach_item: 'Attacher %{item}'
69
+ choose_item: 'Choisir %{item}'
70
+ create_new_item: 'Créer un nouveau %{item}'
71
+ table_view: 'Vue table'
72
+ grid_view: 'Vue grille'
73
+ next_page: 'Page suivante'
74
+ prev_page: 'Page précédente'
75
+ list_is_empty: 'La liste est vide'
76
+ field_translations:
77
+ file:
78
+ zero: 'fichier'
79
+ one: 'fichier'
80
+ other: 'fichiers'
81
+ people:
82
+ zero: 'personne'
83
+ one: 'personne'
84
+ other: 'personnes'
85
+ resource_translations:
86
+ user:
87
+ zero: 'utilisateur'
88
+ one: 'utilisateurs'
89
+ other: 'utilisateurs'
90
+ reset_filters: 'Réinitialiser les filtres'
91
+ not_authorized: "Vous n'êtes pas autorisé à effectuer cette action."
92
+ search:
93
+ placeholder: 'Rechercher'
94
+ cancel_button: 'Annuler'
95
+ sign_out: 'Se déconnecter'
96
+ failed: 'Échec'
97
+ failed_to_load: 'Impossible de charger'
98
+ key_value_field:
99
+ key: 'Clé'
100
+ value: 'Valeur'
101
+ add_row: 'Ajouter une ligne'
102
+ delete_row: 'Supprimer une ligne'
103
+ was_successfully_created: 'a été créé avec succès'
104
+ was_successfully_updated: 'a été mis à jour avec succès'
105
+ clear_value: "Effacer la valeur"
106
+ tools: Outils
107
+ order:
108
+ reorder_record: Réorganiser
109
+ higher: Déplacer plus haut
110
+ lower: Déplacer plus bas
111
+ to_top: Déplacer tout en haut
112
+ to_bottom: Déplacer tout en bas
113
+ empty_dashboard_message: Ajouter des cartes à ce tableau de bord
114
+ no_cards_present: Aucune carte présente
115
+ no_options_available: Aucune option disponible
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.1.pre4
4
+ version: 2.9.1.pre7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Marin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-30 00:00:00.000000000 Z
12
+ date: 2022-07-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -248,15 +248,6 @@ files:
248
248
  - Gemfile.lock
249
249
  - README.md
250
250
  - Rakefile
251
- - app/assets/builds/action_cable.js
252
- - app/assets/builds/action_cable.js.map
253
- - app/assets/builds/application.js
254
- - app/assets/builds/application.js.map
255
- - app/assets/builds/avo.css
256
- - app/assets/builds/avo.js
257
- - app/assets/builds/avo.js.map
258
- - app/assets/builds/avo_custom.js
259
- - app/assets/builds/avo_custom.js.map
260
251
  - app/assets/config/avo_manifest.js
261
252
  - app/assets/stylesheets/avo.css
262
253
  - app/assets/stylesheets/css/active-storage.css
@@ -1096,6 +1087,7 @@ files:
1096
1087
  - app/javascript/js/controllers/search_controller.js
1097
1088
  - app/javascript/js/controllers/select_controller.js
1098
1089
  - app/javascript/js/controllers/select_filter_controller.js
1090
+ - app/javascript/js/controllers/tabs_controller.js
1099
1091
  - app/javascript/js/controllers/text_filter_controller.js
1100
1092
  - app/javascript/js/controllers/tippy_controller.js
1101
1093
  - app/javascript/js/controllers/toggle_panel_controller.js
@@ -1301,6 +1293,7 @@ files:
1301
1293
  - lib/generators/avo/templates/filters/text_filter.tt
1302
1294
  - lib/generators/avo/templates/initializer/avo.tt
1303
1295
  - lib/generators/avo/templates/locales/avo.en.yml
1296
+ - lib/generators/avo/templates/locales/avo.fr.yml
1304
1297
  - lib/generators/avo/templates/locales/avo.nb-NO.yml
1305
1298
  - lib/generators/avo/templates/locales/avo.pt-BR.yml
1306
1299
  - lib/generators/avo/templates/locales/avo.ro.yml
@@ -1,2 +0,0 @@
1
- (()=>{var a={logger:self.console,WebSocket:self.WebSocket},i={log(...n){this.enabled&&(n.push(Date.now()),a.logger.log("[ActionCable]",...n))}},l=()=>new Date().getTime(),h=n=>(l()-n)/1e3,d=class{constructor(t){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=t,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=l(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),i.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=l(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),i.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=l()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,i.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=l(),i.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout(()=>{this.reconnectIfStale(),this.poll()},this.getPollInterval())}getPollInterval(){let{staleThreshold:t,reconnectionBackoffRate:e}=this.constructor,s=Math.pow(1+e,Math.min(this.reconnectAttempts,10)),r=(this.reconnectAttempts===0?1:e)*Math.random();return t*1e3*s*(1+r)}reconnectIfStale(){this.connectionIsStale()&&(i.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${h(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?i.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${h(this.disconnectedAt)} s`):(i.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return h(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&h(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){document.visibilityState==="visible"&&setTimeout(()=>{(this.connectionIsStale()||!this.connection.isOpen())&&(i.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())},200)}};d.staleThreshold=6;d.reconnectionBackoffRate=.15;var m={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]},{message_types:c,protocols:u}=m,w=u.slice(0,u.length-1),f=[].indexOf,p=class{constructor(t){this.open=this.open.bind(this),this.consumer=t,this.subscriptions=this.consumer.subscriptions,this.monitor=new d(this),this.disconnected=!0}send(t){return this.isOpen()?(this.webSocket.send(JSON.stringify(t)),!0):!1}open(){return this.isActive()?(i.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1):(i.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${u}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new a.WebSocket(this.consumer.url,u),this.installEventHandlers(),this.monitor.start(),!0)}close({allowReconnect:t}={allowReconnect:!0}){if(t||this.monitor.stop(),this.isActive())return this.webSocket.close()}reopen(){if(i.log(`Reopening WebSocket, current state is ${this.getState()}`),this.isActive())try{return this.close()}catch(t){i.log("Failed to reopen WebSocket",t)}finally{i.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}else return this.open()}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}isProtocolSupported(){return f.call(w,this.getProtocol())>=0}isState(...t){return f.call(t,this.getState())>=0}getState(){if(this.webSocket){for(let t in a.WebSocket)if(a.WebSocket[t]===this.webSocket.readyState)return t.toLowerCase()}return null}installEventHandlers(){for(let t in this.events){let e=this.events[t].bind(this);this.webSocket[`on${t}`]=e}}uninstallEventHandlers(){for(let t in this.events)this.webSocket[`on${t}`]=function(){}}};p.reopenDelay=500;p.prototype.events={message(n){if(!this.isProtocolSupported())return;let{identifier:t,message:e,reason:s,reconnect:o,type:r}=JSON.parse(n.data);switch(r){case c.welcome:return this.monitor.recordConnect(),this.subscriptions.reload();case c.disconnect:return i.log(`Disconnecting. Reason: ${s}`),this.close({allowReconnect:o});case c.ping:return this.monitor.recordPing();case c.confirmation:return this.subscriptions.confirmSubscription(t),this.subscriptions.notify(t,"connected");case c.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",e)}},open(){if(i.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return i.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(n){if(i.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){i.log("WebSocket onerror event")}};var k=function(n,t){if(t!=null)for(let e in t){let s=t[e];n[e]=s}return n},b=class{constructor(t,e={},s){this.consumer=t,this.identifier=JSON.stringify(e),k(this,s)}perform(t,e={}){return e.action=t,this.send(e)}send(t){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(t)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}},S=class{constructor(t){this.subscriptions=t,this.pendingSubscriptions=[]}guarantee(t){this.pendingSubscriptions.indexOf(t)==-1?(i.log(`SubscriptionGuarantor guaranteeing ${t.identifier}`),this.pendingSubscriptions.push(t)):i.log(`SubscriptionGuarantor already guaranteeing ${t.identifier}`),this.startGuaranteeing()}forget(t){i.log(`SubscriptionGuarantor forgetting ${t.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter(e=>e!==t)}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout(()=>{this.subscriptions&&typeof this.subscriptions.subscribe=="function"&&this.pendingSubscriptions.map(t=>{i.log(`SubscriptionGuarantor resubscribing ${t.identifier}`),this.subscriptions.subscribe(t)})},500)}},v=class{constructor(t){this.consumer=t,this.guarantor=new S(this),this.subscriptions=[]}create(t,e){let s=t,o=typeof s=="object"?s:{channel:s},r=new b(this.consumer,o,e);return this.add(r)}add(t){return this.subscriptions.push(t),this.consumer.ensureActiveConnection(),this.notify(t,"initialized"),this.subscribe(t),t}remove(t){return this.forget(t),this.findAll(t.identifier).length||this.sendCommand(t,"unsubscribe"),t}reject(t){return this.findAll(t).map(e=>(this.forget(e),this.notify(e,"rejected"),e))}forget(t){return this.guarantor.forget(t),this.subscriptions=this.subscriptions.filter(e=>e!==t),t}findAll(t){return this.subscriptions.filter(e=>e.identifier===t)}reload(){return this.subscriptions.map(t=>this.subscribe(t))}notifyAll(t,...e){return this.subscriptions.map(s=>this.notify(s,t,...e))}notify(t,e,...s){let o;return typeof t=="string"?o=this.findAll(t):o=[t],o.map(r=>typeof r[e]=="function"?r[e](...s):void 0)}subscribe(t){this.sendCommand(t,"subscribe")&&this.guarantor.guarantee(t)}confirmSubscription(t){i.log(`Subscription confirmed ${t}`),this.findAll(t).map(e=>this.guarantor.forget(e))}sendCommand(t,e){let{identifier:s}=t;return this.consumer.send({command:e,identifier:s})}},y=class{constructor(t){this._url=t,this.subscriptions=new v(this),this.connection=new p(this)}get url(){return C(this._url)}send(t){return this.connection.send(t)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}};function C(n){if(typeof n=="function"&&(n=n()),n&&!/^wss?:/i.test(n)){let t=document.createElement("a");return t.href=n,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}else return n}function A(n=$("url")||m.default_mount_path){return new y(n)}function $(n){let t=document.head.querySelector(`meta[name='action-cable-${n}']`);if(t)return t.getAttribute("content")}var g;window.Avo.configuration.action_cable.enabled&&(g=A(),window.Avo.consumer=g);var P=g;})();
2
- //# sourceMappingURL=action_cable.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js", "../../javascript/action_cable.js"],
4
- "sourcesContent": ["var adapters = {\n logger: self.console,\n WebSocket: self.WebSocket\n};\n\nvar logger = {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now());\n adapters.logger.log(\"[ActionCable]\", ...messages);\n }\n }\n};\n\nconst now = () => (new Date).getTime();\n\nconst secondsSince = time => (now() - time) / 1e3;\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this);\n this.connection = connection;\n this.reconnectAttempts = 0;\n }\n start() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n addEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);\n }\n }\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(\"ConnectionMonitor stopped\");\n }\n }\n isRunning() {\n return this.startedAt && !this.stoppedAt;\n }\n recordPing() {\n this.pingedAt = now();\n }\n recordConnect() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n logger.log(\"ConnectionMonitor recorded connect\");\n }\n recordDisconnect() {\n this.disconnectedAt = now();\n logger.log(\"ConnectionMonitor recorded disconnect\");\n }\n startPolling() {\n this.stopPolling();\n this.poll();\n }\n stopPolling() {\n clearTimeout(this.pollTimeout);\n }\n poll() {\n this.pollTimeout = setTimeout((() => {\n this.reconnectIfStale();\n this.poll();\n }), this.getPollInterval());\n }\n getPollInterval() {\n const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));\n const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;\n const jitter = jitterMax * Math.random();\n return staleThreshold * 1e3 * backoff * (1 + jitter);\n }\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);\n } else {\n logger.log(\"ConnectionMonitor reopening\");\n this.connection.reopen();\n }\n }\n }\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt;\n }\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;\n }\n disconnectedRecently() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n }\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout((() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);\n this.connection.reopen();\n }\n }), 200);\n }\n }\n}\n\nConnectionMonitor.staleThreshold = 6;\n\nConnectionMonitor.reconnectionBackoffRate = .15;\n\nvar INTERNAL = {\n message_types: {\n welcome: \"welcome\",\n disconnect: \"disconnect\",\n ping: \"ping\",\n confirmation: \"confirm_subscription\",\n rejection: \"reject_subscription\"\n },\n disconnect_reasons: {\n unauthorized: \"unauthorized\",\n invalid_request: \"invalid_request\",\n server_restart: \"server_restart\"\n },\n default_mount_path: \"/cable\",\n protocols: [ \"actioncable-v1-json\", \"actioncable-unsupported\" ]\n};\n\nconst {message_types: message_types, protocols: protocols} = INTERNAL;\n\nconst supportedProtocols = protocols.slice(0, protocols.length - 1);\n\nconst indexOf = [].indexOf;\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this);\n this.consumer = consumer;\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ConnectionMonitor(this);\n this.disconnected = true;\n }\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n }\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);\n return false;\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);\n if (this.webSocket) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n }\n close({allowReconnect: allowReconnect} = {\n allowReconnect: true\n }) {\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isActive()) {\n return this.webSocket.close();\n }\n }\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`);\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error);\n } finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n }\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol;\n }\n }\n isOpen() {\n return this.isState(\"open\");\n }\n isActive() {\n return this.isState(\"open\", \"connecting\");\n }\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;\n }\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0;\n }\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase();\n }\n }\n }\n return null;\n }\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this);\n this.webSocket[`on${eventName}`] = handler;\n }\n }\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {};\n }\n }\n}\n\nConnection.reopenDelay = 500;\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) {\n return;\n }\n const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`);\n return this.close({\n allowReconnect: reconnect\n });\n\n case message_types.ping:\n return this.monitor.recordPing();\n\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier);\n return this.subscriptions.notify(identifier, \"connected\");\n\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close(event) {\n logger.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error() {\n logger.log(\"WebSocket onerror event\");\n }\n};\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key];\n object[key] = value;\n }\n }\n return object;\n};\n\nclass Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer;\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n perform(action, data = {}) {\n data.action = action;\n return this.send(data);\n }\n send(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n }\n unsubscribe() {\n return this.consumer.subscriptions.remove(this);\n }\n}\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions;\n this.pendingSubscriptions = [];\n }\n guarantee(subscription) {\n if (this.pendingSubscriptions.indexOf(subscription) == -1) {\n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`);\n this.pendingSubscriptions.push(subscription);\n } else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`);\n }\n this.startGuaranteeing();\n }\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`);\n this.pendingSubscriptions = this.pendingSubscriptions.filter((s => s !== subscription));\n }\n startGuaranteeing() {\n this.stopGuaranteeing();\n this.retrySubscribing();\n }\n stopGuaranteeing() {\n clearTimeout(this.retryTimeout);\n }\n retrySubscribing() {\n this.retryTimeout = setTimeout((() => {\n if (this.subscriptions && typeof this.subscriptions.subscribe === \"function\") {\n this.pendingSubscriptions.map((subscription => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`);\n this.subscriptions.subscribe(subscription);\n }));\n }\n }), 500);\n }\n}\n\nclass Subscriptions {\n constructor(consumer) {\n this.consumer = consumer;\n this.guarantor = new SubscriptionGuarantor(this);\n this.subscriptions = [];\n }\n create(channelName, mixin) {\n const channel = channelName;\n const params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n const subscription = new Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n }\n add(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.subscribe(subscription);\n return subscription;\n }\n remove(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n }\n reject(identifier) {\n return this.findAll(identifier).map((subscription => {\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n return subscription;\n }));\n }\n forget(subscription) {\n this.guarantor.forget(subscription);\n this.subscriptions = this.subscriptions.filter((s => s !== subscription));\n return subscription;\n }\n findAll(identifier) {\n return this.subscriptions.filter((s => s.identifier === identifier));\n }\n reload() {\n return this.subscriptions.map((subscription => this.subscribe(subscription)));\n }\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));\n }\n notify(subscription, callbackName, ...args) {\n let subscriptions;\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [ subscription ];\n }\n return subscriptions.map((subscription => typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined));\n }\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription);\n }\n }\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`);\n this.findAll(identifier).map((subscription => this.guarantor.forget(subscription)));\n }\n sendCommand(subscription, command) {\n const {identifier: identifier} = subscription;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n }\n}\n\nclass Consumer {\n constructor(url) {\n this._url = url;\n this.subscriptions = new Subscriptions(this);\n this.connection = new Connection(this);\n }\n get url() {\n return createWebSocketURL(this._url);\n }\n send(data) {\n return this.connection.send(data);\n }\n connect() {\n return this.connection.open();\n }\n disconnect() {\n return this.connection.close({\n allowReconnect: false\n });\n }\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n }\n}\n\nfunction createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url();\n }\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n}\n\nfunction createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url);\n}\n\nfunction getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport { Connection, ConnectionMonitor, Consumer, INTERNAL, Subscription, SubscriptionGuarantor, Subscriptions, adapters, createConsumer, createWebSocketURL, getConfig, logger };\n", "import { createConsumer } from '@rails/actioncable'\n\n// eslint-disable-next-line import/no-mutable-exports\nlet consumer\n\nif (window.Avo.configuration.action_cable.enabled) {\n consumer = createConsumer()\n\n window.Avo.consumer = consumer\n}\n\nexport default consumer\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,2 +0,0 @@
1
- (()=>{})();
2
- //# sourceMappingURL=application.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }