faalis 0.16.3 → 0.17.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.
- checksums.yaml +4 -4
- data/app/views/angularjs_templates/modules.html +1 -1
- data/lib/faalis.rb +2 -0
- data/lib/faalis/generators.rb +1 -0
- data/lib/faalis/generators/concerns.rb +9 -0
- data/lib/faalis/generators/concerns/angular.rb +31 -0
- data/lib/faalis/generators/concerns/bulk.rb +36 -0
- data/lib/faalis/generators/concerns/dependency.rb +14 -0
- data/lib/faalis/generators/concerns/menu.rb +29 -0
- data/lib/faalis/generators/concerns/parent.rb +35 -0
- data/lib/faalis/generators/concerns/required.rb +22 -0
- data/lib/faalis/generators/concerns/resource_fields.rb +82 -0
- data/lib/faalis/generators/concerns/resource_name.rb +42 -0
- data/lib/faalis/generators/concerns/tabs.rb +40 -0
- data/lib/faalis/generators/dashboard_scaffold.rb +35 -0
- data/lib/faalis/generators/fields/relation.rb +28 -0
- data/lib/faalis/version.rb +1 -1
- data/lib/generators/faalis/js/list_view_generator.rb +110 -0
- data/lib/generators/faalis/js_scaffold_generator.rb +4 -251
- data/lib/generators/faalis/templates/angularjs/module.js.erb +1 -1
- data/lib/generators/faalis/templates/js/list_view/README +31 -0
- data/lib/generators/faalis/templates/js/list_view/details.html.erb +20 -0
- data/lib/generators/faalis/templates/js/list_view/index.html.erb +62 -0
- data/lib/generators/faalis/templates/js/list_view/module.js.erb +333 -0
- data/lib/generators/faalis/templates/js/list_view/new.html.erb +62 -0
- metadata +338 -328
- data/app/assets/javascripts/faalis/dashboard/gen-doc.sh~ +0 -3
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +0 -15
- data/spec/dummy/tmp/ember-rails/ember-data.js +0 -10204
- data/spec/dummy/tmp/ember-rails/ember.js +0 -36991
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9807cff362df15212e7a19378f538630e0e31330
|
4
|
+
data.tar.gz: 37dec94839c443774bd2d51975eac9167fc01bf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa37de6cd8b841994610e12aebed1b751efd943e7a2035379c77cde818167952d0bb7706c3e84f0863bce0c3eb46e007507a2df4b3d73dca490f8e1b57f8cc94
|
7
|
+
data.tar.gz: 2ec9fd8f7f2577217e5911102bdb12043d5815bbbcda3e788c424be63a77aba57fbbe7d3481dfc186888b84a7a3a0cf736030ebba769d00df0fd1262480b6167
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<li ng-click="controller.on_click('/')"><p><i class="fa fa-dashboard"></i> <span translate>Dashboard</span></p></li>
|
4
4
|
|
5
|
-
<li data-ng-repeat="module in controller.modules"
|
5
|
+
<li data-ng-repeat="module in controller.modules">
|
6
6
|
<p ng-click="controller.view_menu(module)"><i class="{{ module.icon }}"></i> <span translate>{{ module.title }}</span></p>
|
7
7
|
<ul class="submenu slide" ng-if="module.show_menu">
|
8
8
|
<li ng-repeat="menu_item in module.menu_items" ng-click="controller.on_click(menu_item.url)"><span>{{ menu_item.title }}</span></li>
|
data/lib/faalis.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
require "faalis/generators/dashboard_scaffold"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require "faalis/generators/concerns/menu"
|
2
|
+
require "faalis/generators/concerns/dependency"
|
3
|
+
require "faalis/generators/concerns/bulk"
|
4
|
+
require "faalis/generators/concerns/required"
|
5
|
+
require "faalis/generators/concerns/parent"
|
6
|
+
require "faalis/generators/concerns/resource_fields"
|
7
|
+
require "faalis/generators/concerns/resource_name"
|
8
|
+
require "faalis/generators/concerns/angular"
|
9
|
+
require "faalis/generators/concerns/tabs"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Angular
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Path to js_scaffold target inside 'app/assets/javascripts/'
|
8
|
+
base.class_option :path, :type => :string, :default => "", :desc => "Path to js_scaffold target inside 'app/assets/javascripts/'"
|
9
|
+
|
10
|
+
# Path to js_scaffold target
|
11
|
+
base.class_option :raw_path, :type => :string, :default => "", :desc => "Path to js_scaffold target"
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
|
17
|
+
def angularjs_app_path
|
18
|
+
if options[:raw_path] != ""
|
19
|
+
options[:raw_path]
|
20
|
+
elsif options[:path] != ""
|
21
|
+
"app/assets/javascripts/#{options[:path]}/"
|
22
|
+
else
|
23
|
+
path = Faalis::Engine.dashboard_js_manifest.split("/")[0..-2].join("/")
|
24
|
+
"app/assets/javascripts/#{path}/"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Bulk
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Fields to use in in bulk edit, comma separated
|
8
|
+
base.class_option :bulk_fields, :type => :string, :default => "", :desc => "Fields to use in in bulk edit, comma separated"
|
9
|
+
|
10
|
+
# No bulk edit needed
|
11
|
+
base.class_option :no_bulk, :type => :boolean, :default => false, :desc => "No bulk edit needed"
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# Returns fields which is needed to be in bulk edit
|
17
|
+
def bulk_edit_fields
|
18
|
+
unless options[:bulk_fields].empty?
|
19
|
+
bfields = options[:bulk_fields].split(",")
|
20
|
+
fields_ = fields_hash
|
21
|
+
bfields.each do |f|
|
22
|
+
unless fields_.include? f
|
23
|
+
raise ::Exception.new "'#{f}' is not in scaffold fields."
|
24
|
+
end
|
25
|
+
end
|
26
|
+
return bfields
|
27
|
+
else
|
28
|
+
|
29
|
+
return self.send(:fields).collect {|f| f[0]}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Dependency
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Dependencies of Angularjs module, comma separated
|
8
|
+
base.class_option :deps, :type => :string, :default => "", :desc => "Dependencies of Angularjs module, comma separated"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Menu
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Provide menu items which should be in sidebar. format: menu1:url,menu2:url
|
8
|
+
base.class_option :menu, :type => :string, :default => "", :desc => "Provide menu items which should be in sidebar. format: menu1:url,menu2:url"
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def parse_menu(menu)
|
14
|
+
regex = /([^:{}]+){1}\:([^:\{\}]+)(?:{(.*)})?/i
|
15
|
+
model = nil
|
16
|
+
if menu =~ regex
|
17
|
+
title = $1
|
18
|
+
url = $2
|
19
|
+
model = $3
|
20
|
+
return title, url, model
|
21
|
+
else
|
22
|
+
Raise Exception.new "Menu items format should be like 'name:url{model}'. Model part is optional"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Parent
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Specify the parent resource if there was any
|
8
|
+
base.class_option :parent, :type => :string, :default => "", :desc => "Specify the parent resource if there was any"
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# check for parent
|
14
|
+
def parent?
|
15
|
+
if options[:parent] != ""
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
# Remove the starting slash from the given parent path
|
22
|
+
def trim_parent_path
|
23
|
+
if parent?
|
24
|
+
options[:parent].gsub(/^\//, "")
|
25
|
+
else
|
26
|
+
""
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# -------------------------
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module RequireFields
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Non optional fields, comma separated
|
8
|
+
base.class_option :required, :type => :string, :default => "", :desc => "Non optional fields, comma separated"
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def required_fields
|
14
|
+
if not options[:required].empty?
|
15
|
+
return options[:required].split(",")
|
16
|
+
end
|
17
|
+
[]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "faalis/generators/fields/relation"
|
2
|
+
|
3
|
+
|
4
|
+
module Faalis
|
5
|
+
module Generators
|
6
|
+
module Concerns
|
7
|
+
module ResourceFields
|
8
|
+
|
9
|
+
def self.included(base)
|
10
|
+
# An array of resource fields. fields should be separated by space
|
11
|
+
# each filed should be in this format `field_name:field_type[:extra_info]
|
12
|
+
base.argument :resource_fields, type: :array, default: [], banner: "fields[:types]"
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
# An array of fields like
|
18
|
+
# [name, type]
|
19
|
+
def fields
|
20
|
+
fields = []
|
21
|
+
resource_fields.each do |field|
|
22
|
+
name, type, to = field.split(":")
|
23
|
+
if ["belongs_to", "has_many", "in"].include? type
|
24
|
+
type = Relation.new(type, to)
|
25
|
+
end
|
26
|
+
|
27
|
+
fields << [name, type]
|
28
|
+
end
|
29
|
+
fields
|
30
|
+
end
|
31
|
+
|
32
|
+
def fields_hash
|
33
|
+
Hash[fields]
|
34
|
+
end
|
35
|
+
|
36
|
+
def grid_fields
|
37
|
+
fields
|
38
|
+
end
|
39
|
+
|
40
|
+
# Return an string to use as a function parameters each
|
41
|
+
# field appears as symbol
|
42
|
+
def fields_as_params(relations: false)
|
43
|
+
result = ""
|
44
|
+
field_num = 0
|
45
|
+
fields.each do |name, type|
|
46
|
+
if relations
|
47
|
+
if ["belongs_to"].include? type
|
48
|
+
result += " :#{name}_id"
|
49
|
+
else
|
50
|
+
result += " :#{name}"
|
51
|
+
end
|
52
|
+
field_num += 1
|
53
|
+
if field_num < fields.length
|
54
|
+
result += ","
|
55
|
+
end
|
56
|
+
|
57
|
+
else
|
58
|
+
unless ["belongs_to", "has_many"].include? type
|
59
|
+
result += " :#{name}"
|
60
|
+
field_num += 1
|
61
|
+
if field_num < fields.length
|
62
|
+
result += ","
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
if result
|
70
|
+
result = ",#{result}"
|
71
|
+
if result[-1] == ","
|
72
|
+
result = result[0..-2]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
result
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module ResourceName
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Name of the resource to create.
|
8
|
+
base.argument :resource_name, :type => :string, :required => true
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# Path to the resource
|
14
|
+
def resource_path
|
15
|
+
path_parts = resource_name.split("/")
|
16
|
+
if path_parts.length > 1
|
17
|
+
return "#{path_parts(0..-2).join("/")}/#{path_parts[-1].underscore}"
|
18
|
+
end
|
19
|
+
resource_name.underscore
|
20
|
+
end
|
21
|
+
|
22
|
+
# Url of resource
|
23
|
+
def resource_url
|
24
|
+
path_parts = resource_name.split("/")
|
25
|
+
if path_parts.length > 1
|
26
|
+
return "#{path_parts(0..-2).join("/")}/#{path_parts[-1].pluralize.underscore}"
|
27
|
+
end
|
28
|
+
resource_name.pluralize.underscore
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource
|
32
|
+
path_parts = resource_name.split("/")
|
33
|
+
if path_parts.length > 1
|
34
|
+
return path_parts[-1].camelize
|
35
|
+
end
|
36
|
+
resource_name.camelize
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
module Concerns
|
4
|
+
module Tabs
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
# Add tabs to 'new' view of scaffold. format: --tabs tab1:'field1;field2',tab2 Note: __all__ field include all fileds.
|
8
|
+
base.class_option :tabs, :type => :string, :default => "", :desc => "Add tabs to 'new' view of scaffold. format: --tabs tab1:'field1;field2',tab2 Note: __all__ field include all fileds."
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# Process the user provided tabs
|
14
|
+
# @return a Hash of tabs like
|
15
|
+
def tabs
|
16
|
+
if options[:tabs].present?
|
17
|
+
tabs = options[:tabs].split(",")
|
18
|
+
result = {}
|
19
|
+
tabs.each do |tab|
|
20
|
+
name, fields = tab.split(":")
|
21
|
+
fields_list = []
|
22
|
+
unless fields.nil?
|
23
|
+
fields_list = fields.split(";")
|
24
|
+
end
|
25
|
+
result[name] = fields_list
|
26
|
+
end
|
27
|
+
return result
|
28
|
+
else
|
29
|
+
{}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def any_tabs?
|
34
|
+
options[:tabs].present?
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
# `DashboardScaffold` is the base class for all the dashboard
|
4
|
+
# scaffolds which make creating scaffold generators way more
|
5
|
+
# easier. But you can drive your own generator normally of caurse
|
6
|
+
class DashboardScaffold < Rails::Generators::Base
|
7
|
+
|
8
|
+
include ActionView::Helpers::TextHelper
|
9
|
+
include Faalis::Generators::Concerns::ResourceName
|
10
|
+
include Faalis::Generators::Concerns::ResourceFields
|
11
|
+
include Faalis::Generators::Concerns::Menu
|
12
|
+
include Faalis::Generators::Concerns::Dependency
|
13
|
+
include Faalis::Generators::Concerns::Bulk
|
14
|
+
include Faalis::Generators::Concerns::RequireFields
|
15
|
+
include Faalis::Generators::Concerns::Parent
|
16
|
+
include Faalis::Generators::Concerns::Angular
|
17
|
+
include Faalis::Generators::Concerns::Tabs
|
18
|
+
|
19
|
+
|
20
|
+
# Do not install specs
|
21
|
+
class_option :without_specs, :type => :boolean, :default => false, :desc => "Do not install specs"
|
22
|
+
|
23
|
+
# Generate only spec files
|
24
|
+
class_option :only_specs, :type => :boolean, :default => false, :desc => "Generate only spec files"
|
25
|
+
|
26
|
+
# Generate only controller
|
27
|
+
class_option :only_controller, :type => :boolean, :default => false, :desc => "Generate only controller"
|
28
|
+
|
29
|
+
# Don't show a filter box
|
30
|
+
class_option :no_filter, :type => :boolean, :default => false, :desc => "Don't view a filter box"
|
31
|
+
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Faalis
|
2
|
+
module Generators
|
3
|
+
class Relation < String
|
4
|
+
attr_accessor :to
|
5
|
+
|
6
|
+
def initialize(value, to_)
|
7
|
+
super(value)
|
8
|
+
self.to = to_
|
9
|
+
end
|
10
|
+
|
11
|
+
def resource_name
|
12
|
+
to.split("/").last
|
13
|
+
end
|
14
|
+
|
15
|
+
def restangular
|
16
|
+
result = "API"
|
17
|
+
to.split("/").each do |resource|
|
18
|
+
result = "#{result}.all(\"#{resource}\")"
|
19
|
+
end
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_list
|
24
|
+
"#{restangular}.getList()"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|