ecoportal-api-v2 0.9.1 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd6779bebb389337e0a18e355c36cbb5c2ba0ed84f31b7cdbca3bec051a30bd2
4
- data.tar.gz: 32e9cc407394ef5ae7ef56f87650180789d229930daf5d7e65d44c33768041ca
3
+ metadata.gz: 44e2e864edc50d00dc9bf4f0d76f75904c518b46e2bd66fea8326329d1056e6a
4
+ data.tar.gz: bef29f826e284736b16c5c6587039822b17052abee27da1764b9c46b3cf2c13b
5
5
  SHA512:
6
- metadata.gz: f2e84e20a4952e07ce7575f98a32b7cd216dbdc163fed0dcf9b9e383062e509d0702cff679b51e02b235afa0b68add386638d41eb5dc7cfcaaabfd965288530b
7
- data.tar.gz: d0b3a2d2043a31cca656c98a812dc2e632ae565c121cc85991c211b51acafebb58206be305dbc9da1fcfaf23acc83218ddb1db952d43b76fb5fccc1bc933bde9
6
+ metadata.gz: 4497df74b329f61934ab456958aaf3a0f9cd2ede10ed488dda7dc003d1ac2f4f5ab637034ef30b6d726b7b7ca5c9f56140bb2f8ac865f759dc376b4ebb489e49
7
+ data.tar.gz: 0b13d22da55564d605283fc9a0a325dfc863f137079309f2989ee721fc3163a21fe94f9530610df293b1802fcc3d7127bba8d23f6390c4cde459209c6f3a5a45
data/CHANGELOG.md CHANGED
@@ -1,12 +1,41 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [0.9.2] - 2022-09-26
4
+ ## [0.9.4] - 2022-10-xx
5
5
 
6
6
  ### Added
7
7
  ### Changed
8
8
  ### Fixed
9
9
 
10
+ ## [0.9.3] - 2022-10-11
11
+
12
+ ### Added
13
+ - `Ecoportal::API::V2::Page` **methods** `#mark_as_submit` and `#mark_as_sign_off`
14
+
15
+ ### Changed
16
+ - `Ecoportal::API::V2::Pages#get_new`, to return an object of class `Ecoportal::API::V2::Pages::PageStage`
17
+
18
+ ### Fixed
19
+ - Remove debugging message
20
+
21
+ ## [0.9.2] - 2022-09-29
22
+
23
+ ### Added
24
+ - `Ecoportal::API::V2::Page::Component::SelectionOption#delete!`
25
+ - `Ecoportal::API::V2::Page::Component#delete!`
26
+ - `Ecoportal::API::V2::Page::Component#move` to move to another section or side of the same
27
+ - `Ecoportal::API::V2::Page::Component#unattach!` to detach the component from any section
28
+ - `Ecoportal::API::V2::Page::Component::SelectionOption#delete!`
29
+ - `Ecoportal::API::V2::Page::Component::Binding#delete!`
30
+ - `Ecoportal::API::V2::Page::Section#remove_component!` to simplify the removal of a field from the section
31
+
32
+ ### Changed
33
+ - `Ecoportal::API::V2::Page::Component::SelectionField#options`
34
+ - **added** and moved logics to `Ecoportal::API::V2::Page::Component::SelectionOptions`
35
+ - `Ecoportal::API::V2::Page::Component::SelectionOption#name` to return `#value` when it's empty
36
+
37
+ ### Fixed
38
+ - Remove debugging message
10
39
 
11
40
  ## [0.9.1] - 2022-09-26
12
41
 
@@ -16,9 +45,6 @@ All notable changes to this project will be documented in this file.
16
45
  ### Changed
17
46
  - `Ecoportal::API::V2::Page::Force`, logic around `helpers` (remote forces)
18
47
  - **breaking change**: `script` is not writable anymore. You should use `custom_script` instead.
19
-
20
- ### Fixed
21
-
22
48
 
23
49
  ## [0.8.33] - 2022-09-23
24
50
 
@@ -278,7 +278,6 @@ module Ecoportal
278
278
  _items.delete(value)
279
279
  end
280
280
  end
281
-
282
281
  end
283
282
  end
284
283
  end
@@ -240,7 +240,6 @@ module Ecoportal
240
240
  def model_forced_keys
241
241
  @forced_model_keys ||= {}
242
242
  end
243
-
244
243
  end
245
244
 
246
245
  inheritable_class_vars :forced_model_keys, :key
@@ -7,8 +7,7 @@ module Ecoportal
7
7
  passboolean :multiple, :flat, :other
8
8
  passthrough :other_desc
9
9
  passthrough :data_type
10
-
11
- embeds_many :options, klass: "Ecoportal::API::V2::Page::Component::SelectionOption", order_key: :weight
10
+ embeds_many :options, enum_class: "Ecoportal::API::V2::Page::Component::SelectionOptions"
12
11
 
13
12
  def numeric?
14
13
  self.data_type == "num"
@@ -19,12 +18,12 @@ module Ecoportal
19
18
  end
20
19
 
21
20
  def numeric!(&block)
22
- ordered_options.each {|opt| opt.numeric!(&block)}
21
+ options.ordered.each {|opt| opt.numeric!(&block)}
23
22
  self.data_type = "num"
24
23
  end
25
24
 
26
25
  def text!(&block)
27
- ordered_options.each {|opt| opt.text!(&block)}
26
+ options.ordered.each {|opt| opt.text!(&block)}
28
27
  self.data_type = "str"
29
28
  end
30
29
 
@@ -33,7 +32,7 @@ module Ecoportal
33
32
  end
34
33
 
35
34
  def select(value_name, by_name: false)
36
- opt = find_option(value_name, by_name: by_name)
35
+ opt = options.find_option(value_name, by_name: by_name)
37
36
  sel = selected
38
37
  return true if !multiple && opt == sel
39
38
  sel.selected = false if !multiple && sel
@@ -41,7 +40,7 @@ module Ecoportal
41
40
  end
42
41
 
43
42
  def deselect(value_name, by_name: false)
44
- if opt = find_option(value_name, by_name: by_name)
43
+ if opt = options.find_option(value_name, by_name: by_name)
45
44
  opt.selected = false
46
45
  end
47
46
  end
@@ -50,17 +49,17 @@ module Ecoportal
50
49
  case
51
50
  when by_value
52
51
  elems = [selected].flatten.compact
53
- options_hash(elems) do |option|
52
+ options.hash(elems) do |option|
54
53
  name ? option.name : option
55
54
  end
56
55
  when by_name
57
56
  elems = [selected].flatten.compact
58
- options_hash(elems, by_name: true) do |option|
57
+ options.hash(elems, by_name: true) do |option|
59
58
  value ? option.value : option
60
59
  end
61
60
  else
62
61
  if multiple
63
- ordered_options.select {|opt| opt.selected}
62
+ options.ordered.select {|opt| opt.selected}
64
63
  else
65
64
  options.find {|opt| opt.selected}
66
65
  end
@@ -91,43 +90,23 @@ module Ecoportal
91
90
  [name].flatten.compact
92
91
  end
93
92
 
94
- def add_option(value:, name: nil, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
95
- opt_doc = options.items_class.new_doc
96
- options.upsert!(opt_doc, pos: pos, before: before, after: after) do |option|
97
- option.name = name
98
- option.value = value
99
- if prev = previous_option(option)
100
- option.weight = prev.weight
101
- end
102
- yield(option) if block_given?
103
- fix_option_weights!
104
- end
93
+ # @see Ecoportal::API::V2::Component::SelectionOptions#add
94
+ def add_option(**kargs, &block)
95
+ options.add(**kargs, &block)
105
96
  end
106
97
 
107
98
  def ordered_options
108
- options.sort_by.with_index do |option, index|
109
- [option.weight, index]
110
- end
99
+ options.ordered
111
100
  end
112
101
 
113
- # @param name [Boolean] whether or not the values of the `Hash` should be the `names`
114
- # @return [Hash] of **key** _value_ and **value**:
115
- # 1. _option_ if `name` is `false`
116
- # 2. _name_ if `name` is `true`
102
+ # @see Ecoportal::API::V2::Component::SelectionOptions#by_value
117
103
  def options_by_value(name: false)
118
- options_hash do |option|
119
- name ? option.name : option
120
- end
104
+ options.by_value(name: name)
121
105
  end
122
106
 
123
- # @param value [Boolean] whether or not the values of the `Hash` should be the `values`
124
- # @return [Hash] of **key** _name_ and **value**:
125
- # 1. _option_ if `value` is `false`
126
- # 2. _value_ if `value` is `true`
107
+ # @see Ecoportal::API::V2::Component::SelectionOptions#by_name
127
108
  def options_by_name(value: false)
128
- options_hash(by_name: true) do |option|
129
- value ? option.value : option
130
- end
109
+ options.by_name(value: value)
131
110
  end
132
111
 
133
112
  def to_s(value: true, delimiter: "\n")
@@ -198,34 +177,6 @@ module Ecoportal
198
177
  end
199
178
  end
200
179
  end
201
-
202
- def fix_option_weights!
203
- ordered_options.each_with_index do |option, index|
204
- option.weight = index
205
- end
206
- end
207
-
208
- def previous_option(value)
209
- opts = ordered_options
210
- pos = opts.index(value) - 1
211
- return if pos < 0
212
- opts[pos]
213
- end
214
-
215
- def find_option(value_name, by_name: false)
216
- if by_name
217
- opt = options.find {|opt| same_string?(opt.name, value_name)}
218
- else
219
- opt = options.find {|opt| opt.value == value_name}
220
- end
221
- end
222
-
223
- def options_hash(elems = ordered_options, by_name: false)
224
- elems.each_with_object({}) do |option, hash|
225
- key = by_name ? option.name : option.value
226
- hash[key] = block_given?? yield(option) : option
227
- end
228
- end
229
180
  end
230
181
  end
231
182
  end
@@ -233,4 +184,5 @@ module Ecoportal
233
184
  end
234
185
  end
235
186
 
187
+ require 'ecoportal/api/v2/page/component/selection_options'
236
188
  require 'ecoportal/api/v2/page/component/selection_option'
@@ -4,7 +4,6 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class SelectionOption < Common::Content::DoubleModel
7
-
8
7
  class << self
9
8
  def new_doc
10
9
  {
@@ -20,6 +19,14 @@ module Ecoportal
20
19
  passthrough :weight
21
20
  passboolean :selected
22
21
 
22
+ def name
23
+ doc["name"] || "#{value}"
24
+ end
25
+
26
+ def delete!
27
+ _parent.delete!(self)
28
+ end
29
+
23
30
  def numeric!
24
31
  self.value = block_given?? yield(value) : to_i(value)
25
32
  end
@@ -0,0 +1,93 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Component
6
+ class SelectionOptions < Common::Content::CollectionModel
7
+ class_resolver :option_class, "Ecoportal::API::V2::Page::Component::SelectionOption"
8
+
9
+ self.klass = :option_class
10
+ self.order_key = :weight
11
+
12
+ def component
13
+ self._parent
14
+ end
15
+
16
+ def ooze
17
+ component.ooze
18
+ end
19
+
20
+ def add(value:, name: nil, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
21
+ opt_doc = items_class.new_doc
22
+ upsert!(opt_doc, pos: pos, before: before, after: after) do |option|
23
+ option.name = name
24
+ option.value = value
25
+ if prev = previous_option(option)
26
+ option.weight = prev.weight
27
+ end
28
+ yield(option) if block_given?
29
+ fix_weights!
30
+ end
31
+ end
32
+
33
+ def find_option(value_name, by_name: false)
34
+ if by_name
35
+ opt = self.find {|opt| same_string?(opt.name, value_name)}
36
+ else
37
+ opt = self.find {|opt| opt.value == value_name}
38
+ end
39
+ end
40
+
41
+ def ordered
42
+ self.sort_by.with_index do |option, index|
43
+ [option.weight, index]
44
+ end
45
+ end
46
+
47
+ # @param name [Boolean] whether or not the values of the `Hash` should be the `names`
48
+ # @return [Hash] of **key** _value_ and **value**:
49
+ # 1. _option_ if `name` is `false`
50
+ # 2. _name_ if `name` is `true`
51
+ def by_value(name: false)
52
+ hash do |option|
53
+ name ? option.name : option
54
+ end
55
+ end
56
+
57
+ # @param value [Boolean] whether or not the values of the `Hash` should be the `values`
58
+ # @return [Hash] of **key** _name_ and **value**:
59
+ # 1. _option_ if `value` is `false`
60
+ # 2. _value_ if `value` is `true`
61
+ def by_name(value: false)
62
+ hash(by_name: true) do |option|
63
+ value ? option.value : option
64
+ end
65
+ end
66
+
67
+ def hash(elems = ordered, by_name: false)
68
+ elems.each_with_object({}) do |option, hash|
69
+ key = by_name ? option.name : option.value
70
+ hash[key] = block_given?? yield(option) : option
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def fix_weights!
77
+ ordered.each_with_index do |option, index|
78
+ option.weight = index
79
+ end
80
+ end
81
+
82
+ def previous_option(value)
83
+ opts = ordered
84
+ pos = opts.index(value) - 1
85
+ return if pos < 0
86
+ opts[pos]
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -118,6 +118,16 @@ module Ecoportal
118
118
  !!section
119
119
  end
120
120
 
121
+ # Unattaches the field from any section
122
+ # @note please make sure to reattach or delete! the field before save
123
+ def unattach!
124
+ ooze.sections.select do |sec|
125
+ sec.component?(id)
126
+ end.each do |sec|
127
+ sec.remove_component!(self)
128
+ end
129
+ end
130
+
121
131
  # @return [Boolean] whether or not the component has been attached to more than one section.
122
132
  def multi_section?
123
133
  secs = ooze.sections.select {|sec| sec.component?(id)}
@@ -144,6 +154,17 @@ module Ecoportal
144
154
  forces.count > 0
145
155
  end
146
156
 
157
+ def delete!
158
+ bindings.each {|b| b.delete!}
159
+ self.unattach!
160
+ self._parent.delete!(self)
161
+ end
162
+
163
+ def move(section:, before: nil, after: nil, side: nil)
164
+ self.unattach!
165
+ section.add_component(self, before: before, after: after, side: side)
166
+ end
167
+
147
168
  def indexable_label(any_length: false)
148
169
  self.class.indexable_label(label, any_length: any_length)
149
170
  end
@@ -52,6 +52,10 @@ module Ecoportal
52
52
  def reference
53
53
  self.component? ? component : section
54
54
  end
55
+
56
+ def delete!
57
+ self._parent.delete!(self)
58
+ end
55
59
  end
56
60
  end
57
61
  end
@@ -174,7 +174,6 @@ module Ecoportal
174
174
  get_by_name(value).first
175
175
  end
176
176
  end
177
-
178
177
  end
179
178
  end
180
179
  end
@@ -7,6 +7,7 @@ module Ecoportal
7
7
 
8
8
  self.klass = :force_class
9
9
  order_matters = true
10
+ self.order_key = :weight
10
11
 
11
12
  def ooze
12
13
  self._parent.ooze
@@ -83,6 +83,27 @@ module Ecoportal
83
83
  left_component_ids.to_a | right_component_ids.to_a
84
84
  end
85
85
 
86
+ # @note when removing a component, please make sure to either
87
+ # add it to another section or to delete! it before save
88
+ def remove_component!(*comps_or_ids)
89
+ comps_or_ids.each do |com_or_id|
90
+ case com_or_id
91
+ when Ecoportal::API::V2::Page::Component
92
+ remove_component!(com_or_id.id)
93
+ when String
94
+ if split?
95
+ left_component_ids.delete!(com_or_id)
96
+ right_component_ids.delete!(com_or_id)
97
+ else
98
+ component_ids.delete!(com_or_id)
99
+ end
100
+ else
101
+ msg = "Missuse: com_or_id should be a Component or a String. Given: #{com_or_id.class}"
102
+ raise ArgumentError.new(msg)
103
+ end
104
+ end
105
+ end
106
+
86
107
  # @raise [ArgumentError] if `com_or_id` is not of any of the allowed types
87
108
  # @param com_or_id [Ecoportal::API::V2::Page::Component, String] Component or `id` thereof
88
109
  # @return [Boolean] whether or not a component/field belongs to this section.
@@ -98,14 +119,32 @@ module Ecoportal
98
119
  end
99
120
  end
100
121
 
122
+ # @return[Symbol, Nil] might be `:right`, maybe `:left`, or `nil`
123
+ def component_side(com_or_id)
124
+ return nil unless split?
125
+ case com_or_id
126
+ when Ecoportal::API::V2::Page::Component
127
+ component_side(com_or_id.id)
128
+ when String
129
+ if left_component_ids.include?(com_or_id)
130
+ :left
131
+ elsif right_component_ids.include?(com_or_id)
132
+ :right
133
+ end
134
+ else
135
+ msg = "Missuse: com_or_id should be a Component or a String. Given: #{com_or_id.class}"
136
+ raise ArgumentError.new(msg)
137
+ end
138
+ end
139
+
101
140
  # It looks up the components that belong to this section.
102
141
  # @return [Array<Ecoportal::API::V2::Page::Component>]
103
142
  def components(side: nil)
104
143
  case side
105
144
  when :right
106
- components_right
145
+ right_components
107
146
  when :left
108
- components_left
147
+ left_components
109
148
  when NilClass
110
149
  components_by_id(*all_component_ids)
111
150
  else
@@ -116,7 +155,7 @@ module Ecoportal
116
155
  # It looks up the components that belong to the `left` side of this section.
117
156
  # @raise [Exception] if this is not a `split` section
118
157
  # @return [Array<Ecoportal::API::V2::Page::Component>]
119
- def components_left
158
+ def left_components
120
159
  raise "You are trying to retrieve side components in a Split Section" unless split?
121
160
  components_by_id(*left_component_ids)
122
161
  end
@@ -124,7 +163,7 @@ module Ecoportal
124
163
  # It looks up the components that belong to the `right` side of this section.
125
164
  # @raise [Exception] if this is not a `split` section
126
165
  # @return [Array<Ecoportal::API::V2::Page::Component>]
127
- def components_right
166
+ def right_components
128
167
  raise "You are trying to retrieve side components in a Split Section" unless split?
129
168
  components_by_id(*right_component_ids)
130
169
  end
@@ -159,9 +198,13 @@ module Ecoportal
159
198
  end
160
199
 
161
200
  if before
162
- before_fld = to_component(before, side: side)
201
+ if before_fld = to_component(before, side: side)
202
+ side ||= component_side(before_fld)
203
+ end
163
204
  elsif after
164
- after_fld = to_component(after, side: side)
205
+ if after_fld = to_component(after, side: side)
206
+ side ||= component_side(after_fld)
207
+ end
165
208
  end
166
209
 
167
210
  if split?
@@ -176,20 +219,14 @@ module Ecoportal
176
219
  private
177
220
 
178
221
  def components_by_id(*ids)
179
- root.components.values_at(*ids).select.with_index do |fld, i|
222
+ ooze.components.values_at(*ids).select.with_index do |fld, i|
180
223
  puts "Warning: field id #{ids[i]} points to missing field" if !fld
181
224
  fld && (!block_given? || yield(fld))
182
225
  end
183
226
  end
184
227
 
185
228
  def to_component(value, side: nil)
186
- if split?
187
- fields = components(side: side || :left)
188
- else
189
- fields = components
190
- end
191
-
192
- fields.find do |fld|
229
+ components(side: side).find do |fld|
193
230
  found = nil
194
231
  found ||= fld.id == value.id if value.is_a?(Ecoportal::API::V2::Page::Component)
195
232
  found ||= fld.id == value
@@ -6,7 +6,8 @@ module Ecoportal
6
6
  class_resolver :section_class, "Ecoportal::API::V2::Page::Section"
7
7
 
8
8
  self.klass = :section_class
9
-
9
+ self.order_key = :weight
10
+
10
11
  def ooze
11
12
  self._parent.ooze
12
13
  end
@@ -6,7 +6,8 @@ module Ecoportal
6
6
  class_resolver :stage_class, "Ecoportal::API::V2::Page::Stage"
7
7
 
8
8
  self.klass = :stage_class
9
-
9
+ self.order_key = :ordering
10
+
10
11
  def ooze
11
12
  self._parent.ooze
12
13
  end
@@ -60,6 +60,16 @@ module Ecoportal
60
60
  end
61
61
  msg.empty?? true : msg
62
62
  end
63
+
64
+ def mark_as_submit
65
+ doc["submitted"] = true
66
+ doc["type"] = "complete_page"
67
+ end
68
+
69
+ def mark_as_sign_off
70
+ doc["sign_off"] = true
71
+ doc["type"] = "review_page"
72
+ end
63
73
  end
64
74
  end
65
75
  end
@@ -9,6 +9,7 @@ module Ecoportal
9
9
 
10
10
  class_resolver :stages_class, "Ecoportal::API::V2::Pages::Stages"
11
11
  class_resolver :page_class, "Ecoportal::API::V2::Page"
12
+ class_resolver :page_stage_class, "Ecoportal::API::V2::Pages::PageStage"
12
13
  class_resolver :create_page_response_class, "Ecoportal::API::V2::Pages::PageCreateResponse"
13
14
 
14
15
  attr_reader :client
@@ -65,7 +66,7 @@ module Ecoportal
65
66
  def get_new(from)
66
67
  id = get_id(from)
67
68
  response = client.get("/pages/new", params: {template_id: id})
68
- wrapped = Common::Content::WrappedResponse.new(response, page_class)
69
+ wrapped = Common::Content::WrappedResponse.new(response, page_stage_class)
69
70
 
70
71
  return wrapped.result if wrapped.success?
71
72
  raise "Could not get new page from template #{id} - Error #{response.status}: #{response.body}"
@@ -1,5 +1,5 @@
1
1
  module Ecoportal
2
2
  module API
3
- GEM2_VERSION = "0.9.1"
3
+ GEM2_VERSION = "0.9.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecoportal-api-v2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-25 00:00:00.000000000 Z
11
+ date: 2022-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -216,6 +216,7 @@ files:
216
216
  - lib/ecoportal/api/v2/page/component/rich_text_field.rb
217
217
  - lib/ecoportal/api/v2/page/component/selection_field.rb
218
218
  - lib/ecoportal/api/v2/page/component/selection_option.rb
219
+ - lib/ecoportal/api/v2/page/component/selection_options.rb
219
220
  - lib/ecoportal/api/v2/page/component/signature_field.rb
220
221
  - lib/ecoportal/api/v2/page/component/tag_field.rb
221
222
  - lib/ecoportal/api/v2/page/components.rb