helios 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +50 -21
  3. data/README.md +27 -2
  4. data/helios.gemspec +10 -6
  5. data/lib/helios.rb +10 -4
  6. data/lib/helios/backend.rb +29 -22
  7. data/lib/helios/backend/data.rb +10 -5
  8. data/lib/helios/backend/in-app-purchase.rb +4 -2
  9. data/lib/helios/backend/newsstand.rb +97 -0
  10. data/lib/helios/backend/passbook.rb +8 -2
  11. data/lib/helios/backend/push-notification.rb +25 -12
  12. data/lib/helios/commands/console.rb +4 -10
  13. data/lib/helios/commands/new.rb +0 -1
  14. data/lib/helios/commands/server.rb +4 -1
  15. data/lib/helios/frontend.rb +6 -14
  16. data/lib/helios/frontend/images/helios.svg +33 -0
  17. data/lib/helios/frontend/javascripts/helios.coffee +39 -3
  18. data/lib/helios/frontend/javascripts/helios/collections.coffee +10 -2
  19. data/lib/helios/frontend/javascripts/helios/models.coffee +4 -1
  20. data/lib/helios/frontend/javascripts/helios/router.coffee +13 -1
  21. data/lib/helios/frontend/javascripts/helios/views.coffee +82 -8
  22. data/lib/helios/frontend/javascripts/vendor/jquery/jquery.fileupload-ui.js +807 -0
  23. data/lib/helios/frontend/javascripts/vendor/jquery/jquery.fileupload.js +1201 -0
  24. data/lib/helios/frontend/javascripts/vendor/jquery/jquery.ui.widget.js +530 -0
  25. data/lib/helios/frontend/javascripts/vendor/linkheaders.js +117 -0
  26. data/lib/helios/frontend/stylesheets/_iphone.sass +1 -1
  27. data/lib/helios/frontend/stylesheets/screen.sass +2 -6
  28. data/lib/helios/frontend/templates/{entities.jst.tpl → data/entities.jst.tpl} +0 -0
  29. data/lib/helios/frontend/templates/{receipts.jst.tpl → in-app-purchase/receipts.jst.tpl} +0 -0
  30. data/lib/helios/frontend/templates/navigation.jst.tpl +31 -0
  31. data/lib/helios/frontend/templates/newsstand/issues.jst.tpl +16 -0
  32. data/lib/helios/frontend/templates/newsstand/new.jst.tpl +28 -0
  33. data/lib/helios/frontend/templates/{passes.jst.tpl → passbook/passes.jst.tpl} +0 -0
  34. data/lib/helios/frontend/templates/{compose.jst.tpl → push-notification/compose.jst.tpl} +0 -0
  35. data/lib/helios/frontend/templates/{devices.jst.tpl → push-notification/devices.jst.tpl} +0 -0
  36. data/lib/helios/frontend/views/index.haml +4 -28
  37. data/lib/helios/templates/.env.erb +1 -0
  38. data/lib/helios/templates/.gitignore +3 -0
  39. data/lib/helios/version.rb +1 -1
  40. metadata +86 -20
  41. data/lib/helios/frontend/stylesheets/_bariol.scss +0 -41
@@ -1,19 +1,25 @@
1
1
  require 'rack/passbook'
2
+
3
+ require 'sinatra/base'
2
4
  require 'sinatra/param'
3
5
 
4
6
  class Helios::Backend::Passbook < Sinatra::Base
5
7
  helpers Sinatra::Param
6
8
 
7
- def initialize(app, options = {})
9
+ def initialize(app, options = {}, &block)
8
10
  super(Rack::Passbook.new)
9
11
  end
10
12
 
13
+ before do
14
+ content_type :json
15
+ end
16
+
11
17
  get '/passes' do
12
18
  param :q, String
13
19
 
14
20
  passes = Rack::Passbook::Pass.dataset
15
21
  passes = passes.filter("tsv @@ to_tsquery('english', ?)", "#{params[:q]}:*") if params[:q] and not params[:q].empty?
16
-
22
+
17
23
  if params[:page] or params[:per_page]
18
24
  param :page, Integer, default: 1, min: 1
19
25
  param :per_page, Integer, default: 100, in: (1..100)
@@ -1,11 +1,23 @@
1
1
  require 'rack/push-notification'
2
+
3
+ require 'sinatra/base'
2
4
  require 'sinatra/param'
3
5
 
6
+ require 'houston'
7
+
4
8
  class Helios::Backend::PushNotification < Sinatra::Base
5
- helpers Sinatra::Param
9
+ helpers Sinatra::Param
10
+ attr_reader :apn_certificate, :apn_environment
6
11
 
7
- def initialize(app, options = {})
12
+ def initialize(app, options = {}, &block)
8
13
  super(Rack::PushNotification.new)
14
+
15
+ @apn_certificate = options[:apn_certificate] || ENV['APN_CERTIFICATE']
16
+ @apn_environment = options[:apn_environment] || ENV['APN_ENVIRONMENT']
17
+ end
18
+
19
+ before do
20
+ content_type :json
9
21
  end
10
22
 
11
23
  get '/devices/?' do
@@ -79,16 +91,17 @@ class Helios::Backend::PushNotification < Sinatra::Base
79
91
 
80
92
  def client
81
93
  begin
82
- return nil unless settings.apn_certificate and ::File.exist?(settings.apn_certificate)
83
-
84
- client = case settings.apn_environment.to_sym
85
- when :development
86
- Houston::Client.development
87
- when :production
88
- Houston::Client.production
89
- end
90
- client.certificate = ::File.read(settings.apn_certificate)
91
-
94
+ return nil unless apn_certificate and ::File.exist?(apn_certificate)
95
+
96
+ client = case apn_environment.to_sym
97
+ when :development
98
+ Houston::Client.development
99
+ when :production
100
+ Houston::Client.production
101
+ end
102
+
103
+ client.certificate = ::File.read(apn_certificate)
104
+
92
105
  return client
93
106
  rescue
94
107
  return nil
@@ -6,19 +6,13 @@ command :console do |c|
6
6
  require 'irb'
7
7
  require 'dotenv'
8
8
  require 'sequel'
9
-
10
- @env = {}
11
- @env.update Dotenv::Environment.new(".env")
12
-
13
- Sequel.connect(@env['DATABASE_URL'])
14
-
15
- require 'rack/core-data'
16
- require 'rack/push-notification'
17
- require 'rack/in-app-purchase'
18
- require 'rack/passbook'
9
+ require 'helios'
19
10
 
20
11
  include Rack
21
12
 
13
+ Dotenv.load
14
+ Sequel.connect(ENV['DATABASE_URL'])
15
+
22
16
  ARGV.clear
23
17
  IRB.start
24
18
  end
@@ -31,7 +31,6 @@ command :new do |c|
31
31
 
32
32
  begin
33
33
  FileUtils.mkdir_p(path) and Dir.chdir(path)
34
- log "create", ""
35
34
 
36
35
  Dir.glob(File.join(File.dirname(__FILE__), "../templates/") + "*.erb", File::FNM_DOTMATCH).each do |template|
37
36
  file = File.basename(template, ".erb")
@@ -28,6 +28,10 @@ def validate_database_settings!
28
28
 
29
29
  say_error "DATABASE_URL environment variable not set in .env or in Rails config/database.yml" and abort if ENV['DATABASE_URL'].nil?
30
30
 
31
+ uri = URI(ENV['DATABASE_URL'])
32
+
33
+ say_error "DATABASE_URL environment variable not set to PostgreSQL database" and abort unless ["postgres", "postgresql"].include?(uri.scheme)
34
+
31
35
  begin
32
36
  db = Sequel.connect(ENV['DATABASE_URL'])
33
37
  db.test_connection
@@ -36,7 +40,6 @@ def validate_database_settings!
36
40
  case error.message
37
41
  when /database "(.+)" does not exist/
38
42
  if agree "Would you like to create this database now? (y/n)"
39
- uri = URI(db.uri)
40
43
  host, database = uri.host, uri.path.delete("/")
41
44
 
42
45
  log 'createdb', database
@@ -26,6 +26,9 @@ module Helios
26
26
 
27
27
  js :application, '/javascripts/application.js', [
28
28
  'javascripts/vendor/jquery.js',
29
+ 'javascripts/vendor/jquery/jquery.ui.widget.js',
30
+ 'javascripts/vendor/jquery/jquery.fileupload.js',
31
+ 'javascripts/vendor/jquery/jquery.fileupload-ui.js',
29
32
  'javascripts/vendor/underscore.js',
30
33
  'javascripts/vendor/backbone.js',
31
34
  'javascripts/vendor/backbone.paginator.js',
@@ -35,8 +38,8 @@ module Helios
35
38
  'javascripts/vendor/foundation.js',
36
39
  'javascripts/vendor/foundation/foundation.dropdown.js',
37
40
  'javascripts/vendor/foundation/foundation.reveal.js',
38
- 'javascripts/vendor/foundation/*',
39
41
  'javascripts/vendor/date.js',
42
+ 'javascripts/vendor/linkheaders.js',
40
43
  'javascripts/helios.js',
41
44
  'javascripts/helios/models.js',
42
45
  'javascripts/helios/collections.js',
@@ -50,25 +53,14 @@ module Helios
50
53
  ]
51
54
  end
52
55
 
53
- set :views, settings.root + '/templates'
54
- serve_jst '/javascripts/helios/templates.js'
56
+ serve_jst '/javascripts/helios/templates.js', root: settings.root + '/templates'
55
57
 
56
58
  get '' do
57
59
  redirect request.fullpath + "/"
58
60
  end
59
61
 
60
62
  get '/' do
61
- haml :'../views/index'
62
- end
63
- end
64
- end
65
-
66
- module Sinatra
67
- module AssetPack
68
- class Package
69
- def production_path
70
- add_cache_buster(@path, *files).gsub(/^\//, "")
71
- end
63
+ haml :index
72
64
  end
73
65
  end
74
66
  end
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="200px" height="100px" viewBox="0 0 200 100" enable-background="new 0 0 200 100" xml:space="preserve">
6
+ <g>
7
+ <path fill="#BFBC3D" d="M11.75,44.979c1.637-2.497,5.251-5.166,11.019-5.166c11.708,0,14.463,7.49,14.463,14.982v21.518
8
+ c0,2.587-2.065,4.477-4.647,4.477c-2.757,0-4.649-1.89-4.649-4.477V56.515c0-4.908-1.98-8.265-7.575-8.265
9
+ c-6.458,0-8.61,3.788-8.61,8.869v19.193c0,2.587-1.98,4.477-4.647,4.477c-2.669,0-4.65-1.89-4.65-4.477V23.457
10
+ c0-2.582,2.065-4.649,4.65-4.649c2.582,0,4.647,2.068,4.647,4.649V44.979z"/>
11
+ <path fill="#BFBC3D" d="M62.28,39.813c14.548,0,17.216,11.192,17.216,17.13c0,3.186,0,6.889-5.251,6.889H52.98
12
+ c0,6.196,4.392,9.041,10.074,9.041c3.788,0,6.455-1.296,8.522-2.67c0.945-0.604,1.635-0.949,2.755-0.949
13
+ c2.239,0,4.046,1.808,4.046,4.048c0,1.379-0.689,2.494-1.464,3.186c-1.464,1.379-6.026,4.735-13.859,4.735
14
+ c-11.967,0-19.372-6.459-19.372-20.835C43.683,47.217,50.571,39.813,62.28,39.813z M53.238,56.086h17.048
15
+ c0-4.221-2.412-8.352-8.006-8.352C57.286,47.734,53.669,50.574,53.238,56.086z"/>
16
+ <path fill="#BFBC3D" d="M95.676,23.457v47.175c0,1.033,1.033,1.55,1.637,1.55c2.409,0,4.304,1.895,4.304,4.306
17
+ c0,2.412-1.895,4.302-4.304,4.302c-6.715,0-10.934-3.785-10.934-11.019V23.457c0-2.582,2.066-4.649,4.647-4.649
18
+ C93.611,18.807,95.676,20.875,95.676,23.457z"/>
19
+ <path fill="#BFBC3D" d="M106.433,30.257c0-3.96,1.982-5.683,5.51-5.683c3.615,0,5.598,1.722,5.598,5.683
20
+ c0,3.356-1.982,5.424-5.598,5.424C108.415,35.682,106.433,33.614,106.433,30.257z M116.595,76.142c0,2.582-2.07,4.647-4.652,4.647
21
+ s-4.647-2.065-4.647-4.647V44.979c0-2.584,2.065-4.65,4.647-4.65s4.652,2.065,4.652,4.65V76.142z"/>
22
+ <path fill="#BFBC3D" d="M142.248,81.223c-11.623,0-18.857-6.63-18.857-20.664c0-14.116,7.234-20.746,18.857-20.746
23
+ c11.618,0,18.853,6.63,18.853,20.746C161.101,74.593,153.866,81.223,142.248,81.223z M142.248,47.734
24
+ c-6.201,0-9.471,4.304-9.471,12.825c0,8.437,3.27,12.743,9.471,12.743c6.196,0,9.47-4.307,9.47-12.743
25
+ C151.718,52.038,148.444,47.734,142.248,47.734z"/>
26
+ <path fill="#BFBC3D" d="M176.675,51.176c0,6.372,21.177,3.444,21.177,17.649c0,8.091-6.884,12.223-15.754,12.223
27
+ c-7.4,0-13.085-3.356-15.233-6.026c-0.692-0.857-1.038-1.632-1.038-2.665c0-2.24,1.896-4.136,4.136-4.136
28
+ c0.857,0,1.72,0.259,2.67,1.033c2.323,1.895,5.164,3.531,9.466,3.531c3.877,0,6.371-1.032,6.371-3.443
29
+ c0-6.977-21.089-3.357-21.089-17.993c0-7.748,6.455-11.536,14.376-11.536c6.109,0,11.536,2.324,13.947,5.336
30
+ c0.517,0.689,0.857,1.293,0.857,2.584c0,2.238-1.891,4.131-4.131,4.131c-1.203,0-1.979-0.517-2.928-1.206
31
+ c-1.896-1.376-4.219-2.755-7.746-2.755C178.57,47.904,176.675,49.025,176.675,51.176z"/>
32
+ </g>
33
+ </svg>
@@ -8,6 +8,7 @@ window.Helios = {
8
8
 
9
9
  initialize: ->
10
10
  window.app = new Helios.Routers.Root
11
+
11
12
  for entity in Helios.entities.models
12
13
  do (entity) ->
13
14
  name = entity.get('name').toLowerCase()
@@ -16,7 +17,7 @@ window.Helios = {
16
17
  window.app.route entity.url(), name
17
18
 
18
19
  window.app.views.entities = new Helios.Views.Entities({collection: Helios.entities})
19
- window.app.views.entities.render()
20
+ window.app.views.entities.render() if Helios.services['data']
20
21
 
21
22
  Backbone.history.start({
22
23
  root: window.location.pathname,
@@ -26,11 +27,46 @@ window.Helios = {
26
27
  }
27
28
 
28
29
  $ ->
30
+ $.fn.serializeMultipart = ->
31
+ obj = $(this)
32
+
33
+ formData = new FormData()
34
+ $.each $(obj).find("input[type='file']"), (i, tag) ->
35
+ $.each $(tag)[0].files, (j, file) ->
36
+ formData.append tag.name, file
37
+
38
+ params = $(obj).serializeArray()
39
+ $.each params, (i, val) ->
40
+ formData.append val.name, val.value
41
+
42
+ formData
43
+
29
44
  $(document).foundation()
30
45
  $('body').delegate 'a[href^=#]', 'click', (event) ->
31
46
  event.preventDefault()
32
47
  href = $(this).attr('href')
33
48
  window.app.navigate(href, {trigger: true, replace: true})
34
49
 
35
- Helios.entities = new Helios.Collections.Entities
36
- Helios.entities.fetch(type: 'OPTIONS', success: Helios.initialize, error: Helios.initialize)
50
+ Helios.services = {}
51
+ $.ajax(type: 'OPTIONS', url: "/", success: (data, status, xhr) ->
52
+ header = xhr.getResponseHeader("Link")
53
+ $.linkheaders(header).each (idx, link) ->
54
+ href = link.attr('href')
55
+ rel = link.rels()[0]
56
+
57
+ switch rel
58
+ when "Helios::Backend::Data"
59
+ Helios.services['data'] = href
60
+ when "Helios::Backend::InAppPurchase"
61
+ Helios.services['in-app-purchase'] = href
62
+ when "Helios::Backend::Newsstand"
63
+ Helios.services['newsstand'] = href
64
+ when "Helios::Backend::PushNotification"
65
+ Helios.services['push-notification'] = href
66
+ when "Helios::Backend::Passbook"
67
+ Helios.services['passbook'] = href
68
+
69
+ Helios.entities = new Helios.Collections.Entities
70
+ Helios.entities.fetch(type: 'OPTIONS', url: (Helios.services['data'] || "") + '/resources', success: Helios.initialize, error: Helios.initialize)
71
+ )
72
+
@@ -70,7 +70,7 @@ class Helios.Collections.Devices extends Helios.Collection
70
70
 
71
71
  class Helios.Collections.Receipts extends Helios.Collection
72
72
  model: Helios.Models.Receipt
73
- url: '/receipts'
73
+
74
74
  fields: ['transaction_id', 'product_id', 'purchase_date', 'original_transaction_id', 'original_purchase_date', 'app_item_id', 'version_external_identifier', 'bid', 'bvrs', 'ip_address']
75
75
 
76
76
  paginator_core:
@@ -78,7 +78,6 @@ class Helios.Collections.Receipts extends Helios.Collection
78
78
  dataType: 'json'
79
79
  url: '/receipts?'
80
80
 
81
-
82
81
  class Helios.Collections.Passes extends Helios.Collection
83
82
  model: Helios.Models.Pass
84
83
  url: '/passes'
@@ -89,3 +88,12 @@ class Helios.Collections.Passes extends Helios.Collection
89
88
  dataType: 'json'
90
89
  url: '/passes?'
91
90
 
91
+ class Helios.Collections.Issues extends Helios.Collection
92
+ model: Helios.Models.Issue
93
+ url: '/issues'
94
+ fields: ['name', 'title', 'summary', 'published_at', 'expires_at']
95
+
96
+ paginator_core:
97
+ type: 'GET'
98
+ dataType: 'json'
99
+ url: '/issues?'
@@ -13,8 +13,11 @@ class Helios.Models.Resource extends Backbone.Model
13
13
 
14
14
  class Helios.Models.Device extends Backbone.Model
15
15
  idAttribute: "token"
16
-
16
+
17
17
  class Helios.Models.Receipt extends Backbone.Model
18
18
  idAttribute: "transaction_id"
19
19
 
20
20
  class Helios.Models.Pass extends Backbone.Model
21
+
22
+ class Helios.Models.Issue extends Backbone.Model
23
+ idAttribute: "name"
@@ -4,6 +4,10 @@ class Helios.Routers.Root extends Backbone.Router
4
4
 
5
5
  initialize: (options) ->
6
6
  @views = {}
7
+
8
+ @views.navigation = new Helios.Views.Navigation
9
+ @views.navigation.render()
10
+
7
11
  super
8
12
 
9
13
  routes:
@@ -12,6 +16,7 @@ class Helios.Routers.Root extends Backbone.Router
12
16
  'push-notification': 'push_notification'
13
17
  'in-app-purchase': 'in_app_purchase'
14
18
  'passbook': 'passbook'
19
+ 'newsstand': 'newsstand'
15
20
 
16
21
  index: ->
17
22
  Helios.entities.fetch(type: 'OPTIONS')
@@ -22,17 +27,24 @@ class Helios.Routers.Root extends Backbone.Router
22
27
 
23
28
  push_notification: ->
24
29
  @devices ?= new Helios.Collections.Devices
30
+ @devices.paginator_core.url = Helios.services['push-notification'] + '/devices'
25
31
  @views.devices ?= new Helios.Views.Devices(collection: @devices)
26
32
  @views.devices.render()
27
33
 
28
34
  in_app_purchase: ->
29
35
  @receipts ?= new Helios.Collections.Receipts
36
+ @receipts.paginator_core.url = Helios.services['in-app-purchase'] + '/receipts'
30
37
  @views.receipts ?= new Helios.Views.Receipts(collection: @receipts)
31
38
  @views.receipts.render()
32
39
 
33
40
  passbook: ->
34
41
  @passes ?= new Helios.Collections.Passes
42
+ @passes.paginator_core.url = Helios.services['passbook'] + '/passes'
35
43
  @views.passes ?= new Helios.Views.Passes(collection: @passes)
36
44
  @views.passes.render()
37
45
 
38
-
46
+ newsstand: ->
47
+ @issues ?= new Helios.Collections.Issues
48
+ @issues.paginator_core.url = Helios.services['newsstand'] + '/issues'
49
+ @views.issues ?= new Helios.Views.Issues(collection: @issues)
50
+ @views.issues.render()
@@ -1,5 +1,12 @@
1
+ class Helios.Views.Navigation extends Backbone.View
2
+ template: JST['navigation']
3
+ el: "[role='navigation']"
4
+
5
+ render: =>
6
+ @$el.html(@template())
7
+
1
8
  class Helios.Views.Entities extends Backbone.View
2
- template: JST['entities']
9
+ template: JST['data/entities']
3
10
  el: "[role='main']"
4
11
 
5
12
  events:
@@ -36,7 +43,7 @@ class Helios.Views.Entity extends Backbone.View
36
43
  @
37
44
 
38
45
  class Helios.Views.Devices extends Backbone.View
39
- template: JST['devices']
46
+ template: JST['push-notification/devices']
40
47
  el: "[role='main']"
41
48
 
42
49
  events:
@@ -53,8 +60,8 @@ class Helios.Views.Devices extends Backbone.View
53
60
  render: =>
54
61
  @$el.html(@template())
55
62
 
56
- @composeView ?= new Helios.Views.Compose()
57
- @composeView.render()
63
+ # @composeView ?= new Helios.Views.Compose()
64
+ # @composeView.render()
58
65
  @$el.find("#datagrid").html(@datagrid.el)
59
66
 
60
67
  @
@@ -65,7 +72,7 @@ class Helios.Views.Devices extends Backbone.View
65
72
  @collection.fetch()
66
73
 
67
74
  class Helios.Views.Compose extends Backbone.View
68
- template: JST['compose']
75
+ template: JST['push-notification/compose']
69
76
  el: "#compose-modal"
70
77
 
71
78
  events:
@@ -108,7 +115,8 @@ class Helios.Views.Compose extends Backbone.View
108
115
  if $("input[name='recipients']:checked").val() == "specified"
109
116
  tokens = [$form.find("#tokens").val()]
110
117
 
111
- $.ajax("/message"
118
+ $.ajax(
119
+ url:"/message"
112
120
  type: "POST"
113
121
  dataType: "json"
114
122
  data: {
@@ -181,7 +189,7 @@ class Helios.Views.Compose extends Backbone.View
181
189
  $time.find(".date").text(Date.now().toString("dddd, MMMM d"))
182
190
 
183
191
  class Helios.Views.Receipts extends Backbone.View
184
- template: JST['receipts']
192
+ template: JST['in-app-purchase/receipts']
185
193
  el: "[role='main']"
186
194
 
187
195
  events:
@@ -207,7 +215,7 @@ class Helios.Views.Receipts extends Backbone.View
207
215
  @collection.fetch()
208
216
 
209
217
  class Helios.Views.Passes extends Backbone.View
210
- template: JST['passes']
218
+ template: JST['passbook/passes']
211
219
  el: "[role='main']"
212
220
 
213
221
  events:
@@ -231,3 +239,69 @@ class Helios.Views.Passes extends Backbone.View
231
239
  e.preventDefault()
232
240
  @collection.query = $(e.target).val()
233
241
  @collection.fetch()
242
+
243
+ class Helios.Views.Issues extends Backbone.View
244
+ template: JST['newsstand/issues']
245
+ el: "[role='main']"
246
+
247
+ events:
248
+ 'keyup form.filter input': 'filter'
249
+
250
+ initialize: ->
251
+ @datagrid = new Backbone.Datagrid({
252
+ collection: @collection,
253
+ columns: @collection.fields,
254
+ paginated: true,
255
+ perPage: 20
256
+ })
257
+
258
+ $.ajax(
259
+ url: Helios.services['newsstand'] + "/issues/new",
260
+ type: "HEAD",
261
+ error: ->
262
+ $(".auxiliary button").prop('disabled', true)
263
+ )
264
+
265
+ render: =>
266
+ @$el.html(@template())
267
+ @$el.find("#datagrid").html(@datagrid.el)
268
+
269
+ @newView ?= new Helios.Views.NewIssue()
270
+ @newView.render()
271
+
272
+ @
273
+
274
+ filter: (e) ->
275
+ e.preventDefault()
276
+ @collection.query = $(e.target).val()
277
+ @collection.fetch()
278
+
279
+ class Helios.Views.NewIssue extends Backbone.View
280
+ template: JST['newsstand/new']
281
+ el: "#new-issue-modal"
282
+
283
+ events:
284
+ 'submit form': 'submit'
285
+ 'click button#create': 'submit'
286
+
287
+ render: ->
288
+ @$el.html(@template())
289
+
290
+ @
291
+
292
+ submit: ->
293
+ $form = @$el.find("form#new")
294
+ console.log($form.find("input[type='file']"))
295
+ $.ajax(
296
+ url: $form.attr("action")
297
+ type: "POST"
298
+ dataType: "json"
299
+ data: $form.serializeMultipart()
300
+ cache: false
301
+ contentType: false
302
+ processData: false
303
+ success: (data) ->
304
+ console.log("Success", data)
305
+ error: (data) ->
306
+ console.log("Failure", data)
307
+ )