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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/linked_rails/bulk_controller.rb +26 -6
  3. data/app/controllers/linked_rails/enum_values_controller.rb +0 -42
  4. data/app/models/linked_rails/actions/item.rb +46 -30
  5. data/app/models/linked_rails/actions/list.rb +6 -25
  6. data/app/models/linked_rails/collection/configuration.rb +55 -0
  7. data/app/models/linked_rails/collection/filter.rb +1 -1
  8. data/app/models/linked_rails/collection/filter_field.rb +5 -1
  9. data/app/models/linked_rails/collection/filter_option.rb +1 -1
  10. data/app/models/linked_rails/collection/filterable.rb +3 -8
  11. data/app/models/linked_rails/collection/infinite.rb +102 -0
  12. data/app/models/linked_rails/collection/infinite_view.rb +1 -90
  13. data/app/models/linked_rails/collection/iri.rb +33 -52
  14. data/app/models/linked_rails/collection/iri_mapping.rb +14 -6
  15. data/app/models/linked_rails/collection/paginated.rb +45 -0
  16. data/app/models/linked_rails/collection/paginated_view.rb +1 -33
  17. data/app/models/linked_rails/collection/sortable.rb +1 -9
  18. data/app/models/linked_rails/collection/sorting.rb +1 -1
  19. data/app/models/linked_rails/collection/view.rb +15 -5
  20. data/app/models/linked_rails/collection.rb +33 -67
  21. data/app/models/linked_rails/creative_work.rb +1 -1
  22. data/app/models/linked_rails/entry_point.rb +8 -5
  23. data/app/models/linked_rails/enum_value.rb +39 -1
  24. data/app/models/linked_rails/form/field/resource_field.rb +2 -0
  25. data/app/models/linked_rails/form/field.rb +6 -8
  26. data/app/models/linked_rails/form/field_factory.rb +21 -10
  27. data/app/models/linked_rails/form/group.rb +2 -2
  28. data/app/models/linked_rails/form/page.rb +4 -4
  29. data/app/models/linked_rails/form.rb +13 -15
  30. data/app/models/linked_rails/manifest.rb +8 -2
  31. data/app/models/linked_rails/menus/item.rb +1 -1
  32. data/app/models/linked_rails/menus/list.rb +3 -2
  33. data/app/models/linked_rails/ontology/base.rb +1 -1
  34. data/app/models/linked_rails/ontology/class.rb +3 -3
  35. data/app/models/linked_rails/ontology.rb +5 -5
  36. data/app/models/linked_rails/sequence.rb +2 -2
  37. data/app/models/linked_rails/shacl/property_shape.rb +1 -1
  38. data/app/models/linked_rails/widget.rb +1 -1
  39. data/app/serializers/linked_rails/actions/item_serializer.rb +2 -1
  40. data/app/serializers/linked_rails/collection_serializer.rb +7 -2
  41. data/app/serializers/linked_rails/entry_point_serializer.rb +1 -1
  42. data/app/serializers/linked_rails/ontology_serializer.rb +2 -2
  43. data/lib/generators/linked_rails/install/install_generator.rb +5 -8
  44. data/lib/generators/linked_rails/install/templates/README +2 -0
  45. data/lib/generators/linked_rails/install/templates/app_menu_list.rb +36 -7
  46. data/lib/generators/linked_rails/install/templates/application_menu_list.rb +40 -1
  47. data/lib/generators/linked_rails/install/templates/initializer.rb +1 -2
  48. data/lib/generators/linked_rails/install/templates/locales.yml +12 -0
  49. data/lib/generators/linked_rails/install/templates/vocab.rb +1 -0
  50. data/lib/generators/linked_rails/install/templates/vocab.yml +2 -2
  51. data/lib/generators/linked_rails/model/model_generator.rb +0 -1
  52. data/lib/generators/linked_rails/model/templates/controller.rb.tt +5 -1
  53. data/lib/generators/linked_rails/model/templates/form.rb.tt +3 -0
  54. data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +15 -0
  55. data/lib/generators/linked_rails/model/templates/policy.rb.tt +13 -0
  56. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -1
  57. data/lib/linked_rails/active_response/controller/collections.rb +1 -1
  58. data/lib/linked_rails/active_response/controller/crud_defaults.rb +3 -3
  59. data/lib/linked_rails/active_response/controller/params.rb +5 -5
  60. data/lib/linked_rails/active_response/controller.rb +11 -0
  61. data/lib/linked_rails/active_response/responders/rdf.rb +19 -10
  62. data/lib/linked_rails/callable_variable.rb +1 -1
  63. data/lib/linked_rails/collection_params_parser.rb +93 -0
  64. data/lib/linked_rails/controller/actionable.rb +118 -0
  65. data/lib/linked_rails/controller/authorization.rb +6 -0
  66. data/lib/linked_rails/controller/default_actions/create.rb +52 -0
  67. data/lib/linked_rails/controller/default_actions/destroy.rb +42 -0
  68. data/lib/linked_rails/controller/default_actions/update.rb +43 -0
  69. data/lib/linked_rails/controller.rb +20 -3
  70. data/lib/linked_rails/enhancements/creatable/controller.rb +1 -1
  71. data/lib/linked_rails/enhancements/destroyable/controller.rb +1 -1
  72. data/lib/linked_rails/enhancements/updatable/controller.rb +1 -1
  73. data/lib/linked_rails/enhancements.rb +0 -16
  74. data/lib/linked_rails/helpers/delta_helper.rb +26 -3
  75. data/lib/linked_rails/helpers/ontola_actions_helper.rb +2 -2
  76. data/lib/linked_rails/helpers/resource_helper.rb +1 -1
  77. data/lib/linked_rails/iri_mapper.rb +17 -39
  78. data/lib/linked_rails/middleware/linked_data_params.rb +7 -127
  79. data/lib/linked_rails/model/actionable.rb +69 -0
  80. data/lib/linked_rails/model/collections.rb +195 -39
  81. data/lib/linked_rails/model/dirty.rb +1 -1
  82. data/lib/linked_rails/model/enhancements.rb +1 -6
  83. data/lib/linked_rails/model/filtering.rb +2 -4
  84. data/lib/linked_rails/model/indexable.rb +5 -15
  85. data/lib/linked_rails/model/iri.rb +15 -17
  86. data/lib/linked_rails/model/iri_mapping.rb +35 -6
  87. data/lib/linked_rails/model/menuable.rb +34 -0
  88. data/lib/linked_rails/model/serialization.rb +0 -9
  89. data/lib/linked_rails/model/singularable.rb +55 -0
  90. data/lib/linked_rails/model/sorting.rb +0 -5
  91. data/lib/linked_rails/model/tables.rb +26 -0
  92. data/lib/linked_rails/model.rb +13 -5
  93. data/lib/linked_rails/params_parser.rb +131 -55
  94. data/lib/linked_rails/policy/attribute_conditions.rb +2 -2
  95. data/lib/linked_rails/policy.rb +24 -17
  96. data/lib/linked_rails/rdf_error.rb +2 -2
  97. data/lib/linked_rails/routes.rb +37 -22
  98. data/lib/linked_rails/serializer/actionable.rb +27 -0
  99. data/lib/linked_rails/serializer/menuable.rb +31 -0
  100. data/lib/linked_rails/serializer/singularable.rb +26 -0
  101. data/lib/linked_rails/serializer.rb +23 -10
  102. data/lib/linked_rails/test_methods.rb +114 -0
  103. data/lib/linked_rails/translate.rb +19 -9
  104. data/lib/linked_rails/uri_template.rb +30 -0
  105. data/lib/linked_rails/version.rb +1 -1
  106. data/lib/linked_rails/vocab.rb +8 -0
  107. data/lib/linked_rails.rb +25 -12
  108. data/lib/rails/welcome_controller.rb +3 -3
  109. data/lib/rdf/query_fix.rb +15 -0
  110. metadata +22 -25
  111. data/app/models/linked_rails/actions/default_actions/create.rb +0 -60
  112. data/app/models/linked_rails/actions/default_actions/destroy.rb +0 -45
  113. data/app/models/linked_rails/actions/default_actions/update.rb +0 -50
  114. data/app/models/linked_rails/actions/default_actions.rb +0 -17
  115. data/lib/generators/linked_rails/install/templates/application_action_list.rb +0 -3
  116. data/lib/generators/linked_rails/model/templates/action_list.rb.tt +0 -6
  117. data/lib/linked_rails/enhancements/actionable/model.rb +0 -71
  118. data/lib/linked_rails/enhancements/actionable/serializer.rb +0 -25
  119. data/lib/linked_rails/enhancements/creatable/action.rb +0 -15
  120. data/lib/linked_rails/enhancements/destroyable/action.rb +0 -15
  121. data/lib/linked_rails/enhancements/destroyable/routing.rb +0 -19
  122. data/lib/linked_rails/enhancements/indexable/model.rb +0 -10
  123. data/lib/linked_rails/enhancements/menuable/model.rb +0 -36
  124. data/lib/linked_rails/enhancements/menuable/serializer.rb +0 -33
  125. data/lib/linked_rails/enhancements/route_concerns.rb +0 -56
  126. data/lib/linked_rails/enhancements/singularable/controller.rb +0 -43
  127. data/lib/linked_rails/enhancements/singularable/model.rb +0 -47
  128. data/lib/linked_rails/enhancements/singularable/serializer.rb +0 -28
  129. data/lib/linked_rails/enhancements/tableable/model.rb +0 -28
  130. data/lib/linked_rails/enhancements/updatable/action.rb +0 -15
  131. 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
- extend ActiveSupport::Concern
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
- included do
9
- attr_writer :iri_template
10
- end
8
+ extend ActiveSupport::Concern
11
9
 
12
10
  def iri_opts
13
- opts = {}
14
- iri_opts_add(opts, :display, display) if @display
15
- iri_opts_add(opts, :title, title) if @title
16
- iri_opts_add(opts, :type, type) if @type
17
- iri_opts_add(opts, :page_size, page_size) if @page_size
18
- iri_opts_add(opts, :'filter%5B%5D', filter_iri_opts)
19
- iri_opts_add(opts, :'sort%5B%5D', sort_iri_opts)
20
- opts
21
- end
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 iri_template_keys
62
- @iri_template_keys ||= %i[before%5B%5D display filter%5B%5D page page_size sort%5B%5D title type]
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 iri_template_parsed_keys
66
- @iri_template_parsed_keys ||=
67
- iri_template_keys
68
- .map { |k| k.to_s.ends_with?('%5B%5D') ? "#{k}*" : k.to_s }
69
- .join(',')
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
- parser = params_parser_class.new(params)
11
- collection = new(options.merge(collection_params(parser)))
12
- view_params = collection_view_params(parser)
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(parser)
24
- parser.collection_view_params
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::ParamsParser
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
- attr_accessor :page
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 :default_sortings, :sort_options
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
@@ -33,7 +33,7 @@ module LinkedRails
33
33
  end
34
34
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
35
35
 
36
- def iri(_opts = {})
36
+ def iri(**_opts)
37
37
  self
38
38
  end
39
39
 
@@ -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
- LinkedRails.collection_paginated_view_class.new(opts)
87
+ collection_paginated_view_class.new(**opts)
88
88
  when :infinite
89
- LinkedRails.collection_infinite_view_class.new(opts)
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::Enhancements
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
- enhance LinkedRails::Enhancements::Actionable
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
- attributes_from_filters = ActionController::Parameters.new(association_class.attributes_from_filters(@filter))
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 / (page_size || default_page_size).to_f).ceil if 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 = LinkedRails.collection_view_class.new({collection: self, type: type}.merge(opts))
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 default_display
171
- @default_display = @default_display.call(parent) if @default_display.respond_to?(:call)
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 table_type
201
- return @table_type if @table_type
167
+ def title_from_translation
168
+ plural = association_class.name.tableize
202
169
 
203
- case display&.to_sym
204
- when :table
205
- :default
206
- when :settingsTable
207
- :settings
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('association', 'association_class', 'association_scope', 'iri_template', 'parent')
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
@@ -8,7 +8,7 @@ module LinkedRails
8
8
  attr_writer :iri
9
9
  attr_accessor :description, :name, :text, :url
10
10
 
11
- def iri(_opts = {})
11
+ def iri(**_opts)
12
12
  @iri ||= RDF::Node.new
13
13
  end
14
14
 
@@ -6,7 +6,7 @@ module LinkedRails
6
6
  include LinkedRails::Model
7
7
 
8
8
  attr_accessor :parent
9
- attr_writer :url
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(URITemplate.new(parent.root_relative_iri.to_s), :EntryPoint)
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 url
34
- @url || parent.url
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
@@ -10,6 +10,8 @@ module LinkedRails
10
10
 
11
11
  attr_reader :path
12
12
 
13
+ def label_from_property; end
14
+
13
15
  def permission_required?
14
16
  false
15
17
  end
@@ -3,8 +3,7 @@
3
3
  module LinkedRails
4
4
  class Form
5
5
  class Field < LinkedRails::Resource
6
- attr_writer :datatype,
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 :default_value,
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
- field_label = LinkedRails.translate(:field, :label, self, false)
105
- return field_label if field_label.present?
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