scalajs: get the searchParams from window.location (to parse the query string) - scala.js

scalajs.dom.window.location returns a Location instance.
URL has a searchParams field.
How I get the searchParams from a Location instance?
Note: https://github.com/scala-js/scala-js-dom/blob/master/src/main/scala/org/scalajs/dom/experimental/URL.scala

new dom.experimental.URL(dom.window.location.href).searchParams
Note that this URL class is just a facade for the native JS URL class provided by the browser platform. While it is widely supported by browsers, Internet Explorer does not support searchParams.
Alternatively, you can use java's URL class in a similar manner, or even hand code the parsing of query params.

Related

How to retrieve the Query string value from web word instance

I'm creating a web add-in for Word targeting Word Online. When a document is opened using Word Online, the URL will contain a file name. I am trying to retrieve that file name.
To retrieve this URL I tried using window.location href, but it is fetching my hosted addin web application URL. Is it possible to get the Word Online URL?
Sample Code :
function getParameterByName(name, url) {
if (!url) url = window.location.search;
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
What you should use instead?
You should use Office.js API that's defined here
https://learn.microsoft.com/en-us/javascript/api/office/office.document
Office.context.document.url this should return you something that you can use.
Why didn't your solution work?
Unfortunately this is not possible the way you're trying to implement it due to security requirements around iFrames. Word Online is using an iFrame to host your add-in and accessing the parent window from an iFrame is generally very restricted unless you're specifically allowed.
You can however get the base host url of the parent window by looking into the referrer header, but that's pretty much it. I understand that this is not sufficient for you, which is why I'm recommending to use the Word API.
You can see a bit more documentation below about iFrames:
iFrame spec documentation: https://www.w3.org/TR/2011/WD-html5-20110525/the-iframe-element.html
On getting the url that's loading the frame (the parent URL): https://humanwhocodes.com/blog/2013/04/16/getting-the-url-of-an-iframes-parent/
Some more information on how to communicate between parent and the iFrame using postMessage API if you were whitelisted (which you aren't): https://medium.com/#Farzad_YZ/cross-domain-iframe-parent-communication-403912fff692

How to construct client context in AEM by passing values from an external system?

Is there a way to construct the client context in AEM by using values passed by an external website? The external website sends the user information such as IP address, page data, geolocation, etc. I want to construct the ClientContext JSON without using CQ_Analytics.ClientContextMgr.init, as the information is from an external system.
For eg: We know the location of a visitor to our website. We want to pass this value to AEM and set the client context so that we can get the targeted content for this location.
Our end goal is to get something like this (but we are trying to achieve this without constructing the JSON by ourselves):
CQ_Analytics.ClientContextMgr.clientcontext = JSON.parse('{"profile":{"country":"US"}}');
Is there any Javascript APIs provided by AEM to construct the JSON?
You need to extend the client context using AEM documentation provided at:
Creating a Custom Context Store Component
Follow the instructions till the Initialization part where you will need to populate the data in the jsp file for your extension.
So in your case it would be something this:
if(!locstore){
locstore = CQ_Analytics.JSONPStore.registerNewInstance("<%= store %>",
"<%= jsonpurl %>",{});
}
Where jsonpurl will be the location of your service that provides the external data in json(p) format. This will initialise your store with the values you want and you won't need to worry about the manual json handcrafting.
Client context is constructed on client side using the JS library in AEM. You will need some binding parameters to connect your external data source to the current client context.
The detailed tutorial can be found here.

Jira calls external REST Service

My Problem: I want to introduce a new field in JIRA with status information from external REST Service (response is json).
Plan: Every Jira issue has a input field with some reference string. Behind this field there should be a panel, what should display informations from the external REST call (parsing response JSON is required).
Can someone give me some good info pages, how to tell JIRA to call external REST Service?
If you don't want to build it see:
nFeed
HTTP Feed Custom Field
If you want to build it yourself then start by following this tutorial on Creating a custom field type which is to more or less store a basic String within the database. (This would be the reference string)
You then have two options, the first is within the JiraCustomField class override the getVelocityParameters which was taken from How to call a java method from velocity Atlassian Answers question.
Then create a method (fetchValueFromWebService(String val)) that you would call that would contain code to query the REST Service based off the fields value that would be passed in from the velocity template. (E.g. $instance.fetchValueFromWebService($value))
To perform the actual web service call you can use any library you want, just see the Managing Dependencies documentation so it gets included in the plugin. (For example using the Jira Jersey version see this)
Your other option would be to within the view-basictext.vm have it use javascript and perform an AJAX to the web service by calling a function in your own JS file and dump that into a span that you have defined: (See Including Javascript and CSS resources)
<span id="webServiceValue"></span>
<script type="text/javascript">
fetchValueFromWebService($value);
</script>
You would however need to ensure that the webservice has Cross-origin resource sharing (CORS) enabled if you go the AJAX route.

Play framework: URLs in ajax queries

In HTML, I would do routes.ControllerName.Method to present a link to user that will automatically change when I rename the URLs. How should I do it in links in javascript ajax query URLs?
You need to look up Javascript Reverse Routing in the docs.
Basically, a Play reverse router will generate equivalent JS functions (namespaced per controller) to obtain an URL given the appropriate parameters for each particular action. You then define a separate route to load that JS whenever you need access to those URLs.
I personally find that typing the URL in the JavaScript file makes it the much more readable.
You didn't supply any code so I've included some of my own.
In my one of my Angular factories, I would have something like this
var mainroute = "/api/security";
var submitLogin = function (login) {
return $http({
method: "POST",
url: mainroute + "/login",
data: login
});
};
Then in my route file, I would only need to add the route.
# API
POST /api/security/login controllers.Security.Login()
Using the mainroute variable I can quickly change the parent URL to all the methods.

How to check if URL is a valid link with play framework

I have an input form where user passes in a URL. Currently there is no validation but now need one to verify if URL is a really valid web link or not. I couldn't find any built-in URL validators in play framework. If inputted URL isn't valid then throw an error message to the user. How to go about doing this in play?
Use Java URL class and catch MalformedURLException to detect an invalid URL. Simply instantiate the class with passed string new URL(formUrl)
http://docs.oracle.com/javase/6/docs/api/java/net/URL.html
Information about how to implement a custom form validation can be found here:
http://www.playframework.com/documentation/2.2.x/ScalaCustomValidations