carte-server 0.0.26 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62dd6b63cb3dc76b0ec49dc9eb0e1218947c3d9d
4
- data.tar.gz: cfc482d9f3834d61ad601a2b341b1ae5f58c19f0
3
+ metadata.gz: d5d689a6bbbfaebcc4b2317306ece56bc01860d9
4
+ data.tar.gz: 62c6865bd68b8fba5ab18230aed5a11f917b5cb5
5
5
  SHA512:
6
- metadata.gz: a35116bcb9945a1fe83a566db288c5189eb85f9ce71047ef70ad73aa3f1622d21d596bc2b609e24e4dbcb59a5fc7792c6d14928d8f7f4a75f613af00826cf57d
7
- data.tar.gz: e38cc8e0f86b9f68d88f44b0b2bbea58e6cb7334538c8df289e3397df6a3a7cbb54aa9cccb714292b2ad02ce61d133ccee7c89f4f4762f3e7ff6be703b7710c3
6
+ metadata.gz: 4822231b9c7e7bd40fe3a55278bec3c6ff5df2d0600315ecffb799979db1b078625585cdf55ea7113ce57cef67113ba1b0aafc2857f56af2f89e0857dc24eb1d
7
+ data.tar.gz: ad53d1b291851888f3f41951f18575c2d83cb473b048a45ed1a45c5d8f0618185eac927584ea591d362917c4610d0af94e66be46dd9617e12aa0565d8f8cce3e
@@ -10,7 +10,6 @@ PATH
10
10
  mongoid_auto_increment_id (= 0.6.5)
11
11
  pry
12
12
  redcarpet
13
- rspec
14
13
  sinatra
15
14
  sinatra-contrib
16
15
  will_paginate_mongoid
@@ -117,4 +116,5 @@ DEPENDENCIES
117
116
  carte-server!
118
117
  httparty
119
118
  rake (~> 10.0)
119
+ rspec
120
120
  shotgun
data/README.md CHANGED
@@ -33,13 +33,6 @@ Japanese introduction is [here](http://tily.tumblr.com/post/117678137942/carte).
33
33
 
34
34
  [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/tily/carte-sandbox)
35
35
 
36
- ```
37
- ## change title and description
38
- $ vi config.json
39
- ## replace brand icon
40
- $ cp ~/Desktop/icon.png public/images/icon.png
41
- ```
42
-
43
36
  **Docker**
44
37
 
45
38
  ```bash
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "shotgun"
24
- #spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec"
25
25
  spec.add_development_dependency "httparty"
26
26
 
27
27
  spec.add_dependency "sinatra"
@@ -35,5 +35,4 @@ Gem::Specification.new do |spec|
35
35
  spec.add_dependency "mongoid-geospatial"
36
36
  spec.add_dependency "redcarpet"
37
37
  spec.add_dependency "pry"
38
- spec.add_dependency "rspec"
39
38
  end
@@ -1,3 +1,3 @@
1
1
  gulp = require 'gulp'
2
- Carte = require './lib/carte'
3
- new Carte().install(gulp, __dirname + '/config.json')
2
+ Tasks = require('./lib/carte').Tasks
3
+ (new Tasks).install(gulp, __dirname + '/config.json')
@@ -1,78 +1,9 @@
1
- fs = require 'fs-extra'
2
- path = require 'path'
3
- gulp = require 'gulp'
4
- gulpUtil = require 'gulp-util'
5
- gulpIf = require 'gulp-if'
6
- sourceStream = require 'vinyl-source-stream'
7
- browserify = require 'browserify'
8
- watchify = require 'watchify'
9
- uglify = require 'gulp-uglify'
10
- streamify = require 'gulp-streamify'
11
- coffeeReactify = require 'coffee-reactify'
12
- browserifyCss = require 'browserify-css'
13
- _ = require 'lodash'
14
- jade = require 'gulp-jade'
15
- rename = require 'gulp-rename'
16
-
17
- module.exports = class Carte
18
- watching: false
19
-
20
- install: (gulp, config)->
21
- custom = require(config)
22
- fs.writeFileSync(__dirname + '/carte/shared/custom.json', JSON.stringify(custom))
23
-
24
- gulp.task 'watching', => @watching = true
25
- gulp.task 'build', ['build:html', 'build:script']
26
- gulp.task 'watch', ['watching', 'build:html', 'build:script']
27
-
28
- gulp.task 'build:html', =>
29
- _config = require('./carte/client/config')
30
- gulp.src(__dirname + '/carte/client.jade')
31
- .pipe jade(locals: {config: _config}, pretty: true)
32
- .pipe rename(_config.html_path)
33
- .pipe gulp.dest(_config.root_dir)
34
-
35
- gulp.task 'build:script', =>
36
- @buildScript config: config
37
-
38
- buildScript: (options)->
39
- config = require(options.config)
40
- fs.writeFileSync(__dirname + '/carte/shared/custom.json', JSON.stringify(config))
41
- dir = config.root_dir
42
- file = path.basename config.script_path
43
- browserify = browserify
44
- cache: {}
45
- packageCache: {}
46
- fullPaths: true
47
- entries: [__dirname + '/carte/client.coffee']
48
- extensions: ['.coffee', '.js', '.cjsx', '.css']
49
- browserify
50
- .transform coffeeReactify
51
- .transform browserifyCss,
52
- rootDir: 'public'
53
- processRelativeUrl: (relativeUrl)->
54
- stripQueryStringAndHashFromPath = (url)-> url.split('?')[0].split('#')[0]
55
- rootDir = path.resolve(process.cwd(), 'public')
56
- relativePath = stripQueryStringAndHashFromPath(relativeUrl)
57
- queryStringAndHash = relativeUrl.substring(relativePath.length)
58
- prefix = '../node_modules/'
59
- if (_.startsWith(relativePath, prefix))
60
- vendorPath = 'vendor/' + relativePath.substring(prefix.length)
61
- source = path.join(rootDir, relativePath)
62
- target = path.join(rootDir, vendorPath)
63
- gulpUtil.log('Copying file from ' + JSON.stringify(source) + ' to ' + JSON.stringify(target))
64
- fs.copySync(source, target)
65
- return vendorPath + queryStringAndHash
66
- relativeUrl
67
- if @watching
68
- watchified = watchify(browserify)
69
- watchified.on 'update', ()=> @bundle(browserify, dir, file)
70
- watchified.on 'log', gulpUtil.log
71
- @bundle(browserify, dir, file)
72
-
73
- bundle: (browserify, dir, file)->
74
- browserify
75
- .bundle()
76
- .pipe sourceStream file
77
- .pipe gulpIf(!@watching, streamify(uglify(compress: {drop_console: !@watching})))
78
- .pipe gulp.dest dir
1
+ Tasks = require './carte/client/tasks'
2
+ Card = require './carte/client/models/card'
3
+ Cards = require './carte/client/models/cards'
4
+
5
+ module.exports =
6
+ Tasks: Tasks
7
+ Models:
8
+ Card: Card
9
+ Cards: Cards
@@ -15,22 +15,120 @@
15
15
  .tools a:visited,
16
16
  .tools a:active
17
17
  {
18
- color: #333333 !important;
18
+ color: #333 !important;
19
19
  text-decoration: none !important;
20
20
  }
21
21
 
22
+ ul.nav-pills li a {
23
+ padding: 6px 12px;
24
+ }
25
+
22
26
  .card ul,ol {
23
27
  padding-left: 20px;
24
28
  }
25
29
 
30
+ .col-sm-4 {
31
+ padding: 0px;
32
+ }
33
+
34
+ .col-sm-12 {
35
+ padding: 0px;
36
+ }
37
+
38
+ .alert {
39
+ padding: 5px;
40
+ }
41
+
42
+ .alert ul {
43
+ padding-left: 20px;
44
+ }
45
+
46
+ .list-group {
47
+ margin: 0px;
48
+ padding: 5px;
49
+ }
50
+
51
+ .list-group-item {
52
+ height: 200px;
53
+ }
54
+
55
+ .navbar {
56
+ padding: 0px;
57
+ background-color: white;
58
+ margin-bottom: 5px;
59
+ }
60
+
61
+ .badge {
62
+ color: #333;
63
+ background-color: #eee;
64
+ }
65
+
66
+ .modal-body .form-group:last-child {
67
+ padding-bottom: 17px;
68
+ }
69
+
70
+ .navbar-brand:first-child {
71
+ padding-top: 10px;
72
+ }
73
+
74
+ /* carte original definitions */
75
+ .carte-content {
76
+ padding: 0px 20px;
77
+ }
78
+
79
+ .carte-hidden {
80
+ visibility: hidden;
81
+ }
82
+
83
+ .carte-card-header {
84
+ margin-bottom: 10px;
85
+ }
86
+
87
+ .carte-card-header .glyphicon-star {
88
+ margin-right: 5px;
89
+ }
90
+
91
+ .carte-card-content {
92
+ overflow: hidden;
93
+ width: 100%;
94
+ height: 73%;
95
+ word-wrap: break-word;
96
+ }
97
+
98
+ .carte-pagination .carte-pagination-curr {
99
+ width: 7.5em;
100
+ text-align: center;
101
+ }
102
+
103
+ .carte-list {
104
+ padding-left: 5px;
105
+ padding-right: 5px;
106
+ }
107
+
108
+ .carte-slideshow {
109
+ height: 100%;
110
+ width: 100%;
111
+ background-color: white;
112
+ position : absolute;
113
+ }
114
+
115
+ /* http://stackoverflow.com/questions/24511887/css-animation-works-in-chrome-but-not-in-firefox-resolved */
26
116
  .glyphicon-refresh-animate {
27
- -animation: spin .7s infinite linear;
28
- -webkit-animation: spin2 .7s infinite linear;
117
+ -moz-animation: spin-moz .7s infinite linear;
118
+ -webkit-animation: spin-webkit .7s infinite linear;
119
+ animation: spin .7s infinite linear;
120
+ }
121
+
122
+ @-moz-keyframes spin-moz {
123
+ from { -moz-transform: rotate(0deg);}
124
+ to { -moz-transform: rotate(360deg);}
29
125
  }
30
- @-webkit-keyframes spin2 {
126
+
127
+ @-webkit-keyframes spin-webkit {
31
128
  from { -webkit-transform: rotate(0deg);}
32
129
  to { -webkit-transform: rotate(360deg);}
33
130
  }
131
+
34
132
  @keyframes spin {
35
133
  from { transform: scale(1) rotate(0deg);}
36
134
  to { transform: scale(1) rotate(360deg);}
@@ -0,0 +1,78 @@
1
+ fs = require 'fs-extra'
2
+ path = require 'path'
3
+ gulp = require 'gulp'
4
+ gulpUtil = require 'gulp-util'
5
+ gulpIf = require 'gulp-if'
6
+ sourceStream = require 'vinyl-source-stream'
7
+ browserify = require 'browserify'
8
+ watchify = require 'watchify'
9
+ uglify = require 'gulp-uglify'
10
+ streamify = require 'gulp-streamify'
11
+ coffeeReactify = require 'coffee-reactify'
12
+ browserifyCss = require 'browserify-css'
13
+ _ = require 'lodash'
14
+ jade = require 'gulp-jade'
15
+ rename = require 'gulp-rename'
16
+
17
+ module.exports = class Carte
18
+ watching: false
19
+
20
+ install: (gulp, config)->
21
+ custom = require(config)
22
+ fs.writeFileSync(__dirname + '/../shared/custom.json', JSON.stringify(custom))
23
+
24
+ gulp.task 'watching', => @watching = true
25
+ gulp.task 'build', ['build:html', 'build:script']
26
+ gulp.task 'watch', ['watching', 'build:html', 'build:script']
27
+
28
+ gulp.task 'build:html', =>
29
+ _config = require('./config')
30
+ gulp.src(__dirname + '/../client.jade')
31
+ .pipe jade(locals: {config: _config}, pretty: true)
32
+ .pipe rename(_config.html_path)
33
+ .pipe gulp.dest(_config.root_dir)
34
+
35
+ gulp.task 'build:script', =>
36
+ @buildScript config: config
37
+
38
+ buildScript: (options)->
39
+ config = require(options.config)
40
+ fs.writeFileSync(__dirname + '/../shared/custom.json', JSON.stringify(config))
41
+ dir = config.root_dir
42
+ file = path.basename config.script_path
43
+ browserify = browserify
44
+ cache: {}
45
+ packageCache: {}
46
+ fullPaths: true
47
+ entries: [__dirname + '/../client.coffee']
48
+ extensions: ['.coffee', '.js', '.cjsx', '.css']
49
+ browserify
50
+ .transform coffeeReactify
51
+ .transform browserifyCss,
52
+ rootDir: 'public'
53
+ processRelativeUrl: (relativeUrl)->
54
+ stripQueryStringAndHashFromPath = (url)-> url.split('?')[0].split('#')[0]
55
+ rootDir = path.resolve(process.cwd(), 'public')
56
+ relativePath = stripQueryStringAndHashFromPath(relativeUrl)
57
+ queryStringAndHash = relativeUrl.substring(relativePath.length)
58
+ prefix = '../node_modules/'
59
+ if (_.startsWith(relativePath, prefix))
60
+ vendorPath = 'vendor/' + relativePath.substring(prefix.length)
61
+ source = path.join(rootDir, relativePath)
62
+ target = path.join(rootDir, vendorPath)
63
+ gulpUtil.log('Copying file from ' + JSON.stringify(source) + ' to ' + JSON.stringify(target))
64
+ fs.copySync(source, target)
65
+ return vendorPath + queryStringAndHash
66
+ relativeUrl
67
+ if @watching
68
+ watchified = watchify(browserify)
69
+ watchified.on 'update', ()=> @bundle(browserify, dir, file)
70
+ watchified.on 'log', gulpUtil.log
71
+ @bundle(browserify, dir, file)
72
+
73
+ bundle: (browserify, dir, file)->
74
+ browserify
75
+ .bundle()
76
+ .pipe sourceStream file
77
+ .pipe gulpIf(!@watching, streamify(uglify(compress: {drop_console: !@watching})))
78
+ .pipe gulp.dest dir
@@ -15,8 +15,6 @@ module.exports = React.createClass
15
15
  Button = require('react-bootstrap/lib/Button')
16
16
  <div>
17
17
  <Header key='header' router={@props.router} />
18
- <div style={padding:"0px 20px"}>
19
- <Content key='content' router={@props.router} />
20
- </div>
18
+ <Content key='content' router={@props.router} />
21
19
  </div>
22
20
 
@@ -4,6 +4,7 @@ Edit = require('./edit')
4
4
  ModalTrigger = require('react-bootstrap/lib/ModalTrigger')
5
5
  markdownIt = require('markdown-it')(linkify: true)
6
6
  helpers = require('../helpers')
7
+ classnames = require('classnames')
7
8
 
8
9
  module.exports = React.createClass
9
10
  displayName: 'Card'
@@ -24,18 +25,21 @@ module.exports = React.createClass
24
25
  onMouseLeave: ()->
25
26
  @setState showTools: false
26
27
 
28
+ showTools: ()->
29
+ helpers.isMobile() || @state.showTools
30
+
27
31
  render: ->
28
- <div className='col-sm-4 col-xs-12 list-group' style={marginBottom:'0px',padding:"5px"} onMouseOver={@onMouseOver} onMouseLeave={@onMouseLeave}>
29
- <div className='list-group-item' style={height:'200px'}>
30
- <div style={marginBottom:'10px'}>
32
+ <div className='col-sm-4 col-xs-12 list-group' onMouseOver={@onMouseOver} onMouseLeave={@onMouseLeave}>
33
+ <div className='list-group-item'>
34
+ <div className="carte-card-header">
31
35
  {
32
36
  if @props.card.get('focused')
33
- <i className='glyphicon glyphicon-star' style={marginRight:'5px'} />
37
+ <i className='glyphicon glyphicon-star' />
34
38
  }
35
39
  <strong>
36
40
  {@props.card.get('title')}
37
41
  </strong>
38
- <span className='pull-right tools' style={{visibility: if helpers.isMobile() || @state.showTools then 'visible' else 'hidden'}}>
42
+ <span className={classnames('pull-right': true, 'tools': true, 'carte-hidden': !@showTools())}>
39
43
  <ModalTrigger modal={<Edit card={@props.card} />}>
40
44
  <a href="javascript:void(0)">
41
45
  <i className='glyphicon glyphicon-edit' />
@@ -48,14 +52,20 @@ module.exports = React.createClass
48
52
  </a>
49
53
  </span>
50
54
  </div>
51
- <div className="card" style={overflow:'hidden',width:'100%',height:'73%',wordWrap:'break-word'}>
55
+ <div className="carte-card-content">
52
56
  <div dangerouslySetInnerHTML={__html: markdownIt.render @props.card.get('content')} />
53
57
  </div>
54
- <div style={{visibility: if helpers.isMobile() || @state.showTools then 'visible' else 'hidden'}}>
58
+ <div className={classnames('carte-hidden': !@showTools())}>
55
59
  {
56
60
  if @props.card.get("tags")
57
61
  @props.card.get("tags").map (tag)->
58
- <span className="pull-right tools">&nbsp;&nbsp;<a href={"#/?tags=" + tag}><i className="glyphicon glyphicon-tag" />&nbsp;{tag}</a></span>
62
+ <span className="pull-right tools">
63
+ &nbsp;&nbsp;
64
+ <a href={"#/?tags=" + tag}>
65
+ <i className="glyphicon glyphicon-tag" />
66
+ &nbsp;{tag}
67
+ </a>
68
+ </span>
59
69
  }
60
70
  </div>
61
71
  </div>
@@ -20,40 +20,54 @@ module.exports = React.createClass
20
20
  @props.router.off "route", @callback
21
21
 
22
22
  render: ->
23
- switch @props.router.current
24
- when "list"
25
- cards = new CardCollection()
26
- cards.query = $.extend {}, config.default_query, @props.router.query
27
- cards.fetching = true
28
- cards.fetch success: ()-> cards.fetching = false
29
- #title = []
30
- #for k, v of cards.query
31
- # title.push(String(k).capitalize() + ': ' + v)
32
- #title = title.join(', ')
33
- #title = config.title + ' (' + title + ')'
34
- #document.title = title
35
- document.title = config.title
36
- <List key='list' router={@props.router} cards={cards} />
37
- when "show"
38
- cards = new CardCollection()
39
- cards.fetching = true
40
- card = new CardModel(title: @props.router.title)
41
- card.fetch
42
- success: (card)->
43
- for left in card.get("lefts")
44
- cardModel = new CardModel(left)
45
- cardModel.set 'focused', false
46
- cards.add cardModel
47
- card.set 'focused', true
48
- cards.add card
49
- for right in card.get("rights")
50
- cardModel = new CardModel(right)
51
- cardModel.set 'focused', false
52
- cards.add cardModel
53
- cards.fetching = false
54
- error: (card, response)=>
55
- cards.fetching = false
56
- document.title = config.title + '、' + card.get('title')
57
- <List key='show' cards={cards} card={card} />
58
- else
59
- <div>Loading ...</div>
23
+ <div className="carte-content">
24
+ {
25
+ switch @props.router.current
26
+ when "list"
27
+ cards = new CardCollection()
28
+ cards.query = $.extend {}, config.default_query, @props.router.query
29
+ cards.fetching = true
30
+ cards.fetch success: ()-> cards.fetching = false
31
+ #title = []
32
+ #for k, v of cards.query
33
+ # title.push(String(k).capitalize() + ': ' + v)
34
+ #title = title.join(', ')
35
+ #title = config.title + ' (' + title + ')'
36
+ #document.title = title
37
+ document.title = config.title
38
+ <List key='list' router={@props.router} cards={cards} />
39
+ when "show"
40
+ cards = new CardCollection()
41
+ cards.fetching = true
42
+ card = new CardModel(title: @props.router.title)
43
+ card.fetch
44
+ success: (card)->
45
+ for left in card.get("lefts")
46
+ cardModel = new CardModel(left)
47
+ cardModel.set 'focused', false
48
+ cards.add cardModel
49
+ card.set 'focused', true
50
+ cards.add card
51
+ for right in card.get("rights")
52
+ cardModel = new CardModel(right)
53
+ cardModel.set 'focused', false
54
+ cards.add cardModel
55
+ cards.fetching = false
56
+ error: (card, response)=>
57
+ cards.fetching = false
58
+ document.title = config.title + '、' + card.get('title')
59
+ <List key='show' cards={cards} card={card} />
60
+ when "slideshow"
61
+ console.log 'slideshow', @props.router.query
62
+ cards = new CardCollection()
63
+ cards.query = $.extend {}, config.default_query, @props.router.query
64
+ cards.fetching = true
65
+ cards.fetch success: ()-> cards.fetching = false
66
+ document.title = config.title + '、スライドショー'
67
+ e = React.createElement(Slideshow, cards: cards)
68
+ React.render(e, document.body)
69
+ #<Slideshow key='slideshow' router={@props.router} cards={cards} />
70
+ else
71
+ <div>Loading ...</div>
72
+ }
73
+ </div>
@@ -64,17 +64,17 @@ module.exports = React.createClass
64
64
  <div className='modal-body'>
65
65
  {
66
66
  if @state.errors
67
- <div className="alert alert-danger" role="alert" style={padding:'5px'}>
68
- <ul style={paddingLeft:"20px"}>
69
- {
70
- for key, errors of @state.errors
71
- for error in errors
72
- <li>{key + ' ' + error}</li>
73
- }
67
+ <div className="alert alert-danger" role="alert">
68
+ <ul>
69
+ {
70
+ for key, errors of @state.errors
71
+ for error in errors
72
+ <li>{key + ' ' + error}</li>
73
+ }
74
74
  </ul>
75
75
  </div>
76
76
  else if @state.createSuccess
77
- <div className="alert alert-success" role="alert" style={padding:'5px'}>
77
+ <div className="alert alert-success" role="alert">
78
78
  <i className="glyphicon glyphicon-info-sign" />&nbsp;
79
79
  You created a card successfully. Let's create next one.
80
80
  </div>
@@ -99,7 +99,7 @@ module.exports = React.createClass
99
99
  </label>
100
100
  </div>
101
101
  }
102
- <div className="form-group" style={{paddingBottom:'17px'}}>
102
+ <div className="form-group">
103
103
  <button className="btn btn-default pull-right" onClick={@onClickOk} disabled={@state.updating}>
104
104
  &nbsp;
105
105
  OK
@@ -5,5 +5,4 @@ module.exports = React.createClass
5
5
  displayName: 'Footer'
6
6
 
7
7
  render: ->
8
- <div style={{paddingTop:'0px',paddingBottom:'100px',paddingRight:"30px",paddingLeft:'30px'}}>
9
- </div>
8
+ <div />
@@ -70,10 +70,10 @@ module.exports = React.createClass
70
70
  location.hash = '/?' + $.param(query)
71
71
 
72
72
  render: ->
73
- <nav className="navbar navbar-default" style={{padding:"0px",backgroundColor:"white",marginBottom:"5px"}}>
73
+ <nav className="navbar navbar-default">
74
74
  <div className="container-fluid">
75
75
  <div className="navbar-header">
76
- <a className="navbar-brand" onClick={helpers.reload if !config.icon_link} href={if config.icon_link then config.icon_link else "#/"} style={{paddingTop:"10px"}}>
76
+ <a className="navbar-brand" onClick={helpers.reload if !config.icon_link} href={if config.icon_link then config.icon_link else "#/"}>
77
77
  <img alt="Brand" src={config.root_path + config.icon_path} width="30" height="30" />
78
78
  </a>
79
79
  <a className="navbar-brand" onClick={helpers.reload} href="#/">
@@ -38,48 +38,79 @@ module.exports = React.createClass
38
38
  $.param(query)
39
39
 
40
40
  render: ->
41
- <div className="container" style={{paddingLeft:"5px",paddingRight:"5px"}}>
41
+ <div className="container carte-list">
42
42
  {if !@props.card
43
43
  <div className="row">
44
- <div className="col-sm-4" style={{padding:"0px"}}>
44
+ <div className="col-sm-4">
45
45
  <ul className="nav nav-pills">
46
46
  {
47
47
  for menuItem in config.menu_items
48
48
  switch menuItem
49
49
  when 'atoz'
50
- <li><a onClick={helpers.reload} href={"#/?" + @atozParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'title' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>A to Z</a></li>
50
+ <li key='atoz'>
51
+ <a onClick={helpers.reload} href={"#/?" + @atozParam()}>
52
+ {
53
+ if @props.cards.query.sort == 'title' and @props.cards.query.order != 'random'
54
+ <strong>A to Z</strong>
55
+ else
56
+ <span>A to Z</span>
57
+ }
58
+ </a>
59
+ </li>
51
60
  when 'latest'
52
- <li><a onClick={helpers.reload} href={"#/?" + @latestParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'updated_at' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>Latest</a></li>
61
+ <li key='latest'>
62
+ <a onClick={helpers.reload} href={"#/?" + @latestParam()}>
63
+ {
64
+ if @props.cards.query.sort == 'updated_at' and @props.cards.query.order != 'random'
65
+ <strong>Latest</strong>
66
+ else
67
+ <span>Latest</span>
68
+ }
69
+ </a>
70
+ </li>
53
71
  when 'random'
54
- <li><a onClick={helpers.reload} href={"#/?" + @randomParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.order == 'random' then 'bold' else 'normal'}}>Random</a></li>
72
+ <li key='random'>
73
+ <a onClick={helpers.reload} href={"#/?" + @randomParam()}>
74
+ {
75
+ if @props.cards.query.order == 'random'
76
+ <strong>Random</strong>
77
+ else
78
+ <span>Random</span>
79
+ }
80
+ </a>
81
+ </li>
55
82
  }
56
- <li><a href={config.root_path + config.api_path + "/cards.xml?" + @queryParam({}, [])} style={{padding:'6px 12px'}}><i className="fa fa-rss" /></a></li>
83
+ <li>
84
+ <a href={config.root_path + config.api_path + "/cards.xml?" + @queryParam({}, [])}>
85
+ <i className="fa fa-rss" />
86
+ </a>
87
+ </li>
57
88
  </ul>
58
89
  </div>
59
- <div className="col-sm-4" style={{padding:"0px"}}>
60
- <a href="javascript:void(0)" className="center-block text-center" style={padding:'6px 12px'}>
61
- <span className="badge text-center" style={color:'#333',backgroundColor:'#eee'}>
62
- {
63
- if @props.cards.pagination
64
- @props.cards.pagination.total_entries
65
- else
66
- <i className="glyphicon glyphicon-refresh glyphicon-refresh-animate" />
67
- }
68
- </span>
69
- </a>
90
+ <div className="col-sm-4">
91
+ <a href="javascript:void(0)" className="center-block text-center">
92
+ <span className="badge">
93
+ {
94
+ if @props.cards.pagination
95
+ @props.cards.pagination.total_entries
96
+ else
97
+ <i className="glyphicon glyphicon-refresh glyphicon-refresh-animate" />
98
+ }
99
+ </span>
100
+ </a>
70
101
  </div>
71
- <div className="col-sm-4" style={{padding:"0px"}}>
102
+ <div className="col-sm-4">
72
103
  {
73
104
  if @props.cards.query.order == 'random'
74
105
  <ul className="nav nav-pills pull-right">
75
106
  <li>
76
107
  {
77
108
  if @props.cards.pagination
78
- <a onClick={helpers.reload} href={"#/?" + @randomParam()} style={{padding:'6px 12px'}}>
109
+ <a onClick={helpers.reload} href={"#/?" + @randomParam()}>
79
110
  <i className="glyphicon glyphicon-refresh" />
80
111
  </a>
81
112
  else
82
- <a href="javascript:void(0)" style={{padding:'6px 12px'}}>
113
+ <a href="javascript:void(0)">
83
114
  <i className="glyphicon glyphicon-refresh glyphicon-refresh-animate" />
84
115
  </a>
85
116
  }
@@ -92,9 +123,15 @@ module.exports = React.createClass
92
123
  </div>
93
124
  else
94
125
  <div className="row">
95
- <div className="col-sm-12" style={{padding:"0px"}}>
126
+ <div className="col-sm-12">
96
127
  <ul className="nav nav-pills">
97
- <li><a href={"#/" + @props.card.get('title')} style={padding:'6px 12px',fontWeight:'bold'}>{@props.card.get('title')}</a></li>
128
+ <li>
129
+ <a href={"#/" + @props.card.get('title')}>
130
+ <strong>
131
+ {@props.card.get('title')}
132
+ </strong>
133
+ </a>
134
+ </li>
98
135
  </ul>
99
136
  </div>
100
137
  </div>
@@ -103,7 +140,7 @@ module.exports = React.createClass
103
140
  {
104
141
  if !@props.card && helpers.isMobile()
105
142
  <div className="row">
106
- <div className="col-sm-12" style={{padding:"0px"}}>
143
+ <div className="col-sm-12">
107
144
  <Pagination cards={@props.cards} />
108
145
  </div>
109
146
  </div>
@@ -9,9 +9,9 @@ module.exports = React.createClass
9
9
  <div className='row'>
10
10
  {
11
11
  for i in [1..9]
12
- <div className='col-sm-4' style={padding:'5px'} onMouseOver={@onMouseOver} onMouseLeave={@onMouseLeave}>
13
- <div className='list-group'style={margin:'0px',padding:'0px'}>
14
- <div className='list-group-item' style={height:'200px'}>
12
+ <div key={i} className='col-sm-4'>
13
+ <div className='list-group'>
14
+ <div className='list-group-item'>
15
15
  {@props.children}
16
16
  </div>
17
17
  </div>
@@ -13,8 +13,8 @@ module.exports = React.createClass
13
13
  $.param(query)
14
14
 
15
15
  render: ->
16
- <ul className="nav nav-pills pull-right">
17
- <li>
16
+ <ul className="nav nav-pills pull-right carte-pagination">
17
+ <li className="carte-pagination-prev">
18
18
  {
19
19
  if @props.cards.pagination
20
20
  if @props.cards.pagination.current_page > 1
@@ -23,24 +23,24 @@ module.exports = React.createClass
23
23
  href = "#/?" + @pageParam(@props.cards.pagination.total_pages)
24
24
  else
25
25
  href = "javascript:void(0)"
26
- <a href={href} aria-label="Previous" style={{padding:'6px 12px'}}>
26
+ <a href={href} aria-label="Previous">
27
27
  <span aria-hidden="true">&laquo;</span>
28
28
  </a>
29
29
  }
30
30
  </li>
31
- <li style={width:'7.5em',textAlign:'center'}>
31
+ <li className="carte-pagination-curr">
32
32
  {
33
33
  if @props.cards.pagination
34
- <a href={"#/?" + @pageParam(@props.cards.pagination.current_page)} onClick={helpers.reload} style={{padding:'6px 12px'}}>
34
+ <a href={"#/?" + @pageParam(@props.cards.pagination.current_page)} onClick={helpers.reload}>
35
35
  {@props.cards.pagination.current_page} / {@props.cards.pagination.total_pages}
36
36
  </a>
37
37
  else
38
- <a href="javascript:void(0)" style={{padding:'6px 12px'}}>
38
+ <a href="javascript:void(0)">
39
39
  <i className="glyphicon glyphicon-refresh glyphicon-refresh-animate" />
40
40
  </a>
41
41
  }
42
42
  </li>
43
- <li>
43
+ <li className="carte-pagination-next">
44
44
  {
45
45
  if @props.cards.pagination
46
46
  if @props.cards.pagination.current_page < @props.cards.pagination.total_pages
@@ -49,7 +49,7 @@ module.exports = React.createClass
49
49
  href = "#/?" + @pageParam(1)
50
50
  else
51
51
  href = "javascript:void(0)"
52
- <a href={href} aria-label="Next" style={{padding:'6px 12px'}}>
52
+ <a href={href} aria-label="Next">
53
53
  <span aria-hidden="true">&raquo;</span>
54
54
  </a>
55
55
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "carte-client",
3
3
  "description": "something like dictionary, wiki, or information card",
4
- "version": "0.0.26",
4
+ "version": "0.0.27",
5
5
  "main": "lib/carte.coffee",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -22,6 +22,7 @@
22
22
  "bootstrap": "^3.3.4",
23
23
  "browserify": "^9.0.8",
24
24
  "browserify-css": "^0.6.1",
25
+ "classnames": "^2.1.1",
25
26
  "coffee-reactify": "^3.0.0",
26
27
  "coffee-script": "^1.9.2",
27
28
  "coffeeify": "^1.0.0",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carte-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.26
4
+ version: 0.0.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - tily
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-10 00:00:00.000000000 Z
11
+ date: 2015-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: httparty
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -220,20 +234,6 @@ dependencies:
220
234
  - - '>='
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0'
223
- - !ruby/object:Gem::Dependency
224
- name: rspec
225
- requirement: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - '>='
228
- - !ruby/object:Gem::Version
229
- version: '0'
230
- type: :runtime
231
- prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - '>='
235
- - !ruby/object:Gem::Version
236
- version: '0'
237
237
  description: something like dictionary, wiki, or information card
238
238
  email:
239
239
  - tidnlyam@gmail.com
@@ -266,6 +266,7 @@ files:
266
266
  - lib/carte/client/models/card.coffee
267
267
  - lib/carte/client/models/cards.coffee
268
268
  - lib/carte/client/router.coffee
269
+ - lib/carte/client/tasks.coffee
269
270
  - lib/carte/client/views/app.cjsx
270
271
  - lib/carte/client/views/card.cjsx
271
272
  - lib/carte/client/views/cards.cjsx