kea-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/kea/bindings/activity.js +24 -0
- data/app/assets/javascripts/kea/bindings/child_vm.js +32 -0
- data/app/assets/javascripts/kea/bindings/komplete.js +172 -0
- data/app/assets/javascripts/kea/bindings/sherlock.js +47 -0
- data/app/assets/javascripts/kea/bindings/sherlock_provider_search.js +57 -0
- data/app/assets/javascripts/kea/bindings/submit_button.js +33 -0
- data/app/assets/javascripts/kea/bindings/validation_state.js +38 -0
- data/app/assets/javascripts/kea/bindings/wait_for_vm.js +44 -0
- data/app/assets/javascripts/kea/extenders/equals.js +85 -0
- data/app/assets/javascripts/kea/extenders/external_validator.js +65 -0
- data/app/assets/javascripts/kea/extenders/min_length.js +39 -0
- data/app/assets/javascripts/kea/extenders/numeric_range.js +64 -0
- data/app/assets/javascripts/kea/extenders/required.js +39 -0
- data/app/assets/javascripts/kea/extenders/valid_date.js +32 -0
- data/app/assets/javascripts/kea/extenders/valid_time.js +41 -0
- data/app/assets/javascripts/kea/extenders/validator_base.js +75 -0
- data/app/assets/javascripts/kea/helpers/kea.activity_button.js +97 -0
- data/app/assets/javascripts/kea/helpers/kea.notify.js +46 -0
- data/app/assets/javascripts/kea/initializers/base.js +11 -0
- data/app/assets/javascripts/kea/kea.js +14 -0
- data/app/assets/javascripts/kea/kea_dependencies.js +20 -0
- data/app/assets/javascripts/kea/kea_init.js +24 -0
- data/app/assets/javascripts/kea/models/base.js +215 -0
- data/app/assets/javascripts/kea/overlay/child_vm_overlay.js +49 -0
- data/app/assets/javascripts/kea/overlay/overlay_control.js +87 -0
- data/app/assets/javascripts/kea/overlay/overlay_template.js +58 -0
- data/app/assets/javascripts/kea/services/base.js +227 -0
- data/app/assets/javascripts/kea/sherlock/base_provider.js +201 -0
- data/app/assets/javascripts/kea/viewmodels/base.js +150 -0
- data/app/assets/javascripts/kea/viewmodels/sherlock.js +230 -0
- data/app/assets/stylesheets/kea/kea.css.sass +16 -0
- data/app/helpers/kea/application_helper.rb +42 -0
- data/lib/generators/kea/install/USAGE +9 -0
- data/lib/generators/kea/install/install_generator.rb +197 -0
- data/lib/generators/kea/install/templates/_komplete.sass +17 -0
- data/lib/generators/kea/install/templates/_sherlock.sass +105 -0
- data/lib/generators/kea/install/templates/application.html.erb +38 -0
- data/lib/generators/kea/install/templates/global.js +7 -0
- data/lib/generators/kea/install/templates/init.js +18 -0
- data/lib/generators/kea/install/templates/main.js +18 -0
- data/lib/generators/kea/model/USAGE +7 -0
- data/lib/generators/kea/model/model_generator.rb +68 -0
- data/lib/generators/kea/model/templates/model.js.erb +96 -0
- data/lib/generators/kea/service/USAGE +7 -0
- data/lib/generators/kea/service/service_generator.rb +21 -0
- data/lib/generators/kea/service/templates/model.js.erb +58 -0
- data/lib/generators/kea/viewmodel/USAGE +6 -0
- data/lib/generators/kea/viewmodel/templates/viewmodel.js.erb +73 -0
- data/lib/generators/kea/viewmodel/viewmodel_generator.rb +21 -0
- data/lib/kea-rails/engine.rb +5 -0
- data/lib/kea-rails/version.rb +3 -0
- data/lib/kea-rails.rb +4 -0
- data/lib/tasks/kea_tasks.rake +4 -0
- metadata +115 -0
@@ -0,0 +1,197 @@
|
|
1
|
+
class Kea::InstallGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
argument :namespace, type: :string, required: false, default: nil
|
4
|
+
|
5
|
+
def init_js
|
6
|
+
copy_file "init.js", namespaced_path("app/assets/javascripts/", "init.js")
|
7
|
+
end
|
8
|
+
|
9
|
+
def directories
|
10
|
+
empty_directory namespaced_path("app/assets/javascripts", "bindings")
|
11
|
+
create_file namespaced_path("app/assets/javascripts", "bindings/.keep")
|
12
|
+
empty_directory namespaced_path("app/assets/javascripts", "extenders")
|
13
|
+
create_file namespaced_path("app/assets/javascripts", "extenders/.keep")
|
14
|
+
empty_directory namespaced_path("app/assets/javascripts", "initializers")
|
15
|
+
empty_directory namespaced_path("app/assets/javascripts", "models")
|
16
|
+
create_file namespaced_path("app/assets/javascripts", "models/.keep")
|
17
|
+
empty_directory namespaced_path("app/assets/javascripts", "services")
|
18
|
+
create_file namespaced_path("app/assets/javascripts", "services/.keep")
|
19
|
+
empty_directory namespaced_path("app/assets/javascripts", "viewmodels")
|
20
|
+
empty_directory namespaced_path("app/assets/javascripts", "sherlock")
|
21
|
+
create_file namespaced_path("app/assets/javascripts", "sherlock/.keep")
|
22
|
+
end
|
23
|
+
|
24
|
+
def global_initializer
|
25
|
+
copy_file "global.js", namespaced_path("app/assets/javascripts/", "initializers/global.js")
|
26
|
+
end
|
27
|
+
|
28
|
+
def main_viewmodel
|
29
|
+
copy_file "main.js", namespaced_path("app/assets/javascripts/", "viewmodels/main.js")
|
30
|
+
end
|
31
|
+
|
32
|
+
def application_js
|
33
|
+
insert_into_file namespaced_path("app/assets/javascripts", "application.js"), :after => "jquery_ujs\n" do <<-'JS'
|
34
|
+
//= require kea/kea_dependencies
|
35
|
+
|
36
|
+
//= require ./init
|
37
|
+
|
38
|
+
//= require kea/kea
|
39
|
+
//= require_directory ./bindings
|
40
|
+
//= require_directory ./extenders
|
41
|
+
//= require_directory ./models
|
42
|
+
//= require_directory ./services
|
43
|
+
//= require ./viewmodels/main
|
44
|
+
//= require_directory ./viewmodels
|
45
|
+
|
46
|
+
//= require_directory ./sherlock
|
47
|
+
|
48
|
+
//= require_directory ./initializers
|
49
|
+
JS
|
50
|
+
end
|
51
|
+
|
52
|
+
append_to_file namespaced_path("app/assets/javascripts", "application.js") do <<-'JS'
|
53
|
+
|
54
|
+
|
55
|
+
$(document).ready(function() {
|
56
|
+
"use strict";
|
57
|
+
|
58
|
+
$.ajaxSetup({
|
59
|
+
timeout: 30000
|
60
|
+
});
|
61
|
+
|
62
|
+
window.app.page.MainVm = new window.app.viewmodels.Main();
|
63
|
+
|
64
|
+
var $body = $('body');
|
65
|
+
|
66
|
+
app.initializers.forEach(function(initializer) {
|
67
|
+
|
68
|
+
if (initializer.selectors.length === 0) {
|
69
|
+
initializer.callback();
|
70
|
+
return;
|
71
|
+
}
|
72
|
+
|
73
|
+
initializer.selectors.forEach(function(selector) {
|
74
|
+
if (selector.charAt(0) === '#') {
|
75
|
+
if ($body.attr('id') === selector.slice(1, selector.length)) {
|
76
|
+
initializer.callback();
|
77
|
+
}
|
78
|
+
|
79
|
+
} else if (selector.charAt(0) === '.') {
|
80
|
+
if ($body.hasClass(selector)) {
|
81
|
+
initializer.callback();
|
82
|
+
}
|
83
|
+
}
|
84
|
+
});
|
85
|
+
|
86
|
+
});
|
87
|
+
|
88
|
+
ko.applyBindings(app.page.MainVm);
|
89
|
+
|
90
|
+
app.page.MainVm.pageInitComplete(true);
|
91
|
+
|
92
|
+
if (app.errors.length > 0) {
|
93
|
+
app.errors.forEach(function(error) {
|
94
|
+
kea.notify(error.message, error.level);
|
95
|
+
});
|
96
|
+
}
|
97
|
+
|
98
|
+
});
|
99
|
+
JS
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def application_css
|
104
|
+
copy_file "_komplete.sass", namespaced_path("app/assets/stylesheets", "_komplete.sass")
|
105
|
+
copy_file "_sherlock.sass", namespaced_path("app/assets/stylesheets", "_sherlock.sass")
|
106
|
+
|
107
|
+
insert_into_file namespaced_path("app/assets/stylesheets", "application.css.sass"), "*= require kea/kea", :before => "*= require_self"
|
108
|
+
|
109
|
+
append_to_file namespaced_path("app/assets/stylesheets", "application.css.sass") do <<-'CSS'
|
110
|
+
+keyframes(overlay)
|
111
|
+
0%
|
112
|
+
+transform(translateY(-100%) scale(0.8))
|
113
|
+
box-shadow: 0px 40px 20px 5px $grey-20
|
114
|
+
50%
|
115
|
+
+transform(translateY(0%) scale(0.8))
|
116
|
+
box-shadow: 0px 0px 20px 5px $grey-20
|
117
|
+
90%
|
118
|
+
+transform(translateY(0%) scale(0.8))
|
119
|
+
box-shadow: 0px 0px 20px 5px $grey-20
|
120
|
+
100%
|
121
|
+
+transform(translateY(0%) scale(1))
|
122
|
+
box-shadow: 0px 0px 0px 0px $grey-20
|
123
|
+
|
124
|
+
// Imported elements
|
125
|
+
|
126
|
+
@import sherlock
|
127
|
+
@import komplete
|
128
|
+
|
129
|
+
.attache-popover
|
130
|
+
display: none
|
131
|
+
position: absolute
|
132
|
+
z-index: 2
|
133
|
+
padding: 1em
|
134
|
+
opacity: 0
|
135
|
+
transition: opacity 0.3s ease
|
136
|
+
+triangles(grey)
|
137
|
+
&.inactive
|
138
|
+
display: none
|
139
|
+
&.activating, &.active
|
140
|
+
display: block
|
141
|
+
&.active
|
142
|
+
opacity: 1
|
143
|
+
&.formerror
|
144
|
+
z-index: 11
|
145
|
+
background: opacify(red, 0.3)
|
146
|
+
border-color: red
|
147
|
+
color: white
|
148
|
+
+triangles(opacify(red, 0.3))
|
149
|
+
|
150
|
+
.veil-overlay
|
151
|
+
position: fixed
|
152
|
+
top: 0
|
153
|
+
left: 0
|
154
|
+
display: none
|
155
|
+
z-index: 10
|
156
|
+
// +transition(all 1s $cubic-transition)
|
157
|
+
// +transform(scale(0.5))
|
158
|
+
&.fullscreen
|
159
|
+
width: 100%
|
160
|
+
height: 100vh
|
161
|
+
padding: 2rem
|
162
|
+
&.activating, &.active, &.deactivating
|
163
|
+
display: block
|
164
|
+
visibility: visible
|
165
|
+
&.active
|
166
|
+
+animation(overlay 1s $cubic-transition 0s 1 normal forwards)
|
167
|
+
&.deactivating
|
168
|
+
+transform(scale(0))
|
169
|
+
// +animation(overlay 1s $cubic-transition 0s 1 reverse forwards)
|
170
|
+
CSS
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def layout_setup
|
175
|
+
copy_file "application.html.erb", "app/views/layouts/#{namespace ? namespace.underscore : "application"}.html.erb"
|
176
|
+
end
|
177
|
+
|
178
|
+
def helpers
|
179
|
+
inject_into_class "app/controllers/application_controller.rb", ApplicationController do
|
180
|
+
" helper Kea::ApplicationHelper\n"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
|
186
|
+
def namespaced_path(path, suffix = nil)
|
187
|
+
app_namespace = case namespace
|
188
|
+
when 'none', nil
|
189
|
+
nil
|
190
|
+
else
|
191
|
+
namespace.underscore
|
192
|
+
end
|
193
|
+
|
194
|
+
File.join [path, app_namespace, suffix].compact
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
.komplete
|
2
|
+
position: relative
|
3
|
+
.komplete-dropdown
|
4
|
+
position: absolute
|
5
|
+
left: 0
|
6
|
+
z-index: 2
|
7
|
+
background-color: white
|
8
|
+
border: 1px solid black
|
9
|
+
ul
|
10
|
+
margin: 0
|
11
|
+
padding: 0
|
12
|
+
list-style-type: none
|
13
|
+
li
|
14
|
+
padding: 0.5rem
|
15
|
+
border-bottom: 1px solid grey
|
16
|
+
&.has-focus, &:hover
|
17
|
+
background-color: lightgrey
|
@@ -0,0 +1,105 @@
|
|
1
|
+
$primary-highlight-color: #932F6D !default
|
2
|
+
$primary-highlight-hover-color: #420039 !default
|
3
|
+
$grey-10: #e0e0e0 !default
|
4
|
+
$grey-20: #c2c2c2 !default
|
5
|
+
$grey-30: #a3a3a3 !default
|
6
|
+
$grey-40: #858585 !default
|
7
|
+
$base-font-size: 16px !default
|
8
|
+
$light: white !default
|
9
|
+
|
10
|
+
$standard-action-color: $primary-highlight-color !default
|
11
|
+
|
12
|
+
$text-on-light: black !default
|
13
|
+
$subtle-text-on-light: $grey-30 !default
|
14
|
+
|
15
|
+
$text-on-dark: $light !default
|
16
|
+
$subtle-text-on-dark: $grey-30 !default
|
17
|
+
|
18
|
+
$standard-border-color-on-light: $grey-20 !default
|
19
|
+
$standard-border-color-on-dark: $grey-10 !default
|
20
|
+
|
21
|
+
.sherlock-search-bar
|
22
|
+
+display(flex)
|
23
|
+
+flex-flow(row wrap)
|
24
|
+
min-height: 2rem
|
25
|
+
padding: 0.5rem
|
26
|
+
border: 1px solid $grey-30
|
27
|
+
.fragment, .provider-search-field
|
28
|
+
+flex(0 0 auto)
|
29
|
+
.fragment
|
30
|
+
+display(flex)
|
31
|
+
+flex-flow(row nowrap)
|
32
|
+
height: 40px
|
33
|
+
margin-right: 0.5rem
|
34
|
+
border: 2px solid $primary-highlight-color
|
35
|
+
border-radius: 10px
|
36
|
+
.fragment-name, .fragment-predicate, .fragment-search-value, .fragment-remove
|
37
|
+
+flex(0 0 auto)
|
38
|
+
.fragment-name
|
39
|
+
padding: 0 1rem
|
40
|
+
background-color: $primary-highlight-color
|
41
|
+
color: $text-on-dark
|
42
|
+
line-height: 40px
|
43
|
+
.fragment-search-value
|
44
|
+
padding: 0 0.5rem
|
45
|
+
font-size: $base-font-size
|
46
|
+
border: none
|
47
|
+
color: $primary-highlight-color
|
48
|
+
border-left: 2px solid $primary-highlight-color
|
49
|
+
background-color: none
|
50
|
+
&:focus
|
51
|
+
outline: none
|
52
|
+
.fragment-search-value-display
|
53
|
+
padding: 0 1rem
|
54
|
+
font-size: $base-font-size
|
55
|
+
border: none
|
56
|
+
color: $primary-highlight-color
|
57
|
+
border-left: 2px solid $primary-highlight-color
|
58
|
+
background-color: none
|
59
|
+
line-height: 40px
|
60
|
+
select.fragment-search-value
|
61
|
+
+flex(0 1 auto)
|
62
|
+
.fragment-remove
|
63
|
+
i
|
64
|
+
color: $primary-highlight-color
|
65
|
+
&:hover
|
66
|
+
color: $primary-highlight-hover-color
|
67
|
+
.provider-search-field
|
68
|
+
position: relative
|
69
|
+
& > input
|
70
|
+
line-height: 40px
|
71
|
+
font-size: $base-font-size
|
72
|
+
border: none
|
73
|
+
&:focus
|
74
|
+
outline: none
|
75
|
+
.provider-search-dropdown
|
76
|
+
display: none
|
77
|
+
position: absolute
|
78
|
+
z-index: 2
|
79
|
+
width: 200px
|
80
|
+
background-color: $light
|
81
|
+
border: 1px solid $grey-30
|
82
|
+
&.active
|
83
|
+
display: block
|
84
|
+
ul
|
85
|
+
margin: 0
|
86
|
+
list-style-type: none
|
87
|
+
li
|
88
|
+
padding: 0.5rem
|
89
|
+
cursor: pointer
|
90
|
+
&.has-focus, &:hover
|
91
|
+
background-color: $standard-action-color
|
92
|
+
color: $text-on-dark
|
93
|
+
article
|
94
|
+
position: relative
|
95
|
+
h2
|
96
|
+
padding: 0.5rem
|
97
|
+
margin-bottom: 0
|
98
|
+
padding-bottom: 0
|
99
|
+
border-top: 1px solid $standard-border-color-on-light
|
100
|
+
font-size: $base-font-size
|
101
|
+
color: $subtle-text-on-light
|
102
|
+
.activity-indicator
|
103
|
+
position: absolute
|
104
|
+
top: 0.5rem
|
105
|
+
right: 0.5rem
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
|
7
|
+
<title><%= content_for?(:title) ? yield(:title) : "" %></title>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag "backend/application" %>
|
10
|
+
<%= csrf_meta_tags %>
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body id="<%= body_id %>" class="<%= body_class %> <%= yield(:body_class) if yield(:body_class) %>">
|
14
|
+
<%= yield %>
|
15
|
+
|
16
|
+
<%= content_for :knockout_templates if content_for? :knockout_templates %>
|
17
|
+
|
18
|
+
<script type="application/javascript">
|
19
|
+
<% unless Rails.env.production? %>
|
20
|
+
window.DEBUG = true;
|
21
|
+
<% else %>
|
22
|
+
window.DEBUG = false;
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
window.app = window.app || {};
|
26
|
+
window.app.config = window.app.config || {};
|
27
|
+
window.app.errors = window.app.errors || [];
|
28
|
+
|
29
|
+
<% flash.each do |key, message| %>
|
30
|
+
window.app.errors.push({level: "<%= key %>", message: "<%= message.html_safe %>"});
|
31
|
+
<% end %>
|
32
|
+
|
33
|
+
<%= content_for(:json_cache) if content_for?(:json_cache) %>
|
34
|
+
</script>
|
35
|
+
|
36
|
+
<%= javascript_include_tag "application" %>
|
37
|
+
</body>
|
38
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
window.app = window.app || {};
|
2
|
+
window.app.models = window.app.models || {};
|
3
|
+
window.app.services = window.app.services || {};
|
4
|
+
window.app.viewmodels = window.app.viewmodels || {};
|
5
|
+
|
6
|
+
window.app.initializers = window.app.initializers || [];
|
7
|
+
window.app.page = window.app.page || {};
|
8
|
+
window.app.paths = window.app.paths || {};
|
9
|
+
|
10
|
+
// window.app.paths.users = '/users';
|
11
|
+
|
12
|
+
window.app.sherlock = {
|
13
|
+
providers: []
|
14
|
+
};
|
15
|
+
|
16
|
+
moment.lang('de');
|
17
|
+
|
18
|
+
Veil.globalOptions.backdropMarkup = null;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
(function(app, kea, ko) {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
var Main = function Main() {
|
5
|
+
kea.viewmodels.Parent.apply(this);
|
6
|
+
|
7
|
+
var that = this;
|
8
|
+
|
9
|
+
this._viewmodelName = function _viewmodelName() { return "Main"; };
|
10
|
+
|
11
|
+
// this.listener = new window.keypress.Listener();
|
12
|
+
|
13
|
+
this.pageInitComplete = ko.observable(false);
|
14
|
+
};
|
15
|
+
|
16
|
+
app.viewmodels.Main = Main;
|
17
|
+
|
18
|
+
})(window.app, window.kea, ko);
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class Kea::ModelGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
argument :namespace, type: :string, required: false, default: nil, banner: "APPLICATION NAMESPACE|none"
|
4
|
+
argument :attributes, type: :array, required: false, banner: "model_attribute1 model_attribute1 …"
|
5
|
+
|
6
|
+
class_option :validatable, type: :boolean, :aliases => "-v", desc: "add model validations", default: false
|
7
|
+
|
8
|
+
def install_templates
|
9
|
+
@klass = name.camelize.safe_constantize
|
10
|
+
|
11
|
+
if @klass
|
12
|
+
@model_attributes = reflected_model_attributes
|
13
|
+
@model_associations = reflected_model_associations
|
14
|
+
@attribute_initializers = attribute_initializers
|
15
|
+
|
16
|
+
if options[:validatable]
|
17
|
+
@validators = @klass.validators.select {|v| v.is_a?(ActiveRecord::Validations::PresenceValidator) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
template "model.js.erb", namespaced_path("app/assets/javascripts", "models/#{name.underscore}.js")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def namespaced_path(path, suffix = nil)
|
27
|
+
app_namespace = case namespace
|
28
|
+
when 'none', nil
|
29
|
+
nil
|
30
|
+
else
|
31
|
+
namespace.underscore
|
32
|
+
end
|
33
|
+
|
34
|
+
File.join [path, app_namespace, suffix].compact
|
35
|
+
end
|
36
|
+
|
37
|
+
def reflected_model_attributes
|
38
|
+
attributes.any? ? attributes.map(&:name) : @klass.attribute_names - ["id", "created_at", "updated_at"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def reflected_model_associations
|
42
|
+
@klass.reflect_on_all_associations.select { |assoc| assoc.macro == :has_one || assoc.macro == :has_many }
|
43
|
+
end
|
44
|
+
|
45
|
+
def attribute_initializers
|
46
|
+
max_string_length = 0
|
47
|
+
attribute_initializers = []
|
48
|
+
association_initializers = []
|
49
|
+
|
50
|
+
attribute_initializers = @model_attributes.collect do |attribute_name|
|
51
|
+
["this.#{attribute_name}", "ko.observable();"]
|
52
|
+
end
|
53
|
+
|
54
|
+
association_initializers = @model_associations.collect do |assoc|
|
55
|
+
if assoc.macro == :has_one
|
56
|
+
["this.#{assoc.name}", "ko.observable();"]
|
57
|
+
elsif assoc.macro == :has_many
|
58
|
+
["this.#{assoc.name}", "ko.observableArray([]);"]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
initializers = attribute_initializers + association_initializers
|
63
|
+
|
64
|
+
max_string_length = initializers.map { |a| a.first.length }.max
|
65
|
+
|
66
|
+
initializers.map { |i| [i.first.ljust(max_string_length + 1), " = ", i.last].join('') }
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
(function(app, kea, ko) {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
var model_name = '<%= name.camelize %>',
|
5
|
+
ModelClass;
|
6
|
+
|
7
|
+
ModelClass = function <%= name.camelize %>(json) {
|
8
|
+
<% if options[:validatable] -%>
|
9
|
+
kea.models.Validatable.call(this);
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
var that = this;
|
13
|
+
|
14
|
+
this.id = null;
|
15
|
+
this.resource_path = null;
|
16
|
+
|
17
|
+
<% if @klass -%>
|
18
|
+
<% @attribute_initializers.each do |attribute| -%>
|
19
|
+
<%= attribute %>
|
20
|
+
<% end -%>
|
21
|
+
<% end -%>
|
22
|
+
<% if options[:validatable] && @validators.any? -%>
|
23
|
+
|
24
|
+
this.validatableFields = function validatableFields() {
|
25
|
+
return <%= @validators.collect(&:attributes).flatten.map(&:to_s).to_s %>;
|
26
|
+
};
|
27
|
+
|
28
|
+
this.attachValidators = function attachValidators() {
|
29
|
+
<% @validators.each do |validator| -%>
|
30
|
+
|
31
|
+
that.<%= validator.attributes.first %>.extend({
|
32
|
+
required: {
|
33
|
+
message: "Pflichtfeld"
|
34
|
+
}
|
35
|
+
});
|
36
|
+
<% end -%>
|
37
|
+
};
|
38
|
+
<% end -%>
|
39
|
+
|
40
|
+
this.fromJSON = function fromJSON(json) {
|
41
|
+
this.id = json.id;
|
42
|
+
this.resource_path = json.resource_path;
|
43
|
+
|
44
|
+
<% if @klass -%>
|
45
|
+
<% @model_attributes.each do |attribute| -%>
|
46
|
+
this.<%= attribute %>( json.<%= attribute %> );
|
47
|
+
<% end -%>
|
48
|
+
<% @model_associations.each do |assoc| -%>
|
49
|
+
<% if assoc.macro == :has_one -%>
|
50
|
+
|
51
|
+
if (json.<%= assoc.name %>) {
|
52
|
+
this.<%= assoc.name %>( new app.models.<%= assoc.name.to_s.singularize.camelize %>(json.<%= assoc.name %>) );
|
53
|
+
}
|
54
|
+
<% elsif assoc.macro == :has_many -%>
|
55
|
+
|
56
|
+
if (json.<%= assoc.name %>) {
|
57
|
+
this.<%= assoc.name %>.removeAll();
|
58
|
+
|
59
|
+
json.<%= assoc.name %>.forEach(function(<%= assoc.name.to_s.singularize %>) {
|
60
|
+
that.<%= assoc.name %>.push( new app.models.<%= assoc.name.to_s.singularize.camelize %>(<%= assoc.name.to_s.singularize %>) );
|
61
|
+
});
|
62
|
+
}
|
63
|
+
<% end -%>
|
64
|
+
<% end -%>
|
65
|
+
<% end -%>
|
66
|
+
};
|
67
|
+
|
68
|
+
this.serialize = function serialize() {
|
69
|
+
return {
|
70
|
+
<% if @klass -%>
|
71
|
+
<% @model_attributes.each do |attribute| -%>
|
72
|
+
<%= attribute %>: this.<%= attribute %>(),
|
73
|
+
<% end -%>
|
74
|
+
<% @model_associations.each do |assoc| -%>
|
75
|
+
<% if assoc.macro == :has_one -%>
|
76
|
+
<%= assoc.name %>: this.<%= assoc.name %>().serialize(),
|
77
|
+
<% elsif assoc.macro == :has_many -%>
|
78
|
+
<%= assoc.name %>: this.<%= assoc.name %>().map(function(<%= assoc.name.to_s.singularize %>) { <%= assoc.name.to_s.singularize %>.serialize(); }),
|
79
|
+
<% end -%>
|
80
|
+
<% end -%>
|
81
|
+
<% end -%>
|
82
|
+
};
|
83
|
+
};
|
84
|
+
|
85
|
+
if (json) {
|
86
|
+
this.fromJSON(json);
|
87
|
+
}
|
88
|
+
};
|
89
|
+
|
90
|
+
kea.u.inherit(ModelClass, kea.models.Base);
|
91
|
+
|
92
|
+
ModelClass.prototype._modelName = function _modelName() { return model_name; };
|
93
|
+
|
94
|
+
app.models[model_name] = ModelClass;
|
95
|
+
|
96
|
+
})(window.app, window.kea, ko);
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Kea::ServiceGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
argument :namespace, type: :string, required: false, default: nil
|
4
|
+
|
5
|
+
def install_templates
|
6
|
+
template "service.js.erb", namespaced_path("app/assets/javascripts", "services/#{name.underscore}.js")
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def namespaced_path(path, suffix = nil)
|
12
|
+
app_namespace = case namespace
|
13
|
+
when 'none', nil
|
14
|
+
nil
|
15
|
+
else
|
16
|
+
namespace.underscore
|
17
|
+
end
|
18
|
+
|
19
|
+
File.join [path, app_namespace, suffix].compact
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
(function(app, kea, ko) {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
var model_name = "<%= name.camelize %>",
|
5
|
+
resourcePath,
|
6
|
+
collectionPath,
|
7
|
+
getCollection,
|
8
|
+
get,
|
9
|
+
refresh,
|
10
|
+
create,
|
11
|
+
update,
|
12
|
+
destroy;
|
13
|
+
|
14
|
+
resourcePath = function resourcePath(id) {
|
15
|
+
return collectionPath() + '/' + id;
|
16
|
+
};
|
17
|
+
|
18
|
+
collectionPath = function collectionPath() {
|
19
|
+
return app.paths.<%= name.underscore %>;
|
20
|
+
};
|
21
|
+
|
22
|
+
getCollection = function getCollection(params) {
|
23
|
+
return kea.services.Base.get(model_name, collectionPath(), params);
|
24
|
+
};
|
25
|
+
|
26
|
+
get = function get(id, params, try_cache) {
|
27
|
+
return kea.services.Base.get(model_name, resourcePath(id), params, try_cache);
|
28
|
+
};
|
29
|
+
|
30
|
+
refresh = function refresh(model_instance, params) {
|
31
|
+
return kea.services.Base.refresh(model_name, model_instance, params, resourcePath(model_instance.id));
|
32
|
+
};
|
33
|
+
|
34
|
+
create = function create(model_instance) {
|
35
|
+
return kea.services.Base.create(model_name, model_instance, collectionPath())
|
36
|
+
.fail(kea.services.Base.failure422Handler);
|
37
|
+
};
|
38
|
+
|
39
|
+
update = function update(model_instance, params) {
|
40
|
+
return kea.services.Base.update(model_name, model_instance, params, resourcePath(model_instance.id))
|
41
|
+
.fail(kea.services.Base.failure422Handler);
|
42
|
+
};
|
43
|
+
|
44
|
+
destroy = function destroy(model_instance) {
|
45
|
+
return kea.services.Base.destroy(model_name, model_instance, resourcePath(model_instance.id))
|
46
|
+
.fail(kea.services.Base.failure422Handler);
|
47
|
+
};
|
48
|
+
|
49
|
+
app.services[model_name] = {
|
50
|
+
getCollection: getCollection,
|
51
|
+
get: get,
|
52
|
+
refresh: refresh,
|
53
|
+
create: create,
|
54
|
+
update: update,
|
55
|
+
destroy: destroy
|
56
|
+
};
|
57
|
+
|
58
|
+
})(window.app, window.kea, ko);
|