faalis 0.7.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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}