Skip to content

Commit 7dd0b99

Browse files
committed
Converts schema edit page to react
1 parent ef8fb4c commit 7dd0b99

File tree

11 files changed

+902
-197
lines changed

11 files changed

+902
-197
lines changed

app/controllers/miq_ae_class_controller.rb

Lines changed: 48 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require "rexml/document"
2+
require 'byebug'
23
class MiqAeClassController < ApplicationController
34
include MiqAeClassHelper
45
include AutomateTreeHelper
@@ -501,6 +502,7 @@ def edit_fields
501502
@in_a_form = true
502503
@in_a_form_fields = true
503504
session[:changed] = @changed = false
505+
@hide_bottom_bar = true
504506
replace_right_cell
505507
end
506508

@@ -881,19 +883,19 @@ def fields_form_field_changed
881883

882884
fields_get_form_vars
883885
@changed = (@edit[:new] != @edit[:current])
884-
render :update do |page|
885-
page << javascript_prologue
886+
# render :update do |page|
887+
# page << javascript_prologue
886888
unless %w[up down].include?(params[:button])
887889
if params[:field_datatype] == "password"
888-
page << javascript_hide("field_default_value")
889-
page << javascript_show("field_password_value")
890-
page << "$('#field_password_value').val('');"
890+
# page << javascript_hide("field_default_value")
891+
# page << javascript_show("field_password_value")
892+
# page << "$('#field_password_value').val('');"
891893
session[:field_data][:default_value] =
892894
@edit[:new_field][:default_value] = ''
893895
elsif params[:field_datatype]
894-
page << javascript_hide("field_password_value")
895-
page << javascript_show("field_default_value")
896-
page << "$('#field_default_value').val('');"
896+
# page << javascript_hide("field_password_value")
897+
# page << javascript_show("field_default_value")
898+
# page << "$('#field_default_value').val('');"
897899
session[:field_data][:default_value] =
898900
@edit[:new_field][:default_value] = ''
899901
end
@@ -904,19 +906,20 @@ def fields_form_field_changed
904906
def_field = "fields_default_value_" << f[1].to_s
905907
pwd_field = "fields_password_value_" << f[1].to_s
906908
if @edit[:new][:fields][f[1].to_i]['datatype'] == "password"
907-
page << javascript_hide(def_field)
908-
page << javascript_show(pwd_field)
909-
page << "$('##{pwd_field}').val('');"
909+
# page << javascript_hide(def_field)
910+
# page << javascript_show(pwd_field)
911+
# page << "$('##{pwd_field}').val('');"
910912
else
911-
page << javascript_hide(pwd_field)
912-
page << javascript_show(def_field)
913-
page << "$('##{def_field}').val('');"
913+
# page << javascript_hide(pwd_field)
914+
# page << javascript_show(def_field)
915+
# page << "$('##{def_field}').val('');"
914916
end
915917
@edit[:new][:fields][f[1].to_i]['default_value'] = nil
916918
end
917919
end
918-
page << javascript_for_miq_button_visibility_changed(@changed)
919-
end
920+
# page << javascript_for_miq_button_visibility_changed(@changed)
921+
# end
922+
render :json => {:message => 'Field updated successfully'}, :status => 200
920923
end
921924

922925
# AJAX driven routine to check for changes in ANY field on the form
@@ -1140,13 +1143,12 @@ def update_fields
11401143
return unless load_edit("aefields_edit__#{params[:id]}", "replace_cell__explorer")
11411144

11421145
fields_get_form_vars
1143-
@changed = (@edit[:new] != @edit[:current])
11441146
case params[:button]
11451147
when "cancel"
11461148
@sb[:action] = session[:edit] = nil # clean out the saved info
1147-
add_flash(_("Edit of schema for Automate Class \"%{name}\" was cancelled by the user") % {:name => @ae_class.name})
11481149
@in_a_form = false
1149-
replace_right_cell
1150+
message = _("Edit of schema for Automate Class \"%{name}\" was cancelled by the user") % {:name => @ae_class.name}
1151+
render :json => {:status => 200, :message => message}
11501152
when "save"
11511153
ae_class = find_record_with_rbac(MiqAeClass, params[:id])
11521154
begin
@@ -1157,27 +1159,26 @@ def update_fields
11571159
ae_class.save!
11581160
end
11591161
rescue StandardError => bang
1160-
add_flash(_("Error during 'save': %{error_message}") % {:error_message => bang.message}, :error)
11611162
session[:changed] = @changed = true
1162-
javascript_flash
1163+
error_message = _("Error during 'save': %{error_message}") % {:error_message => bang.message}, :error
1164+
render :json => {:status => 500, :error => error_message}
11631165
else
1164-
add_flash(_("Schema for Automate Class \"%{name}\" was saved") % {:name => ae_class.name})
11651166
AuditEvent.success(build_saved_audit(ae_class, @edit))
11661167
@sb[:action] = session[:edit] = nil # clean out the saved info
1167-
@in_a_form = false
1168-
replace_right_cell(:replace_trees => [:ae])
1169-
nil
1168+
success_message = _("Schema for Automate Class \"%{name}\" was saved") % {:name => ae_class.name}
1169+
render :json => {:status => 200, :message => success_message}
11701170
end
11711171
when "reset"
11721172
fields_set_form_vars
1173-
session[:changed] = @changed = false
1173+
session[:changed] = false
11741174
add_flash(_("All changes have been reset"), :warning)
11751175
@button = "reset"
11761176
@in_a_form = true
1177-
replace_right_cell
1177+
success_message = _("All changes have been reset")
1178+
render :json => {:status => 200, :message => success_message}
11781179
else
11791180
@changed = session[:changed] = (@edit[:new] != @edit[:current])
1180-
replace_right_cell(:replace_trees => [:ae])
1181+
render :json => {:status => 200}
11811182
end
11821183
end
11831184

@@ -1439,54 +1440,33 @@ def create_namespace
14391440
# AJAX driven routine to select a classification entry
14401441
def field_select
14411442
assert_privileges('miq_ae_field_edit')
1442-
fields_get_form_vars
1443-
@combo_xml = build_type_options
1444-
@dtype_combo_xml = build_dtype_options
1443+
fields_get_form_vars # nothing in particular handled here
14451444
session[:field_data] = {}
14461445
@edit[:new_field][:substitute] = session[:field_data][:substitute] = true
1447-
@changed = (@edit[:new] != @edit[:current])
1448-
render :update do |page|
1449-
page << javascript_prologue
1450-
page.replace("class_fields_div", :partial => "class_fields")
1451-
page << javascript_for_miq_button_visibility(@changed)
1452-
page << "miqSparkle(false);"
1453-
end
1446+
render :json => {:status => 200}
14541447
end
14551448

14561449
# AJAX driven routine to select a classification entry
14571450
def field_accept
14581451
assert_privileges('miq_ae_field_edit')
14591452
fields_get_form_vars
14601453
@changed = (@edit[:new] != @edit[:current])
1461-
@combo_xml = build_type_options
1462-
@dtype_combo_xml = build_dtype_options
1463-
render :update do |page|
1464-
page << javascript_prologue
1465-
page.replace("class_fields_div", :partial => "class_fields")
1466-
page << javascript_for_miq_button_visibility(@changed)
1467-
page << "miqSparkle(false);"
1468-
end
1454+
render :json => {
1455+
:message => 'Accepted',
1456+
:status => 200,
1457+
}
14691458
end
14701459

14711460
# AJAX driven routine to delete a classification entry
14721461
def field_delete
14731462
assert_privileges('miq_ae_field_edit')
14741463
fields_get_form_vars
1475-
@combo_xml = build_type_options
1476-
@dtype_combo_xml = build_dtype_options
14771464

14781465
if params.key?(:id) && @edit[:fields_to_delete].exclude?(params[:id])
14791466
@edit[:fields_to_delete].push(params[:id])
14801467
end
1481-
14821468
@edit[:new][:fields].delete_at(params[:arr_id].to_i)
1483-
@changed = (@edit[:new] != @edit[:current])
1484-
render :update do |page|
1485-
page << javascript_prologue
1486-
page.replace("class_fields_div", :partial => "class_fields")
1487-
page << javascript_for_miq_button_visibility(@changed)
1488-
page << "miqSparkle(false);"
1489-
end
1469+
render :json => {:status => 200}
14901470
end
14911471

14921472
# AJAX driven routine to select a classification entry
@@ -2352,12 +2332,11 @@ def fields_get_form_vars
23522332
if params[:item].blank? && !%w[accept save].include?(params[:button]) && params["action"] != "field_delete"
23532333
field_data = session[:field_data]
23542334
new_field = @edit[:new_field]
2355-
23562335
field_attributes.each do |field|
23572336
field_name = "field_#{field}".to_sym
23582337
field_sym = field.to_sym
23592338
if field == "substitute"
2360-
field_data[field_sym] = new_field[field_sym] = params[field_name] == "1" if params[field_name]
2339+
field_data[field_sym] = new_field[field_sym] = params[field_name] if params.key?(field_name)
23612340
elsif params[field_name]
23622341
field_data[field_sym] = new_field[field_sym] = params[field_name]
23632342
end
@@ -2376,7 +2355,7 @@ def fields_get_form_vars
23762355
field_attributes.each do |field|
23772356
field_name = "fields_#{field}_#{i}"
23782357
if field == "substitute"
2379-
fld[field] = params[field_name] == "1" if params[field_name]
2358+
fld[field] = params[field_name] if params.key?(field_name)
23802359
elsif %w[aetype datatype].include?(field)
23812360
var_name = "fields_#{field}#{i}"
23822361
fld[field] = params[var_name.to_sym] if params[var_name.to_sym]
@@ -2389,18 +2368,23 @@ def fields_get_form_vars
23892368
end
23902369
end
23912370
elsif params[:button] == "accept"
2392-
if session[:field_data][:name].blank? || session[:field_data][:aetype].blank?
2393-
field = session[:field_data][:name].blank? ? "Name" : "Type"
2394-
field += " and Type" if field == "Name" && session[:field_data][:aetype].blank?
2371+
# if session[:field_data][:name].blank? || session[:field_data][:aetype].blank?
2372+
if params[:name].blank? || params[:aetype].blank?
2373+
# field = session[:field_data][:name].blank? ? "Name" : "Type"
2374+
# field += " and Type" if field == "Name" && session[:field_data][:aetype].blank?
2375+
field = params[:name].blank? ? "Name" : "Type"
2376+
field += " and Type" if field == "Name" && params[:aetype].blank?
23952377
add_flash(_("%{field} is required") % {:field => field}, :error)
23962378
return
23972379
end
23982380
new_fields = {}
23992381
field_attributes.each do |field_attribute|
2400-
new_fields[field_attribute] = @edit[:new_field][field_attribute.to_sym]
2382+
# new_fields[field_attribute] = @edit[:new_field][field_attribute.to_sym]
2383+
# new_fields[field_attribute] = params[:field][field_attribute.to_sym]
2384+
new_fields[field_attribute] = params[field_attribute.to_sym]
24012385
end
24022386
@edit[:new][:fields].push(new_fields)
2403-
@edit[:new_field] = session[:field_data] = {}
2387+
# @edit[:new_field] = session[:field_data] = {}
24042388
end
24052389
end
24062390

app/helpers/miq_ae_class_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ def schema_data(schema_data)
249249
cells.push({:text => ae_field.send(fname)})
250250
end
251251
end
252-
push_data({:id => index.to_s, :clickable => false, :cells => cells})
252+
push_data({:id => index.to_s, :field_id => ae_field.id, :clickable => false, :cells => cells})
253253
end
254254
end
255255

app/javascript/components/data-tables/datastore/helper.js

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { headerData, rowData } from '../../miq-data-table/helper';
2+
// import miqFlash from '../../helpers/miq-flash';
3+
// import miqFlashClear from '../../helpers/miq-flash-clear';
24

35
const hasCheckbox = (type, { domain, schema, fields }) => ![domain, schema, fields].includes(type);
46

@@ -26,18 +28,29 @@ const commonHeaders = () => [
2628
const domainOverridesHeaders = () => [{ text: 'defaultKey_0', header_text: __('Domain') }];
2729

2830
/** Function which returns the header data for table with type class_fields schema. */
29-
const schemaHeaders = () => [
30-
{ text: 'Name', header_text: __('Name') },
31-
{ text: 'Description', header_text: __('Description') },
32-
{ text: 'DefaultValue', header_text: __('Default Value') },
33-
{ text: 'Collect', header_text: __('Collect') },
34-
{ text: 'Message', header_text: __('Message') },
35-
{ text: 'OnEntry', header_text: __('On Entry') },
36-
{ text: 'OnExit', header_text: __('On Exit') },
37-
{ text: 'OnError', header_text: __('On Error') },
38-
{ text: 'MaxRetries', header_text: __('Max Retries') },
39-
{ text: 'MaxTime', header_text: __('Max Time') },
40-
];
31+
export const schemaHeaders = (isEdit = false) => {
32+
const headers = [
33+
{ name: 'name', text: 'Name', header_text: __('Name') },
34+
{ name: 'description', text: 'Description', header_text: __('Description') },
35+
{ name: 'default_value', text: 'DefaultValue', header_text: __('Default Value') },
36+
{ name: 'collect', text: 'Collect', header_text: __('Collect') },
37+
{ name: 'message', text: 'Message', header_text: __('Message') },
38+
{ name: 'on_entry', text: 'OnEntry', header_text: __('On Entry') },
39+
{ name: 'on_exit', text: 'OnExit', header_text: __('On Exit') },
40+
{ name: 'on_error', text: 'OnError', header_text: __('On Error') },
41+
{ name: 'max_retries', text: 'MaxRetries', header_text: __('Max Retries') },
42+
{ name: 'max_time', text: 'MaxTime', header_text: __('Max Time') },
43+
];
44+
45+
if (isEdit) {
46+
headers.push(
47+
{ name: 'edit', text: 'Edit', header_text: __('Edit') },
48+
{ name: 'delete', text: 'Delete', header_text: __('Delete') }
49+
);
50+
}
51+
52+
return headers;
53+
};
4154

4255
/** Function which returns the header data for table with type instant_fields. */
4356
const instantFieldHeaders = (hasOptions) => {
@@ -58,7 +71,7 @@ const instantFieldHeaders = (hasOptions) => {
5871
/** Function which returns the header items based on its type. */
5972
const datastoreHeaders = (type, hasOptions, {
6073
list, details, instances, methods, domain, schema, fields,
61-
}) => {
74+
}, isEdit) => {
6275
switch (type) {
6376
case list:
6477
return nsListHeaders(hasOptions);
@@ -69,19 +82,49 @@ const datastoreHeaders = (type, hasOptions, {
6982
case domain:
7083
return domainOverridesHeaders();
7184
case schema:
72-
return schemaHeaders();
85+
return schemaHeaders(isEdit);
7386
case fields:
7487
return instantFieldHeaders(hasOptions);
7588
default:
7689
return [];
7790
}
7891
};
7992

93+
export const createEditableRows = (data) => {
94+
const rowItems = Array.isArray(data) ? data.map((item) => {
95+
const updatedCells = [
96+
...item.cells,
97+
{
98+
is_button: true,
99+
text: __('Update'),
100+
kind: 'tertiary',
101+
size: 'md',
102+
callback: 'editClassField',
103+
},
104+
{
105+
is_button: true,
106+
text: __('Delete'),
107+
kind: 'danger',
108+
size: 'md',
109+
callback: 'deleteClassField',
110+
},
111+
];
112+
113+
return {
114+
...item,
115+
cells: updatedCells,
116+
};
117+
})
118+
: [];
119+
120+
return rowItems;
121+
};
122+
80123
/** Function which returns the data needed for table. */
81-
export const tableData = (type, hasOptions, initialData, datastoreTypes) => {
124+
export const tableData = (type, hasOptions, initialData, datastoreTypes, isEdit) => {
82125
const cBox = hasCheckbox(type, datastoreTypes);
83126
const nodeTree = type === datastoreTypes.domain ? 'x_show' : 'tree_select';
84-
const columns = datastoreHeaders(type, hasOptions, datastoreTypes);
127+
const columns = datastoreHeaders(type, hasOptions, datastoreTypes, isEdit);
85128
const { headerKeys, headerItems } = headerData(columns, cBox);
86129
const miqRows = rowData(headerKeys, initialData, true);
87130
return {
@@ -105,3 +148,10 @@ export const removeSelected = (array, item) => {
105148
}
106149
return array;
107150
};
151+
152+
export const transformSelectOptions = (array) =>
153+
array.map(([label, value, extraProps]) => ({
154+
label,
155+
value,
156+
...extraProps,
157+
}));

0 commit comments

Comments
 (0)