linked_rails 0.0.1

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 (207) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +65 -0
  4. data/Rakefile +34 -0
  5. data/app/controllers/linked_rails/actions/items_controller.rb +9 -0
  6. data/app/controllers/linked_rails/bulk_controller.rb +195 -0
  7. data/app/controllers/linked_rails/current_user_controller.rb +13 -0
  8. data/app/controllers/linked_rails/enum_values_controller.rb +49 -0
  9. data/app/controllers/linked_rails/forms_controller.rb +13 -0
  10. data/app/controllers/linked_rails/manifests_controller.rb +21 -0
  11. data/app/controllers/linked_rails/menus/items_controller.rb +9 -0
  12. data/app/controllers/linked_rails/menus/lists_controller.rb +9 -0
  13. data/app/controllers/linked_rails/not_found_controller.rb +15 -0
  14. data/app/controllers/linked_rails/ontologies_controller.rb +7 -0
  15. data/app/models/linked_rails/actions/default_actions/create.rb +60 -0
  16. data/app/models/linked_rails/actions/default_actions/destroy.rb +45 -0
  17. data/app/models/linked_rails/actions/default_actions/update.rb +50 -0
  18. data/app/models/linked_rails/actions/default_actions.rb +17 -0
  19. data/app/models/linked_rails/actions/item.rb +234 -0
  20. data/app/models/linked_rails/actions/list.rb +113 -0
  21. data/app/models/linked_rails/collection/filter.rb +16 -0
  22. data/app/models/linked_rails/collection/filter_field.rb +30 -0
  23. data/app/models/linked_rails/collection/filter_option.rb +17 -0
  24. data/app/models/linked_rails/collection/filterable.rb +92 -0
  25. data/app/models/linked_rails/collection/infinite_view.rb +98 -0
  26. data/app/models/linked_rails/collection/iri.rb +74 -0
  27. data/app/models/linked_rails/collection/iri_mapping.rb +33 -0
  28. data/app/models/linked_rails/collection/paginated_view.rb +41 -0
  29. data/app/models/linked_rails/collection/sortable.rb +60 -0
  30. data/app/models/linked_rails/collection/sorting.rb +72 -0
  31. data/app/models/linked_rails/collection/view.rb +101 -0
  32. data/app/models/linked_rails/collection.rb +220 -0
  33. data/app/models/linked_rails/condition.rb +7 -0
  34. data/app/models/linked_rails/creative_work.rb +21 -0
  35. data/app/models/linked_rails/current_user.rb +28 -0
  36. data/app/models/linked_rails/entry_point.rb +53 -0
  37. data/app/models/linked_rails/enum_value.rb +33 -0
  38. data/app/models/linked_rails/form/field/association_input.rb +23 -0
  39. data/app/models/linked_rails/form/field/checkbox_group.rb +10 -0
  40. data/app/models/linked_rails/form/field/checkbox_input.rb +10 -0
  41. data/app/models/linked_rails/form/field/color_input.rb +17 -0
  42. data/app/models/linked_rails/form/field/date_input.rb +10 -0
  43. data/app/models/linked_rails/form/field/date_time_input.rb +10 -0
  44. data/app/models/linked_rails/form/field/email_input.rb +10 -0
  45. data/app/models/linked_rails/form/field/file_input.rb +10 -0
  46. data/app/models/linked_rails/form/field/location_input.rb +11 -0
  47. data/app/models/linked_rails/form/field/markdown_input.rb +10 -0
  48. data/app/models/linked_rails/form/field/number_input.rb +10 -0
  49. data/app/models/linked_rails/form/field/password_input.rb +10 -0
  50. data/app/models/linked_rails/form/field/postal_range_input.rb +10 -0
  51. data/app/models/linked_rails/form/field/radio_group.rb +10 -0
  52. data/app/models/linked_rails/form/field/resource_field.rb +23 -0
  53. data/app/models/linked_rails/form/field/select_input.rb +11 -0
  54. data/app/models/linked_rails/form/field/slider_input.rb +10 -0
  55. data/app/models/linked_rails/form/field/text_area_input.rb +10 -0
  56. data/app/models/linked_rails/form/field/text_input.rb +10 -0
  57. data/app/models/linked_rails/form/field/toggle_button_group.rb +10 -0
  58. data/app/models/linked_rails/form/field.rb +117 -0
  59. data/app/models/linked_rails/form/field_factory.rb +219 -0
  60. data/app/models/linked_rails/form/group.rb +39 -0
  61. data/app/models/linked_rails/form/page.rb +31 -0
  62. data/app/models/linked_rails/form.rb +156 -0
  63. data/app/models/linked_rails/manifest.rb +102 -0
  64. data/app/models/linked_rails/media_object.rb +31 -0
  65. data/app/models/linked_rails/menus/item.rb +92 -0
  66. data/app/models/linked_rails/menus/list.rb +138 -0
  67. data/app/models/linked_rails/ontology/base.rb +50 -0
  68. data/app/models/linked_rails/ontology/class.rb +43 -0
  69. data/app/models/linked_rails/ontology/property.rb +19 -0
  70. data/app/models/linked_rails/ontology.rb +34 -0
  71. data/app/models/linked_rails/property_query.rb +11 -0
  72. data/app/models/linked_rails/resource.rb +17 -0
  73. data/app/models/linked_rails/sequence.rb +64 -0
  74. data/app/models/linked_rails/shacl/node_shape.rb +21 -0
  75. data/app/models/linked_rails/shacl/property_shape.rb +53 -0
  76. data/app/models/linked_rails/shacl/shape.rb +33 -0
  77. data/app/models/linked_rails/web_page.rb +22 -0
  78. data/app/models/linked_rails/web_site.rb +17 -0
  79. data/app/models/linked_rails/widget.rb +55 -0
  80. data/app/policies/linked_rails/actions/item_policy.rb +11 -0
  81. data/app/policies/linked_rails/actions/list_policy.rb +11 -0
  82. data/app/policies/linked_rails/collection/view_policy.rb +13 -0
  83. data/app/policies/linked_rails/collection_policy.rb +41 -0
  84. data/app/policies/linked_rails/enum_value_policy.rb +32 -0
  85. data/app/policies/linked_rails/menus/item_policy.rb +11 -0
  86. data/app/policies/linked_rails/menus/list_policy.rb +11 -0
  87. data/app/policies/linked_rails/sequence_policy.rb +9 -0
  88. data/app/serializers/linked_rails/actions/item_serializer.rb +28 -0
  89. data/app/serializers/linked_rails/collection/filter_field_serializer.rb +12 -0
  90. data/app/serializers/linked_rails/collection/filter_option_serializer.rb +12 -0
  91. data/app/serializers/linked_rails/collection/filter_serializer.rb +13 -0
  92. data/app/serializers/linked_rails/collection/sorting_serializer.rb +13 -0
  93. data/app/serializers/linked_rails/collection/view_serializer.rb +22 -0
  94. data/app/serializers/linked_rails/collection_serializer.rb +44 -0
  95. data/app/serializers/linked_rails/condition_serializer.rb +9 -0
  96. data/app/serializers/linked_rails/creative_work_serializer.rb +10 -0
  97. data/app/serializers/linked_rails/current_user_serializer.rb +7 -0
  98. data/app/serializers/linked_rails/entry_point_serializer.rb +20 -0
  99. data/app/serializers/linked_rails/enum_value_serializer.rb +12 -0
  100. data/app/serializers/linked_rails/form/field/association_input_serializer.rb +13 -0
  101. data/app/serializers/linked_rails/form/field/resource_field_serializer.rb +11 -0
  102. data/app/serializers/linked_rails/form/field/select_input_serializer.rb +11 -0
  103. data/app/serializers/linked_rails/form/field_serializer.rb +39 -0
  104. data/app/serializers/linked_rails/form/group_serializer.rb +14 -0
  105. data/app/serializers/linked_rails/form/page_serializer.rb +13 -0
  106. data/app/serializers/linked_rails/form_serializer.rb +9 -0
  107. data/app/serializers/linked_rails/media_object_serializer.rb +17 -0
  108. data/app/serializers/linked_rails/menus/item_serializer.rb +35 -0
  109. data/app/serializers/linked_rails/menus/list_serializer.rb +13 -0
  110. data/app/serializers/linked_rails/ontology/class_serializer.rb +19 -0
  111. data/app/serializers/linked_rails/ontology/property_serializer.rb +16 -0
  112. data/app/serializers/linked_rails/ontology_serializer.rb +8 -0
  113. data/app/serializers/linked_rails/rdf_error_serializer.rb +8 -0
  114. data/app/serializers/linked_rails/sequence_serializer.rb +14 -0
  115. data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +12 -0
  116. data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +38 -0
  117. data/app/serializers/linked_rails/shacl/shape_serializer.rb +25 -0
  118. data/app/serializers/linked_rails/web_page_serializer.rb +10 -0
  119. data/app/serializers/linked_rails/web_site_serializer.rb +11 -0
  120. data/app/serializers/linked_rails/widget_serializer.rb +15 -0
  121. data/config/initializers/inflections.rb +5 -0
  122. data/lib/generators/linked_rails/install/install_generator.rb +65 -0
  123. data/lib/generators/linked_rails/install/templates/app_menu_list.rb +41 -0
  124. data/lib/generators/linked_rails/install/templates/application_action_list.rb +3 -0
  125. data/lib/generators/linked_rails/install/templates/application_form.rb +3 -0
  126. data/lib/generators/linked_rails/install/templates/application_menu_list.rb +3 -0
  127. data/lib/generators/linked_rails/install/templates/application_policy.rb +18 -0
  128. data/lib/generators/linked_rails/install/templates/application_serializer.rb +5 -0
  129. data/lib/generators/linked_rails/install/templates/initializer.rb +9 -0
  130. data/lib/generators/linked_rails/install/templates/locales.yml +12 -0
  131. data/lib/generators/linked_rails/install/templates/rdf_responder.rb +5 -0
  132. data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +5 -0
  133. data/lib/generators/linked_rails/install/templates/vocab.rb +5 -0
  134. data/lib/generators/linked_rails/install/templates/vocab.yml +26 -0
  135. data/lib/generators/linked_rails/model/model_generator.rb +58 -0
  136. data/lib/generators/linked_rails/model/templates/action_list.rb.tt +6 -0
  137. data/lib/generators/linked_rails/model/templates/controller.rb.tt +7 -0
  138. data/lib/generators/linked_rails/model/templates/create_table_migration.rb.tt +24 -0
  139. data/lib/generators/linked_rails/model/templates/form.rb.tt +6 -0
  140. data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +6 -0
  141. data/lib/generators/linked_rails/model/templates/model.rb.tt +15 -0
  142. data/lib/generators/linked_rails/model/templates/module.rb.tt +7 -0
  143. data/lib/generators/linked_rails/model/templates/policy.rb.tt +6 -0
  144. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +9 -0
  145. data/lib/linked_rails/active_response/controller/collections.rb +43 -0
  146. data/lib/linked_rails/active_response/controller/crud_defaults.rb +92 -0
  147. data/lib/linked_rails/active_response/controller/params.rb +51 -0
  148. data/lib/linked_rails/active_response/controller.rb +37 -0
  149. data/lib/linked_rails/active_response/responders/rdf.rb +158 -0
  150. data/lib/linked_rails/cache.rb +35 -0
  151. data/lib/linked_rails/callable_variable.rb +25 -0
  152. data/lib/linked_rails/constraints/whitelist.rb +36 -0
  153. data/lib/linked_rails/controller/authorization.rb +15 -0
  154. data/lib/linked_rails/controller/error_handling.rb +76 -0
  155. data/lib/linked_rails/controller.rb +43 -0
  156. data/lib/linked_rails/engine.rb +7 -0
  157. data/lib/linked_rails/enhanceable.rb +21 -0
  158. data/lib/linked_rails/enhancements/actionable/model.rb +71 -0
  159. data/lib/linked_rails/enhancements/actionable/serializer.rb +25 -0
  160. data/lib/linked_rails/enhancements/creatable/action.rb +15 -0
  161. data/lib/linked_rails/enhancements/creatable/controller.rb +15 -0
  162. data/lib/linked_rails/enhancements/destroyable/action.rb +15 -0
  163. data/lib/linked_rails/enhancements/destroyable/controller.rb +15 -0
  164. data/lib/linked_rails/enhancements/destroyable/routing.rb +19 -0
  165. data/lib/linked_rails/enhancements/indexable/model.rb +10 -0
  166. data/lib/linked_rails/enhancements/menuable/model.rb +36 -0
  167. data/lib/linked_rails/enhancements/menuable/serializer.rb +33 -0
  168. data/lib/linked_rails/enhancements/route_concerns.rb +56 -0
  169. data/lib/linked_rails/enhancements/singularable/controller.rb +43 -0
  170. data/lib/linked_rails/enhancements/singularable/model.rb +47 -0
  171. data/lib/linked_rails/enhancements/singularable/serializer.rb +28 -0
  172. data/lib/linked_rails/enhancements/tableable/model.rb +28 -0
  173. data/lib/linked_rails/enhancements/updatable/action.rb +15 -0
  174. data/lib/linked_rails/enhancements/updatable/controller.rb +15 -0
  175. data/lib/linked_rails/enhancements/updatable/routing.rb +20 -0
  176. data/lib/linked_rails/enhancements/updatable/serializer.rb +17 -0
  177. data/lib/linked_rails/enhancements.rb +22 -0
  178. data/lib/linked_rails/helpers/delta_helper.rb +86 -0
  179. data/lib/linked_rails/helpers/ontola_actions_helper.rb +32 -0
  180. data/lib/linked_rails/helpers/resource_helper.rb +70 -0
  181. data/lib/linked_rails/iri_mapper.rb +125 -0
  182. data/lib/linked_rails/middleware/linked_data_params.rb +224 -0
  183. data/lib/linked_rails/model/collections.rb +82 -0
  184. data/lib/linked_rails/model/dirty.rb +82 -0
  185. data/lib/linked_rails/model/enhancements.rb +61 -0
  186. data/lib/linked_rails/model/filtering.rb +89 -0
  187. data/lib/linked_rails/model/indexable.rb +51 -0
  188. data/lib/linked_rails/model/iri.rb +121 -0
  189. data/lib/linked_rails/model/iri_mapping.rb +69 -0
  190. data/lib/linked_rails/model/serialization.rb +88 -0
  191. data/lib/linked_rails/model/sorting.rb +20 -0
  192. data/lib/linked_rails/model.rb +68 -0
  193. data/lib/linked_rails/params_parser.rb +93 -0
  194. data/lib/linked_rails/policy/attribute_conditions.rb +53 -0
  195. data/lib/linked_rails/policy.rb +189 -0
  196. data/lib/linked_rails/rdf_error.rb +36 -0
  197. data/lib/linked_rails/renderers.rb +46 -0
  198. data/lib/linked_rails/routes.rb +108 -0
  199. data/lib/linked_rails/serializer.rb +137 -0
  200. data/lib/linked_rails/translate.rb +176 -0
  201. data/lib/linked_rails/version.rb +5 -0
  202. data/lib/linked_rails/vocab.rb +81 -0
  203. data/lib/linked_rails.rb +86 -0
  204. data/lib/nill_class_renderer.rb +3 -0
  205. data/lib/rails/welcome_controller.rb +45 -0
  206. data/lib/tasks/linked_rails_tasks.rake +6 -0
  207. metadata +416 -0
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Collection
5
+ class Sorting < RDF::Node
6
+ include ActiveModel::Model
7
+ include LinkedRails::Model
8
+ DATE_MIN = Date.new(1970, 1, 1)
9
+ DATE_TIME_MIN = Time.new(1970, 1, 1).utc
10
+ STRING_MIN = ('0'.ord - 1).chr
11
+ STRING_MAX = ('z'.ord + 1).chr
12
+
13
+ attr_accessor :association_class, :direction, :key, :collection
14
+
15
+ def attribute_name
16
+ @attribute_name ||= key_from_mapping || :created_at
17
+ end
18
+
19
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
20
+ def default_value
21
+ column = association_class.column_for_attribute(attribute_name)
22
+
23
+ case column.type
24
+ when :date
25
+ direction == :asc ? DATE_MIN : Date.current
26
+ when :datetime
27
+ (direction == :asc ? DATE_TIME_MIN : Time.current.utc).iso8601(6)
28
+ when :string, :text
29
+ direction == :asc ? STRING_MIN : STRING_MAX
30
+ else
31
+ ActiveModel::Type::Integer.new(limit: column.limit).send(direction == :asc ? :min_value : :max_value)
32
+ end
33
+ end
34
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
35
+
36
+ def iri(_opts = {})
37
+ self
38
+ end
39
+
40
+ def sort_direction
41
+ direction == :desc ? :lt : :gt
42
+ end
43
+
44
+ def sort_value
45
+ {attribute_name => direction}
46
+ end
47
+
48
+ private
49
+
50
+ def key_from_mapping
51
+ if key == Vocab.ontola[:primaryKey]
52
+ association_class.try(:primary_key)
53
+ else
54
+ association_class.try(:predicate_mapping).try(:[], key)&.key
55
+ end
56
+ end
57
+
58
+ class << self
59
+ def from_array(association_class, array, collection)
60
+ array&.map do |sort|
61
+ new(
62
+ collection: collection,
63
+ association_class: association_class,
64
+ direction: sort[:direction]&.to_sym,
65
+ key: sort[:key]
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Collection
5
+ class View
6
+ include ActiveModel::Model
7
+
8
+ include LinkedRails::Model
9
+
10
+ attr_accessor :collection, :filter
11
+ delegate :apply_scope, :association_base, :association_class, :default_page_size, :display,
12
+ :parent, :policy, :total_page_count, :unfiltered_collection, :user_context, to: :collection
13
+ delegate :count, to: :members
14
+
15
+ alias id iri
16
+
17
+ def root_relative_iri(opts = {})
18
+ collection.unfiltered.root_relative_iri(iri_opts.merge(opts))
19
+ end
20
+
21
+ def member_sequence
22
+ @member_sequence ||= LinkedRails::Sequence.new(
23
+ members,
24
+ id: members_iri,
25
+ parent: self,
26
+ scope: false
27
+ )
28
+ end
29
+
30
+ def members
31
+ @members ||= raw_members
32
+ end
33
+
34
+ def members_iri
35
+ uri = iri.dup
36
+ uri.fragment = :members
37
+ uri
38
+ end
39
+
40
+ def page_size
41
+ collection.page_size&.to_i || default_page_size
42
+ end
43
+
44
+ def preview_includes
45
+ return {member_sequence: {}} unless association_class.include_in_collection?
46
+
47
+ {member_sequence: {members: association_class.preview_includes}}
48
+ end
49
+
50
+ def title
51
+ plural = association_class.name.tableize
52
+ I18n.t(
53
+ "#{plural}.collection.#{filter&.values&.join('.').presence || name}",
54
+ count: ->(_opts) { total_count },
55
+ default: association_class.plural_label
56
+ )
57
+ end
58
+
59
+ private
60
+
61
+ def arel_table
62
+ @arel_table ||= association_class.arel_table
63
+ end
64
+
65
+ def prepare_members(scope)
66
+ if scope.respond_to?(:preload) && association_class.try(:includes_for_serializer)
67
+ scope = scope.preload(association_class.includes_for_serializer)
68
+ end
69
+ scope
70
+ end
71
+
72
+ def raw_members
73
+ @raw_members ||= members_query.to_a
74
+ end
75
+
76
+ class << self
77
+ def iri
78
+ [super, Vocab.as.CollectionPage]
79
+ end
80
+
81
+ def new(opts = {})
82
+ type = opts.delete(:type)&.to_sym
83
+ return super if type.nil?
84
+
85
+ case type
86
+ when :paginated
87
+ LinkedRails.collection_paginated_view_class.new(opts)
88
+ when :infinite
89
+ LinkedRails.collection_infinite_view_class.new(opts)
90
+ else
91
+ raise ActionController::BadRequest, "'#{type}' is not a valid collection type"
92
+ end
93
+ end
94
+
95
+ def policy_class
96
+ LinkedRails::Collection::ViewPolicy
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pundit'
4
+
5
+ require_relative 'collection/filter'
6
+ require_relative 'collection/filterable'
7
+ require_relative 'collection/iri'
8
+ require_relative 'collection/iri_mapping'
9
+ require_relative 'collection/sortable'
10
+ require_relative 'collection/sorting'
11
+ require_relative 'collection/view'
12
+ require_relative 'collection/paginated_view'
13
+ require_relative 'collection/infinite_view'
14
+
15
+ module LinkedRails
16
+ class Collection # rubocop:disable Metrics/ClassLength
17
+ include ActiveModel::Model
18
+ include LinkedRails::Model::Enhancements
19
+ include LinkedRails::Model::Iri
20
+ include LinkedRails::Collection::Filterable
21
+ include LinkedRails::Collection::Iri
22
+ include LinkedRails::Collection::IriMapping
23
+ include LinkedRails::Collection::Sortable
24
+
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
31
+
32
+ alias id iri
33
+
34
+ def action_list(user_context)
35
+ @action_list ||= {}
36
+ @action_list[user_context] ||= association_class.try(:action_list)&.new(
37
+ resource: self,
38
+ user_context: user_context
39
+ )
40
+ end
41
+
42
+ def actions(user_context = nil)
43
+ return [] if action_list(user_context).nil?
44
+
45
+ super
46
+ end
47
+
48
+ def apply_scope(association)
49
+ return association if policy_scope == false
50
+
51
+ policy_scope.new(user_context, association).resolve
52
+ end
53
+
54
+ # prevents a `stack level too deep`
55
+ def as_json(options = {})
56
+ super(options.merge(except: %w[association_class unfiltered_collection collection]))
57
+ end
58
+
59
+ def association_base
60
+ @association_base ||= apply_scope(sorted_association(filtered_association))
61
+ end
62
+
63
+ def build_child # rubocop:disable Metrics/AbcSize
64
+ child =
65
+ parent&.build_child(association_class, user_context: user_context) ||
66
+ association_class.build_new(parent: parent, user_context: user_context)
67
+
68
+ attributes_from_filters = ActionController::Parameters.new(association_class.attributes_from_filters(@filter))
69
+ permitted_child_keys = Pundit.policy(user_context, child)&.permitted_attributes || []
70
+ permitted_attributes_from_filters = attributes_from_filters.permit(permitted_child_keys)
71
+
72
+ child.assign_attributes(permitted_attributes_from_filters)
73
+ child
74
+ end
75
+
76
+ def columns
77
+ columns_list = association_class.try(:defined_columns).try(:[], table_type)
78
+
79
+ RDF::List[*columns_list] if columns_list.present?
80
+ end
81
+
82
+ def default_page_size
83
+ association_class.try(:default_per_page) || 20
84
+ end
85
+
86
+ def default_view
87
+ @default_view ||= view_with_opts(default_view_opts)
88
+ end
89
+
90
+ def display
91
+ @display&.to_sym || default_display
92
+ end
93
+
94
+ def first
95
+ case type
96
+ when :paginated
97
+ iri_with_root(root_relative_iri(page: 1))
98
+ when :infinite
99
+ iri_with_root(root_relative_iri(before: default_before_value))
100
+ end
101
+ end
102
+
103
+ def inspect
104
+ "#<#{association_class}Collection iri:#{iri}>"
105
+ end
106
+
107
+ def last
108
+ iri_with_root(root_relative_iri(page: [total_page_count, 1].max)) if type == :paginated && total_page_count
109
+ end
110
+
111
+ def new_child(options)
112
+ attrs = options.merge(new_child_values)
113
+ self.class.new(attrs)
114
+ end
115
+
116
+ def preview_includes
117
+ {
118
+ default_view: default_view.preview_includes,
119
+ filter_fields: :options,
120
+ filters: [],
121
+ sortings: []
122
+ }
123
+ end
124
+
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
+ def total_count
142
+ @total_count ||= association_base.try(:total_count) || unscoped_association.count
143
+ end
144
+
145
+ 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
151
+ end
152
+
153
+ def unscoped_association
154
+ association_base.respond_to?(:unscope) ? association_base.unscope(:select) : association_base
155
+ end
156
+
157
+ def views
158
+ @views || [default_view]
159
+ end
160
+
161
+ def view_with_opts(opts)
162
+ @views ||= []
163
+ view = LinkedRails.collection_view_class.new({collection: self, type: type}.merge(opts))
164
+ @views << view
165
+ view
166
+ end
167
+
168
+ private
169
+
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
178
+ end
179
+
180
+ def default_view_opts
181
+ opts = {
182
+ type: type,
183
+ filter: filter
184
+ }
185
+ opts[:page] = 1 if type == :paginated
186
+ opts[:before] = default_before_value if type == :infinite
187
+ opts
188
+ end
189
+
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
+ def paginated?
197
+ type == :paginated
198
+ end
199
+
200
+ def table_type
201
+ return @table_type if @table_type
202
+
203
+ case display&.to_sym
204
+ when :table
205
+ :default
206
+ when :settingsTable
207
+ :settings
208
+ end
209
+ end
210
+
211
+ def new_child_values
212
+ instance_values
213
+ .slice('association', 'association_class', 'association_scope', 'iri_template', 'parent')
214
+ .merge(
215
+ unfiltered_collection: filtered? ? @unfiltered_collection : self,
216
+ user_context: user_context
217
+ )
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Condition < LinkedRails::Resource
5
+ attr_accessor :fail, :shape, :pass
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class CreativeWork
5
+ include ActiveModel::Model
6
+ include LinkedRails::Model
7
+
8
+ attr_writer :iri
9
+ attr_accessor :description, :name, :text, :url
10
+
11
+ def iri(_opts = {})
12
+ @iri ||= RDF::Node.new
13
+ end
14
+
15
+ class << self
16
+ def iri
17
+ Vocab.schema.CreativeWork
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class CurrentUser
5
+ include ActiveModel::Model
6
+ include LinkedRails::Model
7
+
8
+ attr_accessor :user
9
+
10
+ def actor_type
11
+ if user.is_a?(LinkedRails.guest_user_class)
12
+ 'GuestUser'
13
+ else
14
+ 'ConfirmedUser'
15
+ end
16
+ end
17
+
18
+ def rdf_type
19
+ Vocab.ontola[actor_type]
20
+ end
21
+
22
+ class << self
23
+ def route_key
24
+ :c_a
25
+ end
26
+ end
27
+ end
28
+ end