para 0.12.2 → 0.12.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/javascripts/para/controllers/index.js +3 -0
- data/app/javascripts/para/{inputs/nested_many.js → controllers/nested_many_input_controller.js} +70 -53
- data/app/javascripts/para/index.js +0 -2
- data/app/views/para/inputs/_nested_many.html.haml +1 -1
- data/app/views/para/inputs/nested_many/_container.html.haml +1 -1
- data/lib/para/version.rb +1 -1
- metadata +4 -5
- data/app/javascripts/para/inputs/material-input.js +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a6fa08f8df1085f17f1f988dc1059f8442179e0d11e1fea66cfb6f1206f3c0a
|
4
|
+
data.tar.gz: 53e0d26aa54c3402b3bb1ab78283a23802f151cf60cc139a354c177f103d6824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22fd8dca678dd2d10589dcf7ebd06098ae3c8901f0b00643fedbf698ee3772ec74eb1ef74df4acf930cf99028ca8b8423408922d2450434f222b68e64bd927b9
|
7
|
+
data.tar.gz: b7be03740c3004f80ece9fb7b3662e4fcbaec530603af948c6d805e68cb09bfce3e15231b7e39a6203eeb68244807797fa80c2d032d94928aef0f4690d48bb4e
|
@@ -8,3 +8,6 @@ application.register("para-admin-flash-message", ParaAdminFlashMessageController
|
|
8
8
|
|
9
9
|
import SelectizeFieldController from "./selectize_field_controller";
|
10
10
|
application.register("selectize-field", SelectizeFieldController);
|
11
|
+
|
12
|
+
import NestedManyInputController from "./nested_many_input_controller";
|
13
|
+
application.register("nested-many-input", NestedManyInputController);
|
data/app/javascripts/para/{inputs/nested_many.js → controllers/nested_many_input_controller.js}
RENAMED
@@ -1,52 +1,70 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import { Controller } from '@hotwired/stimulus';
|
2
|
+
|
3
|
+
export default class extends Controller {
|
4
|
+
connect() {
|
3
5
|
this.stoppingPropagation = this.stoppingPropagation.bind(this);
|
4
6
|
this.afterInsertField = this.afterInsertField.bind(this);
|
5
7
|
this.beforeRemoveField = this.beforeRemoveField.bind(this);
|
6
|
-
|
8
|
+
this.handleOrderingUpdated = this.handleOrderingUpdated.bind(this);
|
7
9
|
this.afterRemoveField = this.afterRemoveField.bind(this);
|
8
10
|
this.collapseShown = this.collapseShown.bind(this);
|
9
|
-
|
11
|
+
|
12
|
+
this.$field = $(this.element);
|
10
13
|
this.$fieldsList = this.$field.find('.fields-list');
|
11
|
-
this.
|
14
|
+
this.initializeSortable();
|
12
15
|
this.initializeCocoon();
|
13
16
|
this.$field.on('shown.bs.collapse', this.stoppingPropagation(this.collapseShown));
|
14
17
|
}
|
15
18
|
|
16
|
-
|
17
|
-
this.
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
initializeSortable() {
|
20
|
+
this.isSortable = this.$field.hasClass('orderable');
|
21
|
+
|
22
|
+
if (!this.isSortable) return;
|
23
|
+
|
21
24
|
return this.$fieldsList.sortable({
|
22
25
|
handle: '.order-anchor',
|
23
26
|
animation: 150,
|
24
|
-
onUpdate:
|
27
|
+
onUpdate: this.handleOrderingUpdated
|
25
28
|
});
|
26
29
|
}
|
27
30
|
|
28
31
|
handleOrderingUpdated() {
|
29
32
|
var formFields;
|
30
33
|
formFields = [];
|
34
|
+
|
31
35
|
return this.$fieldsList.find('.form-fields:visible').each(function(_i, el) {
|
32
|
-
|
36
|
+
let $parent, isNestedField, j, len;
|
37
|
+
|
33
38
|
for (j = 0, len = formFields.length; j < len; j++) {
|
34
39
|
$parent = formFields[j];
|
35
40
|
isNestedField = $parent.find(el).length;
|
36
41
|
}
|
42
|
+
|
37
43
|
if (isNestedField) {
|
38
44
|
return;
|
39
45
|
}
|
40
|
-
|
46
|
+
|
47
|
+
const $el = $(el);
|
41
48
|
$el.find('.resource-position-field:eq(0)').val(formFields.length);
|
42
49
|
return formFields.push($el);
|
43
50
|
});
|
44
51
|
}
|
45
52
|
|
46
53
|
initializeCocoon() {
|
47
|
-
this.$fieldsList.on(
|
48
|
-
|
49
|
-
|
54
|
+
this.$fieldsList.on(
|
55
|
+
'cocoon:after-insert',
|
56
|
+
this.stoppingPropagation(this.afterInsertField)
|
57
|
+
);
|
58
|
+
|
59
|
+
this.$fieldsList.on(
|
60
|
+
'cocoon:before-remove',
|
61
|
+
this.stoppingPropagation(this.beforeRemoveField)
|
62
|
+
);
|
63
|
+
|
64
|
+
return this.$fieldsList.on(
|
65
|
+
'cocoon:after-remove',
|
66
|
+
this.stoppingPropagation(this.afterRemoveField)
|
67
|
+
);
|
50
68
|
}
|
51
69
|
|
52
70
|
stoppingPropagation(callback) {
|
@@ -61,9 +79,9 @@ Para.NestedManyField = class NestedManyField {
|
|
61
79
|
if (($collapsible = $element.find('[data-open-on-insert="true"]')).length) {
|
62
80
|
this.openInsertedField($collapsible);
|
63
81
|
}
|
64
|
-
if (this.
|
82
|
+
if (this.isSortable) {
|
65
83
|
this.$fieldsList.sortable('destroy');
|
66
|
-
this.
|
84
|
+
this.initializeSortable();
|
67
85
|
this.handleOrderingUpdated();
|
68
86
|
}
|
69
87
|
return $element.simpleForm();
|
@@ -90,22 +108,24 @@ Para.NestedManyField = class NestedManyField {
|
|
90
108
|
}
|
91
109
|
|
92
110
|
collapseShown(e) {
|
93
|
-
|
94
|
-
|
95
|
-
if (
|
96
|
-
return this.initializeCollapseContent(
|
111
|
+
const { target } = e;
|
112
|
+
|
113
|
+
if (target.dataset.isRendered) {
|
114
|
+
return this.initializeCollapseContent(target);
|
97
115
|
} else {
|
98
|
-
this.loadCollapseContent(
|
99
|
-
return this.scrollToTarget(
|
116
|
+
this.loadCollapseContent(target);
|
117
|
+
return this.scrollToTarget(target);
|
100
118
|
}
|
101
119
|
}
|
102
120
|
|
103
|
-
initializeCollapseContent(
|
104
|
-
this.scrollToTarget(
|
105
|
-
return this.
|
121
|
+
initializeCollapseContent(target) {
|
122
|
+
this.scrollToTarget(target);
|
123
|
+
return this.focusFirstVisibleInputInside(target);
|
106
124
|
}
|
107
125
|
|
108
|
-
scrollToTarget(
|
126
|
+
scrollToTarget(target) {
|
127
|
+
const $target = $(target);
|
128
|
+
|
109
129
|
var $affixNavTabs, $field, scrollOffset;
|
110
130
|
$field = this.$field.find(`[data-toggle='collapse'][href='#${$target.attr('id')}']`);
|
111
131
|
scrollOffset = -($('[data-header]').outerHeight() + 30);
|
@@ -117,35 +137,32 @@ Para.NestedManyField = class NestedManyField {
|
|
117
137
|
});
|
118
138
|
}
|
119
139
|
|
120
|
-
|
121
|
-
|
140
|
+
focusFirstVisibleInputInside(target) {
|
141
|
+
setTimeout(() => {
|
142
|
+
target.querySelector('input:not([type="hidden"]), textarea, select')?.focus();
|
143
|
+
}, 100);
|
122
144
|
}
|
123
145
|
|
124
|
-
loadCollapseContent(
|
125
|
-
|
126
|
-
targetUrl =
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
data = {
|
131
|
-
|
132
|
-
|
133
|
-
|
146
|
+
loadCollapseContent(target) {
|
147
|
+
const $target = $(target);
|
148
|
+
const targetUrl = target.dataset.renderPath;
|
149
|
+
|
150
|
+
if (!targetUrl) return;
|
151
|
+
|
152
|
+
const data = {
|
153
|
+
id: target.dataset.id,
|
154
|
+
object_name: target.dataset.objectName,
|
155
|
+
model_name: target.dataset.modelName
|
134
156
|
};
|
135
|
-
|
136
|
-
|
137
|
-
$content = $(resp);
|
138
|
-
$target.find(
|
157
|
+
|
158
|
+
$.get(targetUrl, data).then((resp) => {
|
159
|
+
const $content = $(resp);
|
160
|
+
$target.find('[data-nested-form-container]:eq(0)').html($content);
|
139
161
|
$content.simpleForm();
|
140
|
-
|
141
|
-
|
162
|
+
|
163
|
+
this.focusFirstVisibleInputInside(target);
|
164
|
+
|
165
|
+
target.dataset.isRendered = true;
|
142
166
|
});
|
143
167
|
}
|
144
|
-
|
145
168
|
};
|
146
|
-
|
147
|
-
$.simpleForm.onDomReady(function($document) {
|
148
|
-
return $document.find('.nested-many-field').each(function(i, el) {
|
149
|
-
return new Para.NestedManyField($(el));
|
150
|
-
});
|
151
|
-
});
|
@@ -1,4 +1,4 @@
|
|
1
|
-
.nested-many-field{ class: [('orderable' if orderable), ('nested-many-field-inset' if inset)] }
|
1
|
+
.nested-many-field{ class: [('orderable' if orderable), ('nested-many-field-inset' if inset)], data: { controller: "nested-many-input" } }
|
2
2
|
.fields-list{ id: dom_identifier }
|
3
3
|
= form.simple_fields_for attribute_name, resources, nested_attribute_name: attribute_name, orderable: orderable, track_attribute_mappings: render_partial do |nested_form|
|
4
4
|
= render partial: find_partial_for(model, 'nested_many/container', partial_dir: 'inputs'), locals: { form: nested_form, model: nested_form.object.class, subclass: subclass, allow_destroy_if: allow_destroy_if, nested_locals: nested_locals, inset: inset, uncollapsed: uncollapsed, render_partial: render_partial, remote_partial_params: remote_partial_params }
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
= form.remove_association_button(allow_destroy_if: allow_destroy_if)
|
13
13
|
|
14
|
-
.panel-collapse.form-inputs.collapse{ id: form.nested_resource_dom_id, class: ('in' if uncollapsed && form.object.persisted?), data: {
|
14
|
+
.panel-collapse.form-inputs.collapse{ id: form.nested_resource_dom_id, class: ('in' if uncollapsed && form.object.persisted?), data: { is_rendered: (render_partial && "true"), render_path: @component.path(**remote_partial_params), id: form.object.id, :"object-name" => form.object_name, :"model-name" => model.name } }
|
15
15
|
.panel-body{ data: { :"nested-form-container" => true } }
|
16
16
|
- if render_partial
|
17
17
|
= render partial: find_partial_for(model, form.nested_fields_partial_name), locals: { form: form }.merge(nested_locals)
|
data/lib/para/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: para
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Valentin Ballestrino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_decorator
|
@@ -479,13 +479,12 @@ files:
|
|
479
479
|
- app/javascripts/para/application.js
|
480
480
|
- app/javascripts/para/controllers/application.js
|
481
481
|
- app/javascripts/para/controllers/index.js
|
482
|
+
- app/javascripts/para/controllers/nested_many_input_controller.js
|
482
483
|
- app/javascripts/para/controllers/para_admin_flash_message_controller.js
|
483
484
|
- app/javascripts/para/controllers/para_admin_modal_controller.js
|
484
485
|
- app/javascripts/para/controllers/selectize_field_controller.js
|
485
486
|
- app/javascripts/para/index.js
|
486
|
-
- app/javascripts/para/inputs/material-input.js
|
487
487
|
- app/javascripts/para/inputs/multi-select-input.js
|
488
|
-
- app/javascripts/para/inputs/nested_many.js
|
489
488
|
- app/javascripts/para/lib/fetch.js
|
490
489
|
- app/javascripts/para/plugins-includes.js.erb
|
491
490
|
- app/javascripts/para/simple_form_extension/colorpicker.js
|
@@ -793,7 +792,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
793
792
|
- !ruby/object:Gem::Version
|
794
793
|
version: '0'
|
795
794
|
requirements: []
|
796
|
-
rubygems_version: 3.
|
795
|
+
rubygems_version: 3.5.17
|
797
796
|
signing_key:
|
798
797
|
specification_version: 4
|
799
798
|
summary: Rails admin engine
|
@@ -1,7 +0,0 @@
|
|
1
|
-
$(document).on('page:change turbo:load turbo:frame-load', function() {
|
2
|
-
return $('body').on('focusin focusout', 'input, select, textarea', function(e) {
|
3
|
-
var focused;
|
4
|
-
focused = e.type === 'focusin';
|
5
|
-
return $(e.target).closest('.form-group').toggleClass('focused', focused);
|
6
|
-
});
|
7
|
-
});
|