👋 Next.js Conf 2024: Come build, party, run, and connect with us! See all events

How do I make a patch request to a document to change its type? This is resulting in an error Cannot modify immutable attribut

11 replies
Last updated: Sep 11, 2020
How do I make a patch request to a document to change its type? This is resulting in an error
Cannot modify immutable attribute \\"_type\\""

{
  "mutations": [
    {
      "patch": {
        "id": "drafts.<document id>",
        "ifRevisionID": "<revision id>",
        "set": {
          "_type": "slidingBanner"
        },
        "unset": [
          "height"
        ]
      }
    }
  ]
}

Sep 10, 2020, 7:54 PM
Note that in this case, this is a top level document which is referenced all over the place. I also am attempting to do this modification to nested objects embedded in other documents.
Sep 10, 2020, 7:55 PM
I am doing a data migration, so this restriction is quite annoying. I can understand that
_type
should not be able to have any other operation other than
set
applied to it, but also preventing
set
? Why?
Sep 10, 2020, 7:56 PM
Note that one of the reasons I want to change the
_type
is because the content sidebar is sorted by the type field, not the title of the schema types, so leaving it alone gives me a giant headache having to explain why it's mostly sorted, but not really.
Sep 10, 2020, 8:01 PM
can't help with the patch issue, but could you create a custom desk structure and sort them yourself?
Sep 10, 2020, 9:02 PM
Something like
S.documentTypeListItems().sort( /* sort by title */ )
Sep 10, 2020, 9:02 PM
Haven't tried to do that for the content sorting, but that seems incredibly silly to need to recreate a component because the default sort is on a visually hidden field instead of the visually prominent title.
I'll have to throw that on my checklist of things to do anyway, since there are some document types I've created that are purely administrative, so I want to implement grouping of document types.

Alas, WYSIWYG editing is higher on my priority list for the higher complexity schemas though.
Sep 10, 2020, 9:06 PM
export default () =>
  S.list()
    .title('Content')
    .items(
      S.documentTypeListItems().sort((a, b) =>
        a.spec.title.localeCompare(b.spec.title),
      ),
    );
Sep 10, 2020, 9:06 PM
hah, well best of luck with it either way!
Sep 10, 2020, 9:07 PM
Thanks for the tip though, saved that for later when I inevitably start bashing my head against my keyboard trying to remember why I know I dont know how to do that.
Sep 10, 2020, 9:11 PM
Hi, this is tricky one since _type is immutable you have to do a full on migration to rename it. Here's a snippet that should help you on the way https://www.github.com/sanity-io/sanity-recipes/tree/master/snippets%2FmigrateDocumentType.js
Sep 11, 2020, 6:07 AM
Ugh. That script doesn't look like it'd handle a deeply nested reference in there. Yeah, gonna pass on renaming the type for now.
Sep 11, 2020, 5:29 PM

Sanity– build remarkable experiences at scale

Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Was this answer helpful?