marty 10.0.3 → 11.0.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/.rubocop.yml +6 -0
- data/app/components/marty/base_rule_view.rb +5 -7
- data/app/components/marty/main_auth_app.rb +11 -6
- data/app/components/marty/postings/grid.rb +80 -0
- data/app/components/marty/{posting_grid/client/posting_grid.js → postings/grid/client/grid.js} +0 -0
- data/app/components/marty/postings/new_form.rb +52 -0
- data/app/components/marty/postings/new_form/client/new_form.js +33 -0
- data/app/components/marty/postings/new_window.rb +23 -0
- data/app/components/marty/postings/summary_grid.rb +100 -0
- data/app/components/marty/postings/summary_grid/client/summary_grid.css +3 -0
- data/app/components/marty/postings/summary_grid/client/summary_grid.js +10 -0
- data/app/components/marty/postings/window.rb +29 -0
- data/app/components/marty/users/user_view.rb +3 -2
- data/app/models/marty/data_grid.rb +2 -2
- data/app/models/marty/script.rb +1 -1
- data/lib/marty/data_change.rb +5 -0
- data/lib/marty/mcfly_model.rb +10 -2
- data/lib/marty/version.rb +1 -1
- data/spec/dummy/config/initializers/postings.rb +6 -0
- data/spec/features/auth_app_spec.rb +1 -1
- data/spec/models/data_grid_spec.rb +3 -3
- metadata +12 -9
- data/app/components/marty/new_posting_form.rb +0 -41
- data/app/components/marty/new_posting_form/client/new_posting_form.js +0 -6
- data/app/components/marty/new_posting_window.rb +0 -19
- data/app/components/marty/posting_grid.rb +0 -78
- data/app/components/marty/posting_window.rb +0 -25
- data/app/components/marty/user_view.rb +0 -174
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 119afa3c55c47a985cce5d53a9868f605e2fe401f90bd66bcf3465b03eaf8c5d
|
4
|
+
data.tar.gz: 83dfb56e30a009281111f825a05d603fef30830cf3c67e69c9e0399124d7e5a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1dfadeffa2456aa43340ba6a6848d78dcf8f938e7e500b78a262c9ae5886145884921ef58c08c9e8edc5451a01d0d21e1eabbd37a175065f988c402f63af8e11
|
7
|
+
data.tar.gz: 35e5a24aa4475cd027cc2111f64fba44510aeac35040ea0d13e84f64bbc6f4e3df45120ec9101499cf13c9b1676036a9dcd6e3f8a6b4fb58416f6311091a9ea0
|
data/.rubocop.yml
CHANGED
@@ -73,6 +73,9 @@ Rails/DynamicFindBy:
|
|
73
73
|
- 'spec/features/**/*'
|
74
74
|
- 'spec/support/**/*'
|
75
75
|
|
76
|
+
Style/NumericPredicate:
|
77
|
+
Enabled: false
|
78
|
+
|
76
79
|
Rails/ApplicationRecord:
|
77
80
|
Enabled: false
|
78
81
|
|
@@ -81,3 +84,6 @@ Rails/ApplicationJob:
|
|
81
84
|
|
82
85
|
Rails/ApplicationController:
|
83
86
|
Enabled: false
|
87
|
+
|
88
|
+
Rails/IndexWith:
|
89
|
+
Enabled: false
|
@@ -256,13 +256,11 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
|
|
256
256
|
[
|
257
257
|
jsonb_field(
|
258
258
|
:results,
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
grow: true,
|
265
|
-
}
|
259
|
+
getter: jsonb_simple_getter(:results),
|
260
|
+
setter: jsonb_simple_setter(:results),
|
261
|
+
min_height: 150,
|
262
|
+
height: nil, # must be nil to allow the field to resize automatically
|
263
|
+
grow: true,
|
266
264
|
)
|
267
265
|
]
|
268
266
|
end
|
@@ -8,14 +8,14 @@ require 'marty/config_view'
|
|
8
8
|
require 'marty/data_grid_view'
|
9
9
|
require 'marty/data_grid_user_view'
|
10
10
|
require 'marty/import_type_view'
|
11
|
-
require 'marty/new_posting_window'
|
12
11
|
require 'marty/notifications/config_view'
|
13
12
|
require 'marty/notifications/deliveries_view'
|
14
|
-
require 'marty/
|
13
|
+
require 'marty/postings/new_window'
|
14
|
+
require 'marty/postings/window'
|
15
15
|
require 'marty/promise_view'
|
16
16
|
require 'marty/reporting'
|
17
17
|
require 'marty/scripting'
|
18
|
-
require 'marty/user_view'
|
18
|
+
require 'marty/users/user_view'
|
19
19
|
|
20
20
|
class Marty::MainAuthApp < Marty::AuthApp
|
21
21
|
extend ::Marty::Permissions
|
@@ -27,7 +27,7 @@ class Marty::MainAuthApp < Marty::AuthApp
|
|
27
27
|
|
28
28
|
# set of posting types user is allowed to post with
|
29
29
|
def self.has_posting_perm?
|
30
|
-
Marty::
|
30
|
+
Marty::Postings::NewForm.has_any_perm?
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.has_scripting_perm?
|
@@ -507,6 +507,7 @@ class Marty::MainAuthApp < Marty::AuthApp
|
|
507
507
|
|
508
508
|
component :new_posting_window do |c|
|
509
509
|
c.disabled = Marty::Util.warped? || !self.class.has_posting_perm?
|
510
|
+
c.klass = ::Marty::Postings::NewWindow
|
510
511
|
end
|
511
512
|
|
512
513
|
component :notifications_config_view do |c|
|
@@ -517,7 +518,9 @@ class Marty::MainAuthApp < Marty::AuthApp
|
|
517
518
|
c.klass = ::Marty::Notifications::DeliveriesView
|
518
519
|
end
|
519
520
|
|
520
|
-
component :posting_window
|
521
|
+
component :posting_window do |c|
|
522
|
+
c.klass = ::Marty::Postings::Window
|
523
|
+
end
|
521
524
|
|
522
525
|
component :promise_view do |c|
|
523
526
|
c.klass = Marty::PromiseView
|
@@ -537,7 +540,9 @@ class Marty::MainAuthApp < Marty::AuthApp
|
|
537
540
|
c.allow_edit = self.class.has_scripting_perm?
|
538
541
|
end
|
539
542
|
|
540
|
-
component :user_view
|
543
|
+
component :user_view do |c|
|
544
|
+
c.klass = ::Marty::Users::UserView
|
545
|
+
end
|
541
546
|
|
542
547
|
endpoint :reload_scripts do |_params|
|
543
548
|
Marty::Script.load_scripts
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Marty
|
2
|
+
module Postings
|
3
|
+
class Grid < Marty::Grid
|
4
|
+
has_marty_permissions read: :any,
|
5
|
+
delete: :any # delete is hijacked for a select
|
6
|
+
|
7
|
+
def configure(c)
|
8
|
+
super
|
9
|
+
|
10
|
+
c.header = false
|
11
|
+
c.model = 'Marty::Posting'
|
12
|
+
c.attributes = [:name, :created_dt, :user__name, :comment]
|
13
|
+
c.multi_select = false
|
14
|
+
c.store_config.merge!(sorters: [{ property: :created_dt, direction: 'DESC' }],
|
15
|
+
page_size: 12)
|
16
|
+
end
|
17
|
+
|
18
|
+
client_class do |c|
|
19
|
+
c.include :grid
|
20
|
+
end
|
21
|
+
|
22
|
+
# hijacking delete button
|
23
|
+
action :delete do |a|
|
24
|
+
a.text = 'Select'
|
25
|
+
a.tooltip = 'Select'
|
26
|
+
a.icon_cls = 'fa fa-clock glyph'
|
27
|
+
a.disabled = true
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_bbar
|
31
|
+
[:delete, :detail]
|
32
|
+
end
|
33
|
+
|
34
|
+
action :detail do |a|
|
35
|
+
a.text = 'Detail'
|
36
|
+
a.icon_cls = 'fa fa-th-large glyph'
|
37
|
+
a.handler = :detail
|
38
|
+
a.disabled = true
|
39
|
+
end
|
40
|
+
|
41
|
+
endpoint :detail do |params|
|
42
|
+
record_id = params[:record_id]
|
43
|
+
|
44
|
+
# Prepare an HTML popup with session details such that the
|
45
|
+
# contents can be easily pasted into a spreadsheet.
|
46
|
+
|
47
|
+
pt = Marty::Posting.find_by(id: record_id)
|
48
|
+
|
49
|
+
dt = pt.created_dt.to_s == 'Infinity' ? '---' :
|
50
|
+
pt.created_dt.strftime('%Y-%m-%d %I:%M %p')
|
51
|
+
|
52
|
+
html =
|
53
|
+
"<b>Name:</b>\t#{pt.name}<br/>" \
|
54
|
+
"<b>Date/Time:</b>\t#{dt}<br/>" \
|
55
|
+
"<b>User:</b>\t#{pt.user.name}<br/>" \
|
56
|
+
"<b>Comment:</b>\t#{pt.comment}"
|
57
|
+
|
58
|
+
client.netzke_show_detail html
|
59
|
+
end
|
60
|
+
|
61
|
+
attribute :name do |c|
|
62
|
+
c.flex = 1
|
63
|
+
end
|
64
|
+
|
65
|
+
attribute :created_dt do |c|
|
66
|
+
c.text = 'Date/Time'
|
67
|
+
c.format = 'Y-m-d H:i'
|
68
|
+
c.hidden = true
|
69
|
+
end
|
70
|
+
|
71
|
+
attribute :user__name do |c|
|
72
|
+
c.width = 100
|
73
|
+
end
|
74
|
+
|
75
|
+
attribute :comment do |c|
|
76
|
+
c.width = 100
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/app/components/marty/{posting_grid/client/posting_grid.js → postings/grid/client/grid.js}
RENAMED
File without changes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'marty/postings/summary_grid'
|
2
|
+
|
3
|
+
module Marty
|
4
|
+
module Postings
|
5
|
+
class NewForm < Marty::Form
|
6
|
+
extend ::Marty::Permissions
|
7
|
+
|
8
|
+
# override this to set permissions for posting types
|
9
|
+
has_marty_permissions read: :any
|
10
|
+
|
11
|
+
client_class do |c|
|
12
|
+
c.include :new_form
|
13
|
+
end
|
14
|
+
|
15
|
+
action :apply do |a|
|
16
|
+
a.text = I18n.t('create_posting')
|
17
|
+
a.tooltip = I18n.t('create_posting')
|
18
|
+
a.icon_cls = 'fa fa-clock glyph'
|
19
|
+
end
|
20
|
+
|
21
|
+
######################################################################
|
22
|
+
|
23
|
+
endpoint :submit do |params|
|
24
|
+
res = super(params)
|
25
|
+
client.close_me
|
26
|
+
res
|
27
|
+
end
|
28
|
+
|
29
|
+
def configure(c)
|
30
|
+
super
|
31
|
+
|
32
|
+
c.model = 'Marty::Posting'
|
33
|
+
c.items = [
|
34
|
+
{
|
35
|
+
name: :posting_type__name,
|
36
|
+
scope: lambda { |r|
|
37
|
+
r.where(name: Marty::Postings::NewForm.can_perform_actions)
|
38
|
+
},
|
39
|
+
},
|
40
|
+
:comment,
|
41
|
+
:summary_grid
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
component :summary_grid do |c|
|
46
|
+
c.klass = Marty::Postings::SummaryGrid
|
47
|
+
c.data_store = { auto_load: false }
|
48
|
+
c.selected_posting_type = client_config[:selected_posting_type]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
({
|
2
|
+
closeMe() {
|
3
|
+
// assume we're embedded in a window
|
4
|
+
this.netzkeGetParentComponent().close();
|
5
|
+
},
|
6
|
+
|
7
|
+
initComponent() {
|
8
|
+
this.callParent();
|
9
|
+
|
10
|
+
const postingType = this.getForm().findField("posting_type__name");
|
11
|
+
const me = this;
|
12
|
+
|
13
|
+
me.serverConfig.selected_posting_type = null;
|
14
|
+
// For some reason initComponent gets called twice
|
15
|
+
// So this workaround prevents from adding the listener second time
|
16
|
+
if (this.hasPostingTypeChangeListener) {
|
17
|
+
return;
|
18
|
+
}
|
19
|
+
|
20
|
+
postingType.on("change", function(self, record) {
|
21
|
+
if (record instanceof Array) {
|
22
|
+
record = record[0];
|
23
|
+
}
|
24
|
+
|
25
|
+
me.serverConfig.selected_posting_type = record;
|
26
|
+
me.getComponent("summary_grid")
|
27
|
+
.getStore()
|
28
|
+
.load();
|
29
|
+
});
|
30
|
+
|
31
|
+
this.hasPostingTypeChangeListener = true;
|
32
|
+
}
|
33
|
+
});
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'marty/postings/new_form'
|
2
|
+
|
3
|
+
module Marty
|
4
|
+
module Postings
|
5
|
+
class NewWindow < Netzke::Window::Base
|
6
|
+
def configure(c)
|
7
|
+
super
|
8
|
+
|
9
|
+
c.title = I18n.t('new_posting')
|
10
|
+
c.modal = true
|
11
|
+
c.items = [:new_posting_form]
|
12
|
+
c.lazy_loading = true
|
13
|
+
c.width = 800
|
14
|
+
c.height = 550
|
15
|
+
end
|
16
|
+
|
17
|
+
component :new_posting_form do |c|
|
18
|
+
c.header = false
|
19
|
+
c.klass = Marty::Postings::NewForm
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Marty
|
2
|
+
module Postings
|
3
|
+
class SummaryGrid < Marty::Grid
|
4
|
+
def configure(c)
|
5
|
+
super
|
6
|
+
|
7
|
+
c.model = 'Marty::Log' # Hack, since grid requires a model to be set
|
8
|
+
c.multi_select = false
|
9
|
+
c.read_only = true
|
10
|
+
c.attributes ||= [:klass, :created, :updated, :deleted]
|
11
|
+
c.title ||= I18n.t('summary', default: 'Summary')
|
12
|
+
c.paging = false
|
13
|
+
c.min_height = 400
|
14
|
+
c.height = 400
|
15
|
+
c.bbar = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
client_styles do |c|
|
19
|
+
c.require :summary_grid
|
20
|
+
end
|
21
|
+
|
22
|
+
attribute :klass do |c|
|
23
|
+
c.min_width = 300
|
24
|
+
c.sortable = true
|
25
|
+
end
|
26
|
+
|
27
|
+
column :created do |c|
|
28
|
+
c.sortable = true
|
29
|
+
end
|
30
|
+
|
31
|
+
column :updated do |c|
|
32
|
+
c.sortable = true
|
33
|
+
end
|
34
|
+
|
35
|
+
column :deleted do |c|
|
36
|
+
c.sortable = true
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_records(params)
|
40
|
+
return [] if config[:selected_posting_type].blank?
|
41
|
+
return [] if config[:selected_posting_type].to_i.negative?
|
42
|
+
|
43
|
+
last_posting = Marty::Posting.where(
|
44
|
+
posting_type_id: config[:selected_posting_type]
|
45
|
+
).where.not(created_dt: 'infinity').order(:created_dt).last
|
46
|
+
|
47
|
+
start_dt = last_posting&.created_dt || 1.year.ago
|
48
|
+
end_dt = Time.zone.now
|
49
|
+
|
50
|
+
posting_type = Marty::PostingType.find(config[:selected_posting_type])
|
51
|
+
|
52
|
+
summary_records = class_list(posting_type).map do |klass|
|
53
|
+
summary = Marty::DataChange.change_summary(start_dt, end_dt, klass)
|
54
|
+
OpenStruct.new(summary.merge('klass' => klass))
|
55
|
+
end
|
56
|
+
|
57
|
+
records_with_changes = summary_records.select do |record|
|
58
|
+
record.created > 0 || record.updated > 0 || record.deleted > 0
|
59
|
+
end
|
60
|
+
|
61
|
+
total_summary = OpenStruct.new(
|
62
|
+
klass: 'Total',
|
63
|
+
created: summary_records.sum(&:created),
|
64
|
+
updated: summary_records.sum(&:updated),
|
65
|
+
deleted: summary_records.sum(&:deleted)
|
66
|
+
)
|
67
|
+
|
68
|
+
[total_summary] + sort_records(params, records_with_changes)
|
69
|
+
end
|
70
|
+
|
71
|
+
def class_list(posting_type)
|
72
|
+
method_name = "class_list_#{posting_type.name}".downcase.to_sym
|
73
|
+
|
74
|
+
if Marty::DataChange.respond_to?(method_name)
|
75
|
+
Marty::DataChange.send(method_name)
|
76
|
+
else
|
77
|
+
Marty::DataChange.class_list
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def sort_records(params, records)
|
82
|
+
return records if params['sorters'].blank?
|
83
|
+
|
84
|
+
sorting_attr = params.dig('sorters', 0, 'property').to_sym
|
85
|
+
|
86
|
+
sorted = records.sort_by(&:sorting_attr)
|
87
|
+
sorted = sorted.reverse if params.dig('sorters', 0, 'direction') != 'ASC'
|
88
|
+
|
89
|
+
sorted
|
90
|
+
end
|
91
|
+
|
92
|
+
def count_records(_params, _columns = [])
|
93
|
+
return 0 if config[:selected_posting_type].blank?
|
94
|
+
return 0 if config[:selected_posting_type].to_i.negative?
|
95
|
+
|
96
|
+
Marty::DataChange.class_list.size + 1
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'marty/postings/grid'
|
2
|
+
|
3
|
+
module Marty
|
4
|
+
module Postings
|
5
|
+
class Window < Netzke::Window::Base
|
6
|
+
def configure(c)
|
7
|
+
super
|
8
|
+
|
9
|
+
c.title = I18n.t('select_posting')
|
10
|
+
c.modal = true
|
11
|
+
c.items = [:posting_grid]
|
12
|
+
c.lazy_loading = true
|
13
|
+
c.width = 600
|
14
|
+
c.height = 350
|
15
|
+
end
|
16
|
+
|
17
|
+
component :posting_grid do |c|
|
18
|
+
c.klass = Marty::Postings::Grid
|
19
|
+
c.rows_per_page = 12
|
20
|
+
c.permissions = {
|
21
|
+
update: false,
|
22
|
+
delete: true, # hijacked for selection
|
23
|
+
create: false,
|
24
|
+
}
|
25
|
+
# c.bbar = []
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Marty
|
2
|
-
|
2
|
+
module Users
|
3
3
|
class UserView < Marty::Grid
|
4
4
|
has_marty_permissions create: [:admin, :user_manager],
|
5
5
|
read: :any,
|
@@ -156,7 +156,8 @@ module Marty
|
|
156
156
|
Marty::RoleType.to_nice_names(r.user_roles.map(&:role))
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
roles = Rails.application.config.marty.roles || ::Marty::RoleType.values
|
160
|
+
store = ::Marty::RoleType.to_nice_names(roles.sort)
|
160
161
|
|
161
162
|
c.editor_config = {
|
162
163
|
multi_select: true,
|
@@ -100,8 +100,8 @@ class Marty::DataGrid < Marty::Base
|
|
100
100
|
validates_with DataGridValidator
|
101
101
|
validates_with Marty::NameValidator, field: :name
|
102
102
|
|
103
|
-
gen_mcfly_lookup :lookup, [:name], cache: true
|
104
|
-
gen_mcfly_lookup :get_all, [], mode: nil
|
103
|
+
gen_mcfly_lookup :lookup, [:name], cache: true, to_hash: true
|
104
|
+
gen_mcfly_lookup :get_all, [], mode: nil, to_hash: true
|
105
105
|
|
106
106
|
# FIXME: if the caller requests data as part of fields, there could
|
107
107
|
# be memory concerns with caching since some data_grids have massive data
|
data/app/models/marty/script.rb
CHANGED
data/lib/marty/data_change.rb
CHANGED
data/lib/marty/mcfly_model.rb
CHANGED
@@ -6,8 +6,16 @@ module Mcfly::Model
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module ClassMethods
|
9
|
-
def openstruct_if_necessary(q,
|
10
|
-
|
9
|
+
def openstruct_if_necessary(q, private_lookup)
|
10
|
+
return q if private_lookup
|
11
|
+
return q unless q.is_a?(ActiveRecord::Base)
|
12
|
+
|
13
|
+
warning = 'Mcfly::Model#openstruct_if_necessary is deprecated.' \
|
14
|
+
"Please use 'to_hash: true' or 'private: true' option instead"
|
15
|
+
|
16
|
+
Rails.logger.warn warning
|
17
|
+
|
18
|
+
make_openstruct(q)
|
11
19
|
end
|
12
20
|
|
13
21
|
def hash_if_necessary(q, to_hash)
|
data/lib/marty/version.rb
CHANGED
@@ -17,7 +17,7 @@ feature 'Posting workflows', js: true do
|
|
17
17
|
def monkey_patch_new_posting_form
|
18
18
|
# presently, Gemini displays similar monkeypatching behavior.
|
19
19
|
# consider coming up with a proper fix...
|
20
|
-
Marty::
|
20
|
+
Marty::Postings::NewForm.has_marty_permissions(BASE: :admin)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'create posting and select it' do
|
@@ -553,7 +553,7 @@ EOS
|
|
553
553
|
end
|
554
554
|
|
555
555
|
it 'should handle string typed data grids' do
|
556
|
-
expect(Marty::DataGrid.lookup('infinity', 'G7')
|
556
|
+
expect(Marty::DataGrid.lookup('infinity', 'G7')['data_type']).to eq 'string'
|
557
557
|
|
558
558
|
res = lookup_grid_helper('infinity',
|
559
559
|
'G7',
|
@@ -564,7 +564,7 @@ EOS
|
|
564
564
|
end
|
565
565
|
|
566
566
|
it 'should handle DataGrid typed data grids' do
|
567
|
-
expect(Marty::DataGrid.lookup('infinity', 'G8')
|
567
|
+
expect(Marty::DataGrid.lookup('infinity', 'G8')['data_type']).
|
568
568
|
to eq 'Marty::DataGrid'
|
569
569
|
g1 = Marty::DataGrid.lookup('infinity', 'G1')
|
570
570
|
|
@@ -573,7 +573,7 @@ EOS
|
|
573
573
|
end
|
574
574
|
|
575
575
|
it 'should handle multi DataGrid lookups' do
|
576
|
-
expect(Marty::DataGrid.lookup('infinity', 'G8')
|
576
|
+
expect(Marty::DataGrid.lookup('infinity', 'G8')['data_type']).
|
577
577
|
to eq 'Marty::DataGrid'
|
578
578
|
|
579
579
|
h = {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 11.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arman Bostani
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2020-03-
|
17
|
+
date: 2020-03-31 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: actioncable
|
@@ -345,18 +345,21 @@ files:
|
|
345
345
|
- app/components/marty/main_auth_app/client/main_auth_app.js
|
346
346
|
- app/components/marty/mcfly_grid_panel.rb
|
347
347
|
- app/components/marty/mcfly_grid_panel/client/mcfly_grid_panel.js
|
348
|
-
- app/components/marty/new_posting_form.rb
|
349
|
-
- app/components/marty/new_posting_form/client/new_posting_form.js
|
350
|
-
- app/components/marty/new_posting_window.rb
|
351
348
|
- app/components/marty/notifications/config_view.rb
|
352
349
|
- app/components/marty/notifications/deliveries_view.rb
|
353
350
|
- app/components/marty/notifications/grid_view.rb
|
354
351
|
- app/components/marty/notifications/window.rb
|
355
352
|
- app/components/marty/panel.rb
|
356
353
|
- app/components/marty/panel/client/panel.js
|
357
|
-
- app/components/marty/
|
358
|
-
- app/components/marty/
|
359
|
-
- app/components/marty/
|
354
|
+
- app/components/marty/postings/grid.rb
|
355
|
+
- app/components/marty/postings/grid/client/grid.js
|
356
|
+
- app/components/marty/postings/new_form.rb
|
357
|
+
- app/components/marty/postings/new_form/client/new_form.js
|
358
|
+
- app/components/marty/postings/new_window.rb
|
359
|
+
- app/components/marty/postings/summary_grid.rb
|
360
|
+
- app/components/marty/postings/summary_grid/client/summary_grid.css
|
361
|
+
- app/components/marty/postings/summary_grid/client/summary_grid.js
|
362
|
+
- app/components/marty/postings/window.rb
|
360
363
|
- app/components/marty/promise_view.rb
|
361
364
|
- app/components/marty/promise_view/client/promise_view.css
|
362
365
|
- app/components/marty/promise_view/client/promise_view.js
|
@@ -380,7 +383,6 @@ files:
|
|
380
383
|
- app/components/marty/tag_grid.rb
|
381
384
|
- app/components/marty/tree.rb
|
382
385
|
- app/components/marty/tree/client/tree.js
|
383
|
-
- app/components/marty/user_view.rb
|
384
386
|
- app/components/marty/users/user_view.rb
|
385
387
|
- app/controllers/marty/application_controller.rb
|
386
388
|
- app/controllers/marty/components_controller.rb
|
@@ -662,6 +664,7 @@ files:
|
|
662
664
|
- spec/dummy/config/initializers/delayed_job.rb
|
663
665
|
- spec/dummy/config/initializers/inflections.rb
|
664
666
|
- spec/dummy/config/initializers/mime_types.rb
|
667
|
+
- spec/dummy/config/initializers/postings.rb
|
665
668
|
- spec/dummy/config/initializers/secret_token.rb
|
666
669
|
- spec/dummy/config/initializers/session_store.rb
|
667
670
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
@@ -1,41 +0,0 @@
|
|
1
|
-
class Marty::NewPostingForm < Marty::Form
|
2
|
-
extend ::Marty::Permissions
|
3
|
-
|
4
|
-
# override this to set permissions for posting types
|
5
|
-
has_marty_permissions read: :any
|
6
|
-
|
7
|
-
client_class do |c|
|
8
|
-
c.include :new_posting_form
|
9
|
-
end
|
10
|
-
|
11
|
-
action :apply do |a|
|
12
|
-
a.text = I18n.t('create_posting')
|
13
|
-
a.tooltip = I18n.t('create_posting')
|
14
|
-
a.icon_cls = 'fa fa-clock glyph'
|
15
|
-
end
|
16
|
-
|
17
|
-
######################################################################
|
18
|
-
|
19
|
-
endpoint :submit do |params|
|
20
|
-
res = super(params)
|
21
|
-
client.close_me
|
22
|
-
res
|
23
|
-
end
|
24
|
-
|
25
|
-
def configure(c)
|
26
|
-
super
|
27
|
-
|
28
|
-
c.model = 'Marty::Posting'
|
29
|
-
c.items = [
|
30
|
-
{
|
31
|
-
name: :posting_type__name,
|
32
|
-
scope: lambda { |r|
|
33
|
-
r.where(name: Marty::NewPostingForm.can_perform_actions)
|
34
|
-
},
|
35
|
-
},
|
36
|
-
:comment,
|
37
|
-
]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
NewPostingForm = Marty::NewPostingForm
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'marty/new_posting_form'
|
2
|
-
|
3
|
-
class Marty::NewPostingWindow < Netzke::Window::Base
|
4
|
-
def configure(c)
|
5
|
-
super
|
6
|
-
|
7
|
-
c.title = I18n.t('new_posting')
|
8
|
-
c.modal = true
|
9
|
-
c.items = [:new_posting_form]
|
10
|
-
c.layout = 'fit'
|
11
|
-
c.lazy_loading = true
|
12
|
-
end
|
13
|
-
|
14
|
-
component :new_posting_form do |c|
|
15
|
-
c.header = false
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
NewPostingWindow = Marty::NewPostingWindow
|
@@ -1,78 +0,0 @@
|
|
1
|
-
class Marty::PostingGrid < Marty::Grid
|
2
|
-
has_marty_permissions read: :any,
|
3
|
-
delete: :any # delete is hijacked for a select
|
4
|
-
|
5
|
-
def configure(c)
|
6
|
-
super
|
7
|
-
|
8
|
-
c.header = false
|
9
|
-
c.model = 'Marty::Posting'
|
10
|
-
c.attributes = [:name, :created_dt, :user__name, :comment]
|
11
|
-
c.multi_select = false
|
12
|
-
c.store_config.merge!(sorters: [{ property: :created_dt, direction: 'DESC' }],
|
13
|
-
page_size: 12)
|
14
|
-
end
|
15
|
-
|
16
|
-
client_class do |c|
|
17
|
-
c.include :posting_grid
|
18
|
-
end
|
19
|
-
|
20
|
-
# hijacking delete button
|
21
|
-
action :delete do |a|
|
22
|
-
a.text = 'Select'
|
23
|
-
a.tooltip = 'Select'
|
24
|
-
a.icon_cls = 'fa fa-clock glyph'
|
25
|
-
a.disabled = true
|
26
|
-
end
|
27
|
-
|
28
|
-
def default_bbar
|
29
|
-
[:delete, :detail]
|
30
|
-
end
|
31
|
-
|
32
|
-
action :detail do |a|
|
33
|
-
a.text = 'Detail'
|
34
|
-
a.icon_cls = 'fa fa-th-large glyph'
|
35
|
-
a.handler = :detail
|
36
|
-
a.disabled = true
|
37
|
-
end
|
38
|
-
|
39
|
-
endpoint :detail do |params|
|
40
|
-
record_id = params[:record_id]
|
41
|
-
|
42
|
-
# Prepare an HTML popup with session details such that the
|
43
|
-
# contents can be easily pasted into a spreadsheet.
|
44
|
-
|
45
|
-
pt = Marty::Posting.find_by(id: record_id)
|
46
|
-
|
47
|
-
dt = pt.created_dt.to_s == 'Infinity' ? '---' :
|
48
|
-
pt.created_dt.strftime('%Y-%m-%d %I:%M %p')
|
49
|
-
|
50
|
-
html =
|
51
|
-
"<b>Name:</b>\t#{pt.name}<br/>" +
|
52
|
-
"<b>Date/Time:</b>\t#{dt}<br/>" +
|
53
|
-
"<b>User:</b>\t#{pt.user.name}<br/>" +
|
54
|
-
"<b>Comment:</b>\t#{pt.comment}"
|
55
|
-
|
56
|
-
client.netzke_show_detail html
|
57
|
-
end
|
58
|
-
|
59
|
-
attribute :name do |c|
|
60
|
-
c.flex = 1
|
61
|
-
end
|
62
|
-
|
63
|
-
attribute :created_dt do |c|
|
64
|
-
c.text = 'Date/Time'
|
65
|
-
c.format = 'Y-m-d H:i'
|
66
|
-
c.hidden = true
|
67
|
-
end
|
68
|
-
|
69
|
-
attribute :user__name do |c|
|
70
|
-
c.width = 100
|
71
|
-
end
|
72
|
-
|
73
|
-
attribute :comment do |c|
|
74
|
-
c.width = 100
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
PostingGrid = Marty::PostingGrid
|
@@ -1,25 +0,0 @@
|
|
1
|
-
class Marty::PostingWindow < Netzke::Window::Base
|
2
|
-
def configure(c)
|
3
|
-
super
|
4
|
-
|
5
|
-
c.title = I18n.t('select_posting')
|
6
|
-
c.modal = true
|
7
|
-
c.items = [:posting_grid]
|
8
|
-
c.lazy_loading = true
|
9
|
-
c.width = 600
|
10
|
-
c.height = 350
|
11
|
-
end
|
12
|
-
|
13
|
-
component :posting_grid do |c|
|
14
|
-
c.klass = Marty::PostingGrid
|
15
|
-
c.rows_per_page = 12
|
16
|
-
c.permissions = {
|
17
|
-
update: false,
|
18
|
-
delete: true, # hijacked for selection
|
19
|
-
create: false,
|
20
|
-
}
|
21
|
-
# c.bbar = []
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
PostingWindow = Marty::PostingWindow
|
@@ -1,174 +0,0 @@
|
|
1
|
-
module Marty; class UserView < Marty::Grid
|
2
|
-
has_marty_permissions create: [:admin, :user_manager],
|
3
|
-
read: :any,
|
4
|
-
update: [:admin, :user_manager],
|
5
|
-
delete: [:admin, :user_manager]
|
6
|
-
|
7
|
-
# list of columns to be displayed in the grid view
|
8
|
-
def self.user_columns
|
9
|
-
[
|
10
|
-
:login,
|
11
|
-
:firstname,
|
12
|
-
:lastname,
|
13
|
-
:active,
|
14
|
-
:user_roles,
|
15
|
-
]
|
16
|
-
end
|
17
|
-
|
18
|
-
def configure(c)
|
19
|
-
super
|
20
|
-
|
21
|
-
c.attributes ||= self.class.user_columns
|
22
|
-
c.title ||= I18n.t('users', default: 'Users')
|
23
|
-
c.model = 'Marty::User'
|
24
|
-
c.editing = :in_form
|
25
|
-
c.paging = :pagination
|
26
|
-
c.multi_select = false
|
27
|
-
c.store_config.merge!(sorters: [{ property: :login,
|
28
|
-
direction: 'ASC',
|
29
|
-
}]) if c.attributes.include?(:login)
|
30
|
-
c.scope = ->(arel) { arel.includes(:user_roles) }
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.set_roles(roles, user)
|
34
|
-
roles = [] if roles.blank?
|
35
|
-
|
36
|
-
roles = ::Marty::RoleType.from_nice_names(roles)
|
37
|
-
|
38
|
-
roles_in_user = user.user_roles.map(&:role)
|
39
|
-
roles_to_delete = roles_in_user - roles
|
40
|
-
roles_to_add = roles - roles_in_user
|
41
|
-
|
42
|
-
Marty::User.transaction do
|
43
|
-
user.user_roles.where(role: roles_to_delete).map(&:destroy!)
|
44
|
-
|
45
|
-
roles_to_add.each do |role|
|
46
|
-
user.user_roles.create!(role: role)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.create_edit_user(data)
|
52
|
-
# Creates initial place-holder user object and validate
|
53
|
-
user = data['id'].nil? ? User.new : User.find(data['id'])
|
54
|
-
|
55
|
-
user_columns.each do |c|
|
56
|
-
user.send("#{c}=", data[c.to_s]) unless c == :user_roles
|
57
|
-
end
|
58
|
-
|
59
|
-
if user.valid?
|
60
|
-
user.save
|
61
|
-
set_roles(data['user_roles'], user)
|
62
|
-
end
|
63
|
-
|
64
|
-
user
|
65
|
-
end
|
66
|
-
|
67
|
-
# override the add_in_form and edit_in_form endpoint. User creation/update
|
68
|
-
# needs to use the create_edit_user method.
|
69
|
-
|
70
|
-
endpoint :add_window__add_form__submit do |params|
|
71
|
-
data = ActiveSupport::JSON.decode(params[:data])
|
72
|
-
|
73
|
-
data['id'] = nil
|
74
|
-
|
75
|
-
unless self.class.can_perform_action?(:create)
|
76
|
-
client.netzke_notify 'Permission Denied'
|
77
|
-
return
|
78
|
-
end
|
79
|
-
|
80
|
-
user = self.class.create_edit_user(data)
|
81
|
-
if user.valid?
|
82
|
-
client.success = true
|
83
|
-
client.netzke_on_submit_success
|
84
|
-
else
|
85
|
-
client.netzke_notify(model_adapter.errors_array(user).join("\n"))
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
endpoint :edit_window__edit_form__submit do |params|
|
90
|
-
data = ActiveSupport::JSON.decode(params[:data])
|
91
|
-
unless self.class.can_perform_action?(:update)
|
92
|
-
client.netzke_notify 'Permission Denied'
|
93
|
-
return
|
94
|
-
end
|
95
|
-
|
96
|
-
user = self.class.create_edit_user(data)
|
97
|
-
if user.valid?
|
98
|
-
client.success = true
|
99
|
-
client.netzke_on_submit_success
|
100
|
-
else
|
101
|
-
client.netzke_notify(model_adapter.errors_array(user).join("\n"))
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
action :add do |a|
|
106
|
-
super(a)
|
107
|
-
a.text = I18n.t('user_grid.new')
|
108
|
-
a.tooltip = I18n.t('user_grid.new')
|
109
|
-
a.icon_cls = 'fa fa-user-plus glyph'
|
110
|
-
end
|
111
|
-
|
112
|
-
action :edit do |a|
|
113
|
-
super(a)
|
114
|
-
a.icon_cls = 'fa fa-user-cog glyph'
|
115
|
-
end
|
116
|
-
|
117
|
-
action :delete do |a|
|
118
|
-
super(a)
|
119
|
-
a.icon_cls = 'fa fa-user-minus glyph'
|
120
|
-
end
|
121
|
-
|
122
|
-
def default_context_menu
|
123
|
-
[]
|
124
|
-
end
|
125
|
-
|
126
|
-
attribute :login do |c|
|
127
|
-
c.width = 100
|
128
|
-
c.label = I18n.t('user_grid.login')
|
129
|
-
end
|
130
|
-
|
131
|
-
attribute :firstname do |c|
|
132
|
-
c.width = 100
|
133
|
-
c.label = I18n.t('user_grid.firstname')
|
134
|
-
end
|
135
|
-
|
136
|
-
attribute :lastname do |c|
|
137
|
-
c.width = 100
|
138
|
-
c.label = I18n.t('user_grid.lastname')
|
139
|
-
end
|
140
|
-
|
141
|
-
attribute :active do |c|
|
142
|
-
c.width = 60
|
143
|
-
c.label = I18n.t('user_grid.active')
|
144
|
-
end
|
145
|
-
|
146
|
-
attribute :user_roles do |c|
|
147
|
-
c.width = 100
|
148
|
-
c.flex = 1
|
149
|
-
c.label = I18n.t('user_grid.roles')
|
150
|
-
c.type = :string
|
151
|
-
|
152
|
-
c.getter = lambda do |r|
|
153
|
-
Marty::RoleType.to_nice_names(r.user_roles.map(&:role))
|
154
|
-
end
|
155
|
-
|
156
|
-
store = ::Marty::RoleType.to_nice_names(::Marty::RoleType.values.sort)
|
157
|
-
|
158
|
-
c.editor_config = {
|
159
|
-
multi_select: true,
|
160
|
-
empty_text: I18n.t('user_grid.select_roles'),
|
161
|
-
store: store,
|
162
|
-
type: :string,
|
163
|
-
xtype: :combo,
|
164
|
-
}
|
165
|
-
end
|
166
|
-
|
167
|
-
attribute :created_dt do |c|
|
168
|
-
c.label = I18n.t('user_grid.created_dt')
|
169
|
-
c.format = 'Y-m-d H:i'
|
170
|
-
c.read_only = true
|
171
|
-
end
|
172
|
-
end; end
|
173
|
-
|
174
|
-
UserView = Marty::UserView
|