marty 10.0.3 → 11.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|