ecoportal-api-v2 0.8.8 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -3
  3. data/lib/ecoportal/api/common/content.rb +1 -0
  4. data/lib/ecoportal/api/common/content/array_model.rb +8 -6
  5. data/lib/ecoportal/api/common/content/collection_model.rb +10 -4
  6. data/lib/ecoportal/api/common/content/double_model.rb +11 -0
  7. data/lib/ecoportal/api/common/content/hash_diff_patch.rb +31 -19
  8. data/lib/ecoportal/api/common/content/model_helpers.rb +36 -0
  9. data/lib/ecoportal/api/v2/page.rb +1 -0
  10. data/lib/ecoportal/api/v2/page/component.rb +33 -3
  11. data/lib/ecoportal/api/v2/page/component/action.rb +13 -5
  12. data/lib/ecoportal/api/v2/page/component/action_field.rb +37 -2
  13. data/lib/ecoportal/api/v2/page/component/chart_field.rb +39 -5
  14. data/lib/ecoportal/api/v2/page/component/chart_field/benchmark.rb +9 -7
  15. data/lib/ecoportal/api/v2/page/component/chart_field/config.rb +23 -0
  16. data/lib/ecoportal/api/v2/page/component/chart_field/frequency.rb +3 -4
  17. data/lib/ecoportal/api/v2/page/component/chart_field/heatmap.rb +1 -3
  18. data/lib/ecoportal/api/v2/page/component/chart_field/indicator.rb +4 -5
  19. data/lib/ecoportal/api/v2/page/component/chart_field/multiseries.rb +3 -5
  20. data/lib/ecoportal/api/v2/page/component/chart_field/sankey.rb +1 -3
  21. data/lib/ecoportal/api/v2/page/component/chart_field/serie.rb +3 -4
  22. data/lib/ecoportal/api/v2/page/component/chart_field/series_config.rb +5 -7
  23. data/lib/ecoportal/api/v2/page/component/chart_fr_field.rb +7 -5
  24. data/lib/ecoportal/api/v2/page/component/checklist_field.rb +1 -1
  25. data/lib/ecoportal/api/v2/page/component/checklist_item.rb +3 -2
  26. data/lib/ecoportal/api/v2/page/component/date_field.rb +71 -4
  27. data/lib/ecoportal/api/v2/page/component/file.rb +3 -2
  28. data/lib/ecoportal/api/v2/page/component/gauge_field.rb +2 -2
  29. data/lib/ecoportal/api/v2/page/component/geo_coordinates.rb +13 -0
  30. data/lib/ecoportal/api/v2/page/component/geo_field.rb +4 -1
  31. data/lib/ecoportal/api/v2/page/component/images_field.rb +57 -1
  32. data/lib/ecoportal/api/v2/page/component/people_field.rb +102 -4
  33. data/lib/ecoportal/api/v2/page/component/plain_text_field.rb +34 -2
  34. data/lib/ecoportal/api/v2/page/component/reference_field.rb +32 -3
  35. data/lib/ecoportal/api/v2/page/component/selection_field.rb +59 -3
  36. data/lib/ecoportal/api/v2/page/component/selection_option.rb +2 -1
  37. data/lib/ecoportal/api/v2/page/component/tag_field.rb +31 -1
  38. data/lib/ecoportal/api/v2/page/components.rb +8 -3
  39. data/lib/ecoportal/api/v2/page/permission_flags.rb +67 -0
  40. data/lib/ecoportal/api/v2/page/section.rb +65 -5
  41. data/lib/ecoportal/api/v2/page/sections.rb +64 -6
  42. data/lib/ecoportal/api/v2/page/stage.rb +10 -6
  43. data/lib/ecoportal/api/v2/page/stages.rb +2 -2
  44. data/lib/ecoportal/api/v2/pages/page_stage.rb +0 -1
  45. data/lib/ecoportal/api/v2_version.rb +1 -1
  46. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d7fd0373344854c22b4397e7e2d2645dd799695424f3fa30d006fca2081676d
4
- data.tar.gz: 2d839f8ecb67512c2c5d00a2bd6832e53d304334f2c5a6bbc291958661e21130
3
+ metadata.gz: 5833ea731a9d1360c346264d234ce9f95266db92a5480180a17f413459f196de
4
+ data.tar.gz: f3ef175580d2ab47c0ee7f51dc2731c0b42bd27ffa9f59600fb506d5cde38a4b
5
5
  SHA512:
6
- metadata.gz: 27425f592041428b0d07f9593c78f2a80095311e4890a3569ce212e37f067a3b36f2a3b147459e7dca368f7a737671ac9325df6ed40cec3d4a18f75d0ea18d28
7
- data.tar.gz: c4cee01feb2c89179da4eda1d3699e5900812b52fb7d198a1447935ac4e89c347bee56ba69c5f6d1a407f968da21112cf0a490855811ddfd5048caace430c422
6
+ metadata.gz: 52064ec37a32470e699f846ac1c6c57f8f535fb0be1d689a4f086836a47f9fb2805c0f84533842f5aaa4ee9e538c60e61c1569177ae16a015520c65248347174
7
+ data.tar.gz: 0f8cd291558cad37b5157dba7ffdea6670548952b6aa5b0c90b34820abd2693d8f484009265bbc4c8c83fb46684f2968e9a40d4a65563e0ffc6704cca30885d0
data/CHANGELOG.md CHANGED
@@ -1,7 +1,43 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [0.8.8] - 2021-06-xx
4
+ ## [0.8.9] - 2021-06-xx
5
+
6
+ ### Added
7
+ - `Ecoportal::API::Common::Content::ModelHelpers`
8
+ - Starting with `#same_string?`, this lib aims to offer a full set of helper comparers.
9
+ - `Ecoportal::API::V2::Page::Components#get_by_id`
10
+ - In future changes, method `[]` might be overriding the method of the parent class `CollectionModel`.
11
+ - `Ecoportal::API::V2::Page::PermissionFlags` to offer support to `can_permission`, `subscribed`, etc.
12
+ - `Ecoportal::API::V2::Page::Section#add_component` super handy helper to add fields to sections.
13
+ - `Ecoportal::API::V2::Page::Component::PeopleField#delete` to remove people using their ids.
14
+ - `Ecoportal::API::V2::Page::Component::GeoField` **added** suport for `#coordinates`
15
+ - With embedded object `Ecoportal::API::V2::Page::Component::GeoCoordinates`
16
+ - `#configure` method, to all the `Component` types (but `ChartField` s)
17
+ - This method allows to quickly set field properties.
18
+ - `Ecoportal::API::V2::Page::Sections#between`, aiming to obtain sections between two other ones
19
+
20
+
21
+ ### Changed
22
+ - `Ecoportal::API::V2::Page::Section` real support for `split` sections (right vs left)
23
+ - This is actually a **FIX**
24
+ - `Ecoportal::API::V2::Page::Component::DateField#create_event`
25
+ - Now it switches to _allow future dates_
26
+ - `Ecoportal::API::V2::Page::Component::SelectionField#add_option`, the `name` parameter is now optional
27
+ - This change aims to make it consistent with the back-end.
28
+ - To its actual `Boolean` type some properties
29
+ - All `Component` types
30
+
31
+ ### Fixed
32
+ - `Ecoportal::API::Common::Content::HashDiffPatch` did not support `Hash` values without `id` or `patch_ver`
33
+ - This fix should allow them to flow to the update
34
+ - `Ecoportal::API::V2::Page::Component::ChartField` did not have `doc` for `mode` based configuration
35
+ - `Ecoportal::API::Common::Content::ArrayModel#insert_one`
36
+ - When `pos`, `before` & `after` were `nil` it was failing to attach the element.
37
+ - `Ecoportal::API::V2::Page::Sections#add` was not adding in the correct order
38
+ - `Ecoportal::API::V2::Page::Section.new_doc` was unnecessarily giving `9999` as default weight
39
+
40
+ ## [0.8.8] - 2021-08-03
5
41
 
6
42
  ### Added
7
43
  - `Ecoportal::API::V2::Page::Component::ChartField::Benchmark`
@@ -10,8 +46,7 @@ All notable changes to this project will be documented in this file.
10
46
 
11
47
  ### Changed
12
48
  - Removed `Stages.ordered_stages`: detected bug with Enumerable iteration
13
-
14
- ### Fixed
49
+
15
50
 
16
51
  ## [0.8.7] - 2021-05-25
17
52
 
@@ -9,6 +9,7 @@ end
9
9
 
10
10
  require 'ecoportal/api/common/content/class_helpers'
11
11
  require 'ecoportal/api/common/content/string_digest'
12
+ require 'ecoportal/api/common/content/model_helpers'
12
13
  require 'ecoportal/api/common/content/double_model'
13
14
  require 'ecoportal/api/common/content/array_model'
14
15
  require 'ecoportal/api/common/content/collection_model'
@@ -3,7 +3,8 @@ module Ecoportal
3
3
  module Common
4
4
  module Content
5
5
  # Class to handle a plain Array embedded in a Hashed model.
6
- # @note its purpose is to handle an Array of basic objects (i.e. `Date`, `String`, `Number`)
6
+ # @note
7
+ # - Its purpose is to handle an Array of basic objects (i.e. `Date`, `String`, `Number`)
7
8
  class ArrayModel < Content::DoubleModel
8
9
  class TypeMismatchedComparison < Exception
9
10
  def initialize (this: nil, that: msg = "Trying to compare objects with different behavior.")
@@ -222,15 +223,16 @@ module Ecoportal
222
223
  def insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
223
224
  i = index(value)
224
225
  return i if (i && uniq?)
225
-
226
226
  pos = case
227
227
  when used_param?(pos)
228
- pos
228
+ pos || length
229
229
  when used_param?(before)
230
- index(before)
230
+ before ? index(before) : length
231
231
  when used_param?(after)
232
- if i = index(after)
233
- i + 1
232
+ if after
233
+ if i = index(after) then i + 1 end
234
+ else
235
+ length
234
236
  end
235
237
  else
236
238
  length
@@ -2,6 +2,9 @@ module Ecoportal
2
2
  module API
3
3
  module Common
4
4
  module Content
5
+ # CollectionModel aims to deal with Arrays of actual objects.
6
+ # @note to be able to refer to the correct element of the Collection,
7
+ # it is required that those elements have a unique `key` that allows to identify them
5
8
  class CollectionModel < Content::DoubleModel
6
9
 
7
10
  class << self
@@ -167,6 +170,7 @@ module Ecoportal
167
170
  end
168
171
  end
169
172
 
173
+ # Deletes `value` from this `CollectionModel` instance
170
174
  def delete!(value)
171
175
  unless value.is_a?(Hash) || value.is_a?(Content::DoubleModel)
172
176
  raise "'Content::DoubleModel' or 'Hash' doc required"
@@ -186,7 +190,7 @@ module Ecoportal
186
190
  variables_remove!
187
191
  end
188
192
 
189
- # Gets the `key` of the object
193
+ # Gets the `key` of the object `value`
190
194
  def get_key(value)
191
195
  case value
192
196
  when Content::DoubleModel
@@ -235,10 +239,13 @@ module Ecoportal
235
239
  super
236
240
  end
237
241
 
242
+ # Deletes `value` from `doc` (here referred as `_doc_items`)
243
+ # @return [Object] the element deleted from `doc`
238
244
  def _doc_delete(value)
239
245
  if current_pos = _doc_key(value)
240
- _doc_items.delete_at(current_pos)
241
- on_change
246
+ _doc_items.delete_at(current_pos).tap do |deleted|
247
+ on_change
248
+ end
242
249
  end
243
250
  end
244
251
 
@@ -250,7 +257,6 @@ module Ecoportal
250
257
  when used_param?(before)
251
258
  _doc_key(before)
252
259
  when used_param?(after)
253
- #puts "to add after #{after.id}"
254
260
  if i = _doc_key(after)
255
261
  i + 1
256
262
  end
@@ -10,6 +10,7 @@ module Ecoportal
10
10
  class DoubleModel < Common::BaseModel
11
11
  NOT_USED = Common::Content::ClassHelpers::NOT_USED
12
12
  extend Common::Content::ClassHelpers
13
+ include Common::Content::ModelHelpers
13
14
 
14
15
  class UnlinkedModel < Exception
15
16
  def initialize (msg = "Something went wrong when linking the document.", from: nil, key: nil)
@@ -109,6 +110,16 @@ module Ecoportal
109
110
  self
110
111
  end
111
112
 
113
+ # To link as a `Boolean` to a subjacent `Hash` model property
114
+ # @param read_only [Boolean] should it only define the reader?
115
+ def passboolean(*methods, read_only: false)
116
+ pass_reader(*methods) {|value| value}
117
+ unless read_only
118
+ pass_writer(*methods) {|value| !!value}
119
+ end
120
+ self
121
+ end
122
+
112
123
  # To link as plain `Array` to a subjacent `Hash` model property
113
124
  # @param order_matters [Boolean] does the order matter
114
125
  # @param uniq [Boolean] should it contain unique elements
@@ -85,31 +85,43 @@ module Ecoportal
85
85
  end
86
86
 
87
87
  def patch_delete(b)
88
- return NO_CHANGES unless b.is_a?(Hash) && id = get_id(b, exception: false)
89
- {
90
- "id" => id,
91
- "operation" => "deleted",
92
- "data" => patch_data(b, delete: true)
93
- }
88
+ return NO_CHANGES unless b.is_a?(Hash)
89
+ if id = get_id(b, exception: false)
90
+ {
91
+ "id" => id,
92
+ "operation" => "deleted",
93
+ "data" => patch_data(b, delete: true)
94
+ }
95
+ else
96
+ nil
97
+ end
94
98
  end
95
99
 
96
100
  def patch_new(a)
97
- return NO_CHANGES unless a.is_a?(Hash) && id = get_id(a, exception: false)
98
- {
99
- "id" => id,
100
- "operation" => "new",
101
- "data" => patch_data(a)
102
- }
101
+ return NO_CHANGES unless a.is_a?(Hash)
102
+ if id = get_id(a, exception: false)
103
+ {
104
+ "id" => id,
105
+ "operation" => "new",
106
+ "data" => patch_data(a)
107
+ }
108
+ else
109
+ a
110
+ end
103
111
  end
104
112
 
105
113
  def patch_update(a, b)
106
- return NO_CHANGES unless a.is_a?(Hash) && id = get_id(a, exception: false)
107
- {
108
- "id" => id,
109
- "operation" => "changed",
110
- "data" => patch_data(a, b)
111
- }.tap do |update_hash|
112
- return nil unless update_hash["data"] != NO_CHANGES
114
+ return NO_CHANGES unless a.is_a?(Hash)
115
+ if id = get_id(a, exception: false)
116
+ {
117
+ "id" => id,
118
+ "operation" => "changed",
119
+ "data" => patch_data(a, b)
120
+ }.tap do |update_hash|
121
+ return nil unless update_hash["data"] != NO_CHANGES
122
+ end
123
+ else
124
+ a
113
125
  end
114
126
  end
115
127
 
@@ -0,0 +1,36 @@
1
+ module Ecoportal
2
+ module API
3
+ module Common
4
+ module Content
5
+ module ModelHelpers
6
+
7
+ private
8
+
9
+ # Offers multiple ways to compare two strings
10
+ def same_string?(value1, value2, exact: false)
11
+ case
12
+ when value1.is_a?(String) && value2.is_a?(String)
13
+ if exact
14
+ value1 == value2
15
+ else
16
+ value1.to_s.strip.downcase == value2.to_s.strip.downcase
17
+ end
18
+ when value1.is_a?(Regexp) && value2.is_a?(String)
19
+ value2 =~ value1
20
+ when value1.is_a?(String) && value2.is_a?(Regexp)
21
+ value1 =~ value2
22
+ else
23
+ value1 == value2
24
+ end
25
+ end
26
+
27
+ def hash_except(hash, *keys)
28
+ keys.each {|key| hash.delete(key)}
29
+ hash
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -34,6 +34,7 @@ module Ecoportal
34
34
  end
35
35
  end
36
36
 
37
+ require 'ecoportal/api/v2/page/permission_flags'
37
38
  require 'ecoportal/api/v2/page/permit'
38
39
  require 'ecoportal/api/v2/page/component'
39
40
  require 'ecoportal/api/v2/page/components'
@@ -59,7 +59,6 @@ module Ecoportal
59
59
  when "checklist"
60
60
  checklist_field_class
61
61
  when "page_action","checklist_task"
62
- #doc["type"] = "checklist_task"
63
62
  action_field_class
64
63
  when "file"
65
64
  files_field_class
@@ -85,8 +84,9 @@ module Ecoportal
85
84
  passkey :id
86
85
  passthrough :patch_ver, :undeletable
87
86
  passthrough :type, :label, :tooltip, :global_binding
88
- passthrough :hidden, :accent, :deindex, :required
89
- passthrough :hide_view, :hidden_on_reports, :hidden_on_mobile
87
+ passboolean :hidden, :deindex, :required
88
+ passthrough :accent
89
+ passboolean :hide_view, :hidden_on_reports, :hidden_on_mobile
90
90
  passarray :refs
91
91
 
92
92
  def ref_backend
@@ -107,6 +107,36 @@ module Ecoportal
107
107
  self.class.indexable_label(label)
108
108
  end
109
109
 
110
+ # Quick config helper
111
+ # @param conf [Symbol, Array<Symbol>]
112
+ # - `:required`
113
+ # - `:hide_view` to hide in view mode
114
+ # - `:hide_mobile` to hide in mobile app
115
+ # - `:hide_reports` to hide in reports
116
+ # - `:global` to define a global binding
117
+ def configure(*conf)
118
+ conf.each_with_object([]) do |cnf, unused|
119
+ case cnf
120
+ when :required
121
+ self.required = true
122
+ when :hide_view
123
+ self.hide_view = true
124
+ when :hide_mobile
125
+ self.hidden_on_mobile = true
126
+ when :hide_reports
127
+ self.hidden_on_reports = true
128
+ when Hash
129
+ if cnf.key?(:global)
130
+ self.global_binding = cnf[:global]
131
+ end
132
+ else
133
+ unused.push(cnf)
134
+ end
135
+ end.tap do |unused|
136
+ raise "Unsupported configuration options '#{unused}' for #{self.class}" unless unused.empty?
137
+ end
138
+ end
139
+
110
140
  end
111
141
  end
112
142
  end
@@ -12,14 +12,22 @@ module Ecoportal
12
12
  }
13
13
  end
14
14
  end
15
-
15
+
16
16
  passkey :id
17
17
  passthrough :patch_ver, :name
18
- passthrough :weight, :complete, :other_information
19
- passdate :due_date
20
- pass_reader :overdue
18
+ passthrough :weight, :other_information
19
+ passboolean :complete
20
+
21
21
  passdate :created_at, read_only: true #, :completed_at
22
- pass_reader :created_by, :assigned_person_member_id
22
+ passthrough :created_by, read_only: true
23
+ passthrough :assigned_person_member_id, :assigned_person_member
24
+
25
+ passdate :due_date, :reminder_date
26
+ passboolean :overdue, read_only: true
27
+
28
+ passthrough :duration_in_days, read_only: true
29
+ passarray :file_container_ids
30
+
23
31
  end
24
32
  end
25
33
  end
@@ -4,9 +4,9 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class ActionField < Page::Component
7
- passthrough :create_actions
7
+ passboolean :create_actions
8
8
  passthrough :required_number_of_completed_actions
9
- passthrough :permits_and_rules_integration, :add_subscribed, :add_subscribed_to_tasks
9
+ passboolean :permits_and_rules_integration, :add_subscribed, :add_subscribed_to_tasks
10
10
 
11
11
  embeds_many :actions, klass: "Ecoportal::API::V2::Page::Component::Action", order_key: :weight
12
12
 
@@ -30,8 +30,43 @@ module Ecoportal
30
30
  end.map(&:first)
31
31
  end
32
32
 
33
+ # Quick config helper
34
+ # @param conf [Symbol, Array<Symbol>]
35
+ # - `:requires` required number of completed actions
36
+ # - `:all`
37
+ # - `#Number`
38
+ def configure(*conf)
39
+ self.create_actions = true
40
+ conf.each_with_object([]) do |cnf, unused|
41
+ case cnf
42
+ when Hash
43
+ supported = [:requires]
44
+ unless (rest = hash_except(cnf.dup, *supported)).empty?
45
+ unused.push(rest)
46
+ end
47
+ if cnf.key?(:requires) then configure_required(cnf[:requires]) end
48
+ else
49
+ unused.push(cnf)
50
+ end
51
+ end.yield_self do |unused|
52
+ super(*unused)
53
+ end
54
+ end
55
+
33
56
  private
34
57
 
58
+ def configure_required(req)
59
+ self.required = true
60
+ case req
61
+ when :all, NilClass
62
+ self.required_number_of_completed_actions = "all"
63
+ when Numeric
64
+ self.required_number_of_completed_actions = req
65
+ else
66
+ # Unsupported
67
+ end
68
+ end
69
+
35
70
  def fix_task_weights!
36
71
  ordered_tasks.each_with_index do |task, index|
37
72
  task.weight = index
@@ -5,10 +5,14 @@ module Ecoportal
5
5
  class Component
6
6
  class ChartField < Page::Component
7
7
  passthrough :mode
8
- passthrough :relative, :relstart, :relbound
9
- passthrough :bounded, :ubound, :lbound
8
+ passboolean :relative, :bounded
9
+ passthrough :relstart, :relbound
10
+ passthrough :ubound, :lbound
11
+
10
12
  passthrough :filter_date_input
11
- passthrough :user_id, :lock_chart_user
13
+
14
+ passthrough :user_id, :user_lookup
15
+ passboolean :lock_chart_user
12
16
 
13
17
  embeds_one :series_config, klass: "Ecoportal::API::V2::Page::Component::ChartField::SeriesConfig"
14
18
  embeds_one :frequency_config, klass: "Ecoportal::API::V2::Page::Component::ChartField::Frequency"
@@ -20,10 +24,18 @@ module Ecoportal
20
24
 
21
25
  embeds_many :series, klass: "Ecoportal::API::V2::Page::Component::ChartField::Serie"
22
26
 
23
- MODES = ["frequency", "series", "heatmap", "sankey", "indicator", "faceted_series"]
27
+ MODES = ["frequency", "series", "heatmap", "sankey", "indicator", "faceted_series", "benchmark"]
28
+
29
+ def mode=(value)
30
+ raise "Unsuported mode #{value}. Should be one of #{MODES}" unless MODES.include?(value)
31
+ config_doc(nil)
32
+ doc["mode"] = value
33
+ config_doc(config.class.new_doc)
34
+ self.mode
35
+ end
24
36
 
25
37
  def config
26
- case mode
38
+ case self.mode
27
39
  when "frequency"
28
40
  frequency_config
29
41
  when "series"
@@ -41,6 +53,27 @@ module Ecoportal
41
53
  end
42
54
  end
43
55
 
56
+ private
57
+
58
+ def config_doc(value)
59
+ case self.mode
60
+ when "frequency"
61
+ doc["frequency_config"] = value
62
+ when "series"
63
+ doc["series_config"] = value
64
+ when "heatmap"
65
+ doc["heatmap_config"] = value
66
+ when "sankey"
67
+ doc["sankey_config"] = value
68
+ when "indicator"
69
+ doc["indicator_config"] = value
70
+ when "faceted_series"
71
+ doc["faceted_series_config"] = value
72
+ when "benchmark"
73
+ doc["benchmark_config"] = value
74
+ end
75
+ end
76
+
44
77
  end
45
78
  end
46
79
  end
@@ -48,6 +81,7 @@ module Ecoportal
48
81
  end
49
82
  end
50
83
 
84
+ require 'ecoportal/api/v2/page/component/chart_field/config'
51
85
  require 'ecoportal/api/v2/page/component/chart_field/frequency'
52
86
  require 'ecoportal/api/v2/page/component/chart_field/series_config'
53
87
  require 'ecoportal/api/v2/page/component/chart_field/serie'