options not working
options not working
I have a parent/child DataTable. in the child's editor, there is a select box and the options populate no problem.
I have another DataTable/Editor where the editor is using the some controller as the previously mentioned child datatable. In this second one, the options are not populating.However, if I look at the ajax call results, I see the options listed.
sorry I can't post a link to the project as it is on an intranet.
controller:
public class EquipmentOnLoan_LoanRateLinkController : ApiController
{
[Route("api/EquipmentOnLoan_LoanRateLink")]
[HttpGet]
[HttpPost]
public IHttpActionResult EquipmentOnLoan_LoanRateLink()
{
var request = HttpContext.Current.Request;
var settings = Properties.Settings.Default;
var AsOfCookie = request.Cookies.Get("AsOfDate").Value;
using (var db = new Database(settings.DbType, settings.DbConnection))
{
var response = new Editor(db, "EquipmentOnLoan_LoanRateLink", "EquipmentRateID")
.Field(new Field("EquipmentOnLoan_LoanRateLink.LoanResourceID")
.Validator(Validation.NotEmpty())
.Validator(Validation.Numeric())
.Options("udf_EquipmentOnLoan('" + AsOfCookie + "')", "LOANRESOURCEID", "LOANRESOURCEID")
)
.Field(new Field("EquipmentOnLoan_LoanRateLink.RateID")
.Validator(Validation.NotEmpty())
.Validator(Validation.Numeric())
.Options("EquipmentOnLoan_Rates", "LoanRateID", "RateName")
)
.Field(new Field("EquipmentOnLoan_LoanRateLink.EffectiveDate")
.Validator(Validation.NotEmpty())
.GetFormatter(Format.DateSqlToFormat("MM/dd/yyyy"))
)
.Field(new Field("EquipmentOnLoan_LoanRateLink.ExpireDate")
.SetFormatter(Format.NullEmpty())
.GetFormatter(Format.DateSqlToFormat("MM/dd/yyyy"))
)
.LeftJoin("udf_EquipmentOnLoan('" + AsOfCookie + "') as vw_EquipmentOnLoan", "vw_EquipmentOnLoan.LOANRESOURCEID", "=", "EquipmentOnLoan_LoanRateLink.LoanResourceID")
.Field(new Field("vw_EquipmentOnLoan.LOANID"))
.LeftJoin("EquipmentOnLoan_Rates", "EquipmentOnLoan_Rates.LoanRateID", "=", "EquipmentOnLoan_LoanRateLink.RateID")
.Field(new Field("EquipmentOnLoan_Rates.RateName"))
.Where(q =>
{
if (request.Form["LoanIDFilter"] != "0")
{
q.Where("EquipmentOnLoan_LoanRateLink.LoanResourceID", request.Form["LoanIDFilter"]);
}
})
.Process(request)
.Data();
return Json(response);
}
}
}
parent/child Editor where the RateID select is populating correctly:
var EquipmentOnLoan_LoanRateLinkEditor;
function createChild(row) {
var rowData = row.data();
var rowID = rowData.EquipmentOnLoan.LOANRESOURCEID;
var startDate = rowData.EquipmentOnLoan.LoanStartDate;
// This is the table we'll convert into a DataTable
var table = $('<table class="display" style="width:40%" />');
// Display it the child row
row.child(table).show();
// Editor definition for the child table
EquipmentOnLoan_LoanRateLinkEditor = new $.fn.dataTable.Editor({
ajax: {
url: 'api/EquipmentOnLoan_LoanRateLink',
data: function (d) {
d['LoanIDFilter'] = rowID;
}
},
table: table,
fields: [
{ label: "Rate:", name: "EquipmentOnLoan_LoanRateLink.LoanResourceID" , type:"readonly", def:rowID},
{
label: "Rate:", name: "EquipmentOnLoan_LoanRateLink.RateID", type: "select",
placeholder: "<Select Rate>",
placeholderValue: 0,
placeholderDisabled: false
},
{
label: "Effective Date:"
, name: "EquipmentOnLoan_LoanRateLink.EffectiveDate"
, type: 'datetime'
, def: AsOfCookie // startDate
, format: "M/D/YYYY"
},
{
label: "Expire Date:"
, name: "EquipmentOnLoan_LoanRateLink.ExpireDate"
, type: 'datetime'
, format: "M/D/YYYY"
}
]
});
on the same page, I have the other dataTable where the select is not populated. Note that it is using the same ajax call as the working one
var EquipmentOnLoan_LoanRateLinkEditorStandalone = new $.fn.dataTable.Editor({
ajax: {
url: 'api/EquipmentOnLoan_LoanRateLink',
data: function (d) {
d.LoanIDFilter = 0;
/*
var selected = EquipmentOnLoan_AlertsTable.row({ selected: true });
if (selected.any()) {
console.log(selected.data().LOANRESOURCEID)
d.LoanIDFilter = selected.data().LOANRESOURCEID;
}
*/
}
},
table: EquipmentOnLoan_LoanRateLinkTableStandalone,
fields: [
{
label: "id:", name: "EquipmentOnLoan_LoanRateLink.LoanResourceID", type: "readonly"
//, def: rowID
},
{
label: "Rate:", name: "EquipmentOnLoan_LoanRateLink.RateID", type: "select",
placeholder: "<Select Rate>",
placeholderValue: 0,
placeholderDisabled: false
},
{
label: "Effective Date:"
, name: "EquipmentOnLoan_LoanRateLink.EffectiveDate"
, type: 'datetime'
//, def: startDate
, format: "M/D/YYYY"
},
{
label: "Expire Date:"
, name: "EquipmentOnLoan_LoanRateLink.ExpireDate"
, type: 'datetime'
, format: "M/D/YYYY"
}
]
});
I wish I didn't have to create the 'standAlone' datatable/editor, but I guess because the first is dynamic, I can't get it to work without creating the second editor (which the standalone dataTable will be hidden). but first thing first, why is the select not working even though the ajax call seems to have the data in the options parameter correctly?
I have another page in this project where I am trying to "re-use" an Editor/Controller and it is behaving the same, where one of them is not populating the select list corrrectly.
This question has an accepted answers - jump to answer
Answers
When is
EquipmentOnLoan_LoanRateLinkEditorStandalone
created relative toEquipmentOnLoan_LoanRateLinkTableStandalone
? If there is a delay, then Editor might miss thexhr
triggered by the DataTable, which would cause it to not see the options.As an experiment to see if this is that case, try adding:
just after your
EquipmentOnLoan_LoanRateLinkEditorStandalone
editor initialisation (epic variable names ).Do the options then appear?
Allan
if I put it after the editor but before the dataTable I get this:
Uncaught TypeError: Cannot read property 'ajax' of undefined
If I put it at the very end of the document.ready, no error, but no options still.
oh, I have another dataTable that is using that controller/editor as well and the options do not populate:
I look at the xhr after I select and I do see options listed in the return. They just are not on the editor drop-down.
oh, one other note. someone had pointed out that I was not using the html table when defining the editorStandalone (line 17 a couple posts up there). instead i was using the variable. however, when I try changing line 17 to:
I get: dataTables.editor.min.js:102 Uncaught TypeError: Cannot read property 'oFeatures' of undefined
Yes, it would need to be after the DataTable is initialised, since it uses the DataTable variable. Sorry I didn't make that clear.
I suspect I'm going to need a link to a page showing this error to be able to help solve it, but let's try the debugger first to see if there is anything obvious there. Click the Upload button and then let me know what the debug code is.
Allan
sorry, i had to work on another project for a couple days. So, I am back on this one now.
I have clicked the 'Upload' button
ah, thanks. I missed that step:
arokiv
again, the options work when used in this parent/child editor: EquipmentOnLoan_LoanRateLinkEditor
But options do not work in the standalone editor, which uses the same controller.
No they won't. The options in Editor get auto loaded from the
options
property in the Ajax JSON that the host DataTable has.Therefore, if there is no host DataTable, the options can't get autoloaded.
Apologies - it hadn't clicked for me that you were using a standalone Editor and that was what the issue was before.
You have two ways in which you can define options for a standalone Editor:
options
property for the field,field().update()
to populate the options based an an array / object. That can be fetched by Ajax if you require.Allan
but i made a host dataTableStandalone as well (which eventually I will make hidden).Or do you mean it comes from the DataTable that has the Buttons that is calling the editor, which in this case is the Alerts datatable? code for both Alerts DataTable and StandAlone DataTable are posted above.
But, it sounds easier just to use the field().update() as you mentioned. But what is the syntax to use the results of an ajax code instead of hard coding the array?
oh, and you mention to use the options property, but I did (line 23 of the first chuck of code that I posted).
my posts above may be a little confusing as to what I have on my page:
1) DataTable (parent): EquipmentOnLoan
2) DataTable (child): EquipmentOnLoan_LoanRateLink which uses EquipmentOnLoan_LoanRateLinkController
with Editor: EquipmentOnLoan_LoanRateLinkEditor which uses EquipmentOnLoan_LoanRateLinkController
**** (the RateID options DO work in this Editor) ****
(this will be hidden, I just created it because I am thinking the child above does not get created until you click on the parent row)
3) DataTable: EquipmentOnLoanRateLinkTableStandalone which ALSO uses EquipmentOnLoan_LoanRateLinkController
with Editor EquipmentOnLoan_LoanRateLinkEditorStandalone which ALSO uses EquipmentOnLoan_LoanRateLinkController
**** (the RateID options does NOT work in this Editor) ****
4) DataTable: Alerts
has a create button which calls EquipmentOnLoan_LoanRateLinkEditorStandalone mentioned above
**** (the RateID options does NOT work in this Editor) ****
I hope this helps.
You are right - I misunderstood your team "standalone". In Editor's lexicon that mean that it is used without a DataTable.
I think realistically I'm going to need a link to a page showing the error to fully get an handle on this one please.
where
json
is an array of objects which containlabel
/value
properties.Thanks,
Allan
was the information sent via the debugger of any assistance?
Unfortunately no, in this case it doesn't provide enough information, since it only shows the Ajax that was loaded.
Actually, loading it now it is 404 so it must have timed out (although I thought I had a month delay on that...).
Allan
so here is my final code since i couldn't get the options to show correctly:
but, i still am not clear, with two editors using the same controller/json data, why does the select box options work in one but not the other.
I don't know why that would happen I'm afraid. I'd need a link to a page showing the issue to be able to diagnose it.
Allan
unfortunately it is on an intranet so I am not able to provide a link. I suppose I will have to just live with the extra ajax call to manually populate the options.