Skip to content

Commit 25328d4

Browse files
committed
arrayIndices to allow conditions to access the array index in nested arrays
1 parent 513d5bb commit 25328d4

File tree

2 files changed

+271
-1
lines changed

2 files changed

+271
-1
lines changed

src/services/builder.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,17 @@ export default function(sfPathProvider) {
113113
'.condition, { model: model, "arrayIndex": $index})';
114114
if (args.form.key) {
115115
var strKey = sfPathProvider.stringify(args.form.key);
116+
var arrayDepth = args.form.key.filter(function(e) { return e === '' }).length;
117+
var arrayIndices = (arrayDepth > 1 ? Array(arrayDepth - 1).join('$parent.$parent.$parent.') + '$parent.$parent.$index,' : '');
118+
for (var i = arrayDepth; i > 2; i--) {
119+
arrayIndices += Array(i - 1).join('$parent.$parent.$parent.') + '$index,';
120+
}
121+
arrayIndices += '$index';
122+
116123
evalExpr = 'evalExpr(' + args.path + '.condition,{ model: model, "arrayIndex": $index, ' +
124+
'"arrayIndices": [' + arrayIndices + '],' +
117125
'"modelValue": model' + (strKey[0] === '[' ? '' : '.') + strKey + '})';
118-
};
126+
}
119127

120128
var children = args.fieldFrag.children || args.fieldFrag.childNodes;
121129
for (var i = 0; i < children.length; i++) {

test/directives/schema-form-test.js

+262
Original file line numberDiff line numberDiff line change
@@ -2578,7 +2578,269 @@ describe('directive', function() {
25782578

25792579
});
25802580
});
2581+
2582+
it('should remove or add fields in an array depending on conditions using arrayIndices', function (done) {
25812583

2584+
inject(function ($compile, $rootScope) {
2585+
var scope = $rootScope.$new();
2586+
scope.model = {
2587+
"transportCategory": [
2588+
{
2589+
"mode": "Car",
2590+
"transportOption": [
2591+
{
2592+
"name": "Bertie",
2593+
"forSale": "yes",
2594+
"price": 100,
2595+
"history": {
2596+
"historyKnown": "no"
2597+
}
2598+
},
2599+
{
2600+
"name": "Lightning McQueen",
2601+
"forSale": "no",
2602+
"history": {
2603+
"historyKnown": "yes",
2604+
"previousOwners": [
2605+
{
2606+
"ownerName": ""
2607+
},
2608+
{
2609+
"ownerName": "Arlo",
2610+
"logBookProvided": "yes",
2611+
"logBookEntry": [
2612+
{
2613+
"entryId": 2,
2614+
"entryDate": "2015-06-23"
2615+
},
2616+
{
2617+
"entryId": 4
2618+
}
2619+
]
2620+
}
2621+
]
2622+
}
2623+
}
2624+
]
2625+
},
2626+
{
2627+
"mode": "Horse",
2628+
"transportOption": [
2629+
{
2630+
"name": "Phar Lap",
2631+
"forSale": "no"
2632+
},
2633+
{
2634+
"name": "Greyhound",
2635+
"forSale": "yes",
2636+
"price": 1000,
2637+
"history": {
2638+
"historyKnown": "yes",
2639+
"previousOwners": [
2640+
{
2641+
"ownerName": "Tom"
2642+
}
2643+
]
2644+
}
2645+
}
2646+
]
2647+
}
2648+
]
2649+
};
2650+
2651+
scope.schema = {
2652+
type: "object",
2653+
properties: {
2654+
transportCategory: {
2655+
type: "array",
2656+
items: {
2657+
type: "object",
2658+
properties: {
2659+
mode: { type: "string", enum: ["Car", "Motorbike", "Horse"] },
2660+
transportOption: {
2661+
type: "array",
2662+
items: {
2663+
type: "object",
2664+
properties: {
2665+
name: { type: "string" },
2666+
numberOfWheels: { type: "number" },
2667+
forSale: { type: "string", enum: ["yes", "no"] },
2668+
price: { type: "number" },
2669+
history: {
2670+
type: "object",
2671+
properties: {
2672+
historyKnown: { type: "string", enum: ["yes", "no"] },
2673+
previousOwners: {
2674+
type: "array",
2675+
items: {
2676+
type: "object",
2677+
properties: {
2678+
ownerName: { type: "string" },
2679+
purchaseDate: { type: "string" },
2680+
logBookProvided: { type: "string", enum: ["yes", "no"] },
2681+
logBookEntry: {
2682+
type: "array",
2683+
items: {
2684+
type: "object",
2685+
properties: {
2686+
entryId: { type: "number" },
2687+
entryDate: { type: "string" },
2688+
entryNote: { type: "string" }
2689+
}
2690+
}
2691+
}
2692+
}
2693+
}
2694+
}
2695+
}
2696+
}
2697+
}
2698+
}
2699+
}
2700+
}
2701+
}
2702+
}
2703+
}
2704+
};
2705+
2706+
scope.form = [
2707+
{
2708+
key: "transportCategory",
2709+
items: [
2710+
"transportCategory[].mode",
2711+
{
2712+
key: "transportCategory[].transportOption",
2713+
items: [
2714+
"transportCategory[].transportOption[].name",
2715+
{
2716+
key: "transportCategory[].transportOption[].numberOfWheels",
2717+
condition: "model.transportCategory[arrayIndices[0]].mode != 'Horse'"
2718+
},
2719+
"transportCategory[].transportOption[].forSale",
2720+
{
2721+
key: "transportCategory[].transportOption[].price",
2722+
condition: "model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].forSale == 'yes'"
2723+
},
2724+
"transportCategory[].transportOption[].history.historyKnown",
2725+
{
2726+
key: "transportCategory[].transportOption[].history.previousOwners",
2727+
condition: "model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].history.historyKnown == 'yes'",
2728+
items: [
2729+
"transportCategory[].transportOption[].history.previousOwners[].ownerName",
2730+
{
2731+
key: "transportCategory[].transportOption[].history.previousOwners[].purchaseDate",
2732+
condition: "model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].history.previousOwners[arrayIndices[2]].ownerName.length > 2",
2733+
},
2734+
{
2735+
key: "transportCategory[].transportOption[].history.previousOwners[].logBookProvided",
2736+
condition: "model.transportCategory[arrayIndices[0]].mode != 'Horse' && model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].history.previousOwners[arrayIndices[2]].ownerName.length > 2"
2737+
},
2738+
{
2739+
key: "transportCategory[].transportOption[].history.previousOwners[].logBookEntry",
2740+
condition: "model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].history.previousOwners[arrayIndices[2]].logBookProvided == 'yes'",
2741+
items: [
2742+
"transportCategory[].transportOption[].history.previousOwners[].logBookEntry[].entryId",
2743+
"transportCategory[].transportOption[].history.previousOwners[].logBookEntry[].entryDate",
2744+
{
2745+
key: "transportCategory[].transportOption[].history.previousOwners[].logBookEntry[].entryNote",
2746+
condition: "model.transportCategory[arrayIndices[0]].transportOption[arrayIndices[1]].history.previousOwners[arrayIndices[2]].logBookEntry[arrayIndices[3]].entryDate.length > 2"
2747+
}
2748+
]
2749+
}
2750+
]
2751+
}
2752+
]
2753+
}
2754+
]
2755+
}
2756+
];
2757+
2758+
var tmpl = angular.element('<form sf-schema="schema" sf-form="form" sf-model="model"></form>');
2759+
2760+
$compile(tmpl)(scope);
2761+
$rootScope.$apply();
2762+
2763+
//References to sections of the rendered form to make the test more readable
2764+
var renderedForm = {
2765+
node: tmpl.children().eq(0).children().eq(1),
2766+
transportCategory: [
2767+
{
2768+
node: tmpl.children().eq(0).children().eq(1).children().eq(0),
2769+
},
2770+
{
2771+
node: tmpl.children().eq(0).children().eq(1).children().eq(1),
2772+
}
2773+
]
2774+
};
2775+
2776+
renderedForm.transportCategory[0]['transportOption'] = [
2777+
{ node: renderedForm.transportCategory[0].node.children().eq(2).children().eq(1).children().eq(0) },
2778+
{ node: renderedForm.transportCategory[0].node.children().eq(2).children().eq(1).children().eq(1) }
2779+
];
2780+
2781+
renderedForm.transportCategory[1]['transportOption'] = [
2782+
{ node: renderedForm.transportCategory[1].node.children().eq(2).children().eq(1).children().eq(0) },
2783+
{ node: renderedForm.transportCategory[1].node.children().eq(2).children().eq(1).children().eq(1) }
2784+
];
2785+
2786+
renderedForm.transportCategory[0].transportOption[1]['history'] = {
2787+
previousOwners: [
2788+
{ node: renderedForm.transportCategory[0].transportOption[1].node.children().eq(5).children().eq(0) },
2789+
{ node: renderedForm.transportCategory[0].transportOption[1].node.children().eq(5).children().eq(1) }
2790+
]
2791+
};
2792+
2793+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1]['logBookEntry'] = [
2794+
{ node: renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].node.children().eq(1).children().eq(4).children().eq(1).children().eq(0) },
2795+
{ node: renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].node.children().eq(1).children().eq(4).children().eq(1).children().eq(1) }
2796+
];
2797+
2798+
/*** transportCategory[].transportOption[].numberOfWheels condition tests ***/
2799+
renderedForm.transportCategory[0].node.find('input[name="numberOfWheels"]').length.should.be.eq(2);
2800+
renderedForm.transportCategory[1].node.find('input[name="numberOfWheels"]').length.should.be.eq(0);
2801+
renderedForm.transportCategory[0].transportOption[0].node.find('input[name="numberOfWheels"]').length.should.be.eq(1);
2802+
renderedForm.transportCategory[0].transportOption[1].node.find('input[name="numberOfWheels"]').length.should.be.eq(1);
2803+
renderedForm.transportCategory[1].transportOption[0].node.find('input[name="numberOfWheels"]').length.should.be.eq(0);
2804+
renderedForm.transportCategory[1].transportOption[1].node.find('input[name="numberOfWheels"]').length.should.be.eq(0);
2805+
2806+
/*** transportCategory[].transportOption[].price field condition tests ***/
2807+
renderedForm.node.children().find('input[name="price"]').length.should.be.eq(2);
2808+
renderedForm.transportCategory[0].transportOption[0].node.find('input[name="price"]').length.should.be.eq(1);
2809+
renderedForm.transportCategory[0].transportOption[1].node.find('input[name="price"]').length.should.be.eq(0);
2810+
renderedForm.transportCategory[1].transportOption[0].node.find('input[name="price"]').length.should.be.eq(0);
2811+
renderedForm.transportCategory[1].transportOption[1].node.find('input[name="price"]').length.should.be.eq(1);
2812+
2813+
/*** transportCategory[].transportOption[].history.previousOwners.ownerName field condition tests ***/
2814+
renderedForm.transportCategory[0].transportOption[0].node.find('input[name="ownerName"]').length.should.be.eq(0);
2815+
renderedForm.transportCategory[0].transportOption[1].node.find('input[name="ownerName"]').length.should.be.eq(2);
2816+
renderedForm.transportCategory[1].transportOption[0].node.find('input[name="ownerName"]').length.should.be.eq(0);
2817+
renderedForm.transportCategory[1].transportOption[1].node.find('input[name="ownerName"]').length.should.be.eq(1);
2818+
2819+
/*** transportCategory[].transportOption[].history.previousOwners[].purchaseDate field condition tests ***/
2820+
renderedForm.transportCategory[0].transportOption[0].node.find('input[name="purchaseDate"]').length.should.be.eq(0);
2821+
renderedForm.transportCategory[0].transportOption[1].node.find('input[name="purchaseDate"]').length.should.be.eq(1);
2822+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[0].node.find('input[name="purchaseDate"]').length.should.be.eq(0);
2823+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].node.find('input[name="purchaseDate"]').length.should.be.eq(1);
2824+
2825+
renderedForm.transportCategory[1].transportOption[0].node.find('input[name="purchaseDate"]').length.should.be.eq(0);
2826+
renderedForm.transportCategory[1].transportOption[1].node.find('input[name="purchaseDate"]').length.should.be.eq(1);
2827+
2828+
/*** transportCategory[].transportOption[].history.previousOwners[].logBookProvided field condition tests ***/
2829+
renderedForm.transportCategory[0].transportOption[0].node.find('select[name="logBookProvided"]').length.should.be.eq(0);
2830+
renderedForm.transportCategory[0].transportOption[1].node.find('select[name="logBookProvided"]').length.should.be.eq(1);
2831+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[0].node.find('select[name="logBookProvided"]').length.should.be.eq(0);
2832+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].node.find('select[name="logBookProvided"]').length.should.be.eq(1);
2833+
2834+
renderedForm.transportCategory[1].transportOption[0].node.find('select[name="logBookProvided"]').length.should.be.eq(0);
2835+
renderedForm.transportCategory[1].transportOption[1].node.find('select[name="logBookProvided"]').length.should.be.eq(0);
2836+
2837+
/*** transportCategory[].transportOption[].history.previousOwners[].logBookEntry[].entryNote field condition tests ***/
2838+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].logBookEntry[0].node.find('input[name="entryNote"]').length.should.be.eq(1);
2839+
renderedForm.transportCategory[0].transportOption[1].history.previousOwners[1].logBookEntry[1].node.find('input[name="entryNote"]').length.should.be.eq(0);
2840+
2841+
done();
2842+
});
2843+
});
25822844

25832845
});
25842846

0 commit comments

Comments
 (0)