admin_module 0.1.4

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 (141) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +14 -0
  5. data/Guardfile +24 -0
  6. data/LICENSE +22 -0
  7. data/README.md +281 -0
  8. data/Rakefile +98 -0
  9. data/admin_module.gemspec +34 -0
  10. data/bin/admin_module +13 -0
  11. data/lib/admin_module.rb +260 -0
  12. data/lib/admin_module/cli.rb +54 -0
  13. data/lib/admin_module/cli/cli_guideline.rb +80 -0
  14. data/lib/admin_module/cli/cli_lock.rb +149 -0
  15. data/lib/admin_module/cli/cli_parameter.rb +66 -0
  16. data/lib/admin_module/cli/cli_task.rb +149 -0
  17. data/lib/admin_module/cli_old.rb +92 -0
  18. data/lib/admin_module/client.rb +146 -0
  19. data/lib/admin_module/command.rb +25 -0
  20. data/lib/admin_module/command/client_access.rb +43 -0
  21. data/lib/admin_module/command/config.rb +310 -0
  22. data/lib/admin_module/command/dc.rb +110 -0
  23. data/lib/admin_module/command/gdl.rb +71 -0
  24. data/lib/admin_module/command/lock.rb +110 -0
  25. data/lib/admin_module/command/ppm.rb +142 -0
  26. data/lib/admin_module/command/rule.rb +77 -0
  27. data/lib/admin_module/command/ruleset.rb +56 -0
  28. data/lib/admin_module/command/snapshot.rb +110 -0
  29. data/lib/admin_module/command/stage.rb +131 -0
  30. data/lib/admin_module/command/task.rb +110 -0
  31. data/lib/admin_module/config_helper.rb +33 -0
  32. data/lib/admin_module/dc.rb +133 -0
  33. data/lib/admin_module/guideline.rb +86 -0
  34. data/lib/admin_module/locks.rb +142 -0
  35. data/lib/admin_module/page_factory.rb +55 -0
  36. data/lib/admin_module/pages.rb +120 -0
  37. data/lib/admin_module/pages/dc_definitions_page.rb +73 -0
  38. data/lib/admin_module/pages/dc_detail_page.rb +187 -0
  39. data/lib/admin_module/pages/guideline_page.rb +35 -0
  40. data/lib/admin_module/pages/guideline_version_page.rb +140 -0
  41. data/lib/admin_module/pages/guidelines_page.rb +59 -0
  42. data/lib/admin_module/pages/guidelines_version_all_page.rb +116 -0
  43. data/lib/admin_module/pages/lock_definition_page.rb +178 -0
  44. data/lib/admin_module/pages/lock_definitions_page.rb +69 -0
  45. data/lib/admin_module/pages/login_page.rb +75 -0
  46. data/lib/admin_module/pages/parameter_page.rb +62 -0
  47. data/lib/admin_module/pages/parameters_page.rb +46 -0
  48. data/lib/admin_module/pages/ppms_page.rb +110 -0
  49. data/lib/admin_module/pages/rule_page.rb +68 -0
  50. data/lib/admin_module/pages/rules_page.rb +74 -0
  51. data/lib/admin_module/pages/ruleset_page.rb +64 -0
  52. data/lib/admin_module/pages/rulesets_page.rb +60 -0
  53. data/lib/admin_module/pages/select_list_syncable.rb +64 -0
  54. data/lib/admin_module/pages/snapshot_definitions_page.rb +73 -0
  55. data/lib/admin_module/pages/snapshot_detail_page.rb +246 -0
  56. data/lib/admin_module/pages/workflow_detail_page.rb +451 -0
  57. data/lib/admin_module/pages/workflow_detail_task_addl_detail_page.rb +172 -0
  58. data/lib/admin_module/pages/workflow_detail_task_mappings_page.rb +163 -0
  59. data/lib/admin_module/pages/workflow_detail_task_screens_page.rb +75 -0
  60. data/lib/admin_module/pages/workflow_details_page.rb +67 -0
  61. data/lib/admin_module/pages/workflow_task_page.rb +107 -0
  62. data/lib/admin_module/pages/workflow_tasks_page.rb +111 -0
  63. data/lib/admin_module/ppms.rb +78 -0
  64. data/lib/admin_module/rake.rb +22 -0
  65. data/lib/admin_module/rake/dc_tasks.rb +185 -0
  66. data/lib/admin_module/rake/deploy_task.rb +59 -0
  67. data/lib/admin_module/rake/gdl_tasks.rb +189 -0
  68. data/lib/admin_module/rake/lock_tasks.rb +189 -0
  69. data/lib/admin_module/rake/parameter_task.rb +86 -0
  70. data/lib/admin_module/rake/ppm_tasks.rb +248 -0
  71. data/lib/admin_module/rake/rule_tasks.rb +157 -0
  72. data/lib/admin_module/rake/snapshot_tasks.rb +223 -0
  73. data/lib/admin_module/rake/stage_tasks.rb +197 -0
  74. data/lib/admin_module/rake/stages_task.rb +197 -0
  75. data/lib/admin_module/rake/task_tasks.rb +189 -0
  76. data/lib/admin_module/rules.rb +50 -0
  77. data/lib/admin_module/rulesets.rb +42 -0
  78. data/lib/admin_module/snapshots.rb +133 -0
  79. data/lib/admin_module/stages.rb +171 -0
  80. data/lib/admin_module/tasks.rb +147 -0
  81. data/lib/admin_module/version.rb +3 -0
  82. data/old_spec/lib/admin_module/cli_configuration_spec.rb +126 -0
  83. data/old_spec/lib/admin_module/cli_create_stage_spec.rb +89 -0
  84. data/old_spec/lib/admin_module/cli_delete_rule_spec.rb +57 -0
  85. data/old_spec/lib/admin_module/cli_deploy_spec.rb +57 -0
  86. data/old_spec/lib/admin_module/cli_export_locks_spec.rb +62 -0
  87. data/old_spec/lib/admin_module/cli_export_stages_spec.rb +62 -0
  88. data/old_spec/lib/admin_module/cli_guidelines_version_all_spec.rb +58 -0
  89. data/old_spec/lib/admin_module/cli_import_locks_spec.rb +153 -0
  90. data/old_spec/lib/admin_module/cli_import_stages_spec.rb +173 -0
  91. data/old_spec/lib/admin_module/cli_modify_locks_spec.rb +128 -0
  92. data/old_spec/lib/admin_module/cli_modify_stages_spec.rb +88 -0
  93. data/old_spec/lib/admin_module/cli_rename_rule_spec.rb +53 -0
  94. data/old_spec/lib/admin_module/cli_rename_ruleset_spec.rb +53 -0
  95. data/old_spec/lib/admin_module/cli_var_spec.rb +41 -0
  96. data/old_spec/lib/admin_module/rake/deploy_task_spec.rb +85 -0
  97. data/old_spec/lib/admin_module/rake/parameter_task_spec.rb +58 -0
  98. data/old_spec/lib/admin_module/rake/rules_task_spec.rb +75 -0
  99. data/spec/data/build/test1.xml +0 -0
  100. data/spec/data/build/test2.xml +1 -0
  101. data/spec/data/import_dcs.yml +31 -0
  102. data/spec/data/import_locks.yml +4 -0
  103. data/spec/data/import_snapshots.yml +35 -0
  104. data/spec/data/import_stages.yml +4 -0
  105. data/spec/data/import_tasks.yml +25 -0
  106. data/spec/data/patch-test.xml +1 -0
  107. data/spec/data/remove_test_del_rule.xml +1 -0
  108. data/spec/data/stages.yml +518 -0
  109. data/spec/data/test_del_rule.xml +1 -0
  110. data/spec/lib/admin_module/admin_module_spec.rb +175 -0
  111. data/spec/lib/admin_module/cli_spec.rb +36 -0
  112. data/spec/lib/admin_module/client_spec.rb +158 -0
  113. data/spec/lib/admin_module/command/config_spec.rb +477 -0
  114. data/spec/lib/admin_module/command/dc_spec.rb +202 -0
  115. data/spec/lib/admin_module/command/gdl_spec.rb +139 -0
  116. data/spec/lib/admin_module/command/lock_spec.rb +207 -0
  117. data/spec/lib/admin_module/command/rule_spec.rb +163 -0
  118. data/spec/lib/admin_module/command/ruleset_spec.rb +124 -0
  119. data/spec/lib/admin_module/command/snapshot_spec.rb +202 -0
  120. data/spec/lib/admin_module/command/stage_spec.rb +259 -0
  121. data/spec/lib/admin_module/command/task_spec.rb +207 -0
  122. data/spec/lib/admin_module/dc_spec.rb +192 -0
  123. data/spec/lib/admin_module/guideline_spec.rb +177 -0
  124. data/spec/lib/admin_module/locks_spec.rb +188 -0
  125. data/spec/lib/admin_module/rules_spec.rb +110 -0
  126. data/spec/lib/admin_module/rulesets_spec.rb +85 -0
  127. data/spec/lib/admin_module/snapshot_spec.rb +192 -0
  128. data/spec/lib/admin_module/stages_spec.rb +179 -0
  129. data/spec/lib/admin_module/tasks_spec.rb +196 -0
  130. data/spec/spec_helper.rb +54 -0
  131. data/spec/support/asserts.rb +13 -0
  132. data/spec/support/data_clearing.rb +28 -0
  133. data/spec/support/dirs.rb +54 -0
  134. data/spec/support/helpers.rb +83 -0
  135. data/spec/support/lock.rb +23 -0
  136. data/spec/support/mocks.rb +213 -0
  137. data/spec/support/snapshot.rb +28 -0
  138. data/spec/support/stage.rb +22 -0
  139. data/spec/support/stage_factory.rb +138 -0
  140. data/spec/support/task.rb +23 -0
  141. metadata +381 -0
@@ -0,0 +1,451 @@
1
+ ##############################################################################
2
+ # File:: workflow_detail_page.rb
3
+ # Purpose:: Stage detail page for AdminModule
4
+ #
5
+ # Author:: Jeff McAffee 2013-12-12
6
+ #
7
+ ##############################################################################
8
+ require 'page-object'
9
+ require 'nokogiri'
10
+
11
+ module AdminModule::Pages
12
+
13
+ class WorkflowDetailPage
14
+ include PageObject
15
+
16
+ #page_url(:get_dynamic_url)
17
+
18
+ def get_dynamic_url
19
+ AdminModule.configuration.url(WorkflowDetailPage)
20
+ end
21
+
22
+ # Tabs
23
+
24
+ link(:details_tab,
25
+ text: 'Details')
26
+
27
+ link(:transition_reasons_tab,
28
+ text: 'Transition Reasons')
29
+
30
+ link(:transition_to_states_tab,
31
+ text: 'Transition To States')
32
+
33
+ link(:groups_tab,
34
+ text: 'Groups')
35
+
36
+ link(:tasks_tab,
37
+ text: 'Tasks')
38
+
39
+ link(:workflow_events_tab,
40
+ text: 'Workflow Events')
41
+
42
+ link(:data_clearing_definitions_tab,
43
+ text: 'Data Clearing Definitions')
44
+
45
+ # Controls
46
+
47
+ # Details Tab
48
+
49
+ text_field( :name,
50
+ id: 'ctl00_cntPlh_txtStateName')
51
+
52
+ # Transition To States Tab
53
+
54
+ select_list(:available_states,
55
+ id: 'ctl00_cntPlh_tsStates_lstAvailable')
56
+
57
+ select_list(:selected_states,
58
+ id: 'ctl00_cntPlh_tsStates_lstSelected')
59
+
60
+ button(:add_state_button,
61
+ id: 'ctl00_cntPlh_tsStates_btnAdd')
62
+
63
+ button(:add_all_states_button,
64
+ id: 'ctl00_cntPlh_tsStates_btnAddAll')
65
+
66
+ button(:remove_state_button,
67
+ id: 'ctl00_cntPlh_tsStates_btnRemove')
68
+
69
+ button(:remove_all_states_button,
70
+ id: 'ctl00_cntPlh_tsStates_btnRemoveAll')
71
+
72
+ # Groups Tab
73
+
74
+ select_list(:available_groups,
75
+ id: 'ctl00_cntPlh_tsGroups_lstAvailable')
76
+
77
+ select_list(:selected_groups,
78
+ id: 'ctl00_cntPlh_tsGroups_lstSelected')
79
+
80
+ button(:add_group_button,
81
+ id: 'ctl00_cntPlh_tsGroups_btnAdd')
82
+
83
+ button(:add_all_groups_button,
84
+ id: 'ctl00_cntPlh_tsGroups_btnAddAll')
85
+
86
+ button(:remove_group_button,
87
+ id: 'ctl00_cntPlh_tsGroups_btnRemove')
88
+
89
+ button(:remove_all_groups_button,
90
+ id: 'ctl00_cntPlh_tsGroups_btnRemoveAll')
91
+
92
+ # Tasks Tab
93
+
94
+ select_list(:available_tasks,
95
+ id: 'ctl00_cntPlh_tsTasks_lstAvailable')
96
+
97
+ select_list(:selected_tasks,
98
+ id: 'ctl00_cntPlh_tsTasks_lstSelected')
99
+
100
+ button(:add_task_button,
101
+ id: 'ctl00_cntPlh_tsTasks_btnAdd')
102
+
103
+ button(:add_all_task_button,
104
+ id: 'ctl00_cntPlh_tsTasks_btnAddAll')
105
+
106
+ button(:remove_task_button,
107
+ id: 'ctl00_cntPlh_tsTasks_btnRemove')
108
+
109
+ button(:remove_all_tasks_button,
110
+ id: 'ctl00_cntPlh_tsTasks_btnRemoveAll')
111
+
112
+ button(:additional_details_button,
113
+ text: 'Manage Addl Details')
114
+
115
+ button(:screen_mappings_button,
116
+ text: 'Manage Screen Mappings')
117
+
118
+ button(:version_button,
119
+ text: 'Version')
120
+
121
+ # Data Clearing Definitions Tab
122
+
123
+ select_list(:data_clearing_definition,
124
+ id: 'ctl00_cntPlh_ddlDataClearing')
125
+
126
+ text_field( :data_clearing_days,
127
+ id: 'ctl00_cntPlh_txtDays')
128
+
129
+ select_list(:data_clearing_days_type,
130
+ id: 'ctl00_cntPlh_ddlDays')
131
+
132
+ button(:version_dc_button,
133
+ id: 'ctl00_cntPlh_btnDataVersion')
134
+
135
+ # Errors Span
136
+
137
+ span(:errors_span,
138
+ id: 'ctl00_cntPlh_ctlErrors_lblError')
139
+
140
+ # Save/Cancel buttons
141
+ button(:save_button,
142
+ id: 'ctl00_cntPlh_btnSave')
143
+
144
+ button(:cancel_button,
145
+ id: 'ctl00_cntPlh_btnCancel')
146
+
147
+
148
+ def get_stage_data
149
+ stage_data = {}
150
+
151
+ self.details_tab
152
+ stage_data[:name] = self.name
153
+
154
+ self.transition_to_states_tab
155
+ stage_data[:transition_to] = get_selected_state_options
156
+
157
+ self.groups_tab
158
+ stage_data[:groups] = get_selected_group_options
159
+
160
+ stage_data[:tasks] = get_tasks
161
+
162
+ self.workflow_events_tab
163
+ stage_data[:events] = capture_events
164
+
165
+ self.data_clearing_definitions_tab
166
+ stage_data[:dc] = Hash.new
167
+ stage_data[:dc][:definition] = self.data_clearing_definition
168
+ stage_data[:dc][:days] = self.data_clearing_days
169
+ stage_data[:dc][:days_type] = self.data_clearing_days_type
170
+
171
+ stage_data
172
+ end
173
+
174
+
175
+ class WorkflowEvent
176
+ attr_reader :guideline
177
+ attr_reader :event
178
+ attr_reader :id
179
+
180
+ def initialize(cells)
181
+ @event = cells[0].text.strip
182
+ @guideline = get_selected_option(cells[1].css('select'))
183
+ @id = cells[1].css('select').attribute('id').value
184
+ end
185
+
186
+ def get_selected_option elem
187
+ elem.children.each do |c|
188
+ if c.attributes.has_key? 'selected'
189
+ return c.text
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+
196
+ def workflow_events
197
+ events = []
198
+
199
+ Nokogiri::HTML(@browser.html).css("table#ctl00_cntPlh_DatagridEvents").each do |tbl|
200
+ rows = tbl.css('tr')
201
+ rows.each do |r|
202
+ next if r.attribute('class').value == 'GridHeader'
203
+ cells = r.css('td')
204
+
205
+ events << WorkflowEvent.new(cells)
206
+ end # ech row
207
+ end # nokogiri
208
+
209
+ events
210
+ end
211
+
212
+ def capture_events
213
+ captured_events = {}
214
+
215
+ workflow_events.each do |ev|
216
+ captured_events[ev.event] = ev.guideline
217
+ end
218
+
219
+ captured_events
220
+ end
221
+
222
+ def set_stage_data data
223
+ # Set tasks first - Save button on Addl Details and/or Version button
224
+ # causes a refresh which discards changes made in other tabs.
225
+ set_tasks data[:tasks] if data.key?(:tasks)
226
+
227
+ # Version button on DC tab may cause a refresh which discards changes
228
+ # made in other tabs.
229
+ set_data_clearing data[:dc] if data.key?(:dc)
230
+
231
+ set_name data[:name] if data.key?(:name)
232
+
233
+ set_transitions data[:transition_to] if data.key?(:transition_to)
234
+
235
+ set_groups data[:groups] if data.key?(:groups)
236
+
237
+ set_events data[:events] if data.key?(:events)
238
+
239
+ self
240
+ end
241
+
242
+ def save
243
+ self.save_button
244
+ end
245
+
246
+ def set_name name
247
+ self.details_tab
248
+ self.name = name
249
+
250
+ self
251
+ end
252
+
253
+ def set_transitions trans
254
+ self.transition_to_states_tab
255
+ set_transition_states trans
256
+
257
+ self
258
+ end
259
+
260
+ def set_groups groups
261
+ self.groups_tab
262
+ set_group_data groups
263
+
264
+ self
265
+ end
266
+
267
+ def get_tasks
268
+ self.tasks_tab
269
+
270
+ tasks = Array.new
271
+ selected_tasks_options.each do |task_name|
272
+ tasks << { name: task_name }
273
+ end
274
+
275
+ # Open the Addl Details page and update the settings
276
+ self.additional_details_button
277
+ addtl_page = WorkflowDetailTaskAddlDetailPage.new(@browser, false)
278
+
279
+ addl_data = addtl_page.get_data
280
+ addtl_page.cancel
281
+
282
+ # Merge addl detail data
283
+ tasks.collect! do |task|
284
+ task[:sequence] = addl_data[task[:name]][:sequence]
285
+ task[:predecessors] = addl_data[task[:name]][:predecessors]
286
+ task[:regenerate] = addl_data[task[:name]][:regenerate]
287
+ task
288
+ end
289
+
290
+ # Open the screen mappings page and update the mappings
291
+ self.screen_mappings_button
292
+ mappings_page = WorkflowDetailTaskMappingsPage.new(@browser, false)
293
+
294
+ mapping_data = mappings_page.get_data
295
+ mappings_page.back
296
+
297
+ tasks.collect! do |task|
298
+ task[:mapped_screens] = mapping_data[task[:name]][:mapped_screens]
299
+ task
300
+ end
301
+
302
+ # Merge mapping data in to the task data structure
303
+ tasks
304
+ end
305
+
306
+ def set_tasks tasks
307
+ self.tasks_tab
308
+
309
+ has_existing_tasks = (selected_tasks_options.count > 0)
310
+
311
+ if has_existing_tasks
312
+ # Open the Addl Details page and clear all settings
313
+ self.additional_details_button
314
+ addtl_page = WorkflowDetailTaskAddlDetailPage.new(@browser, false)
315
+
316
+ addtl_page.clear_data
317
+ addtl_page.save
318
+
319
+ self.version_button
320
+ end
321
+
322
+ # Remove all tasks, then add back the requested tasks.
323
+ self.remove_all_tasks_button
324
+ tasks.each do |task|
325
+ available_tasks_element.select(task[:name])
326
+ end
327
+
328
+ if tasks.count > 0
329
+ self.add_task_button
330
+ # Version the added tasks before opening Addtl Details screen
331
+ self.version_button
332
+
333
+ # Open the Addl Details page and update the settings
334
+ self.additional_details_button
335
+ addtl_page = WorkflowDetailTaskAddlDetailPage.new(@browser, false)
336
+
337
+ addtl_page.set_data tasks
338
+ addtl_page.save
339
+
340
+ # Open the screen mappings page and update the mappings
341
+ self.screen_mappings_button
342
+ mappings_page = WorkflowDetailTaskMappingsPage.new(@browser, false)
343
+
344
+ mappings_page.set_data tasks
345
+ mappings_page.back
346
+
347
+ # Click the version button to save the changes
348
+ self.version_button
349
+ end
350
+ end
351
+
352
+ def set_events events
353
+ self.workflow_events_tab
354
+
355
+ current_events = {}
356
+ workflow_events.each do |ev|
357
+ current_events[ev.event] = ev
358
+ end
359
+
360
+ events.each do |event, gdl|
361
+ current_event = current_events[event]
362
+
363
+ unless current_event.nil?
364
+ id = current_event.id
365
+ current_gdl = current_event.guideline
366
+
367
+ if gdl != current_gdl
368
+ sel = select_list_elements(id: id)[0]
369
+
370
+ unless sel.nil?
371
+ sel.select gdl
372
+ end
373
+ end
374
+ end
375
+ end
376
+
377
+ self
378
+ end
379
+
380
+ def set_data_clearing dc
381
+ self.data_clearing_definitions_tab
382
+
383
+ # No need to make changes if none need to be made
384
+ return if dc[:definition].empty? && self.data_clearing_definition.empty?
385
+
386
+ self.data_clearing_definition_element.select dc[:definition]
387
+ self.data_clearing_days = dc[:days]
388
+ self.data_clearing_days_type_element.select dc[:days_type]
389
+
390
+ self.version_dc_button
391
+ end
392
+
393
+ private
394
+
395
+ include SelectListSyncable
396
+
397
+ def get_available_state_options
398
+ vars = []
399
+ Nokogiri::HTML(@browser.html).css('#ctl00_cntPlh_tsStates_lstAvailable > option').each do |elem|
400
+ vars << elem.text
401
+ end
402
+ vars
403
+ end
404
+
405
+ def get_selected_state_options
406
+ vars = []
407
+ Nokogiri::HTML(@browser.html).css('#ctl00_cntPlh_tsStates_lstSelected > option').each do |elem|
408
+ vars << elem.text
409
+ end
410
+ vars
411
+ end
412
+
413
+ def set_transition_states data
414
+ sync_available_and_selected_lists get_available_state_options,
415
+ available_states_element,
416
+ get_selected_state_options,
417
+ selected_states_element,
418
+ add_state_button_element,
419
+ remove_state_button_element,
420
+ data
421
+ end
422
+
423
+ def get_available_group_options
424
+ vars = []
425
+ Nokogiri::HTML(@browser.html).css('#ctl00_cntPlh_tsGroups_lstAvailable > option').each do |elem|
426
+ vars << elem.text
427
+ end
428
+ vars
429
+ end
430
+
431
+ def get_selected_group_options
432
+ vars = []
433
+ Nokogiri::HTML(@browser.html).css('#ctl00_cntPlh_tsGroups_lstSelected > option').each do |elem|
434
+ vars << elem.text
435
+ end
436
+ vars
437
+ end
438
+
439
+ def set_group_data data
440
+ sync_available_and_selected_lists get_available_group_options,
441
+ available_groups_element,
442
+ get_selected_group_options,
443
+ selected_groups_element,
444
+ add_group_button_element,
445
+ remove_group_button_element,
446
+ data
447
+ end
448
+ end # class WorkflowDetailPage
449
+
450
+ end # module Pages
451
+
@@ -0,0 +1,172 @@
1
+ ##############################################################################
2
+ # File:: workflow_detail_task_addl_detail_page.rb
3
+ # Purpose:: Stage Task Additional Detail page for AdminModule
4
+ #
5
+ # Author:: Jeff McAffee 2015-04-20
6
+ #
7
+ ##############################################################################
8
+ require 'page-object'
9
+ require 'nokogiri'
10
+
11
+ module AdminModule::Pages
12
+
13
+ class WorkflowDetailTaskAddlDetailPage
14
+ include PageObject
15
+
16
+ #page_url(:get_dynamic_url)
17
+
18
+ # The only access is through the Tasks tab Manage Addl Details button
19
+
20
+ #def get_dynamic_url
21
+ # AdminModule.configuration.url(WorkflowDetailPage)
22
+ #end
23
+
24
+ # Controls
25
+
26
+ span(:error_span,
27
+ id: 'ctl00_cntPlh_ctlErrors_lblError')
28
+
29
+ button(:save_button,
30
+ id: 'ctl00_cntPlh_btnSave')
31
+
32
+ button(:cancel_button,
33
+ id: 'ctl00_cntPlh_btnCancel')
34
+
35
+
36
+ def get_data
37
+ get_tasks_details
38
+ end
39
+
40
+ def set_data data
41
+ set_tasks_details data
42
+
43
+ self
44
+ end
45
+
46
+ def clear_data
47
+ clear_tasks_details
48
+
49
+ self
50
+ end
51
+
52
+ def save
53
+ # If there are no tasks, the error span will be populated and the Save
54
+ # button will not be available.
55
+ # In this case, click the Cancel button and move on.
56
+ if error_span? && error_span.include?('No task defined')
57
+ self.cancel_button
58
+ return
59
+ end
60
+
61
+ self.save_button
62
+ end
63
+
64
+ def cancel
65
+ self.cancel_button
66
+ end
67
+
68
+ private
69
+
70
+ def details_table
71
+ table_elements[0].table_elements[1]
72
+ end
73
+
74
+ def get_tasks_details
75
+ details = Hash.new
76
+
77
+ capture_details.each do |item|
78
+ details[item.name] = item.to_hsh
79
+ end
80
+
81
+ details
82
+ end
83
+
84
+ def set_tasks_details details
85
+ capture_details.each do |item|
86
+ details.each do |dtl|
87
+ if dtl[:name] == item.name
88
+ # We've found a match, get the field
89
+ txt = text_field_elements(id: item.pred_id)[0]
90
+ # set the predecessors field to the stored value
91
+ txt.value = dtl[:predecessors]
92
+
93
+ # Get the checkbox field
94
+ ck = checkbox_elements(id: item.reg_id)[0]
95
+ # Check/uncheck it
96
+ if dtl[:regenerate]
97
+ ck.check
98
+ else
99
+ ck.uncheck
100
+ end
101
+
102
+ break
103
+ end
104
+ end
105
+ end
106
+
107
+ self
108
+ end
109
+
110
+ def clear_tasks_details
111
+ capture_details.each do |item|
112
+ # set the predecessors field to blank
113
+ txt = text_field_elements(id: item.pred_id)[0]
114
+ txt.value = ''
115
+
116
+ # Clear the checkbox field
117
+ ck = checkbox_elements(id: item.reg_id)[0]
118
+ ck.uncheck
119
+ end
120
+
121
+ self
122
+ end
123
+
124
+ class TaskDetail
125
+ attr_accessor :sequence
126
+ attr_accessor :name
127
+ attr_accessor :predecessors
128
+ attr_accessor :pred_id
129
+ attr_accessor :regenerate
130
+ attr_accessor :reg_id
131
+
132
+ def to_hsh
133
+ {
134
+ sequence: @sequence,
135
+ name: @name,
136
+ predecessors: @predecessors,
137
+ regenerate: @regenerate,
138
+ }
139
+ end
140
+ end
141
+
142
+ ###
143
+ # Build a list of objects containing task detail data.
144
+ #
145
+ # We use this method even though we don't need to (for get_xxx) because we'll
146
+ # need the captured field ids for *setting* values.
147
+ #
148
+
149
+ def capture_details
150
+ details = []
151
+
152
+ Nokogiri::HTML(@browser.html).css("#ctl00_cntPlh_gvTask>tbody>tr").each do |tr|
153
+ # Skip the header row
154
+ next if tr['class'] == 'GridHeader'
155
+
156
+ detail = TaskDetail.new
157
+ detail.sequence = tr.css("td:nth-child(1)").text
158
+ detail.name = tr.css("td:nth-child(2)").text
159
+ detail.predecessors = tr.css("td:nth-child(3)>input").text
160
+ detail.pred_id = tr.css("td:nth-child(3)>input")[0]['id']
161
+ detail.regenerate = tr.css("td:nth-child(4)>input")[0]['checked'] == 'checked'
162
+ detail.reg_id = tr.css("td:nth-child(4)>input")[0]['id']
163
+
164
+ details << detail
165
+ end # css
166
+
167
+ details
168
+ end
169
+ end # class WorkflowDetailTaskAddlDetailPage
170
+
171
+ end # module Pages
172
+