Skip to content

Commit ada2115

Browse files
authored
Merge pull request #560 from matestack/next_release
2.1.1 Release
2 parents 05ef5a8 + 60dc371 commit ada2115

File tree

5 files changed

+128
-6
lines changed

5 files changed

+128
-6
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## v2.1.1 Release - 2021-06-30
4+
5+
### Bugfixes
6+
7+
- Fixed clientside Data Access form new nested forms
8+
39
## v2.1.0 Release - 2021-06-28
410

511
### Improvements

lib/matestack/ui/core/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module Matestack
22
module Ui
33
module Core
4-
VERSION = '2.1.0'
4+
VERSION = '2.1.1'
55
end
66
end
77
end

lib/matestack/ui/vue_js/components/form/form.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ const componentDef = {
106106
var destroyed = true;
107107
}
108108
nestedFormInstance.initValues()
109-
console.log(nestedFormInstance.data)
110109
Vue.set(nestedFormInstance.data)
111110
if(destroyed){
112111
nestedFormInstance.hideNestedForm = true
@@ -410,13 +409,13 @@ const componentDef = {
410409

411410
//initialize nestedForm data in parent form if required
412411
if(this.$parent.data[this.props["fields_for"]] == undefined){
413-
this.$parent.data[this.props["fields_for"]] = [];
412+
this.$set(this.$parent.data, this.props["fields_for"], []);
414413
}
415414
if(this.$parent.nestedForms[this.props["fields_for"]] == undefined){
416-
this.$parent.nestedForms[this.props["fields_for"]] = [];
415+
this.$set(this.$parent.nestedForms, this.props["fields_for"], []);
417416
}
418417
if(this.$parent.deletedNestedForms[this.props["fields_for"]] == undefined){
419-
this.$parent.deletedNestedForms[this.props["fields_for"]] = []
418+
this.$set(this.$parent.deletedNestedForms, this.props["fields_for"], []);
420419
}
421420

422421
var id = parseInt(self.$el.id.replace(this.props["fields_for"]+"_child_", ""));

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "matestack-ui-core",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"main": "./lib/matestack/ui/vue_js/index.js",
55
"files": [
66
"lib",

spec/test/components/dynamic/form/nested_forms_spec.rb

+117
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,123 @@ def form_config
13951395

13961396
end
13971397

1398+
describe "supports addition of nested forms/models on top of EXISTING instances" do
1399+
1400+
before do
1401+
@dummy_model = DummyModel.create(title: "existing-dummy-model-title")
1402+
1403+
class ExamplePage < Matestack::Ui::Page
1404+
1405+
def prepare
1406+
@dummy_model = DummyModel.last
1407+
end
1408+
1409+
def response
1410+
matestack_form form_config do
1411+
form_input key: :title, type: :text, label: "dummy_model_title_input", id: "dummy_model_title_input"
1412+
1413+
@dummy_model.dummy_child_models.each do |dummy_child_model|
1414+
dummy_child_model_form dummy_child_model
1415+
end
1416+
1417+
form_fields_for_add_item key: :dummy_child_models_attributes, prototype: method(:dummy_child_model_form) do
1418+
button "add", type: :button # type: :button is important! otherwise remove on first item is triggered on enter
1419+
end
1420+
1421+
br
1422+
plain "data: {{data}}"
1423+
br
1424+
1425+
button "Submit me!"
1426+
1427+
toggle show_on: "success", hide_after: 1000 do
1428+
plain "success!"
1429+
end
1430+
toggle show_on: "failure", hide_after: 1000 do
1431+
plain "failure!"
1432+
end
1433+
end
1434+
end
1435+
1436+
def dummy_child_model_form dummy_child_model = DummyChildModel.new(title: "init-value")
1437+
form_fields_for dummy_child_model, key: :dummy_child_models_attributes do
1438+
form_input key: :title, type: :text, label: "dummy-child-model-title-input"
1439+
form_fields_for_remove_item do
1440+
button "remove", ":id": "'remove'+nestedFormRuntimeId", type: :button # id is just required in this spec, but type: :button is important! otherwise remove on first item is triggered on enter
1441+
end
1442+
end
1443+
end
1444+
1445+
def form_config
1446+
{
1447+
for: @dummy_model,
1448+
method: :put,
1449+
path: nested_forms_spec_submit_update_path(id: @dummy_model.id),
1450+
success: { emit: "success" },
1451+
failure: { emit: "failure" }
1452+
}
1453+
end
1454+
end
1455+
end
1456+
1457+
it "dynamically adds unlimited new nested forms and enable proper clientside data binding" do
1458+
1459+
visit "/example"
1460+
# sleep
1461+
expect(page).to have_selector('#dummy_model_title_input')
1462+
expect(page).not_to have_selector('#title_dummy_child_models_attributes_child_0')
1463+
expect(page).not_to have_selector('#title_dummy_child_models_attributes_child_1')
1464+
1465+
expect(page).to have_content('data: { "title": "existing-dummy-model-title" }')
1466+
1467+
click_on "add"
1468+
expect(page).to have_selector('#title_dummy_child_models_attributes_child_0')
1469+
1470+
expect(page).to have_content('data: { "title": "existing-dummy-model-title", "dummy_child_models_attributes": [ { "_destroy": false, "id": null, "title": "init-value" } ] }')
1471+
1472+
click_on "add"
1473+
expect(page).to have_selector('#title_dummy_child_models_attributes_child_1')
1474+
1475+
expect(page).to have_content('data: { "title": "existing-dummy-model-title", "dummy_child_models_attributes": [ { "_destroy": false, "id": null, "title": "init-value" }, { "_destroy": false, "id": null, "title": "init-value" } ] }')
1476+
1477+
fill_in "title_dummy_child_models_attributes_child_1", with: "new-value"
1478+
1479+
expect(page).to have_content('data: { "title": "existing-dummy-model-title", "dummy_child_models_attributes": [ { "_destroy": false, "id": null, "title": "init-value" }, { "_destroy": false, "id": null, "title": "new-value" } ] }')
1480+
1481+
click_on("remove_dummy_child_models_attributes_child_0")
1482+
1483+
expect(page).to have_content('data: { "title": "existing-dummy-model-title", "dummy_child_models_attributes": [ { "_destroy": true, "id": null, "title": "init-value" }, { "_destroy": false, "id": null, "title": "new-value" } ] }')
1484+
end
1485+
1486+
it "dynamically adds unlimited new nested forms and enable proper clientside data binding with initially present child models" do
1487+
1488+
dummy_model = DummyModel.last
1489+
child_model_0 = dummy_model.dummy_child_models.create(title: "existing-child-model-title")
1490+
1491+
visit "/example"
1492+
# sleep
1493+
expect(page).to have_selector('#dummy_model_title_input')
1494+
expect(page).to have_selector('#title_dummy_child_models_attributes_child_0')
1495+
expect(page).not_to have_selector('#title_dummy_child_models_attributes_child_1')
1496+
1497+
expect(page).to have_content("data: { \"dummy_child_models_attributes\": [ { \"_destroy\": false, \"id\": \"#{child_model_0.id}\", \"title\": \"existing-child-model-title\" } ], \"title\": \"existing-dummy-model-title\" }")
1498+
1499+
click_on "add"
1500+
expect(page).to have_selector('#title_dummy_child_models_attributes_child_1')
1501+
1502+
expect(page).to have_content("data: { \"dummy_child_models_attributes\": [ { \"_destroy\": false, \"id\": \"#{child_model_0.id}\", \"title\": \"existing-child-model-title\" }, { \"_destroy\": false, \"id\": null, \"title\": \"init-value\" } ], \"title\": \"existing-dummy-model-title\" }")
1503+
1504+
fill_in "title_dummy_child_models_attributes_child_1", with: "new-value"
1505+
1506+
expect(page).to have_content("data: { \"dummy_child_models_attributes\": [ { \"_destroy\": false, \"id\": \"#{child_model_0.id}\", \"title\": \"existing-child-model-title\" }, { \"_destroy\": false, \"id\": null, \"title\": \"new-value\" } ], \"title\": \"existing-dummy-model-title\" }")
1507+
1508+
click_on("remove_dummy_child_models_attributes_child_0")
1509+
1510+
expect(page).to have_content("data: { \"dummy_child_models_attributes\": [ { \"_destroy\": true, \"id\": \"#{child_model_0.id}\", \"title\": \"existing-child-model-title\" }, { \"_destroy\": false, \"id\": null, \"title\": \"new-value\" } ], \"title\": \"existing-dummy-model-title\" }")
1511+
end
1512+
1513+
end
1514+
13981515
end
13991516

14001517
end

0 commit comments

Comments
 (0)