Join us live Sept. 27 – How Sanity and Vercel powered Morning Brew's transformation –>

disable the publish button for a subset of users while still allowing them to edit the content?

2 replies
Last updated: Sep 17, 2020

I am trying to disable the publish button for a subset of users while still allowing them to edit the content... Is this possible in sanity? Looking at the docs it seems like user permissions are based only on read/write for specific schema types defined in the group definition. Ultimately, I believe I am looking for a way to guard against certain users groups on the documentAction level... Any ideas on how to accomplish?

Sep 17, 2020, 7:48 PM

Hi Sarah, you could set up a custom document action to limit publication to just the administrators on your team, for example:

// documentActions.js

import userStore from 'part:@sanity/base/user';
import { useDocumentOperation } from '@sanity/react-hooks';

const AdminPublish = (props) => {
  const { patch, publish } = useDocumentOperation(this.props.id, this.props.type)
  let buttonDisabled = true;
  const next = ({ user }) => {
    buttonDisabled = user.role !== 'administrator';
  }
  
  userStore.currentUser.subscribe({
    next,
    error: error => console.error(`Failed to get current user: ${error}`),
  })
  
  return {
    label: 'Admin-Publish',
    disabled: buttonDisabled,
    onHandle: () => {
      // Set publishedAt to current date and time
      patch.execute([{ set: { publishedAt: new Date().toISOString() } }])
      // Perform the publish
      publish.execute()
      // Signal that the action is completed
      this.props.onComplete()
      router.navigate('/')
    }
  }
}
export default withRouterHOC(AdminPublish)

// resolveDocumentActions.js

import defaultResolve, { PublishAction } from 'part:@sanity/base/document-actions'

import { AdminPublish } from './documentActions'

export default function resolveDocumentActions(props) {
  return defaultResolve(props)
  .map(Action =>
    Action === PublishAction ? AdminPublish : Action
  )
}

// sanity.json 
// ...

"parts": [ 
  //... 
  { 
    "implements": "part:@sanity/base/document-actions/resolver", 
    "path": "resolveDocumentActions.js" 
  } 
]
More info:
https://www.sanity.io/docs/document-actions

Sep 17, 2020, 9:29 PM

Awesome, thank you so much! This looks great, I will give it a try!

Sep 17, 2020, 9:44 PM

Sanity.io: Get the most out of your content

Sanity.io is a platform to build websites and applications. It comes with great APIs that let you treat content like data. Give your team exactly what they need to edit and publish their content with the customizable Sanity Studio. Get real-time collaboration out of the box. Sanity.io comes with a hosted datastore for JSON documents, query languages like GROQ and GraphQL, CDNs, on-demand asset transformations, presentation agnostic rich text, plugins, and much more.

Don't compromise on developer experience. Join thousands of developers and trusted companies and power your content with Sanity.io. Free to get started, pay-as-you-go on all plans.