cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
DianaBirkelbach
Most Valuable Professional
Most Valuable Professional

Which event for notifyOutputChanged

When we have a Textarea PCF control, we can call notifyOutputChanged on the events: "input" or "change" . What's the best practice for that?

If we choose "input", the control will trigger it's own updateView() for every character we type; it doesn't seem to be a good way.

If we choose "change", it will call the notifyOutputChanged only if the textarea looses focus, but when the autosave is triggered before the user leaves the input, the updateView() will be triggered with a old value, and he looses the text he typed.

Kind regards,
Diana
----------
Please click "Accept as Solution" if my post answered your question so that others may find it more quickly. If you found this post helpful consider giving it a "Thumbs Up."
13 REPLIES 13
ben-thompson
Memorable Member
Memorable Member

I've just checked what I do in one of the textarea controls I have and it's called on mouse leave.

 

It's probably worth saying that we don't use a textarea input control, instead we use an editable div which we set to contentEditable=true onMouseEnter and to false when onMouseLeave at which point we also call notifyOutputChanged

---
If this post has answered your question please consider it for "Accept as Solution" or if it has been helpful give it a "Thumbs Up".
DianaBirkelbach
Most Valuable Professional
Most Valuable Professional

Thank you @ben-thompson for the fast answer.

But if I understand right, you must have the same problem.

To reproduce it, edit another field on the form, just to get the form dirty, then start to edit in your div, and don't leave the div, just wait for the autosave. Then the content edited will be deleted, because the updateView() is called with the old value.

In updateView we have to change the value of the input, because somebody else might have changed the value using the from sdk (outside the control, using attribute.setValue()), so we have to reflect this change.

A workarround would be to check in updateView() to see if the value that we get is different than the last values that we set in getOutputs(), but that's not really right, since somebody might really want to change the value back, using the attribute.setValue().

So it seems to me that we are forced to report every change instantly by calling notifyOutputChanged, which will call again the updateView() method. 

I'm not sure if I can explain what happens. I'll attach a short video about this issue. 

 

Kind regards,
Diana
----------
Please click "Accept as Solution" if my post answered your question so that others may find it more quickly. If you found this post helpful consider giving it a "Thumbs Up."

In which case I can't help

 

I'm using a recentish environment (created this month but not upgraded to wave 1) and autosave is enabled but I can't reproduce the issue as the autosave functionality doesn't seem to be working.  Granted the form does contain 4 different PCF controls but I don't think any of those are the issue. 

 

Now I would be concerned by that but in April the save button appears so the interface is better.

 

---
If this post has answered your question please consider it for "Accept as Solution" or if it has been helpful give it a "Thumbs Up".

Scrap that I left it open for 5 minutes and it did autosave without losing data - so I wonder if the issue is that you are using a textarea which is an input field and we use editable Divs with the value stored in the background in a javascript variable.

 

Looking at the updateview routine we have - we store the raw parameter value in a separate variable and check it every time the routine is called - if the value changes we update the text within the Div otherwise we leave it as is.

---
If this post has answered your question please consider it for "Accept as Solution" or if it has been helpful give it a "Thumbs Up".
DianaBirkelbach
Most Valuable Professional
Most Valuable Professional

Thanks @ben-thompson ! It's a awesome community here! 

Lucky you that it works! 😉 

But then you implemented already one of the workarrounds: you check if the value is a new one, and if it's the value that you already knew, you ignore that: so you ignore the refresh after the autosave.

That would work in most of the cases, but there could happen that the form scripting is calling attribute.setValue(oldValue) in the meanwhile. You would ignore that, right? I agree that won't happen a lot (maybe never), but maybe a plugin sets the value back, and you'll ignore it.  🤔 

 

In case it helps somebody else, I have now an implementation using an "input" event (to save internal the value), and there I debounce the "notifyOutputChanged" (so it will trigger only once in 250 ms). 

 

Seems that both solutions are workarrounds. 

 

 

Kind regards,
Diana
----------
Please click "Accept as Solution" if my post answered your question so that others may find it more quickly. If you found this post helpful consider giving it a "Thumbs Up."

To be honest my viewpoint is that autosave is more trouble than it's worth - come April I will be doing everything I can to disable it..

 

What I care about is that the user interface works the way users would expect it to which means that the form should be displaying exactly what the user expects. So the only time we would update a field within the PCF control is if another control on the form triggered. 

 

For a lot of our cases that's easy as we are using PCF controls to avoid on page scripting - say field 2 is an (attribute list) attached to field 1 (entity list) so when field 1 changes we reset field 2 and update the options to reflect that change but outside of that you really should be ignoring any value changes - the logic really should be set value on first pass of updateview and ignore that part of the code on subsequent runs. 

---
If this post has answered your question please consider it for "Accept as Solution" or if it has been helpful give it a "Thumbs Up".
DianaBirkelbach
Most Valuable Professional
Most Valuable Professional

Thanks again @ben-thompson . You're right. Actually registering on "input" doesn't work as I thought, since between the autosave start and the moment the form is refreshed, there are a few milliseconds, while the user is typing, so he would lose some chars.

 

I'll use the workarround  you suggested:  I register on "change" of the input, and in updateView() I ignore the value if it's the old one. So using this workarround the value is not lost after autosave, but it's still not saved until the user change the focus outside the control. So if another script on the form is navigating away or closing the window, the user loses the introduced text.
But I've checked: an out-of-the-box control doesn't their values, they automatically save it somehow. Since I have no influence on the other scripts in the form, I have to be sure that I don't lose the introduced data .

 

I've made a test by defining in the console the following function (it only saves the form if necessary, and closes the form). I try to simulate another scripts running on the form:

function checkSavingOnLeave(fieldName){
 const value = Xrm.Page.getAttribute(fieldName).getValue();
 console.log(`value at start: ${value}`);
 window.setTimeout( async () => {
    console.log(Xrm.Page.getAttribute(fieldName).getValue());
    console.log(`dirty: ${Xrm.Page.data.getIsDirty()}`);
    const saved = !Xrm.Page.data.getIsDirty() || await Xrm.Page.data.save();
    if(saved===true) {
      console.log(`value before close: ${Xrm.Page.getAttribute(fieldName).getValue()}`);
      Xrm.Page.ui.close();
    }
    else
       console.log("not saved");
 }, 7000);
}

 So I call the function for my pcf control (while the form is not dirty) then I go to my PCF control and I change the text, but don't leave the control for a few seconds, until my script is triggered.

I get this console output:

checkSavingOnLeave("orb_textarea")
value at start: PCF
PCF
dirty: false
value before close: PCF

The form didn't get the change, it gets closed, but the text I typed is lost.

 

If I call the same function for a standard input control (like the name control) I get the same log

checkSavingOnLeave("orb_name")
value at start: PCF
PCF
dirty: false
value before close: PCF

The difference is that the orb_name (which is a standard control) doesn't loose the changed text, even if the value after the Xrm.Page.data.save() is still the old one, while my PCF control loses the changed text.

 

Here is my updateView(), in case I do something wrong:

	public updateView(context: ComponentFramework.Context<IInputs>): void
	{						
		const maybeNewValue = context.parameters.myTextarea.raw || "";		
		if(maybeNewValue!== this.value){
			this._inputWindowElement.value = maybeNewValue;	
			this.value = maybeNewValue;			
			console.log(`value set to ${maybeNewValue}`);
		}
		this._inputWindowElement.disabled = context.mode.isControlDisabled;		
	}

 

This is not a problem related only to textarea, it happens also with a text input.
It's a very simple example of PCF control: just an input control, nothing fancy. Since the standard controls are made using the same framework, Microsoft must have a solution for that already. Maybe somebody from the team can help me...

 

 

 

 

Kind regards,
Diana
----------
Please click "Accept as Solution" if my post answered your question so that others may find it more quickly. If you found this post helpful consider giving it a "Thumbs Up."

Thanks for the inputs and great discussion on this.

 

I reached out to the engineering team and we have some investigations done. We are evaluating whats the best way to handle this from UCI and form/PCF infra perspective.

 

One item which we are looking into is to NOT call update on the control via auto-save if the value for that control has not change (tracked by internal bug id 1739331).  Will keep this thread posted on updates.

 

Hemant Gaur

DianaBirkelbach
Most Valuable Professional
Most Valuable Professional

Thank you very much to all who are helping us. Is a great community.

 @HemantG  Yes, would be great to have this solution: not to call updateView after auto-save.

I just tried my PCF control in a CanvasApp, and the solution that I thought it worked in Model-Driven apps (use the onInput event, so basically only when the user leaves the input) doesn't work in CanvasApps. There we have to implement a Patch requests (since it cannot be integrated in the EditForm-Submit process), and the moment the user clicks the Save Button, the "input" event was not  triggered already (if the user goes directly from the input to the save button), and he loses the data.

So the solution you and the engineers figured out, might be the only way if we want the control to work both in model-driven and canvas apps.

Best regards,

Diana

Kind regards,
Diana
----------
Please click "Accept as Solution" if my post answered your question so that others may find it more quickly. If you found this post helpful consider giving it a "Thumbs Up."

Helpful resources

Announcements

Check out the Copilot Studio Cookbook today!

We are excited to announce our new Copilot Cookbook Gallery in the Copilot Studio Community. We can't wait for you to share your expertise and your experience!    Join us for an amazing opportunity where you'll be one of the first to contribute to the Copilot Cookbook—your ultimate guide to mastering Microsoft Copilot. Whether you're seeking inspiration or grappling with a challenge while crafting apps, you probably already know that Copilot Cookbook is your reliable assistant, offering a wealth of tips and tricks at your fingertips--and we want you to add your expertise. What can you "cook" up?   Click this link to get started: https://aka.ms/CS_Copilot_Cookbook_Gallery   Don't miss out on this exclusive opportunity to be one of the first in the Community to share your app creation journey with Copilot. We'll be announcing a Cookbook Challenge very soon and want to make sure you one of the first "cooks" in the kitchen.   Don't miss your moment--start submitting in the Copilot Cookbook Gallery today!     Thank you,  Engagement Team

Announcing Power Apps Copilot Cookbook Gallery

We are excited to share that the all-new Copilot Cookbook Gallery for Power Apps is now available in the Power Apps Community, full of tips and tricks on how to best use Microsoft Copilot as you develop and create in Power Apps. The new Copilot Cookbook is your go-to resource when you need inspiration--or when you're stuck--and aren't sure how to best partner with Copilot while creating apps.   Whether you're looking for the best prompts or just want to know about responsible AI use, visit Copilot Cookbook for regular updates you can rely on--while also serving up some of your greatest tips and tricks for the Community. Check Out the new Copilot Cookbook for Power Apps today: Copilot Cookbook - Power Platform Community.  We can't wait to see what you "cook" up!      

Tuesday Tip | How to Report Spam in Our Community

It's time for another TUESDAY TIPS, your weekly connection with the most insightful tips and tricks that empower both newcomers and veterans in the Power Platform Community! Every Tuesday, we bring you a curated selection of the finest advice, distilled from the resources and tools in the Community. Whether you’re a seasoned member or just getting started, Tuesday Tips are the perfect compass guiding you across the dynamic landscape of the Power Platform Community.   As our community family expands each week, we revisit our essential tools, tips, and tricks to ensure you’re well-versed in the community’s pulse. Keep an eye on the News & Announcements for your weekly Tuesday Tips—you never know what you may learn!   Today's Tip: How to Report Spam in Our Community We strive to maintain a professional and helpful community, and part of that effort involves keeping our platform free of spam. If you encounter a post that you believe is spam, please follow these steps to report it: Locate the Post: Find the post in question within the community.Kebab Menu: Click on the "Kebab" menu | 3 Dots, on the top right of the post.Report Inappropriate Content: Select "Report Inappropriate Content" from the menu.Submit Report: Fill out any necessary details on the form and submit your report.   Our community team will review the report and take appropriate action to ensure our community remains a valuable resource for everyone.   Thank you for helping us keep the community clean and useful!

Community Roundup: A Look Back at Our Last 10 Tuesday Tips

As we continue to grow and learn together, it's important to reflect on the valuable insights we've shared. For today's #TuesdayTip, we're excited to take a moment to look back at the last 10 tips we've shared in case you missed any or want to revisit them. Thanks for your incredible support for this series--we're so glad it was able to help so many of you navigate your community experience!   Getting Started in the Community An overview of everything you need to know about navigating the community on one page!  Community Links: ○ Power Apps ○ Power Automate  ○ Power Pages  ○ Copilot Studio    Community Ranks and YOU Have you ever wondered how your fellow community members ascend the ranks within our community? We explain everything about ranks and how to achieve points so you can climb up in the rankings! Community Links: ○ Power Apps ○ Power Automate  ○ Power Pages  ○ Copilot Studio    Powering Up Your Community Profile Your Community User Profile is how the Community knows you--so it's essential that it works the way you need it to! From changing your username to updating contact information, this Knowledge Base Article is your best resource for powering up your profile. Community Links: ○ Power Apps ○ Power Automate  ○ Power Pages  ○ Copilot Studio    Community Blogs--A Great Place to Start There's so much you'll discover in the Community Blogs, and we hope you'll check them out today!  Community Links: ○ Power Apps ○ Power Automate  ○ Power Pages  ○ Copilot Studio    Unlocking Community Achievements and Earning Badges Across the Communities, you'll see badges on users profile that recognize and reward their engagement and contributions. Check out some details on Community badges--and find out more in the detailed link at the end of the article! Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio    Blogging in the Community Interested in blogging? Everything you need to know on writing blogs in our four communities! Get started blogging across the Power Platform communities today! Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio   Subscriptions & Notifications We don't want you to miss a thing in the community! Read all about how to subscribe to sections of our forums and how to setup your notifications! Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio   Getting Started with Private Messages & Macros Do you want to enhance your communication in the Community and streamline your interactions? One of the best ways to do this is to ensure you are using Private Messaging--and the ever-handy macros that are available to you as a Community member! Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio   Community User Groups Learn everything about being part of, starting, or leading a User Group in the Power Platform Community. Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio   Update Your Community Profile Today! Keep your community profile up to date which is essential for staying connected and engaged with the community. Community Links: ○ Power Apps  ○ Power Automate  ○ Power Pages  ○ Copilot Studio   Thank you for being an integral part of our journey.   Here's to many more Tuesday Tips as we pave the way for a brighter, more connected future! As always, watch the News & Announcements for the next set of tips, coming soon!

Hear what's next for the Power Up Program

Hear from Principal Program Manager, Dimpi Gandhi, to discover the latest enhancements to the Microsoft #PowerUpProgram, including a new accelerated video-based curriculum crafted with the expertise of Microsoft MVPs, Rory Neary and Charlie Phipps-Bennett. If you’d like to hear what’s coming next, click the link below to sign up today! https://aka.ms/PowerUp  

Welcome to the Power Apps Community

Welcome! Congratulations on joining the Microsoft Power Apps community! You are now a part of a vibrant group of peers and industry experts who are here to network, share knowledge, and even have a little fun! Now that you are a member, you can enjoy the following resources:   The Microsoft Power Apps Community Forums If you are looking for support with any part of Microsoft Power Apps, our forums are the place to go. They are titled "Get Help with Microsoft Power Apps " and there you will find thousands of technical professionals with years of experience who are ready and eager to answer your questions. You now have the ability to post, reply and give "kudos" on the Power Apps community forums! Make sure you conduct a quick search before creating a new post because your question may have already been asked and answered!   Microsoft Power Apps IdeasDo you have an idea to improve the Microsoft Power Apps experience, or a feature request for future product updates? Then the "Power Apps Ideas" section is where you can contribute your suggestions and vote for ideas posted by other community members. We constantly look to the most voted Ideas when planning updates, so your suggestions and votes will always make a difference.   Community Blog & NewsOver the years, more than 600 Power Apps Community Blog Articles have been written and published by our thriving community. Our community members have learned some excellent tips and have keen insights on building Power Apps. On the Power Apps Community Blog, read the latest Power Apps related posts from our community blog authors around the world. Let us know if you would like to become an author and contribute your own writing — everything Power Apps related is welcome!   Power Apps Samples, Learning and Videos GalleriesOur galleries have a little bit of everything to do with Power Apps. Our galleries are great for finding inspiration for your next app or component. You can view, comment and kudo the apps and component gallery to see what others have created! Or share Power Apps that you have created with other Power Apps enthusiasts. Along with all of that awesome content, there is the Power Apps Community Video & MBAS gallery where you can watch tutorials and demos by Microsoft staff, partners, and community gurus in our community video gallery.   Again, we are excited to welcome you to the Microsoft Power Apps community family! Whether you are brand new to the world of process automation or you are a seasoned Power Apps veteran. Our goal is to shape the community to be your ‘go to’ for support, networking, education, inspiration and encouragement as we enjoy this adventure together!   Let us know in the Community Feedback if you have any questions or comments about your community experience.To learn more about the community and your account be sure to visit our Community Support Area boards to learn more! We look forward to seeing you in the Power Apps Community!The Power Apps Team

Users online (6,420)