Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

React Content Query WebPart - With Metadata Field #537

Open
1 of 3 tasks
marcelaopimenta opened this issue Jun 15, 2018 · 12 comments
Open
1 of 3 tasks

React Content Query WebPart - With Metadata Field #537

marcelaopimenta opened this issue Jun 15, 2018 · 12 comments

Comments

@marcelaopimenta
Copy link

Category

  • Question
  • Bug
  • Enhancement

Hi...

I have one Environment with Sharepoint 2016 On-premises with latest CU.

In my site, i have one library with metadata fields... and if use React Content Query, occur this error...

image

image

This error An error occured while loading fields : Bad Request is beacause request a API /es/_api/web/lists/GetByTitle('Páginas')/Fields?$select=InternalName,Title,TypeAsString&$orderby=Title fails.

image

image

  1. This error, only occur if i have a Metadata Field in Library... If delete field works.
  2. In post in Postman its the same the Content Query Webpart.
  3. I believe that problem is post use application/json;odata.metadata=minimal

If anyone can help me.. :-D

Thanks !!!

@spplante
Copy link
Contributor

spplante commented Jun 19, 2018

@marcelaopimenta sorry for the delay I just saw this issue. What do you mean when you say that the error only occurs when there's a "metadata" field, you mean a "Managed Metada" field as in a "Taxonomy" field? There must be something else with your list because the WebPart does support Taxonomy fields.

It looks weird because as you pointed out, the only thing the WebPart does is a request to the specified URL (GET request not a POST) :

/es/_api/web/lists/GetByTitle('Páginas')/Fields?$select=InternalName,Title,TypeAsString&$orderby=Title

And that request should work no matter what kind of field you have in your list...What happens if you put the URL directly in the browser, does it work or you get the same error?

Also, can you try with the latest version available on this repository? Because I see that the version you have uses the "GetByTitle" in the request, which is problematic because if you change your list title the WebPart will be linked to the old list title and it won't find it anymore.

The WebPart has been updated to use the following now :

let endpoint = Text.format("{0}/_api/web/lists(guid'{1}')/Fields?$select={2}&$orderby={3}", webUrl, listId, selectProps, order);

This version uses the GUID of the list instead of the title, it's also less error prone with list that have special characters like yours. Please try the latest version and let me know if you still have the problem.

@marcelaopimenta
Copy link
Author

Yes, is a Taxonomy field. I have one version older because some things customized.

But, one thing is certain, the problem is not from SPFX or the WebPart, the problem is from SharePoint 2016 OnPremises.
I created the same environment in a SharePoint Online and it worked correctly.

@marcelaopimenta
Copy link
Author

In Sharepoint 2016 On Premises dont work

/_api/web/lists(guid'{1}')/Fields
/_api/web/GetByID(guid'{1}')/Fields
/_api/web/GetByTitle('{1}')/Fields

if you have a Taxonomy Field and use the Accept application/json;odata.metadata=minimal

@spplante
Copy link
Contributor

Yeah that's what I was scared of, because it is a simple REST request there is nothing fancy about it. Out of curiosity, could you use SharePoint Manager to extract the XML definition of the field and paste it here? I wonder if it's not a problem with the specific Taxonomy field that you added to the list, maybe in its name format or something like that.

Is it a field that you deployed or it's a regular field created by the UI?

@marcelaopimenta
Copy link
Author

In my project is an deployed field. But I got to create a new publishing site without data, went into the page library and added a new metadata field in a new TermSet, also created via interface.

I also created sites in English and Spanish... Same faults.

@spplante
Copy link
Contributor

Interesting, what kind of "display name" did you specify when creating the field from the UI? Because when creating fields via the UI, SharePoint builds the internal name of the column using the specified display name, replacing spaces by encodings like x0020x and stuff like that. Did you try creating the column with a regular name without any space or special character at all?

Otherwise it does look like a bug in SharePoint 2016, I have no SP2016 tenant to test on, but if you find a successfull way to execute a GET request with Postman to the problematic endpoint that works for both SP2016 and SPOnline, let me know, I will add the workaround in the project 👍

@marcelaopimenta
Copy link
Author

Hi Simon!

The field calls Teste very simple name...

If i post with:

odata-version: 3.0
Accept: application/json;odata=verbose;charset=utf-8
Content-Type: application/json;odata=verbose;charset=utf-8

Works fine!

image

What changes is the return structure of json, does not use the json light format, because it is verbose now.

if you can create this workaround I will be grateful.

Thanks!

@spplante
Copy link
Contributor

Can you make it work with a GET? Because there is no need to do a POST for getting information. Also, Im am not sure what is the difference between the actual code and the POST you just did, these should be the default settings used by SPFx

odata-version: 3.0
Accept: application/json;odata=verbose;charset=utf-8
Content-Type: application/json;odata=verbose;charset=utf-8

@marcelaopimenta
Copy link
Author

marcelaopimenta commented Jun 21, 2018

I messed up, it's a GET and not a POST.

Sharepoint Framework have two configurations in sp-http

ODATA V3
Content-Type: application/json;odata=verbose;charset=utf-8
Accept: application/json

ODATA V4
Content-Type: application/json;charset=utf-8
Accept: application/json;odata.metadata=minimal

Today, your component using V4... but even if we use V3, it does not work, because only works if using application/json;odata=verbose;charset=utf-8

@spplante
Copy link
Contributor

Oh I see, you can try specifying your own headers to the spHttpClient, since I don't have access to an SP2016 farm right now, let me know if you are able to specify the headers and make it work. If you do find a workaround with custom headers, I could test it for SPO and integrate it in the solution.

Thanks!

@marcelaopimenta
Copy link
Author

marcelaopimenta commented Jun 21, 2018

Hi Simon! Thanks for help! Its Works now!!!!! :-D

In listservice.ts on method getListFields I have added the following code in getlistfields method. I check if Environment is Onpremises and added custom headers.

let options: ISPHttpClientOptions;
if (Environment.type == EnvironmentType.ClassicSharePoint) {
    options = { headers: { 'odata-version': '3.0', 'Content-Type': 'application/json;odata=verbose;charset=utf-8', 'Accept': 'application/json;odata=verbose;charset=utf-8' } };
      }

Change the spHttpClient.Get call for use options

this.spHttpClient.get(endpoint, SPHttpClient.configurations.v1, options).then((response: SPHttpClientResponse) => {
				if(response.ok) {
					resolve(response.json());
				}
				else {
					reject(response);
				}
			})
			.catch((error) => { reject(error); }); 
        });

In methods getFilterFields, getViewFieldsChecklistItems, i changed this point:

   let fields: any[];
              if (Environment.type == EnvironmentType.ClassicSharePoint) {
                fields = data.d.results;
              }
              else {
                fields = data.value;
              }

In Method getOrderByOptions i changed this point:

let sortableFields: any[];
 if (Environment.type == EnvironmentType.ClassicSharePoint) {
       sortableFields = data.d.results;
 }
 else {
       sortableFields = data.value;
 }
 sortableFields.filter((field) => { return field.Sortable == true; });

Thank you!!!!

@spplante
Copy link
Contributor

spplante commented Jun 21, 2018

Good job, I will make sure to implement this is the official version. Meanwhile, I strongly suggest you to append all your changes to the latest version because at least two problems have been fixed since then :

  • Multiple filters losing their orders in IE thus messing the query results
  • Some webs were not appearing when selecting a site based on tenant configurations

Thanks again!

@hugoabernier hugoabernier self-assigned this May 20, 2020
@hugoabernier hugoabernier removed their assignment Jan 6, 2021
@hugoabernier hugoabernier self-assigned this Jan 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants