ecoportal-api-v2 0.8.9 → 0.8.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5833ea731a9d1360c346264d234ce9f95266db92a5480180a17f413459f196de
4
- data.tar.gz: f3ef175580d2ab47c0ee7f51dc2731c0b42bd27ffa9f59600fb506d5cde38a4b
3
+ metadata.gz: e8961e37170e3ffe06d26c17daa6672a15d595ff91c5e8fb38253549b166057a
4
+ data.tar.gz: c9b25eb42cfa9cb45cee3d830067eddc7d4191fa87f0fd4e35620e346ca27922
5
5
  SHA512:
6
- metadata.gz: 52064ec37a32470e699f846ac1c6c57f8f535fb0be1d689a4f086836a47f9fb2805c0f84533842f5aaa4ee9e538c60e61c1569177ae16a015520c65248347174
7
- data.tar.gz: 0f8cd291558cad37b5157dba7ffdea6670548952b6aa5b0c90b34820abd2693d8f484009265bbc4c8c83fb46684f2968e9a40d4a65563e0ffc6704cca30885d0
6
+ metadata.gz: a68c58f62600b78745caff84d7e0dbda83e2f79cba8d41ca08ffbcf361060bd614fc6957f38878bb09d41dc6db1fcff3e307dd0072d21d960073683e6881fdbc
7
+ data.tar.gz: 998e1409fd0674bc409ab2ff1dcfb68f42a0dd37bca8eab040750cc8cc10ca2651fb98dc61adf3d44b0b0dbdc0bccfe384786cdd79ad1fd9ed96d12a00f3a4b4
data/CHANGELOG.md CHANGED
@@ -1,7 +1,27 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [0.8.9] - 2021-06-xx
4
+ ## [0.8.10] - 2021-08-xx
5
+
6
+ ### Added
7
+ - `Ecoportal::API::Common::Content::CollectionModel#[]` now supports position as well
8
+ - `Ecoportal::API::V2::Page::Component::FilesField#add_file`: support for adding files
9
+ - `Ecoportal::API::V2::Page::Component::PeopleField#viewable_fields`: support for managing `viewable_fields`
10
+
11
+ ### Changed
12
+
13
+ ### Fixed
14
+ - `Ecoportal::API::V2::Page::Component::FilesField`: was not requiring `File`
15
+ - `Ecoportal::API::V2::Page::Component::NumberField#value`: it was missing :/
16
+ - `Ecoportal::API::Common::Content::HashDiffPatch` did not support nested objects in Arrays, where the nested object wouldn't have a `patch_ver`. This **fix** allows for it
17
+ - `Ecoportal::API::Common::Content::DoubleModel.passforced` to define `methods` that should always be present. This allows to define `patch_ver` as a forced `key` in models that have it
18
+ - The enforcement (`self.class.enforce!`) happens on `initialize`
19
+ - `passenforced` subjacent model `forced_model_keys` is inheritable
20
+ - `Ecoportal::API::Common::Content::CollectionModel`:
21
+ - Method `upsert!` was not working fine the parameters `pos`, `before` and `after`
22
+ - Method `delete!` did not support position
23
+
24
+ ## [0.8.9] - 2021-08-16
5
25
 
6
26
  ### Added
7
27
  - `Ecoportal::API::Common::Content::ModelHelpers`
@@ -143,17 +143,21 @@ module Ecoportal
143
143
  end
144
144
 
145
145
  # Get an element usign the `key`.
146
+ # @param value [String, Hash, Ecoportal::API::Common::Content::DoubleModel]
147
+ # @return [Object] the `items_class` element object
146
148
  def [](value)
147
149
  items_by_key[get_key(value)]
148
150
  end
149
151
 
152
+ # @return [Array<Object>] the `items_class` element object
150
153
  def values_at(*keys)
151
154
  keys.map {|key| self[key]}
152
155
  end
153
156
 
154
157
  # Tries to find the element `value`, if it exists, it updates it
155
- # Otherwise it pushes it to the end
156
- # @return the element
158
+ # Otherwise it pushes it to the end
159
+ # @value [Hash, Ecoportal::API::Common::Content::DoubleModel] the eleement to be added
160
+ # @return [Object] the `items_class` element object
157
161
  def upsert!(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
158
162
  unless value.is_a?(Hash) || value.is_a?(Content::DoubleModel)
159
163
  raise "'Content::DoubleModel' or 'Hash' doc required"
@@ -163,7 +167,7 @@ module Ecoportal
163
167
  if item = self[value]
164
168
  item.replace_doc(item_doc)
165
169
  else
166
- _doc_upsert(item_doc, pos: pos, before: before, after: after)
170
+ pos_idx = _doc_upsert(item_doc, pos: pos, before: before, after: after)
167
171
  end
168
172
  (item || self[item_doc]).tap do |item|
169
173
  yield(item) if block_given?
@@ -171,8 +175,12 @@ module Ecoportal
171
175
  end
172
176
 
173
177
  # Deletes `value` from this `CollectionModel` instance
178
+ # @param value [String, Hash, Ecoportal::API::Common::Content::DoubleModel]
179
+ # - When used as `String`, the `key` value (i.e. `id` value) is expected
180
+ # - When used as `Hash`, it should be the `doc` of the target element
181
+ # - When used as `DoubleModel`, it should be the specific object to be deleted
174
182
  def delete!(value)
175
- unless value.is_a?(Hash) || value.is_a?(Content::DoubleModel)
183
+ unless value.is_a?(Hash) || value.is_a?(Content::DoubleModel) || value.is_a?(String)
176
184
  raise "'Content::DoubleModel' or 'Hash' doc required"
177
185
  end
178
186
  if item = self[value]
@@ -199,6 +207,8 @@ module Ecoportal
199
207
  value[items_key]
200
208
  when String
201
209
  value
210
+ when Numeric
211
+ get_key(self.to_a[value])
202
212
  end
203
213
  end
204
214
 
@@ -250,18 +260,11 @@ module Ecoportal
250
260
  end
251
261
 
252
262
  def _doc_upsert(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
253
- current_pos = _doc_key(value)
254
- pos = case
255
- when used_param?(pos)
256
- pos
257
- when used_param?(before)
258
- _doc_key(before)
259
- when used_param?(after)
260
- if i = _doc_key(after)
261
- i + 1
262
- end
263
- end
263
+ current_pos = if elem = self[value]
264
+ _doc_key(elem)
265
+ end
264
266
 
267
+ pos = scope_position(pos: pos, before: before, after: after)
265
268
  pos ||= current_pos
266
269
 
267
270
  if current_pos && pos
@@ -270,7 +273,6 @@ module Ecoportal
270
273
  end
271
274
 
272
275
  pos = (pos && pos < _doc_items.length)? pos : _doc_items.length
273
-
274
276
  pos.tap do |i|
275
277
  _doc_items.insert(pos, value)
276
278
  on_change
@@ -278,6 +280,23 @@ module Ecoportal
278
280
 
279
281
  end
280
282
 
283
+ def scope_position(pos: NOT_USED, before: NOT_USED, after: NOT_USED)
284
+ case
285
+ when used_param?(pos)
286
+ if elem = self[pos]
287
+ _doc_key(elem) - 1
288
+ end
289
+ when used_param?(before)
290
+ if elem = self[before]
291
+ _doc_key(elem) - 1
292
+ end
293
+ when used_param?(after)
294
+ if elem = self[after]
295
+ _doc_key(elem)
296
+ end
297
+ end
298
+ end
299
+
281
300
  end
282
301
  end
283
302
  end
@@ -37,6 +37,8 @@ module Ecoportal
37
37
 
38
38
  # Same as `attr_reader` but links to a subjacent `Hash` model property
39
39
  # @note it does **not** create an _instance variable_
40
+ # @param methods [Array<Symbol>] the method that exposes the value
41
+ # as well as its `key` in the underlying `Hash` model.
40
42
  def pass_reader(*methods)
41
43
  methods.each do |method|
42
44
  method = method.to_s.freeze
@@ -52,6 +54,8 @@ module Ecoportal
52
54
 
53
55
  # Same as `attr_writer` but links to a subjacent `Hash` model property
54
56
  # @note it does **not** create an _instance variable_
57
+ # @param methods [Array<Symbol>] the method that exposes the value
58
+ # as well as its `key` in the underlying `Hash` model.
55
59
  def pass_writer(*methods)
56
60
  methods.each do |method|
57
61
  method = method.to_s.freeze
@@ -70,6 +74,8 @@ module Ecoportal
70
74
  # no chance you can avoid invinite loop for `get_key` without setting an
71
75
  # instance variable key at the moment of the object creation, when the
72
76
  # `doc` is firstly received
77
+ # @param method [Symbol] the method that exposes the value
78
+ # as well as its `key` in the underlying `Hash` model.
73
79
  def passkey(method)
74
80
  method = method.to_s.freeze
75
81
  var = instance_variable_name(method)
@@ -91,7 +97,33 @@ module Ecoportal
91
97
  self
92
98
  end
93
99
 
100
+ # These are methods that should always be present in patch update
101
+ # @note
102
+ # - `DoubleModel` can be used with objects that do not use `patch_ver`
103
+ # - This ensures that does that do, will get the correct patch update model
104
+ # @param method [Symbol] the method that exposes the value
105
+ # as well as its `key` in the underlying `Hash` model.
106
+ # @param default [Value] the default value that
107
+ # this `key` will be written in the model when it doesn't exixt
108
+ def passforced(method, default: , read_only: false)
109
+ model_forced_keys[method.to_s.freeze] = default
110
+ passthrough(method, read_only: read_only)
111
+ end
112
+
113
+ # Ensures `doc` has the `model_forced_keys`. If it doesn't, it adds those missing
114
+ # with the defined `default` values
115
+ def enforce!(doc)
116
+ return unless doc && doc.is_a?(Hash)
117
+ return if model_forced_keys.empty?
118
+ model_forced_keys.each do |key, default|
119
+ doc[key] = default unless doc.key?(key)
120
+ end
121
+ doc
122
+ end
123
+
94
124
  # Same as `attr_accessor` but links to a subjacent `Hash` model property
125
+ # @param methods [Array<Symbol>] the method that exposes the value
126
+ # as well as its `key` in the underlying `Hash` model.
95
127
  # @param read_only [Boolean] should it only define the reader?
96
128
  def passthrough(*methods, read_only: false)
97
129
  pass_reader *methods
@@ -101,6 +133,8 @@ module Ecoportal
101
133
 
102
134
  # To link as a `Time` date to a subjacent `Hash` model property
103
135
  # @see Ecoportal::API::Common::Content::DoubleModel#passthrough
136
+ # @param methods [Array<Symbol>] the method that exposes the value
137
+ # as well as its `key` in the underlying `Hash` model.
104
138
  # @param read_only [Boolean] should it only define the reader?
105
139
  def passdate(*methods, read_only: false)
106
140
  pass_reader(*methods) {|value| to_time(value)}
@@ -111,6 +145,8 @@ module Ecoportal
111
145
  end
112
146
 
113
147
  # To link as a `Boolean` to a subjacent `Hash` model property
148
+ # @param methods [Array<Symbol>] the method that exposes the value
149
+ # as well as its `key` in the underlying `Hash` model.
114
150
  # @param read_only [Boolean] should it only define the reader?
115
151
  def passboolean(*methods, read_only: false)
116
152
  pass_reader(*methods) {|value| value}
@@ -121,6 +157,8 @@ module Ecoportal
121
157
  end
122
158
 
123
159
  # To link as plain `Array` to a subjacent `Hash` model property
160
+ # @param methods [Array<Symbol>] the method that exposes the value
161
+ # as well as its `key` in the underlying `Hash` model.
124
162
  # @param order_matters [Boolean] does the order matter
125
163
  # @param uniq [Boolean] should it contain unique elements
126
164
  def passarray(*methods, order_matters: true, uniq: true)
@@ -142,6 +180,10 @@ module Ecoportal
142
180
  end
143
181
 
144
182
  # Helper to embed one nested object under one property
183
+ # @param method [Symbol] the method that exposes the embeded object
184
+ # @param key [Symbol] the `key` that embeds it to the underlying `Hash` model
185
+ # @nullable [Boolean] to specify if this object can be `nil`
186
+ # @param klass [Class, String] the class of the embedded object
145
187
  def embeds_one(method, key: method, nullable: false, klass:)
146
188
  embed(method, key: key, nullable: nullable, multiple: false, klass: klass)
147
189
  end
@@ -149,7 +191,11 @@ module Ecoportal
149
191
  # @note
150
192
  # - if you have a dedicated `Enumerable` class to manage `many`, you should use `:enum_class`
151
193
  # - otherwise, just indicate the child class in `:klass` and it will auto generate the class
152
- # @param
194
+ # @param method [Symbol] the method that exposes the embeded object
195
+ # @param key [Symbol] the `key` that embeds it to the underlying `Hash` model
196
+ # @param order_matters [Boolean] to state if the order will matter
197
+ # @param klass [Class, String] the class of the individual elements it embeds
198
+ # @param enum_class [Class, String] the class of the collection that will hold the individual elements
153
199
  def embeds_many(method, key: method, order_matters: false, order_key: nil, klass: nil, enum_class: nil)
154
200
  if enum_class
155
201
  eclass = enum_class
@@ -186,8 +232,15 @@ module Ecoportal
186
232
  end
187
233
  end
188
234
 
235
+ # The list of keys that will be forced in the model
236
+ def model_forced_keys
237
+ @forced_model_keys ||= {}
238
+ end
239
+
189
240
  end
190
241
 
242
+ inheritable_class_vars :forced_model_keys
243
+
191
244
  attr_reader :_parent, :_key
192
245
 
193
246
  def initialize(doc = {}, parent: self, key: nil)
@@ -195,6 +248,8 @@ module Ecoportal
195
248
  @_parent = parent || self
196
249
  @_key = key || self
197
250
 
251
+ self.class.enforce!(doc)
252
+
198
253
  if _parent == self
199
254
  @doc = doc
200
255
  @original_doc = JSON.parse(@doc.to_json)
@@ -211,11 +266,13 @@ module Ecoportal
211
266
  _parent.root
212
267
  end
213
268
 
269
+ # @return [String] the `value` of the `key` method (i.e. `id` value)
214
270
  def key
215
271
  raise "No key_method defined for #{self.class}" unless key_method?
216
272
  self.method(key_method).call
217
273
  end
218
274
 
275
+ # @param [String] the `value` of the `key` method (i.e. `id` value)
219
276
  def key=(value)
220
277
  raise "No key_method defined for #{self.class}" unless key_method?
221
278
  method = "#{key_method}="
@@ -234,16 +291,25 @@ module Ecoportal
234
291
  end
235
292
  end
236
293
 
294
+ # @return [nil, Hash] the underlying `Hash` model as is (carrying current changes)
237
295
  def doc
238
296
  raise UnlinkedModel.new(from: "#{self.class}#doc", key: _key) unless linked?
239
- return @doc if is_root?
240
- _parent.doc.dig(*[_doc_key(_key)].flatten)
297
+ if is_root?
298
+ @doc
299
+ else
300
+ _parent.doc.dig(*[_doc_key(_key)].flatten)
301
+ end
241
302
  end
242
303
 
304
+ # The `original_doc` holds the model as is now on server-side.
305
+ # @return [nil, Hash] the underlying `Hash` model as after last `consolidate!` changes
243
306
  def original_doc
244
307
  raise UnlinkedModel.new(from: "#{self.class}#original_doc", key: _key) unless linked?
245
- return @original_doc if is_root?
246
- _parent.original_doc.dig(*[_doc_key(_key)].flatten)
308
+ if is_root?
309
+ @original_doc
310
+ else
311
+ _parent.original_doc.dig(*[_doc_key(_key)].flatten)
312
+ end
247
313
  end
248
314
 
249
315
  def as_json
@@ -254,19 +320,31 @@ module Ecoportal
254
320
  doc.to_json(*args)
255
321
  end
256
322
 
323
+ # @return [nil, Hash] the patch `Hash` model including only the changes between
324
+ # `original_doc` and `doc`
257
325
  def as_update
258
326
  new_doc = as_json
259
327
  Common::Content::HashDiffPatch.patch_diff(new_doc, original_doc)
260
328
  end
261
329
 
330
+ # @return [Boolean] stating if there are changes
262
331
  def dirty?
263
332
  as_update != {}
264
333
  end
265
334
 
335
+ # It makes `original_doc` to be like `doc`
336
+ # @note
337
+ # - after executing it, there will be no pending changes
338
+ # - you should technically run this command, after a successful update request to the server
266
339
  def consolidate!
267
340
  replace_original_doc(JSON.parse(doc.to_json))
268
341
  end
269
342
 
343
+ # It makes `doc` to be like `original`
344
+ # @note
345
+ # - after executing it, changes in `doc` will be lost
346
+ # - you should technically run this command only if you want to remove certain changes
347
+ # @key [Symbol] the specific part of the model you want to `reset`
270
348
  def reset!(key = nil)
271
349
  if key
272
350
  keys = [key].flatten.compact
@@ -60,6 +60,8 @@ module Ecoportal
60
60
  a == b
61
61
  end
62
62
 
63
+ # Compares `a` as charring changes of `b`
64
+ # @return [Hash] patch data object with only changes
63
65
  def patch_data(a, b = nil, delete: false)
64
66
  {}.tap do |data_hash|
65
67
  if delete
@@ -75,11 +77,17 @@ module Ecoportal
75
77
  data_hash[key] = patch_diff(a_value, b_value)
76
78
  data_hash.delete(key) if data_hash[key] == NO_CHANGES
77
79
  end
80
+ #if (data_hash.keys - ID_KEYS).empty?
78
81
  if (data_hash.keys - META_KEYS).empty?
79
82
  return NO_CHANGES
80
83
  else
81
- patch_ver = (b && b["patch_ver"]) || 1
82
- data_hash["patch_ver"] = patch_ver
84
+ #patch_ver = (b && b["patch_ver"]) || 1
85
+ #data_hash["patch_ver"] = patch_ver
86
+ if b && b.key?("patch_ver")
87
+ data_hash["patch_ver"] = b["patch_ver"]
88
+ elsif a && a.key?("patch_ver")
89
+ data_hash["patch_ver"] = a["patch_ver"]
90
+ end
83
91
  end
84
92
  end
85
93
  end
@@ -172,7 +180,9 @@ module Ecoportal
172
180
  arr.any? {|a| nested_array?(a)}
173
181
  when arr.length == 1
174
182
  arr = arr.first
175
- arr.any? {|item| item.is_a?(Hash)}
183
+ arr.any? do |item|
184
+ item.is_a?(Hash) && item.has_key?("patch_ver")
185
+ end
176
186
  else
177
187
  false
178
188
  end
@@ -2,9 +2,19 @@ module Ecoportal
2
2
  module API
3
3
  class V2
4
4
  class Page < Common::Content::DoubleModel
5
- ALLOWED_KEYS = %w[id patch_ver name template_id base_tags tags time_zone created_at updated_at can components sections stages]
5
+ ALLOWED_KEYS = [
6
+ "id", "patch_ver", "name", "template_id",
7
+ "base_tags", "tags",
8
+ "time_zone", "created_at", "updated_at",
9
+ "components", "sections", "stages",
10
+ "permits", "mould_counter", "mould",
11
+ "state", "task_priority",
12
+ "votes_enabled", "upvotes", "downvotes",
13
+ "force_errors", "subtags"
14
+ ]
15
+
6
16
  passkey :id
7
- passthrough :patch_ver
17
+ passforced :patch_ver, default: 1
8
18
  passthrough :name, :template_id
9
19
  passarray :base_tags, :tags, order_matters: false
10
20
  passthrough :time_zone
@@ -25,6 +35,7 @@ module Ecoportal
25
35
  hash["data"].select! do |key, value|
26
36
  ALLOWED_KEYS.include?(key)
27
37
  end
38
+ return nil if (hash["data"].keys - ["patch_ver"]).empty?
28
39
  end
29
40
  end
30
41
  end
@@ -26,13 +26,16 @@ module Ecoportal
26
26
 
27
27
  class << self
28
28
  def new_doc(type: nil)
29
- if type
30
- type_doc = {"type" => type}
31
- base_doc = get_class(type_doc)&.new_doc || {}
32
- base_doc.merge!(type_doc)
29
+ {
30
+ "id" => new_uuid
31
+ }.tap do |base_doc|
32
+ if type
33
+ base_doc.merge!({"type" => type})
34
+ if klass = get_class(base_doc)
35
+ base_doc.merge!(klass.new_doc || {})
36
+ end
37
+ end
33
38
  end
34
- return base_doc if base_doc&.key?("id")
35
- (base_doc || {}).merge("id" => new_uuid)
36
39
  end
37
40
 
38
41
  def get_class(doc)
@@ -82,7 +85,8 @@ module Ecoportal
82
85
  end
83
86
 
84
87
  passkey :id
85
- passthrough :patch_ver, :undeletable
88
+ passforced :patch_ver, default: 1
89
+ passboolean :undeletable
86
90
  passthrough :type, :label, :tooltip, :global_binding
87
91
  passboolean :hidden, :deindex, :required
88
92
  passthrough :accent
@@ -7,14 +7,15 @@ module Ecoportal
7
7
  class << self
8
8
  def new_doc
9
9
  {
10
- "id" => new_uuid,
11
- "weight" => 9999
10
+ "id" => new_uuid,
11
+ "weight" => 9999
12
12
  }
13
13
  end
14
14
  end
15
15
 
16
16
  passkey :id
17
- passthrough :patch_ver, :name
17
+ passforced :patch_ver, default: 1
18
+ passthrough :name
18
19
  passthrough :weight, :other_information
19
20
  passboolean :complete
20
21
 
@@ -11,9 +11,9 @@ module Ecoportal
11
11
  {"id" => new_uuid}
12
12
  end
13
13
  end
14
-
14
+
15
15
  passkey :id
16
- passthrough :patch_ver
16
+ passforced :patch_ver, default: 1
17
17
  end
18
18
  end
19
19
  end
@@ -8,14 +8,15 @@ module Ecoportal
8
8
  class << self
9
9
  def new_doc
10
10
  {
11
- "id" => new_uuid,
12
- "weight" => 9999
11
+ "id" => new_uuid,
12
+ "weight" => 9999
13
13
  }
14
14
  end
15
15
  end
16
16
 
17
17
  passkey :id
18
- passthrough :patch_ver, :label
18
+ passforced :patch_ver, default: 1
19
+ passthrough :label
19
20
  passthrough :weight
20
21
  passboolean :checked
21
22
  end
@@ -4,10 +4,20 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class File < Common::Content::DoubleModel
7
+ class << self
8
+ def new_doc
9
+ {
10
+ "id" => new_uuid,
11
+ "position" => 9999
12
+ }
13
+ end
14
+ end
15
+
7
16
  passkey :id
8
- passthrough :patch_ver, :position
9
- passthrough :file_size, :token, read_only: true
10
- passthrough :content_type, :file_container_id
17
+ passforced :patch_ver, default: 1
18
+ passthrough :position
19
+ passthrough :file_size, :content_type, :token, read_only: true
20
+ passthrough :file_container_id
11
21
  passdate :file_update_at, read_only: true
12
22
  end
13
23
  end
@@ -4,10 +4,46 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class FilesField < Page::Component
7
- embeds_many :items, klass: "Ecoportal::API::V2::Page::File", order_key: :position
7
+ embeds_many :items, klass: "Ecoportal::API::V2::Page::Component::File", order_key: :position
8
+
9
+ def add_file(container_id, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
10
+ file_doc = items.items_class.new_doc
11
+ items.upsert!(file_doc, pos: pos, before: before, after: after) do |file|
12
+ file.file_container_id = container_id
13
+ if prev = previous_file(file)
14
+ file.position = prev.position
15
+ end
16
+ yield(file) if block_given?
17
+ fix_file_positions!
18
+ end
19
+ end
20
+
21
+ def ordered_files
22
+ items.each_with_index.sort_by do |file, index|
23
+ (file.position >= 9999) ? [index, index] : [file.position, index]
24
+ end.map(&:first)
25
+ end
26
+
27
+ private
28
+
29
+ def fix_file_positions!
30
+ ordered_files.each_with_index do |file, index|
31
+ file.position = index
32
+ end
33
+ end
34
+
35
+ def previous_file(value)
36
+ fls = ordered_files
37
+ pos = fls.index(value) - 1
38
+ return if pos < 0
39
+ fls[pos]
40
+ end
41
+
8
42
  end
9
43
  end
10
44
  end
11
45
  end
12
46
  end
13
47
  end
48
+
49
+ require 'ecoportal/api/v2/page/component/file'
@@ -8,16 +8,16 @@ module Ecoportal
8
8
  class << self
9
9
  def new_doc
10
10
  {
11
- "id" => new_uuid,
12
- "threshold" => nil,
13
- "color" => nil
11
+ "id" => new_uuid,
12
+ "threshold" => nil,
13
+ "color" => nil
14
14
  }
15
15
  end
16
16
  end
17
17
 
18
18
  passkey :id
19
- passthrough :patch_ver, :threshold
20
- passthrough :color
19
+ passforced :patch_ver, default: 1
20
+ passthrough :threshold, :color
21
21
 
22
22
  # Assign the color to the stop.
23
23
  # @note These are the available colors:
@@ -5,7 +5,8 @@ module Ecoportal
5
5
  class Component
6
6
  class Image < Common::Content::DoubleModel
7
7
  passkey :id
8
- passthrough :patch_ver, :weight
8
+ passforced :patch_ver, default: 1
9
+ passthrough :weight
9
10
  passthrough :height, :width, :caption
10
11
  passthrough :dimensions, :styles
11
12
  end
@@ -4,6 +4,7 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class NumberField < Page::Component
7
+ passthrough :value
7
8
  end
8
9
  end
9
10
  end
@@ -7,7 +7,7 @@ module Ecoportal
7
7
  passboolean :is_me_button
8
8
  passthrough :attach_mode
9
9
  passthrough :person_schema_id
10
- pass_reader :viewable_fields
10
+ embeds_many :viewable_fields, klass: "Ecoportal::API::V2::Page::Component::PeopleViewableField"
11
11
 
12
12
  passboolean :singular
13
13
  passthrough :requires_number
@@ -30,6 +30,16 @@ module Ecoportal
30
30
  people_ids.reject! {|id| ids.include?(id)}
31
31
  end
32
32
 
33
+ # Adds a field to the `viewable_fields`
34
+ def add_viewable(field_id, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
35
+ viewable_fields.upsert!({"id" => field_id}, pos: pos, before: before, after: after)
36
+ end
37
+
38
+ # Deletes a field from the `viewable_fields`
39
+ def delete_viewable(field_id)
40
+ viewable_fields.delete!(field_id)
41
+ end
42
+
33
43
  # Quick config helper
34
44
  # @param conf [Symbol, Array<Symbol>]
35
45
  # - `:snapshot` to set mode to `snapshot`
@@ -64,7 +74,7 @@ module Ecoportal
64
74
  unless (rest = hash_except(cnf.dup, *supported)).empty?
65
75
  unused.push(rest)
66
76
  end
67
-
77
+
68
78
  if cnf.key?(:singular) then self.singular = !!cnf[:singular] end
69
79
  if cnf.key?(:permits)
70
80
  if permits = cnf[:permits]
@@ -121,3 +131,5 @@ module Ecoportal
121
131
  end
122
132
  end
123
133
  end
134
+
135
+ require 'ecoportal/api/v2/page/component/people_viewable_field'
@@ -0,0 +1,14 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Component
6
+ class PeopleViewableField < Common::Content::DoubleModel
7
+ passkey :id
8
+ passthrough :type, read_only: true
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,14 +8,15 @@ module Ecoportal
8
8
  class << self
9
9
  def new_doc
10
10
  {
11
- "id" => new_uuid,
12
- "weight" => 9999
11
+ "id" => new_uuid,
12
+ "weight" => 9999
13
13
  }
14
14
  end
15
15
  end
16
16
 
17
17
  passkey :id
18
- passthrough :patch_ver, :name, :value
18
+ passforced :patch_ver, default: 1
19
+ passthrough :name, :value
19
20
  passthrough :weight
20
21
  passboolean :selected
21
22
 
@@ -13,8 +13,9 @@ module Ecoportal
13
13
  end
14
14
  end
15
15
 
16
- passthrough :signed_by_id, :signed_by_name, :signature_url
17
- passdate :signature_updated_at
16
+ passthrough :signed_by_id, :signed_by_name, read_only: true
17
+ passthrough :signature_url, read_only: true
18
+ passdate :signature_updated_at, read_only: true
18
19
  passthrough :signature_content, :color
19
20
 
20
21
  end
@@ -4,9 +4,10 @@ module Ecoportal
4
4
  class Page
5
5
  class Permit < Common::Content::DoubleModel
6
6
  passkey :id
7
- passthrough :patch_ver
7
+ passforced :patch_ver, default: 1
8
8
  passthrough :user_id, :user_name
9
9
  passthrough :editable, :flags
10
+ embeds_one :flags, klass: "Ecoportal::API::V2::Page::PermissionFlags"
10
11
  end
11
12
  end
12
13
  end
@@ -6,9 +6,9 @@ module Ecoportal
6
6
  class << self
7
7
  def new_doc(split: false)
8
8
  {
9
- "id" => new_uuid,
10
- "type" => split ? "split" : "content",
11
- "weight" => 800
9
+ "id" => new_uuid,
10
+ "type" => split ? "split" : "content",
11
+ "weight" => 800
12
12
  }.tap do |out|
13
13
  component_ids = if split
14
14
  {
@@ -26,10 +26,11 @@ module Ecoportal
26
26
  end
27
27
 
28
28
  passkey :id
29
- passthrough :patch_ver, :weight, :type
29
+ passforced :patch_ver, default: 1
30
+ passthrough :weight, :type
30
31
  passthrough :heading, :left_heading, :right_heading
31
32
  passarray :component_ids, :left_component_ids, :right_component_ids
32
- passthrough :minimized
33
+ passboolean :minimized
33
34
 
34
35
  def split?
35
36
  doc && doc["type"] == "split"
@@ -4,7 +4,7 @@ module Ecoportal
4
4
  class Page
5
5
  class Stage < Common::Content::DoubleModel
6
6
  passkey :id
7
- passthrough :patch_ver
7
+ passforced :patch_ver, default: 1
8
8
  passthrough :name, :ordering
9
9
  passarray :subtags, order_matters: false
10
10
  passarray :section_ids
@@ -1,5 +1,5 @@
1
1
  module Ecoportal
2
2
  module API
3
- GEM2_VERSION = "0.8.9"
3
+ GEM2_VERSION = "0.8.10"
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.8.9
4
+ version: 0.8.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-16 00:00:00.000000000 Z
11
+ date: 2021-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -209,6 +209,7 @@ files:
209
209
  - lib/ecoportal/api/v2/page/component/law_field.rb
210
210
  - lib/ecoportal/api/v2/page/component/number_field.rb
211
211
  - lib/ecoportal/api/v2/page/component/people_field.rb
212
+ - lib/ecoportal/api/v2/page/component/people_viewable_field.rb
212
213
  - lib/ecoportal/api/v2/page/component/plain_text_field.rb
213
214
  - lib/ecoportal/api/v2/page/component/reference_field.rb
214
215
  - lib/ecoportal/api/v2/page/component/rich_text_field.rb