<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to close in-panel custom widget from within onOpen()? in Web AppBuilder Custom Widgets Questions</title>
    <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773999#M1889</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Dear Robert,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you very much! You always save my day! It works!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Only I found that&amp;nbsp;in order to get the alert when I re-open the in-panel widget,&lt;/P&gt;&lt;P&gt;I have to reset "isOpening" inside setTimeout:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;onOpen: function () {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; if (!this.isOpening) {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.isOpening = true;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let missing = [];&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ... code lines to test parameters&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (missing.length !== 0) {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;let errMsg = `missing config param${missing.length &amp;gt; 1 ? "s" : ""}: ${missing.join(", ")}`;&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(errMsg);&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // code lines to do if parameteers are OK&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // close widget&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTimeout(lang.hitch(this, function () {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.isOpening = false;&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //PanelManager.getInstance().closePanel(this.id + '_panel');&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WidgetManager.getInstance().closeWidget(this); //best way to close&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }), 300);&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;}, // eof onOpen()&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So, now it works - thank you for explaining&amp;nbsp;that closing the widget from within onOpen() creates race conditions,&amp;nbsp;and for showing how to handle it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I may only ask, I wish to also get explanations:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;What is the function of "isOpening" property?&lt;/LI&gt;&lt;LI&gt;What exactly is the cause of the race conditions? and how does the setTimeout handle it?&lt;/LI&gt;&lt;LI&gt;Only in &lt;STRONG&gt;first&lt;/STRONG&gt; opening, I got my &lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;"exact expected behaviour"&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp;-&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;at first&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;, the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;widget icon shifts up,&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt; then,&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;I see the alert ,&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;then, &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;the widget icon shifts down&lt;BR /&gt;&lt;/SPAN&gt;&amp;nbsp;but in all successive openings,&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;first I see the alert, and only AFTER the alert, the widget icon shifts up, then shifts down.&lt;BR /&gt;So, In order to always get my&amp;nbsp;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;"exact expected behaviour"&lt;BR /&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp; &amp;nbsp; I had to "wrap" the whole contents of onOpen() inside an additional setTimeout (not shown in the above code).&lt;BR /&gt;I assume that this is connected smehow to the same race conditions?&lt;/LI&gt;&lt;LI&gt;Why if I use "&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;closePanel(this.id + '_panel')" &lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;instead of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&lt;EM&gt;closeWidget(this)&lt;/EM&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;,&lt;BR /&gt;I get an unwanted behaviour -&amp;nbsp;&lt;/SPAN&gt;I do see the alert only on &lt;STRONG&gt;each 2nd click&lt;/STRONG&gt; of the widget?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;With appreciation,&lt;/P&gt;&lt;P&gt;Michael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 10 Aug 2020 05:11:15 GMT</pubDate>
    <dc:creator>MichaelLev</dc:creator>
    <dc:date>2020-08-10T05:11:15Z</dc:date>
    <item>
      <title>How to close in-panel custom widget from within onOpen()?</title>
      <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773997#M1887</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;In &lt;STRONG&gt;in-panel&lt;/STRONG&gt; custom widget &lt;STRONG&gt;onOpen()&lt;/STRONG&gt; function, if some critical config aram is empty, I output alert,&lt;/P&gt;&lt;P&gt;then I want to close the widget (as if someone clicked the "x" button, or as I have not clicked to open it at all).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote:&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PanelManager.getInstance().closePanel(this.id + '_panel');&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;but it failed, maybe because I'm "inside" onOpen() ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My questions:&lt;/P&gt;&lt;P&gt;1. How to nicely close in-panel custom widget programatically from within onOpen()?&lt;/P&gt;&lt;P&gt;2. My first lines of onPen() are:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!this.isOpening) {&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.isOpening = true;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; Do I have to reset&amp;nbsp;&lt;SPAN&gt;this.isOpening to false before I close the widget?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;3. The code in WidgetManager.js id:&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;EM&gt;if (widget.state === 'closed') {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html.setStyle(widget.domNode, 'display', '');&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;widget.setState('opened');&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;widget.onOpen();&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (err) {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; console.error('fail to open widget ' + widget.name + '. ' + err.stack);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Should I exit onOpen() with exception and put the alert inside the Widgetmanager?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;4. I wish that the widget will really cose (the icon will go back downwards.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;5. I wish that I'll get the alert every time I click on the widget (not only in the first time).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Help will be greatly appreciated,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Michael&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 09 Aug 2020 16:26:38 GMT</pubDate>
      <guid>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773997#M1887</guid>
      <dc:creator>MichaelLev</dc:creator>
      <dc:date>2020-08-09T16:26:38Z</dc:date>
    </item>
    <item>
      <title>Re: How to close in-panel custom widget from within onOpen()?</title>
      <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773998#M1888</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Michael,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;Sounds like it may be a race condition (timing). You should try:&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="token function"&gt;setTimeout&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;lang&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;hitch&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;this&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;function&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
  PanelManager&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;getInstance&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;closePanel&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;this&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;id &lt;SPAN class="operator token"&gt;+&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'_panel'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;500&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;‍‍‍&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 08:40:13 GMT</pubDate>
      <guid>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773998#M1888</guid>
      <dc:creator>RobertScheitlin__GISP</dc:creator>
      <dc:date>2021-12-12T08:40:13Z</dc:date>
    </item>
    <item>
      <title>Re: How to close in-panel custom widget from within onOpen()?</title>
      <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773999#M1889</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Dear Robert,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you very much! You always save my day! It works!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Only I found that&amp;nbsp;in order to get the alert when I re-open the in-panel widget,&lt;/P&gt;&lt;P&gt;I have to reset "isOpening" inside setTimeout:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;onOpen: function () {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; if (!this.isOpening) {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.isOpening = true;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let missing = [];&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ... code lines to test parameters&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (missing.length !== 0) {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;let errMsg = `missing config param${missing.length &amp;gt; 1 ? "s" : ""}: ${missing.join(", ")}`;&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(errMsg);&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // code lines to do if parameteers are OK&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // close widget&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTimeout(lang.hitch(this, function () {&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.isOpening = false;&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //PanelManager.getInstance().closePanel(this.id + '_panel');&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WidgetManager.getInstance().closeWidget(this); //best way to close&lt;/EM&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }), 300);&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp; }&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;}, // eof onOpen()&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So, now it works - thank you for explaining&amp;nbsp;that closing the widget from within onOpen() creates race conditions,&amp;nbsp;and for showing how to handle it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I may only ask, I wish to also get explanations:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;What is the function of "isOpening" property?&lt;/LI&gt;&lt;LI&gt;What exactly is the cause of the race conditions? and how does the setTimeout handle it?&lt;/LI&gt;&lt;LI&gt;Only in &lt;STRONG&gt;first&lt;/STRONG&gt; opening, I got my &lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;"exact expected behaviour"&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp;-&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;at first&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;, the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;widget icon shifts up,&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt; then,&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;I see the alert ,&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;then, &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;the widget icon shifts down&lt;BR /&gt;&lt;/SPAN&gt;&amp;nbsp;but in all successive openings,&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;first I see the alert, and only AFTER the alert, the widget icon shifts up, then shifts down.&lt;BR /&gt;So, In order to always get my&amp;nbsp;&lt;SPAN style="color: #008000;"&gt;&lt;STRONG&gt;"exact expected behaviour"&lt;BR /&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&amp;nbsp; &amp;nbsp; I had to "wrap" the whole contents of onOpen() inside an additional setTimeout (not shown in the above code).&lt;BR /&gt;I assume that this is connected smehow to the same race conditions?&lt;/LI&gt;&lt;LI&gt;Why if I use "&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;closePanel(this.id + '_panel')" &lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;instead of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: #800000;"&gt;&lt;EM&gt;&lt;EM&gt;closeWidget(this)&lt;/EM&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;,&lt;BR /&gt;I get an unwanted behaviour -&amp;nbsp;&lt;/SPAN&gt;I do see the alert only on &lt;STRONG&gt;each 2nd click&lt;/STRONG&gt; of the widget?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;With appreciation,&lt;/P&gt;&lt;P&gt;Michael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Aug 2020 05:11:15 GMT</pubDate>
      <guid>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/773999#M1889</guid>
      <dc:creator>MichaelLev</dc:creator>
      <dc:date>2020-08-10T05:11:15Z</dc:date>
    </item>
    <item>
      <title>Re: How to close in-panel custom widget from within onOpen()?</title>
      <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/774000#M1890</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Michael,&lt;/P&gt;&lt;P&gt;1. Q:&amp;nbsp;&lt;SPAN style="background-color: #ffffff;"&gt;What is the function of "isOpening" property? &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;&amp;nbsp; &amp;nbsp; A: I have not used that property before.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;2. Q:&amp;nbsp;&lt;SPAN&gt;What exactly is the cause of the race conditions? and how does the setTimeout handle it?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;A: Your code is requesting that the widget is to be closed before something (not sure what) is completed in the widgets code or base code is complete. Using the timeout causes the request to close to delay for so many milliseconds thus allowing what ever the race condition is to be resolved.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;3. Q: ....&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;&amp;nbsp; &amp;nbsp; A: widget shifting up and down... Are you using the launchpad theme? Again this is a timing issue and using an alert is a modal type dialog and thus blocks user interaction with the app. I normally use the jimu message dijit instead.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;4. Q:&amp;nbsp;Why if I use "closePanel(this.id + '_panel')" instead of closeWidget(this),&lt;BR /&gt;I get an unwanted behavior - I do see the alert only on each 2nd click of the widget?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff;"&gt;&amp;nbsp; &amp;nbsp; A: I am not sure. I have always had the exact opposite experience. Using closeWidget would sometimes remove the widget but leave the panel still open.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Aug 2020 15:55:51 GMT</pubDate>
      <guid>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/774000#M1890</guid>
      <dc:creator>RobertScheitlin__GISP</dc:creator>
      <dc:date>2020-08-10T15:55:51Z</dc:date>
    </item>
    <item>
      <title>Re: How to close in-panel custom widget from within onOpen()?</title>
      <link>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/774001#M1891</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Many thanks, Robert, for enlightening my eyes!&lt;/P&gt;&lt;P&gt;Michael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Aug 2020 16:06:08 GMT</pubDate>
      <guid>https://community.esri.com/t5/web-appbuilder-custom-widgets-questions/how-to-close-in-panel-custom-widget-from-within/m-p/774001#M1891</guid>
      <dc:creator>MichaelLev</dc:creator>
      <dc:date>2020-08-10T16:06:08Z</dc:date>
    </item>
  </channel>
</rss>

