Public: anyone can read this; the crew can change it.
Each new README walkthrough step names the sample listing where the realtor sees it, and the steps are numbered once each #105
Check · Review · Land · Live done — Landed and live in production.
mason/listing-launch:mason/102-each-new-readme-walkthrough-step-names-t → main 1 commit fork
2 files
changed +47
−14
README.md +18 −14
| @@ -137,7 +137,7 @@ to make a listing of your own. | ||
| 137 | 137 | link and a row per asset, each with "Approved by … on …" and its words, or |
| 138 | 138 | "Draft — not approved yet" with no words. Print it at the end of the meeting. In the terminal, `R` on an open |
| 139 | 139 | listing shows the same report, approved words only. |
| 140 | 14. **See the launch week.** Press **Launch week** on a listing: a day-by-day | |
| 140 | 15. **See the launch week.** Press **Launch week** on a listing: a day-by-day | |
| 141 | 141 | plan of which asset goes out when — the Coming soon teaser, launch day (MLS, |
| 142 | 142 | social posts, email blast), price and status posts, and for each open house |
| 143 | 143 | a reminder post the day before and the open house itself. Each row links to |
| @@ -147,40 +147,44 @@ to make a listing of your own. | ||
| 147 | 147 | time, no time zones), launch day being the day the listing was created. |
| 148 | 148 | Nothing is sent; the app only drafts. In the terminal, `w` on an open |
| 149 | 149 | listing shows the same plan as text. |
| 150 | 15. **Draft the seller update.** Open the **Seller update** tab on a listing: a | |
| 150 | 16. **Draft and approve the seller update.** Open the **Seller update** tab on *412 Alder Lane* to read one, then use | |
| 151 | the listing you made in step 3 to approve one: the sample listings belong | |
| 152 | to the sample agent, and only a listing's own agent can approve its words. | |
| 153 | It is a | |
| 151 | 154 | weekly email to the seller, written in the agent's name from what the app |
| 152 | 155 | knows — the address and status, every asset approved in the last seven |
| 153 | 156 | days (who and when), what the launch week has in the next seven days, the |
| 154 | 157 | open house dates and the property page link. Edit it, read the Fair Housing |
| 155 | check, then **Approve** it like any asset; until then it wears "Draft — not | |
| 158 | check, then press **Approve** like any asset; until then it wears "Draft — not | |
| 156 | 159 | approved". It follows approvals while it is an unedited draft, and editing |
| 157 | 160 | the facts or the status clears its approval. An assistant cannot approve it. |
| 158 | 161 | In the terminal it is the last asset of the listing: `j` to it, `a` to approve |
| 159 | 162 | or withdraw. The seller report leaves it out; it is a note, not something |
| 160 | 163 | that goes out. |
| 161 | 16. **See the coming week.** Press **This week** above the list on the first | |
| 164 | 17. **See the coming week.** Press **This week** above the list on the first | |
| 162 | 165 | screen: the next seven days, a section for each day, with every listing's |
| 163 | 166 | posts, emails and open houses that go out that day, and who approved each |
| 164 | 167 | (or Draft). At the top, **Still needs approval** names each listing with |
| 165 | 168 | some of its words not yet approved, such as "3 of 7 approved". *412 Alder |
| 166 | Lane* shows its open house there. **Add to calendar** puts the same week | |
| 169 | Lane* is on this page now: its launch day rows, each marked "Approved by | |
| 170 | Morgan Reyes (sample)". *27 Birchwood Court* and *88 Meridian Street* are | |
| 171 | under **Still needs approval**, with their drafts. (Alder Lane's open house | |
| 172 | is in March, so it joins the week when that date comes within seven days.) **Add to calendar** puts the same week | |
| 167 | 173 | in your calendar. Nothing is sent from this page. |
| 168 | 17. **Write down a showing.** On your own listing, scroll to **Showings**. | |
| 174 | 18. **Write down a showing.** Use the listing you made in step 3: a showing log is only | |
| 175 | visible to the listing's own agent, so the sample listings, which belong to | |
| 176 | the sample agent, show you none. Scroll to **Showings**. | |
| 169 | 177 | Leave the day as today, type the buyer's agent if you know them, pick how |
| 170 | 178 | interested they were (Not interested, Maybe, Interested or Offer likely), |
| 171 | 179 | write one line of what they said and press **Log showing**. It lands at the |
| 172 | 180 | top of the list, newest first, and the first screen now shows "1 showing" |
| 173 | 181 | beside your listing. **Remove** takes it back out. Only you see this log: |
| 174 | it is not on the property page, the flyer or the email. (The sample | |
| 175 | listings belong to the sample agent, so their showings are hers to see.) | |
| 176 | 18. **Approve the seller update.** On your listing open the **Seller update** | |
| 177 | tab: the weekly email to your seller, already written, with what you | |
| 178 | approved this week in it. Read it, then press **Approve**. Until you do, it says "Draft — not approved". | |
| 179 | 19. **Paste the property page link.** On a listing, copy the property page | |
| 180 | link (the **Copy** button) and paste it into a text or a post: the phone | |
| 182 | it is not on the property page, the flyer or the email. | |
| 183 | 19. **Paste the property page link.** Open *412 Alder Lane* and copy its property page | |
| 184 | link (the **Copy** button), or just open it on a phone, and paste it into a text or a post: the phone | |
| 181 | 185 | shows a preview with the address, the price, the beds and baths and the |
| 182 | 186 | first photo. *412 Alder Lane* is approved, so its link works for anyone; |
| 183 | yours shows a page only once you approve the MLS description. | |
| 187 | the listing you made shows a page only once you approve its MLS description. | |
| 184 | 188 | |
| 185 | 189 | `src/walkthrough.test.ts` walks these steps on every `bun test`, so this |
| 186 | 190 | list cannot drift from the app. |
src/walkthrough.test.ts +29
| @@ -272,6 +272,35 @@ test("the week, a showing, the seller update and the link preview, as the sectio | ||
| 272 | 272 | const sample = idOf(home, "412 Alder Lane"); |
| 273 | 273 | const mine = `/listings/${idOf(home, "9 Walkthrough Way")}`; |
| 274 | 274 | |
| 275 | // The numbering counts up once each: no number repeats, none is skipped. | |
| 276 | const numbers = [...readme.slice(readme.indexOf("## Try it in five minutes"), readme.indexOf("## For the agent")).matchAll(/^(\d+)\. \*\*/gm)].map((m) => Number(m[1])); | |
| 277 | expect(numbers.length).toBeGreaterThan(10); | |
| 278 | expect(numbers).toEqual(numbers.map((_, i) => i + 1)); | |
| 279 | // Steps that name a sample say where it is seen, and the agent-only ones send the realtor to their own listing. | |
| 280 | for (const step of ["seller update", "showing"]) | |
| 281 | expect(section).toMatch(new RegExp(`${step}[^]*?the listing you made in step 3`, "i")); | |
| 282 | expect(section).toContain("Open the **Seller update** tab on *412 Alder Lane*"); | |
| 283 | // The seller update step is one step. | |
| 284 | expect(section.match(/\*\*(?:Draft and approve|Approve) the seller update/g)?.length).toBe(1); | |
| 285 | expect(section).not.toContain("**Approve the seller update.**"); | |
| 286 | // The samples the coming-week step names are on the week as it says: Alder Lane approved, the others waiting. | |
| 287 | const sampleWeek = await (await get("/week")).text(); | |
| 288 | const [, waiting, days] = /^([^]*?)<ol class="schedule-days">([^]*)$/.exec(sampleWeek)!; | |
| 289 | expect(section).toContain("Approved by Morgan Reyes (sample)"); | |
| 290 | expect(days).toMatch(/412 Alder Lane[^]*?Approved by Morgan Reyes \(sample\)/); | |
| 291 | expect(waiting).not.toContain("412 Alder Lane"); | |
| 292 | for (const name of ["27 Birchwood Court", "88 Meridian Street"]) { | |
| 293 | expect(section).toContain(name); | |
| 294 | expect(waiting).toContain(name); | |
| 295 | } | |
| 296 | // Its open house is shown where a visitor sees it now: the flyer, in March. | |
| 297 | expect(section).toContain("open house is in March"); | |
| 298 | expect(await (await get(`/listings/${sample}/flyer`)).text()).toContain("March 7"); | |
| 299 | // The sample's seller update can be read where the step says, but approving it is the sample agent's. | |
| 300 | const aldersUpdate = await (await get(`/listings/${sample}`)).text(); | |
| 301 | expect(aldersUpdate).toContain('id="email_update"'); | |
| 302 | expect(/<section class="asset" id="email_update"[^]*?<\/section>/.exec(aldersUpdate)![0]).not.toMatch(/formaction="[^"]*email_update\/approve"/); | |
| 303 | ||
| 275 | 304 | // 16. The coming week. |
| 276 | 305 | for (const label of ["This week", "Still needs approval", "Add to calendar"]) expect(section).toContain(label); |
| 277 | 306 | expect(home).toMatch(control("This week")); |