faalis 0.25.1 → 0.26.0

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: 92d6f9b183ece15b72ef85fb3b1c41acb5b83dc3
4
- data.tar.gz: b55b02c4d5ac355ab244fa64dddba6250631c730
3
+ metadata.gz: 43f7695840d9c906e726d44dc7e73ab16f288c67
4
+ data.tar.gz: 9bf0ceb04ac7ea42f538686101dd9aba081f6364
5
5
  SHA512:
6
- metadata.gz: 2a0cb0d117abe8798a466bf7cbab923d0dcff029c66f6782935e62c11ffd31f02910671f989fb058efe1240fd66f4b56781ef68f1774117bd914495619b8b954
7
- data.tar.gz: 489820dd820ecef13793baf510587918702649d1d40362aa842bf945119093bc89c6ccf8f70bdb534eeaa4b4f6536da25c66cffcf74827e8c83f4e15218c7a19
6
+ metadata.gz: 3ab3a88bbd4d6cf47859004bef759b84926402b97f74c5fc47bff8fdca298d455844a2666f0e5acffc73702982fea0e0010a0f074bb8e7a6c833a46a167e37cb
7
+ data.tar.gz: 1da96282c9542e22dcd07db980457d1c3c8009d617e2a332d1341a01aca7c3b0307d3603c329a4b4f2b47c9af4967494849c3528d5f75f63d2102151bd97bd49
@@ -2,8 +2,10 @@
2
2
  //= require jquery
3
3
  //= require jquery_ujs
4
4
  //= require foundation
5
- //= require faalis/dashboard/lib/angular
6
- //= require faalis/dashboard/lib/angular-route
7
- //= require faalis/dashboard/lib/angular-animate
5
+ //= require angular
6
+ //= require angular-animate
7
+ //= require angular-resource
8
+ //= require angular-route
9
+ //= require angular-sanitize
8
10
  //= require faalis/dashboard/lib/angular-gettext
9
11
  //= require faalis/dashboard/lib/lodash.underscore
@@ -10,6 +10,7 @@
10
10
  // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
+ //= require faalis/angular-manifest
13
14
  //= require_tree ./lib
14
15
  //= require faalis/dashboard/init
15
16
  //= require faalis/dashboard/app
@@ -7,11 +7,12 @@
7
7
 
8
8
  table{
9
9
  th{
10
- text-align:center !important;
10
+ text-align: center !important;
11
+ margin: 0;
11
12
  }
12
- width:90%;
13
- margin-left:auto ;
14
- margin-right:auto ;
13
+ width: 90%;
14
+ margin-left: auto;
15
+ margin-right: auto;
15
16
  }
16
17
 
17
18
  .warning{
@@ -16,78 +16,78 @@ body {
16
16
  }
17
17
 
18
18
  header {
19
- background: white;
20
- border-bottom: 1px solid $orange;
21
- position: fixed;
22
- z-index: 1000;
23
- height: $header-height;
24
- width: 100%;
25
- ul {
26
- list-style: none;
27
-
28
- li {
29
- display: inline;
30
- h1 {
31
- font-size: 1.5em;
32
- display: inline-block;
33
- font-weight: 300;
34
- color: $darkgray;
35
- }
36
- .search {
37
- display: inline-block;
38
- padding: 0 10px;
39
- input {
40
- display: inline-block;
41
- border-radius: 4px;
42
- border-color: $lightergray;
43
- box-shadow: none;
44
- padding: 0 0.5em;
45
- }
46
- }
47
- }
48
- }
19
+ background: white;
20
+ border-bottom: 1px solid $orange;
21
+ position: fixed;
22
+ z-index: 1000;
23
+ height: $header-height;
24
+ width: 100%;
25
+ ul {
26
+ list-style: none;
49
27
 
50
- nav {
51
- ul {
52
28
  li {
53
- display: inline-block;
54
- padding: (($header-height / 4) - 3px) 20px 0 ;
55
- height: $header-height;
56
- margin: 0 5px;
57
-
58
- &:not(.staticitem):hover {
59
- border-bottom: 5px solid $alizarin;
60
- }
61
- span {
62
- vertical-align: middle;
63
- color: $darkgray;
64
- cursor:pointer;
65
- font-size: 1.2em;
66
- }
29
+ display: inline;
30
+ h1 {
31
+ font-size: 1.5em;
32
+ display: inline-block;
33
+ font-weight: 300;
34
+ color: $darkgray;
35
+ }
36
+ .search {
37
+ display: inline-block;
38
+ padding: 0 10px;
39
+ input {
40
+ display: inline-block;
41
+ border-radius: 4px;
42
+ border-color: $lightergray;
43
+ box-shadow: none;
44
+ padding: 0 0.5em;
45
+ }
46
+ }
47
+ }
48
+ }
67
49
 
50
+ nav {
51
+ ul {
52
+ li {
53
+ display: inline-block;
54
+ padding: (($header-height / 4) - 3px) 20px 0 ;
55
+ height: $header-height;
56
+ margin: 0 5px;
57
+
58
+ &:not(.staticitem):hover {
59
+ border-bottom: 5px solid $alizarin;
60
+ }
61
+ span {
62
+ vertical-align: middle;
63
+ color: $darkgray;
64
+ cursor:pointer;
65
+ font-size: 1.2em;
66
+ }
67
+
68
+ }
68
69
  }
69
- }
70
- }
71
-
72
- .subnav {
73
- background: $alizarin;
74
- position: fixed;
75
- top: $header-height;
76
- padding: 10px 20px;
77
- border-radius: 0 0 5px 5px;
78
- min-width: 100px;
79
- color: white;
80
- ul li {
81
- padding: 4px 10px;
82
- a {
83
- color: lighten($lightergray, 5%);
84
- text-shadow: 0 1px 1px $darkgray;
85
- &:hover {
86
- color: white;
87
- }
70
+ }
71
+
72
+ .subnav {
73
+ background: $alizarin;
74
+ position: fixed;
75
+ top: $header-height;
76
+ padding: 10px 20px;
77
+ border-radius: 0 0 5px 5px;
78
+ min-width: 100px;
79
+ color: white;
80
+ ul li {
81
+ padding: 4px 10px;
82
+ a {
83
+ color: lighten($lightergray, 5%);
84
+ text-shadow: 0 1px 1px $darkgray;
85
+ &:hover {
86
+ color: white;
87
+ }
88
+ }
88
89
  }
89
- }
90
- }
90
+ }
91
91
  }
92
92
 
93
93
 
@@ -126,105 +126,117 @@ ul{
126
126
  }
127
127
 
128
128
  }
129
- &.whitewidget {
130
- background: white;
131
- }
129
+ &.whitewidget {
130
+ background: white;
131
+ }
132
132
  }
133
133
 
134
134
  fieldset {
135
- label {
136
- padding: 0px 0px 5px 0px;
137
- }
138
- .permissions {
139
- margin: 0 10px;
140
-
141
- .field {
142
- height: 16em;
143
- border: 1px solid $lightergray;
144
- color: $darkgray;
145
-
146
- padding: 5px 10px;
147
- overflow-y: auto;
148
- ul {
149
- list-style: none;
150
- li {
151
- cursor: pointer;
152
- i.green-text {
153
- color: $emerald;
154
- }
155
- }
135
+ label {
136
+ padding: 0px 0px 5px 0px;
137
+ }
138
+ .permissions {
139
+ margin: 0 10px;
140
+
141
+ .field {
142
+ height: 16em;
143
+ border: 1px solid $lightergray;
144
+ color: $darkgray;
145
+
146
+ padding: 5px 10px;
147
+ overflow-y: auto;
148
+ ul {
149
+ list-style: none;
150
+ li {
151
+ cursor: pointer;
152
+ i.green-text {
153
+ color: $emerald;
154
+ }
155
+ }
156
+ }
156
157
  }
157
- }
158
- }
158
+ }
159
159
  }
160
160
 
161
161
  .dashboard-body {
162
- padding-top: $header-height + 20px;
162
+ padding-top: $header-height + 20px;
163
163
  }
164
164
 
165
165
  .buttons-header {
166
- span {
167
- margin: 5px 5px 5px;
168
- }
166
+ span {
167
+ margin: 5px 5px 5px;
168
+ }
169
169
  }
170
170
 
171
171
  .input-error {
172
- border-color: $alizarin !important;
172
+ border-color: $alizarin !important;
173
173
  }
174
174
 
175
175
  // Tabs --------------------------------------------------------
176
176
  @mixin active-tab ($color){
177
- border-bottom: $tab-bottom-border solid $color;
177
+ border-bottom: $tab-bottom-border solid $color;
178
178
  }
179
179
 
180
180
  .tabs {
181
- width: 100%;
182
- background: #fff;
183
- border-radius: 4px;
184
- border: 1px solid $lightergray;
185
- border-bottom: $tab-bottom-border solid $lightgray;
186
- padding: 0 10px;
187
- font-size: 14px;
188
- height: $tabs-height;
189
- color: $lightergray;
190
- ul {
191
- list-style: none;
192
-
193
- li {
194
- color: $darkgray;
195
- display: inline-block;
196
- position: relative;
197
- padding: 10px 20px;
198
- cursor: pointer;
199
- height: $tabs-height - 1px;
200
-
201
- &.active {
202
- &.tab1{
203
- @include active-tab($emerald);
204
- }
205
- &.tab2{
206
- @include active-tab($alizarin);
207
- }
208
- &.tab3{
209
- @include active-tab($peter_river);
210
- }
211
- &.tab4{
212
- @include active-tab($orange);
213
- }
181
+ width: 100%;
182
+ background: #fff;
183
+ border-radius: 4px;
184
+ border: 1px solid $lightergray;
185
+ border-bottom: $tab-bottom-border solid $lightgray;
186
+ padding: 0 10px;
187
+ font-size: 14px;
188
+ height: $tabs-height;
189
+ color: $lightergray;
190
+ ul {
191
+ list-style: none;
214
192
 
193
+ li {
194
+ color: $darkgray;
195
+ display: inline-block;
196
+ position: relative;
197
+ padding: 10px 20px;
198
+ cursor: pointer;
199
+ height: $tabs-height - 1px;
200
+
201
+ &.active {
202
+ &.tab1{
203
+ @include active-tab($emerald);
204
+ }
205
+ &.tab2{
206
+ @include active-tab($alizarin);
207
+ }
208
+ &.tab3{
209
+ @include active-tab($peter_river);
210
+ }
211
+ &.tab4{
212
+ @include active-tab($orange);
213
+ }
214
+
215
+ }
215
216
  }
216
- }
217
- }
217
+ }
218
218
  }
219
219
 
220
220
 
221
221
  .filter_box {
222
- fieldset {
223
- background: $peter_river;
224
- border-color: darken($peter_river, 5%);
225
- }
222
+ fieldset {
223
+ background: $peter_river;
224
+ border-color: darken($peter_river, 5%);
225
+ }
226
226
  }
227
227
 
228
228
  .nonestyle {
229
229
  list-style: none;
230
230
  }
231
+
232
+ .fancy_table {
233
+ border: 1px solid $lightergray;
234
+ padding: 0px 0px !important;
235
+ thead {
236
+ tr {
237
+ th {
238
+ padding: 0;
239
+ }
240
+ }
241
+ }
242
+ }
@@ -16,129 +16,132 @@
16
16
  # with this program; if not, write to the Free Software Foundation, Inc.,
17
17
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
18
  # -----------------------------------------------------------------------------
19
- require_dependency "faalis/api_controller"
19
+ require_dependency 'faalis/api_controller'
20
20
 
21
+ module Faalis
22
+ # This class is the base class of all API controllers in any **Faalis**
23
+ # host applications. Each host Rails application should have an `APIController`
24
+ # which inherit from this class.
25
+ class APIController < Faalis::ApplicationController
21
26
 
22
- # This class is the base class of all API controllers in any **Faalis**
23
- # host applications. Each host Rails application should have an `APIController`
24
- # which inherit from this class.
25
- class Faalis::APIController < Faalis::ApplicationController
27
+ # Only support `json` format
28
+ respond_to :json
26
29
 
27
- @@allowed_fields = []
30
+ # Authenticate user before any action take place
31
+ before_filter :authenticate_filter
28
32
 
29
- # Only support `json` format
30
- respond_to :json
33
+ # Check for any presence of filtering query, In querystring and load
34
+ # resource using them
35
+ before_filter :load_resource_by_query, :only => [:index]
31
36
 
32
- # Authenticate user before any action take place
33
- before_filter :authenticate_filter
37
+ protect_from_forgery
34
38
 
35
- # Check for any presence of filtering query, In querystring and load
36
- # resource using them
37
- before_filter :load_resource_by_query, :only => [:index]
39
+ # Set csrf cookie after any action
40
+ after_filter :set_csrf_cookie_for_ng
38
41
 
42
+ # Rescue from any access denied exception raised from cancan and
43
+ # returns a useful error message in json
44
+ rescue_from CanCan::AccessDenied do |exception|
45
+ render :status => 403, :json => {
46
+ :error => _('You don\'t have access to this page'),
47
+ :orig_msg => exception.message,
48
+ :action => exception.action
49
+ }
50
+ end
39
51
 
40
- protect_from_forgery
41
-
42
- # Set csrf cookie after any action
43
- after_filter :set_csrf_cookie_for_ng
44
-
45
- # Rescue from any access denied exception raised from cancan and
46
- # returns a useful error message in json
47
- rescue_from CanCan::AccessDenied do |exception|
48
-
49
- render :status => 403, :json => {
50
- :error => _("You don't have access to this page"),
51
- :orig_msg => exception.message,
52
- :action => exception.action,
53
- }
54
- end
55
-
56
- def set_csrf_cookie_for_ng
57
- cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
58
- end
59
-
60
- # User authentication for API services take place here. By default
61
- # **Faalis** uses the authentication method of **Devise** to authenticate
62
- # access to API service.
63
- #
64
- # If you want to change authentication method ? just override this method
65
- # in you **APIController**
66
- def authenticate_filter
67
- authenticate_user!
68
- end
52
+ def set_csrf_cookie_for_ng
53
+ cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
54
+ end
69
55
 
70
- # Load resource by using parameters specified in querystring.
71
- def load_resource_by_query
72
- # If any query string parameter provided and allow fields specified
73
- if not request.query_parameters.empty? and not allowed_fields.empty?
74
-
75
- logger.info ("Load resource by query parameters")
76
- # Iterate over parameters in query string
77
- request.query_parameters.each do |key, value|
78
- # each key can be like filename[__querytype]=value
79
- # which `querytype` is string that specify the query type scope
80
- # to use in model. For example these is a query type scope called
81
- # `gt` which mean the mentioned field should be greater than the
82
- # value
83
- field, query_type = key.split("__")
84
-
85
- if allowed_fields.include? field
86
- # If field name is in the allowed list
87
- # If no query type specified we will use assignment scope.
88
- if query_type.nil?
89
- query_type = "assignment"
90
- end
56
+ # User authentication for API services take place here. By default
57
+ # **Faalis** uses the authentication method of **Devise** to authenticate
58
+ # access to API service.
59
+ #
60
+ # If you want to change authentication method ? just override this method
61
+ # in you **APIController**
62
+ def authenticate_filter
63
+ authenticate_user!
64
+ end
91
65
 
92
- # If model have an scope with the "#{query_type}_query" name.
93
- # Otherwise skip
94
- if model_class.respond_to? "#{query_type}_query"
66
+ # Load resource by using parameters specified in querystring.
67
+ def load_resource_by_query
68
+ # If any query string parameter provided and allow fields specified
69
+ if !request.query_parameters.empty? && !allowed_fields.empty?
70
+
71
+ logger.info ('Load resource by query parameters')
72
+ # Iterate over parameters in query string
73
+ request.query_parameters.each do |key, value|
74
+ # each key can be like filename[__querytype]=value
75
+ # which `querytype` is string that specify the query type scope
76
+ # to use in model. For example these is a query type scope called
77
+ # `gt` which mean the mentioned field should be greater than the
78
+ # value
79
+ field, query_type = key.split('__')
80
+
81
+ if allowed_fields.include? field
82
+ # If field name is in the allowed list
83
+ # If no query type specified we will use assignment scope.
84
+ query_type = 'assignment' if query_type.nil?
85
+
86
+ # If model have an scope with the "#{query_type}_query" name.
87
+ # Otherwise skip
88
+ if model_class.respond_to? "#{query_type}_query"
89
+
90
+ # If resource already loaded. If there was a instnace variable
91
+ # with the plural name of the resource exists then resource
92
+ # already loaded and we should chain new conditions
93
+ if instance_variable_defined? "@#{controller_name}"
94
+ var = instance_variable_get("@#{controller_name}")
95
+ var.send("#{query_type}_query".to_sym, field, value)
96
+ else
97
+ # Resource did not loaded we make first query
98
+ # (without touching database) and set the corresponding
99
+ # instance variables
100
+ relation_object = model_class.send("#{query_type}_query".to_sym,
101
+ field, value)
102
+ instance_variable_set("@#{controller_name}", relation_object)
103
+ end
95
104
 
96
- # If resource already loaded. If there was a instnace variable
97
- # with the plural name of the resource exists then resource
98
- # already loaded and we should chain new conditions
99
- if instance_variable_defined? "@#{controller_name}"
100
- instance_variable_get("@#{controller_name}").send("#{query_type}_query".to_sym, field, value)
101
105
  else
102
- # Resource did not loaded we make first query
103
- # (without touching database) and set the corresponding
104
- # instance variables
105
- relation_object = model_class.send("#{query_type}_query".to_sym, field, value)
106
- instance_variable_set("@#{controller_name}", relation_object)
106
+ logger.info "There is no `#{query_type}_query` in `#{model_class.to_s}` model."
107
107
  end
108
-
109
108
  else
110
- logger.info "There is no `#{query_type}_query` in `#{model_class.to_s}` model."
109
+ logger.warn "`#{field}` in not in allowed list for `#{self.class.to_s}`."
111
110
  end
112
- else
113
- logger.warn "`#{field}` in not in allowed list for `#{self.class.to_s}`."
114
111
  end
112
+ else
113
+ logger.info('Load resource using `load_resource`')
114
+ #self.class.load_resource
115
115
  end
116
- else
117
- logger.info("Load resource using `load_resource`")
118
- #self.class.load_resource
119
116
  end
120
- end
121
117
 
122
- # An array of allowed fields for query loading
123
- def allowed_fields
124
- @@allowed_fields
125
- end
118
+ # This attribute holds the allowed fileds which we will allow for
119
+ # making query
120
+ def allowed_fields
121
+ return allowed_query_on if self.respond_to?(:allowed_query_on, true)
122
+ @allowed_fields || []
123
+ end
126
124
 
127
- # Using this query you can activate the query loading system
128
- # and specify fields which you want to use in query loading
129
- def self.allow_query_on(*args)
130
- @@allowed_fields = args.to_a.collect { |x| x.to_s }
131
- end
125
+ # Using this query you can activate the query loading system
126
+ # and specify fields which you want to use in query loading
127
+ def self.allow_query_on(*args)
128
+ #instance_variable_set(:@allowed_fields, args.to_a.collect { |x| x.to_s })
129
+ define_method :allowed_query_on do
130
+ args.to_a.collect { |x| x.to_s }
131
+ end
132
+ private :allowed_query_on
133
+ end
132
134
 
133
- protected
135
+ protected
134
136
 
135
- # Model class related to this controller.
136
- def model_class
137
- controller_name.singularize.classify.constantize
138
- end
137
+ # Model class related to this controller.
138
+ def model_class
139
+ controller_name.singularize.classify.constantize
140
+ end
139
141
 
140
- def verified_request?
141
- super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
142
- end
142
+ def verified_request?
143
+ super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
144
+ end
143
145
 
146
+ end
144
147
  end