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

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– 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?