frontline 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/CHANGELOG.md +0 -0
  2. data/LICENSE +19 -0
  3. data/README.md +92 -0
  4. data/Rakefile +21 -0
  5. data/assets/ansi_up.js +143 -0
  6. data/assets/api.js +533 -0
  7. data/assets/bootstrap/css/bootstrap-responsive.min.css +9 -0
  8. data/assets/bootstrap/css/bootstrap.min.css +9 -0
  9. data/assets/bootstrap/img/glyphicons-halflings-white.png +0 -0
  10. data/assets/bootstrap/img/glyphicons-halflings.png +0 -0
  11. data/assets/bootstrap/js/bootstrap.min.js +6 -0
  12. data/assets/jquery.cookie.js +95 -0
  13. data/assets/jquery.js +6 -0
  14. data/assets/noty/jquery.noty.js +520 -0
  15. data/assets/noty/layouts/top.js +34 -0
  16. data/assets/noty/layouts/topRight.js +43 -0
  17. data/assets/noty/promise.js +432 -0
  18. data/assets/noty/themes/default.js +156 -0
  19. data/assets/select2-bootstrap.css +86 -0
  20. data/assets/select2/select2-spinner.gif +0 -0
  21. data/assets/select2/select2.css +615 -0
  22. data/assets/select2/select2.min.js +22 -0
  23. data/assets/select2/select2.png +0 -0
  24. data/assets/select2/select2x2.png +0 -0
  25. data/assets/typeahead.js-bootstrap.css +49 -0
  26. data/assets/typeahead.min.js +7 -0
  27. data/assets/ui.css +28 -0
  28. data/assets/xhr.js +19 -0
  29. data/bin/frontline +19 -0
  30. data/frontline.gemspec +31 -0
  31. data/images/0.png +0 -0
  32. data/lib/frontline.rb +23 -0
  33. data/lib/frontline/actions.rb +15 -0
  34. data/lib/frontline/app.rb +86 -0
  35. data/lib/frontline/controllers/controllers.rb +71 -0
  36. data/lib/frontline/controllers/index.rb +167 -0
  37. data/lib/frontline/controllers/models.rb +104 -0
  38. data/lib/frontline/controllers/sources.rb +11 -0
  39. data/lib/frontline/frontline.rb +11 -0
  40. data/lib/frontline/helpers.rb +179 -0
  41. data/lib/frontline/inflect.rb +183 -0
  42. data/lib/frontline/templates/controllers/controller.slim +27 -0
  43. data/lib/frontline/templates/controllers/index.slim +56 -0
  44. data/lib/frontline/templates/controllers/route.slim +17 -0
  45. data/lib/frontline/templates/controllers/route_editor.slim +45 -0
  46. data/lib/frontline/templates/controllers/route_layout.slim +88 -0
  47. data/lib/frontline/templates/editor.slim +17 -0
  48. data/lib/frontline/templates/error.slim +36 -0
  49. data/lib/frontline/templates/index/applications.slim +123 -0
  50. data/lib/frontline/templates/layout.slim +182 -0
  51. data/lib/frontline/templates/models/index.slim +31 -0
  52. data/lib/frontline/templates/models/migration.slim +46 -0
  53. data/lib/frontline/templates/models/migration_layout.slim +159 -0
  54. data/lib/frontline/templates/models/model.slim +34 -0
  55. metadata +245 -0
@@ -0,0 +1,27 @@
1
+ == js_tag src: route(:assets, :xhr), suffix: Frontline::ASSETS_SUFFIX
2
+
3
+ - if (result = controllers).is_a?(Hash)
4
+ .tabbable.tabs-left
5
+ ul.nav.nav-tabs#controllersNav
6
+ - result.each_value do |c|
7
+ li class=('active' if params[:name] == c[:name])
8
+ - onclick = "history.pushState(null, null, '%s');" % route(name: c[:name])
9
+ - url = route(:route_layout, c[:name])
10
+ a href=("#" << c[:dom_id]) data-toggle="tab" data-url=url onclick=onclick
11
+ i.icon-cog
12
+ | &nbsp;
13
+ = c[:name]
14
+
15
+ .tab-content
16
+ - result.each_value do |c|
17
+ - active = params[:name] == c[:name]
18
+ .tab-pane class=('active' if active) id=c[:dom_id]
19
+ == render_p(:route_layout, controller: c) if active
20
+
21
+ javascript:
22
+ $(function() {
23
+ Frontline.ajaxifyTabs('#controllersNav');
24
+ });
25
+
26
+ - else
27
+ - styled_halt 500, result.to_s.strip.split("\n")
@@ -0,0 +1,56 @@
1
+ javascript:
2
+ var controllerCrudifier = new Frontline.CRUD('#{route :controller}', '#body');
3
+
4
+ ul.nav.nav-tabs
5
+ li.active
6
+ a href="#controllersTab" data-toggle="tab" Controllers
7
+ li
8
+ a href="#newControllerTab" data-toggle="tab" New Controller
9
+
10
+ .tab-content
11
+ .tab-pane.active#controllersTab
12
+ #body == render_p :controller
13
+
14
+ .tab-pane#newControllerTab
15
+ form.form-inline#newControllerForm
16
+ .input-append
17
+ input.input-xxlarge name="name" type="text" placeholder="Controller names, space separated"
18
+ a.btn href="#" onclick="controllerCrudifier.create('#newControllerForm');"
19
+ i.icon-play
20
+
21
+ hr
22
+ .lead Optional Setups
23
+ .form-horizontal
24
+ .control-group
25
+ label.control-label Engine
26
+ .controls
27
+ select.frontline-selectable name="engine" data-placeholder="inherited"
28
+ option
29
+ - EConstants::VIEW__ENGINE_BY_SYM.each_key do |e|
30
+ option value=e =e
31
+ br
32
+ small.muted selected engine will be added to Gemfile
33
+
34
+ .control-group
35
+ label.control-label Map
36
+ .controls
37
+ input name="route" type="text" placeholder="none"
38
+ br
39
+ small.muted
40
+ a href="http://espresso.github.io/Routing.html" target="_blank"
41
+ | espresso.github.io/Routing.html
42
+
43
+ .control-group
44
+ label.control-label Format
45
+ .controls
46
+ input name="format" type="text" placeholder="none"
47
+ br
48
+ small
49
+ a href="http://espresso.github.io/Routing.html#format" target="_blank"
50
+ | espresso.github.io/Routing.html#format
51
+
52
+ #routeEditorModal.modal.hide.fade.routeEditorModal
53
+ .modal-header
54
+ button.close type="button" data-dismiss="modal" aria-hidden="true" &times;
55
+ b#routeEditorModalHeader
56
+ .modal-body#routeEditorModalBody
@@ -0,0 +1,17 @@
1
+ - if controller = controllers[controller]
2
+ == js_tag src: route(:assets, :xhr), suffix: Frontline::ASSETS_SUFFIX
3
+
4
+ - crudifier = 'crudifierFor' << controller[:dom_id]
5
+ - route_editor_id = 'routeEditorFor' << controller[:dom_id]
6
+ div id=route_editor_id
7
+
8
+ - controller[:routes].each_value do |route|
9
+ .well.well-small style="display: inline-block; margin: .2em;"
10
+
11
+ - data = [route(:route_editor, controller[:name], route[:name]), route_editor_id]
12
+ - onclick = "Frontline.routeEditor('%s', '#%s');" % data
13
+ a href="#" onclick=onclick
14
+ i.icon-edit
15
+ | &nbsp;
16
+ span style="font-size: 1.2em;"
17
+ = route[:name]
@@ -0,0 +1,45 @@
1
+ == js_tag src: route(:assets, :xhr), suffix: Frontline::ASSETS_SUFFIX
2
+ - route_editor_id = 'routeEditorFor' << @controller[:dom_id]
3
+ - close_editor = "$('#%s').html(null);" % route_editor_id
4
+ - crudifier = 'crudifierFor' << @controller[:dom_id]
5
+
6
+ .form-inline
7
+
8
+ a.btn onclick=close_editor
9
+ i.icon-remove
10
+ | &nbsp;Close Editor
11
+ | &nbsp;
12
+
13
+ - dom_id = 'selectorFor%s_%sPreview' % [@controller[:dom_id], @route[:name]]
14
+ - url = session[:application].last + @route[:route]
15
+ span.input-append
16
+ input.openWindow type="text" id=dom_id data-url=url placeholder="slash-separated arguments"
17
+ a.btn href="#" onclick=("Frontline.openWindow('%s');" % dom_id)
18
+ i.icon-eye-open
19
+ | Preview
20
+
21
+ p
22
+ .tabbable
23
+ ul.nav.nav-tabs
24
+ - @files.each do |(path,name,dom_id,active)|
25
+ li class=('active' if active)
26
+ a href=('#' << dom_id) data-toggle="tab" = name
27
+ li
28
+ - onclick = "%s.delete('%s'); %s" % [crudifier, @route[:name], close_editor]
29
+ a.text-error href="#" onclick=onclick
30
+ i.icon-remove
31
+ | Delete&nbsp;
32
+ b = @route[:name]
33
+ | action
34
+
35
+ .tab-content
36
+ - @files.each do |(path,name,dom_id,active)|
37
+ - editor_id = 'routeEditorFor' << dom_id
38
+ .tab-pane id=dom_id class=('active' if active)
39
+ textarea id=editor_id = File.read(dst_path(:root, path))
40
+
41
+ - onclick = "fileCrudifier.saveFile('%s', '#%s');" % [path, editor_id]
42
+ - save_button = button_tag!(onclick: onclick, class: 'btn btn-success saveButton') { \
43
+ i_tag(class: 'icon-ok') << ' Save' \
44
+ } + '&nbsp;'
45
+ == ace(editor_id, file: name, toolbar_prepend: save_button)
@@ -0,0 +1,88 @@
1
+ == js_tag src: route(:assets, :xhr), suffix: Frontline::ASSETS_SUFFIX
2
+
3
+ - crudifier = 'crudifierFor' + controller[:dom_id]
4
+ - navmap = [:new, :existing].inject({}) do |m,t| \
5
+ m.merge t => '%sActionsTabFor%s' % [t, controller[:name]] \
6
+ end
7
+
8
+ javascript:
9
+ var #{crudifier} = new Frontline.CRUD(
10
+ '#{route(:route, controller[:name])}', '#routesFor#{controller[:dom_id]}'
11
+ );
12
+
13
+ ul.nav.nav-pills
14
+ li.active
15
+ a href=("#" << navmap[:existing]) data-toggle="tab"
16
+ = controller[:name]
17
+ | &nbsp; Actions
18
+ li
19
+ a href=("#" << navmap[:new]) data-toggle="tab" New Actions
20
+ li.dropdown
21
+ a.dropdown-toggle data-toggle="dropdown" href="#"
22
+ | Maintenance&nbsp;
23
+ b class="caret"
24
+ ul.dropdown-menu
25
+ li
26
+ - onclick = "fileCrudifier.toggleEditor('%s');" % controller[:file]
27
+ a href="#" onclick=onclick
28
+ i.icon-edit
29
+ | &nbsp;Edit Controller
30
+
31
+ - if helper_file = controller[:helper_file]
32
+ li
33
+ - onclick = "fileCrudifier.toggleEditor('%s'); return false;" % helper_file
34
+ a href="#" onclick=onclick
35
+ i.icon-edit
36
+ | &nbsp;Edit Helpers
37
+
38
+ - if controller[:routes].any?
39
+ li.divider
40
+ li
41
+ - onclick = "Frontline.runSpecs('%s', '%s');" % [route(:run_specs), controller[:name]]
42
+ a href="#" onclick=onclick
43
+ i.icon-play
44
+ span Run Specs
45
+
46
+ li.divider
47
+ li
48
+ - confirm = 'You are about to delete an entire Controller! This action can not be undone! Continue?'
49
+ - onclick = "controllerCrudifier.delete('%s', '%s');" % [controller[:name], confirm]
50
+ a.text-error href="#" onclick=onclick
51
+ i.icon-remove
52
+ | &nbsp;Delete
53
+
54
+ .tab-content
55
+ .tab-pane.active id=navmap[:existing]
56
+ div id=("routesFor%s" % controller[:dom_id])
57
+ == render_p(:route, controller: controller[:name])
58
+
59
+ .tab-pane id=navmap[:new]
60
+ - form_id = 'newRoutesFor%sForm' % controller[:dom_id]
61
+ form.form-inline id=form_id
62
+ .input-append
63
+ input.input-xlarge name="name" type="text" placeholder="Action name(s), space separated"
64
+ - onclick = "%s.create('#%s');" % [crudifier, form_id]
65
+ a.btn type="button" onclick=onclick
66
+ i.icon-play
67
+
68
+ hr
69
+ .lead Optional Setups
70
+ .form-horizontal
71
+ .control-group
72
+ label.control-label Engine
73
+ .controls
74
+ select.frontline-selectable name="engine" data-placeholder="inherited"
75
+ option
76
+ - EConstants::VIEW__ENGINE_BY_SYM.each_key do |e|
77
+ option value=e =e
78
+ br
79
+ small.muted selected engine will be added to Gemfile
80
+
81
+ .control-group
82
+ label.control-label Format
83
+ .controls
84
+ input name="format" type="text" placeholder="none"
85
+ br
86
+ small
87
+ a href="http://espresso.github.io/Routing.html#format" target="_blank"
88
+ | espresso.github.io/Routing.html#format
@@ -0,0 +1,17 @@
1
+ #editorModal.modal.hide.fade.FrontlineModal
2
+
3
+ .modal-header
4
+ button.close type="button" data-dismiss="modal" &times;
5
+
6
+ b = unrootify(@file)
7
+
8
+ .modal-body
9
+ textarea#editor = File.read(@file)
10
+ - onclick = "fileCrudifier.saveFile('%s');" % params[:path]
11
+ - save_button = button_tag!(onclick: onclick, class: 'btn btn-success saveButton') { \
12
+ i_tag(class: 'icon-ok') << ' Save' \
13
+ } + '&nbsp;'
14
+ == ace(:editor, toolbar_prepend: save_button, file: @file)
15
+
16
+ javascript:
17
+ $('#editorModal').modal();
@@ -0,0 +1,36 @@
1
+ .alert.alert-error
2
+ h4 Something went wrong...
3
+ .text-info
4
+ | Please consider to report this at &nbsp;
5
+ a href="https://github.com/espresso/frontline/issues" github.com/espresso/frontline
6
+ h5 = error.first
7
+
8
+ h4.text-info Backtrace:
9
+ - error.each do |l|
10
+ div = l
11
+
12
+ h4.text-info Path:
13
+ = rq.path
14
+
15
+ h4.text-info Request Method:
16
+ = rq.request_method
17
+
18
+ h4.text-info Params:
19
+ table
20
+ - params.each_pair do |key,val|
21
+ tr
22
+ td
23
+ .pull-right.text-info
24
+ = '%s: ' % key
25
+ td
26
+ = val.is_a?(String) ? val : val.inspect
27
+
28
+ h4.text-info Env:
29
+ table
30
+ - env.each_pair do |key,val|
31
+ tr
32
+ td
33
+ .pull-right.text-info
34
+ = '%s: ' % key
35
+ td
36
+ = val.is_a?(String) ? val : val.inspect
@@ -0,0 +1,123 @@
1
+ javascript:
2
+ $(function() {
3
+ applicationCrudifier = new Frontline.ApplicationCRUD('#{route(:application)}');
4
+ $('#dbType').typeahead({local: ["MySQL","PostgreSQL","SQLite"]});
5
+ });
6
+
7
+ - content_for :existing_applications do
8
+ - applications.each do |(name,path,url)|
9
+ .well.well-small
10
+ - onclick = "applicationCrudifier.removeFromList('%s');" % name
11
+ a.frontline-tooltip href="#" onclick=onclick data-toggle="tooltip" title="Remove from list"
12
+ i.icon-minus
13
+ | &nbsp;
14
+ b
15
+ a href=route(:application, name: name) = name
16
+ br
17
+ small.muted = path
18
+
19
+ - content_for :new_applications do
20
+ .text-center
21
+
22
+ input.input-block-level#applicationName type="text" placeholder="name"
23
+ input.input-block-level#applicationPath type="text" placeholder="path"
24
+
25
+ - attrs = {type: :button}
26
+ - attrs[:onclick] = "applicationCrudifier.generate();"
27
+ - attrs[:value] = "Generate a Brand New Application"
28
+ input.btn.btn-success.btn-large.btn-block *attrs
29
+
30
+ - attrs = {type: :button}
31
+ - attrs[:onclick] = "applicationCrudifier.load();"
32
+ - attrs[:value] = "Load Application from given path"
33
+ input.btn.btn-info.btn-large.btn-block *attrs
34
+
35
+ hr
36
+ div style="text-align: left;"
37
+ div
38
+ .lead Optional Setups
39
+ .form-horizontal
40
+ .control-group
41
+ label.control-label Preview URL
42
+ .controls
43
+ input.input-block-level#previewURL type="text" value="http://localhost:5252"
44
+
45
+ form.form-horizontal#applicationSettingsForm
46
+ .control-group
47
+ label.control-label Server
48
+ .controls
49
+ select.frontline-selectable.input-block-level name="server" data-placeholder="Thin"
50
+ option
51
+ - Enginery::KNOWN_WEB_SERVERS.each do |s|
52
+ option value=s =s
53
+
54
+ .control-group
55
+ label.control-label Port
56
+ .controls
57
+ input.input-small type="text" name="port" placeholder="5252"
58
+
59
+
60
+ .control-group
61
+ label.control-label Engine
62
+ .controls
63
+ select.frontline-selectable.input-block-level name="engine" data-placeholder="ERB"
64
+ option
65
+ - EConstants::VIEW__ENGINE_BY_SYM.each_key do |e|
66
+ option value=e =e
67
+
68
+ .control-group
69
+ label.control-label ORM
70
+ .controls
71
+ select.frontline-selectable.input-block-level name="orm" data-placeholder="none"
72
+ option
73
+ - %w[ActiveRecord DataMapper Sequel].each do |orm|
74
+ option value=orm = orm
75
+
76
+ .control-group
77
+ label.control-label Database
78
+ .controls
79
+ .btn-group.dropup
80
+ button.btn.dropdown-toggle data-toggle="dropdown"
81
+ | none&nbsp;
82
+ span.caret
83
+
84
+ ul.dropdown-menu.sticky-dropdown
85
+ li
86
+ input#dbType name="db_type" type="text" placeholder="type"
87
+ - %w[host port name user pass].each do |s|
88
+ li
89
+ input name=("db_" + s) type="text" placeholder=s
90
+
91
+ .control-group
92
+ label.control-label Format
93
+ .controls
94
+ input.input-block-level type="text" name="format" placeholder="none"
95
+ br
96
+ small.muted
97
+ a href="http://espresso.github.io/Routing.html#format" target="_blank"
98
+ | espresso.github.io/Routing.html#format
99
+
100
+ .control-group
101
+ label.control-label Host(s)
102
+ .controls
103
+ input.input-block-level type="text" name="host" placeholder="space separated list of hosts"
104
+ br
105
+ small.muted
106
+ a href="http://espresso.github.io/Routing.html#hosts" target="_blank"
107
+ | espresso.github.io/Routing.html#hosts
108
+
109
+ - if applications.any?
110
+ .row-fluid
111
+ .span3
112
+ .span6
113
+ h4 Applications
114
+ - yield_content :existing_applications
115
+
116
+ .span3
117
+
118
+ .row-fluid
119
+ .span4
120
+ .span4
121
+ h4 Generate/Load Applications
122
+ - yield_content :new_applications
123
+ .span4
@@ -0,0 +1,182 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title = self.class
5
+ meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
6
+ meta name="viewport" content="width=device-width, initial-scale=1.0"
7
+ - assets_mapper route(:assets), suffix: Frontline::ASSETS_SUFFIX do
8
+ == js_tag 'jquery'
9
+ == js_tag 'jquery.cookie'
10
+
11
+ - cd 'bootstrap'
12
+ == js_tag 'js/bootstrap.min'
13
+ == css_tag 'css/bootstrap.min'
14
+ == css_tag 'css/bootstrap-responsive.min'
15
+
16
+ - cd '../select2'
17
+ == js_tag 'select2.min'
18
+ == css_tag 'select2'
19
+
20
+ - cd '../noty'
21
+ == js_tag 'jquery.noty'
22
+ == js_tag 'layouts/top'
23
+ == js_tag 'layouts/topRight'
24
+ == js_tag 'themes/default'
25
+
26
+ - cd '/'
27
+ == js_tag 'ansi_up'
28
+ == js_tag 'typeahead.min'
29
+ == css_tag 'typeahead.js-bootstrap'
30
+ == css_tag 'select2-bootstrap'
31
+ == js_tag 'api'
32
+ == js_tag 'xhr'
33
+ == css_tag 'ui'
34
+
35
+ javascript:
36
+ Frontline = new FrontlineAPI();
37
+ gitDeployer = new Frontline.Git('#{Frontline::Index.route :git}');
38
+ var fileCrudifier = new Frontline.FileCRUD('#{Frontline::Index.route(:file)}');
39
+
40
+ body
41
+ .container-fluid
42
+ .row-fluid
43
+ .span
44
+ - if session[:application]
45
+ .navbar.navbar-fixed-top
46
+ .navbar-inner
47
+ .container
48
+
49
+ a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"
50
+ span.icon-bar
51
+ span.icon-bar
52
+ span.icon-bar
53
+
54
+ .nav-collapse.collapse
55
+ ul.nav
56
+ li.divider-vertical
57
+ li
58
+ a href=Frontline::Index::base_url
59
+ i.icon-list
60
+ | &nbsp;Applications
61
+ li.divider-vertical
62
+
63
+ li.dropdown
64
+ a.dropdown-toggle href="#" data-toggle="dropdown"
65
+ i.icon-wrench
66
+ |&nbsp;
67
+ span.text-info
68
+ = session[:application].first
69
+ |&nbsp;
70
+ b.caret
71
+ ul.dropdown-menu
72
+ - applications.each do |(name,path)|
73
+ li class=('active' if name == session[:application].first)
74
+ a href=Frontline::Index.route(:application, name: name) = name
75
+ li.divider-vertical
76
+
77
+ - [ \
78
+ Frontline::Controllers, \
79
+ Frontline::Models, \
80
+ Frontline::Sources, \
81
+ ].each do |ctrl|
82
+ li class=('active' if rq.script_name =~ /\A#{ctrl.base_url}/)
83
+ a href=ctrl.base_url = ctrl.name.split('::').last
84
+ li.divider-vertical
85
+
86
+ li.dropdown
87
+ a.dropdown-toggle href="#" data-toggle="dropdown"
88
+ | Maintenance&nbsp;
89
+ b.caret
90
+ ul.dropdown-menu
91
+ - maintenance_files.each do |file|
92
+ li
93
+ - onclick = "fileCrudifier.toggleEditor('%s');"
94
+ a href="#" onclick=(onclick % file)
95
+ i.icon-pencil
96
+ | &nbsp;
97
+ = File.basename(file)
98
+
99
+ li.divider
100
+ - %w[install update].each do |task|
101
+ li
102
+ - onclick = "Frontline.runCmd('%s')" % Frontline::Index.route(:bundler, task)
103
+ a href="#" onclick=onclick
104
+ i.icon-play
105
+ | &nbsp;
106
+ = 'bundle %s' % task
107
+
108
+ - if datamapper?
109
+ li.divider
110
+ - %w[auto_migrate auto_upgrade].each do |task|
111
+ li
112
+ - confirm = 'This will run %s for ALL MODELS! Continue?' % task
113
+ - url = Frontline::Models.route(:run_datamapper_task, task)
114
+ - onclick = "Frontline.runCmd('%s', '%s')" % [url, confirm]
115
+ a href="#" onclick=onclick
116
+ i.icon-play
117
+ | &nbsp;
118
+ = task.gsub('_', ' ')
119
+
120
+ li.divider
121
+ li
122
+ - onclick = "Frontline.runSpecs('%s');" % Frontline::Controllers.route(:run_specs)
123
+ a href="#" onclick=onclick
124
+ i.icon-play
125
+ span Run Specs
126
+
127
+ li.divider
128
+ li.dropdown-submenu
129
+ a href="#" Outstanding Migrations
130
+ ul.dropdown-menu
131
+ - %w[up down].each do |vector|
132
+ li
133
+ - onclick = "new Frontline.Migrations('%s').run('%s');"
134
+ a href="#" onclick=(onclick % [Frontline::Models.route(:run_migrations), vector])
135
+ i class=('icon-arrow-%s' % vector)
136
+ span Run #{vector}
137
+
138
+ li.divider-vertical
139
+ li.dropdown.sticky-dropdown
140
+ a.dropdown-toggle href="#" data-toggle="dropdown"
141
+ | &nbsp;Git&nbsp;
142
+ b.caret
143
+ ul.dropdown-menu
144
+
145
+ li
146
+ a href="#" onclick="gitDeployer.push();"
147
+ b git push
148
+
149
+ li.divider
150
+
151
+ li style="margin: 0 1em 0 1em;"
152
+ .text-info git add . && git commit -am
153
+ input#GitCommit type="text" placeholder="type message and press enter"
154
+ li.divider
155
+
156
+ li style="margin: 0 1em 0 1em;"
157
+ .text-info git remote add origin
158
+ input#GitOrigin type="text" placeholder="type URL and press enter"
159
+ li.divider
160
+
161
+ li
162
+ a href="#" onclick="gitDeployer.init();"
163
+ b git init
164
+
165
+ li.divider-vertical
166
+ li.hide#lastOperationToggler
167
+ a href="#" onclick="$('#PTYModal').modal(); return false;" Logs
168
+
169
+ .content
170
+ == yield
171
+
172
+ #editorContainer
173
+ #PTYModal.modal.hide.fade.FrontlineModal
174
+ .modal-header
175
+ button.close type="button" data-dismiss="modal" aria-hidden="true" &times;
176
+ b#PTYModalHeader
177
+ pre.modal-body#PTYModalBody
178
+
179
+ javascript:
180
+ $(function() {
181
+ new FrontlineAPI().PTYEventListener("#{Frontline::Index.route(:streamer)}");
182
+ });