Skip to content

Commit 90d53b0

Browse files
committed
Converts schema edit page to react
1 parent ef8fb4c commit 90d53b0

File tree

11 files changed

+873
-196
lines changed

11 files changed

+873
-196
lines changed

app/controllers/miq_ae_class_controller.rb

Lines changed: 24 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ def edit_fields
501501
@in_a_form = true
502502
@in_a_form_fields = true
503503
session[:changed] = @changed = false
504+
@hide_bottom_bar = true
504505
replace_right_cell
505506
end
506507

@@ -881,19 +882,11 @@ def fields_form_field_changed
881882

882883
fields_get_form_vars
883884
@changed = (@edit[:new] != @edit[:current])
884-
render :update do |page|
885-
page << javascript_prologue
886885
unless %w[up down].include?(params[:button])
887886
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('');"
891887
session[:field_data][:default_value] =
892888
@edit[:new_field][:default_value] = ''
893889
elsif params[:field_datatype]
894-
page << javascript_hide("field_password_value")
895-
page << javascript_show("field_default_value")
896-
page << "$('#field_default_value').val('');"
897890
session[:field_data][:default_value] =
898891
@edit[:new_field][:default_value] = ''
899892
end
@@ -904,19 +897,12 @@ def fields_form_field_changed
904897
def_field = "fields_default_value_" << f[1].to_s
905898
pwd_field = "fields_password_value_" << f[1].to_s
906899
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('');"
910900
else
911-
page << javascript_hide(pwd_field)
912-
page << javascript_show(def_field)
913-
page << "$('##{def_field}').val('');"
914901
end
915902
@edit[:new][:fields][f[1].to_i]['default_value'] = nil
916903
end
917904
end
918-
page << javascript_for_miq_button_visibility_changed(@changed)
919-
end
905+
render :json => {:message => 'Field updated successfully'}, :status => 200
920906
end
921907

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

11421128
fields_get_form_vars
1143-
@changed = (@edit[:new] != @edit[:current])
11441129
case params[:button]
11451130
when "cancel"
11461131
@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})
11481132
@in_a_form = false
1149-
replace_right_cell
1133+
message = _("Edit of schema for Automate Class \"%{name}\" was cancelled by the user") % {:name => @ae_class.name}
1134+
render :json => {:status => 200, :message => message}
11501135
when "save"
11511136
ae_class = find_record_with_rbac(MiqAeClass, params[:id])
11521137
begin
@@ -1157,27 +1142,26 @@ def update_fields
11571142
ae_class.save!
11581143
end
11591144
rescue StandardError => bang
1160-
add_flash(_("Error during 'save': %{error_message}") % {:error_message => bang.message}, :error)
11611145
session[:changed] = @changed = true
1162-
javascript_flash
1146+
error_message = _("Error during 'save': %{error_message}") % {:error_message => bang.message}, :error
1147+
render :json => {:status => 500, :error => error_message}
11631148
else
1164-
add_flash(_("Schema for Automate Class \"%{name}\" was saved") % {:name => ae_class.name})
11651149
AuditEvent.success(build_saved_audit(ae_class, @edit))
11661150
@sb[:action] = session[:edit] = nil # clean out the saved info
1167-
@in_a_form = false
1168-
replace_right_cell(:replace_trees => [:ae])
1169-
nil
1151+
success_message = _("Schema for Automate Class \"%{name}\" was saved") % {:name => ae_class.name}
1152+
render :json => {:status => 200, :message => success_message}
11701153
end
11711154
when "reset"
11721155
fields_set_form_vars
1173-
session[:changed] = @changed = false
1156+
session[:changed] = false
11741157
add_flash(_("All changes have been reset"), :warning)
11751158
@button = "reset"
11761159
@in_a_form = true
1177-
replace_right_cell
1160+
success_message = _("All changes have been reset")
1161+
render :json => {:status => 200, :message => success_message}
11781162
else
11791163
@changed = session[:changed] = (@edit[:new] != @edit[:current])
1180-
replace_right_cell(:replace_trees => [:ae])
1164+
render :json => {:status => 200}
11811165
end
11821166
end
11831167

@@ -1440,53 +1424,32 @@ def create_namespace
14401424
def field_select
14411425
assert_privileges('miq_ae_field_edit')
14421426
fields_get_form_vars
1443-
@combo_xml = build_type_options
1444-
@dtype_combo_xml = build_dtype_options
14451427
session[:field_data] = {}
14461428
@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
1429+
render :json => {:status => 200}
14541430
end
14551431

14561432
# AJAX driven routine to select a classification entry
14571433
def field_accept
14581434
assert_privileges('miq_ae_field_edit')
14591435
fields_get_form_vars
14601436
@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
1437+
render :json => {
1438+
:message => 'Accepted',
1439+
:status => 200,
1440+
}
14691441
end
14701442

14711443
# AJAX driven routine to delete a classification entry
14721444
def field_delete
14731445
assert_privileges('miq_ae_field_edit')
14741446
fields_get_form_vars
1475-
@combo_xml = build_type_options
1476-
@dtype_combo_xml = build_dtype_options
14771447

14781448
if params.key?(:id) && @edit[:fields_to_delete].exclude?(params[:id])
14791449
@edit[:fields_to_delete].push(params[:id])
14801450
end
1481-
14821451
@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
1452+
render :json => {:status => 200}
14901453
end
14911454

14921455
# AJAX driven routine to select a classification entry
@@ -2352,12 +2315,11 @@ def fields_get_form_vars
23522315
if params[:item].blank? && !%w[accept save].include?(params[:button]) && params["action"] != "field_delete"
23532316
field_data = session[:field_data]
23542317
new_field = @edit[:new_field]
2355-
23562318
field_attributes.each do |field|
23572319
field_name = "field_#{field}".to_sym
23582320
field_sym = field.to_sym
23592321
if field == "substitute"
2360-
field_data[field_sym] = new_field[field_sym] = params[field_name] == "1" if params[field_name]
2322+
field_data[field_sym] = new_field[field_sym] = params[field_name] if params.key?(field_name)
23612323
elsif params[field_name]
23622324
field_data[field_sym] = new_field[field_sym] = params[field_name]
23632325
end
@@ -2376,7 +2338,7 @@ def fields_get_form_vars
23762338
field_attributes.each do |field|
23772339
field_name = "fields_#{field}_#{i}"
23782340
if field == "substitute"
2379-
fld[field] = params[field_name] == "1" if params[field_name]
2341+
fld[field] = params[field_name] if params.key?(field_name)
23802342
elsif %w[aetype datatype].include?(field)
23812343
var_name = "fields_#{field}#{i}"
23822344
fld[field] = params[var_name.to_sym] if params[var_name.to_sym]
@@ -2389,18 +2351,17 @@ def fields_get_form_vars
23892351
end
23902352
end
23912353
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?
2354+
if params[:name].blank? || params[:aetype].blank?
2355+
field = params[:name].blank? ? "Name" : "Type"
2356+
field += " and Type" if field == "Name" && params[:aetype].blank?
23952357
add_flash(_("%{field} is required") % {:field => field}, :error)
23962358
return
23972359
end
23982360
new_fields = {}
23992361
field_attributes.each do |field_attribute|
2400-
new_fields[field_attribute] = @edit[:new_field][field_attribute.to_sym]
2362+
new_fields[field_attribute] = params[field_attribute.to_sym]
24012363
end
24022364
@edit[:new][:fields].push(new_fields)
2403-
@edit[:new_field] = session[:field_data] = {}
24042365
end
24052366
end
24062367

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: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,29 @@ const commonHeaders = () => [
2626
const domainOverridesHeaders = () => [{ text: 'defaultKey_0', header_text: __('Domain') }];
2727

2828
/** 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-
];
29+
export const schemaHeaders = (isEdit = false) => {
30+
const headers = [
31+
{ name: 'name', text: 'Name', header_text: __('Name') },
32+
{ name: 'description', text: 'Description', header_text: __('Description') },
33+
{ name: 'default_value', text: 'DefaultValue', header_text: __('Default Value') },
34+
{ name: 'collect', text: 'Collect', header_text: __('Collect') },
35+
{ name: 'message', text: 'Message', header_text: __('Message') },
36+
{ name: 'on_entry', text: 'OnEntry', header_text: __('On Entry') },
37+
{ name: 'on_exit', text: 'OnExit', header_text: __('On Exit') },
38+
{ name: 'on_error', text: 'OnError', header_text: __('On Error') },
39+
{ name: 'max_retries', text: 'MaxRetries', header_text: __('Max Retries') },
40+
{ name: 'max_time', text: 'MaxTime', header_text: __('Max Time') },
41+
];
42+
43+
if (isEdit) {
44+
headers.push(
45+
{ name: 'edit', text: 'Edit', header_text: __('Edit') },
46+
{ name: 'delete', text: 'Delete', header_text: __('Delete') }
47+
);
48+
}
49+
50+
return headers;
51+
};
4152

4253
/** Function which returns the header data for table with type instant_fields. */
4354
const instantFieldHeaders = (hasOptions) => {
@@ -58,7 +69,7 @@ const instantFieldHeaders = (hasOptions) => {
5869
/** Function which returns the header items based on its type. */
5970
const datastoreHeaders = (type, hasOptions, {
6071
list, details, instances, methods, domain, schema, fields,
61-
}) => {
72+
}, isEdit) => {
6273
switch (type) {
6374
case list:
6475
return nsListHeaders(hasOptions);
@@ -69,19 +80,49 @@ const datastoreHeaders = (type, hasOptions, {
6980
case domain:
7081
return domainOverridesHeaders();
7182
case schema:
72-
return schemaHeaders();
83+
return schemaHeaders(isEdit);
7384
case fields:
7485
return instantFieldHeaders(hasOptions);
7586
default:
7687
return [];
7788
}
7889
};
7990

91+
export const createEditableRows = (data) => {
92+
const rowItems = Array.isArray(data) ? data.map((item) => {
93+
const updatedCells = [
94+
...item.cells,
95+
{
96+
is_button: true,
97+
text: __('Update'),
98+
kind: 'tertiary',
99+
size: 'md',
100+
callback: 'editClassField',
101+
},
102+
{
103+
is_button: true,
104+
text: __('Delete'),
105+
kind: 'danger',
106+
size: 'md',
107+
callback: 'deleteClassField',
108+
},
109+
];
110+
111+
return {
112+
...item,
113+
cells: updatedCells,
114+
};
115+
})
116+
: [];
117+
118+
return rowItems;
119+
};
120+
80121
/** Function which returns the data needed for table. */
81-
export const tableData = (type, hasOptions, initialData, datastoreTypes) => {
122+
export const tableData = (type, hasOptions, initialData, datastoreTypes, isEdit) => {
82123
const cBox = hasCheckbox(type, datastoreTypes);
83124
const nodeTree = type === datastoreTypes.domain ? 'x_show' : 'tree_select';
84-
const columns = datastoreHeaders(type, hasOptions, datastoreTypes);
125+
const columns = datastoreHeaders(type, hasOptions, datastoreTypes, isEdit);
85126
const { headerKeys, headerItems } = headerData(columns, cBox);
86127
const miqRows = rowData(headerKeys, initialData, true);
87128
return {
@@ -105,3 +146,10 @@ export const removeSelected = (array, item) => {
105146
}
106147
return array;
107148
};
149+
150+
export const transformSelectOptions = (array) =>
151+
array.map(([label, value, extraProps]) => ({
152+
label,
153+
value,
154+
...extraProps,
155+
}));

0 commit comments

Comments
 (0)