Conditionally run jobs in workflow

Right now we have a CircleCI workflow that deploys frontend code, backend code, and a site that shows information about our product. We want to split this into a workflow that conditionally deploys only parts of the app so that if we’ve only changed our backend code, we can have a backend deployment without having to redeploy the frontend code, and so on. What is the best way to accomplish this in CircleCI?

I know I can put the build jobs behind different approval steps (‘deploy all’ vs. ‘deploy frontend’, ‘deploy backend’, etc.), but if I have a variable number of jobs that can be approved on each build and there’s a bit of deployment code that should not run until after all of the approved jobs are complete, I don’t think there’s a way to tell CircleCI to wait until all the approved jobs are done before running the shared code, is there? Also, is there a way to tell which jobs have been approved from within the CircleCI config code?

I would also like to know if this is possible, though for a different reason.

We have some workflows that use more resources, and I’d like to gate those portions of them behind jobs that look at what changed and decide if it makes sense to run the subsequent jobs. So, do the cheaper parts early, then have a job that figures out whether to continue to the later jobs. It would also be nice to see, visually, how much of the workflow completed, and know whether it was a full workflow or a more abbreviated version.