Skip to content

Commit 1f15ecf

Browse files
committedMar 21, 2017
Cleaned up abilities page
Decided to use ng-tables to solve the repetition problem, much cleaner code for abilities.html Added rules in for priority changing in abilities. Fixed the abilities so user can zero out ability points.
1 parent dc47cc1 commit 1f15ecf

File tree

5 files changed

+143
-343
lines changed

5 files changed

+143
-343
lines changed
 

‎abilities.html

+32-254
Original file line numberDiff line numberDiff line change
@@ -31,272 +31,49 @@
3131
<div class="num">{{abCtrl.getPriorityPts(abCtrl.selectedPriorities[2])}}</div>
3232
</th>
3333
</tr>
34-
<tr>
35-
<td style="width:90px;">
36-
<div class="abLabel">Alertness</div>
34+
</table>
35+
<table ng-table="abCtrl.tableParams1" show-filter="false" style="width:1140px;">
36+
<tr ng-repeat="ability in $data">
37+
<td style="width:97px;">
38+
<div class="abLabel">
39+
{{ability.col1.name}}
40+
</div>
3741
</td>
38-
<td>
39-
<div ng-repeat="alrPt in abCtrl.alertness.points" style="display: inline-block;">
40-
<img ng-src="{{alrPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.alertness, $index)"
41-
style="width:15px; height: 15px;" />
42+
<td class="points-cell">
43+
<div ng-repeat="abPt in ability.col1.points" style="display: inline-block;">
44+
<img ng-src="{{abPt.img}}" ng-click="abCtrl.selectAbility(ability.col1, $index)"
45+
style="width: 15px; height: 15px;"/>
4246
</div>
4347
</td>
44-
<td style="width:110px;">
45-
<div class="abLabel">Animal Ken</div>
48+
<td style="width:117px;">
49+
<div class="abLabel">
50+
{{ability.col2.name}}
51+
</div>
4652
</td>
47-
<td>
48-
<div ng-repeat="ankPt in abCtrl.animalken.points" style="display: inline-block;">
49-
<img ng-src="{{ankPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.animalken, $index)"
50-
style="width:15px; height: 15px;" />
51-
</div>
53+
<td class="points-cell">
54+
<div ng-repeat="abPt in ability.col2.points" style="display: inline-block;">
55+
<img ng-src="{{abPt.img}}" ng-click="abCtrl.selectAbility(ability.col2, $index)"
56+
style="width: 15px; height: 15px;"/>
57+
</div>
5258
</td>
5359
<td style="width:110px;">
54-
<div class="abLabel">Academics</div>
55-
</td>
56-
<td>
57-
<div ng-repeat="acaPt in abCtrl.academics.points" style="display: inline-block;">
58-
<img ng-src="{{acaPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.academics, $index)"
59-
style="width:15px; height: 15px;" />
60-
</td>
61-
</tr>
62-
<tr>
63-
<td style="width:90px;">
64-
<div class="abLabel">Athletics</div>
65-
</td>
66-
<td>
67-
<div ng-repeat="athPt in abCtrl.athletics.points" style="display: inline-block;">
68-
<img ng-src="{{athPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.athletics, $index)"
69-
style="width:15px; height: 15px;" />
70-
</td>
71-
<td>
72-
<div class="abLabel">Crafts</div>
73-
</td>
74-
<td>
75-
<div ng-repeat="crfPt in abCtrl.crafts.points" style="display: inline-block;">
76-
<img ng-src="{{crfPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.crafts, $index)"
77-
style="width:15px; height: 15px;" />
78-
</td>
79-
<td>
80-
<div class="abLabel">Computer</div>
81-
</td>
82-
<td>
83-
<div ng-repeat="comPt in abCtrl.computer.points" style="display: inline-block;">
84-
<img ng-src="{{comPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.computer, $index)"
85-
style="width:15px; height: 15px;" />
86-
</td>
87-
</tr>
88-
<tr>
89-
<td>
90-
<div class="abLabel">Awareness</div>
91-
</td>
92-
<td>
93-
<div ng-repeat="awaPt in abCtrl.awareness.points" style="display: inline-block;">
94-
<img ng-src="{{awaPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.awareness, $index)"
95-
style="width:15px; height: 15px;" />
96-
</td>
97-
<td>
98-
<div class="abLabel">Drive</div>
99-
</td>
100-
<td>
101-
<div ng-repeat="drvPt in abCtrl.drive.points" style="display: inline-block;">
102-
<img ng-src="{{drvPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.drive, $index)"
103-
style="width:15px; height: 15px;" />
104-
</td>
105-
<td>
106-
<div class="abLabel">Finance</div>
107-
</td>
108-
<td>
109-
<div ng-repeat="finPt in abCtrl.finance.points" style="display: inline-block;">
110-
<img ng-src="{{finPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.finance, $index)"
111-
style="width:15px; height: 15px;" />
112-
</td>
113-
</tr>
114-
<tr>
115-
<td>
116-
<div class="abLabel">Brawl</div>
117-
</td>
118-
<td>
119-
<div ng-repeat="brwPt in abCtrl.brawl.points" style="display: inline-block;">
120-
<img ng-src="{{brwPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.brawl, $index)"
121-
style="width:15px; height: 15px;" />
122-
</td>
123-
<td>
124-
<div class="abLabel">Etiquette</div>
125-
</td>
126-
<td>
127-
<div ng-repeat="etqPt in abCtrl.etiquette.points" style="display: inline-block;">
128-
<img ng-src="{{etqPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.etiquette, $index)"
129-
style="width:15px; height: 15px;" />
130-
</td>
131-
<td>
132-
<div class="abLabel">Investigation</div>
133-
</td>
134-
<td>
135-
<div ng-repeat="invPt in abCtrl.investigation.points" style="display: inline-block;">
136-
<img ng-src="{{invPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.investigation, $index)"
137-
style="width:15px; height: 15px;" />
138-
</td>
139-
</tr>
140-
<tr>
141-
<td>
142-
<div class="abLabel">Empathy</div>
143-
</td>
144-
<td>
145-
<div ng-repeat="empPt in abCtrl.empathy.points" style="display: inline-block;">
146-
<img ng-src="{{empPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.empathy, $index)"
147-
style="width:15px; height: 15px;" />
148-
</td>
149-
<td>
150-
<div class="abLabel">Firearms</div>
151-
</td>
152-
<td>
153-
<div ng-repeat="firPt in abCtrl.firearms.points" style="display: inline-block;">
154-
<img ng-src="{{firPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.firearms, $index)"
155-
style="width:15px; height: 15px;" />
156-
</td>
157-
<td>
158-
<div class="abLabel">Law</div>
159-
</td>
160-
<td>
161-
<div ng-repeat="lawPt in abCtrl.law.points" style="display: inline-block;">
162-
<img ng-src="{{lawPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.law, $index)"
163-
style="width:15px; height: 15px;" />
164-
</td>
165-
</tr>
166-
<tr>
167-
<td>
168-
<div class="abLabel">Expression</div>
169-
</td>
170-
<td>
171-
<div ng-repeat="expPt in abCtrl.expression.points" style="display: inline-block;">
172-
<img ng-src="{{expPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.expression, $index)"
173-
style="width:15px; height: 15px;" />
174-
</td>
175-
<td>
176-
<div class="abLabel">Larceny</div>
177-
</td>
178-
<td>
179-
<div ng-repeat="larPt in abCtrl.larceny.points" style="display: inline-block;">
180-
<img ng-src="{{larPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.larceny, $index)"
181-
style="width:15px; height: 15px;" />
182-
</td>
183-
<td>
184-
<div class="abLabel">Medicine</div>
185-
</td>
186-
<td>
187-
<div ng-repeat="medPt in abCtrl.medicine.points" style="display: inline-block;">
188-
<img ng-src="{{medPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.medicine, $index)"
189-
style="width:15px; height: 15px;" />
190-
</td>
191-
</tr>
192-
<tr>
193-
<td>
194-
<div class="abLabel">Intimidation</div>
195-
</td>
196-
<td>
197-
<div ng-repeat="intPt in abCtrl.intimidation.points" style="display: inline-block;">
198-
<img ng-src="{{intPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.intimidation, $index)"
199-
style="width:15px; height: 15px;" />
200-
</td>
201-
<td>
202-
<div class="abLabel">Melee</div>
203-
</td>
204-
<td>
205-
<div ng-repeat="melPt in abCtrl.melee.points" style="display: inline-block;">
206-
<img ng-src="{{melPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.melee, $index)"
207-
style="width:15px; height: 15px;" />
208-
</td>
209-
<td>
210-
<div class="abLabel">Occult</div>
211-
</td>
212-
<td>
213-
<div ng-repeat="occPt in abCtrl.occult.points" style="display: inline-block;">
214-
<img ng-src="{{occPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.occult, $index)"
215-
style="width:15px; height: 15px;" />
216-
</td>
217-
</tr>
218-
<tr>
219-
<td>
220-
<div class="abLabel">Leadership</div>
221-
</td>
222-
<td>
223-
<div ng-repeat="ldrPt in abCtrl.leadership.points" style="display: inline-block;">
224-
<img ng-src="{{ldrPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.leadership, $index)"
225-
style="width:15px; height: 15px;" />
226-
</td>
227-
<td>
228-
<div class="abLabel">Performance</div>
229-
</td>
230-
<td>
231-
<div ng-repeat="prfPt in abCtrl.performance.points" style="display: inline-block;">
232-
<img ng-src="{{prfPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.performance, $index)"
233-
style="width:15px; height: 15px;" />
234-
</td>
235-
<td>
236-
<div class="abLabel">Politics</div>
237-
</td>
238-
<td>
239-
<div ng-repeat="polPt in abCtrl.politics.points" style="display: inline-block;">
240-
<img ng-src="{{polPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.politics, $index)"
241-
style="width:15px; height: 15px;" />
242-
</td>
243-
</tr>
244-
<tr>
245-
<td>
246-
<div class="abLabel">Streetwise</div>
247-
</td>
248-
<td>
249-
<div ng-repeat="stwPt in abCtrl.streetwise.points" style="display: inline-block;">
250-
<img ng-src="{{stwPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.streetwise, $index)"
251-
style="width:15px; height: 15px;" />
252-
</td>
253-
<td>
254-
<div class="abLabel">Stealth</div>
255-
</td>
256-
<td>
257-
<div ng-repeat="stlPt in abCtrl.stealth.points" style="display: inline-block;">
258-
<img ng-src="{{stlPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.stealth, $index)"
259-
style="width:15px; height: 15px;" />
260-
</td>
261-
<td>
262-
<div class="abLabel">Science</div>
263-
</td>
264-
<td>
265-
<div ng-repeat="sciPt in abCtrl.science.points" style="display: inline-block;">
266-
<img ng-src="{{sciPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.science, $index)"
267-
style="width:15px; height: 15px;" />
268-
</td>
269-
</tr>
270-
<tr>
271-
<td>
272-
<div class="abLabel">Subterfuge</div>
273-
</td>
274-
<td>
275-
<div ng-repeat="subPt in abCtrl.subterfuge.points" style="display: inline-block;">
276-
<img ng-src="{{subPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.subterfuge, $index)"
277-
style="width:15px; height: 15px;" />
278-
</td>
279-
<td>
280-
<div class="abLabel">Survival</div>
281-
</td>
282-
<td>
283-
<div ng-repeat="srvPt in abCtrl.survival.points" style="display: inline-block;">
284-
<img ng-src="{{srvPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.survival, $index)"
285-
style="width:15px; height: 15px;" />
286-
</td>
287-
<td>
288-
<div class="abLabel">Technology</div>
60+
<div class="abLabel">
61+
{{ability.col3.name}}
62+
</div>
28963
</td>
290-
<td>
291-
<div ng-repeat="tchPt in abCtrl.technology.points" style="display: inline-block;">
292-
<img ng-src="{{tchPt.img}}" ng-click="abCtrl.selectAbility(abCtrl.technology, $index)"
293-
style="width:15px; height: 15px;" />
64+
<td class="points-cell">
65+
<div ng-repeat="abPt in ability.col3.points" style="display: inline-block;">
66+
<img ng-src="{{abPt.img}}" ng-click="abCtrl.selectAbility(ability.col3, $index)"
67+
style="width: 15px; height: 15px;"/>
68+
</div>
29469
</td>
29570
</tr>
29671
</table>
297-
<abilitygrid></abilitygrid>
29872

29973
<style>
74+
.points-cell {
75+
width: 272px;
76+
}
30077
.num {
30178
padding-left: 35px;
30279
padding-top: 30px;
@@ -314,5 +91,6 @@
31491
font-weight: 500;
31592
margin-top: 10px;
31693
margin-bottom: 10px;
94+
width: 87px;
31795
}
31896
</style>

‎abilitiesController.js

+106-88
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
var app = angular.module("site");
22

3-
app.controller("AbilitiesController", function(){
3+
app.controller("AbilitiesController", ['$scope','NgTableParams',function($scope, NgTableParams){
44

55
this.getPriority = getPriority;
66
this.getPriorityPts = getPriorityPts;
77
this.selectAbility = selectAbility;
8+
this.priorityChange = priorityChange;
89
this.abilitiesPage = "./abilities.html";
910
this.primaryPts = 13;
1011
this.secondaryPts = 9;
@@ -20,9 +21,20 @@ app.controller("AbilitiesController", function(){
2021
{id: 1, img: "./empty.png"},
2122
{id: 2, img: "./empty.png"},
2223
{id: 3, img: "./empty.png"},
23-
{id: 4, img: "./empty.png"},];
24+
{id: 4, img: "./empty.png"}];
25+
26+
this.reset = function(){
27+
this.points.forEach(function(ability){
28+
ability.img = './empty.png';
29+
});
30+
this.pointCount = 0;
31+
};
2432

2533
this.select = function(index){
34+
if(index == -1){
35+
this.reset();
36+
return;
37+
}
2638
if(this.points[index].img=="./full.png")
2739
{
2840
this.points.forEach(function(point){
@@ -48,36 +60,36 @@ app.controller("AbilitiesController", function(){
4860
};
4961
}
5062
};
51-
this.alertness = new Ability("alertness");
52-
this.athletics = new Ability("athletics");
53-
this.awareness = new Ability("awareness");
54-
this.brawl = new Ability("brawl");
55-
this.empathy = new Ability("empathy");
56-
this.expression = new Ability("expression");
57-
this.intimidation = new Ability("intimidation");
58-
this.leadership = new Ability("leadership");
59-
this.streetwise = new Ability("streetwise");
60-
this.subterfuge = new Ability("subterfuge");
61-
this.animalken = new Ability("animalken");
62-
this.crafts = new Ability("crafts");
63-
this.drive = new Ability("drive");
64-
this.etiquette = new Ability("etiquette");
65-
this.firearms = new Ability("firearms");
66-
this.larceny = new Ability("larceny");
67-
this.melee = new Ability("melee");
68-
this.performance = new Ability("performance");
69-
this.stealth = new Ability("stealth");
70-
this.survival = new Ability("survival");
71-
this.academics = new Ability("academics");
72-
this.computer = new Ability("computer");
73-
this.finance = new Ability("finance");
74-
this.investigation = new Ability("investigation");
75-
this.law = new Ability("law");
76-
this.medicine = new Ability("medicine");
77-
this.occult = new Ability("occult");
78-
this.politics = new Ability("politics");
79-
this.science = new Ability("science");
80-
this.technology = new Ability("technology");
63+
this.alertness = new Ability("Alertness");
64+
this.athletics = new Ability("Athletics");
65+
this.awareness = new Ability("Awareness");
66+
this.brawl = new Ability("Brawl");
67+
this.empathy = new Ability("Empathy");
68+
this.expression = new Ability("Expression");
69+
this.intimidation = new Ability("Intimidation");
70+
this.leadership = new Ability("Leadership");
71+
this.streetwise = new Ability("Streetwise");
72+
this.subterfuge = new Ability("Subterfuge");
73+
this.animalken = new Ability("Animal Ken");
74+
this.crafts = new Ability("Crafts");
75+
this.drive = new Ability("Drive");
76+
this.etiquette = new Ability("Etiquette");
77+
this.firearms = new Ability("Firearms");
78+
this.larceny = new Ability("Larceny");
79+
this.melee = new Ability("Melee");
80+
this.performance = new Ability("Performance");
81+
this.stealth = new Ability("Stealth");
82+
this.survival = new Ability("Survival");
83+
this.academics = new Ability("Academics");
84+
this.computer = new Ability("Computer");
85+
this.finance = new Ability("Finance");
86+
this.investigation = new Ability("Investigation");
87+
this.law = new Ability("Law");
88+
this.medicine = new Ability("Medicine");
89+
this.occult = new Ability("Occult");
90+
this.politics = new Ability("Politics");
91+
this.science = new Ability("Science");
92+
this.technology = new Ability("Technology");
8193

8294
this.abilityCategories = [
8395
{
@@ -131,21 +143,16 @@ app.controller("AbilitiesController", function(){
131143

132144
function selectAbility(ability, index){
133145

134-
//Keep in case a bug pops up, but I think this is fixed.
135-
// var catIndex = this.getCategoryIndex(ability.name);
136-
// var sumPointCount = -3;
137-
// this.abilityCategories[catIndex].abilitys.forEach(function(ability){
138-
// sumPointCount += ability.pointCount;
139-
// });
140-
141146
var priority = this.getPriority(ability);
142147
if(priority==null){
143148
return null;
144149
}
145150
var priorityPts = this.getPriorityPts(priority);
151+
146152
var pointDiff = ability.pointCount - (index+1);
147153

148-
//Do math to make sure they can't spend points they don't have, even when priorityPts isn't equal to 0
154+
//Do math to make sure they can't spend points they don't have,
155+
//even when priorityPts isn't equal to 0.
149156
//Case example: increase 3 pts when priorityPts = 2.
150157
if((priorityPts+pointDiff < 0)){
151158
return null;
@@ -157,8 +164,16 @@ app.controller("AbilitiesController", function(){
157164
return null;
158165
}
159166

160-
//Change the point count in the ability.
161-
ability.pointCount = (index+1);
167+
if(index == 0 && ability.pointCount == 1){
168+
ability.pointCount = 0;
169+
pointDiff = 1;
170+
index = -1;
171+
}
172+
else{
173+
//Change the point count in the ability.
174+
ability.pointCount = (index+1);
175+
}
176+
162177

163178
//Change the total amount of points still available for that category.
164179
switch(priority){
@@ -177,51 +192,54 @@ app.controller("AbilitiesController", function(){
177192
this.abilityPtsTotal += pointDiff;
178193
//Fill in the dots!
179194
ability.select(index);
180-
}
181-
this.rowList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
182-
});
183-
184-
app.directive('abilitygrid', function(){
185-
return {
186-
scope: {row: "@"},
187-
restrict: "E",
188-
controller: "AbilitiesController",
189-
controllerAs: "abCtrl",
190-
template: '<abilityrow ng-repeat="row in abCtrl.rowList"></abilityrow>',
191-
link: function(scope, element, attrs){
192-
scope.row = attrs.row;
195+
};
196+
197+
function priorityChange(changedPriority, id, prevPriority){
198+
this.abilityCategories[id].priority = changedPriority;
199+
for(var i = 0; i < this.selectedPriorities.length; i++){
200+
if(changedPriority == this.selectedPriorities[i] && id != i){
201+
this.selectedPriorities[i] = null;
202+
this.abilityCategories[i].abilities.forEach(function(abil){
203+
abil.reset();
204+
});
205+
}
193206
}
207+
//Reset the dots.
208+
this.abilityCategories[id].abilities.forEach(function(abil){
209+
abil.reset();
210+
211+
});
212+
//Reset the point values.
213+
if(prevPriority == "Primary"){
214+
this.primaryPts = 13;
215+
}
216+
if(prevPriority == "Secondary"){
217+
this.secondaryPts = 9;
218+
}
219+
if(prevPriority == "Tertiary"){
220+
this.tertiaryPts = 5;
221+
}
222+
if(changedPriority == "Primary"){
223+
this.primaryPts = 13;
224+
}
225+
if(changedPriority == "Secondary"){
226+
this.secondaryPts = 9;
227+
}
228+
if(changedPriority == "Tertiary"){
229+
this.tertiaryPts = 5;
230+
}
231+
};
232+
233+
this.dataSet = function(){
234+
var data = [];
235+
for(var i = 0; i < 10; i++){
236+
data.push({col1: this.abilityCategories[0].abilities[i],
237+
col2: this.abilityCategories[1].abilities[i],
238+
col3: this.abilityCategories[2].abilities[i] });
239+
}
240+
return data;
194241
}
195-
})
196-
197-
app.directive('abilityrow', function(){
198-
return {
199-
scope: {row: "@"},
200-
restrict: "E",
201-
controller: 'AbilitiesController',
202-
controllerAs: 'abCtrl',
203-
template: '<ability row="{{row}}">{{row}}</ability>',
204-
link: function(scope, element, attrs){
205-
scope.row = attrs.row;
206-
},
207-
}
208-
});
209-
210-
app.directive('ability', function(){
211-
return {
212-
scope: {row: "@"},
213-
restrict: 'E',
214-
controller: 'AbilitiesController',
215-
controllerAs: 'abCtrl',
216-
template: '<div class="abLabel">{{abCtrl.abilityCategories[row].abilities[row].name}}</div>',
217-
// template: '<td>'+
218-
// '<div class="abLabel">'+ability+'</div>'+
219-
// '</td>'+
220-
// '<td>'+
221-
// '<div ng-repeat="'+ability+'Pt in abCtrl.'+ability+'.points" style="display: inline-block;">'+
222-
// '<img ng-src="{{'+ability+'Pt.img}}" ng-click="abCtrl.selectAbility(abCtrl.'+ability+', $index)"'+
223-
// 'style="width:15px; height: 15px;" />'+
224-
// '</td>',
225-
link: function(scope, element, attrs){}
226-
}
227-
});
242+
this.tableParams1 = new NgTableParams({count: 10},
243+
{ dataset: this.dataSet(), counts: [] });
244+
245+
}]);

‎app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
(function(){
2-
var app = angular.module("site", ["ngRoute"]);
2+
var app = angular.module("site", ["ngRoute", "ngTable"]);
33

44
app.controller("NavController", function($location){
55
this.isActive = function(viewLocation){

‎index.html

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<script type="text/javascript" src="clanController.js"></script>
2424
<script type="text/javascript" src="attributesController.js"></script>
2525
<script type="text/javascript" src="abilitiesController.js"></script>
26+
<script type="text/javascript" src="ng-table.min.js"></script>
2627
<!--dependencies-->
2728
</head>
2829

‎ng-table.min.js

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.