Skip to content

Commit e3eb3e8

Browse files
committed
/series/add: transform catalog number to valid form.
Fix #134
1 parent 9400b7b commit e3eb3e8

File tree

8 files changed

+185
-4
lines changed

8 files changed

+185
-4
lines changed

pom.xml

+18
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
<!-- Also don't forget to change version in src/main/java/ru/mystamps/web/config/MvcConfig.java -->
3737
<bootstrap.version>2.3.1</bootstrap.version>
38+
<jquery.version>1.9.0</jquery.version>
3839

3940
<testng.version>6.7</testng.version>
4041
<spock.version>0.7-groovy-2.0</spock.version>
@@ -54,6 +55,7 @@
5455
<surefire.plugin.version>2.16</surefire.plugin.version>
5556
<gmaven.plugin.version>1.4</gmaven.plugin.version>
5657
<gmaven.runtime.plugin.version>1.5</gmaven.runtime.plugin.version>
58+
<jasmine.plugin.version>1.3.1.4</jasmine.plugin.version>
5759
<failsafe.plugin.version>2.16</failsafe.plugin.version>
5860
<jetty.plugin.version>8.1.14.v20131031</jetty.plugin.version>
5961
<liquibase.plugin.version>3.0.8</liquibase.plugin.version>
@@ -238,6 +240,13 @@
238240
<scope>runtime</scope>
239241
</dependency>
240242

243+
<dependency>
244+
<groupId>org.webjars</groupId>
245+
<artifactId>jquery</artifactId>
246+
<version>${jquery.version}</version>
247+
<scope>runtime</scope>
248+
</dependency>
249+
241250
<dependency>
242251
<groupId>org.projectlombok</groupId>
243252
<artifactId>lombok</artifactId>
@@ -390,6 +399,9 @@
390399
<exclude>liquibase/sql/test-*.sql</exclude>
391400
</excludes>
392401
</resource>
402+
<resource>
403+
<directory>${basedir}/src/main/javascript</directory>
404+
</resource>
393405
</resources>
394406

395407
<filters>
@@ -487,6 +499,12 @@
487499
</dependencies>
488500
</plugin>
489501

502+
<plugin>
503+
<groupId>com.github.searls</groupId>
504+
<artifactId>jasmine-maven-plugin</artifactId>
505+
<version>${jasmine.plugin.version}</version>
506+
</plugin>
507+
490508
<plugin>
491509
<groupId>org.apache.maven.plugins</groupId>
492510
<artifactId>maven-failsafe-plugin</artifactId>

src/main/java/ru/mystamps/web/config/MvcConfig.java

+3
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,13 @@ public void addViewControllers(ViewControllerRegistry registry) {
6868
@Override
6969
public void addResourceHandlers(ResourceHandlerRegistry registry) {
7070
registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/*");
71+
registry.addResourceHandler("/public/js/*.js").addResourceLocations("/WEB-INF/classes/*.js");
7172

7273
// For WebJars:
7374
registry.addResourceHandler("/public/bootstrap/**")
7475
.addResourceLocations("classpath:/META-INF/resources/webjars/bootstrap/2.3.1/");
76+
registry.addResourceHandler("/public/jquery/**")
77+
.addResourceLocations("classpath:/META-INF/resources/webjars/jquery/1.9.0/");
7578
}
7679

7780
@Override

src/main/javascript/CatalogUtils.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
var CatalogUtils = {
2+
3+
/** @public */
4+
expandNumbers: function(input) {
5+
if (input === '' || input === null || typeof(input) === 'undefined') {
6+
return input;
7+
}
8+
9+
if (input.indexOf('-') < 0) {
10+
return input;
11+
}
12+
13+
if (! /^[0-9]+-[0-9]+(,[0-9]+-[0-9]+)*$/.test(input)) {
14+
return input;
15+
}
16+
17+
var ranges = input.split(','),
18+
result = [];
19+
// TODO: use jQuery.each() + jQuery.map()
20+
for (var i = 0; i < ranges.length; i++) {
21+
var range = ranges[i];
22+
result.push(this.expandRange(range));
23+
}
24+
25+
return result.join(',');
26+
},
27+
28+
/** @private */
29+
expandRange: function(range) {
30+
var parts = range.split('-');
31+
if (parts.length != 2) {
32+
return range;
33+
}
34+
35+
var from = parts[0],
36+
to = parts[1],
37+
start = parseInt(from, 10);
38+
if (isNaN(start)) {
39+
return range;
40+
}
41+
42+
var end = parseInt(to, 10);
43+
if (isNaN(end)) {
44+
return range;
45+
}
46+
47+
if (end < start) {
48+
var lengthOfSharedPart = from.length - to.length,
49+
sharedPart = from.substring(0, lengthOfSharedPart),
50+
correctedEnd = sharedPart + to,
51+
newEnd = parseInt(correctedEnd, 10);
52+
if (isNaN(newEnd)) {
53+
return range;
54+
}
55+
56+
// when first number has leading zero(s)
57+
if (newEnd < start) {
58+
return range;
59+
}
60+
61+
end = newEnd;
62+
}
63+
64+
var result = [];
65+
for (var i = start; i <= end; i++) {
66+
result.push(i);
67+
}
68+
69+
return result.join(',');
70+
}
71+
72+
}

src/main/webapp/WEB-INF/tiles/body/series/add.jsp

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<span class="field-label"><spring:message code="t_michel" /></span>
5252
</form:label>
5353
<div class="controls controls-row">
54-
<form:input path="michelNumbers" cssClass="span4" />
54+
<form:input path="michelNumbers" cssClass="span4 js-catalog-numbers" />
5555
<form:input path="michelPrice" cssClass="span2" size="5" />
5656
<form:select path="michelCurrency" cssClass="span2">
5757
<form:options />
@@ -73,7 +73,7 @@
7373
<span class="field-label"><spring:message code="t_scott" /></span>
7474
</form:label>
7575
<div class="controls controls-row">
76-
<form:input path="scottNumbers" cssClass="span4" />
76+
<form:input path="scottNumbers" cssClass="span4 js-catalog-numbers" />
7777
<form:input path="scottPrice" cssClass="span2" size="5" />
7878
<form:select path="scottCurrency" cssClass="span2">
7979
<form:options />
@@ -95,7 +95,7 @@
9595
<span class="field-label"><spring:message code="t_yvert" /></span>
9696
</form:label>
9797
<div class="controls controls-row">
98-
<form:input path="yvertNumbers" cssClass="span4" />
98+
<form:input path="yvertNumbers" cssClass="span4 js-catalog-numbers" />
9999
<form:input path="yvertPrice" cssClass="span2" size="5" />
100100
<form:select path="yvertCurrency" cssClass="span2">
101101
<form:options />
@@ -117,7 +117,7 @@
117117
<span class="field-label"><spring:message code="t_sg" /></span>
118118
</form:label>
119119
<div class="controls controls-row">
120-
<form:input path="gibbonsNumbers" cssClass="span4" />
120+
<form:input path="gibbonsNumbers" cssClass="span4 js-catalog-numbers" />
121121
<form:input path="gibbonsPrice" cssClass="span2" size="5" />
122122
<form:select path="gibbonsCurrency" cssClass="span2">
123123
<form:options />

src/main/webapp/WEB-INF/tiles/layout/default.jsp

+2
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,7 @@
3535

3636
<!-- Placed at the end of the document so the pages load faster -->
3737
<script src="${bootstrapJsUrl}"></script>
38+
39+
<tiles:insertAttribute name="tail" ignore="true" />
3840
</body>
3941
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
2+
3+
<spring:url var="catalogUtilsJsUrl" value="/public/js/CatalogUtils.js" />
4+
<spring:url var="jqueryJsUrl" value="/public/jquery/jquery.min.js" />
5+
6+
<script src="${catalogUtilsJsUrl}"></script>
7+
<script src="${jqueryJsUrl}"></script>
8+
9+
<script>
10+
$(function() {
11+
$('.js-catalog-numbers').on('blur', function() {
12+
$(this).val(function(idx, val) {
13+
return CatalogUtils.expandNumbers(val);
14+
});
15+
});
16+
});
17+
</script>
18+

src/main/webapp/WEB-INF/tiles/tiles.xml

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<definition name="series/add" extends="defaultTemplate">
5252
<put-attribute name="title" value="t_add_series" />
5353
<put-attribute name="body" value="/WEB-INF/tiles/body/series/add.jsp" />
54+
<put-attribute name="tail" value="/WEB-INF/tiles/tail/series/add.jsp" />
5455
</definition>
5556

5657
<definition name="series/info" extends="defaultTemplate">
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
describe("CatalogUtils.expandNumbers()", function() {
2+
3+
it("should return empty string for empty string", function() {
4+
expect(CatalogUtils.expandNumbers("")).toBe("");
5+
})
6+
7+
it("should return null for null", function() {
8+
expect(CatalogUtils.expandNumbers(null)).toBeNull();
9+
})
10+
11+
it("should return undefined for empty unndefined", function() {
12+
expect(CatalogUtils.expandNumbers(undefined)).toBeUndefined();
13+
})
14+
15+
it("should return string without hyphen as it", function() {
16+
expect(CatalogUtils.expandNumbers("test")).toEqual("test");
17+
})
18+
19+
it("should return 'one-two' for 'one-two'", function() {
20+
expect(CatalogUtils.expandNumbers("one-two")).toEqual("one-two");
21+
})
22+
23+
it("should return '1,2' for '1-2'", function() {
24+
expect(CatalogUtils.expandNumbers("1-2")).toEqual("1,2");
25+
})
26+
27+
it("should return '1,2,3' for '1-3'", function() {
28+
expect(CatalogUtils.expandNumbers("1-3")).toEqual("1,2,3");
29+
})
30+
31+
it("should return '10,11' for '10-11'", function() {
32+
expect(CatalogUtils.expandNumbers("10-11")).toEqual("10,11");
33+
})
34+
35+
it("should return '10,11,12' for '10-12'", function() {
36+
expect(CatalogUtils.expandNumbers("10-12")).toEqual("10,11,12");
37+
})
38+
39+
it("should return '2415,2416,2417' for '2415-7'", function() {
40+
expect(CatalogUtils.expandNumbers("2415-7")).toEqual("2415,2416,2417");
41+
})
42+
43+
it("should return '2415,2416,2417' for '2415-17'", function() {
44+
expect(CatalogUtils.expandNumbers("2415-17")).toEqual("2415,2416,2417");
45+
})
46+
47+
it("should return '2499,2450,2451' for '2499-501'", function() {
48+
expect(CatalogUtils.expandNumbers("2499-501")).toEqual("2499,2500,2501");
49+
})
50+
51+
it("should return '1,2,3,5,6' for '1-3,5-6'", function() {
52+
expect(CatalogUtils.expandNumbers("1-3,5-6")).toEqual("1,2,3,5,6");
53+
})
54+
55+
it("should return '1,2,3,5,6,8,9' for '1-3,5-6,8-9'", function() {
56+
expect(CatalogUtils.expandNumbers("1-3,5-6,8-9")).toEqual("1,2,3,5,6,8,9");
57+
})
58+
59+
it("should return 'test 1-3' for 'test 1-3'", function() {
60+
expect(CatalogUtils.expandNumbers("test 1-3")).toEqual("test 1-3");
61+
})
62+
63+
it("should return '09-5' for '09-5'", function() {
64+
expect(CatalogUtils.expandNumbers("09-5")).toEqual("09-5");
65+
})
66+
67+
});

0 commit comments

Comments
 (0)