add basic file org + client prototype
authorymh <ymh.work@gmail.com>
Wed, 11 Jun 2014 01:26:59 +0200
changeset 0 cef349423167
child 1 74bbdd739878
add basic file org + client prototype
.hgignore
client/.bowerrc
client/.editorconfig
client/.jscsrc
client/.jshintrc
client/README.md
client/app/app.css
client/app/app.js
client/app/app_controller.js
client/app/app_controller_test.js
client/app/components/app_service.js
client/app/components/app_service_test.js
client/app/gallery/gallery.css
client/app/gallery/gallery.html
client/app/gallery/gallery_controller.js
client/app/gallery/gallery_controller_test.js
client/app/home/home.html
client/app/home/home_controller.js
client/app/home/home_controller_test.js
client/app/index.html
client/app/slideshow/dataEditor.html
client/app/slideshow/slideshow.css
client/app/slideshow/slideshow.html
client/app/slideshow/slideshow_controller.js
client/app/slideshow/slideshow_controller_test.js
client/bower.json
client/data/gallery.json
client/data/images/ImageAccueilCM1.jpg
client/data/images/ImageAccueilCM2.jpg
client/data/images/ImageAccueilCM3.jpg
client/data/images/ImageAccueilCM4.jpg
client/data/images/ImageAccueilCM5.jpg
client/data/images/ImageAccueilCM6.jpg
client/data/images/ImageAccueilCM7.jpg
client/data/images/ImageAccueilCM7_ORIG.jpg
client/data/images/ImageAccueilCM8.jpg
client/data/slideshow.json
client/gulpfile.js
client/img/ammico_logo_small.png
client/img/loader.gif
client/img/logo_IRI_footer.png
client/karma-unit.js
client/package.json
server/README.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,6 @@
+syntax: regexp
+.DS_Store
+Thumbs.db
+^client/node_modules/
+^client/bower_components/
+^client/build/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/.bowerrc	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,3 @@
+{
+  "directory": "bower_components"
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/.editorconfig	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,13 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/.jscsrc	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,25 @@
+{
+  "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+  "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "try", "catch"],
+  "requireParenthesesAroundIIFE": true,
+  "requireSpacesInFunctionExpression": {
+    "beforeOpeningCurlyBrace": true
+  },
+  "disallowSpacesInsideArrayBrackets": true,
+  "disallowSpacesInsideParentheses": true,
+  "requireSpacesInsideObjectBrackets": "all",
+  "disallowQuotedKeysInObjects": true,
+  "disallowSpaceAfterObjectKeys": true,
+  "requireCommaBeforeLineBreak": true,
+  "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+  "disallowSpaceBeforePostfixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+  "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireCamelCaseOrUpperCaseIdentifiers": true,
+  "disallowKeywords": ["with"],
+  "disallowMultipleLineBreaks": true,
+  "validateQuoteMarks": "'",
+  "validateIndentation": 2,
+  "disallowKeywordsOnNewLine": ["else", "catch"],
+  "requireLineFeedAtFileEnd": true
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/.jshintrc	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,24 @@
+{
+  "browser": true,
+  "node": true,
+  "esnext": true,
+  "bitwise": true,
+  "camelcase": true,
+  "eqeqeq": true,
+  "immed": true,
+  "indent": 4,
+  "latedef": true,
+  "newcap": true,
+  "noarg": true,
+  "quotmark": "single",
+  "regexp": true,
+  "undef": true,
+  "unused": true,
+  "globalstrict": true,
+  "strict": true,
+  "trailing": true,
+  "smarttabs": true,
+  "indent": 2,
+  "predef": ["angular"],
+  "devel": true
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/README.md	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,14 @@
+Ammico client webapp
+====================
+
+Dev:
+---
+
+- `npm install`
+- `node_modules/.bin/gulp`
+- `node_modules/.bin/bower install -D <some-packages>`
+
+TODO:
+-----
+
+- unit tests
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/app.css	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,18 @@
+#logo {
+    padding-top: 0;
+}
+
+.navbar-inverse {
+    background-color: #222222;
+    border-color: #080808;
+}
+
+.ammico-content {
+    min-height: 500px;
+}
+
+/*
+.ng-scope{
+    border: red 1px solid;
+}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/app.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,33 @@
+(function(){
+  'use strict';
+
+  angular.module('ammico', [ 'ngRoute','ammicoHome', 'ammicoGallery', 'ammicoSlideshow', 'templates' ])
+    .config(function($routeProvider) {
+      $routeProvider.
+        when('/', {
+        controller: 'homeCtrl',
+        templateUrl: 'home/home.html'
+      }).
+      when('/gallery', {
+        controller: 'galleryCtrl',
+        templateUrl: 'gallery/gallery.html'
+      }).
+      when('/slideshow', {
+        controller: 'slideshowCtrl',
+        templateUrl: 'slideshow/slideshow.html'
+      }).
+      otherwise({
+        redirectTo: '/gallery'
+      });
+    })
+    // .config(function ($routeProvider) {
+    //   $routeProvider
+    //     .otherwise({
+    //       redirectTo: '/'
+    //   });
+    // });
+    .config(function($logProvider){
+      $logProvider.debugEnabled(true);
+    });
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/app_controller.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,11 @@
+(function(){
+  'use strict';
+
+  angular.module('ammico')
+  .controller('routeClassCtrl', function($scope, $location) {
+    $scope.isActive = function(route) {
+        return route === $location.path();
+    };
+  });
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/app_controller_test.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+'use strict';
+
+describe("app_controller_test", function(){
+    it("should assert something",function(){
+        expect(true).toBe(true);
+    })
+})
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/components/app_service.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,1 @@
+'common service goes here';
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/components/app_service_test.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+'use strict';
+
+describe("app_service_test", function(){
+    it("should assert something",function(){
+        expect(true).toBe(true);
+    })
+})
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/gallery/gallery.css	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,34 @@
+.gallery .item {
+  overflow:hidden; position:relative; height: 250px; padding: 5px;
+}
+
+.img-ctn {
+    height: 100%; width: 100%; border: 1px solid #DDD; padding: 5px; overflow: hidden;
+}
+
+.img-ctn:hover {
+    background-color: #DDD;
+}
+
+.img-ctn p {
+    display: none;
+    position: absolute;
+    bottom: -5px;
+    background-color: #DDD;
+    width: 100%;
+}
+
+.img-ctn:hover p {
+    display: block;
+}
+
+.gallery .item img {
+    margin: 0 auto;
+}
+
+.subtitle {
+    border-top: 1px solid #000;
+    border-bottom: 1px dotted #000;
+    margin-top: 20px;
+    padding: 6px 0 10px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/gallery/gallery.html	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,11 @@
+<h1>{{ gallery.title }}</h1>
+<p>{{ gallery.description }}</p>
+<h4 class="subtitle">{{ gallery.images.length }} points d'intérêt</h4>
+<ul class="list-unstyled list-inline row gallery">
+  <li class="col-md-3 item" ng-repeat="i in gallery.images">
+    <div class="img-ctn">
+        <img class="img img-responsive image" src="{{ i.url }}" />
+        <p>{{ i.title }}</p>
+    </div>
+  </li>
+</ul>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/gallery/gallery_controller.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,37 @@
+(function(){
+  'use strict';
+
+  angular.module('ammicoGallery',['ngResource', 'ngRoute'])
+    .config(function ($routeProvider) {
+      $routeProvider
+        .when('/', {
+          templateUrl: 'gallery/gallery.html',
+          controller: 'galleryCtrl'
+        });
+    })
+    .service('galleryApi', function($resource, context) {
+      this.gallery = $resource(context.urls.galleryUrl,
+        {
+          get: {
+            method: 'GET',
+            isArray: false
+          }
+        });
+    })
+    .service('galleryModel', function(galleryApi, context) {
+      console.log('4', context.gallery);
+      if(typeof context.gallery === 'undefined') {
+        console.log('4-1');
+        this.gallery = galleryApi.gallery.get();
+      }
+      else {
+        console.log('4-2');
+        this.gallery = new galleryApi.gallery(context.gallery);
+      }
+    })
+    .controller('galleryCtrl', function($scope, $location, galleryModel){
+      console.log('5',$scope, $location, galleryModel);
+      $scope.gallery = galleryModel.gallery;
+    });
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/gallery/gallery_controller_test.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+'use strict';
+
+describe("gallery_controller_test", function(){
+    it("should assert something",function(){
+        expect(true).toBe(true);
+    })
+})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/home/home.html	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+<h1>Ammico Application</h1>
+<p>Liste des pages&nbsp;:</p>
+<ul>
+    <li><a href="#">Home</a></li>
+    <li><a href="#gallery">Galerie</a></li>
+    <li><a href="#slideshow">Diaporama</a></li>
+</ul>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/home/home_controller.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,17 @@
+(function(){
+  'use strict';
+
+
+  angular.module('ammicoHome',['ngRoute'])
+    .config(function ($routeProvider) {
+      $routeProvider
+        .when('/', {
+          templateUrl: 'home/home.html',
+          controller: 'homeCtrl'
+        });
+    })
+    .controller('homeCtrl', function($scope, $location){
+      console.log('5-0',$scope, $location);
+    });
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/home/home_controller_test.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+'use strict';
+
+describe("home_controller_test", function(){
+    it("should assert something",function(){
+        expect(true).toBe(true);
+    })
+})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/index.html	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Ammico : Home</title>
+  <link rel="stylesheet" href="lib.css">
+  <link rel="stylesheet" href="app.css">
+</head>
+<body ng-controller="homeCtrl" ng-app="ammico" ng-cloak>
+  <div class="navbar navbar-inverse" role="navigation">
+      <div class="container">
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" id="logo" href="index.html"><img src="img/ammico_logo_small.png"></a>
+        </div>
+        <div class="collapse navbar-collapse">
+          <ul class="nav navbar-nav" ng-controller="routeClassCtrl">
+            <li ng-class="{active:isActive('/')}"><a href="#/">Home</a></li>
+            <li ng-class="{active:isActive('/gallery')}"><a href="#/gallery">Galerie</a></li>
+            <li ng-class="{active:isActive('/slideshow')}"><a href="#/slideshow">Diaporama</a></li>
+          </ul>
+        </div>
+      </div>
+  </div>
+  <div class="container">
+    <div class="ammico-content">
+      <div ng-view></div>
+    </div>
+    <footer>
+      <div class="row">
+        <div class="footer-img col-md-6">
+            <a href="http://www.iri.centrepompidou.fr" target="_blank"><img src="img/logo_IRI_footer.png" alt="Logo IRI" /></a>
+        </div>
+        <div class="col-md-6 text-right">
+            ammico vBeta - ©2014
+        </div>
+      </div>
+    </footer>
+  </div>
+  <script type="text/javascript" src="lib.js"></script>
+  <script type="text/javascript" src="templates.js"></script>
+  <script type="text/javascript" src="app.js"></script>
+  <script type="text/javascript">
+      angular.module("ammico")
+          .value('context', {
+              record: angular.fromJson('{"record": "record value"}'),
+              urls: {
+                  base_static: "./",
+                  galleryUrl: "data/gallery.json",
+                  slideshowUrl: "data/slideshow.json"
+              }
+          });
+
+  </script>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/slideshow/dataEditor.html	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,14 @@
+<div>
+<div ng-hide="editMode">
+  <h4>{{slide.user_title}}</h4>
+  <p>{{slide.user_description}}</p>
+  <p><em>{{slide.tags.join(', ')}}</em></p>
+  <p class="text-right"><button id="btn-search-annotations" class="btn" ng-click="editMode=true"><span class="glyphicon glyphicon-pencil"></span></button></p>
+</div>
+<div ng-show="editMode">
+  <input type="text" class="form-control" ng-model='slide.user_title'></input>
+  <textarea class="form-control editor-textarea" ng-model='slide.user_description'></textarea>
+  <input type="text" class="form-control" ng-model='slide.tags'></input>
+  <p class="text-right"><button id="btn-search-annotations" class="btn" ng-click="slidesave()"><span class="glyphicon glyphicon-ok"></span></button></p>
+</div>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/slideshow/slideshow.css	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,26 @@
+.carousel-caption {
+    color: #000;
+    position: static;
+    text-shadow: none;
+    text-align: left;
+}
+
+.carousel-indicators {
+    display: none;
+}
+
+.carousel-control {
+    width: 3%;
+}
+
+.carousel-control .icon-next, .carousel-control .glyphicon-chevron-right {
+    right: 2%;
+}
+
+.original-text {
+    font-style: italic;
+}
+
+textarea.form-control {
+    height: 140px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/slideshow/slideshow.html	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,18 @@
+<h1>{{ slideshow.title }}</h1>
+<p>{{ slideshow.description }}</p>
+<div class="carousel-holder row">
+  <carousel >
+    <slide ng-repeat="slide in slideshow.images" active="slide.active">
+        <div class="row">
+          <div class="col-md-7 col-md-offset-1">
+            <img ng-src="{{slide.url}}" style="margin:auto;">
+          </div>
+          <div class="carousel-caption col-md-3">
+            <slide-editor index="{{$index}}"></slide-editor>
+            <hr/>
+            <h4 class="original-text">{{slide.title}}</h4>
+            <p class="original-text">{{slide.description}}</p>
+          </div>
+      </slide>
+  </carousel>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/slideshow/slideshow_controller.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,76 @@
+(function(){
+  'use strict';
+
+  angular.module('ammicoSlideshow',['ngResource', 'ngRoute', 'ui.bootstrap'])
+    .config(function ($routeProvider) {
+      $routeProvider
+        .when('/', {
+          templateUrl: 'slideshow/slideshow.html',
+          controller: 'slideshowCtrl'
+        });
+    })
+    .service('slideshowApi', function($resource, context) {
+      this.slideshow = $resource(context.urls.slideshowUrl,
+        {
+          get: {
+            method: 'GET',
+            isArray: false
+          },
+          save:{
+            method:'PUT',
+            isArray:false//, headers:{'X-CSRFToken':context.csrf_token}
+          }
+        });
+    })
+    .service('slideshowModel', function(slideshowApi, context) {
+      console.log('6',this);
+      if(typeof context.slideshow === 'undefined') {
+          console.log('6-1');
+          this.slideshow = slideshowApi.slideshow.get();
+      }
+      else {
+          console.log('6-2');
+          this.slideshow = new slideshowApi.slideshow(context.slideshow);
+      }
+    })
+    .controller('slideshowCtrl', function($scope, $location, slideshowModel){
+      console.log('6',$scope, $location, slideshowModel);
+      $scope.slideshow = slideshowModel.slideshow;
+
+      $scope.save = function(){
+        $scope.slideshow
+          .$save()
+          .then(
+              function(response) {
+                  console.log('NICE SAVING!', response);
+              },
+              function(reason){
+                  alert('An error occured while saving : ' + reason);
+              }
+          );
+      };
+    })
+    //.directive('slideEditor', function(context) {
+    .directive('slideEditor', function() {
+      return {
+          restrict: 'AE',
+          replace: true,
+          scope: false,
+          templateUrl: 'slideshow/dataEditor.html',
+          //controller: function($scope, $element, $attrs){
+          controller: function($scope){
+              $scope.slidesave = function(){
+                  if(typeof $scope.slide.tags === 'string'){
+                      $scope.slide.tags = $scope.slide.tags.split(',');
+                  }
+                  for (var i = $scope.slide.tags.length - 1; i >= 0; i--) {
+                      $scope.slide.tags[i] = $scope.slide.tags[i].trim();
+                  }
+                  $scope.editMode = false;
+                  $scope.save();
+              };
+          }
+      };
+  });
+
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/app/slideshow/slideshow_controller_test.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,7 @@
+'use strict';
+
+describe("slideshow_controller_test", function(){
+    it("should assert something",function(){
+        expect(true).toBe(true);
+    })
+})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/bower.json	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,24 @@
+{
+  "name": "ammico",
+  "main": "app.js",
+  "version": "0.0.0",
+  "authors": [
+    "IRI"
+  ],
+  "license": "Ceccill-C",
+  "private": true,
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "devDependencies": {
+    "angular": "~1.3",
+    "angular-route": "~1.3",
+    "angular-resource": "~1.3",
+    "angular-bootstrap": "~0.11.0",
+    "bootstrap": "~3.1.1"
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/data/gallery.json	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,56 @@
+{
+  "title": "bae0704f-b0e1-11e2-8479-c8bcc896c290",
+  "description": "description DESC",
+  "images": [
+    {
+      "id": "im001",
+      "title": "im 1 ceci est un titre très très long vraiment très très très long",
+      "url": "data/images/ImageAccueilCM1.jpg"
+    },
+    {
+      "id": "im002",
+      "title": "im 2",
+      "url": "data/images/ImageAccueilCM2.jpg"
+    },
+    {
+      "id": "im003",
+      "title": "im 3",
+      "url": "data/images/ImageAccueilCM3.jpg"
+    },
+    {
+      "id": "im004",
+      "title": "im 4",
+      "url": "data/images/ImageAccueilCM4.jpg"
+    },
+    {
+      "id": "im005",
+      "title": "im 5",
+      "url": "data/images/ImageAccueilCM5.jpg"
+    },
+    {
+      "id": "im006",
+      "title": "im 6",
+      "url": "data/images/ImageAccueilCM6.jpg"
+    },
+    {
+      "id": "im007",
+      "title": "im 7",
+      "url": "data/images/ImageAccueilCM7.jpg"
+    },
+    {
+      "id": "im008",
+      "title": "im 8",
+      "url": "data/images/ImageAccueilCM8.jpg"
+    },
+    {
+      "id": "im009",
+      "title": "im 9",
+      "url": "data/images/ImageAccueilCM3.jpg"
+    },
+    {
+      "id": "im010",
+      "title": "im 10",
+      "url": "data/images/ImageAccueilCM8.jpg"
+    }
+  ]
+}
\ No newline at end of file
Binary file client/data/images/ImageAccueilCM1.jpg has changed
Binary file client/data/images/ImageAccueilCM2.jpg has changed
Binary file client/data/images/ImageAccueilCM3.jpg has changed
Binary file client/data/images/ImageAccueilCM4.jpg has changed
Binary file client/data/images/ImageAccueilCM5.jpg has changed
Binary file client/data/images/ImageAccueilCM6.jpg has changed
Binary file client/data/images/ImageAccueilCM7.jpg has changed
Binary file client/data/images/ImageAccueilCM7_ORIG.jpg has changed
Binary file client/data/images/ImageAccueilCM8.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/data/slideshow.json	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,133 @@
+{
+  "title": "titre de mon slideshow",
+  "description": "description DESC SLIDESHOW BEST EvER",
+  "images": [
+    {
+      "id": "im001",
+      "url": "data/images/ImageAccueilCM1.jpg",
+      "title": "im 1 ceci est un titre très très long vraiment très très très long",
+      "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U R im 1 ceci est un titre très très long vraiment très très très long",
+      "user_description": "U Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag 1",
+        "tag 2",
+        "tag 3"
+      ]
+    },
+    {
+      "id": "im002",
+      "url": "data/images/ImageAccueilCM2.jpg",
+      "title": "im 2",
+      "description": "Lorem ipsum dolor sit amet",
+      "user_title": "U im 2",
+      "user_description": "U Lorem ipsum dolor sit amet",
+      "tags":[
+        "tag C",
+        "tag 5",
+        "tag 7"
+      ]
+    },
+    {
+      "id": "im003",
+      "url": "data/images/ImageAccueilCM3.jpg",
+      "title": "im 3",
+      "description": "adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U im 3",
+      "user_description": "U adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag F",
+        "tag 6",
+        "tag 8"
+      ]
+    },
+    {
+      "id": "im004",
+      "url": "data/images/ImageAccueilCM4.jpg",
+      "title": "im 4",
+      "description": "elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U im 4",
+      "user_description": "U elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag 1"
+      ]
+    },
+    {
+      "id": "im005",
+      "url": "data/images/ImageAccueilCM5.jpg",
+      "title": "im 5",
+      "description": "Lorem ipsum dolor sit amet, consectetur adipiscing",
+      "user_title": "U im 5",
+      "user_description": "U Lorem ipsum dolor sit amet, consectetur adipiscing",
+      "tags":[
+        "tag 2",
+        "tag 3"
+      ]
+    },
+    {
+      "id": "im006",
+      "url": "data/images/ImageAccueilCM6.jpg",
+      "title": "im 6",
+      "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U im 6",
+      "user_description": "U Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag 4",
+        "tag 5",
+        "tag 6"
+      ]
+    },
+    {
+      "id": "im007",
+      "url": "data/images/ImageAccueilCM7.jpg",
+      "title": "im 7",
+      "description": "luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U im 7",
+      "user_description": "U luctus turpis at neque bibendum, non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag A",
+        "tag b",
+        "tag c",
+        "tag d",
+        "tag e"
+      ]
+    },
+    {
+      "id": "im008",
+      "url": "data/images/ImageAccueilCM8.jpg",
+      "title": "im 8",
+      "description": "non porttitor neque porta. Donec euismod neque et orci dictum",
+      "user_title": "U im 8",
+      "user_description": "U non porttitor neque porta. Donec euismod neque et orci dictum",
+      "tags":[
+        "tag 1",
+        "tag 3"
+      ]
+    },
+    {
+      "id": "im009",
+      "url": "data/images/ImageAccueilCM3.jpg",
+      "title": "im 9",
+      "description": "Lorem ipsum",
+      "user_title": "U im 9",
+      "user_description": "U Lorem ipsum",
+      "tags":[
+        "tag 3",
+        "tag 1",
+        "tag 2"
+      ]
+    },
+    {
+      "id": "im010",
+      "url": "data/images/ImageAccueilCM8.jpg",
+      "title": "im 10",
+      "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
+      "user_title": "U im 10",
+      "user_description": "U Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
+      "tags":[
+        "tag 2 fjhds klfjhqs kldjfh qksljhdf kljqsd fkljq skldjf lkqjshdf kljqdfsklj",
+        "tag 3"
+      ]
+    }
+  ]
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/gulpfile.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,137 @@
+var gulp = require('gulp');
+var gutil = require('gulp-util')
+var plugins = require("gulp-load-plugins")({lazy:false});
+//var flatten = require('gulp-flatten');
+//var uglify = require('gulp-uglify');
+//var clean = require('gulp-clean');
+//var rename = require('gulp-rename');
+//var filesize = require('gulp-filesize');
+//var cssmin  = require('gulp-cssmin');
+
+gulp.task('clean', function () {
+  return gulp.src('build', {read: false})
+    .pipe(clean());
+});
+
+var scriptsSrc = ['!./app/**/*_test.js','./app/**/*.js'];
+
+gulp.task('scripts', function(){
+    //combine all js files of the app
+    gulp.src(scriptsSrc)
+        .pipe(plugins.jshint())
+        .pipe(plugins.jshint.reporter('default'))
+        .pipe(plugins.jshint.reporter('fail'))
+        .pipe(plugins.concat('app.js'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .pipe(plugins.uglify())
+        .pipe(plugins.rename('app.min.js'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .on('error', gutil.log);
+});
+
+gulp.task('templates',function(){
+    //combine all template files of the app into a js file
+    gulp.src(['!./app/index.html',
+        './app/**/*.html'])
+        .pipe(plugins.angularTemplatecache('templates.js',{standalone:true}))
+        .pipe(gulp.dest('./build'));
+});
+
+gulp.task('css', function(){
+    gulp.src('./app/**/*.css')
+//        .pipe(plugins.csslint())
+//        .pipe(plugins.csslint.reporter())
+        .pipe(plugins.concat('app.css'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .pipe(plugins.minifyCss({keepBreaks:true}))
+        .pipe(plugins.rename('app.min.css'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize());
+});
+
+var vendorJSsrc = [
+  '!./bower_components/**/*.min.js',
+  '!./bower_components/bootstrap/Gruntfile.js',
+  '!./bower_components/bootstrap/grunt/*',
+  '!./bower_components/bootstrap/js/*',
+  '!./bower_components/jquery/src/**/*',
+  '!./bower_components/angular-bootstrap/ui-bootstrap.js',
+  './bower_components/jquery/dist/jquery.js',
+  './bower_components/**/*.js'
+];
+
+gulp.task('vendorJS', function(){
+    //concatenate vendor JS files
+    gulp.src(vendorJSsrc)
+        .pipe(plugins.concat('lib.js'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .pipe(plugins.uglify())
+        .pipe(plugins.rename('lib.min.js'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .on('error', gutil.log);
+});
+
+gulp.task('vendorCSS', function(){
+    //concatenate vendor CSS files
+    gulp.src(['!./bower_components/**/*.min.css',
+        './bower_components/**/*.css'])
+        .pipe(plugins.concat('lib.css'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize())
+        .pipe(plugins.minifyCss({keepBreaks:true}))
+        .pipe(plugins.rename('lib.min.css'))
+        .pipe(gulp.dest('./build'))
+        .pipe(plugins.filesize());
+});
+
+gulp.task('vendorFonts', function(){
+    gulp.src(['./bower_components/**/fonts/*'])
+        .pipe(plugins.flatten())
+        .pipe(gulp.dest('./build/fonts'));
+});
+
+gulp.task('copy-index', function() {
+    gulp.src('./app/index.html')
+        .pipe(gulp.dest('./build'));
+});
+
+gulp.task('copy-data', function() {
+    gulp.src('./data/**/*')
+        .pipe(gulp.dest('./build/data'));
+});
+
+gulp.task('copy-img', function() {
+    gulp.src('./img/**/*')
+        .pipe(gulp.dest('./build/img'));
+});
+
+gulp.task('watch',function(){
+    gulp.watch([
+        'build/**/*.html',
+        'build/**/*.js',
+        'build/**/*.css'
+    ], function(event) {
+        return gulp.src(event.path)
+            .pipe(plugins.connect.reload());
+    });
+    gulp.watch(['./app/**/*.js','!./app/**/*test.js'],['scripts']);
+    gulp.watch(['!./app/index.html','./app/**/*.html'],['templates']);
+    gulp.watch('./app/**/*.css',['css']);
+    gulp.watch('./app/index.html',['copy-index']);
+    gulp.watch('./data/**/*',['copy-data']);
+    gulp.watch('./img/**/*',['copy-img']);
+
+});
+
+gulp.task('connect', plugins.connect.server({
+    root: ['build'],
+    port: 9000,
+    livereload: true
+}));
+
+gulp.task('default',['connect','scripts','templates','css','copy-index','copy-data','copy-img','vendorJS','vendorCSS','vendorFonts','watch']);
Binary file client/img/ammico_logo_small.png has changed
Binary file client/img/loader.gif has changed
Binary file client/img/logo_IRI_footer.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/karma-unit.js	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,70 @@
+// Karma configuration
+// Generated on Thu Mar 27 2014 15:49:13 GMT+0800 (PHT)
+
+module.exports = function(config) {
+  config.set({
+
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '',
+
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+
+    // list of files / patterns to load in the browser
+    files: [
+        './build/lib.js',
+        './build/app.js',
+        './build/templates.js',
+        './app/**/*test.js'
+    ],
+
+
+    // list of files to exclude
+    exclude: [
+      
+    ],
+
+
+    // preprocess matching files before serving them to the browser
+    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+    
+    },
+
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['progress'],
+
+
+    // web server port
+    port: 9876,
+
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_DEBUG,
+
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true,
+
+
+    // start these browsers
+    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['Chrome'],
+
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: false
+  });
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/package.json	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,33 @@
+{
+  "name": "ammico",
+  "version": "0.0.0",
+  "description": "Ammico client application",
+  "main": "app.js",
+  "repository": {
+    "type": "mercurial",
+    "url": "http://www.iri.centrepompidou.fr/dev/hg/ammico"
+  },
+  "author": "IRI",
+  "license": "Cecill-C",
+  "devDependencies": {
+    "bower": "^1.3.4",
+    "grunt-cli": "^0.1.13",
+    "gulp": "~3.5.5",
+    "gulp-angular-templatecache": "^1.1.0",
+    "gulp-clean": "^0.3.0",
+    "gulp-concat": "~2.1.7",
+    "gulp-connect": "^1.0.7",
+    "gulp-csslint": "^0.1.4",
+    "gulp-filesize": "0.0.6",
+    "gulp-flatten": "0.0.2",
+    "gulp-jshint": "~1.5.0",
+    "gulp-load-plugins": "~0.4.0",
+    "gulp-minify-css": "^0.3.4",
+    "gulp-rename": "^1.2.0",
+    "gulp-uglify": "^0.3.0",
+    "gulp-util": "^2.2.16",
+    "karma": "^0.12.1",
+    "karma-chrome-launcher": "^0.1.2",
+    "karma-jasmine": "^0.1.5"
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/README.md	Wed Jun 11 01:26:59 2014 +0200
@@ -0,0 +1,2 @@
+Ammico server
+=============