@spfx-extensions/package 1.4.25 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/config/package-solution.json +2 -2
  2. package/dist/8d1029da-85e6-48cc-aaaf-37a5bbc0b9be.manifest.json +2 -2
  3. package/dist/d6ca1fc2-0591-4c6d-8a25-cae3262c017b.manifest.json +7 -2
  4. package/dist/debug/83e13c11-682e-4eaa-9ae0-74617ca28f96/Extension_8d1029da-85e6-48cc-aaaf-37a5bbc0b9be.xml +1 -1
  5. package/dist/debug/83e13c11-682e-4eaa-9ae0-74617ca28f96/WebPart_d6ca1fc2-0591-4c6d-8a25-cae3262c017b.xml +1 -1
  6. package/dist/debug/AppManifest.xml +1 -1
  7. package/dist/debug/ClientSideAssets/spfx-extension-application-customizer_1ed614b7d2607a62ce4e.js +1 -0
  8. package/dist/debug/ClientSideAssets/spfx-extension-core.js +1 -1
  9. package/dist/debug/ClientSideAssets/spfx-extension-coreconfigurator.js +60 -60
  10. package/dist/{spfx-extension-loader_1a88c5c5336cafaa736d.js → debug/ClientSideAssets/spfx-extension-loader_e83dead2a8f8f000d374.js} +1 -1
  11. package/dist/debug/ClientSideAssets/spfx-extensionloader-web-part_1ca10faea5832c6d6178.js +3 -0
  12. package/dist/debug/ClientSideAssets.xml +1 -1
  13. package/dist/debug/ClientSideAssets.xml.config.xml +1 -1
  14. package/dist/debug/_rels/ClientSideAssets.xml.rels +1 -1
  15. package/dist/debug/feature_83e13c11-682e-4eaa-9ae0-74617ca28f96.xml +1 -1
  16. package/dist/debug/feature_83e13c11-682e-4eaa-9ae0-74617ca28f96.xml.config.xml +1 -1
  17. package/dist/deploy/sp-fx-extensions.sppkg +0 -0
  18. package/dist/spfx-extension-application-customizer_1ed614b7d2607a62ce4e.js +1 -0
  19. package/dist/spfx-extension-core.js +1 -1
  20. package/dist/spfx-extension-coreconfigurator.js +60 -60
  21. package/dist/{debug/ClientSideAssets/spfx-extension-loader_1a88c5c5336cafaa736d.js → spfx-extension-loader_e83dead2a8f8f000d374.js} +1 -1
  22. package/dist/spfx-extensionloader-web-part_1ca10faea5832c6d6178.js +3 -0
  23. package/package.json +2 -2
  24. package/src/webparts/spfxExtensionloader/SpfxExtensionloaderWebPart.ts +225 -149
  25. package/dist/debug/ClientSideAssets/spfx-extension-application-customizer_493714911b44aed8a076.js +0 -1
  26. package/dist/debug/ClientSideAssets/spfx-extensionloader-web-part_0b7cf417167f9364b2df.js +0 -3
  27. package/dist/spfx-extension-application-customizer_493714911b44aed8a076.js +0 -1
  28. package/dist/spfx-extensionloader-web-part_0b7cf417167f9364b2df.js +0 -3
@@ -1,3 +1,3 @@
1
- "use strict";(self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674=self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674||[]).push([[548],{364:(e,t,n)=>{n.d(t,{initCore:()=>p});var a=n(367),{getPrototypeOf:i,defineProperty:r,getOwnPropertyNames:o}=(Object.create,Object);Object.prototype.hasOwnProperty;const s=n.p+"spfx-extension-core.js?v=24d1a1573376c6d52f3b",c=n.p+"spfx-extension-coreconfigurator.js?v=3713f3ee7341102343a6",d=n.p+"spfx-extension-wrapper.js?v=eac83830b8c1e249f52c";let l,u=!1;async function f(){return Promise.resolve({coreUrl:s,configuratorUrl:c,wrapperUrl:d})}async function p(e,t,n){if(!l){const t="2025-07-17T12:05:13.203Z";console.info(a.Lf,"Initializing Core from SPFx Built:",t),l=async function(e,t){if(window.__SPFxExtensions?.__CorePromise)return window.__SPFxExtensions.__CorePromise;!function(e){if(!window.__SPFxExtensions){let{promise:e,resolve:t}=Promise.withResolvers();window.__SPFxExtensions={__CorePromise:e,__CorePromiseResolver:t}}if(!window.__SPFxExtensions.Utils){let{promise:t,resolve:n}=Promise.withResolvers(),{promise:a,resolve:i}=Promise.withResolvers();window.__SPFxExtensions.Utils={environmentType:e,initializedThroughSPFX:true,placeHolderProviderPromise:t,placeHolderResolver:n,appManifestPromises:[],spAppInitializationPromise:a,spAppInitializationPromiseResolver:i,fluentIconsInitialized:!1,ConfiguratorPageUrl:"/sites/appcatalog/SPFxExtensionsData/SitePages/SPFxExtensionsConfigurator.aspx"}}}(t);let n=await async function(e){let t=Number(localStorage.getItem("SPFXEXT")),n={core:"",configuratorUrl:""};if(t>0){let e=Date.now();return n.core=`https://localhost:${t}/__spfxCore.js?v=${e}`,n.configuratorUrl=`https://localhost:${t}/__spfxCoreConfigurator.js?v=${e}`,n}let{coreUrl:a,configuratorUrl:i}=await e();if(!a)throw new Error("[SPFxExtensions/Core] Unable to resolve SPFx Core location");if(!i)throw new Error("[SPFxExtensions/Core] Unable to resolve SPFx Core Configurator location");return n.core=a,n.configuratorUrl=i,console.info("[SPFxExtensions/Core]","Core location resolved to",n),n}(e);window.__SPFxExtensions.__ConfiguratorUrl=n.configuratorUrl;let a=document.createElement("script");return a.src=n.core,a.type="module",a.addEventListener("error",e=>{console.error("[SPFxExtensions/Core]","Catastrophic failure, cannot load SPFxExtensions Core from",n,e)}),document.head.appendChild(a),window.__SPFxExtensions.__CorePromise}(f,e)}await l,window.__SPFxExtensions.Utils&&!window.__SPFxExtensions.Utils.initializedThroughSPFX&&(window.__SPFxExtensions.Utils.environmentType=e,window.__SPFxExtensions.Utils.initializedThroughSPFX=!0),!u&&t&&n&&(u=!0,window.__SPFxExtensions.Utils.placeHolderResolver({placeHolderProvider:t,eventObserver:n}))}}
1
+ "use strict";(self.webpackJsonp_6cc779ad78b22e0ab7384b402525e382=self.webpackJsonp_6cc779ad78b22e0ab7384b402525e382||[]).push([[548],{364:(e,t,n)=>{n.d(t,{initCore:()=>p});var a=n(367),{getPrototypeOf:i,defineProperty:r,getOwnPropertyNames:o}=(Object.create,Object);Object.prototype.hasOwnProperty;const s=n.p+"spfx-extension-core.js?v=8055e590c853bedb98c4",c=n.p+"spfx-extension-coreconfigurator.js?v=05c161bd2996e54939f4",d=n.p+"spfx-extension-wrapper.js?v=eac83830b8c1e249f52c";let l,u=!1;async function f(){return Promise.resolve({coreUrl:s,configuratorUrl:c,wrapperUrl:d})}async function p(e,t,n){if(!l){const t="2025-08-06T22:21:03.179Z";console.info(a.Lf,"Initializing Core from SPFx Built:",t),l=async function(e,t){if(window.__SPFxExtensions?.__CorePromise)return window.__SPFxExtensions.__CorePromise;!function(e){if(!window.__SPFxExtensions){let{promise:e,resolve:t}=Promise.withResolvers();window.__SPFxExtensions={__CorePromise:e,__CorePromiseResolver:t}}if(!window.__SPFxExtensions.Utils){let{promise:t,resolve:n}=Promise.withResolvers(),{promise:a,resolve:i}=Promise.withResolvers();window.__SPFxExtensions.Utils={environmentType:e,initializedThroughSPFX:true,placeHolderProviderPromise:t,placeHolderResolver:n,appManifestPromises:[],spAppInitializationPromise:a,spAppInitializationPromiseResolver:i,fluentIconsInitialized:!1,ConfiguratorPageUrl:"/sites/appcatalog/SPFxExtensionsData/SitePages/SPFxExtensionsConfigurator.aspx"}}}(t);let n=await async function(e){let t=Number(localStorage.getItem("SPFXEXT")),n={core:"",configuratorUrl:""};if(t>0){let e=Date.now();return n.core=`https://localhost:${t}/__spfxCore.js?v=${e}`,n.configuratorUrl=`https://localhost:${t}/__spfxCoreConfigurator.js?v=${e}`,n}let{coreUrl:a,configuratorUrl:i}=await e();if(!a)throw new Error("[SPFxExtensions/Core] Unable to resolve SPFx Core location");if(!i)throw new Error("[SPFxExtensions/Core] Unable to resolve SPFx Core Configurator location");return n.core=a,n.configuratorUrl=i,console.info("[SPFxExtensions/Core]","Core location resolved to",n),n}(e);window.__SPFxExtensions.__ConfiguratorUrl=n.configuratorUrl;let a=document.createElement("script");return a.src=n.core,a.type="module",a.addEventListener("error",e=>{console.error("[SPFxExtensions/Core]","Catastrophic failure, cannot load SPFxExtensions Core from",n,e)}),document.head.appendChild(a),window.__SPFxExtensions.__CorePromise}(f,e)}await l,window.__SPFxExtensions.Utils&&!window.__SPFxExtensions.Utils.initializedThroughSPFX&&(window.__SPFxExtensions.Utils.environmentType=e,window.__SPFxExtensions.Utils.initializedThroughSPFX=!0),!u&&t&&n&&(u=!0,window.__SPFxExtensions.Utils.placeHolderResolver({placeHolderProvider:t,eventObserver:n}))}}
2
2
  ,367:(e,t,n)=>{n.d(t,{Bc:()=>r,Lf:()=>o,Ne:()=>a,oz:()=>i});const a="Select one of these web parts for this column.",i="Edit page and select webpart.",r="Webpart that loads an app of your choice.",o="[SPFxExtensions]"}
3
3
  }]);
@@ -0,0 +1,3 @@
1
+ (()=>{var e=document.currentScript;define(["@microsoft/sp-core-library","@microsoft/sp-property-pane","@microsoft/sp-webpart-base","@microsoft/sp-component-base"],(t,n,a,i)=>(()=>{"use strict";var r,o,s,c={367:(e,t,n)=>{n.d(t,{Bc:()=>r,Lf:()=>o,Ne:()=>a,oz:()=>i});const a="Select one of these web parts for this column.",i="Edit page and select webpart.",r="Webpart that loads an app of your choice.",o="[SPFxExtensions]"}
2
+ ,574:(e,t,n)=>{n.r(t),n.d(t,{default:()=>b});var a,i,r=function(){return r=Object.assign||function(e){for(var t,n=1,a=arguments.length;n<a;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},r.apply(this,arguments)};!function(e){e[e.sync=0]="sync",e[e.async=1]="async"}(a||(a={})),function(e){e[e.onlyThemable=1]="onlyThemable",e[e.onlyNonThemable=2]="onlyNonThemable",e[e.all=3]="all"}(i||(i={}));var o,s,c,d="undefined"==typeof window?n.g:window,l=d&&d.CSPSettings&&d.CSPSettings.nonce,u=((c=d.__themeState__||{theme:void 0,lastStyleElement:void 0,registeredStyles:[]}).runState||(c=r(r({},c),{perf:{count:0,duration:0},runState:{flushTimer:0,mode:a.sync,buffer:[]}})),c.registeredThemableStyles||(c=r(r({},c),{registeredThemableStyles:[]})),d.__themeState__=c,c),f=/[\'\"]\[theme:\s*(\w+)\s*(?:\,\s*default:\s*([\\"\']?[\.\,\(\)\#\-\s\w]*[\.\,\(\)\#\-\w][\"\']?))?\s*\][\'\"]/g,p=function(){return"undefined"!=typeof performance&&performance.now?performance.now():Date.now()};function m(e){var t=p();e();var n=p();u.perf.duration+=n-t}function _(e,t){u.loadStyles?u.loadStyles(h(e).styleString,e):function(e){if("undefined"!=typeof document){var t=document.getElementsByTagName("head")[0],n=document.createElement("style"),a=h(e),i=a.styleString,r=a.themable;n.setAttribute("data-load-themed-styles","true"),l&&n.setAttribute("nonce",l),n.appendChild(document.createTextNode(i)),u.perf.count++,t.appendChild(n);var o=document.createEvent("HTMLEvents");o.initEvent("styleinsert",!0,!1),o.args={newStyle:n},document.dispatchEvent(o);var s={styleElement:n,themableStyle:e};r?u.registeredThemableStyles.push(s):u.registeredStyles.push(s)}}(e)}function h(e){var t=u.theme,n=!1;return{styleString:(e||[]).map(function(e){var a=e.theme;if(a){n=!0;var i=t?t[a]:void 0,r=e.defaultValue||"inherit";return t&&!i&&console,i||r}return e.rawString}).join(""),themable:n}}o='.spfxExtensionloader_be4e0fd1{color:"[theme:bodyText, default: #323130]";color:var(--bodyText);overflow:hidden;padding:1em}.spfxExtensionloader_be4e0fd1.teams_be4e0fd1{font-family:Segoe UI,-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif}.welcome_be4e0fd1{text-align:center}.welcomeImage_be4e0fd1{max-width:420px;width:100%}.links_be4e0fd1 a{color:"[theme:link, default:#03787c]";color:var(--link);text-decoration:none}.links_be4e0fd1 a:hover{color:"[theme:linkHovered, default: #014446]";color:var(--linkHovered);text-decoration:underline}.SPFxExtensionApp_be4e0fd1 .loader_be4e0fd1{animation:rotation_be4e0fd1 1s linear infinite;border:2px solid #003755;border-bottom-color:#009fda;border-radius:50%;box-sizing:border-box;display:inline-block;height:28px;width:28px}@keyframes rotation_be4e0fd1{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.SPFxExtensionApp_be4e0fd1 .buttonLoader_be4e0fd1{align-items:center;border:none;display:flex;height:80px;justify-content:center;width:120px}.SPFxExtensionApp_be4e0fd1 .shimmerShine_be4e0fd1{-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:placeholderShimmer_be4e0fd1;-webkit-animation-timing-function:linear;background:#f6f7f8;background-image:linear-gradient(90deg,#f6f7f8 0,#edeef1 20%,#f6f7f8 40%,#f6f7f8);background-repeat:no-repeat;background-size:200px 80px;border:none;display:block;height:80px;position:relative;width:120px}@keyframes placeholderShimmer_be4e0fd1{0%{background-position:-80px 0}to{background-position:120px 0}}.SPFxExtensionApp_be4e0fd1 .applicationListSection_be4e0fd1{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:center;min-height:320px;text-align:center}.SPFxExtensionApp_be4e0fd1 .header_be4e0fd1{color:#242424;font-weight:600;letter-spacing:1px;line-height:32px;padding:0 12px}.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1{font-size:28px;font-style:normal;height:28px;line-height:28px;min-width:28px;width:28px}.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1>img,.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1>svg{height:auto;width:100%}.SPFxExtensionApp_be4e0fd1 .iconFont_be4e0fd1{background-color:#f6f7f8}.SPFxExtensionApp_be4e0fd1 .appButtonsContainer_be4e0fd1{align-items:center;display:flex;flex-wrap:wrap;height:100%;justify-content:center}.SPFxExtensionApp_be4e0fd1 .appButtonsWrapper_be4e0fd1{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;height:100%;justify-content:flex-start;width:100%}.SPFxExtensionApp_be4e0fd1 .appButton_be4e0fd1{align-items:center;background-color:unset;border:none;display:flex;flex-direction:column;height:80px;padding-top:14px;width:120px}.SPFxExtensionApp_be4e0fd1 .appButton_be4e0fd1:hover{background-color:#c8e3fa}',void 0===(s=!0)&&(s=!1),m(function(){var e=Array.isArray(o)?o:function(e){var t=[];if(e){for(var n=0,a=void 0;a=f.exec(e);){var i=a.index;i>n&&t.push({rawString:e.substring(n,i)}),t.push({theme:a[1],defaultValue:a[2]}),n=f.lastIndex}t.push({rawString:e.substring(n)})}return t}(o),t=u.runState,n=t.mode,i=t.buffer,r=t.flushTimer;s||n===a.async?(i.push(e),r||(u.runState.flushTimer=self.setTimeout(function(){u.runState.flushTimer=0,m(function(){var e=u.runState.buffer.slice();u.runState.buffer=[];var t=[].concat.apply([],e);t.length>0&&_(t)})},0))):_(e)});const b={spfxExtensionloader_be4e0fd1:"spfxExtensionloader_be4e0fd1",teams_be4e0fd1:"teams_be4e0fd1",welcome_be4e0fd1:"welcome_be4e0fd1",welcomeImage_be4e0fd1:"welcomeImage_be4e0fd1",links_be4e0fd1:"links_be4e0fd1",SPFxExtensionApp_be4e0fd1:"SPFxExtensionApp_be4e0fd1",loader_be4e0fd1:"loader_be4e0fd1",rotation_be4e0fd1:"rotation_be4e0fd1",buttonLoader_be4e0fd1:"buttonLoader_be4e0fd1",shimmerShine_be4e0fd1:"shimmerShine_be4e0fd1",placeholderShimmer_be4e0fd1:"placeholderShimmer_be4e0fd1",applicationListSection_be4e0fd1:"applicationListSection_be4e0fd1",header_be4e0fd1:"header_be4e0fd1",icon_be4e0fd1:"icon_be4e0fd1",iconFont_be4e0fd1:"iconFont_be4e0fd1",appButtonsContainer_be4e0fd1:"appButtonsContainer_be4e0fd1",appButtonsWrapper_be4e0fd1:"appButtonsWrapper_be4e0fd1",appButton_be4e0fd1:"appButton_be4e0fd1"}}
3
+ ,962:e=>{e.exports=i},676:e=>{e.exports=t},877:e=>{e.exports=n},642:e=>{e.exports=a}},d={};function l(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return c[e](n,n.exports,l),n.exports}l.m=c,l.d=(e,t)=>{for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,n)=>(l.f[n](e,t),t),[])),l.u=e=>"spfx-extension-loader_e83dead2a8f8f000d374.js",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},o="6cc779ad78b22e0ab7384b402525e382:",l.l=(e,t,n,a)=>{if(r[e])r[e].push(t);else{var i,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var u=c[d];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==o+n){i=u;break}}i||(s=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,l.nc&&i.setAttribute("nonce",l.nc),i.setAttribute("data-webpack",o+n),i.src=e,0!==i.src.indexOf(window.location.origin+"/")&&(i.crossOrigin="anonymous")),r[e]=[t];var f=(t,n)=>{i.onerror=i.onload=null,clearTimeout(p);var a=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach(e=>e(n)),t)return t(n)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),s&&document.head.appendChild(i)}},l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s=e?e.src:"",l.p=s.slice(0,s.lastIndexOf("/")+1),(()=>{var e={650:0};l.f.j=(t,n)=>{var a=l.o(e,t)?e[t]:void 0;if(0!==a)if(a)n.push(a[2]);else{var i=new Promise((n,i)=>a=e[t]=[n,i]);n.push(a[2]=i);var r=l.p+l.u(t),o=new Error;l.l(r,n=>{if(l.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var i=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed.\n("+i+": "+r+")",o.name="ChunkLoadError",o.type=i,o.request=r,a[1](o)}},"chunk-"+t,t)}};var t=(t,n)=>{var a,i,[r,o,s]=n,c=0;if(r.some(t=>0!==e[t])){for(a in o)l.o(o,a)&&(l.m[a]=o[a]);s&&s(l)}for(t&&t(n);c<r.length;c++)i=r[c],l.o(e,i)&&e[i]&&e[i][0](),e[i]=0},n=self.webpackJsonp_6cc779ad78b22e0ab7384b402525e382=self.webpackJsonp_6cc779ad78b22e0ab7384b402525e382||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})();var u={};return(()=>{l.r(u),l.d(u,{default:()=>r});var e=l(676),t=l(877),n=l(642),a=l(367),i=l(962);l(574);class r extends n.BaseClientSideWebPart{SPFxExtensionInstance;allApps=[];appCatalogUrl="/sites/appcatalog";dropDownProps={options:[],selectedKey:"",disabled:!0};appDescription="";hideAppSelectorWhenAppLoaded=!1;hideConfiguratorButton=!1;configDomElement;themeProvider;serviceScope;appButtonElements=[];webpartSectionElement=document.createElement("section");webpartSectionTitle=document.createElement("header");appButtonsWrapper=document.createElement("div");appButtonsContainer=document.createElement("div");async onInit(){const t=e.Environment.type===e.EnvironmentType.SharePoint?"SharePoint":"ClassicSharePoint";this.themeProvider=this.context.serviceScope.consume(i.ThemeProvider.serviceKey),this.serviceScope=this.context.serviceScope;const{initCore:n}=await l.e(548).then(l.bind(l,364));await n(t),this.appCatalogUrl=window.__SPFxExtensions.Utils.ConfiguratorPageUrl}openPropertyPane(){this.context.propertyPane.open()}closePropertyPane(){this.context.propertyPane.close()}isPropertyPaneOpen(){return this.context.propertyPane.isPropertyPaneOpen()}saveConfigValue(e,t=!0){this.properties.SPFxExtensionAppConfiguration=e,t&&this.SPFxExtensionInstance?.executeListeners("onConfigurationChange",e)}getConfigValue(e){if(e){let t=this.properties[e];return void 0===t&&(t=this.properties.SPFxExtensionAppConfiguration),t}return this.properties.SPFxExtensionAppConfiguration}getSearchData(){return{searchableText:this.properties.searchableText,searchableHtml:this.properties.searchableHtml}}setSearchData(e){this.properties.searchableText=e.searchableText,this.properties.searchableHtml=e.searchableHtml}getTopActions(){return this.properties.topActions??[]}setTopActions(e){this.properties.topActions=e??[]}getThemeProvider(){return this.themeProvider}getConfigDomElement(){return this.configDomElement}getContext(){return this.context}getServiceScope(){return this.serviceScope}async mountApp(e){this.domElement.innerHTML="";try{const t={domElement:this.domElement,webpart:this,openPropertyPane:()=>{this.openPropertyPane()},closePropertyPane:()=>{this.closePropertyPane()},isPropertyPaneOpen:()=>this.isPropertyPaneOpen(),saveConfigValue:(e,t=!0)=>{this.saveConfigValue(e,t)},getConfigValue:e=>this.getConfigValue(e),getSearchableData:()=>this.getSearchData(),setSearchableData:e=>{this.setSearchData(e)},setTopActions:e=>{this.setTopActions(e)},getTopActions:()=>this.getTopActions(),getThemeProvider:()=>this.getThemeProvider(),getConfigDomElement:()=>this.getConfigDomElement(),getContext:()=>this.getContext(),getServiceScope:()=>this.getServiceScope()};if(this.SPFxExtensionInstance=await window.__SPFxExtensions.InstantiateApp(e,t),!this.SPFxExtensionInstance)return void console.warn(a.Lf,"App instance is undefined, cannot mount app",e);const n=window.__SPFxExtensions.Apps.find(t=>t.id===e);n&&(this.appDescription=n.description)}catch(t){return console.error(a.Lf,"Error while mounting appid",e,t),new Error(`${t}`)}}unmountApp(){this.SPFxExtensionInstance&&this.SPFxExtensionInstance.unmount?.(),this.SPFxExtensionInstance=void 0,this.domElement.innerHTML=""}generateIconElement(e){const t=document.createElement("i");if(t.classList.add("icon_be4e0fd1"),!e)return t.innerHTML='<svg fill="currentColor" class="___12fm75w f1w7gpdv fez10in fg4l7m0" aria-hidden="true" width="28" height="28" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg"><path d="M20.84 2.66a2.25 2.25 0 0 0-3.18 0L13.5 6.8v-.56c0-1.24-1-2.25-2.25-2.25h-7C3.01 4 2 5.01 2 6.25v18c0 .97.78 1.75 1.75 1.75h18c1.24 0 2.25-1 2.25-2.25v-7c0-1.24-1-2.25-2.25-2.25h-.56l4.16-4.15c.88-.88.88-2.3 0-3.19l-4.5-4.5ZM17.31 14.5H13.5v-3.8l3.8 3.8Zm1.41-10.78c.3-.3.77-.3 1.06 0l4.5 4.5c.3.3.3.77 0 1.06l-4.5 4.51c-.3.3-.77.3-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.07l4.5-4.5ZM12 6.25v8.25H3.5V6.25c0-.41.34-.75.75-.75h7c.41 0 .75.34.75.75Zm-8.5 17.5V16H12v8.5H4.25a.75.75 0 0 1-.75-.75Zm10-7.75h8.25c.41 0 .75.34.75.75v7c0 .42-.34.75-.75.75H13.5V16Z" fill="currentColor"></path></svg>',t;if("font"===e.iconType&&e.fontFamily&&(t.style.fontFamily=e.fontFamily,t.classList.add("iconFont_be4e0fd1")),"url"===e.iconType){const n=document.createElement("img");n.src=e.iconData,t.appendChild(n)}return"svg"===e.iconType&&(t.innerHTML=e.iconData),t}createAndAppendAppButtons(e){const t=document.createElement("button");t.title=a.Bc,t.ariaLabel=a.Bc,t.className="appButton_be4e0fd1";const n=this.generateIconElement(e.icon);t.append(n,e.name),t.title=e.name,t.addEventListener("click",t=>{t.stopPropagation(),t.preventDefault(),this.properties.selectedApp=e.id,this.webpartSectionElement.remove(),this.mountApp(e.id).catch(()=>{})}),this.appButtonsContainer.appendChild(t)}createWebpartSection(e){this.webpartSectionElement.className="applicationListSection_be4e0fd1",this.webpartSectionTitle.className="header_be4e0fd1",this.webpartSectionElement.appendChild(this.webpartSectionTitle),e&&this.webpartSectionElement.appendChild(this.appButtonsWrapper)}renderDisplayMode(){this.webpartSectionElement.ariaLabel=a.oz,this.webpartSectionTitle.textContent=a.oz,this.createWebpartSection(),this.domElement.appendChild(this.webpartSectionElement)}async renderEditMode(){this.webpartSectionElement.ariaLabel=a.Ne,this.webpartSectionTitle.textContent=a.Ne,this.createWebpartSection(!0),this.appButtonsContainer.className="appButtonsContainer_be4e0fd1",this.appButtonsWrapper.appendChild(this.appButtonsContainer),this.appButtonsWrapper.className="appButtonsWrapper_be4e0fd1",this.domElement.appendChild(this.webpartSectionElement),window.__SPFxExtensions.AddAppEventListener("appAdded",e=>{e.isWebPartApp&&this.createAndAppendAppButtons(e)}),window.__SPFxExtensions.Apps.filter(e=>e.registrationCompleted).forEach(e=>{e.isWebPartApp&&this.createAndAppendAppButtons(e)});try{await window.__SPFxExtensions.Utils.spAppInitializationPromise,window.__SPFxExtensions.Utils.appManifestPromises.forEach(e=>{const t=document.createElement("div"),n=document.createElement("span");t.className="buttonLoader_be4e0fd1",n.className="loader_be4e0fd1",t.appendChild(n),this.appButtonsContainer.append(t),e.catch(()=>{}).finally(()=>{t.remove()})})}catch(e){return console.error(a.Lf,"Error while awaiting app initialization",e),new Error(`Error while awaiting app initialization: ${e}`)}}async renderEmptyApp(){if(this.domElement.innerHTML="",this.domElement.className="SPFxExtensionApp_be4e0fd1",this.displayMode!==e.DisplayMode.Read)return this.renderEditMode();this.renderDisplayMode()}async render(){let e;try{if(this.SPFxExtensionInstance){if(!this.SPFxExtensionInstance.unmountOnRender)return void this.SPFxExtensionInstance.executeListeners("onRender",void 0);this.unmountApp()}if(this.properties.selectedApp&&!this.SPFxExtensionInstance)return void(e=await this.mountApp(this.properties.selectedApp));e=await this.renderEmptyApp()}finally{this.renderCompleted(e,!0)}}renderCompleted(e,t){super.renderCompleted(e,t)}get isRenderAsync(){return!0}get propertiesMetadata(){return{searchableText:{isSearchablePlainText:!0},searchableHtml:{isHtmlString:!0}}}CustomWebpartConfigurationField(e){return{type:t.PropertyPaneFieldType.Custom,targetProperty:e,properties:{key:e,onRender:(e,t,n)=>{this.configDomElement=e,this.SPFxExtensionInstance?.instanceLoadPromise.then(()=>{this.SPFxExtensionInstance?.executeListeners("onConfigurationRender",{domElement:e})}).catch(e=>{console.error(a.Lf,"Error while awaiting app to load",e)})},onDispose:(e,t)=>{this.SPFxExtensionInstance?.executeListeners("onConfigurationClose",{domElement:e}),this.configDomElement=void 0}}}}onPropertyPaneConfigurationStart(){window.__SPFxExtensions.AllAppAssetsLoadedPromise.then(()=>{const e=window.__SPFxExtensions.Apps.find(e=>e.id===this.properties.selectedApp);e&&(this.appDescription=e.description,this.hideAppSelectorWhenAppLoaded=e.hideAppSelectorWhenAppLoaded??!1,this.hideConfiguratorButton=e.hideConfiguratorButton??!1),this.dropDownProps.options?.splice(0,this.dropDownProps.options?.length);const t=window.__SPFxExtensions.Apps.filter(e=>e.isWebPartApp).map(e=>({key:e.id,text:e.name}));this.dropDownProps.options?.push(...t),this.dropDownProps.selectedKey=this.properties.selectedApp,this.dropDownProps.disabled=!1,this.context.propertyPane.refresh()}).catch(e=>{console.error(a.Lf,"Error while awaiting all app assets to load",e)})}getPropertyPaneConfiguration(){const e={groupFields:[(0,t.PropertyPaneLabel)("spfxExtensionLoaderLabel",{text:"App not working? Try refreshing the page. Or go to the configuration page."}),(0,t.PropertyPaneButton)("configuratorButton",{text:"Open Configurator",buttonType:1,onClick:()=>{window.open(`${this.appCatalogUrl}?web=${this.context.pageContext.web.absoluteUrl}`,"_blank")}})]},n=this.hideConfiguratorButton?[]:[e],a={groupFields:[(0,t.PropertyPaneDropdown)("selectedApp",{label:"App",disabled:this.dropDownProps.disabled,options:this.dropDownProps.options,selectedKey:this.dropDownProps.selectedKey}),(0,t.PropertyPaneLabel)("selectedAppDecription",{text:this.appDescription})]};return{pages:[{groups:[...n,...this.hideAppSelectorWhenAppLoaded?[]:[a],{groupFields:[this.CustomWebpartConfigurationField("SPFxExtensionAppConfiguration")]}]}]}}getTopActionsConfiguration(){return{topActions:this.properties.topActions??[],onExecute:(e,t)=>{this.SPFxExtensionInstance?.executeListeners("onTopActionExecute",{actionName:e,updatedValue:t})}}}onPropertyPaneConfigurationComplete(){!this.context.propertyPane.isPropertyPaneOpen()&&this.SPFxExtensionInstance&&this.SPFxExtensionInstance.executeListeners("onConfigurationClose",{domElement:this.configDomElement})}onPropertyPaneFieldChanged(e,t,n){if("selectedApp"===e){if(t&&t!==n&&this.SPFxExtensionInstance){if(!confirm("You are about to switch app, this will erase all previous app configuration. Are you sure?"))return void(this.properties[e]=t);this.unmountApp()}n&&(this.webpartSectionElement.remove(),this.mountApp(n).catch(()=>{}))}}onDisplayModeChanged(t){const n=t===e.DisplayMode.Edit?"Read":"Edit";this.SPFxExtensionInstance?.executeListeners("onDisplayModeChange",n)}onAfterPropertyPaneChangesApplied(){this.SPFxExtensionInstance?.executeListeners("onPropertyPaneChangesApplied",void 0)}onAfterResize(e){this.SPFxExtensionInstance?.executeListeners("onAfterResize",{newWidth:e})}onDispose(){this.unmountApp(),this.appButtonElements.forEach(e=>{e.remove()}),this.appButtonElements.splice(0,this.appButtonElements.length),this.webpartSectionElement.remove(),this.webpartSectionTitle.remove(),this.appButtonsWrapper.remove(),this.appButtonsContainer.remove()}onThemeChanged(e){this.SPFxExtensionInstance?.executeListeners("onThemeChange",e)}get dataVersion(){return e.Version.parse("1.0")}}})(),u})())})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spfx-extensions/package",
3
- "version": "1.4.25",
3
+ "version": "1.5.1",
4
4
  "author": "SPWizard01",
5
5
  "access": "public",
6
6
  "repository": {
@@ -44,7 +44,7 @@
44
44
  "@microsoft/sp-office-ui-fabric-core": "^1.21.1",
45
45
  "@microsoft/sp-property-pane": "^1.21.1",
46
46
  "@microsoft/sp-webpart-base": "^1.21.1",
47
- "@spfx-extensions/core": "^0.8.5",
47
+ "@spfx-extensions/core": "^0.9.0",
48
48
  "tslib": "^2.8.1"
49
49
  },
50
50
  "devDependencies": {
@@ -1,4 +1,4 @@
1
- import { DisplayMode, Environment, EnvironmentType, Version } from "@microsoft/sp-core-library";
1
+ import { DisplayMode, Environment, EnvironmentType, ServiceScope, Version } from "@microsoft/sp-core-library";
2
2
  import {
3
3
  IPropertyPaneConditionalGroup,
4
4
  type IPropertyPaneConfiguration,
@@ -13,16 +13,20 @@ import {
13
13
  PropertyPaneLabel
14
14
  } from "@microsoft/sp-property-pane";
15
15
  import { BaseClientSideWebPart, IWebPartPropertiesMetadata } from "@microsoft/sp-webpart-base";
16
- import type { IReadonlyTheme } from "@microsoft/sp-component-base";
17
-
18
- import styles from "./SpfxExtensionloaderWebPart.module.scss";
19
- //import * as strings from "SpfxExtensionloaderWebPartStrings";
16
+ import { ITopActions, ITopActionsField } from "@microsoft/sp-top-actions";
20
17
  import { SPFxExtensionAppConfig, SPFxExtensionAppDefinition, SPFxExtensionAppIcon, SPFxExtensionAppInstance, SPFxExtensionAppRuntimeConfig, SPFxExtensionAppSearchableData } from "@spfx-extensions/core";
21
18
  import { APP_BUTTON_LABEL, EDIT_PAGE_AND_SELECT_WEBPART, SELECT_WEBPART, SPFXPREFIX } from "../../utilities/constants";
19
+ import {
20
+ ThemeProvider,
21
+ type IReadonlyTheme,
22
+ } from '@microsoft/sp-component-base';
23
+ //import * as strings from "SpfxExtensionloaderWebPartStrings";
24
+ import styles from "./SpfxExtensionloaderWebPart.module.scss";
22
25
 
23
26
  export interface ISpfxExtensionloaderWebPartProps extends SPFxExtensionAppSearchableData {
24
27
  selectedApp: string;
25
28
  SPFxExtensionAppConfiguration: SPFxExtensionAppConfig | undefined;
29
+ topActions: ITopActionsField[];
26
30
  }
27
31
 
28
32
  type propertyPath = keyof ISpfxExtensionloaderWebPartProps;
@@ -43,7 +47,15 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
43
47
  hideAppSelectorWhenAppLoaded = false;
44
48
  hideConfiguratorButton = false;
45
49
  configDomElement: HTMLElement | undefined;
46
- _isDarkTheme: boolean = false;
50
+ themeProvider: ThemeProvider | undefined;
51
+ serviceScope: ServiceScope | undefined;
52
+ appButtonElements: HTMLElement[] = [];
53
+
54
+ webpartSectionElement = document.createElement("section");
55
+ webpartSectionTitle = document.createElement("header");
56
+ appButtonsWrapper = document.createElement("div");
57
+ appButtonsContainer = document.createElement("div");
58
+
47
59
 
48
60
  public async onInit() {
49
61
  if (DEBUG) {
@@ -53,72 +65,16 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
53
65
  Environment.type === EnvironmentType.SharePoint
54
66
  ? "SharePoint"
55
67
  : "ClassicSharePoint";
68
+ this.themeProvider = this.context.serviceScope.consume(ThemeProvider.serviceKey);
69
+ this.serviceScope = this.context.serviceScope;
56
70
  const { initCore } = await import(/* webpackChunkName: "spfx-extension-loader" */"../../services/initCoreService");
57
71
  //init core then do stuff;
58
72
  await initCore(envType);
59
73
  this.appCatalogUrl = window.__SPFxExtensions.Utils.ConfiguratorPageUrl;
60
74
  }
61
75
 
62
- protected onPropertyPaneConfigurationComplete(): void {
63
- const isPaneOpen = this.context.propertyPane.isPropertyPaneOpen();
64
-
65
- // notify close only if the pane is not open
66
- // complete event fires also when config is saved
67
- // This event method is invoked in the following cases:
68
-
69
- // When the CONFIGURATION_COMPLETE_TIMEOUT((currently the value is 5 secs) elapses after the last change.
70
-
71
- // When user clicks the "X" (close) button before the CONFIGURATION_COMPLETE_TIMEOUT elapses.
72
-
73
- // When user clicks the 'Apply' button before the CONFIGURATION_COMPLETE_TIMEOUT elapses.
74
-
75
- // When the user switches web parts then the current web part gets this event.
76
- if (!isPaneOpen && this.SPFxExtensionInstance) {
77
-
78
- this.SPFxExtensionInstance.executeListeners(
79
- "onConfigurationClose",
80
- undefined
81
- );
82
- }
83
- }
84
-
85
- protected onPropertyPaneFieldChanged(
86
- propertyPath: propertyPath,
87
- //eslint-disable-next-line @typescript-eslint/no-explicit-any
88
- oldValue: any,
89
- //eslint-disable-next-line @typescript-eslint/no-explicit-any
90
- newValue: any
91
- ): void {
92
- // if selected app changed unmount the old app
93
- if (propertyPath === "selectedApp") {
94
- if (oldValue && oldValue !== newValue && this.SPFxExtensionInstance) {
95
- const shouldUnmount = confirm(
96
- "You are about to switch app, this will erase all previous app configuration. Are you sure?"
97
- );
98
- if (!shouldUnmount) {
99
- this.properties[propertyPath] = oldValue;
100
- return;
101
- }
102
- this.unmountApp();
103
- }
104
- // if new app was selected, mount it
105
- if (newValue) {
106
- this.webpartSectionElement.remove();
107
- this.mountApp(newValue).catch(() => {
108
- // do nothing
109
- });
110
- }
111
- }
112
- }
113
-
114
- protected onDisplayModeChanged(oldDisplayMode: DisplayMode): void {
115
- const mode = oldDisplayMode === DisplayMode.Edit ? "Read" : "Edit";
116
- if (this.SPFxExtensionInstance) {
117
- this.SPFxExtensionInstance.executeListeners("onDisplayModeChange", mode);
118
- return;
119
- }
120
- }
121
76
 
77
+ //#region App mounting and property forwarding
122
78
  openPropertyPane() {
123
79
  // if (this.context.propertyPane.isPropertyPaneOpen()) {
124
80
  // this.context.propertyPane.close();
@@ -167,6 +123,30 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
167
123
  this.properties.searchableHtml = data.searchableHtml;
168
124
  }
169
125
 
126
+ getTopActions() {
127
+ return this.properties.topActions ?? [];
128
+ }
129
+
130
+ setTopActions(fields: ITopActionsField[]) {
131
+ this.properties.topActions = fields ?? [];
132
+ }
133
+
134
+ getThemeProvider() {
135
+ return this.themeProvider;
136
+ }
137
+
138
+ getConfigDomElement() {
139
+ return this.configDomElement;
140
+ }
141
+
142
+ getContext() {
143
+ return this.context;
144
+ }
145
+
146
+ getServiceScope() {
147
+ return this.serviceScope;
148
+ }
149
+
170
150
  private async mountApp(appId: string) {
171
151
  if (ISDEBUG) {
172
152
  console.debug(SPFXPREFIX, "Mounting app", appId, "at", this.domElement);
@@ -177,8 +157,6 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
177
157
  const runTimeConfig: SPFxExtensionAppRuntimeConfig = {
178
158
  domElement: this.domElement,
179
159
  //eslint-disable-next-line @typescript-eslint/no-explicit-any
180
- webpartContext: this.context as any,
181
- //eslint-disable-next-line @typescript-eslint/no-explicit-any
182
160
  webpart: this as any,
183
161
  openPropertyPane: () => {
184
162
  this.openPropertyPane();
@@ -201,9 +179,28 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
201
179
  setSearchableData: (data: SPFxExtensionAppSearchableData) => {
202
180
  this.setSearchData(data);
203
181
  },
182
+ setTopActions: (actions: ITopActionsField[]) => {
183
+ this.setTopActions(actions);
184
+ },
185
+ getTopActions: () => {
186
+ return this.getTopActions();
187
+ },
188
+ getThemeProvider: () => {
189
+ return this.getThemeProvider();
190
+ },
191
+ getConfigDomElement: () => {
192
+ return this.getConfigDomElement();
193
+ },
194
+ getContext: () => {
195
+ return this.getContext();
196
+ },
197
+ getServiceScope: () => {
198
+ return this.getServiceScope();
199
+ }
204
200
  };
205
201
  this.SPFxExtensionInstance = await window.__SPFxExtensions.InstantiateApp(appId, runTimeConfig);
206
202
  if (!this.SPFxExtensionInstance) {
203
+ console.warn(SPFXPREFIX, "App instance is undefined, cannot mount app", appId);
207
204
  return;
208
205
  }
209
206
  const newApp = window.__SPFxExtensions.Apps.find((app) => app.id === appId);
@@ -216,12 +213,11 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
216
213
  // this.context.propertyPane.open();
217
214
  // }
218
215
  }
219
- this.renderCompleted(undefined, true);
220
216
  }
221
217
  catch (err) {
222
218
  console.error(SPFXPREFIX, "Error while mounting appid", appId, err);
223
219
  const error = new Error(`${err}`);
224
- this.renderCompleted(error);
220
+ return error;
225
221
  }
226
222
  }
227
223
 
@@ -241,20 +237,9 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
241
237
  this.SPFxExtensionInstance = undefined;
242
238
  this.domElement.innerHTML = "";
243
239
  }
240
+ //#endregion
244
241
 
245
- protected onDispose(): void {
246
- if (DEBUG) {
247
- console.debug(SPFXPREFIX, "onDispose");
248
- }
249
- this.unmountApp();
250
- }
251
-
252
- appButtonElements: HTMLElement[] = [];
253
-
254
- webpartSectionElement = document.createElement("section");
255
- webpartSectionTitle = document.createElement("header");
256
- appButtonsWrapper = document.createElement("div");
257
- appButtonsContainer = document.createElement("div");
242
+ //#region HTML Elements Rendering
258
243
 
259
244
  generateIconElement(icon?: SPFxExtensionAppIcon) {
260
245
  const iconElement = document.createElement("i");
@@ -366,6 +351,7 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
366
351
  }
367
352
  catch (err) {
368
353
  console.error(SPFXPREFIX, "Error while awaiting app initialization", err);
354
+ return new Error(`Error while awaiting app initialization: ${err}`);
369
355
  }
370
356
  }
371
357
 
@@ -381,12 +367,11 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
381
367
 
382
368
  if (this.displayMode === DisplayMode.Read) {
383
369
  this.renderDisplayMode();
384
- } else {
385
- await this.renderEditMode();
370
+ return;
386
371
  }
387
-
388
- this.renderCompleted(undefined, true);
372
+ return this.renderEditMode();
389
373
  }
374
+ //#endregion HTML Elements Rendering
390
375
 
391
376
  public async render() {
392
377
  // might not be required anymore
@@ -398,24 +383,29 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
398
383
  if (DEBUG) {
399
384
  console.debug(SPFXPREFIX, "render");
400
385
  }
386
+ let possibleError: Error | undefined = undefined;
401
387
 
402
- //in live editing mode dispose is not called when in production build for some reason
403
- //we unmount and remount the app if applicable
404
- if (this.SPFxExtensionInstance) {
405
- if (this.SPFxExtensionInstance.unmountOnRender) {
406
- this.unmountApp();
407
- } else {
408
- this.SPFxExtensionInstance.executeListeners("onRender", undefined);
388
+ try {
389
+ //in live editing mode dispose is not called when in production build for some reason
390
+ //we unmount and remount the app if applicable
391
+ if (this.SPFxExtensionInstance) {
392
+ if (this.SPFxExtensionInstance.unmountOnRender) {
393
+ this.unmountApp();
394
+ } else {
395
+ this.SPFxExtensionInstance.executeListeners("onRender", undefined);
396
+ return;
397
+ }
398
+ }
399
+
400
+ if (this.properties.selectedApp && !this.SPFxExtensionInstance) {
401
+ possibleError = await this.mountApp(this.properties.selectedApp);
409
402
  return;
410
403
  }
411
- }
412
404
 
413
- if (this.properties.selectedApp && !this.SPFxExtensionInstance) {
414
- await this.mountApp(this.properties.selectedApp);
415
- return;
405
+ possibleError = await this.renderEmptyApp();
406
+ } finally {
407
+ this.renderCompleted(possibleError, true);
416
408
  }
417
-
418
- await this.renderEmptyApp();
419
409
  }
420
410
 
421
411
  protected renderCompleted(error?: Error, didUpdate?: boolean): void {
@@ -443,6 +433,39 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
443
433
  };
444
434
  }
445
435
 
436
+ CustomWebpartConfigurationField(
437
+ name: string
438
+ ): IPropertyPaneField<IPropertyPaneCustomFieldProps> {
439
+ return {
440
+ type: PropertyPaneFieldType.Custom,
441
+ targetProperty: name,
442
+ properties: {
443
+ key: name,
444
+ onRender: (domElement, _context, _callBack) => {
445
+ this.configDomElement = domElement;
446
+ // when app instance is loaded forward the render event
447
+ this.SPFxExtensionInstance?.instanceLoadPromise
448
+ .then(() => {
449
+ this.SPFxExtensionInstance?.executeListeners(
450
+ "onConfigurationRender",
451
+ {
452
+ domElement,
453
+ }
454
+ );
455
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
456
+ }).catch((err: any) => {
457
+ console.error(SPFXPREFIX, "Error while awaiting app to load", err);
458
+ });
459
+ },
460
+ onDispose: (domElement, _context) => {
461
+ this.SPFxExtensionInstance?.executeListeners("onConfigurationClose", { domElement });
462
+ this.configDomElement = undefined;
463
+ },
464
+ // context: this.context,
465
+ },
466
+ };
467
+ }
468
+
446
469
  protected onPropertyPaneConfigurationStart(): void {
447
470
  if (ISDEBUG) {
448
471
  console.debug(SPFXPREFIX, "Property pane configuration start");
@@ -486,43 +509,6 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
486
509
  });
487
510
  }
488
511
 
489
- CustomWebpartConfigurationField(
490
- name: string
491
- ): IPropertyPaneField<IPropertyPaneCustomFieldProps> {
492
- return {
493
- type: PropertyPaneFieldType.Custom,
494
- targetProperty: name,
495
- properties: {
496
- key: "SPFxExtensionAppConfiguration",
497
- onRender: (domElement, _context, _callBack) => {
498
- this.configDomElement = domElement;
499
- if (this.SPFxExtensionInstance) {
500
- // when app instance is loaded forward the render event
501
- this.SPFxExtensionInstance.instanceLoadPromise.then(() => {
502
- this.SPFxExtensionInstance?.executeListeners(
503
- "onConfigurationRender",
504
- {
505
- domElement,
506
- }
507
- );
508
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
509
- }).catch((err: any) => {
510
- console.error(SPFXPREFIX, "Error while awaiting app to load", err);
511
- });
512
- }
513
- },
514
- onDispose: (_domeElement, _context) => {
515
- if (this.SPFxExtensionInstance) {
516
- this.SPFxExtensionInstance.executeListeners(
517
- "onConfigurationClose",
518
- undefined
519
- );
520
- }
521
- },
522
- },
523
- };
524
- }
525
-
526
512
  protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
527
513
  const configuratorButton: IPropertyPaneGroup | IPropertyPaneConditionalGroup = {
528
514
  groupFields: [
@@ -574,7 +560,97 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
574
560
  };
575
561
  }
576
562
 
563
+ public getTopActionsConfiguration(): ITopActions | undefined {
564
+ return {
565
+ topActions: this.properties.topActions ?? [],
566
+ onExecute: (actionName: string, updatedValue: unknown) => {
567
+ this.SPFxExtensionInstance?.executeListeners("onTopActionExecute", {
568
+ actionName,
569
+ updatedValue
570
+ });
571
+ }
572
+ }
573
+ }
574
+
575
+ protected onPropertyPaneConfigurationComplete(): void {
576
+ const isPaneOpen = this.context.propertyPane.isPropertyPaneOpen();
577
577
 
578
+ // notify close only if the pane is not open
579
+ // complete event fires also when config is saved
580
+ // This event method is invoked in the following cases:
581
+
582
+ // When the CONFIGURATION_COMPLETE_TIMEOUT((currently the value is 5 secs) elapses after the last change.
583
+
584
+ // When user clicks the "X" (close) button before the CONFIGURATION_COMPLETE_TIMEOUT elapses.
585
+
586
+ // When user clicks the 'Apply' button before the CONFIGURATION_COMPLETE_TIMEOUT elapses.
587
+
588
+ // When the user switches web parts then the current web part gets this event.
589
+ if (!isPaneOpen && this.SPFxExtensionInstance) {
590
+
591
+ this.SPFxExtensionInstance.executeListeners(
592
+ "onConfigurationClose",
593
+ { domElement: this.configDomElement }
594
+ );
595
+ }
596
+ }
597
+
598
+ protected onPropertyPaneFieldChanged(
599
+ propertyPath: propertyPath,
600
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
601
+ oldValue: any,
602
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
603
+ newValue: any
604
+ ): void {
605
+ // if selected app changed unmount the old app
606
+ if (propertyPath === "selectedApp") {
607
+ if (oldValue && oldValue !== newValue && this.SPFxExtensionInstance) {
608
+ const shouldUnmount = confirm(
609
+ "You are about to switch app, this will erase all previous app configuration. Are you sure?"
610
+ );
611
+ if (!shouldUnmount) {
612
+ this.properties[propertyPath] = oldValue;
613
+ return;
614
+ }
615
+ this.unmountApp();
616
+ }
617
+ // if new app was selected, mount it
618
+ if (newValue) {
619
+ this.webpartSectionElement.remove();
620
+ this.mountApp(newValue).catch(() => {
621
+ // do nothing
622
+ });
623
+ }
624
+ }
625
+ }
626
+
627
+ protected onDisplayModeChanged(oldDisplayMode: DisplayMode): void {
628
+ const mode = oldDisplayMode === DisplayMode.Edit ? "Read" : "Edit";
629
+ this.SPFxExtensionInstance?.executeListeners("onDisplayModeChange", mode);
630
+ }
631
+
632
+ protected onAfterPropertyPaneChangesApplied(): void {
633
+ this.SPFxExtensionInstance?.executeListeners("onPropertyPaneChangesApplied", undefined);
634
+ }
635
+
636
+ protected onAfterResize(newWidth: number): void {
637
+ this.SPFxExtensionInstance?.executeListeners("onAfterResize", { newWidth });
638
+ }
639
+
640
+ protected onDispose(): void {
641
+ if (DEBUG) {
642
+ console.debug(SPFXPREFIX, "onDispose");
643
+ }
644
+ this.unmountApp();
645
+ this.appButtonElements.forEach((button) => {
646
+ button.remove();
647
+ });
648
+ this.appButtonElements.splice(0, this.appButtonElements.length);
649
+ this.webpartSectionElement.remove();
650
+ this.webpartSectionTitle.remove();
651
+ this.appButtonsWrapper.remove();
652
+ this.appButtonsContainer.remove();
653
+ }
578
654
 
579
655
  // private _getEnvironmentMessage(): Promise<string> {
580
656
  // if (!!this.context.sdks.microsoftTeams) { // running in Teams, office.com or Outlook
@@ -604,21 +680,21 @@ export default class SpfxExtensionloaderWebPart extends BaseClientSideWebPart<IS
604
680
  // }
605
681
 
606
682
  protected onThemeChanged(currentTheme: IReadonlyTheme | undefined): void {
607
- if (!currentTheme) {
608
- return;
609
- }
610
-
611
- this._isDarkTheme = !!currentTheme.isInverted;
612
- const {
613
- semanticColors
614
- } = currentTheme;
683
+ this.SPFxExtensionInstance?.executeListeners("onThemeChange", currentTheme);
684
+ // if (!currentTheme) {
685
+ // return;
686
+ // }
615
687
 
616
- if (semanticColors) {
617
- this.domElement.style.setProperty("--bodyText", semanticColors.bodyText || null);
618
- this.domElement.style.setProperty("--link", semanticColors.link || null);
619
- this.domElement.style.setProperty("--linkHovered", semanticColors.linkHovered || null);
620
- }
688
+ // this._isDarkTheme = !!currentTheme.isInverted;
689
+ // const {
690
+ // semanticColors
691
+ // } = currentTheme;
621
692
 
693
+ // if (semanticColors) {
694
+ // this.domElement.style.setProperty("--bodyText", semanticColors.bodyText || null);
695
+ // this.domElement.style.setProperty("--link", semanticColors.link || null);
696
+ // this.domElement.style.setProperty("--linkHovered", semanticColors.linkHovered || null);
697
+ // }
622
698
  }
623
699
 
624
700
  protected get dataVersion(): Version {
@@ -1 +0,0 @@
1
- (()=>{var e=document.currentScript;define("8d1029da-85e6-48cc-aaaf-37a5bbc0b9be_1.4.25",["@microsoft/sp-application-base"],t=>(()=>{"use strict";var n,a,i,r={841:e=>{e.exports=t}},o={};function s(e){var t=o[e];if(void 0!==t)return t.exports;var n=o[e]={exports:{}};return r[e](n,n.exports,s),n.exports}s.m=r,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((t,n)=>(s.f[n](e,t),t),[])),s.u=e=>"spfx-extension-loader_1a88c5c5336cafaa736d.js",s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},a="c9da73a2a8922d123a7c645bd9888674:",s.l=(e,t,i,r)=>{if(n[e])n[e].push(t);else{var o,c;if(void 0!==i)for(var d=document.getElementsByTagName("script"),l=0;l<d.length;l++){var u=d[l];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==a+i){o=u;break}}o||(c=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,s.nc&&o.setAttribute("nonce",s.nc),o.setAttribute("data-webpack",a+i),o.src=e,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous")),n[e]=[t];var f=(t,a)=>{o.onerror=o.onload=null,clearTimeout(p);var i=n[e];if(delete n[e],o.parentNode&&o.parentNode.removeChild(o),i&&i.forEach(e=>e(a)),t)return t(a)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=f.bind(null,o.onerror),o.onload=f.bind(null,o.onload),c&&document.head.appendChild(o)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i=e?e.src:"",s.p=i.slice(0,i.lastIndexOf("/")+1),(()=>{var e={39:0};s.f.j=(t,n)=>{var a=s.o(e,t)?e[t]:void 0;if(0!==a)if(a)n.push(a[2]);else{var i=new Promise((n,i)=>a=e[t]=[n,i]);n.push(a[2]=i);var r=s.p+s.u(t),o=new Error;s.l(r,n=>{if(s.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var i=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed.\n("+i+": "+r+")",o.name="ChunkLoadError",o.type=i,o.request=r,a[1](o)}},"chunk-"+t,t)}};var t=(t,n)=>{var a,i,[r,o,c]=n,d=0;if(r.some(t=>0!==e[t])){for(a in o)s.o(o,a)&&(s.m[a]=o[a]);c&&c(s)}for(t&&t(n);d<r.length;d++)i=r[d],s.o(e,i)&&e[i]&&e[i][0](),e[i]=0},n=self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674=self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})();var c={};return(()=>{s.r(c),s.d(c,{default:()=>t});var e=s(841);class t extends e.BaseApplicationCustomizer{async onInit(){const{initCore:e}=await s.e(548).then(s.bind(s,364));await e("SharePoint",this.context.placeholderProvider,this)}async onPlaceholdersChanged(e){const{initCore:t}=await s.e(548).then(s.bind(s,364));await t("SharePoint",e,this),window.__SPFxExtensions.Apps.forEach(t=>{t.instances.forEach(t=>{t.executeListeners("onPlaceholdersChanged",e)})})}onDispose(){window.__SPFxExtensions?.Apps?.forEach(e=>{e.instances.forEach(e=>{e.executeListeners("onAppCustomizerDisposed",void 0)})})}}})(),c})())})();
@@ -1,3 +0,0 @@
1
- (()=>{var e=document.currentScript;define(["@microsoft/sp-core-library","@microsoft/sp-property-pane","@microsoft/sp-webpart-base"],(t,n,a)=>(()=>{"use strict";var i,r,o,s={367:(e,t,n)=>{n.d(t,{Bc:()=>r,Lf:()=>o,Ne:()=>a,oz:()=>i});const a="Select one of these web parts for this column.",i="Edit page and select webpart.",r="Webpart that loads an app of your choice.",o="[SPFxExtensions]"}
2
- ,574:(e,t,n)=>{n.r(t),n.d(t,{default:()=>b});var a,i,r=function(){return r=Object.assign||function(e){for(var t,n=1,a=arguments.length;n<a;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},r.apply(this,arguments)};!function(e){e[e.sync=0]="sync",e[e.async=1]="async"}(a||(a={})),function(e){e[e.onlyThemable=1]="onlyThemable",e[e.onlyNonThemable=2]="onlyNonThemable",e[e.all=3]="all"}(i||(i={}));var o,s,c,d="undefined"==typeof window?n.g:window,l=d&&d.CSPSettings&&d.CSPSettings.nonce,u=((c=d.__themeState__||{theme:void 0,lastStyleElement:void 0,registeredStyles:[]}).runState||(c=r(r({},c),{perf:{count:0,duration:0},runState:{flushTimer:0,mode:a.sync,buffer:[]}})),c.registeredThemableStyles||(c=r(r({},c),{registeredThemableStyles:[]})),d.__themeState__=c,c),f=/[\'\"]\[theme:\s*(\w+)\s*(?:\,\s*default:\s*([\\"\']?[\.\,\(\)\#\-\s\w]*[\.\,\(\)\#\-\w][\"\']?))?\s*\][\'\"]/g,p=function(){return"undefined"!=typeof performance&&performance.now?performance.now():Date.now()};function m(e){var t=p();e();var n=p();u.perf.duration+=n-t}function _(e,t){u.loadStyles?u.loadStyles(h(e).styleString,e):function(e){if("undefined"!=typeof document){var t=document.getElementsByTagName("head")[0],n=document.createElement("style"),a=h(e),i=a.styleString,r=a.themable;n.setAttribute("data-load-themed-styles","true"),l&&n.setAttribute("nonce",l),n.appendChild(document.createTextNode(i)),u.perf.count++,t.appendChild(n);var o=document.createEvent("HTMLEvents");o.initEvent("styleinsert",!0,!1),o.args={newStyle:n},document.dispatchEvent(o);var s={styleElement:n,themableStyle:e};r?u.registeredThemableStyles.push(s):u.registeredStyles.push(s)}}(e)}function h(e){var t=u.theme,n=!1;return{styleString:(e||[]).map(function(e){var a=e.theme;if(a){n=!0;var i=t?t[a]:void 0,r=e.defaultValue||"inherit";return t&&!i&&console,i||r}return e.rawString}).join(""),themable:n}}o='.spfxExtensionloader_be4e0fd1{color:"[theme:bodyText, default: #323130]";color:var(--bodyText);overflow:hidden;padding:1em}.spfxExtensionloader_be4e0fd1.teams_be4e0fd1{font-family:Segoe UI,-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif}.welcome_be4e0fd1{text-align:center}.welcomeImage_be4e0fd1{max-width:420px;width:100%}.links_be4e0fd1 a{color:"[theme:link, default:#03787c]";color:var(--link);text-decoration:none}.links_be4e0fd1 a:hover{color:"[theme:linkHovered, default: #014446]";color:var(--linkHovered);text-decoration:underline}.SPFxExtensionApp_be4e0fd1 .loader_be4e0fd1{animation:rotation_be4e0fd1 1s linear infinite;border:2px solid #003755;border-bottom-color:#009fda;border-radius:50%;box-sizing:border-box;display:inline-block;height:28px;width:28px}@keyframes rotation_be4e0fd1{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.SPFxExtensionApp_be4e0fd1 .buttonLoader_be4e0fd1{align-items:center;border:none;display:flex;height:80px;justify-content:center;width:120px}.SPFxExtensionApp_be4e0fd1 .shimmerShine_be4e0fd1{-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:placeholderShimmer_be4e0fd1;-webkit-animation-timing-function:linear;background:#f6f7f8;background-image:linear-gradient(90deg,#f6f7f8 0,#edeef1 20%,#f6f7f8 40%,#f6f7f8);background-repeat:no-repeat;background-size:200px 80px;border:none;display:block;height:80px;position:relative;width:120px}@keyframes placeholderShimmer_be4e0fd1{0%{background-position:-80px 0}to{background-position:120px 0}}.SPFxExtensionApp_be4e0fd1 .applicationListSection_be4e0fd1{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:center;min-height:320px;text-align:center}.SPFxExtensionApp_be4e0fd1 .header_be4e0fd1{color:#242424;font-weight:600;letter-spacing:1px;line-height:32px;padding:0 12px}.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1{font-size:28px;font-style:normal;height:28px;line-height:28px;min-width:28px;width:28px}.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1>img,.SPFxExtensionApp_be4e0fd1 .icon_be4e0fd1>svg{height:auto;width:100%}.SPFxExtensionApp_be4e0fd1 .iconFont_be4e0fd1{background-color:#f6f7f8}.SPFxExtensionApp_be4e0fd1 .appButtonsContainer_be4e0fd1{align-items:center;display:flex;flex-wrap:wrap;height:100%;justify-content:center}.SPFxExtensionApp_be4e0fd1 .appButtonsWrapper_be4e0fd1{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;height:100%;justify-content:flex-start;width:100%}.SPFxExtensionApp_be4e0fd1 .appButton_be4e0fd1{align-items:center;background-color:unset;border:none;display:flex;flex-direction:column;height:80px;padding-top:14px;width:120px}.SPFxExtensionApp_be4e0fd1 .appButton_be4e0fd1:hover{background-color:#c8e3fa}',void 0===(s=!0)&&(s=!1),m(function(){var e=Array.isArray(o)?o:function(e){var t=[];if(e){for(var n=0,a=void 0;a=f.exec(e);){var i=a.index;i>n&&t.push({rawString:e.substring(n,i)}),t.push({theme:a[1],defaultValue:a[2]}),n=f.lastIndex}t.push({rawString:e.substring(n)})}return t}(o),t=u.runState,n=t.mode,i=t.buffer,r=t.flushTimer;s||n===a.async?(i.push(e),r||(u.runState.flushTimer=self.setTimeout(function(){u.runState.flushTimer=0,m(function(){var e=u.runState.buffer.slice();u.runState.buffer=[];var t=[].concat.apply([],e);t.length>0&&_(t)})},0))):_(e)});const b={spfxExtensionloader_be4e0fd1:"spfxExtensionloader_be4e0fd1",teams_be4e0fd1:"teams_be4e0fd1",welcome_be4e0fd1:"welcome_be4e0fd1",welcomeImage_be4e0fd1:"welcomeImage_be4e0fd1",links_be4e0fd1:"links_be4e0fd1",SPFxExtensionApp_be4e0fd1:"SPFxExtensionApp_be4e0fd1",loader_be4e0fd1:"loader_be4e0fd1",rotation_be4e0fd1:"rotation_be4e0fd1",buttonLoader_be4e0fd1:"buttonLoader_be4e0fd1",shimmerShine_be4e0fd1:"shimmerShine_be4e0fd1",placeholderShimmer_be4e0fd1:"placeholderShimmer_be4e0fd1",applicationListSection_be4e0fd1:"applicationListSection_be4e0fd1",header_be4e0fd1:"header_be4e0fd1",icon_be4e0fd1:"icon_be4e0fd1",iconFont_be4e0fd1:"iconFont_be4e0fd1",appButtonsContainer_be4e0fd1:"appButtonsContainer_be4e0fd1",appButtonsWrapper_be4e0fd1:"appButtonsWrapper_be4e0fd1",appButton_be4e0fd1:"appButton_be4e0fd1"}}
3
- ,676:e=>{e.exports=t},877:e=>{e.exports=n},642:e=>{e.exports=a}},c={};function d(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={exports:{}};return s[e](n,n.exports,d),n.exports}d.m=s,d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce((t,n)=>(d.f[n](e,t),t),[])),d.u=e=>"spfx-extension-loader_1a88c5c5336cafaa736d.js",d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i={},r="c9da73a2a8922d123a7c645bd9888674:",d.l=(e,t,n,a)=>{if(i[e])i[e].push(t);else{var o,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l<c.length;l++){var u=c[l];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==r+n){o=u;break}}o||(s=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,d.nc&&o.setAttribute("nonce",d.nc),o.setAttribute("data-webpack",r+n),o.src=e,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous")),i[e]=[t];var f=(t,n)=>{o.onerror=o.onload=null,clearTimeout(p);var a=i[e];if(delete i[e],o.parentNode&&o.parentNode.removeChild(o),a&&a.forEach(e=>e(n)),t)return t(n)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=f.bind(null,o.onerror),o.onload=f.bind(null,o.onload),s&&document.head.appendChild(o)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o=e?e.src:"",d.p=o.slice(0,o.lastIndexOf("/")+1),(()=>{var e={650:0};d.f.j=(t,n)=>{var a=d.o(e,t)?e[t]:void 0;if(0!==a)if(a)n.push(a[2]);else{var i=new Promise((n,i)=>a=e[t]=[n,i]);n.push(a[2]=i);var r=d.p+d.u(t),o=new Error;d.l(r,n=>{if(d.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var i=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed.\n("+i+": "+r+")",o.name="ChunkLoadError",o.type=i,o.request=r,a[1](o)}},"chunk-"+t,t)}};var t=(t,n)=>{var a,i,[r,o,s]=n,c=0;if(r.some(t=>0!==e[t])){for(a in o)d.o(o,a)&&(d.m[a]=o[a]);s&&s(d)}for(t&&t(n);c<r.length;c++)i=r[c],d.o(e,i)&&e[i]&&e[i][0](),e[i]=0},n=self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674=self.webpackJsonp_c9da73a2a8922d123a7c645bd9888674||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})();var l={};return(()=>{d.r(l),d.d(l,{default:()=>i});var e=d(676),t=d(877),n=d(642);d(574);var a=d(367);class i extends n.BaseClientSideWebPart{SPFxExtensionInstance;allApps=[];appCatalogUrl="/sites/appcatalog";dropDownProps={options:[],selectedKey:"",disabled:!0};appDescription="";hideAppSelectorWhenAppLoaded=!1;hideConfiguratorButton=!1;configDomElement;_isDarkTheme=!1;async onInit(){const t=e.Environment.type===e.EnvironmentType.SharePoint?"SharePoint":"ClassicSharePoint",{initCore:n}=await d.e(548).then(d.bind(d,364));await n(t),this.appCatalogUrl=window.__SPFxExtensions.Utils.ConfiguratorPageUrl}onPropertyPaneConfigurationComplete(){!this.context.propertyPane.isPropertyPaneOpen()&&this.SPFxExtensionInstance&&this.SPFxExtensionInstance.executeListeners("onConfigurationClose",void 0)}onPropertyPaneFieldChanged(e,t,n){if("selectedApp"===e){if(t&&t!==n&&this.SPFxExtensionInstance){if(!confirm("You are about to switch app, this will erase all previous app configuration. Are you sure?"))return void(this.properties[e]=t);this.unmountApp()}n&&(this.webpartSectionElement.remove(),this.mountApp(n).catch(()=>{}))}}onDisplayModeChanged(t){const n=t===e.DisplayMode.Edit?"Read":"Edit";this.SPFxExtensionInstance&&this.SPFxExtensionInstance.executeListeners("onDisplayModeChange",n)}openPropertyPane(){this.context.propertyPane.open()}closePropertyPane(){this.context.propertyPane.close()}isPropertyPaneOpen(){return this.context.propertyPane.isPropertyPaneOpen()}saveConfigValue(e,t=!0){this.properties.SPFxExtensionAppConfiguration=e,t&&this.SPFxExtensionInstance?.executeListeners("onConfigurationChange",e)}getConfigValue(e){if(e){let t=this.properties[e];return void 0===t&&(t=this.properties.SPFxExtensionAppConfiguration),t}return this.properties.SPFxExtensionAppConfiguration}getSearchData(){return{searchableText:this.properties.searchableText,searchableHtml:this.properties.searchableHtml}}setSearchData(e){this.properties.searchableText=e.searchableText,this.properties.searchableHtml=e.searchableHtml}async mountApp(e){this.domElement.innerHTML="";try{const t={domElement:this.domElement,webpartContext:this.context,webpart:this,openPropertyPane:()=>{this.openPropertyPane()},closePropertyPane:()=>{this.closePropertyPane()},isPropertyPaneOpen:()=>this.isPropertyPaneOpen(),saveConfigValue:(e,t=!0)=>{this.saveConfigValue(e,t)},getConfigValue:e=>this.getConfigValue(e),getSearchableData:()=>this.getSearchData(),setSearchableData:e=>{this.setSearchData(e)}};if(this.SPFxExtensionInstance=await window.__SPFxExtensions.InstantiateApp(e,t),!this.SPFxExtensionInstance)return;const n=window.__SPFxExtensions.Apps.find(t=>t.id===e);n&&(this.appDescription=n.description),this.renderCompleted(void 0,!0)}catch(t){console.error(a.Lf,"Error while mounting appid",e,t);const n=new Error(`${t}`);this.renderCompleted(n)}}unmountApp(){this.SPFxExtensionInstance&&this.SPFxExtensionInstance.unmount?.(),this.SPFxExtensionInstance=void 0,this.domElement.innerHTML=""}onDispose(){this.unmountApp()}appButtonElements=[];webpartSectionElement=document.createElement("section");webpartSectionTitle=document.createElement("header");appButtonsWrapper=document.createElement("div");appButtonsContainer=document.createElement("div");generateIconElement(e){const t=document.createElement("i");if(t.classList.add("icon_be4e0fd1"),!e)return t.innerHTML='<svg fill="currentColor" class="___12fm75w f1w7gpdv fez10in fg4l7m0" aria-hidden="true" width="28" height="28" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg"><path d="M20.84 2.66a2.25 2.25 0 0 0-3.18 0L13.5 6.8v-.56c0-1.24-1-2.25-2.25-2.25h-7C3.01 4 2 5.01 2 6.25v18c0 .97.78 1.75 1.75 1.75h18c1.24 0 2.25-1 2.25-2.25v-7c0-1.24-1-2.25-2.25-2.25h-.56l4.16-4.15c.88-.88.88-2.3 0-3.19l-4.5-4.5ZM17.31 14.5H13.5v-3.8l3.8 3.8Zm1.41-10.78c.3-.3.77-.3 1.06 0l4.5 4.5c.3.3.3.77 0 1.06l-4.5 4.51c-.3.3-.77.3-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.07l4.5-4.5ZM12 6.25v8.25H3.5V6.25c0-.41.34-.75.75-.75h7c.41 0 .75.34.75.75Zm-8.5 17.5V16H12v8.5H4.25a.75.75 0 0 1-.75-.75Zm10-7.75h8.25c.41 0 .75.34.75.75v7c0 .42-.34.75-.75.75H13.5V16Z" fill="currentColor"></path></svg>',t;if("font"===e.iconType&&e.fontFamily&&(t.style.fontFamily=e.fontFamily,t.classList.add("iconFont_be4e0fd1")),"url"===e.iconType){const n=document.createElement("img");n.src=e.iconData,t.appendChild(n)}return"svg"===e.iconType&&(t.innerHTML=e.iconData),t}createAndAppendAppButtons(e){const t=document.createElement("button");t.title=a.Bc,t.ariaLabel=a.Bc,t.className="appButton_be4e0fd1";const n=this.generateIconElement(e.icon);t.append(n,e.name),t.title=e.name,t.addEventListener("click",t=>{t.stopPropagation(),t.preventDefault(),this.properties.selectedApp=e.id,this.webpartSectionElement.remove(),this.mountApp(e.id).catch(()=>{})}),this.appButtonsContainer.appendChild(t)}createWebpartSection(e){this.webpartSectionElement.className="applicationListSection_be4e0fd1",this.webpartSectionTitle.className="header_be4e0fd1",this.webpartSectionElement.appendChild(this.webpartSectionTitle),e&&this.webpartSectionElement.appendChild(this.appButtonsWrapper)}renderDisplayMode(){this.webpartSectionElement.ariaLabel=a.oz,this.webpartSectionTitle.textContent=a.oz,this.createWebpartSection(),this.domElement.appendChild(this.webpartSectionElement)}async renderEditMode(){this.webpartSectionElement.ariaLabel=a.Ne,this.webpartSectionTitle.textContent=a.Ne,this.createWebpartSection(!0),this.appButtonsContainer.className="appButtonsContainer_be4e0fd1",this.appButtonsWrapper.appendChild(this.appButtonsContainer),this.appButtonsWrapper.className="appButtonsWrapper_be4e0fd1",this.domElement.appendChild(this.webpartSectionElement),window.__SPFxExtensions.AddAppEventListener("appAdded",e=>{e.isWebPartApp&&this.createAndAppendAppButtons(e)}),window.__SPFxExtensions.Apps.filter(e=>e.registrationCompleted).forEach(e=>{e.isWebPartApp&&this.createAndAppendAppButtons(e)});try{await window.__SPFxExtensions.Utils.spAppInitializationPromise,window.__SPFxExtensions.Utils.appManifestPromises.forEach(e=>{const t=document.createElement("div"),n=document.createElement("span");t.className="buttonLoader_be4e0fd1",n.className="loader_be4e0fd1",t.appendChild(n),this.appButtonsContainer.append(t),e.catch(()=>{}).finally(()=>{t.remove()})})}catch(e){console.error(a.Lf,"Error while awaiting app initialization",e)}}async renderEmptyApp(){this.domElement.innerHTML="",this.domElement.className="SPFxExtensionApp_be4e0fd1",this.displayMode===e.DisplayMode.Read?this.renderDisplayMode():await this.renderEditMode(),this.renderCompleted(void 0,!0)}async render(){if(this.SPFxExtensionInstance){if(!this.SPFxExtensionInstance.unmountOnRender)return void this.SPFxExtensionInstance.executeListeners("onRender",void 0);this.unmountApp()}!this.properties.selectedApp||this.SPFxExtensionInstance?await this.renderEmptyApp():await this.mountApp(this.properties.selectedApp)}renderCompleted(e,t){super.renderCompleted(e,t)}get isRenderAsync(){return!0}get propertiesMetadata(){return{searchableText:{isSearchablePlainText:!0},searchableHtml:{isHtmlString:!0}}}onPropertyPaneConfigurationStart(){window.__SPFxExtensions.AllAppAssetsLoadedPromise.then(()=>{const e=window.__SPFxExtensions.Apps.find(e=>e.id===this.properties.selectedApp);e&&(this.appDescription=e.description,this.hideAppSelectorWhenAppLoaded=e.hideAppSelectorWhenAppLoaded??!1,this.hideConfiguratorButton=e.hideConfiguratorButton??!1),this.dropDownProps.options?.splice(0,this.dropDownProps.options?.length);const t=window.__SPFxExtensions.Apps.filter(e=>e.isWebPartApp).map(e=>({key:e.id,text:e.name}));this.dropDownProps.options?.push(...t),this.dropDownProps.selectedKey=this.properties.selectedApp,this.dropDownProps.disabled=!1,this.context.propertyPane.refresh()}).catch(e=>{console.error(a.Lf,"Error while awaiting all app assets to load",e)})}CustomWebpartConfigurationField(e){return{type:t.PropertyPaneFieldType.Custom,targetProperty:e,properties:{key:"SPFxExtensionAppConfiguration",onRender:(e,t,n)=>{this.configDomElement=e,this.SPFxExtensionInstance&&this.SPFxExtensionInstance.instanceLoadPromise.then(()=>{this.SPFxExtensionInstance?.executeListeners("onConfigurationRender",{domElement:e})}).catch(e=>{console.error(a.Lf,"Error while awaiting app to load",e)})},onDispose:(e,t)=>{this.SPFxExtensionInstance&&this.SPFxExtensionInstance.executeListeners("onConfigurationClose",void 0)}}}}getPropertyPaneConfiguration(){const e={groupFields:[(0,t.PropertyPaneLabel)("spfxExtensionLoaderLabel",{text:"App not working? Try refreshing the page. Or go to the configuration page."}),(0,t.PropertyPaneButton)("configuratorButton",{text:"Open Configurator",buttonType:1,onClick:()=>{window.open(`${this.appCatalogUrl}?web=${this.context.pageContext.web.absoluteUrl}`,"_blank")}})]},n=this.hideConfiguratorButton?[]:[e],a={groupFields:[(0,t.PropertyPaneDropdown)("selectedApp",{label:"App",disabled:this.dropDownProps.disabled,options:this.dropDownProps.options,selectedKey:this.dropDownProps.selectedKey}),(0,t.PropertyPaneLabel)("selectedAppDecription",{text:this.appDescription})]};return{pages:[{groups:[...n,...this.hideAppSelectorWhenAppLoaded?[]:[a],{groupFields:[this.CustomWebpartConfigurationField("SPFxExtensionAppConfiguration")]}]}]}}onThemeChanged(e){if(!e)return;this._isDarkTheme=!!e.isInverted;const{semanticColors:t}=e;t&&(this.domElement.style.setProperty("--bodyText",t.bodyText||null),this.domElement.style.setProperty("--link",t.link||null),this.domElement.style.setProperty("--linkHovered",t.linkHovered||null))}get dataVersion(){return e.Version.parse("1.0")}}})(),l})())})();