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 +4 -4
- data/Gemfile.lock +1 -1
- data/app/components/avo/base_component.rb +0 -2
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/index/ordering/button_component.rb +2 -0
- data/app/components/avo/index/resource_controls_component.html.erb +2 -2
- data/app/components/avo/index/resource_controls_component.rb +5 -1
- data/app/javascript/js/controllers/tabs_controller.js +80 -0
- data/lib/avo/app.rb +7 -4
- data/lib/avo/fields/has_base_field.rb +1 -1
- data/lib/avo/fields/has_one_field.rb +1 -1
- data/lib/avo/menu/builder.rb +5 -0
- data/lib/avo/services/uri_service.rb +39 -9
- data/lib/avo/version.rb +1 -1
- data/lib/generators/avo/templates/locales/avo.fr.yml +115 -0
- metadata +4 -11
- data/app/assets/builds/action_cable.js +0 -2
- data/app/assets/builds/action_cable.js.map +0 -7
- data/app/assets/builds/application.js +0 -2
- data/app/assets/builds/application.js.map +0 -7
- data/app/assets/builds/avo.css +0 -9028
- data/app/assets/builds/avo.js +0 -512
- data/app/assets/builds/avo.js.map +0 -7
- data/app/assets/builds/avo_custom.js +0 -6
- data/app/assets/builds/avo_custom.js.map +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1125e5ae529c104548f0c947d1f878be1fa5aafc821d745df6c7a09077c1cb8
|
4
|
+
data.tar.gz: c85ba14cf3905f39ba12c688166ee88819c33c8b07af4507accdedfb8463311f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 587d36901f4ef5b250200c1903c7e7a8833933e9ff4a1fe565fe79ffef96abc9583eea274bc94e0ffbd62f29c1a567a7f5b758cf934bf04a09284e943cc6203e
|
7
|
+
data.tar.gz: 2efbbc0b87bff85f640e1a591c4341f39c1588938d3e7553600a069fc1f9d4b6fe79f3723d0c60972bffeee54c3dd4d3946e22871900bec6efcfa42ce652400a
|
data/Gemfile.lock
CHANGED
@@ -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, :
|
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, :
|
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 %>"
|
@@ -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,
|
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:
|
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)
|
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)
|
data/lib/avo/menu/builder.rb
CHANGED
@@ -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
|
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
|
-
|
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(
|
30
|
-
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
@@ -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.
|
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-
|
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
|
-
}
|