Slips: five kinds, five refusals

A slip is a dated sheet clipped to a card. It says what changed, it comes down by itself when its window closes, and nothing it touched was ever edited. This is the one idea the whole theme is built around: today's change is data with a date window, not a paragraph somebody forgets to delete.

A slip is written at Slips › Add New. It has six controls and no body text.

Control What it is
Kind One of the five below.
Clipped to The card it renders on — a service, a dish, an hours row, or a bookable service.
Dish it replaces For an Instead slip only.
Row it strikes For Hours and Booking slips. Empty means "the card it is clipped to", which is almost always what you want.
Showing from / Until datetime-local, read in your site's timezone, never the server's.
Lines One line per row, text | price. The price is in cents. The same field also accepts the array shape the REST API sends.

Your name and the time are not fields: the slip's author and its post date are what print as "Posted 07:52 by Élise".

The five kinds

Kind The job it does What it does to the card The fields that write it
Today Post today's soup, or anything on for one day only. Adds a line to the card for its window, and fills the row whose line was left empty. Target: the service. Lines: the text, and a price when the line carries one.
Instead Strike a dish, or re-price it for one day. Crosses the row out, stamps its number in the price column, and hides that dish's photograph. Target: the service. Replaces: the dish. A price on the line is today's price; the dish's own does not move.
Hours Close the terrace for the season, or shut one day. Strikes one row of the hours record, on the home page and on the visit page. Target: Hours, then the row — mon to sun, terrace, or a key you added yourself.
Booking Make a service walk-in only for a while. Strikes its booking row, and the derived booking line stops naming it. Target: Booking, then the service. It must be a service you take bookings for.
Note Say something that changes no row. A line on the card, and nothing struck. "The second batch is in", "the last of the season". Target: the card it belongs on. Lines only: no price, no dish, no row key.

How a slip behaves

Behaviour Rule
It strikes the row it supersedes The row keeps its name and its place — the reader has to see what was taken away — takes a 2px strike, carries a stamped slip · n mark in the price column with the word beside it (never colour alone), and loses its thumbnail.
It expires Past Until, it is not rendered, and the card underneath is the truth again. Nothing is deleted: the record and its revisions stay.
It does not render early Before Showing from, it appears nowhere — not on the front end, not in a capture.
It takes room, it never lies on the rows The card composes head, slip lane, rows and foot as siblings in one grid. Nothing is absolutely positioned, so no editor gesture and no viewport can misplace a sheet.
A cached page still knows The card prints the day's schedule and every live slip's window into the page, and a small script re-derives which service is being served and which sheets are still up. See how a cached page knows.
Order Slips on one card sort by the time they were posted, so the day reads in the order it happened.
A target deleted later The slip stops rendering, the front end says nothing at all, and an admin-only notice names it. Never a fatal.

To take a slip down early, move Until into the past, or use the Take a slip down ability. Do not trash it unless you want it gone from the history too.

The five refused shapes

A slip that would render nowhere is refused when you save it, not discovered missing three days later. The same five checks run in the editor, over the REST API and through the agent abilities.

Over REST the insert never happens. On the classic editing screen the slip is kept as a draft and the message is shown as an admin notice — never a fatal, never a silent loss.

These are the messages, word for word. […] is filled in with your own data.

1. It is clipped to something that does not exist

This slip is clipped to the [type] "[id]", which does not exist. A slip renders only on the card of its target, so nobody would ever see this one. Pick one of: […].

2. An "Instead" slip strikes a dish that is not served at that service

This slip strikes [dish] off the [service] card, but [dish] is not served at [service] (it is on: […]). The card would take the strike with no row under it.

Two near misses answer separately:

This "Instead" slip replaces dish [id], which is not on the menu. An "Instead" slip crosses a row out, so it has to name the row it crosses.

This "Instead" slip strikes [dish], but it is clipped to a [type]. The row it crosses out is on a service card, so the slip belongs on that service.

3. An "Hours" slip names a row your hours record does not have

This "Hours" slip strikes the row "[key]", which is not in your hours record. Nothing on the visit page would change. The rows you have are: […].

4. A "Booking" slip names a service you take no bookings for

This "Booking" slip is about "[service]", which takes no bookings, so there is no row on the booking page for it to strike. The services you take bookings for are: […].

5. Its window ends before it starts, or a date is missing

This slip runs from [from] until [to], which ends before it starts. It would never appear on the card. Swap the two dates, or push "Until" past "Showing from".

This slip has no dates. "Showing from" and "Until" are what make it come down by itself; without both, it would never render.

And: it has no lines

This slip has no lines, so the sheet would be clipped to the card blank. Write at least one line — what changed, and its price if it has one.

When a check cannot run

Checks 1 to 4 each need another part of the plugin to be switched on. With that part off, the check is skipped and the skip is named in the notice — "Checks that could not run". A save is never failed because a module is disabled, and a slip is never called fully checked when it was not.

The demo's seven slips

The Mireille demo ships five live, one expired and one still to come, so you can see all three states at once. Every window is stored as an offset from your import day, so they land correctly whatever month you import in.

# Kind Clipped to What it proves
1 Today the Lunch service The soup row, whose line is deliberately empty, gets today's line.
2 Instead Lunch, replacing the mushroom tartine A struck row: the name stays, the strike and stamp appear, the photograph goes.
3 Note the Goûter service A line that changes no row.
4 Hours the terrace row The terrace is struck on both the home page and the visit page.
5 Booking the brunch booking row Weekend brunch reads walk-in only, and the derived booking line stops naming it.
6 Today, expired Lunch Renders nowhere. The card underneath is the truth again.
7 Hours, future the tue row Renders nowhere, on the front end or in a capture.