upmin 0.0.34

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +34 -0
  3. data/app/assets/images/upmin/logo_large.png +0 -0
  4. data/app/assets/images/upmin/logo_small.png +0 -0
  5. data/app/assets/javascripts/upmin/application.js +38 -0
  6. data/app/assets/javascripts/upmin/jquery-clockpicker.js +729 -0
  7. data/app/assets/javascripts/upmin/models.js +23 -0
  8. data/app/assets/javascripts/upmin/pikaday.js +997 -0
  9. data/app/assets/stylesheets/upmin/application.css +16 -0
  10. data/app/assets/stylesheets/upmin/base.css.scss +24 -0
  11. data/app/assets/stylesheets/upmin/button_mixins.scss +37 -0
  12. data/app/assets/stylesheets/upmin/colors.scss +20 -0
  13. data/app/assets/stylesheets/upmin/instances.css.scss +91 -0
  14. data/app/assets/stylesheets/upmin/jquery-clockpicker.css +370 -0
  15. data/app/assets/stylesheets/upmin/models.css.scss +207 -0
  16. data/app/assets/stylesheets/upmin/pikaday.css +196 -0
  17. data/app/controllers/upmin/application_controller.rb +4 -0
  18. data/app/controllers/upmin/models_controller.rb +94 -0
  19. data/app/helpers/upmin/application_helper.rb +17 -0
  20. data/app/helpers/upmin/instances_helper.rb +13 -0
  21. data/app/helpers/upmin/models_helper.rb +4 -0
  22. data/app/views/layouts/upmin/_navbar.html.haml +15 -0
  23. data/app/views/layouts/upmin/application.html.haml +24 -0
  24. data/app/views/upmin/models/_search_result.html.haml +25 -0
  25. data/app/views/upmin/models/dashboard.html.haml +9 -0
  26. data/app/views/upmin/models/search.html.haml +20 -0
  27. data/app/views/upmin/models/show.html.haml +21 -0
  28. data/app/views/upmin/search_boxes/_unknown.html.haml +31 -0
  29. data/app/views/upmin/search_fields/_string.html.haml +3 -0
  30. data/app/views/upmin/types/_datetime.html.haml +95 -0
  31. data/app/views/upmin/types/_integer.html.haml +6 -0
  32. data/app/views/upmin/types/_string.html.haml +7 -0
  33. data/app/views/upmin/types/_unknown.html.haml +2 -0
  34. data/app/views/upmin/types/_unknown_collection.html.haml +18 -0
  35. data/app/views/upmin/types/_unknown_model.html.haml +57 -0
  36. data/app/views/upmin/types/_unknown_model_badge.html.haml +3 -0
  37. data/app/views/upmin/types/_unknown_model_nested.html.haml +24 -0
  38. data/app/views/upmin/types/_unknown_model_search_result.html.haml +31 -0
  39. data/config/routes.rb +19 -0
  40. data/lib/tasks/accordive_rails_tasks.rake +4 -0
  41. data/lib/tasks/upmin_tasks.rake +4 -0
  42. data/lib/upmin.rb +44 -0
  43. data/lib/upmin/engine.rb +7 -0
  44. data/lib/upmin/graph/collection_node.rb +72 -0
  45. data/lib/upmin/graph/data_node.rb +69 -0
  46. data/lib/upmin/graph/model_node.rb +151 -0
  47. data/lib/upmin/graph/node.rb +98 -0
  48. data/lib/upmin/model.rb +131 -0
  49. data/lib/upmin/railtie.rb +19 -0
  50. data/lib/upmin/railties/active_record.rb +156 -0
  51. data/lib/upmin/railties/render.rb +56 -0
  52. data/lib/upmin/railties/render_helpers.rb +57 -0
  53. data/lib/upmin/version.rb +3 -0
  54. data/test/controllers/upmin/model_controller_test.rb +11 -0
  55. data/test/dummy/README.rdoc +28 -0
  56. data/test/dummy/Rakefile +6 -0
  57. data/test/dummy/app/assets/javascripts/application.js +13 -0
  58. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  59. data/test/dummy/app/controllers/application_controller.rb +5 -0
  60. data/test/dummy/app/helpers/application_helper.rb +2 -0
  61. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  62. data/test/dummy/bin/bundle +3 -0
  63. data/test/dummy/bin/rails +4 -0
  64. data/test/dummy/bin/rake +4 -0
  65. data/test/dummy/config.ru +4 -0
  66. data/test/dummy/config/application.rb +23 -0
  67. data/test/dummy/config/boot.rb +5 -0
  68. data/test/dummy/config/database.yml +25 -0
  69. data/test/dummy/config/environment.rb +5 -0
  70. data/test/dummy/config/environments/development.rb +37 -0
  71. data/test/dummy/config/environments/production.rb +83 -0
  72. data/test/dummy/config/environments/test.rb +39 -0
  73. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  75. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  76. data/test/dummy/config/initializers/inflections.rb +16 -0
  77. data/test/dummy/config/initializers/mime_types.rb +4 -0
  78. data/test/dummy/config/initializers/session_store.rb +3 -0
  79. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  80. data/test/dummy/config/locales/en.yml +23 -0
  81. data/test/dummy/config/routes.rb +4 -0
  82. data/test/dummy/config/secrets.yml +22 -0
  83. data/test/dummy/public/404.html +67 -0
  84. data/test/dummy/public/422.html +67 -0
  85. data/test/dummy/public/500.html +66 -0
  86. data/test/dummy/public/favicon.ico +0 -0
  87. data/test/helpers/upmin/model_helper_test.rb +6 -0
  88. data/test/integration/navigation_test.rb +10 -0
  89. data/test/test_helper.rb +15 -0
  90. data/test/upmin_test.rb +7 -0
  91. metadata +253 -0
@@ -0,0 +1,17 @@
1
+ module Upmin
2
+ module ApplicationHelper
3
+ def body_classes
4
+ controller = "c-#{params[:controller].gsub(/_/, "-").gsub("upmin/", "")}"
5
+ action = "a-#{params[:action].gsub(/_/, "-")}"
6
+ return [controller, action]
7
+ end
8
+
9
+ def body_data
10
+ ret = {}
11
+ ret[:controller] = params[:controller].camelize.gsub("Upmin::", "")
12
+ ret[:action] = params[:action].camelize
13
+ return ret
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Upmin
2
+ module InstancesHelper
3
+
4
+ def models_path
5
+ return "#{root_path}models/"
6
+ end
7
+
8
+ def instance_path(instance)
9
+ return "#{models_path}#{instance.class.name}/#{instance.id}"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ module Upmin
2
+ module ModelsHelper
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ .navbar.navbar-default.navbar-static-top
2
+ .container
3
+ .navbar-header
4
+ %a.navbar-brand{href: root_path}
5
+ Upmin
6
+ %button.navbar-toggle{"data-target" => "#navbar-main", "data-toggle" => "collapse", type: "button"}
7
+ %span.icon-bar
8
+ %span.icon-bar
9
+ %span.icon-bar
10
+ #navbar-main.navbar-collapse.collapse
11
+ %ul.nav.navbar-nav
12
+ - Upmin::Model.all.each do |m|
13
+ %li
14
+ %a{href: upmin_search_path(model_name: m.name)}
15
+ = m.name.pluralize
@@ -0,0 +1,24 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title
5
+ Upmin Dashboard
6
+ = stylesheet_link_tag("upmin/application", media: "all")
7
+ = javascript_include_tag("upmin/application")
8
+ = csrf_meta_tags
9
+
10
+ %link{href: "//cdn.jsdelivr.net/bootstrap/3.2.0/css/bootstrap.min.css", rel: "stylesheet", type: "text/css"}
11
+ %link{href: "//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css", rel: "stylesheet"}
12
+ %script{:src => "//cdn.jsdelivr.net/bootstrap/3.2.0/js/bootstrap.min.js"}
13
+
14
+
15
+ %body{ class: body_classes, data: body_data.merge(root_path: root_path) }
16
+ .page-wrap
17
+ = render('layouts/upmin/navbar')
18
+ -# = render('layouts/flash')
19
+ = yield
20
+
21
+ -# = render('layouts/footer')
22
+
23
+ - if content_for?(:javascript)
24
+ = yield(:javascript)
@@ -0,0 +1,25 @@
1
+ - model_name ||= " "
2
+ - model_id ||= ""
3
+ - model_data ||= {}
4
+ - hidden = false unless hidden
5
+
6
+ %a.search-result-link{href: '#'}
7
+ .search-result.well{ class: hidden ? "hidden" : "", id: html_id }
8
+ .icon-outer
9
+ .icon-upper
10
+ .icon-letter
11
+
12
+ = model_name[0] || ""
13
+ .icon-name
14
+ = model_name
15
+ .icon-lower
16
+ ID:
17
+ %span.icon-id
18
+ = model_id
19
+ %dl.dl-horizontal{ id: "search-dl-1" }
20
+ - model_data.each do |k, v|
21
+ %dt
22
+ = k
23
+ %dd
24
+ = v.html_safe # for ems
25
+
@@ -0,0 +1,9 @@
1
+ .container
2
+ .row
3
+ .col-sm-12
4
+ %h1
5
+ Uh oh! The Dashboard isn't implemented yet.
6
+ %small
7
+ This is embarrassing. :(
8
+ %h3
9
+ ^ Click one of those links up top to use features that are working. ^
@@ -0,0 +1,20 @@
1
+ .container
2
+ .row
3
+ .col-md-8
4
+ - @results.each do |r|
5
+ %a.search-result-link{href: upmin_model_path(model_name: params[:model_name], id: r.id)}
6
+ .upmin-model{class: r.upmin_color}
7
+ %dl.dl-horizontal
8
+ - r.upmin_attributes.each do |u_attr|
9
+ %dt
10
+ = u_attr.to_s.capitalize.gsub("_", " ")
11
+ %dd
12
+ = r.send(u_attr)
13
+
14
+
15
+ .col-md-4
16
+ .well
17
+ = upmin_render_search_box(@model, {})
18
+
19
+
20
+
@@ -0,0 +1,21 @@
1
+ .container
2
+ - if notice
3
+ .alert.alert-dismissable.alert-info
4
+ %button.close{"data-dismiss" => "alert", type: "button"}
5
+ %span{"aria-hidden" => "true"} ×
6
+ = notice
7
+ - if alert
8
+ .alert.alert-dismissable.alert-danger
9
+ %button.close{"data-dismiss" => "alert", type: "button"}
10
+ %span{"aria-hidden" => "true"} ×
11
+ = alert
12
+ - if @instance.errors.any?
13
+ %ul
14
+ - @instance.errors.each do |field, error|
15
+ %li
16
+ %b
17
+ = field
18
+ = error
19
+ .row
20
+ .col-sm-12
21
+ = upmin_render(@instance)
@@ -0,0 +1,31 @@
1
+ %h4
2
+ Search
3
+ = upmin_model.u_name
4
+
5
+ = form_tag(upmin_search_path(model_name: params[:model_name]), method: :get) do
6
+ - upmin_model.attributes.each do |u_attr, info|
7
+
8
+ - if info[:type] == :string
9
+ .form-group
10
+ = label(:q, "#{u_attr}_cont", u_attr.to_s.capitalize.gsub("_", " "))
11
+ = text_field(:q, "#{u_attr}_cont", class: "form-control")
12
+
13
+ - if info[:type] == :integer
14
+ .form-group
15
+ = label(:q, "#{u_attr}_cont", u_attr.to_s.capitalize.gsub("_", " "))
16
+ .input-group
17
+ .input-group-addon From
18
+ = number_field(:q, "#{u_attr}_gteq", class: "form-control")
19
+ .input-group-addon to
20
+ = number_field(:q, "#{u_attr}_lteq", class: "form-control")
21
+ - if info[:type] == :datetime
22
+ .form-group
23
+ = label(:q, "#{u_attr}_cont", u_attr.to_s.capitalize.gsub("_", " "))
24
+ %br
25
+ From
26
+ = date_field(:q, "#{u_attr}_gteq", class: "form-control")
27
+ To
28
+ = date_field(:q, "#{u_attr}_lteq", class: "form-control")
29
+
30
+ = submit_tag("Search", class: "btn btn-primary btn-block")
31
+ = link_to("Clear All", upmin_search_path(model_name: params[:model_name]), class: "btn btn-default btn-block")
@@ -0,0 +1,3 @@
1
+ .form-group
2
+ = label(:q, "#{u_attr}_cont", u_attr.to_s.capitalize.gsub("_", " "))
3
+ = text_field(:q, "#{u_attr}_cont", class: "form-control")
@@ -0,0 +1,95 @@
1
+ - if node.editable? && f = options[:form_builder]
2
+
3
+ = f.hidden_field(node.method_name, value: datetime)
4
+ - # TODO(jon): Figure out a better way to do transforms. This works for now though.
5
+ = f.hidden_field("transforms[#{node.method_name}]", value: "DateTime#parse")
6
+ .row
7
+ .col-xs-12.col-md-4
8
+ .input-group.pikadate
9
+ %input.form-control{type: :text, value: datetime, id: "#{node.form_id}-date"}
10
+ %span.input-group-addon
11
+ %span.glyphicon.glyphicon-calendar
12
+ .col-xs-12.col-md-4
13
+ .input-group.clockpicker{"data-align" => "top", "data-autoclose" => "true", "data-placement" => "right"}
14
+ %input.form-control{:type => "text", :value => datetime, id: "#{node.form_id}-time"}
15
+ %span.input-group-addon
16
+ %span.glyphicon.glyphicon-time
17
+
18
+
19
+
20
+ - content_for(:javascript) do
21
+ :javascript
22
+ (function() {
23
+ var datePicker,
24
+ date = new Date($('##{node.form_id}').val()),
25
+ hiddenInput = $('##{node.form_id}');
26
+
27
+ // Date Specific Code
28
+ var handleDateSelect = function() {
29
+ var pickerDate = datePicker.getDate();
30
+ console.log("Setting the date from " + date + " to " + pickerDate);
31
+
32
+ date.setUTCFullYear(pickerDate.getUTCFullYear());
33
+ date.setUTCMonth(pickerDate.getUTCMonth());
34
+ date.setUTCDate(pickerDate.getUTCDate());
35
+
36
+ hiddenInput.val(date.toUTCString());
37
+ }
38
+
39
+ datePicker = new Pikaday({ field: $('##{node.form_id}-date')[0], onSelect: handleDateSelect });
40
+
41
+ // Time Specific Code
42
+ var timeInput = $('##{node.form_id}-time');
43
+
44
+ var parseTime = function(timeString) {
45
+ var ret = new Date();
46
+
47
+ var time = timeString.match(/(\d+)(?::(\d\d))?\s*(p?)/i);
48
+ if (!time) {
49
+ return NaN;
50
+ }
51
+ var hours = parseInt(time[1], 10);
52
+ if (hours == 12 && !time[3]) {
53
+ hours = 0;
54
+ } else {
55
+ hours += (hours < 12 && time[3]) ? 12 : 0;
56
+ }
57
+
58
+ ret.setHours(hours);
59
+ ret.setMinutes(parseInt(time[2], 10) || 0);
60
+ ret.setSeconds(0, 0);
61
+ return ret;
62
+ }
63
+
64
+ var handleTimeSelect = function() {
65
+ var time = parseTime(timeInput.val());
66
+
67
+ date.setUTCHours(time.getUTCHours());
68
+ date.setUTCMinutes(time.getUTCMinutes());
69
+
70
+ hiddenInput.val(date.toUTCString());
71
+ }
72
+
73
+ timeInput.clockpicker({
74
+ autoclose: true,
75
+ donetext: "Done",
76
+ twelvehour: true,
77
+ afterDone: handleTimeSelect,
78
+ default: date.getHours() + ":" + date.getMinutes()
79
+ });
80
+
81
+ timeInput.val(date.getHours() + ":" + date.getMinutes());
82
+
83
+
84
+ // Make sure we set times when the form is input in case the user typed in values.
85
+ timeInput.closest("form").submit(function(event) {
86
+ // TODO(jon): Add code to handle typed in dates.
87
+ handleTimeSelect();
88
+ });
89
+ })();
90
+
91
+
92
+ - else
93
+ %p.well
94
+ -# TODO(jon): Make this show an uneditable date and time field.
95
+ = datetime
@@ -0,0 +1,6 @@
1
+ - if node.editable? && f = options[:form_builder]
2
+ = f.number_field(node.method_name, value: integer, class: "form-control")
3
+
4
+ - else
5
+ %p.well
6
+ = integer
@@ -0,0 +1,7 @@
1
+ - if node.editable? && f = options[:form_builder]
2
+ - f = options[:form_builder]
3
+ = f.text_field(node.method_name, value: string, class: "form-control")
4
+
5
+ - else
6
+ %p.well
7
+ = string
@@ -0,0 +1,2 @@
1
+ %p.well
2
+ = unknown
@@ -0,0 +1,18 @@
1
+
2
+ -if node.nodes.any?
3
+ %p
4
+ - node.nodes.each do |c_node|
5
+ = upmin_render(c_node, options)
6
+
7
+ %a.btn.btn-xs.btn-default{class: "btn-#{node.nodes.first.color}", href: '#'}
8
+ %i.fa.fa-plus{style: "padding-right: 3px;"}
9
+ = node.type.to_s.gsub(/_collection/, "").humanize
10
+
11
+
12
+
13
+ - if node.nodes.empty?
14
+ %p.well
15
+ None
16
+
17
+
18
+
@@ -0,0 +1,57 @@
1
+ .upmin-model{class: node.color}
2
+ -# Display the model title as "Model # ID"
3
+ %h3
4
+ = node.title
5
+
6
+ -# For each model attribute, render the DataNode inside of a form.
7
+ = form_for(unknown_model, as: node.name.underscore, url: upmin_model_path(node.path_hash), html: { method: :put }) do |f|
8
+ - node.attributes.each do |key, data_node|
9
+ .form-group
10
+ -# TODO(jon): Make the key already pretty if I can easily.
11
+ = f.label(key.to_s.capitalize.gsub("_", " "))
12
+ = upmin_render(data_node, form_builder: f)
13
+ = f.submit("Save", class: "btn btn-primary")
14
+
15
+
16
+
17
+
18
+ -# Render each child node
19
+ %br
20
+ %br
21
+ %h3{style: "color: #333;"}
22
+ Relationships
23
+ %hr
24
+
25
+ - node.children.each do |key, node|
26
+ %h5
27
+ = key.to_s.humanize
28
+ - if node.is_a?(Upmin::Graph::CollectionNode)
29
+ = upmin_render(node, options)
30
+ - else
31
+ %p
32
+ = upmin_render(node, options)
33
+
34
+ %br
35
+ %br
36
+ %h3{style: "color: #333;"}
37
+ Actions
38
+ %hr
39
+ - unknown_model.class.upmin_methods.each do |method|
40
+ %h4{style: "color: #333;"}
41
+ = method.to_s.capitalize.humanize
42
+ .well
43
+ = form_tag(upmin_action_path(model_name: params[:model_name], id: params[:id], method: method)) do
44
+ - unknown_model.method(method).parameters.each do |a_type, a_name|
45
+ - next if a_type == :block # Skip blocks
46
+ .form-group
47
+ = label(method, a_name, a_name.to_s.capitalize.gsub("_", " "))
48
+ = text_field(method, a_name, class: "form-control")
49
+ - if a_type == :opt
50
+ %small
51
+ * Optional
52
+ = submit_tag("Submit \"#{method.to_s.humanize}\"", class: "btn btn-primary")
53
+
54
+
55
+ -# - if node.editable?
56
+
57
+
@@ -0,0 +1,3 @@
1
+ %a.active-tag-link{href: upmin_model_path(node.path_hash)}
2
+ %span.label{class: node.color}
3
+ = node.title
@@ -0,0 +1,24 @@
1
+ %a.active-tag-link{href: upmin_model_path(node.path_hash)}
2
+ %span.label{class: node.color}
3
+ = node.title
4
+
5
+
6
+ -# .upmin-model{class: node.color}
7
+ -# -# Display the model title as "Model # ID"
8
+ -# %h4
9
+ -# %a{href: upmin_model_path(node.path_hash)}
10
+ -# = node.title
11
+
12
+ -# -# For each model attribute, render the DataNode
13
+ -# - node.attributes.each do |key, data_node|
14
+ -# %h6
15
+ -# = key.to_s.humanize
16
+
17
+ -# = upmin_render(data_node, options)
18
+
19
+ -# -# Render each child node
20
+ -# - node.children.each do |key, node|
21
+ -# %h5
22
+ -# = key.to_s.humanize
23
+ -# = upmin_render(node, options)
24
+
@@ -0,0 +1,31 @@
1
+ - provide(:subtitle, node.name)
2
+
3
+ .upmin-model{class: node.color}
4
+ -# Display the model title as "Model # ID"
5
+ %h3
6
+ = node.title
7
+ -# = unknown_model.upmin_name(:singular)
8
+ -# \#
9
+ -# = unknown_model.id
10
+
11
+ -# For each model attribute, render the DataNode
12
+ - node.attributes.each do |key, data_node|
13
+ %h5
14
+ = key.to_s.capitalize.gsub("_", " ")
15
+
16
+ = upmin_render(data_node, options)
17
+
18
+ -# Render each child node
19
+ - node.children.each do |key, node|
20
+ %h5
21
+ = key.to_s.humanize
22
+ = upmin_render(node, options)
23
+
24
+
25
+ - if node.editable?
26
+ %br
27
+ %button.btn.btn-primary{type: :button}
28
+ Save
29
+
30
+
31
+