How to save Id for dijit.form.ComboBox - dojo

I'm writing my first dijit control for EPiServer. In my template I am using the dijit.form.ComboBox.
I have attached an event handler to the "onChange" event like so:
postCreate: function () {
// call base implementation
this.inherited(arguments);
// Init textarea and bind event
this.inputWidget.set("intermediateChanges", this.intermediateChanges);
this.inputWidget.set("store", this.store);
this.connect(this.inputWidget, "onChange", this._onInputWidgetChanged);
},
Then in my event handler I have:
_onInputWidgetChanged: function (e) {
alert(e.id);
this._updateValue(value);
},
My issue is that as with a typical dropdown list, I want to store the Value rather than the Text. The options in my combobox look like so:
Value | Text
1 | "Test"
2 | "A different test"
The problem is that the value passed into the _onInputWidgetChanged handler is always the text value of the combobox i.e. "Test" or "A different test"
How can I get access to the Value instead? As I said, this is the first time I have ever worked with dojo and dijit so I may be missing something fundamental here.
Thanks in advance
Al

The thing about ComboBox is that its value is not required to be an entry in the drop-down menu (and thus, not guaranteed to be one either). Think of it as a textbox with autosuggest - users can use the menu to expedite the process, but the value of the textbox is freeform and is reported as whatever the user types into it.
If you want users to be required to choose an entry from the menu, you should be using FilteringSelect instead, which will report the associated store item's ID (or associated option tag's value) as its value. As opposed to the free-form nature of ComboBox, FilteringSelect can be thought of as a menu with type-ahead functionality.

Related

Binding options dropdown filtering with textbox value in Google App Maker

Good day to all,
I need your help to binding an dropdown in Google App Maker.
I have 2 datasources, one for value and other for options and names. The problem is when I try to filter the dropbox with a textbox value.
in TextBox's onValueChange I put this code but it does not work.
var item = widget.parent.descendants;
app.datasources.Prycts_Cmpns.query.clearFilters();
app.models.FCTRSRCBDS.datasources.Prycts_Cmpns.query.filters.s_AliasCompany._contains=widget.value;
app.models.FCTRSRCBDS.datasources.Prycts_Cmpns.load();
the next code is the datasources options,value and names of the dropdown:
How i can filter this dropdown with the filter?
Thxs
I have a feeling, that
User enters some filter in TextBox
In onValueChange you call clearFilters what wipes user's input
You load Prycts_Cmpns datasource with no filters
So to fix this you can check that the TextBox is bound to app.models.FCTRSRCBDS.datasources.Prycts_Cmpns.query.filters.s_AliasCompany._contains and simplify onValueChnage event handler to this
// at this point filter's value should be already set by binding
app.models.FCTRSRCBDS.datasources.Prycts_Cmpns.load();

Save a user popup selection in a custom Automator Action

Using Xcode 5.* for a cocoa-applescript automator action.
Interface is a a simple popup menu that gets populated using an outlet with:
tell thePopupMenu to removeAllItems()
tell thePopupMenu to addItemsWithTitles_(theList)
When the action is used in a workflow (a Service actually), I want the next time it is run and the action dialog shows up (I will have "Options:Show when run" selected), I want the popup menu to change the selection to the last one that was selected. Right now, the default first item shows, even though last time it was run, the user selected a different item in the popup menu.
My thought was that I need to capture a change in the popup menu with a Sent Action handler, and then set some type of default. I have a working handler:
on thePopupMenuSentAction_(sender)
set popupValue to (popupSelectedValue of my parameters()) as string
-- save this selection somewhere???
end
What's the right way to save this? Do I use User Defaults? My Bindings are currenly all tied through Parameter object/controller. If I should use User Defaults, can someone give example code for setting up User Defaults, and then how to get and set a new value using Cocoa-Applescript?
If I can get the name string of the menu item saved somewhere, I can get the string and then change the selection of the popup menu in the
on opened {}
-- set up the action interface
end
handler which gets called just before the action is displayed each time.
Thanks for any help,
Joe
I did mine a bit differently. I will assume you are referring to what XCode calls a "pop up button" (somewhat misleading). I did not use the parameters at all, although that is probably better for larger projects. Have a look at the code:
script Insert_Picture_into_Powerpoint_Slide_Show
property parent : class "AMBundleAction"
property menuChoices : {"Insert a Beginning", "Insert at End"}
property menuSelection : missing value
if (menuSelection as string) is "missing value"
set menuSelection to 0 as integer -- sets default value
end if
end script
I bound Content Values to File's Owner and under Model Key Path I put menuChoices.
Then you just bind the Selected Index to File's Owner and for the Model Key Path type menuSelection.
Defaults
On the initial run, if the user does not click anything, the menuSelection will be missing value. Because I couldn't find a way around this, I created a conditional which tests for this and sets it to the first choice by default (the one that is shown when you add the action).
When the user selections one of the menu choices, the choice is remembered on sequential runs.

Formatting Dojo TextBox on the fly

I want to format the value of any type of TextBox, based on a pattern, on the fly. So basicly I mean when the user is typing '123' and my pattern is '0.00' it has to be converted directly to '1.23'. I know I can do this with the onChange function, but I guess there is already a Dojo based solution(not the onChange of a TextBox). Could someone tell me which property I have to use?
I've tried to use constraints and filter, but both only work after a blur event.
Widgets fire events on themselves that emulate the events of their DOM elements. For example a text box dijit will fire a change event on the object called "change".
There is also an replaceable function called "format" which, as the name suggests, formats the value of the text box.
see: http://dojotoolkit.org/api/?qs=1.9/dijit/form/_TextBoxMixin
As such you can do:
widget.format = function(value, constraints){ //my formatting fnc}
widget.on('change', function(){
widget.format();
});

updating fields via SharePoint Form and via List item event receiver

I am confused and cannot seem to find the right answer to this problem:
When I use the ItemUpdating method in the event receiver to update the field title as show in the code below it works, but other fields which I have changed via the "Edit Form" do not change. they remain as they are.
public override void ItemUpdating(SPItemEventProperties properties)
{
SPListitem item = properties.ListItem;
item["Title"] = "title has been changed";
item.Update();
}
if I put the above code in ItemUpdated it does not work, but the changes done via UI (edit form) take effect.
can anyone help me solve this problem?
thank you
Editing
Let me put it simply like this:
can anyone tell me how can I update one or multiple fields via Event Receiver and the other field(s) via the Edit Form of a list?
I hope this is clearer.
It is always best to use ItemUpdated in the event receiver to update a field in the list.
and also you must note that updating the field in the event receiver using
item.Update();
might cause some problems when you start workflow. You can use the following
ways to update multiple field.
base.EventFiringEnabled = false;
try
{
item.SystemUpdate(false);
}
finally
{
base.EventFiringEnabled = true;
}
break;
When using the ItemUpdating event, check the AfterProperties property of the properties parameter. It is a dictionary containing all the new values that the item will have. It contains raw values, though, all of them as strings, before being processed into the actual values you'll see when you fetch the item properties.
When you execute your code in the ItemUpdating event, what happens is this:
User clicks save;
ItemUpdating is fired and executes up to your call to Update().
At this point, your call to Update() fires another ItemUpdating event to the item. In the context it runs, no fields have changed other than Title.
Control returns to the method you overrode. The changes that were to be persisted to the item don't apply anymore.
And that's why you lose the changes made by the user.
When you use ItemUpdated instead, the changes made by the user are persisted because they are saved before you do anything. Then you call that Update() inside an ItemUpdated event. That one is either throwing a stack overflow exception silently or doing something else completely crazy, because you've created an infinite recursion loop there - and that's why you don't see it changing the title.
If you want to add extra changes to an item being saved by the UI, modify the AfterProperties property of properties instead of changing them directly in the item.

Gray out a form row's (detail's) button conditionally with VBA code

I have a standard form in MS-Access which lists a bunch of orders, and each row contains order no, customer, etc fields + a button to view notes and attached document files.
On request from our customer we should gray out the button btnAnm (or check or uncheck a checkbox) depending on a calculation from two queries to two other tables (a SELECT COUNT WHERE and a check if a text field is empty).
I've tried btnAnm_BeforeUpdate(...) and btnAnm_BeforeRender(...) and put breakpoints in the subs, but none of them trigger. The same if I use the control Ordernr instead of btnAnm.
I'd like a function in the Detail VBA code to be triggered for each "Me." (row) so to speak, and set the row's control's properties in that sub.
What do I do? I've looked at the help file and searched here.
*Edit: So I want to do something that "isn't made to work that way"? Ie. events are not triggered in Details.
As an alternative, could I base the value of a checkbox on each line on a query based on the 'Ordernr' field of the current row and the result of a SELECT COUNT from another table and empty field check?
Do I do this in the query the list is based on, or can I bind the extra checkbox field to a query?
A description of how to do this (combine a COUNT and a WHERE "not empty" to yes/no checkbox value) would be perfectly acceptable, I think! :)*
You cannot do much with an unbound control in a continuous form, anything you do will only apply to the current record. You can use a bound control with a click event so that it acts like a button.
Presumably the related documents have a reference to the order number that appears on your form, which means that you can create a control, let us call it CountOrders, with a ControlSource like so:
=DCount("OrderID","QueryName","OrderID=" & [OrderID])
The control can be hidden, or you can set it up to return true or False for use with a textbox, you can also use it for Conditional Formatting, but sadly, not for command buttons.
Expression Is [CountOrders]>0
You can also hide the contents and add a click event so that is acts in place of the command button. Conditional Formatting will allow you to enable or disable a textbox.
As I understand your question, you have a continuous form with as command button that appears on each row - and you'd like to enable/disable the button conditionally depending on the contents of the row.
Unfortunately you can't do that. It seems that you can't reference the individual command buttons separately.
Having wanted to do something similar in the past I came up with two alternate ways of setting up my interface.
Put a trap into the onClick code for the Button. Which is icky, because it is counter intuitive to the user. But it gets you that functionality now.
Move the command button (and editable fields) up into the form header, and make the rows read only. Your users then interact with the record only in the header, and select the record they want work with in the list below. As I recall this is known a Master-Detail interface.