linked_rails 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/linked_rails/bulk_controller.rb +26 -6
- data/app/controllers/linked_rails/enum_values_controller.rb +0 -42
- data/app/models/linked_rails/actions/item.rb +46 -30
- data/app/models/linked_rails/actions/list.rb +6 -25
- data/app/models/linked_rails/collection/configuration.rb +55 -0
- data/app/models/linked_rails/collection/filter.rb +1 -1
- data/app/models/linked_rails/collection/filter_field.rb +5 -1
- data/app/models/linked_rails/collection/filter_option.rb +1 -1
- data/app/models/linked_rails/collection/filterable.rb +3 -8
- data/app/models/linked_rails/collection/infinite.rb +102 -0
- data/app/models/linked_rails/collection/infinite_view.rb +1 -90
- data/app/models/linked_rails/collection/iri.rb +33 -52
- data/app/models/linked_rails/collection/iri_mapping.rb +14 -6
- data/app/models/linked_rails/collection/paginated.rb +45 -0
- data/app/models/linked_rails/collection/paginated_view.rb +1 -33
- data/app/models/linked_rails/collection/sortable.rb +1 -9
- data/app/models/linked_rails/collection/sorting.rb +1 -1
- data/app/models/linked_rails/collection/view.rb +15 -5
- data/app/models/linked_rails/collection.rb +33 -67
- data/app/models/linked_rails/creative_work.rb +1 -1
- data/app/models/linked_rails/entry_point.rb +8 -5
- data/app/models/linked_rails/enum_value.rb +39 -1
- data/app/models/linked_rails/form/field/resource_field.rb +2 -0
- data/app/models/linked_rails/form/field.rb +6 -8
- data/app/models/linked_rails/form/field_factory.rb +21 -10
- data/app/models/linked_rails/form/group.rb +2 -2
- data/app/models/linked_rails/form/page.rb +4 -4
- data/app/models/linked_rails/form.rb +13 -15
- data/app/models/linked_rails/manifest.rb +8 -2
- data/app/models/linked_rails/menus/item.rb +1 -1
- data/app/models/linked_rails/menus/list.rb +3 -2
- data/app/models/linked_rails/ontology/base.rb +1 -1
- data/app/models/linked_rails/ontology/class.rb +3 -3
- data/app/models/linked_rails/ontology.rb +5 -5
- data/app/models/linked_rails/sequence.rb +2 -2
- data/app/models/linked_rails/shacl/property_shape.rb +1 -1
- data/app/models/linked_rails/widget.rb +1 -1
- data/app/serializers/linked_rails/actions/item_serializer.rb +2 -1
- data/app/serializers/linked_rails/collection_serializer.rb +7 -2
- data/app/serializers/linked_rails/entry_point_serializer.rb +1 -1
- data/app/serializers/linked_rails/ontology_serializer.rb +2 -2
- data/lib/generators/linked_rails/install/install_generator.rb +5 -8
- data/lib/generators/linked_rails/install/templates/README +2 -0
- data/lib/generators/linked_rails/install/templates/app_menu_list.rb +36 -7
- data/lib/generators/linked_rails/install/templates/application_menu_list.rb +40 -1
- data/lib/generators/linked_rails/install/templates/initializer.rb +1 -2
- data/lib/generators/linked_rails/install/templates/locales.yml +12 -0
- data/lib/generators/linked_rails/install/templates/vocab.rb +1 -0
- data/lib/generators/linked_rails/install/templates/vocab.yml +2 -2
- data/lib/generators/linked_rails/model/model_generator.rb +0 -1
- data/lib/generators/linked_rails/model/templates/controller.rb.tt +5 -1
- data/lib/generators/linked_rails/model/templates/form.rb.tt +3 -0
- data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +15 -0
- data/lib/generators/linked_rails/model/templates/policy.rb.tt +13 -0
- data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -1
- data/lib/linked_rails/active_response/controller/collections.rb +1 -1
- data/lib/linked_rails/active_response/controller/crud_defaults.rb +3 -3
- data/lib/linked_rails/active_response/controller/params.rb +5 -5
- data/lib/linked_rails/active_response/controller.rb +11 -0
- data/lib/linked_rails/active_response/responders/rdf.rb +19 -10
- data/lib/linked_rails/callable_variable.rb +1 -1
- data/lib/linked_rails/collection_params_parser.rb +93 -0
- data/lib/linked_rails/controller/actionable.rb +118 -0
- data/lib/linked_rails/controller/authorization.rb +6 -0
- data/lib/linked_rails/controller/default_actions/create.rb +52 -0
- data/lib/linked_rails/controller/default_actions/destroy.rb +42 -0
- data/lib/linked_rails/controller/default_actions/update.rb +43 -0
- data/lib/linked_rails/controller.rb +20 -3
- data/lib/linked_rails/enhancements/creatable/controller.rb +1 -1
- data/lib/linked_rails/enhancements/destroyable/controller.rb +1 -1
- data/lib/linked_rails/enhancements/updatable/controller.rb +1 -1
- data/lib/linked_rails/enhancements.rb +0 -16
- data/lib/linked_rails/helpers/delta_helper.rb +26 -3
- data/lib/linked_rails/helpers/ontola_actions_helper.rb +2 -2
- data/lib/linked_rails/helpers/resource_helper.rb +1 -1
- data/lib/linked_rails/iri_mapper.rb +17 -39
- data/lib/linked_rails/middleware/linked_data_params.rb +7 -127
- data/lib/linked_rails/model/actionable.rb +69 -0
- data/lib/linked_rails/model/collections.rb +195 -39
- data/lib/linked_rails/model/dirty.rb +1 -1
- data/lib/linked_rails/model/enhancements.rb +1 -6
- data/lib/linked_rails/model/filtering.rb +2 -4
- data/lib/linked_rails/model/indexable.rb +5 -15
- data/lib/linked_rails/model/iri.rb +15 -17
- data/lib/linked_rails/model/iri_mapping.rb +35 -6
- data/lib/linked_rails/model/menuable.rb +34 -0
- data/lib/linked_rails/model/serialization.rb +0 -9
- data/lib/linked_rails/model/singularable.rb +55 -0
- data/lib/linked_rails/model/sorting.rb +0 -5
- data/lib/linked_rails/model/tables.rb +26 -0
- data/lib/linked_rails/model.rb +13 -5
- data/lib/linked_rails/params_parser.rb +131 -55
- data/lib/linked_rails/policy/attribute_conditions.rb +2 -2
- data/lib/linked_rails/policy.rb +24 -17
- data/lib/linked_rails/rdf_error.rb +2 -2
- data/lib/linked_rails/routes.rb +37 -22
- data/lib/linked_rails/serializer/actionable.rb +27 -0
- data/lib/linked_rails/serializer/menuable.rb +31 -0
- data/lib/linked_rails/serializer/singularable.rb +26 -0
- data/lib/linked_rails/serializer.rb +23 -10
- data/lib/linked_rails/test_methods.rb +114 -0
- data/lib/linked_rails/translate.rb +19 -9
- data/lib/linked_rails/uri_template.rb +30 -0
- data/lib/linked_rails/version.rb +1 -1
- data/lib/linked_rails/vocab.rb +8 -0
- data/lib/linked_rails.rb +25 -12
- data/lib/rails/welcome_controller.rb +3 -3
- data/lib/rdf/query_fix.rb +15 -0
- metadata +22 -25
- data/app/models/linked_rails/actions/default_actions/create.rb +0 -60
- data/app/models/linked_rails/actions/default_actions/destroy.rb +0 -45
- data/app/models/linked_rails/actions/default_actions/update.rb +0 -50
- data/app/models/linked_rails/actions/default_actions.rb +0 -17
- data/lib/generators/linked_rails/install/templates/application_action_list.rb +0 -3
- data/lib/generators/linked_rails/model/templates/action_list.rb.tt +0 -6
- data/lib/linked_rails/enhancements/actionable/model.rb +0 -71
- data/lib/linked_rails/enhancements/actionable/serializer.rb +0 -25
- data/lib/linked_rails/enhancements/creatable/action.rb +0 -15
- data/lib/linked_rails/enhancements/destroyable/action.rb +0 -15
- data/lib/linked_rails/enhancements/destroyable/routing.rb +0 -19
- data/lib/linked_rails/enhancements/indexable/model.rb +0 -10
- data/lib/linked_rails/enhancements/menuable/model.rb +0 -36
- data/lib/linked_rails/enhancements/menuable/serializer.rb +0 -33
- data/lib/linked_rails/enhancements/route_concerns.rb +0 -56
- data/lib/linked_rails/enhancements/singularable/controller.rb +0 -43
- data/lib/linked_rails/enhancements/singularable/model.rb +0 -47
- data/lib/linked_rails/enhancements/singularable/serializer.rb +0 -28
- data/lib/linked_rails/enhancements/tableable/model.rb +0 -28
- data/lib/linked_rails/enhancements/updatable/action.rb +0 -15
- data/lib/linked_rails/enhancements/updatable/routing.rb +0 -20
@@ -3,6 +3,11 @@
|
|
3
3
|
module LinkedRails
|
4
4
|
class Form
|
5
5
|
class FieldFactory # rubocop:disable Metrics/ClassLength
|
6
|
+
DATABASE_ERRORS = [
|
7
|
+
'PG::ConnectionBad'.safe_constantize,
|
8
|
+
ActiveRecord::StatementInvalid,
|
9
|
+
ActiveRecord::ConnectionNotEstablished
|
10
|
+
].compact.freeze
|
6
11
|
MAX_STR_LEN = 255
|
7
12
|
VALIDATOR_SELECTORS = [
|
8
13
|
[:min_length, ActiveModel::Validations::LengthValidator, :minimum],
|
@@ -15,7 +20,8 @@ module LinkedRails
|
|
15
20
|
|
16
21
|
attr_accessor :field_options, :form, :key
|
17
22
|
|
18
|
-
delegate :
|
23
|
+
delegate :abstract_form,
|
24
|
+
:form_options_iri,
|
19
25
|
:model_class,
|
20
26
|
:model_policy!,
|
21
27
|
:serializer_attributes,
|
@@ -24,6 +30,8 @@ module LinkedRails
|
|
24
30
|
to: :form
|
25
31
|
|
26
32
|
def condition_or_field
|
33
|
+
return field if abstract_form
|
34
|
+
|
27
35
|
@condition_or_field ||= model_policy!.condition_for(
|
28
36
|
key,
|
29
37
|
field,
|
@@ -45,8 +53,7 @@ module LinkedRails
|
|
45
53
|
end
|
46
54
|
|
47
55
|
def attr_to_datatype # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
48
|
-
|
49
|
-
case attribute_type(name)
|
56
|
+
case attribute_type
|
50
57
|
when :string, :text
|
51
58
|
Vocab.xsd.string
|
52
59
|
when :integer
|
@@ -58,22 +65,26 @@ module LinkedRails
|
|
58
65
|
when :boolean
|
59
66
|
Vocab.xsd.boolean
|
60
67
|
when :decimal
|
61
|
-
decimal_data_type(
|
68
|
+
decimal_data_type(attribute_name)
|
62
69
|
when :file
|
63
70
|
Vocab.ll[:blob]
|
64
71
|
else
|
65
|
-
Vocab.xsd.string if model_class.try(:defined_enums)&.key?(
|
72
|
+
Vocab.xsd.string if model_class.try(:defined_enums)&.key?(attribute_name)
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
76
|
+
def attribute_name
|
77
|
+
serializer_attribute&.key&.to_s || key.to_s
|
78
|
+
end
|
79
|
+
|
80
|
+
def attribute_type
|
81
|
+
model_class.try(:attribute_types).try(:[], attribute_name)&.type
|
82
|
+
rescue *DATABASE_ERRORS
|
72
83
|
:string
|
73
84
|
end
|
74
85
|
|
75
86
|
def attribute_validators
|
76
|
-
@attribute_validators ||= model_class
|
87
|
+
@attribute_validators ||= model_class&.validators&.select { |v| v.attributes.include?(model_attribute) }
|
77
88
|
end
|
78
89
|
|
79
90
|
def datatype
|
@@ -143,7 +154,7 @@ module LinkedRails
|
|
143
154
|
when Vocab.ontola['datatype/postalRange']
|
144
155
|
return Form::Field::PostalRangeInput
|
145
156
|
else
|
146
|
-
|
157
|
+
attribute_type == :text ? Form::Field::TextAreaInput : Form::Field::TextInput
|
147
158
|
end
|
148
159
|
end
|
149
160
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
@@ -6,13 +6,13 @@ module LinkedRails
|
|
6
6
|
attr_accessor :groups, :label, :description
|
7
7
|
attr_writer :key
|
8
8
|
|
9
|
-
def initialize(attrs
|
10
|
-
super(attrs)
|
9
|
+
def initialize(**attrs)
|
10
|
+
super(**attrs)
|
11
11
|
self.groups = []
|
12
12
|
end
|
13
13
|
|
14
|
-
def add_group(opts)
|
15
|
-
group = Form::Group.new(opts)
|
14
|
+
def add_group(**opts)
|
15
|
+
group = Form::Group.new(**opts)
|
16
16
|
groups << group
|
17
17
|
group
|
18
18
|
end
|
@@ -6,9 +6,9 @@ module LinkedRails
|
|
6
6
|
class Form # rubocop:disable Metrics/ClassLength
|
7
7
|
include LinkedRails::Model
|
8
8
|
|
9
|
-
class_attribute :pages, :model_class
|
9
|
+
class_attribute :abstract_form, :pages, :model_class
|
10
10
|
|
11
|
-
def root_relative_iri(_opts
|
11
|
+
def root_relative_iri(**_opts)
|
12
12
|
self.class.form_iri_path
|
13
13
|
end
|
14
14
|
|
@@ -85,7 +85,7 @@ module LinkedRails
|
|
85
85
|
@default_page ||= page(:default)
|
86
86
|
end
|
87
87
|
|
88
|
-
def field(key, opts
|
88
|
+
def field(key, **opts)
|
89
89
|
current_group.fields << Form::FieldFactory.new(
|
90
90
|
field_options: opts,
|
91
91
|
form: self,
|
@@ -108,10 +108,10 @@ module LinkedRails
|
|
108
108
|
current_page.footer_group
|
109
109
|
end
|
110
110
|
|
111
|
-
def group(key, opts
|
111
|
+
def group(key, **opts)
|
112
112
|
opts[:collapsible] = true unless opts.key?(:collapsible)
|
113
113
|
opts[:key] = key
|
114
|
-
group = current_page.add_group(opts)
|
114
|
+
group = current_page.add_group(**opts)
|
115
115
|
@current_group = group
|
116
116
|
|
117
117
|
yield if block_given?
|
@@ -120,26 +120,24 @@ module LinkedRails
|
|
120
120
|
group
|
121
121
|
end
|
122
122
|
|
123
|
-
|
124
|
-
def has_many(key, opts = {})
|
123
|
+
def has_many(key, **opts)
|
125
124
|
opts[:input_field] = Form::Field::AssociationInput
|
126
125
|
opts[:max_count] = 99
|
127
|
-
field(key, opts)
|
126
|
+
field(key, **opts)
|
128
127
|
end
|
129
128
|
|
130
|
-
def has_one(key, opts
|
129
|
+
def has_one(key, **opts)
|
131
130
|
opts[:input_field] = Form::Field::AssociationInput
|
132
131
|
opts[:max_count] = 1
|
133
|
-
field(key, opts)
|
132
|
+
field(key, **opts)
|
134
133
|
end
|
135
|
-
# rubocop:enable Naming/PredicateName
|
136
134
|
|
137
135
|
def hidden(&block)
|
138
136
|
group(:hidden, collapsible: false, hidden: true, &block)
|
139
137
|
end
|
140
138
|
|
141
|
-
def page(key, opts
|
142
|
-
page = Form::Page.new(opts.merge(key: key))
|
139
|
+
def page(key, **opts)
|
140
|
+
page = Form::Page.new(**opts.merge(key: key))
|
143
141
|
@current_page = page
|
144
142
|
pages << @current_page
|
145
143
|
yield if block_given?
|
@@ -147,9 +145,9 @@ module LinkedRails
|
|
147
145
|
page
|
148
146
|
end
|
149
147
|
|
150
|
-
def resource(key, opts
|
148
|
+
def resource(key, **opts)
|
151
149
|
opts[:input_field] = Form::Field::ResourceField
|
152
|
-
field(key, opts)
|
150
|
+
field(key, **opts)
|
153
151
|
end
|
154
152
|
end
|
155
153
|
end
|
@@ -79,7 +79,7 @@ module LinkedRails
|
|
79
79
|
}
|
80
80
|
end
|
81
81
|
|
82
|
-
def web_manifest_ontola_section
|
82
|
+
def web_manifest_ontola_section # rubocop:disable Metrics/MethodLength
|
83
83
|
{
|
84
84
|
css_class: css_class,
|
85
85
|
header_background: header_background,
|
@@ -88,7 +88,9 @@ module LinkedRails
|
|
88
88
|
primary_color: site_theme_color,
|
89
89
|
secondary_color: site_secondary_color,
|
90
90
|
theme: theme,
|
91
|
-
theme_options: theme_options.to_query
|
91
|
+
theme_options: theme_options.to_query,
|
92
|
+
website_iri: LinkedRails.iri.to_s,
|
93
|
+
websocket_path: websocket_path
|
92
94
|
}
|
93
95
|
end
|
94
96
|
|
@@ -98,5 +100,9 @@ module LinkedRails
|
|
98
100
|
scope: scope
|
99
101
|
}
|
100
102
|
end
|
103
|
+
|
104
|
+
def websocket_path
|
105
|
+
Rails.application.config.try(:action_cable).try(:mount_path).try(:[], 1..-1)
|
106
|
+
end
|
101
107
|
end
|
102
108
|
end
|
@@ -26,7 +26,7 @@ module LinkedRails
|
|
26
26
|
def iri_template
|
27
27
|
return parent.send(:iri_template) unless parent.is_a?(LinkedRails::Menus::List)
|
28
28
|
|
29
|
-
return URITemplate.new("#{iri_base}{/tag}{#fragment}") if iri_base
|
29
|
+
return LinkedRails::URITemplate.new("#{iri_base}{/tag}{#fragment}") if iri_base
|
30
30
|
|
31
31
|
iri_template_expand_path(parent.send(:iri_template), '{/tag}')
|
32
32
|
end
|
@@ -34,7 +34,7 @@ module LinkedRails
|
|
34
34
|
private
|
35
35
|
|
36
36
|
def default_label(tag, options)
|
37
|
-
I18n.t("menus.#{resource&.class&.name&.tableize}.#{tag}", options[:label_params])
|
37
|
+
I18n.t("menus.#{resource&.class&.name&.tableize}.#{tag}", **options[:label_params])
|
38
38
|
end
|
39
39
|
|
40
40
|
def menu_available?(_tag, options)
|
@@ -48,6 +48,7 @@ module LinkedRails
|
|
48
48
|
options[:label_params] ||= {}
|
49
49
|
options[:label_params][:default] ||= ["menus.default.#{tag}".to_sym, tag.to_s.capitalize]
|
50
50
|
options[:label] ||= default_label(tag, options)
|
51
|
+
options[:action] = ontola_dialog_action(options[:href]) if options.delete(:dialog)
|
51
52
|
options.except!(:policy_resource, :policy, :policy_arguments, :label_params)
|
52
53
|
LinkedRails.menus_item_class.new(resource: resource, tag: tag, parent: self, **options)
|
53
54
|
end
|
@@ -88,7 +89,7 @@ module LinkedRails
|
|
88
89
|
_defined_menus || {}
|
89
90
|
end
|
90
91
|
|
91
|
-
def has_menu(tag, opts
|
92
|
+
def has_menu(tag, **opts)
|
92
93
|
defined_menus[tag] = opts
|
93
94
|
end
|
94
95
|
|
@@ -12,10 +12,10 @@ module LinkedRails
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def parent_class
|
15
|
-
if klass
|
15
|
+
if klass&.superclass == ApplicationRecord
|
16
16
|
Vocab.schema.Thing
|
17
17
|
else
|
18
|
-
klass
|
18
|
+
klass&.superclass.try(:iri) || Vocab.schema.Thing
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -26,7 +26,7 @@ module LinkedRails
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def properties
|
29
|
-
@properties ||= klass
|
29
|
+
@properties ||= klass&.predicate_mapping&.keys&.map { |key| LinkedRails.ontology_property_class.new(iri: key) }
|
30
30
|
end
|
31
31
|
|
32
32
|
class << self
|
@@ -6,11 +6,11 @@ module LinkedRails
|
|
6
6
|
include LinkedRails::Model
|
7
7
|
|
8
8
|
def classes
|
9
|
-
@classes ||=
|
9
|
+
@classes ||= LinkedRails.linked_models.map do |klass|
|
10
10
|
iri = klass.iri.is_a?(Array) ? klass.iri.first : klass.iri
|
11
11
|
|
12
|
-
LinkedRails.ontology_class_class.new(klass: klass, iri: iri)
|
13
|
-
end
|
12
|
+
LinkedRails.ontology_class_class.new(klass: klass, iri: iri) if iri
|
13
|
+
end.compact
|
14
14
|
end
|
15
15
|
|
16
16
|
def properties
|
@@ -26,8 +26,8 @@ module LinkedRails
|
|
26
26
|
%i[classes properties]
|
27
27
|
end
|
28
28
|
|
29
|
-
def requested_resource(
|
30
|
-
LinkedRails.ontology_class.new
|
29
|
+
def requested_resource(opts, _user_context)
|
30
|
+
LinkedRails.ontology_class.new if opts[:iri].include?(new.root_relative_iri)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -5,7 +5,7 @@ module LinkedRails
|
|
5
5
|
attr_accessor :node, :member_includes, :parent, :raw_members, :scope, :user_context
|
6
6
|
alias read_attribute_for_serialization send
|
7
7
|
|
8
|
-
def initialize(members, opts
|
8
|
+
def initialize(members, **opts)
|
9
9
|
self.member_includes = opts[:member_includes]
|
10
10
|
self.node = opts[:id] || RDF::Node.new
|
11
11
|
self.parent = opts[:parent]
|
@@ -14,7 +14,7 @@ module LinkedRails
|
|
14
14
|
self.user_context = opts[:user_context]
|
15
15
|
end
|
16
16
|
|
17
|
-
def iri(_opts
|
17
|
+
def iri(**_opts)
|
18
18
|
node
|
19
19
|
end
|
20
20
|
alias id iri
|
@@ -12,7 +12,8 @@ module LinkedRails
|
|
12
12
|
end
|
13
13
|
attribute :action_status, predicate: Vocab.schema.actionStatus
|
14
14
|
attribute :favorite, predicate: Vocab.ontola[:favoriteAction]
|
15
|
-
attribute :
|
15
|
+
attribute :one_click, predicate: Vocab.ontola[:oneClick]
|
16
|
+
attribute :target_url, predicate: Vocab.schema.url do |object|
|
16
17
|
object.target[:id] if object.target.is_a?(Hash)
|
17
18
|
end
|
18
19
|
attribute :error, predicate: Vocab.schema.error
|
@@ -11,8 +11,13 @@ module LinkedRails
|
|
11
11
|
attribute :total_count, predicate: Vocab.as.totalItems do |object|
|
12
12
|
object.total_count if object.type == :paginated
|
13
13
|
end
|
14
|
-
attribute :iri_template, predicate: Vocab.ontola[:iriTemplate]
|
15
|
-
|
14
|
+
attribute :iri_template, predicate: Vocab.ontola[:iriTemplate] do |object|
|
15
|
+
object
|
16
|
+
.iri_template
|
17
|
+
.to_s
|
18
|
+
.gsub('{route_key}', object.route_key.to_s)
|
19
|
+
.gsub('{/parent_iri*}', object.parent&.iri&.to_s&.split('?')&.first || LinkedRails.iri)
|
20
|
+
end
|
16
21
|
attribute :default_type, predicate: Vocab.ontola[:defaultType], &:type
|
17
22
|
attribute :display, predicate: Vocab.ontola[:collectionDisplay] do |object|
|
18
23
|
Vocab.ontola["collectionDisplay/#{object.display || :default}"]
|
@@ -6,7 +6,7 @@ module LinkedRails
|
|
6
6
|
|
7
7
|
attribute :label, predicate: Vocab.schema.name
|
8
8
|
attribute :description, predicate: Vocab.schema.text
|
9
|
-
attribute :
|
9
|
+
attribute :target_url, predicate: Vocab.schema.url
|
10
10
|
attribute :http_method, key: :method, predicate: Vocab.schema.httpMethod do |object|
|
11
11
|
object.http_method.upcase
|
12
12
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module LinkedRails
|
4
4
|
class OntologySerializer < LinkedRails.serializer_parent_class
|
5
|
-
has_many :classes
|
6
|
-
has_many :properties
|
5
|
+
has_many :classes, serializer: LinkedRails::Ontology::ClassSerializer
|
6
|
+
has_many :properties, serializer: LinkedRails::Ontology::PropertySerializer
|
7
7
|
end
|
8
8
|
end
|
@@ -12,7 +12,6 @@ module LinkedRails
|
|
12
12
|
def install # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
13
13
|
template 'vocab.rb', 'lib/vocab.rb'
|
14
14
|
template 'initializer.rb', 'config/initializers/linked_rails.rb'
|
15
|
-
template 'application_action_list.rb', 'app/actions/application_action_list.rb'
|
16
15
|
template 'application_form.rb', 'app/forms/application_form.rb'
|
17
16
|
template 'application_menu_list.rb', 'app/menus/application_menu_list.rb'
|
18
17
|
template 'application_policy.rb', 'app/policies/application_policy.rb'
|
@@ -22,9 +21,12 @@ module LinkedRails
|
|
22
21
|
template 'rdf_serializers_initializer.rb', 'config/initializers/rdf_serializers.rb'
|
23
22
|
template 'locales.yml', 'config/locales/linked_rails.en.yml'
|
24
23
|
template 'vocab.yml', 'config/locales/vocab.en.yml'
|
24
|
+
route 'find_tenant_route'
|
25
25
|
route 'use_linked_rails'
|
26
26
|
application 'config.middleware.use LinkedRails::Middleware::LinkedDataParams'
|
27
27
|
application 'config.jwt_encryption_method = :hs512'
|
28
|
+
gsub_file('config/environments/development.rb', 'config.eager_load = false', 'config.eager_load = true')
|
29
|
+
gsub_file('config/environments/development.rb', 'config.cache_classes = false', 'config.cache_classes = true')
|
28
30
|
inject_includes
|
29
31
|
|
30
32
|
readme 'README'
|
@@ -37,17 +39,12 @@ module LinkedRails
|
|
37
39
|
inject_model_include
|
38
40
|
end
|
39
41
|
|
40
|
-
def inject_controller_include
|
42
|
+
def inject_controller_include
|
41
43
|
sentinel = /class ApplicationController < ActionController::API\n/m
|
42
44
|
in_root do
|
43
45
|
inject_into_file(
|
44
46
|
'app/controllers/application_controller.rb',
|
45
|
-
optimize_indentation(
|
46
|
-
"include ActionController::MimeResponds\n"\
|
47
|
-
"include ActiveResponse::Controller\n"\
|
48
|
-
'include LinkedRails::Controller',
|
49
|
-
2
|
50
|
-
),
|
47
|
+
optimize_indentation('include LinkedRails::Controller', 2),
|
51
48
|
after: sentinel
|
52
49
|
)
|
53
50
|
end
|
@@ -8,29 +8,58 @@ class AppMenuList < ApplicationMenuList
|
|
8
8
|
menus: -> { user_menu_items }
|
9
9
|
|
10
10
|
def iri_template
|
11
|
-
@iri_template ||= URITemplate.new('/menus{#fragment}')
|
11
|
+
@iri_template ||= LinkedRails::URITemplate.new('/menus{#fragment}')
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def
|
17
|
-
|
18
|
-
items << menu_item(
|
16
|
+
def home_menu_item
|
17
|
+
menu_item(
|
19
18
|
:home,
|
20
19
|
label: I18n.t('menus.home'),
|
21
20
|
href: LinkedRails.iri,
|
22
21
|
image: 'fa-home'
|
23
22
|
)
|
24
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
def navigation_links
|
26
|
+
[home_menu_item]
|
25
27
|
end
|
26
28
|
|
27
29
|
def user_menu_items
|
28
30
|
return [] if user_context.guest?
|
29
31
|
|
30
|
-
[
|
32
|
+
[
|
33
|
+
otp_menu_item,
|
34
|
+
sign_out_menu_item
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def otp_menu_item
|
39
|
+
if user_context.otp_active?
|
40
|
+
delete_otp_menu_item
|
41
|
+
else
|
42
|
+
add_otp_menu_item
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_otp_menu_item
|
47
|
+
menu_item(
|
48
|
+
:otp,
|
49
|
+
label: I18n.t('menus.delete_otp'),
|
50
|
+
href: LinkedRails.iri(path: 'u/otp_secret/delete')
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_otp_menu_item
|
55
|
+
menu_item(
|
56
|
+
:otp,
|
57
|
+
label: I18n.t('menus.add_otp'),
|
58
|
+
href: LinkedRails.iri(path: 'u/otp_secret/new')
|
59
|
+
)
|
31
60
|
end
|
32
61
|
|
33
|
-
def
|
62
|
+
def sign_out_menu_item
|
34
63
|
menu_item(
|
35
64
|
:signout,
|
36
65
|
action: Vocab.libro['actions/logout'],
|
@@ -1,3 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class ApplicationMenuList < LinkedRails::Menus::List
|
3
|
+
class ApplicationMenuList < LinkedRails::Menus::List
|
4
|
+
include LinkedRails::Helpers::OntolaActionsHelper
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def copy_menu_item(url)
|
9
|
+
menu_item(
|
10
|
+
:copy,
|
11
|
+
action: ontola_copy_action(url),
|
12
|
+
item_type: 'copy',
|
13
|
+
image: 'fa-clipboard',
|
14
|
+
href: url
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete_menu_item(resource)
|
19
|
+
iri = resource.iri.dup
|
20
|
+
iri.path += '/delete'
|
21
|
+
|
22
|
+
menu_item(
|
23
|
+
:destroy,
|
24
|
+
action: ontola_dialog_action(iri),
|
25
|
+
href: iri,
|
26
|
+
image: 'fa-close',
|
27
|
+
policy: :destroy?
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def edit_menu_item(resource)
|
32
|
+
iri = resource.iri.dup
|
33
|
+
iri.path += '/edit'
|
34
|
+
|
35
|
+
menu_item(
|
36
|
+
:edit,
|
37
|
+
image: 'fa-edit',
|
38
|
+
href: iri,
|
39
|
+
policy: :update?
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
@@ -2,8 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative '../../lib/vocab'
|
4
4
|
|
5
|
-
LinkedRails.host = '
|
5
|
+
LinkedRails.host = raise('Enter your host. Use an ENV var if you have multiple environments')
|
6
6
|
LinkedRails.scheme = :https
|
7
|
-
LinkedRails.app_vocab = Vocab.example
|
8
7
|
|
9
8
|
LinkedRails::Renderers.register!
|
@@ -1,4 +1,16 @@
|
|
1
1
|
en:
|
2
|
+
actions:
|
3
|
+
default:
|
4
|
+
create:
|
5
|
+
label: "New %{type}"
|
6
|
+
success: 'Created successfully'
|
7
|
+
destroy:
|
8
|
+
label: "Delete"
|
9
|
+
description: "Are you sure you want to delete this %{type}?"
|
10
|
+
success: 'Destroyed successfully'
|
11
|
+
update:
|
12
|
+
label: "Edit"
|
13
|
+
success: 'Updated successfully'
|
2
14
|
linked_rails:
|
3
15
|
status:
|
4
16
|
400: "Error in request"
|
@@ -17,7 +17,6 @@ module LinkedRails
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def copy_files # rubocop:disable Metrics/AbcSize
|
20
|
-
template 'action_list.rb', File.join('app', 'actions', class_path, "#{file_name}_action_list.rb")
|
21
20
|
template 'controller.rb', File.join('app', 'controllers', class_path, "#{plural_file_name}_controller.rb")
|
22
21
|
template 'form.rb', File.join('app', 'forms', class_path, "#{file_name}_form.rb")
|
23
22
|
template 'menu_list.rb', File.join('app', 'menus', class_path, "#{file_name}_menu_list.rb")
|
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
<% module_namespacing do -%>
|
4
4
|
class <%= controller_class_name %>Controller < ApplicationController
|
5
|
-
|
5
|
+
active_response :show, :index
|
6
|
+
|
7
|
+
has_collection_create_action
|
8
|
+
has_resource_update_action
|
9
|
+
has_resource_destroy_action
|
6
10
|
end
|
7
11
|
<% end -%>
|
@@ -2,5 +2,20 @@
|
|
2
2
|
|
3
3
|
<% module_namespacing do -%>
|
4
4
|
class <%= class_name %>MenuList < ApplicationMenuList
|
5
|
+
has_menu(
|
6
|
+
:actions,
|
7
|
+
image: 'fa-ellipsis-v',
|
8
|
+
menus: -> { action_menu_items }
|
9
|
+
)
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def action_menu_items
|
14
|
+
[
|
15
|
+
edit_menu_item(resource),
|
16
|
+
delete_menu_item(resource),
|
17
|
+
copy_menu_item(resource.iri),
|
18
|
+
]
|
19
|
+
end
|
5
20
|
end
|
6
21
|
<% end -%>
|