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,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Manifest
5
+ include ActiveModel::Model
6
+ include LinkedRails::Model
7
+
8
+ def app_name
9
+ Rails.application.railtie_name.chomp('_application').humanize
10
+ end
11
+
12
+ def app_theme_color
13
+ '#cc0000'
14
+ end
15
+
16
+ def background_color
17
+ '#eef0f2'
18
+ end
19
+
20
+ def css_class; end
21
+
22
+ def header_background
23
+ :primary
24
+ end
25
+
26
+ def header_text
27
+ :white
28
+ end
29
+
30
+ def preload_iris
31
+ [
32
+ scope,
33
+ LinkedRails.iri(path: 'ns/core').to_s,
34
+ LinkedRails.iri(path: 'c_a').to_s,
35
+ LinkedRails.iri(path: 'menus').to_s
36
+ ]
37
+ end
38
+
39
+ def scope
40
+ @scope ||= LinkedRails.iri.to_s
41
+ end
42
+
43
+ def site_theme_color
44
+ app_theme_color
45
+ end
46
+
47
+ def site_secondary_color
48
+ '#262626'
49
+ end
50
+
51
+ def site_name
52
+ app_name
53
+ end
54
+
55
+ def theme; end
56
+
57
+ def theme_options
58
+ {}
59
+ end
60
+
61
+ def web_manifest
62
+ web_manifest_base.merge(
63
+ ontola: web_manifest_ontola_section,
64
+ serviceworker: web_manifest_sw_section
65
+ )
66
+ end
67
+
68
+ def web_manifest_base # rubocop:disable Metrics/MethodLength
69
+ {
70
+ background_color: background_color,
71
+ dir: :rtl,
72
+ display: :standalone,
73
+ lang: :nl,
74
+ name: app_name,
75
+ scope: scope,
76
+ short_name: app_name,
77
+ start_url: scope,
78
+ theme_color: site_theme_color
79
+ }
80
+ end
81
+
82
+ def web_manifest_ontola_section
83
+ {
84
+ css_class: css_class,
85
+ header_background: header_background,
86
+ header_text: header_text,
87
+ preload: preload_iris,
88
+ primary_color: site_theme_color,
89
+ secondary_color: site_secondary_color,
90
+ theme: theme,
91
+ theme_options: theme_options.to_query
92
+ }
93
+ end
94
+
95
+ def web_manifest_sw_section
96
+ {
97
+ src: "#{scope}/sw.js?manifestLocation=#{Rack::Utils.escape("#{scope}/manifest.json")}",
98
+ scope: scope
99
+ }
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class MediaObject < Resource
5
+ attr_accessor :content_type, :description, :filename, :position_y, :uploaded_at
6
+ attr_writer :type
7
+
8
+ %i[content_url embed_url thumbnail_url url cover_url].each do |attr|
9
+ attr_reader attr
10
+
11
+ define_method "#{attr}=" do |value|
12
+ instance_variable_set("@#{attr}", value.is_a?(RDF::URI) ? value : RDF::URI(value))
13
+ end
14
+ end
15
+
16
+ def rdf_type
17
+ case type&.to_sym
18
+ when :image
19
+ Vocab.schema.ImageObject
20
+ when :video
21
+ Vocab.schema.VideoObject
22
+ else
23
+ Vocab.schema.MediaObject
24
+ end
25
+ end
26
+
27
+ def type
28
+ @type ||= content_type&.split('/')&.first
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module Menus
5
+ class Item
6
+ include ActiveModel::Model
7
+ include LinkedRails::Model
8
+ include LinkedRails::CallableVariable
9
+
10
+ attr_accessor :parent, :tag, :item_type, :type, :resource
11
+ attr_writer :action, :href, :image, :iri_base, :label, :menus
12
+ delegate :iri_opts, to: :parent
13
+
14
+ alias id iri
15
+ %i[action href image label menus iri_base].each do |method|
16
+ callable_variable(method, instance: :parent)
17
+ end
18
+
19
+ def iri_opts
20
+ parent.iri_opts.merge(
21
+ tag: route_tag,
22
+ fragment: route_fragment
23
+ )
24
+ end
25
+
26
+ def iri_template
27
+ return parent.send(:iri_template) unless parent.is_a?(LinkedRails::Menus::List)
28
+
29
+ return URITemplate.new("#{iri_base}{/tag}{#fragment}") if iri_base
30
+
31
+ iri_template_expand_path(parent.send(:iri_template), '{/tag}')
32
+ end
33
+
34
+ def menu_sequence
35
+ return if @menus.nil?
36
+
37
+ @menu_sequence ||=
38
+ LinkedRails::Sequence.new(
39
+ -> { menus&.compact&.each { |menu| menu.parent = self } },
40
+ id: menu_sequence_iri,
41
+ parent: self,
42
+ scope: false
43
+ )
44
+ end
45
+
46
+ def menu_sequence_iri
47
+ return @menu_sequence_iri if @menu_sequence_iri
48
+
49
+ sequence_iri = iri.dup
50
+ sequence_iri.path ||= ''
51
+ sequence_iri.path += '/menu_items'
52
+ sequence_iri
53
+ end
54
+
55
+ def rdf_type
56
+ type || Vocab.ontola[:MenuItem]
57
+ end
58
+
59
+ def route_fragment
60
+ return if parent.is_a?(LinkedRails::Menus::List)
61
+
62
+ [parent.route_fragment, tag].compact.join('.')
63
+ end
64
+
65
+ def route_tag
66
+ parent.is_a?(LinkedRails::Menus::List) ? tag : parent.route_tag
67
+ end
68
+
69
+ class << self
70
+ def base_includes
71
+ [action: :target]
72
+ end
73
+
74
+ def preview_includes
75
+ base_includes + [
76
+ menu_sequence: [
77
+ members: base_includes +
78
+ [menu_sequence: [members: base_includes]]
79
+ ]
80
+ ]
81
+ end
82
+
83
+ def requested_index_resource(params, user_context)
84
+ parent = parent_from_params(params, user_context)
85
+ return if parent.blank?
86
+
87
+ parent.menu_sequence
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module Menus
5
+ class List
6
+ include ActiveModel::Model
7
+ include LinkedRails::Model
8
+
9
+ attr_accessor :resource, :user_context
10
+ class_attribute :_defined_menus, instance_reader: false, instance_writer: false
11
+
12
+ def available_menus
13
+ return {} if defined_menus.blank?
14
+
15
+ @available_menus ||= defined_menus.select(&method(:menu_available?)).compact
16
+ end
17
+
18
+ def defined_menus
19
+ self.class.defined_menus
20
+ end
21
+
22
+ def iri_opts
23
+ resource&.iri_opts || {}
24
+ end
25
+
26
+ def menus
27
+ @menus ||= available_menus.map(&method(:menu_item))
28
+ end
29
+
30
+ def menu(tag)
31
+ menu_item(tag, available_menus[tag].dup) if available_menus.key?(tag)
32
+ end
33
+
34
+ private
35
+
36
+ def default_label(tag, options)
37
+ I18n.t("menus.#{resource&.class&.name&.tableize}.#{tag}", options[:label_params])
38
+ end
39
+
40
+ def menu_available?(_tag, options)
41
+ options[:condition].nil? || call_option(options[:condition], resource)
42
+ end
43
+
44
+ def menu_item(tag, options) # rubocop:disable Metrics/AbcSize
45
+ if options[:policy].present?
46
+ return unless resource_policy(options[:policy_resource]).send(options[:policy], *options[:policy_arguments])
47
+ end
48
+ options[:label_params] ||= {}
49
+ options[:label_params][:default] ||= ["menus.default.#{tag}".to_sym, tag.to_s.capitalize]
50
+ options[:label] ||= default_label(tag, options)
51
+ options.except!(:policy_resource, :policy, :policy_arguments, :label_params)
52
+ LinkedRails.menus_item_class.new(resource: resource, tag: tag, parent: self, **options)
53
+ end
54
+
55
+ def resource_policy(policy_resource)
56
+ policy_resource ||= resource
57
+ policy_resource = instance_exec(&policy_resource) if policy_resource.respond_to?(:call)
58
+ raise 'policy_resource is missing' if policy_resource.blank?
59
+
60
+ @resource_policy ||= {}
61
+ @resource_policy[policy_resource] ||= Pundit.policy(user_context, policy_resource)
62
+ end
63
+
64
+ def iri_template
65
+ @iri_template ||= iri_template_expand_path(resource.send(:iri_template), '/menus')
66
+ end
67
+
68
+ class << self
69
+ def app_menu_list_class
70
+ return @app_menu_list_class if instance_variables.include?(:@app_menu_list_class)
71
+
72
+ @app_menu_list_class = 'AppMenuList'.safe_constantize
73
+ end
74
+
75
+ def app_menu_list(user_context)
76
+ app_menu_list_class&.new(
77
+ resource: nil,
78
+ user_context: user_context
79
+ )
80
+ end
81
+
82
+ def all
83
+ []
84
+ end
85
+
86
+ def defined_menus
87
+ initialize_menus
88
+ _defined_menus || {}
89
+ end
90
+
91
+ def has_menu(tag, opts = {}) # rubocop:disable Naming/PredicateName
92
+ defined_menus[tag] = opts
93
+ end
94
+
95
+ def requested_index_resource(params, user_context)
96
+ menu_list = menu_list_from_params(params, user_context)
97
+
98
+ return if menu_list.blank?
99
+
100
+ LinkedRails::Sequence.new(
101
+ menu_list.menus,
102
+ id: menu_list.iri,
103
+ member_includes: Item.preview_includes,
104
+ scope: false
105
+ )
106
+ end
107
+
108
+ def requested_single_resource(params, user_context)
109
+ return nil if params[:id].blank?
110
+
111
+ menu_list = menu_list_from_params(params, user_context)
112
+
113
+ menu_list&.menu(params[:id].to_sym)
114
+ end
115
+
116
+ private
117
+
118
+ def initialize_menus
119
+ return if _defined_menus && method(:_defined_menus).owner == singleton_class
120
+
121
+ self._defined_menus = superclass.try(:_defined_menus)&.dup || {}
122
+ end
123
+
124
+ def menu_list_from_params(params, user_context)
125
+ parent = parent_from_params(params, user_context)
126
+
127
+ if parent.is_a?(LinkedRails.menus_item_class)
128
+ parent
129
+ elsif parent
130
+ parent.menu_list(user_context)
131
+ else
132
+ app_menu_list(user_context)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Ontology
5
+ class Base
6
+ include ActiveModel::Model
7
+ include LinkedRails::Model
8
+ attr_accessor :iri
9
+
10
+ def data
11
+ data = []
12
+ iri.each_statement do |statement|
13
+ next unless include_data_statement?(statement)
14
+
15
+ statement.graph_name = ::RDF::Serializers.config.default_graph
16
+ data << statement
17
+ end
18
+ data
19
+ end
20
+
21
+ def description
22
+ @description ||= LinkedRails.translations(
23
+ -> { LinkedRails.translate(self.class.translation_key, :description, iri) }
24
+ )
25
+ end
26
+
27
+ def image
28
+ @image ||= RDF::URI("http://fontawesome.io/icon/#{icon}") if icon
29
+ end
30
+
31
+ def label
32
+ @label ||= LinkedRails.translations(
33
+ -> { LinkedRails.translate(self.class.translation_key, :label, iri) }
34
+ )
35
+ end
36
+
37
+ private
38
+
39
+ def icon
40
+ @icon ||= LinkedRails.translate(self.class.translation_key, :icon, iri)
41
+ end
42
+
43
+ def include_data_statement?(statement)
44
+ statement.predicate != Vocab.rdfs.label &&
45
+ statement.predicate != Vocab.rdfs.range &&
46
+ statement.predicate != Vocab.rdfs.domain
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './base'
4
+
5
+ module LinkedRails
6
+ class Ontology
7
+ class Class < Base
8
+ attr_accessor :klass
9
+
10
+ def input_select_property
11
+ klass.try(:input_select_property)
12
+ end
13
+
14
+ def parent_class
15
+ if klass.superclass == ApplicationRecord
16
+ Vocab.schema.Thing
17
+ else
18
+ klass.superclass.iri
19
+ end
20
+ end
21
+
22
+ def plural_label
23
+ @plural_label ||= LinkedRails.translations(
24
+ -> { LinkedRails.translate(self.class.translation_key, :plural_label, iri) }
25
+ )
26
+ end
27
+
28
+ def properties
29
+ @properties ||= klass.predicate_mapping.keys.map { |key| LinkedRails.ontology_property_class.new(iri: key) }
30
+ end
31
+
32
+ class << self
33
+ def iri
34
+ Vocab.rdfs.Class
35
+ end
36
+
37
+ def translation_key
38
+ :class
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end