diff --git a/Gulpfile.js b/Gulpfile.js index c7a845b3..553197d9 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -5,29 +5,36 @@ var templateCache = require('gulp-angular-templatecache') var globby = require('globby') var template = require('gulp-template') var concat = require('gulp-concat') - var del = require('del') var runSequence = require('run-sequence') - -var rev = require('gulp-rev') var merge = require('merge-stream') +var changed = require('gulp-changed') +var cached = require('gulp-cached') +var remember = require('gulp-remember') +var livereload = require('gulp-livereload') +var childProcess = require('child_process') + +// for Dist +var rev = require('gulp-rev') var ngAnnotate = require('gulp-ng-annotate') var uglify = require('gulp-uglify') var minifyCss = require('gulp-minify-css') -var livereload = require('gulp-livereload') - var config = require('./build.config.js') gulp.task('js', function(){ - return gulp.src(['src/**/*.js']).pipe(gulp.dest('build')) + return gulp.src(['src/**/*.js']) + .pipe(changed('build')) + .pipe(gulp.dest('build')) }) gulp.task('sass', function () { return gulp.src('src/**/*.scss') - .pipe(sass({errLogToConsole: true})) + .pipe(cached('styles')) + .pipe(sass().on('error', sass.logError)) .pipe(autoprefixer()) + .pipe(remember('styles')) .pipe(concat('all.css')) .pipe(gulp.dest('build')) .pipe(livereload()) @@ -63,8 +70,25 @@ gulp.task('index', function () { .pipe(livereload()) }) +gulp.task('vendor', function () { + var vendors = config.vendors + + var vendorFiles = vendors.map(function (vendor) { + return vendor.src + }) + + return gulp.src(vendorFiles) + .pipe(gulp.dest('build/vendor')) +}) + +gulp.task('resources', function () { + return gulp.src('resources/**/*') + .pipe(changed('build/resources')) + .pipe(gulp.dest('build/resources')) +}) + gulp.task('build', function (cb) { - runSequence(['js', 'sass', 'tpls', 'vendor'], 'index', cb) + runSequence(['js', 'sass', 'tpls', 'vendor', 'resources'], 'index', cb) }) gulp.task('watch', function (cb) { @@ -84,16 +108,13 @@ gulp.task('del', function (cb) { }) gulp.task('default', function (cb) { - runSequence('del', 'build', 'watch', cb) -}) - -gulp.task('vendor', function () { - var vendors = config.vendors - - vendorFiles = vendors.map(function (vendor) { - return vendor.src + var spawn = childProcess.spawn('http-server', ['build']) + spawn.stdout.on('data', function (data) { + console.log('OUT: ' + data) + }) + spawn.stderr.on('data', function (data) { + console.log('ERR: ' + data) }) - return gulp.src(vendorFiles) - .pipe(gulp.dest('build/vendor')) + runSequence('del', 'build', 'watch', cb) }) diff --git a/build.config.js b/build.config.js index b6635308..34aef705 100644 --- a/build.config.js +++ b/build.config.js @@ -39,6 +39,11 @@ module.exports = { name:'satellizer', src:'node_modules/satellizer/satellizer.js', cdn:'https://cdn.jsdelivr.net/satellizer/0.10.1/satellizer.min.js' + }, + { + name:'angular-md5', + src:'node_modules/angular-md5/angular-md5.js', + cdn:'https://raw.githubusercontent.com/gdi2290/angular-md5/v0.1.7/angular-md5.min.js' } ] } diff --git a/package.json b/package.json index 48df1d66..0e44d29e 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@rokt33r/angular-ui-ace": "^0.2.3", "angular": "^1.3.15", "angular-bootstrap": "^0.12.0", + "angular-md5": "^0.1.7", "angular-sanitize": "^1.3.15", "angular-ui-router": "^0.2.15", "font-awesome": "^4.3.0", @@ -42,10 +43,13 @@ "gulp": "^3.8.11", "gulp-angular-templatecache": "^1.6.0", "gulp-autoprefixer": "^2.3.0", + "gulp-cached": "^1.1.0", + "gulp-changed": "^1.2.1", "gulp-concat": "^2.5.2", "gulp-livereload": "^3.8.0", "gulp-minify-css": "^1.1.1", "gulp-ng-annotate": "^0.5.3", + "gulp-remember": "^0.3.0", "gulp-rev": "^4.0.0", "gulp-sass": "^2.0.1", "gulp-template": "^3.0.0", diff --git a/resources/fonts/FontAwesome.otf b/resources/fonts/FontAwesome.otf new file mode 100644 index 00000000..f7936cc1 Binary files /dev/null and b/resources/fonts/FontAwesome.otf differ diff --git a/resources/fonts/fontawesome-webfont.eot b/resources/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..33b2bb80 Binary files /dev/null and b/resources/fonts/fontawesome-webfont.eot differ diff --git a/resources/fonts/fontawesome-webfont.svg b/resources/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..1ee89d43 --- /dev/null +++ b/resources/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/fonts/fontawesome-webfont.ttf b/resources/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..ed9372f8 Binary files /dev/null and b/resources/fonts/fontawesome-webfont.ttf differ diff --git a/resources/fonts/fontawesome-webfont.woff b/resources/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..8b280b98 Binary files /dev/null and b/resources/fonts/fontawesome-webfont.woff differ diff --git a/resources/fonts/fontawesome-webfont.woff2 b/resources/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..3311d585 Binary files /dev/null and b/resources/fonts/fontawesome-webfont.woff2 differ diff --git a/src/app.js b/src/app.js new file mode 100644 index 00000000..619add21 --- /dev/null +++ b/src/app.js @@ -0,0 +1,19 @@ +/* global angular */ +angular.module('codexen', [ + 'ngSanitize', + 'ui.select', + 'ui.ace', + 'ui.router', + 'ui.bootstrap', + 'satellizer', + 'angular-md5', + 'templates', + 'codexen.config', + 'codexen.directives', + 'codexen.services', + 'codexen.states']) +angular.module('templates', []) +angular.module('codexen.config', []) +angular.module('codexen.directives', []) +angular.module('codexen.services', []) +angular.module('codexen.states', []) diff --git a/src/config/satellizer.js b/src/config/satellizer.js new file mode 100644 index 00000000..0ea09032 --- /dev/null +++ b/src/config/satellizer.js @@ -0,0 +1,8 @@ +angular.module('codexen.config') + .constant('apiUrl', 'http://localhost:8000/') + .config(function ($authProvider, $httpProvider) { + $authProvider.baseUrl = 'http://localhost:8000/' + + $httpProvider.defaults.useXDomain = true + delete $httpProvider.defaults.headers.common['X-Requested-With'] + }) diff --git a/src/directives/side-nav.js b/src/directives/side-nav.js new file mode 100644 index 00000000..0370f7b2 --- /dev/null +++ b/src/directives/side-nav.js @@ -0,0 +1,41 @@ +angular.module('codexen.directives') + .directive('sideNav', function(){ + return { + templateUrl:'directives/side-nav.tpl.html', + controller:'SideNavController as vm' + } + }) + .controller('SideNavController', function($auth, User, $rootScope, $scope){ + var vm = this + + vm.isAuthenticated = $auth.isAuthenticated() + + var reloadUser = function(){ + if(vm.isAuthenticated){ + User.me().success(function (data){ + console.log('currentUser', data) + vm.currentUser = data.user + }) + } + } + reloadUser() + + vm.signOut = function () { + $auth.logout() + .then(function () { + console.log('Sign Out') + $rootScope.$broadcast('userSignOut') + }) + } + + $scope.$on('userSignIn', function () { + vm.isAuthenticated = true + reloadUser() + }) + + $scope.$on('userSignOut', function () { + vm.isAuthenticated = false + vm.currentUser = null + + }) + }) diff --git a/src/directives/side-nav.tpl.html b/src/directives/side-nav.tpl.html new file mode 100644 index 00000000..152ef9e3 --- /dev/null +++ b/src/directives/side-nav.tpl.html @@ -0,0 +1,26 @@ + +
+
+ + + + + + + +
+
+ Guest +
+
+ +

Side Nav

+ diff --git a/src/index.html b/src/index.html index 41d003e2..a308531b 100644 --- a/src/index.html +++ b/src/index.html @@ -12,9 +12,14 @@ Codexen! + <% styles.forEach(function(style){ %> + + <% }) %> + + -
+
@@ -24,6 +29,8 @@ + + <% scripts.forEach(function(script){ %> diff --git a/src/main.scss b/src/main.scss new file mode 100644 index 00000000..a6916ffd --- /dev/null +++ b/src/main.scss @@ -0,0 +1,49 @@ +$fa-font-path: "./resources/fonts"; +@import "../node_modules/font-awesome/scss/font-awesome"; + +@import "bootstrap"; +@import "ui-select"; + +@import "../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/variables"; + +$side-view-bg: $navbar-inverse-bg; +$side-view-color: $navbar-inverse-color; + +html { + overflow: hidden; + height: 100%; +} + +body { + height: 100%; + overflow: auto; +} + +#side-view{ + position:absolute; + top: 0; + bottom: 0; + left: 0; + width: 200px; + color: $navbar-inverse-color; + background-color: $side-view-bg; + box-sizing: border-box; + padding: 10px 0 10px 10px; + .nav.nav-pills>li>a{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } +} +.alert{ + margin: 5px 0; +} + +#main-view{ + position:absolute; + top: 0; + bottom: 0; + left: 200px; + right: 0; + overflow-x: hidden; + overflow-y: scroll; +} diff --git a/src/services/user.js b/src/services/user.js new file mode 100644 index 00000000..b7412cd2 --- /dev/null +++ b/src/services/user.js @@ -0,0 +1,15 @@ +angular.module('codexen.services') + .factory('User', function ($http, apiUrl, $rootScope, $state) { + $rootScope.$on('userSignOut', function(){ + $state.go('auth.signin') + }) + + var me = function () { + var url = apiUrl + 'auth/user' + return $http.get(url) + } + + return { + me: me + } + }) diff --git a/src/states/auth/auth.tpl.html b/src/states/auth/auth.tpl.html new file mode 100644 index 00000000..84b4fbf2 --- /dev/null +++ b/src/states/auth/auth.tpl.html @@ -0,0 +1,9 @@ +
+ +
+

Auth

+ Register or Sign In +
+ + +
diff --git a/src/states/auth/register.js b/src/states/auth/register.js new file mode 100644 index 00000000..b1d69300 --- /dev/null +++ b/src/states/auth/register.js @@ -0,0 +1,19 @@ +/* global angular */ +angular.module('codexen.states') + .controller('AuthRegisterController', function ($auth, $log) { + var vm = this + vm.isEmpty = function (obj) { + for (var i in obj) if (obj.hasOwnProperty(i)) return false + return true + } + vm.signup = function () { + $auth.signup({ + email: vm.email, + password: vm.password, + name: vm.name, + profileName: vm.profileName + }).then(function (data) { + console.log(data) + }) + } + }) diff --git a/src/states/auth/register.tpl.html b/src/states/auth/register.tpl.html new file mode 100644 index 00000000..dca10192 --- /dev/null +++ b/src/states/auth/register.tpl.html @@ -0,0 +1,56 @@ +
+
+
+ + +
+ + + +
+
No E-mail given.
+
Invalid Address.
+
+
+ + +
+ + + +
+
No password given.
+
+
+ +
+ + +
+ + + +
+
No Username given.
+
Username should be ^[A-Za-z0-9\-\_]+$
+
+
+ + + +
+ + + +
+
No Profile name given.
+
+
+ + +
+ +
+
+
+
diff --git a/src/states/auth/signin.js b/src/states/auth/signin.js new file mode 100644 index 00000000..11169ea3 --- /dev/null +++ b/src/states/auth/signin.js @@ -0,0 +1,15 @@ +/* global angular */ +angular.module('codexen') + .controller('AuthSignInController', function ($auth, $rootScope) { + var vm = this + + vm.signIn = function () { + $auth.login({ + email: vm.email, + password: vm.password + }).then(function(data){ + console.log(data) + $rootScope.$broadcast('userSignIn') + }) + } + }) diff --git a/src/states/auth/signin.tpl.html b/src/states/auth/signin.tpl.html new file mode 100644 index 00000000..60531ef8 --- /dev/null +++ b/src/states/auth/signin.tpl.html @@ -0,0 +1,19 @@ +
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+
+
+
diff --git a/src/states/states.js b/src/states/states.js new file mode 100644 index 00000000..99c8dd4e --- /dev/null +++ b/src/states/states.js @@ -0,0 +1,35 @@ +/* global angular */ +angular.module('codexen.states') + .config(function($stateProvider, $urlRouterProvider){ + $urlRouterProvider + .when('/auth', '/auth/register') + .when('/auth/', '/auth/register') + + $stateProvider + /* Auth */ + .state('auth', { + url: '/auth', + views:{ + 'main-view': { + templateUrl: 'states/auth/auth.tpl.html' + } + } + }) + .state('auth.register', { + url: '/register', + templateUrl: 'states/auth/register.tpl.html', + controller: 'AuthRegisterController as vm' + }) + .state('auth.signin', { + url: '/signin', + templateUrl: 'states/auth/signin.tpl.html', + controller: 'AuthSignInController as vm' + }) + + /* Home */ + .state('home', { + url: '/', + template: 'this is a home' + }) + + })