linked_rails 0.0.3 → 0.0.4
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/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,54 +3,21 @@
|
|
|
3
3
|
module LinkedRails
|
|
4
4
|
class Collection
|
|
5
5
|
module Iri
|
|
6
|
-
|
|
6
|
+
DEFAULT_IRI_TEMPLATE_KEYS = %i[before%5B%5D display filter%5B%5D page page_size sort%5B%5D title type].freeze
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
attr_writer :iri_template
|
|
10
|
-
end
|
|
8
|
+
extend ActiveSupport::Concern
|
|
11
9
|
|
|
12
10
|
def iri_opts
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def iri_template
|
|
24
|
-
@iri_template ||=
|
|
25
|
-
URITemplate.new(
|
|
26
|
-
[
|
|
27
|
-
LinkedRails.iri(
|
|
28
|
-
path: [parent&.root_relative_iri&.to_s&.split('?')&.first, association_class.route_key].join('/')
|
|
29
|
-
),
|
|
30
|
-
"{?#{self.class.iri_template_parsed_keys}}"
|
|
31
|
-
].join('')
|
|
32
|
-
)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def iri_template_opts
|
|
36
|
-
opts = iri_opts.with_indifferent_access.slice(*self.class.iri_template_keys)
|
|
37
|
-
Hash[opts.keys.map { |key| [CGI.unescape(key).sub('[]', ''), opts[key]] }].to_param
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def filter_iri_opts
|
|
41
|
-
@filter&.map do |key, values|
|
|
42
|
-
predicate = key.is_a?(RDF::URI) ? key : association_class.predicate_for_key(key)
|
|
43
|
-
|
|
44
|
-
values.map { |value| "#{CGI.escape(predicate.to_s)}=#{CGI.escape(value.to_s)}" }
|
|
45
|
-
end&.flatten
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def iri_opts_add(opts, key, value)
|
|
49
|
-
opts[key] = value if value.present?
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def sort_iri_opts
|
|
53
|
-
sort&.map { |s| "#{CGI.escape(s[:key].to_s)}=#{s[:direction]}" }
|
|
11
|
+
{
|
|
12
|
+
parent_iri: parent_iri,
|
|
13
|
+
display: @display,
|
|
14
|
+
title: @title,
|
|
15
|
+
type: @type,
|
|
16
|
+
page_size: @page_size,
|
|
17
|
+
filter: self.class.filter_iri_opts(@filter),
|
|
18
|
+
route_key: route_key,
|
|
19
|
+
sort: self.class.sort_iri_opts(@sort)
|
|
20
|
+
}.compact
|
|
54
21
|
end
|
|
55
22
|
|
|
56
23
|
class_methods do
|
|
@@ -58,15 +25,29 @@ module LinkedRails
|
|
|
58
25
|
[super, Vocab.as.Collection]
|
|
59
26
|
end
|
|
60
27
|
|
|
61
|
-
def
|
|
62
|
-
|
|
28
|
+
def filter_iri_opts(filters)
|
|
29
|
+
return nil if filters.blank?
|
|
30
|
+
|
|
31
|
+
Hash[
|
|
32
|
+
filters.map do |key, values|
|
|
33
|
+
predicate = key.is_a?(RDF::URI) ? key : association_class.predicate_for_key(key)
|
|
34
|
+
[predicate, values]
|
|
35
|
+
end
|
|
36
|
+
]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def generate_iri_template(iri_template_keys)
|
|
40
|
+
URITemplate.new("{/parent_iri*}/{route_key}{?#{parse_iri_template_keys(iri_template_keys)}}")
|
|
63
41
|
end
|
|
64
42
|
|
|
65
|
-
def
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
43
|
+
def parse_iri_template_keys(keys)
|
|
44
|
+
(DEFAULT_IRI_TEMPLATE_KEYS + keys).map { |k| k.to_s.ends_with?('%5B%5D') ? "#{k}*" : k.to_s }.join(',')
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def sort_iri_opts(sortings)
|
|
48
|
+
return nil if sortings.blank?
|
|
49
|
+
|
|
50
|
+
Hash[sortings.map { |s| [s[:key], s[:direction]] }]
|
|
70
51
|
end
|
|
71
52
|
end
|
|
72
53
|
end
|
|
@@ -7,9 +7,9 @@ module LinkedRails
|
|
|
7
7
|
|
|
8
8
|
class_methods do
|
|
9
9
|
def collection_or_view(options, params)
|
|
10
|
-
|
|
11
|
-
collection = new(options
|
|
12
|
-
view_params = collection_view_params(
|
|
10
|
+
params_parser = params_parser_class.new(params)
|
|
11
|
+
collection = new(**merge_collection_opts(options, params_parser))
|
|
12
|
+
view_params = collection_view_params(params_parser)
|
|
13
13
|
|
|
14
14
|
view_params.present? ? collection&.view_with_opts(view_params) : collection
|
|
15
15
|
end
|
|
@@ -20,12 +20,20 @@ module LinkedRails
|
|
|
20
20
|
parser.collection_params
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def collection_view_params(
|
|
24
|
-
|
|
23
|
+
def collection_view_params(params_parser)
|
|
24
|
+
params_parser.collection_view_params
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def merge_collection_opts(options, params_parser)
|
|
28
|
+
transformed_options = options.transform_keys do |key|
|
|
29
|
+
LinkedRails::Model::Collections::COLLECTION_CUSTOMIZABLE_OPTIONS.key?(key.to_sym) ? "default_#{key}" : key
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
transformed_options.merge(collection_params(params_parser))
|
|
25
33
|
end
|
|
26
34
|
|
|
27
35
|
def params_parser_class
|
|
28
|
-
LinkedRails::
|
|
36
|
+
LinkedRails::CollectionParamsParser
|
|
29
37
|
end
|
|
30
38
|
end
|
|
31
39
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LinkedRails
|
|
4
|
+
class Collection
|
|
5
|
+
module Paginated
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
attr_accessor :page
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def next
|
|
13
|
+
return if page.nil? || page.to_i >= (total_page_count || 0)
|
|
14
|
+
|
|
15
|
+
iri_with_root(root_relative_iri(page: page.to_i + 1))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def prev
|
|
19
|
+
return if page.nil? || page.to_i <= 1
|
|
20
|
+
|
|
21
|
+
iri_with_root(root_relative_iri(page: page.to_i - 1))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def iri_opts
|
|
27
|
+
{
|
|
28
|
+
page: page
|
|
29
|
+
}.merge(collection.iri_opts)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def members_query
|
|
33
|
+
prepare_members(association_base)
|
|
34
|
+
.page(page)
|
|
35
|
+
.per(page_size)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def prepare_members(scope)
|
|
39
|
+
return super unless scope.is_a?(Array) && !scope.is_a?(Kaminari::PaginatableArray)
|
|
40
|
+
|
|
41
|
+
Kaminari.paginate_array(super)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -3,39 +3,7 @@
|
|
|
3
3
|
module LinkedRails
|
|
4
4
|
class Collection
|
|
5
5
|
class PaginatedView < LinkedRails.collection_view_class
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def next
|
|
9
|
-
return if page.nil? || page.to_i >= (total_page_count || 0)
|
|
10
|
-
|
|
11
|
-
iri_with_root(root_relative_iri(page: page.to_i + 1))
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def prev
|
|
15
|
-
return if page.nil? || page.to_i <= 1
|
|
16
|
-
|
|
17
|
-
iri_with_root(root_relative_iri(page: page.to_i - 1))
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
def iri_opts
|
|
23
|
-
{
|
|
24
|
-
page: page
|
|
25
|
-
}.merge(collection.iri_opts)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def members_query
|
|
29
|
-
prepare_members(association_base)
|
|
30
|
-
.page(page)
|
|
31
|
-
.per(page_size)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def prepare_members(scope)
|
|
35
|
-
return super unless scope.is_a?(Array) && !scope.is_a?(Kaminari::PaginatableArray)
|
|
36
|
-
|
|
37
|
-
Kaminari.paginate_array(super)
|
|
38
|
-
end
|
|
6
|
+
include LinkedRails::Collection::Paginated
|
|
39
7
|
end
|
|
40
8
|
end
|
|
41
9
|
end
|
|
@@ -4,7 +4,7 @@ module LinkedRails
|
|
|
4
4
|
class Collection
|
|
5
5
|
module Sortable
|
|
6
6
|
attr_accessor :sort
|
|
7
|
-
attr_writer :
|
|
7
|
+
attr_writer :sort_options
|
|
8
8
|
|
|
9
9
|
def default_before_value
|
|
10
10
|
sortings.map do |sorting|
|
|
@@ -15,14 +15,6 @@ module LinkedRails
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def default_sortings
|
|
19
|
-
opts =
|
|
20
|
-
@default_sortings ||
|
|
21
|
-
association_class.try(:default_sortings) ||
|
|
22
|
-
[{key: Vocab.schema.dateCreated, direction: :desc}]
|
|
23
|
-
opts.respond_to?(:call) ? opts.call(parent) : opts
|
|
24
|
-
end
|
|
25
|
-
|
|
26
18
|
def parsed_sort_values
|
|
27
19
|
sortings.map(&:sort_value)
|
|
28
20
|
end
|
|
@@ -14,8 +14,8 @@ module LinkedRails
|
|
|
14
14
|
|
|
15
15
|
alias id iri
|
|
16
16
|
|
|
17
|
-
def root_relative_iri(opts
|
|
18
|
-
collection.unfiltered.root_relative_iri(iri_opts.merge(opts))
|
|
17
|
+
def root_relative_iri(**opts)
|
|
18
|
+
collection.unfiltered.root_relative_iri(**iri_opts.merge(opts))
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def member_sequence
|
|
@@ -78,15 +78,15 @@ module LinkedRails
|
|
|
78
78
|
[super, Vocab.as.CollectionPage]
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
def new(opts
|
|
81
|
+
def new(**opts)
|
|
82
82
|
type = opts.delete(:type)&.to_sym
|
|
83
83
|
return super if type.nil?
|
|
84
84
|
|
|
85
85
|
case type
|
|
86
86
|
when :paginated
|
|
87
|
-
|
|
87
|
+
collection_paginated_view_class.new(**opts)
|
|
88
88
|
when :infinite
|
|
89
|
-
|
|
89
|
+
collection_infinite_view_class.new(**opts)
|
|
90
90
|
else
|
|
91
91
|
raise ActionController::BadRequest, "'#{type}' is not a valid collection type"
|
|
92
92
|
end
|
|
@@ -95,6 +95,16 @@ module LinkedRails
|
|
|
95
95
|
def policy_class
|
|
96
96
|
LinkedRails::Collection::ViewPolicy
|
|
97
97
|
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def collection_paginated_view_class
|
|
102
|
+
LinkedRails.collection_paginated_view_class
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def collection_infinite_view_class
|
|
106
|
+
LinkedRails.collection_infinite_view_class
|
|
107
|
+
end
|
|
98
108
|
end
|
|
99
109
|
end
|
|
100
110
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'pundit'
|
|
4
4
|
|
|
5
|
+
require_relative 'collection/configuration'
|
|
5
6
|
require_relative 'collection/filter'
|
|
6
7
|
require_relative 'collection/filterable'
|
|
7
8
|
require_relative 'collection/iri'
|
|
@@ -9,28 +10,38 @@ require_relative 'collection/iri_mapping'
|
|
|
9
10
|
require_relative 'collection/sortable'
|
|
10
11
|
require_relative 'collection/sorting'
|
|
11
12
|
require_relative 'collection/view'
|
|
13
|
+
require_relative 'collection/paginated'
|
|
12
14
|
require_relative 'collection/paginated_view'
|
|
15
|
+
require_relative 'collection/infinite'
|
|
13
16
|
require_relative 'collection/infinite_view'
|
|
14
17
|
|
|
15
18
|
module LinkedRails
|
|
16
19
|
class Collection # rubocop:disable Metrics/ClassLength
|
|
17
20
|
include ActiveModel::Model
|
|
18
|
-
include LinkedRails::Model::
|
|
21
|
+
include LinkedRails::Model::Actionable
|
|
19
22
|
include LinkedRails::Model::Iri
|
|
23
|
+
include LinkedRails::Collection::Configuration
|
|
20
24
|
include LinkedRails::Collection::Filterable
|
|
21
25
|
include LinkedRails::Collection::Iri
|
|
22
26
|
include LinkedRails::Collection::IriMapping
|
|
23
27
|
include LinkedRails::Collection::Sortable
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
attr_accessor :association, :association_class, :association_scope, :grid_max_columns, :joins,
|
|
28
|
-
:name, :page_size, :parent, :part_of, :policy, :user_context, :view
|
|
29
|
-
attr_writer :association_base, :table_type, :default_display, :default_title, :default_type,
|
|
30
|
-
:display, :policy_scope, :title, :type, :views
|
|
29
|
+
attr_accessor :name, :policy, :user_context, :view
|
|
30
|
+
attr_writer :association_base, :views
|
|
31
31
|
|
|
32
32
|
alias id iri
|
|
33
33
|
|
|
34
|
+
def initialize(**opts)
|
|
35
|
+
opts = opts.with_indifferent_access
|
|
36
|
+
|
|
37
|
+
%i[association_class iri_template].each do |key|
|
|
38
|
+
raise("No #{key} given") if opts[key].blank?
|
|
39
|
+
end
|
|
40
|
+
opts[:route_key] ||= opts[:association_class].collection_route_key
|
|
41
|
+
|
|
42
|
+
super
|
|
43
|
+
end
|
|
44
|
+
|
|
34
45
|
def action_list(user_context)
|
|
35
46
|
@action_list ||= {}
|
|
36
47
|
@action_list[user_context] ||= association_class.try(:action_list)&.new(
|
|
@@ -56,18 +67,14 @@ module LinkedRails
|
|
|
56
67
|
super(options.merge(except: %w[association_class unfiltered_collection collection]))
|
|
57
68
|
end
|
|
58
69
|
|
|
59
|
-
def association_base
|
|
60
|
-
@association_base ||= apply_scope(sorted_association(filtered_association))
|
|
61
|
-
end
|
|
62
|
-
|
|
63
70
|
def build_child # rubocop:disable Metrics/AbcSize
|
|
64
71
|
child =
|
|
65
72
|
parent&.build_child(association_class, user_context: user_context) ||
|
|
66
73
|
association_class.build_new(parent: parent, user_context: user_context)
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
parser = LinkedRails::ParamsParser.new(user_context: user_context, params: {filter: @filter})
|
|
69
76
|
permitted_child_keys = Pundit.policy(user_context, child)&.permitted_attributes || []
|
|
70
|
-
permitted_attributes_from_filters = attributes_from_filters.permit(permitted_child_keys)
|
|
77
|
+
permitted_attributes_from_filters = parser.attributes_from_filters(association_class).permit(permitted_child_keys)
|
|
71
78
|
|
|
72
79
|
child.assign_attributes(permitted_attributes_from_filters)
|
|
73
80
|
child
|
|
@@ -79,18 +86,10 @@ module LinkedRails
|
|
|
79
86
|
RDF::List[*columns_list] if columns_list.present?
|
|
80
87
|
end
|
|
81
88
|
|
|
82
|
-
def default_page_size
|
|
83
|
-
association_class.try(:default_per_page) || 20
|
|
84
|
-
end
|
|
85
|
-
|
|
86
89
|
def default_view
|
|
87
90
|
@default_view ||= view_with_opts(default_view_opts)
|
|
88
91
|
end
|
|
89
92
|
|
|
90
|
-
def display
|
|
91
|
-
@display&.to_sym || default_display
|
|
92
|
-
end
|
|
93
|
-
|
|
94
93
|
def first
|
|
95
94
|
case type
|
|
96
95
|
when :paginated
|
|
@@ -110,7 +109,7 @@ module LinkedRails
|
|
|
110
109
|
|
|
111
110
|
def new_child(options)
|
|
112
111
|
attrs = options.merge(new_child_values)
|
|
113
|
-
self.class.new(attrs)
|
|
112
|
+
self.class.new(**attrs)
|
|
114
113
|
end
|
|
115
114
|
|
|
116
115
|
def preview_includes
|
|
@@ -122,32 +121,12 @@ module LinkedRails
|
|
|
122
121
|
}
|
|
123
122
|
end
|
|
124
123
|
|
|
125
|
-
def title
|
|
126
|
-
var = @title || @default_title
|
|
127
|
-
return var.call(parent) if var.respond_to?(:call)
|
|
128
|
-
|
|
129
|
-
var || title_from_translation
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def title_from_translation
|
|
133
|
-
plural = association_class.name.tableize
|
|
134
|
-
I18n.t(
|
|
135
|
-
"#{plural}.collection.#{@filter&.values&.join('.').presence || name || :default}",
|
|
136
|
-
count: ->(_opts) { total_count },
|
|
137
|
-
default: association_class.plural_label
|
|
138
|
-
)
|
|
139
|
-
end
|
|
140
|
-
|
|
141
124
|
def total_count
|
|
142
125
|
@total_count ||= association_base.try(:total_count) || unscoped_association.count
|
|
143
126
|
end
|
|
144
127
|
|
|
145
128
|
def total_page_count
|
|
146
|
-
(total_count /
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def type
|
|
150
|
-
@type&.to_sym || default_type
|
|
129
|
+
(total_count / page_size.to_f).ceil if total_count
|
|
151
130
|
end
|
|
152
131
|
|
|
153
132
|
def unscoped_association
|
|
@@ -160,21 +139,15 @@ module LinkedRails
|
|
|
160
139
|
|
|
161
140
|
def view_with_opts(opts)
|
|
162
141
|
@views ||= []
|
|
163
|
-
view =
|
|
142
|
+
view = collection_view_class.new(**{collection: self, type: type}.merge(opts))
|
|
164
143
|
@views << view
|
|
165
144
|
view
|
|
166
145
|
end
|
|
167
146
|
|
|
168
147
|
private
|
|
169
148
|
|
|
170
|
-
def
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
@default_display || association_class.try(:default_collection_display)
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def default_type
|
|
177
|
-
@default_type || association_class.try(:default_collection_type) || :paginated
|
|
149
|
+
def collection_view_class
|
|
150
|
+
LinkedRails.collection_view_class
|
|
178
151
|
end
|
|
179
152
|
|
|
180
153
|
def default_view_opts
|
|
@@ -187,30 +160,23 @@ module LinkedRails
|
|
|
187
160
|
opts
|
|
188
161
|
end
|
|
189
162
|
|
|
190
|
-
def policy_scope
|
|
191
|
-
return @policy_scope if @policy_scope == false
|
|
192
|
-
|
|
193
|
-
@policy_scope = policy ? policy::Scope : Pundit::PolicyFinder.new(filtered_association).scope!
|
|
194
|
-
end
|
|
195
|
-
|
|
196
163
|
def paginated?
|
|
197
164
|
type == :paginated
|
|
198
165
|
end
|
|
199
166
|
|
|
200
|
-
def
|
|
201
|
-
|
|
167
|
+
def title_from_translation
|
|
168
|
+
plural = association_class.name.tableize
|
|
202
169
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
end
|
|
170
|
+
I18n.t(
|
|
171
|
+
"#{plural}.collection.#{filter&.values&.join('.').presence || name || :default}",
|
|
172
|
+
count: ->(_opts) { total_count },
|
|
173
|
+
default: association_class.plural_label
|
|
174
|
+
)
|
|
209
175
|
end
|
|
210
176
|
|
|
211
177
|
def new_child_values
|
|
212
178
|
instance_values
|
|
213
|
-
.slice('
|
|
179
|
+
.slice('iri_template', *LinkedRails::Model::Collections::COLLECTION_STATIC_OPTIONS.keys.map(&:to_s))
|
|
214
180
|
.merge(
|
|
215
181
|
unfiltered_collection: filtered? ? @unfiltered_collection : self,
|
|
216
182
|
user_context: user_context
|
|
@@ -6,7 +6,7 @@ module LinkedRails
|
|
|
6
6
|
include LinkedRails::Model
|
|
7
7
|
|
|
8
8
|
attr_accessor :parent
|
|
9
|
-
attr_writer :
|
|
9
|
+
attr_writer :target_url
|
|
10
10
|
delegate :form, :description, :http_method, :image, :user_context,
|
|
11
11
|
:resource, :tag, to: :parent
|
|
12
12
|
|
|
@@ -16,12 +16,15 @@ module LinkedRails
|
|
|
16
16
|
form&.form_iri
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def as_json(_opts
|
|
19
|
+
def as_json(**_opts)
|
|
20
20
|
{}
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def iri_template
|
|
24
|
-
@iri_template ||= iri_template_with_fragment(
|
|
24
|
+
@iri_template ||= iri_template_with_fragment(
|
|
25
|
+
LinkedRails::URITemplate.new(parent.root_relative_iri.to_s),
|
|
26
|
+
:EntryPoint
|
|
27
|
+
)
|
|
25
28
|
end
|
|
26
29
|
|
|
27
30
|
def label
|
|
@@ -30,8 +33,8 @@ module LinkedRails
|
|
|
30
33
|
value || label_fallback
|
|
31
34
|
end
|
|
32
35
|
|
|
33
|
-
def
|
|
34
|
-
@
|
|
36
|
+
def target_url
|
|
37
|
+
@target_url || parent.target_url
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
private
|
|
@@ -12,7 +12,7 @@ module LinkedRails
|
|
|
12
12
|
label_from_variable || LinkedRails.translate(:enum, :label, self)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def iri(_opts
|
|
15
|
+
def iri(**_opts)
|
|
16
16
|
@iri || iri_with_root(RDF::URI("/enums/#{klass.name.tableize}/#{attr}##{key}"))
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -29,5 +29,43 @@ module LinkedRails
|
|
|
29
29
|
def label_from_variable
|
|
30
30
|
@label.respond_to?(:call) ? @label.call : @label
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
class << self
|
|
34
|
+
def class_for_params(params)
|
|
35
|
+
LinkedRails.linked_models.detect do |klass|
|
|
36
|
+
klass.to_s == ([params[:module]].compact + [params[:klass]&.singularize]).join('/').classify
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def enum_options(params)
|
|
41
|
+
serializer_for_params(params)&.enum_options(params[:attribute])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def requested_resource(opts, _user_context)
|
|
45
|
+
options = enum_options(opts[:params])
|
|
46
|
+
|
|
47
|
+
return unless options
|
|
48
|
+
|
|
49
|
+
LinkedRails::Sequence.new(
|
|
50
|
+
options.values,
|
|
51
|
+
id: sanitized_sequence_iri(opts[:iri]),
|
|
52
|
+
scope: LinkedRails::EnumValuePolicy::Scope
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def sanitized_sequence_iri(raw_iri)
|
|
57
|
+
iri = RDF::URI(raw_iri)
|
|
58
|
+
iri.query = nil
|
|
59
|
+
iri.fragment = nil
|
|
60
|
+
iri.path = iri.path.split('.').first
|
|
61
|
+
iri
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def serializer_for_params(params)
|
|
65
|
+
klass = class_for_params(params)
|
|
66
|
+
|
|
67
|
+
RDF::Serializers.serializer_for(klass) if klass
|
|
68
|
+
end
|
|
69
|
+
end
|
|
32
70
|
end
|
|
33
71
|
end
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
module LinkedRails
|
|
4
4
|
class Form
|
|
5
5
|
class Field < LinkedRails::Resource
|
|
6
|
-
attr_writer :
|
|
7
|
-
:description,
|
|
6
|
+
attr_writer :description,
|
|
8
7
|
:helper_text,
|
|
9
8
|
:label,
|
|
10
9
|
:max_length,
|
|
@@ -13,7 +12,8 @@ module LinkedRails
|
|
|
13
12
|
:sh_in,
|
|
14
13
|
:pattern,
|
|
15
14
|
:path
|
|
16
|
-
attr_accessor :
|
|
15
|
+
attr_accessor :datatype,
|
|
16
|
+
:default_value,
|
|
17
17
|
:max_count,
|
|
18
18
|
:max_count_prop,
|
|
19
19
|
:max_inclusive,
|
|
@@ -31,9 +31,6 @@ module LinkedRails
|
|
|
31
31
|
:validators,
|
|
32
32
|
:sh_in_prop,
|
|
33
33
|
:key
|
|
34
|
-
def datatype
|
|
35
|
-
@datatype || raise("No datatype found for #{key} in #{form.name}")
|
|
36
|
-
end
|
|
37
34
|
|
|
38
35
|
def description
|
|
39
36
|
description_from_attribute || description_fallback
|
|
@@ -101,9 +98,10 @@ module LinkedRails
|
|
|
101
98
|
end
|
|
102
99
|
|
|
103
100
|
def label_fallback
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
LinkedRails.translate(:field, :label, self, false).presence || label_from_property
|
|
102
|
+
end
|
|
106
103
|
|
|
104
|
+
def label_from_property
|
|
107
105
|
LinkedRails.translate(:property, :label, path) if path
|
|
108
106
|
end
|
|
109
107
|
|