diff --git a/.gitignore b/.gitignore
index b969a0573..e28a884fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,36 @@
# Created by .gitignore support plugin (hsz.mobi)
-.idea
+
+# nodejs
bower_components/
node_modules/
+node_tmp/
+node/
+npm.tar.gz
+
+# sass
+.sass-cache/
+*.map
+
+# IntelliJ files
*.iml
-target/
+.idea
+
+# eclipse files
.settings/
.project
.classpath
+
+# maven build
target/
+
+# files to be excluded from source code
+index.html
+css/
+
+# other custom rules
static/
+*.log
+
+#Gruntfile.js
+generate-resources/
+.tmp/
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 000000000..c610ac31a
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,100 @@
+module.exports = function(grunt) {
+
+ grunt.initConfig({
+ pkg : grunt.file.readJSON("package.json"),
+
+ useminPrepare: {
+ html: "<%=pkg.assets%>index.html",
+ options: {
+ dest: "<%=pkg.assets%>"
+ }
+ },
+
+ usemin : {
+ html : [ "<%=pkg.assets%>index.html" ],
+ options: {
+ assetsDirs: ['<%=pkg.assets%>css']
+ }
+ },
+
+
+ "bower-install-simple" : {
+ options : {
+ color : true,
+ directory : "<%=pkg.assets%>bower_components"
+ },
+ prod : {
+ options : {
+ production : true
+ }
+ }
+ },
+
+ wiredep : {
+ options : {
+ color : true,
+ directory : "<%=pkg.assets%>bower_components"
+ },
+ target : {
+ src : [ "<%=pkg.assets%>index.html" ]
+ }
+ },
+
+ includeSource : {
+ options : {
+ basePath : "<%=pkg.assets%>",
+ duplicates : false,
+ debug : true
+ },
+ target : {
+ files : {
+ "<%=pkg.assets%>index.html" : "<%=pkg.assets%>index.tpl.html"
+ }
+ }
+ },
+
+ watch : {
+ scripts : {
+ files : [ "*.js", "*.json" ],
+ options : {
+ livereload : true
+ }
+ },
+ markup : {
+ files : [ "*.html" ],
+ options : {
+ livereload : true
+ }
+ },
+ stylesheets : {
+ files : [ "*.css" ],
+ options : {
+ livereload : true
+ }
+ }
+ },
+ connect : {
+ server : {
+ options : {
+ port : 8080,
+ base : ".",
+ keepalive : true
+ }
+ }
+ }
+ });
+
+ grunt.loadNpmTasks("grunt-contrib-watch");
+ grunt.loadNpmTasks("grunt-contrib-connect");
+ grunt.loadNpmTasks("grunt-include-source");
+ grunt.loadNpmTasks("grunt-wiredep");
+ grunt.loadNpmTasks("grunt-bower-install-simple");
+ grunt.loadNpmTasks("grunt-contrib-uglify");
+ grunt.loadNpmTasks("grunt-contrib-concat");
+ grunt.loadNpmTasks("grunt-contrib-cssmin");
+ grunt.loadNpmTasks("grunt-usemin");
+
+ grunt.registerTask("default", [ "bower-install-simple", "includeSource:target", "wiredep:target" ]);
+ grunt.registerTask("build", [ "bower-install-simple", "includeSource:target", "wiredep:target", "useminPrepare", 'concat', 'uglify', 'cssmin', 'usemin']);
+ grunt.registerTask("run", [ "connect", "watch" ]);
+};
\ No newline at end of file
diff --git a/README.md b/README.md
index 24e0e602d..3db6f2887 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,48 @@
+
+
TechLooper
==========
-This is VietnamWorks Open Source project. TechLooper is an aggregator which will detects the market demands and trends for IT jobs.
+
+TechLooper is a career analytics, open source and real-time Big Data platform. TechLooper creates insights from global data sources such as worldwide job boards, forums, social networks, online communities, expert blogs and others. TechLooper is a disruptive alternative of job posting to help employers to find the candidates more qualified, faster and inexpensive.
+
+
+
+IT has no boundaries, and its recruiting challenges are cumbersome; TechLooper is the platform to solve this global worldwide web. TechLooper is NOT limited to Vietnam's market and it is a global solution.
+
+
+The Value Proposition
+
+
+One of the hurdles of IT professionals is to keep themselves up-to-date. Trying to catch up with trends and find subject matter experts is troublesome. The other concern of IT professionals is to know their value in the market. This lack of information causes IT professionals to spend a lot of time on surfing in the search engines looking for information and high chance of inadequate qualified results.
+
+
+
+
TechLooper is a platform that helps
IT professionals discover and validate their know-how and skills to
identify the best opportunities in the market, with the use of Big Data.
+
+
+and
+
+
TechLooper is a platform that empowers
companies to achieve their growth targets through the right
talent acquisition
+
+
+
+The growth of IT needs is limiting the growth of companies. There is a serious challenge in sourcing the right candidate with right skills in the right timing. TechLooper is addressing these concerns by building an active community of IT professionals, which are engaged in TechLooper platform as contributors or partners.
+
+
+
+Technologies
+TechLooper has been built on top of these amazing and awesome technologies:
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bower.json b/bower.json
new file mode 100644
index 000000000..02de69eba
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,23 @@
+{
+ "name": "TechLooper",
+ "dependencies": {
+ "jquery": "latest",
+ "bootstrap" : "latest",
+ "components-font-awesome": "latest",
+ "sockjs": "latest",
+ "stomp-websocket": "latest",
+ "angular": "latest",
+ "angular-resource": "latest",
+ "angular-route" : "latest",
+ "angular-cookies": "latest",
+ "angular-translate": "latest",
+ "angular-translate-storage-local": "latest",
+ "angular-translate-storage-cookie": "latest",
+ "angular-translate-loader-static-files" : "latest"
+ },
+ "overrides": {
+ "stomp-websocket": {
+ "main": "lib/stomp.min.js"
+ }
+ }
+}
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..24808f48b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "techlooper",
+ "description": "This is VietnamWorks Open Source project. TechLooper is an aggregator which will detects the market demands and trends for IT jobs.",
+ "devDependencies": {
+ "grunt": "latest",
+ "grunt-cli": "latest",
+ "grunt-contrib-connect": "latest",
+ "grunt-contrib-watch": "latest",
+ "grunt-include-source": "latest",
+ "grunt-wiredep": "latest",
+ "grunt-usemin": "latest",
+ "grunt-contrib-concat": "latest",
+ "grunt-contrib-uglify": "latest",
+ "grunt-contrib-cssmin": "latest",
+ "grunt-bower-install-simple": "latest"
+ },
+ "assets": "src/main/webapp/assets/"
+}
diff --git a/pom.xml b/pom.xml
index 23898d205..b04ad6bac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,9 @@
1.7.7
1.3
1.9.5
+ v0.10.31
+ 1.4.26
+ 1.1.1
techlooper
@@ -46,6 +49,15 @@
src/main/resources/common
+
+
+
+ org.jasig.maven
+ sass-maven-plugin
+ ${sass-maven-plugin.version}
+
+
+
maven-compiler-plugin
@@ -55,25 +67,64 @@
1.8
+
+ org.jasig.maven
+ sass-maven-plugin
+ ${sass-maven-plugin.version}
+
+
+ Generate CSS files
+
+ update-stylesheets
+
+ generate-sources
+
+
+
+
+
+
+ ${project.basedir}/src/main/webapp/assets/sass
+
+ ${project.basedir}/src/main/webapp/assets/css
+
+
+
+
- org.codehaus.mojo
- exec-maven-plugin
- 1.3.2
-
-
- generate-sources
-
- exec
-
-
-
-
- bower
-
- install
-
- ${basedir}/src/main/webapp/assets
-
+ com.github.eirslett
+ frontend-maven-plugin
+ 0.0.16
+
+
+ install node and npm
+
+ install-node-and-npm
+
+ generate-resources
+
+ ${frontend-maven-plugin.nodeVersion}
+ ${frontend-maven-plugin.npmVersion}
+
+
+
+ npm install
+
+ npm
+
+ generate-resources
+
+
+ grunt build
+
+ grunt
+
+ generate-resources
+
+ build
+
+
+
org.eclipse.jetty
@@ -91,6 +142,7 @@
2.4
false
+ **/*.sass
diff --git a/src/main/webapp/assets/bower.json b/src/main/webapp/assets/bower.json
deleted file mode 100644
index d306236ab..000000000
--- a/src/main/webapp/assets/bower.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "techlooper",
- "dependencies": {
- "bootstrap" : "latest",
- "components-font-awesome": "latest",
- "angular": "latest",
- "angular-resource": "latest",
- "angular-route" : "latest",
- "jquery": "latest",
- "sockjs": "latest",
- "stomp-websocket": "latest",
- "showdown": "latest",
- "angular-ui-router": "latest"
- }
-}
\ No newline at end of file
diff --git a/src/main/webapp/assets/css/bubble.css b/src/main/webapp/assets/css/bubble.css
deleted file mode 100644
index a0bc958c7..000000000
--- a/src/main/webapp/assets/css/bubble.css
+++ /dev/null
@@ -1,192 +0,0 @@
- #left {
- float:left;
- width:555px;
- margin-top: 50px;
-}
-#right {
- float:right;
- width:415px;
- margin-top: 50px;
-}
-#right a, #right a:visited {
- display:block;
- color:#FF5800;
- font-size: 12px;
- text-transform: uppercase;
- margin-top: 10px;
-}
-#right a:hover, #right a.active {
- text-decoration:none;
- color:#003359;
-}
-#right p {
- color:#19337F;
- margin-top: 35px;
- font-size: 20px;
-}
-#box {
- position:relative;
- left:120px;
-}
-#box .circle {
- cursor:pointer;
- text-align:center;
- width: 1000px;
- height: 1000px;
- position: absolute;;
-}
-#box .active {
- width:340px;
- height:340px;
- cursor:pointer;
- z-index: 0 !important;
-}
-#box .circle span {
- width:125px;
- font-size:18px;
- position:relative;
- top:-70%;
- color:#ffffff;
- text-transform: capitalize;
-}
-#box .circle strong{
- display: block;
- clear: both;
- font-size: 24px;
- font-weight: 400;
-}
-#box #pmTech span {
- top:-68%;
-}
-#box .circle .circle-content {
- background: #f00;
- width: 1000px;
- height: 1000px;
- border-radius: 50%;
- width:150px;
- height:150px;
-}
-#box .circle .redColor{
- background: #f00;
-}
-#box .circle .blueColor{
- background: #106da4;
-}
-#box .circle .yellowColor{
- background: #d7c500;
-}
-#box .circle .pinkColor{
- background: #cc21a0;
-}
-#box .circle .greenColor{
- background: #11a06c;
-}
-#box .circle .orangeColor{
- background: #d26e03;
-}
-#box .circle .lightSalmonColor{
- background: #ffa07a;
-}
-#box .circle .indigoColor{
- background: #4B0082;
-}
-#box .circle .oliveColor{
- background: #808000;
-}
-#box .circle .saddleBrownColor{
- background: #8B4513;
-}
-#box .textSize1,
-#box .textSize1 .circle-content{
- width:50px;
- height:50px;
-}
-#box .textSize1 span{
- font-size: 10px;
- line-height:5px;
- top:25px !important;
- width: 50px;
-}
-#box .textSize1 strong{
- font-size: 12px;
-}
-#box .textSize2,
-#box .textSize2 .circle-content{
- width:75px;
- height:75px;
-}
-#box .textSize2 span{
- font-size: 15px;
- line-height: 16px;
- top: 30px !important;
- width: 75px;
-}
-#box .textSize2 strong{
- font-size: 20px;
-}
-#box .textSize3,
-#box .textSize3 .circle-content{
- width:100px;
- height:100px;
-}
-#box .textSize3 span{
- font-size: 18px;
- line-height:22px;
- top: 18px !important;
- width: 100px;
-}
-#box .textSize3 strong{
- font-size: 25px;
-}
-#box .textSize4,
-#box .textSize4 .circle-content{
- width:125px;
- height:125px;
-}
-#box .textSize4 span{
- top: -90px !important;
- width: 125px;
-}
-#box .textSize5,
-#box .textSize5 .circle-content{
- width:175px;
- height:175px;
-}
-#box .textSize5 span{
- top: -90px !important;
- width: 175px;
-}
-#box .textSize6,
-#box .textSize6 .circle-content{
- width:200px;
- height:200px;
-}
-#box .intro {
- display:none;
- width:250px;
- color:#ffffff;
- position:absolute;
- bottom:100px;
- left:35px;
- line-height:15px;
-}
-
-#box .active span{
- font-size:35px;
- line-height:40px;
- top: 120px !important;
- text-align: center;
- width:320px;
-}
-#box .active strong{
- font-size: 45px;
-}
-.bubble-chart-error{
- display: none;
- width: 300px;
- color: red;
- margin: auto;
-}
-.small{
- z-index: 5 !important;
-}
\ No newline at end of file
diff --git a/src/main/webapp/assets/css/main.css b/src/main/webapp/assets/css/main.css
deleted file mode 100755
index f98286542..000000000
--- a/src/main/webapp/assets/css/main.css
+++ /dev/null
@@ -1,215 +0,0 @@
-html, body {
- height: 100%;
-}
-
-body {
- background-color: #2e272a;
- color: #727272;
- font-family: 'roboto',arial;
- font-weight: 300;
-}
-ul{
- list-style: none;
-}
-.container{
- width: 100%;
- padding: 0;
-}
-/* -- style for header -- */
-.setting-label{
-
-}
-.fa-bubble-chart{
- background: url(../images/ic-small.png) left 3px no-repeat;
- height: 20px;
- width: 20px;
-}
-.navbar-inverse{
- background:url(../images/line-header.png) #2e272a center bottom no-repeat;
- border: 0;
-}
-.tagline{}
-.setting-content{
- background-color: #323232;
- border: 1px solid #3d373a;
- padding: 4px;
- border-radius: 5px;
- max-height: 30px;
- height: 30px;
- width: 28px;
- position: relative;
-}
-.setting-content i{
- font-size:20px;
- cursor: pointer;
-}
-.setting-label{
- width:20px;
- float: left;
- cursor: pointer;
-}
-.setting-content ul{margin: 0; padding: 0;}
-ul.setting-items{
- display: none;
-}
-.setting-content li{
- float: left;
- padding-left: 10px;
-}
-.keyboard-shortcuts-items{
- background: #000000;
- padding: 10px;
- width: 240px;
- height: auto;
- display: none;
- position: absolute;
- left: -1px;
- top: 28px;
- border: 1px solid #3d373a;
- border-radius: 5px;
-}
-.keyboard-shortcuts-items li{
- display: block;
- clear: both;
- border-top: 1px solid #2d2d2d;
- padding: 5px 0;
- width: 100%;
- text-align: right;
-}
-.keyboard-shortcuts-items li:first-child{
- border-top: 0;
- padding-top: 0;
-}
-.keyboard-shortcuts-items li span{
- float: left;
-}
-/* --- Style for bubble chart --- */
-.bubble-chart-block{
- display: block;
- clear: both;
- /*padding-top:50px;*/
- width: 100%;
- float: left;
- height: 500px;
- text-align: center;
-}
-.bubble-chart-container{
- width: 400px;
- margin: auto;
-}
-
-.analystic-find-jobs-block{
- float: left;
- clear: both;
- width: 100%;
- text-align: center;
-}
-.button-management{
- width: 600px;
- background-color: #282225;
- border: 1px solid #3a3537;
- border-radius: 5px;
- margin: auto;
- text-align: center;
- display: inline-block;
-}
-.career-analystics{
- width: 50%;
- float: left;
- border-right: 1px solid #3a3537;
-}
-.find-jobs{
- width: 50%;
- float: left;
- height: 40px;
-}
-.button-management a{
- display: block;
- width: 100%;
- vertical-align: middle;
- height: 40px;
- font-size: 16px;
- text-transform: capitalize;
- line-height: 40px;
- color: #999999;
-}
-.button-management a:hover{
- background-color: #3a3537;
- text-decoration: none;
- color: #ebebeb;
-}
-/* --- Style for footer --- */
-footer{
- position: fixed;
- bottom: 0;
- width: 100%;
- z-index: 22;
-}
-.companies-block{
-
-}
-.companies-block h2{
- font-size: 16px;
- text-transform: uppercase;
- font-weight: 300;
- background-color: #000000;
- border-radius: 5px 5px 0 0;
- width: auto;
- padding: 5px 10px;
- display: inline;
- cursor: pointer;
- z-index: 99;
-}
-.companies-list{
- background-color: #000000;
- width: 100%;
- height:0;
- padding:5px 10px;
- clear: both;
- position: relative;
- bottom: 0;
-}
-.companies-list ul{
- padding: 0;
- margin: 0;
- text-align: center;
-}
-.companies-list li{
- display: inline-block;
- padding: 0 5px;
-}
-.companies-list a{
- width: 180px;
- height: 100px;
- cursor: pointer;
- display: block;
-}
-.companies-list img{
- filter: url("data:image/svg+xml;utf8, #grayscale"); /* Firefox 10+, Firefox on Android */
- filter: grayscale(100%);
- -moz-filter: grayscale(100%);
- -ms-filter: grayscale(100%);
- -o-filter: grayscale(100%);
- filter: gray; /* IE6-9 */
- -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */
-}
-.companies-list a:hover img{
- filter: url("data:image/svg+xml;utf8, #grayscale");
- filter: grayscale(0%);
- -moz-filter: grayscale(0%);
- -ms-filter: grayscale(0%);
- -o-filter: grayscale(0%);
- filter: none ; /* IE6-9 */
- zoom:1;
- -webkit-filter: grayscale(0%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */
-}
-
-
-.discussion-board-block{
- position: absolute;
- right: 10px; top: -13px;
- cursor: pointer;
-}
-.discussion-board-block i{
- font-size: 30px;
-}
\ No newline at end of file
diff --git a/src/main/webapp/assets/css/responsive.css b/src/main/webapp/assets/css/responsive.css
deleted file mode 100755
index 4e6af5a93..000000000
--- a/src/main/webapp/assets/css/responsive.css
+++ /dev/null
@@ -1,119 +0,0 @@
-@media (min-width: 320px) and (max-width: 767px) {
- .fa-cog {
- display: none;
- }
- .fa-bars {
- display: block;
- }
- .setting-block {
- width: 60px;
- float: left;
- padding-top: 10px;
- }
- .setting-content {
- width: 100%;
- height: 100%;
- }
- .fa-bars {
- display: block;
- }
- .logo-block {
- width: 240px;
- float: left;
- }
- .logo {
- width: 100%;
- padding: 5px 5px 5px 0;
- }
- .logo img {
- width: 100%;
- max-width: 259px;
- }
- .logo h1 {
- line-height: 0;
- margin: 0;
- padding: 0;
- }
- .bubble-chart-container {
- width: 320px;
- }
- #box .textSize1 span {
- font-size: 10px;
- line-height: 5px;
- top: 15px !important;
- width: 50px;
- }
- #box .textSize1 strong {
- font-size: 12px;
- }
- #box .textSize2, #box .textSize2 .circle-content {
- width: 75px;
- height: 75px;
- }
- #box .textSize2 span {
- font-size: 15px;
- line-height: 16px;
- top: 15px !important;
- width: 75px;
- }
- #box .textSize2 strong {
- font-size: 20px;
- }
- #box .textSize3, #box .textSize3 .circle-content {
- width: 100px;
- height: 100px;
- }
- #box .textSize3 span {
- font-size: 18px;
- line-height: 22px;
- top: 18px !important;
- width: 100px;
- }
- #box .textSize3 strong {
- font-size: 25px;
- }
- #box .textSize4, #box .textSize4 .circle-content {
- width: 125px;
- height: 125px;
- }
- #box .textSize4 span {
- top: -90px !important;
- width: 125px;
- }
- #box .textSize5, #box .textSize5 .circle-content {
- width: 175px;
- height: 175px;
- }
- #box .textSize5 span {
- top: -90px !important;
- width: 175px;
- }
- #box .textSize6, #box .textSize6 .circle-content {
- width: 200px;
- height: 200px;
- }
- #box .intro {
- display: none;
- width: 250px;
- color: #ffffff;
- position: absolute;
- bottom: 100px;
- left: 35px;
- line-height: 15px;
- }
- #box .active span {
- font-size: 35px;
- line-height: 40px;
- top: 45px !important;
- text-align: center;
- width: 220px;
- }
- #box .active strong {
- font-size: 45px;
- }
-}
-@media (min-width: 778px) {
- .fa-bars {
- display: none;
- }
-}
\ No newline at end of file
diff --git a/src/main/webapp/assets/images/ic-find-jobs.png b/src/main/webapp/assets/images/ic-find-jobs.png
new file mode 100644
index 000000000..878d25897
Binary files /dev/null and b/src/main/webapp/assets/images/ic-find-jobs.png differ
diff --git a/src/main/webapp/assets/images/icon.ico b/src/main/webapp/assets/images/icon.ico
new file mode 100644
index 000000000..3262d12af
Binary files /dev/null and b/src/main/webapp/assets/images/icon.ico differ
diff --git a/src/main/webapp/assets/images/next.png b/src/main/webapp/assets/images/next.png
deleted file mode 100644
index ecc593261..000000000
Binary files a/src/main/webapp/assets/images/next.png and /dev/null differ
diff --git a/src/main/webapp/assets/images/prev.png b/src/main/webapp/assets/images/prev.png
deleted file mode 100644
index 7c7457158..000000000
Binary files a/src/main/webapp/assets/images/prev.png and /dev/null differ
diff --git a/src/main/webapp/assets/index.html b/src/main/webapp/assets/index.html
deleted file mode 100644
index df07a7011..000000000
--- a/src/main/webapp/assets/index.html
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- Techlooper | Career Analytics. Open Source. Awesome!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/webapp/assets/index.tpl.html b/src/main/webapp/assets/index.tpl.html
index 678923a77..4b221233a 100644
--- a/src/main/webapp/assets/index.tpl.html
+++ b/src/main/webapp/assets/index.tpl.html
@@ -15,19 +15,18 @@
Techlooper | Career Analytics. Open Source. Awesome!
+
-
-
-
-
-
-
-
+
+
+
+
-
+
+
@@ -35,20 +34,15 @@
You are using an outdated browser. Please upgrade
your browser to improve your experience.
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+