faalis 0.7.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/faalis/dashboard/app.js +24 -9
  3. data/app/assets/javascripts/faalis/dashboard/application.js.erb +0 -1
  4. data/app/assets/javascripts/faalis/dashboard/functions.js.erb +4 -0
  5. data/app/assets/javascripts/faalis/dashboard/modules/anim.js +1 -1
  6. data/app/assets/javascripts/faalis/dashboard/modules/conversations.js +180 -0
  7. data/app/assets/javascripts/faalis/dashboard/modules/fields/boolean.js +49 -0
  8. data/app/assets/javascripts/faalis/dashboard/modules/fields/datetime.js +50 -0
  9. data/app/assets/javascripts/faalis/dashboard/modules/fields/fields.js +1 -0
  10. data/app/assets/javascripts/faalis/dashboard/modules/fields/integer.js +50 -0
  11. data/app/assets/javascripts/faalis/dashboard/modules/fields/relation.js +78 -0
  12. data/app/assets/javascripts/faalis/dashboard/modules/fields/string.js +49 -0
  13. data/app/assets/javascripts/faalis/dashboard/modules/fields/text.js +50 -0
  14. data/app/assets/javascripts/faalis/dashboard/modules/list-view.js +14 -1
  15. data/app/assets/javascripts/faalis/dashboard/modules/nav.js.erb +1 -1
  16. data/app/assets/javascripts/faalis/dashboard/modules/permissions.js +71 -0
  17. data/app/assets/javascripts/faalis/dashboard/variables.js.erb +2 -0
  18. data/app/assets/stylesheets/faalis/base.css.scss +28 -0
  19. data/app/controllers/faalis/api/v1/conversations_controller.rb +92 -0
  20. data/app/controllers/faalis/api/v1/permissions_controller.rb +39 -3
  21. data/app/controllers/faalis/dashboard_controller.rb +18 -1
  22. data/app/models/faalis/permissions/auth.rb +3 -0
  23. data/app/models/faalis/user.rb +3 -0
  24. data/app/views/angularjs_templates/auth/groups/new.html +7 -3
  25. data/app/views/angularjs_templates/auth/users/details.html +1 -1
  26. data/app/views/angularjs_templates/auth/users/new.html +4 -3
  27. data/app/views/angularjs_templates/conversations/details.html +18 -0
  28. data/app/views/angularjs_templates/conversations/index.html +6 -0
  29. data/app/views/angularjs_templates/conversations/new.html +39 -0
  30. data/app/views/angularjs_templates/conversations/show.html +6 -0
  31. data/app/views/angularjs_templates/conversations/show_details.html +18 -0
  32. data/app/views/angularjs_templates/fields/boolean/boolean.html +4 -0
  33. data/app/views/angularjs_templates/fields/datetime/datetime.html +4 -0
  34. data/app/views/angularjs_templates/fields/integer/integer.html +4 -0
  35. data/app/views/angularjs_templates/fields/relation/relation.html +28 -0
  36. data/app/views/angularjs_templates/fields/string/string.html +4 -0
  37. data/app/views/angularjs_templates/fields/text/text.html +4 -0
  38. data/app/views/angularjs_templates/list-view/index.html +1 -1
  39. data/app/views/angularjs_templates/modules.html +2 -2
  40. data/app/views/faalis/api/v1/conversations/create.json.jbuilder +1 -0
  41. data/app/views/faalis/api/v1/conversations/index.json.jbuilder +1 -0
  42. data/app/views/faalis/api/v1/conversations/show.json.jbuilder +10 -0
  43. data/app/views/faalis/api/v1/permissions/user_permissions.json.jbuilder +1 -0
  44. data/app/views/layouts/faalis/dashboard.html.erb +1 -1
  45. data/config/routes.rb +13 -2
  46. data/db/migrate/{20131013091000_devise_create_red_base_users.rb → 20131013091000_devise_create_faalis_users.rb} +0 -0
  47. data/db/migrate/{20131020124701_create_red_base_groups.rb → 20131020124701_create_faalis_groups.rb} +0 -0
  48. data/db/migrate/{20131021170923_create_red_base_permissions.rb → 20131021170923_create_faalis_permissions.rb} +0 -0
  49. data/db/seeds.rb +2 -0
  50. data/lib/faalis.rb +1 -0
  51. data/lib/faalis/active_record.rb +1 -56
  52. data/lib/faalis/engine.rb +1 -0
  53. data/lib/faalis/permissions.rb +65 -0
  54. data/lib/faalis/version.rb +1 -1
  55. data/lib/generators/faalis/install_generator.rb +4 -0
  56. data/lib/generators/faalis/js_scaffold_generator.rb +27 -8
  57. data/lib/generators/faalis/templates/angularjs/module.js.erb +11 -7
  58. data/lib/generators/faalis/templates/angularjs/new.html.erb +35 -78
  59. metadata +51 -11
  60. data/app/views/angularjs_templates/#index.html# +0 -8
@@ -0,0 +1,49 @@
1
+ /* -----------------------------------------------------------------------------
2
+ Red Base - Basic website skel engine
3
+ Copyright (C) 2012-2014 Yellowen
4
+
5
+ This program is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along
16
+ with this program; if not, write to the Free Software Foundation, Inc.,
17
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ ----------------------------------------------------------------------------- */
19
+
20
+ var String_ = angular.module("StringField", []);
21
+
22
+ /*
23
+ * <string-field></string-field> directive defination
24
+ */
25
+ String_.directive('stringField', ["$filter", "gettext", function($filter, gettext) {
26
+
27
+ function link(scope, element, attrs){
28
+ var ltr = is_ltr();
29
+ scope.element_id = "id_" + scope.field;
30
+ scope.msg_element_id = "id_" + scope.field + "_msg";
31
+ }
32
+ // Actual object of <string-field> directive
33
+ return {
34
+ templateUrl: template("fields/string/string"),
35
+ replace: true,
36
+ restrict: "E",
37
+ scope: {
38
+ cssClasses: '=cssClass',
39
+
40
+ // fieldname
41
+ field: "=fieldName",
42
+ // Does this field is required
43
+ required: "=",
44
+ // Actual Angularjs ng-model
45
+ model: '='
46
+ },
47
+ link: link
48
+ };
49
+ }]);
@@ -0,0 +1,50 @@
1
+ /* -----------------------------------------------------------------------------
2
+ Red Base - Basic website skel engine
3
+ Copyright (C) 2012-2014 Yellowen
4
+
5
+ This program is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along
16
+ with this program; if not, write to the Free Software Foundation, Inc.,
17
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ ----------------------------------------------------------------------------- */
19
+
20
+ var Text_ = angular.module("TextField", []);
21
+
22
+ /*
23
+ * <string-field></string-field> directive defination
24
+ */
25
+ Text_.directive('textField', ["$filter", "gettext", function($filter, gettext) {
26
+
27
+ function link(scope, element, attrs){
28
+ var ltr = is_ltr();
29
+ scope.element_id = "id_" + scope.field;
30
+ scope.msg_element_id = "id_" + scope.field + "_msg";
31
+ }
32
+ // Actual object of <string-field> directive
33
+ return {
34
+ templateUrl: template("fields/text/text"),
35
+ replace: true,
36
+ restrict: "E",
37
+ transclude: true,
38
+ scope: {
39
+ cssClasses: '=cssClass',
40
+
41
+ // fieldname
42
+ field: "=fieldName",
43
+ // Does this field is required
44
+ required: "=",
45
+ // Actual Angularjs ng-model
46
+ model: '='
47
+ },
48
+ link: link
49
+ };
50
+ }]);
@@ -61,9 +61,21 @@ ListView.directive('listView', ["$filter", "gettext", function($filter, gettext)
61
61
  scope.list_view = true;
62
62
  scope.grid_view = false;
63
63
 
64
+ scope.title = function(object, t) {
65
+ if (typeof(scope.title_attr) == "function") {
66
+ return scope.title_attr(object);
67
+ }
68
+ return object[scope.title_attr];
69
+ };
70
+
64
71
  var filtered_objects = function(){
65
72
  var filterby = {};
66
- filterby[scope.title_attr] = scope.searchterm;
73
+ if (typeof(scope.title_attr) == "function") {
74
+ filterby = scope.title_attr;
75
+ }
76
+ else {
77
+ filterby[scope.title_attr] = scope.searchterm;
78
+ }
67
79
  var result = $filter('filter')(scope.objects, filterby, function(expected, actual){
68
80
  var re = new RegExp(".*" + actual + ".*", "ig");
69
81
  scope.go_to_first_page();
@@ -75,6 +87,7 @@ ListView.directive('listView', ["$filter", "gettext", function($filter, gettext)
75
87
  // TODO: Double check this or condition
76
88
  return result || [];
77
89
  };
90
+
78
91
  scope.grid_options = {
79
92
  data: 'objects',
80
93
  headerRowHeight: 30,
@@ -25,7 +25,7 @@ Nav.controller("NavigationController", ["$location", "gettext", "$interval", fu
25
25
  {
26
26
  title: gettext("Messages"),
27
27
  icon: "fa fa-comments",
28
- url: "/user/comments"
28
+ url: "/conversations/inbox"
29
29
  },
30
30
  {
31
31
  title: gettext("Languages"),
@@ -0,0 +1,71 @@
1
+ /* -----------------------------------------------------------------------------
2
+ Red Base - Basic website skel engine
3
+ Copyright (C) 2012-2014 Yellowen
4
+
5
+ This program is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along
16
+ with this program; if not, write to the Free Software Foundation, Inc.,
17
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ ----------------------------------------------------------------------------- */
19
+
20
+ var Perm = angular.module("Permissions", []);
21
+
22
+ Perm.factory('UserPermissions', ["$rootScope", function ($rootScope) {
23
+ var permissionList;
24
+ return {
25
+ set_permissions: function(permissions) {
26
+ PERMISSIONS = permissions;
27
+ $rootScope.$broadcast('permissions_changed');
28
+ },
29
+
30
+ /*
31
+ * Check if user has specific permission on an object
32
+ */
33
+ can: function(action, model) {
34
+ if (model in PERMISSIONS) {
35
+ if (_.indexOf(PERMISSIONS[model], action) !== -1) {
36
+ //console.log("User can " + action + " " + model);
37
+ return true;
38
+ }
39
+ }
40
+ //console.log("User can't " + action + " " + model);
41
+ return false;
42
+
43
+ },
44
+ /*
45
+ * Check if user has specific permission on an object
46
+ */
47
+ can_not: function(action, model) {
48
+ return ! this.can(action,model);
49
+ }
50
+
51
+ };
52
+ }]);
53
+
54
+ Perm.directive('ifUser', ["UserPermissions", function(User) {
55
+
56
+ function link(scope, element, attrs) {
57
+ if (scope.value) {
58
+ element.show();
59
+ }
60
+ else {
61
+ element.hide();
62
+ }
63
+ }
64
+ return {
65
+ restrict: "A",
66
+ scope: {
67
+ value: "=ifUser"
68
+ },
69
+ link: link
70
+ };
71
+ }]);
@@ -1,6 +1,8 @@
1
1
  //<% environment.context_class.instance_eval { include ActionView::Helpers::UrlHelper } %>
2
2
  //<% url = Faalis::Engine.routes.url_helpers %>
3
3
 
4
+ // User Permissions
5
+ window.PERMISSIONS = [];
4
6
  // Prefix url of API
5
7
  window.API_PREFIX = "/api/v1/";
6
8
  // Modules is an array of dashboard modules
@@ -262,3 +262,31 @@ input {
262
262
  .inline {
263
263
  display: inline;
264
264
  }
265
+
266
+ small.error {
267
+ margin-top: 1em !important;
268
+ border-radius: 3px;
269
+ }
270
+
271
+ .relation_links {
272
+ span {
273
+ font-size: 0.8em;
274
+ padding: 2px 5px;
275
+ color: $darkgray;
276
+ cursor: pointer;
277
+ opacity: 0.3;
278
+ @include transition(opacity 300ms linear 0ms);
279
+ &:hover {
280
+ opacity: 1;
281
+ @include transition(opacity 300ms linear 0ms);
282
+ }
283
+ a {
284
+ opacity: 0.4;
285
+ @include transition(opacity 300ms linear 0ms);
286
+ &:hover {
287
+ opacity: 1;
288
+ @include transition(opacity 300ms linear 0ms);
289
+ }
290
+ }
291
+ }
292
+ }
@@ -0,0 +1,92 @@
1
+ require_dependency "faalis/application_controller"
2
+
3
+ module Faalis
4
+ class API::V1::ConversationsController < APIController
5
+ before_filter :authenticate_user!
6
+ helper_method :mailbox, :conversation
7
+
8
+ def create
9
+ recipient_emails = conversation_params(:recipients).split(',')
10
+ recipients = User.where(email: recipient_emails).all
11
+
12
+ @conversation = current_user.
13
+ send_message(recipients, *conversation_params(:body, :subject)).conversation
14
+
15
+ respond_with(@conversation)
16
+ end
17
+
18
+ def reply
19
+ current_user.reply_to_conversation(conversation, *message_params(:body, :subject))
20
+ respond_to conversation
21
+ end
22
+
23
+ def trash
24
+ conversation.move_to_trash(current_user)
25
+ redirect_to :conversations
26
+ end
27
+
28
+ def untrash
29
+ conversation.untrash(current_user)
30
+ redirect_to :conversations
31
+ end
32
+
33
+ def index
34
+ if params[:box] == "inbox"
35
+ box = "inbox"
36
+ elsif params[:box] == "sentbox"
37
+ box = "sentbox"
38
+ elsif params[:box] == "trash"
39
+ box = "trash"
40
+ else
41
+ respond_to do |f|
42
+ f.any { head :not_found }
43
+ end
44
+ return
45
+ end
46
+ # puts current_user.mailbox.sent.to_json
47
+ @mailbox ||= current_user.mailbox.send(box.to_sym)
48
+ respond_with @mailbox
49
+ end
50
+
51
+
52
+ def show
53
+ #def conversation
54
+ @conversations ||= current_user.mailbox.conversations.find(params[:id])
55
+ #binding.pry
56
+ # @conversation = {}
57
+ # conversations.each do |conversation|
58
+ # tmp = {
59
+ # :receipts => conversation.receipts,
60
+ # :body => conversation.messages.body,
61
+ # :is_read => conversation.is_read,
62
+ # :trashed => conversation.trashed,
63
+ # :deleted => conversation.deleted,
64
+ # :recipients => conversation.recipients
65
+ # }
66
+ #unless @conversation.include? conversation.id
67
+ # @conversation[conversation.id] = tmp
68
+ #end
69
+ #end
70
+
71
+ end
72
+ private
73
+ def conversation_params(*keys)
74
+ #binding.pry
75
+ fetch_params(:conversation, *keys)
76
+ end
77
+
78
+ def message_params(*keys)
79
+ fetch_params(:message, *keys)
80
+ end
81
+
82
+ def fetch_params(key, *subkeys)
83
+ params[key].instance_eval do
84
+ case subkeys.size
85
+ when 0 then self
86
+ when 1 then self[subkeys.first]
87
+ else subkeys.map{|k| self[k] }
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,17 +1,53 @@
1
1
  require_dependency "faalis/application_controller"
2
2
 
3
3
  module Faalis
4
- class API::V1::PermissionsController < ApplicationController
4
+ class API::V1::PermissionsController < APIController
5
5
 
6
- # GET /api/v1/groups
6
+ class DummyPerm
7
+ attr_accessor :model, :permission_type
8
+ end
9
+
10
+ # @api GET permissions
11
+ # @return All permissions
7
12
  def index
8
13
  @permissions = []
9
14
 
10
15
  Faalis::Engine.models_with_permission.each do |model|
11
16
  model = Object.const_get(model)
12
- @permissions.concat(model::Permissions.permission_strings(model))
17
+ @permissions.concat(model.permission_strings(model))
13
18
  end
19
+ respond_with(@permissions)
20
+ end
14
21
 
22
+ # @api GET permissions/user
23
+ # @return current user permissions
24
+ def user_permissions
25
+ @permissions = {}
26
+ perms = []
27
+ if current_user.group_id == 1
28
+ # Generate all possible permissions for admin group
29
+ Faalis::Engine.models_with_permission.each do |model|
30
+ Object.const_get(model).possible_permissions.each do |p|
31
+ perm = DummyPerm.new
32
+ perm.model = model
33
+ perm.permission_type = p
34
+ perms << perm
35
+ end
36
+ end
37
+ else
38
+ perms = current_user.group.permissions
39
+ end
40
+
41
+ # Generate a suitable Hash for permissions
42
+ perms.each do |perm|
43
+ if @permissions.include? perm.model
44
+ @permissions[perm.model] << perm.permission_type.to_s
45
+ else
46
+ @permissions[perm.model] = [perm.permission_type.to_s]
47
+ end
48
+ end
49
+ respond_with(@permissions)
15
50
  end
51
+
16
52
  end
17
53
  end
@@ -1,5 +1,6 @@
1
1
  require_dependency "faalis/application_controller"
2
2
 
3
+
3
4
  module Faalis
4
5
  class DashboardController < ApplicationController
5
6
 
@@ -24,7 +25,6 @@ module Faalis
24
25
 
25
26
  def modules
26
27
  dashboard_modules = []
27
-
28
28
  Faalis::Engine.dashboard_modules.each do |module_name, attrs|
29
29
  if not attrs.include? :title
30
30
  attrs[:title] = _(module_name.to_s)
@@ -34,6 +34,23 @@ module Faalis
34
34
  attrs[:resource] = module_name.to_s
35
35
  end
36
36
 
37
+ # If class did not given by user in settings
38
+ # Faalis tries to guess the class name
39
+ if not attrs.include? :model
40
+ begin
41
+ klass = attrs[:resource].camelize.constantize
42
+
43
+ if klass.respond_to? :possible_permissions
44
+ attrs[:model] = attrs[:resource].camelize
45
+ else
46
+ attrs[:model] = ""
47
+ end
48
+
49
+ rescue NameError
50
+ attrs[:model] = ""
51
+ end
52
+ end
53
+
37
54
  dashboard_modules << attrs
38
55
  end
39
56
  dashboard_modules = {:modules => dashboard_modules}