@mohasinac/appkit 4.42.0 → 4.42.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +2 -30
- package/dist/_internal/server/features/offers/adapters.d.ts +29 -7
- package/dist/_internal/server/features/offers/adapters.js +14 -3
- package/dist/_internal/server/features/orders/adapters.js +54 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.js +1 -0
- package/dist/features/account/components/UserOrdersView.js +30 -2
- package/dist/features/account/hooks/useAddresses.d.ts +21 -6
- package/dist/features/account/hooks/useAddresses.js +1 -1
- package/dist/features/addresses/hooks/usePostalLookup.js +84 -12
- package/dist/features/admin/components/AdminCategoriesView.js +37 -2
- package/dist/features/admin/components/AdminOffersView.js +2 -2
- package/dist/features/admin/constants/filter-tabs.d.ts +25 -0
- package/dist/features/admin/constants/filter-tabs.js +30 -0
- package/dist/features/admin/hooks/useAdminListingData.d.ts +35 -0
- package/dist/features/admin/hooks/useAdminListingData.js +45 -9
- package/dist/features/cart/schemas/index.d.ts +15 -0
- package/dist/features/cart/schemas/index.js +2 -0
- package/dist/features/cart/types/index.d.ts +22 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +19 -1
- package/dist/features/categories/components/CategoriesIndexPageView.js +14 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +8 -0
- package/dist/features/classified/components/ClassifiedDetailPageView.js +1 -0
- package/dist/features/events/actions/event-actions.d.ts +13 -0
- package/dist/features/events/actions/event-actions.js +75 -1
- package/dist/features/events/repository/event-entry.repository.d.ts +17 -0
- package/dist/features/events/repository/event-entry.repository.js +36 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CustomerReviewsSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +1 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +1 -1
- package/dist/features/layout/AppLayoutShell.js +2 -2
- package/dist/features/layout/BottomNavLayout.d.ts +9 -3
- package/dist/features/layout/BottomNavLayout.js +9 -3
- package/dist/features/media/upload/MediaUploadField.js +21 -3
- package/dist/features/orders/components/OrdersList.js +2 -1
- package/dist/features/orders/index.d.ts +1 -0
- package/dist/features/orders/index.js +1 -0
- package/dist/features/orders/types/index.d.ts +2 -0
- package/dist/features/orders/utils/order-ref.d.ts +45 -0
- package/dist/features/orders/utils/order-ref.js +58 -0
- package/dist/features/products/components/MakeOfferButton.d.ts +18 -1
- package/dist/features/products/components/MakeOfferButton.js +23 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +5 -0
- package/dist/features/products/components/ProductDetailPageView.js +3 -2
- package/dist/features/products/repository/products.repository.js +29 -2
- package/dist/features/seller/actions/offer-actions.js +32 -0
- package/dist/features/seller/components/QuickProductForm.js +15 -1
- package/dist/features/seller/components/SellerBidsView.js +3 -1
- package/dist/features/seller/components/SellerOffersView.js +2 -2
- package/dist/features/seller/components/SellerOrdersView.js +49 -6
- package/dist/features/seller/components/SellerProductsCards.js +23 -1
- package/dist/features/seller/components/SellerProductsView.js +27 -2
- package/dist/features/seller/hooks/useSellerListingData.d.ts +0 -1
- package/dist/features/seller/hooks/useSellerListingData.js +17 -19
- package/dist/features/shell/SectionForm.js +33 -2
- package/dist/features/tester/seed-data/_happy-path.d.ts +23 -0
- package/dist/features/tester/seed-data/_happy-path.js +710 -0
- package/dist/features/tester/seed-data/_money-flows.js +34 -23
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +22 -3
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +17 -12
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +7 -6
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +10 -4
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +13 -8
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +49 -11
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +10 -6
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +71 -32
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +80 -31
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +62 -25
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +61 -31
- package/dist/features/tester/seed-data/authored/admin__bundles.js +84 -37
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +90 -57
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +38 -26
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +47 -28
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +118 -31
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +30 -24
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +83 -46
- package/dist/features/tester/seed-data/authored/admin__coupons.js +8 -8
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +9 -9
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +19 -4
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +77 -33
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +5 -5
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +29 -5
- package/dist/features/tester/seed-data/authored/admin__site-system.js +45 -23
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +53 -28
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +20 -20
- package/dist/features/tester/seed-data/authored/buying__bidding.js +19 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +20 -5
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +28 -10
- package/dist/features/tester/seed-data/authored/buying__cart.js +10 -3
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -16
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +27 -5
- package/dist/features/tester/seed-data/authored/buying__offers.js +22 -7
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +3 -3
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +35 -4
- package/dist/features/tester/seed-data/authored/buying__return-request.js +19 -6
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +36 -18
- package/dist/features/tester/seed-data/authored/buying__reviews.js +16 -1
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +8 -6
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +16 -1
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +3 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +4 -4
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +19 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +4 -4
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +5 -5
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +41 -6
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +63 -8
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +29 -29
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +2 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +23 -1
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +6 -6
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +1 -1
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +1 -1
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +31 -6
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +34 -10
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -8
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +31 -9
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +29 -3
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +1 -1
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +10 -10
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +3 -3
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +2 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +2 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +4 -4
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +4 -4
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +8 -8
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +2 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +2 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +39 -16
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +43 -8
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +40 -14
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +31 -14
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +7 -6
- package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +14 -5
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +3 -3
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +1 -1
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +4 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +3 -3
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +5 -5
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +5 -5
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +3 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +45 -11
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -17
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +36 -5
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +29 -4
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +23 -0
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +14 -13
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +14 -9
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +34 -7
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +17 -7
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +9 -9
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +9 -4
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +3 -3
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +3 -3
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +25 -1
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +27 -6
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +19 -1
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +63 -22
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +9 -5
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +7 -6
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +3 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +18 -18
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +13 -12
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +19 -3
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +22 -4
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +20 -8
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +10 -9
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +2 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +5 -5
- package/dist/features/tester/seed-data/authored/seo__og-images.js +1 -1
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +7 -7
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +3 -3
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +126 -24
- package/dist/features/tester/utils/phases.d.ts +17 -0
- package/dist/features/tester/utils/phases.js +29 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/seo/json-ld.d.ts +23 -0
- package/dist/seo/json-ld.js +3 -2
- package/dist/server.d.ts +1 -0
- package/dist/server.js +2 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/package.json +1 -1
|
@@ -39,7 +39,7 @@ export const authored = {
|
|
|
39
39
|
startPage: "/products/product-beyblade-original-dranzer-s",
|
|
40
40
|
steps: [
|
|
41
41
|
"Open /products/product-beyblade-original-dranzer-s in a private window at 1280 pixels wide.",
|
|
42
|
-
"Scroll down past 400 pixels so both the sticky buy bar and the back-to-top control are showing.",
|
|
42
|
+
"Scroll down past 400 pixels so both the sticky buy bar and the back-to-top control are showing. Both reveal at exactly 400 — BottomActions.DESKTOP_REVEAL_SCROLL_PX and BackToTop's own default threshold are the same number — so on desktop they appear on the SAME scroll tick and any overlap is deterministic rather than a matter of timing. There is no need to hunt for the moment they collide.",
|
|
43
43
|
"Look at where the back-to-top control sits relative to the buy bar.",
|
|
44
44
|
"Try to click both the back-to-top control and each button in the buy bar.",
|
|
45
45
|
"Resize to 390 pixels wide and repeat.",
|
|
@@ -22,7 +22,7 @@ export const authored = {
|
|
|
22
22
|
roles: ["guest"],
|
|
23
23
|
startPage: "/",
|
|
24
24
|
steps: [
|
|
25
|
-
"Open / in a private window at 1280 pixels wide.",
|
|
25
|
+
"Open / in a private window at 1280 pixels wide. 🛑 EVERY STEP BELOW MEANS THE CARD CAROUSELS — 'Featured Products', 'Live Auctions', 'Shop by Category', 'Reserve Before It Ships' — and NOT the full-bleed hero slider at the top of the page, which is a different component with its own arrows and its own behaviour. Reading the hero instead is the easiest way to record a finding about the wrong thing.",
|
|
26
26
|
"Scroll to a horizontal card carousel.",
|
|
27
27
|
"Look at the left and right arrows and what sits under each.",
|
|
28
28
|
"Read the title and the price row (signed out that row reads 'Sign in to see price') of the first and last visible cards.",
|
|
@@ -37,7 +37,7 @@ export const authored = {
|
|
|
37
37
|
roles: ["guest"],
|
|
38
38
|
startPage: "/",
|
|
39
39
|
steps: [
|
|
40
|
-
"Open / in a private window at 1280 pixels wide and scroll to
|
|
40
|
+
"Open / in a private window at 1280 pixels wide and scroll to the 'Featured Products' carousel.",
|
|
41
41
|
"Click the right arrow once and watch the cards move.",
|
|
42
42
|
"While the cards are still moving, look at where the arrows are.",
|
|
43
43
|
"Let it settle and look again.",
|
|
@@ -52,7 +52,7 @@ export const authored = {
|
|
|
52
52
|
startPage: "/",
|
|
53
53
|
steps: [
|
|
54
54
|
"Resize the browser window to 390 pixels wide and open / in a private window.",
|
|
55
|
-
"Scroll to
|
|
55
|
+
"Scroll to the 'Featured Products' carousel and look for arrows.",
|
|
56
56
|
"Swipe the rail and check it moves.",
|
|
57
57
|
"Resize to 1280 pixels and look for the arrows again.",
|
|
58
58
|
],
|
|
@@ -66,7 +66,7 @@ export const authored = {
|
|
|
66
66
|
startPage: "/",
|
|
67
67
|
steps: [
|
|
68
68
|
"Resize the browser window to 390 pixels wide and open / in a private window.",
|
|
69
|
-
"Scroll to
|
|
69
|
+
"Scroll to the 'Featured Products' carousel and look at the first card's left edge.",
|
|
70
70
|
"Look at the last card's right edge after swiping to the end.",
|
|
71
71
|
"Read each visible card's title and price row in full.",
|
|
72
72
|
"Try to scroll the page sideways rather than the rail.",
|
|
@@ -81,7 +81,7 @@ export const authored = {
|
|
|
81
81
|
startPage: "/",
|
|
82
82
|
steps: [
|
|
83
83
|
"Resize the browser window to 390 pixels wide and open / in a private window.",
|
|
84
|
-
"Scroll to
|
|
84
|
+
"Scroll to the 'Featured Products' carousel and swipe it left with a short flick.",
|
|
85
85
|
"Watch where it comes to rest.",
|
|
86
86
|
"Swipe again with a long flick and watch where it rests.",
|
|
87
87
|
"Swipe back to the start.",
|
|
@@ -95,7 +95,7 @@ export const authored = {
|
|
|
95
95
|
roles: ["guest"],
|
|
96
96
|
startPage: "/",
|
|
97
97
|
steps: [
|
|
98
|
-
"Open / in a private window in light mode at 1280 pixels and scroll to
|
|
98
|
+
"Open / in a private window in light mode at 1280 pixels and scroll to the 'Featured Products' carousel.",
|
|
99
99
|
"Look at the left and right edges of the rail for a fade or gradient overlay.",
|
|
100
100
|
"Switch to dark mode and look at the same edges.",
|
|
101
101
|
"Scroll the rail to the middle and look again in dark mode.",
|
|
@@ -108,7 +108,7 @@ export const authored = {
|
|
|
108
108
|
roles: ["guest"],
|
|
109
109
|
startPage: "/",
|
|
110
110
|
steps: [
|
|
111
|
-
"Open / in a private window at 1280 pixels and find a carousel whose cards
|
|
111
|
+
"Open / in a private window at 1280 pixels and find a carousel whose cards are TALLER than the Featured Products row — 'Live Auctions' carries a countdown and bid line, so its cards run taller than a plain product card. If no section on the page wraps to two rows, say so and test the tallest single row instead rather than hunting for a layout that may not exist.",
|
|
112
112
|
"Look at the arrows' vertical position relative to the rail.",
|
|
113
113
|
"Check whether they are centred on the full height or on one row.",
|
|
114
114
|
"Click each and check it scrolls the whole rail.",
|
|
@@ -122,7 +122,7 @@ export const authored = {
|
|
|
122
122
|
startPage: "/",
|
|
123
123
|
steps: [
|
|
124
124
|
"Open / in a private window and switch to dark mode.",
|
|
125
|
-
"Scroll to
|
|
125
|
+
"Scroll to the 'Featured Products' carousel and look at both arrows.",
|
|
126
126
|
"Hover each and look at it while hovering.",
|
|
127
127
|
"Compare their visibility against light mode.",
|
|
128
128
|
],
|
|
@@ -134,7 +134,7 @@ export const authored = {
|
|
|
134
134
|
roles: ["guest"],
|
|
135
135
|
startPage: "/",
|
|
136
136
|
steps: [
|
|
137
|
-
"Open / in a private window at 1280 pixels and scroll to
|
|
137
|
+
"Open / in a private window at 1280 pixels and scroll to the 'Featured Products' carousel.",
|
|
138
138
|
"Look at the left arrow while the rail is at its start.",
|
|
139
139
|
"Click right repeatedly to the end of the rail.",
|
|
140
140
|
"Look at the right arrow at the end and at the rail's position.",
|
|
@@ -148,7 +148,7 @@ export const authored = {
|
|
|
148
148
|
roles: ["guest"],
|
|
149
149
|
startPage: "/",
|
|
150
150
|
steps: [
|
|
151
|
-
"Open / in a private window at 1280 pixels and scroll to
|
|
151
|
+
"Open / in a private window at 1280 pixels and scroll to the 'Featured Products' carousel.",
|
|
152
152
|
"Slowly resize the window down through 1024, 768 and 640 to 390 pixels, watching the rail throughout.",
|
|
153
153
|
"Note the width at which the arrows disappear.",
|
|
154
154
|
"Slowly resize back up to 1280, watching the rail.",
|
|
@@ -24,7 +24,7 @@ export const authored = {
|
|
|
24
24
|
startPage: "/admin",
|
|
25
25
|
steps: [
|
|
26
26
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
27
|
-
"Open /admin and read the sidebar's group headings.",
|
|
27
|
+
"Open /admin — it redirects to the admin dashboard, which is expected — and read the sidebar's group headings. There are TWELVE, and exactly one, 'Guides', ships defaultOpen:false, so a group already closed on arrival is the fixture rather than a collapse you caused.",
|
|
28
28
|
"Collapse one expanded group and read what remains.",
|
|
29
29
|
"Expand a collapsed group and read its contents.",
|
|
30
30
|
"Navigate to another admin page using the sidebar.",
|
|
@@ -40,7 +40,7 @@ export const authored = {
|
|
|
40
40
|
startPage: "/store",
|
|
41
41
|
steps: [
|
|
42
42
|
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
43
|
-
"Open /store and read the sidebar's group headings.",
|
|
43
|
+
"Open /store and read the sidebar's group headings. There are SIX — Overview, Listings, Orders & Reviews, Finance, Store, Guides — and the last, 'Guides', ships defaultOpen:false.",
|
|
44
44
|
"Collapse one expanded group and read what remains.",
|
|
45
45
|
"Expand a collapsed group and read its contents.",
|
|
46
46
|
"Navigate to another store page using the sidebar and read the state.",
|
|
@@ -55,7 +55,7 @@ export const authored = {
|
|
|
55
55
|
startPage: "/user",
|
|
56
56
|
steps: [
|
|
57
57
|
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
58
|
-
"Open /user and read the sidebar's group headings.",
|
|
58
|
+
"Open /user and read the sidebar's group headings. There are FIVE, and none ships collapsed — so on this portal every group should be open on arrival, which makes an already-closed one a real finding here rather than the fixture.",
|
|
59
59
|
"Collapse one expanded group and read what remains.",
|
|
60
60
|
"Expand a collapsed group and read its contents.",
|
|
61
61
|
"Navigate to another user page using the sidebar and read the state.",
|
|
@@ -38,8 +38,8 @@ export const authored = {
|
|
|
38
38
|
startPage: "/",
|
|
39
39
|
steps: [
|
|
40
40
|
"Open / in a private window and scroll to the footer.",
|
|
41
|
-
"Find the GitHub icon and look at its size relative to the other social icons.",
|
|
42
|
-
"Hover it and read any tooltip or label.",
|
|
41
|
+
"Find the GitHub icon and look at its size relative to the other social icon. There are exactly TWO — WhatsApp and GitHub, both inline SVGs at w-4 h-4 in src/constants/footer.tsx — so 'the other social icons' means one neighbour, and any size difference between two identically-classed SVGs is a real finding rather than a judgement call.",
|
|
42
|
+
"Hover it and read any tooltip or label. Its aria-label reads 'View the developer’s GitHub profile' — with a straight apostrophe in source — so a screen-reader label that differs, or is missing, is the finding.",
|
|
43
43
|
"Click it and read where it lands.",
|
|
44
44
|
"Switch to dark mode and look at the icon again.",
|
|
45
45
|
],
|
|
@@ -59,8 +59,8 @@ export const authored = {
|
|
|
59
59
|
startPage: "/store/products/new",
|
|
60
60
|
steps: [
|
|
61
61
|
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
62
|
-
"Open /store/products/new
|
|
63
|
-
"Advance past the first
|
|
62
|
+
"Open /store/products/new and click 'Show all fields (advanced)'. 🛑 IT IS NOT A WIZARD BY DEFAULT: a standard create opens the QUICK form — six flat fields, no steps at all — so there is no step for an error to be tagged with until you switch. The advanced form is the sectionised one this case is about.",
|
|
63
|
+
"Advance past the first section leaving a required field on it empty, and continue to a later section.",
|
|
64
64
|
"Leave a required field on that later step empty too.",
|
|
65
65
|
"Attempt to publish.",
|
|
66
66
|
"Read the summary and note whether each error names the step it belongs to.",
|
|
@@ -57,7 +57,7 @@ export const authored = {
|
|
|
57
57
|
steps: [
|
|
58
58
|
"Open / in a private window and find the theme control.",
|
|
59
59
|
"Switch to dark mode and read the page.",
|
|
60
|
-
"Navigate to /products, then to
|
|
60
|
+
"Navigate to /products, then to /products/product-beyblade-burst-valkyrie, reading each.",
|
|
61
61
|
"Reload the page and watch the first moment it paints.",
|
|
62
62
|
"Set the theme control to follow the system setting and change the system theme.",
|
|
63
63
|
],
|
|
@@ -72,7 +72,7 @@ export const authored = {
|
|
|
72
72
|
"Open browser DevTools and throttle the network to a slow connection.",
|
|
73
73
|
"Open /products in a private window and watch the page while it loads.",
|
|
74
74
|
"Read what occupies the grid area before the cards arrive.",
|
|
75
|
-
"Navigate to
|
|
75
|
+
"Navigate to /products/product-beyblade-burst-valkyrie and watch the same.",
|
|
76
76
|
"Wait and check the loading state resolves rather than persisting.",
|
|
77
77
|
"Remove the throttle.",
|
|
78
78
|
],
|
|
@@ -130,7 +130,7 @@ export const authored = {
|
|
|
130
130
|
startPage: "/products",
|
|
131
131
|
steps: [
|
|
132
132
|
"Open /products in a private window and look at the watermark on several card images.",
|
|
133
|
-
"Open
|
|
133
|
+
"Open /products/product-beyblade-burst-valkyrie and look at the watermark on the main gallery image.",
|
|
134
134
|
"Open the image lightbox and look at it there.",
|
|
135
135
|
"Judge whether the product itself is still clearly visible under it.",
|
|
136
136
|
"Look at a video's poster frame and check it carries the watermark too.",
|
|
@@ -146,7 +146,7 @@ export const authored = {
|
|
|
146
146
|
"Open /products/product-beyblade-burst-valkyrie in a private window.",
|
|
147
147
|
"Look at the thumbnail strip below the main image and check each tile shows a picture.",
|
|
148
148
|
"Click a thumbnail and check the main image changes.",
|
|
149
|
-
"Open
|
|
149
|
+
"Open /products/product-beyblade-original-dranzer-s and look at the 'Photos' grid on its reviews. That product is the seed's deep-review fixture — 14 reviews, of which every fourth carries images, so FOUR have photos. Picking any other product risks one with no photo grid at all, and an absent grid is indistinguishable from the collapsed one this case is looking for.",
|
|
150
150
|
"Open the review lightbox and look at its thumbnail strip.",
|
|
151
151
|
"Open /bundles/bundle-original-collectors-set and look at its member collage.",
|
|
152
152
|
],
|
|
@@ -73,7 +73,7 @@ export const authored = {
|
|
|
73
73
|
"Sign in as rehan.sheikh@gmail.com / TempPass123! and turn on 'Left-hand mode'.",
|
|
74
74
|
"Open /products and scroll past 400 pixels so the back-to-top control appears.",
|
|
75
75
|
"Note which side of the viewport it is on.",
|
|
76
|
-
"Open
|
|
76
|
+
"Open /products/product-beyblade-burst-valkyrie, scroll until the purchase bar appears, and check the control still clears the bar.",
|
|
77
77
|
"Turn 'Left-hand mode' off and check both again.",
|
|
78
78
|
],
|
|
79
79
|
inputs: { leftHandMode: true },
|
|
@@ -227,12 +227,12 @@ export const authored = {
|
|
|
227
227
|
"Resize the browser window to 390 pixels wide and open /user.",
|
|
228
228
|
"Look at the bottom tab bar and write down its items in order.",
|
|
229
229
|
"Count the bottom bars present.",
|
|
230
|
+
"Compare the item order against the public bar from the sibling case (checklist-design-ux-hand-mode-layout-bottom-nav-mirror, on /).",
|
|
230
231
|
"Turn 'Left-hand mode' off and check both again.",
|
|
231
|
-
"Compare the dashboard's bar against the public one from the previous case.",
|
|
232
232
|
],
|
|
233
233
|
inputs: { leftHandMode: true, mobileWidth: 390 },
|
|
234
|
-
expectedBehaviour: "
|
|
235
|
-
expectedUiState: "
|
|
234
|
+
expectedBehaviour: "BEFORE (fixed 2026-09-28): /user rendered its own dashboard-specific bottom bar, so this case was testing whether a second, separate implementation happened to mirror the same way as the public one. AFTER: /user renders the exact same shared bottom bar component as every public page — there is only one implementation, so hand-mode mirroring is inherited for free rather than needing its own logic. Exactly one bottom bar is mounted.",
|
|
235
|
+
expectedUiState: "The /user bottom bar's items and order match the public bar's from the sibling case, in both hand-mode states, because it is literally the same bar. Exactly one bottom bar is present throughout.",
|
|
236
236
|
expectedData: { bottomNavCount: 1 },
|
|
237
237
|
endResult: "The mode is off again by the last step; restore the window width.",
|
|
238
238
|
},
|
|
@@ -286,10 +286,10 @@ export const authored = {
|
|
|
286
286
|
},
|
|
287
287
|
"checklist-design-ux-homepage-carousels-section-config-actually-renders": {
|
|
288
288
|
roles: ["admin", "guest"],
|
|
289
|
-
startPage: "/admin",
|
|
289
|
+
startPage: "/admin/sections",
|
|
290
290
|
steps: [
|
|
291
291
|
"Sign in as admin@letitrip.in / TempPass123! and open the homepage sections editor.",
|
|
292
|
-
"Open one section's configuration and write down every field it offers.",
|
|
292
|
+
"Open /admin/sections — the homepage sections editor; /admin is only a redirect to the dashboard — then open one section's configuration and write down every field it offers.",
|
|
293
293
|
"Change a visible field — a heading or an item limit — and save.",
|
|
294
294
|
"Open / in a private window and read that section.",
|
|
295
295
|
"Check whether the change is reflected.",
|
|
@@ -301,10 +301,10 @@ export const authored = {
|
|
|
301
301
|
},
|
|
302
302
|
"checklist-design-ux-homepage-carousels-section-save-preserves-other-fields": {
|
|
303
303
|
roles: ["admin"],
|
|
304
|
-
startPage: "/admin",
|
|
304
|
+
startPage: "/admin/sections",
|
|
305
305
|
steps: [
|
|
306
306
|
"Sign in as admin@letitrip.in / TempPass123! and open the homepage sections editor.",
|
|
307
|
-
"Open one section and write down the value of EVERY field it holds.",
|
|
307
|
+
"Open /admin/sections, then one section, and write down the value of EVERY field it holds.",
|
|
308
308
|
"Change exactly one field and save.",
|
|
309
309
|
"RELOAD the editor and read every field again.",
|
|
310
310
|
"Compare against what was written down.",
|
|
@@ -316,10 +316,10 @@ export const authored = {
|
|
|
316
316
|
},
|
|
317
317
|
"checklist-design-ux-homepage-carousels-carousel-toggles-take-effect": {
|
|
318
318
|
roles: ["admin", "guest"],
|
|
319
|
-
startPage: "/admin",
|
|
319
|
+
startPage: "/admin/carousel",
|
|
320
320
|
steps: [
|
|
321
321
|
"Sign in as admin@letitrip.in / TempPass123! and open the carousel or homepage section settings.",
|
|
322
|
-
"
|
|
322
|
+
"Open /admin/carousel — the flat hero-SLIDE editor, singular; /admin/carousels plural is the named-carousel list and is a different feature — and note which carousel-related toggles are offered and their current states.",
|
|
323
323
|
"Turn one off and save.",
|
|
324
324
|
"Open / in a private window and check whether that behaviour has stopped.",
|
|
325
325
|
"Turn it back on, save, and check the behaviour returns.",
|
|
@@ -330,10 +330,10 @@ export const authored = {
|
|
|
330
330
|
},
|
|
331
331
|
"checklist-design-ux-homepage-carousels-banner-buttons-from-config": {
|
|
332
332
|
roles: ["admin", "guest"],
|
|
333
|
-
startPage: "/admin",
|
|
333
|
+
startPage: "/admin/carousel",
|
|
334
334
|
steps: [
|
|
335
335
|
"Sign in as admin@letitrip.in / TempPass123! and open the homepage section holding a banner with buttons.",
|
|
336
|
-
"
|
|
336
|
+
"Open /admin/carousel, the flat hero-slide editor, then change a button's label to 'QA Banner buttons-from-config' and its destination to /about, and save.",
|
|
337
337
|
"Open / in a private window and find that banner.",
|
|
338
338
|
"Read the button's label and click it.",
|
|
339
339
|
"Read where it lands.",
|
|
@@ -87,7 +87,7 @@ export const authored = {
|
|
|
87
87
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
88
88
|
"Open /admin/users, find karthik.new@gmail.com, and apply a soft ban with a reason.",
|
|
89
89
|
"Lift the ban again.",
|
|
90
|
-
"
|
|
90
|
+
"Swap identity: this case lists roles [admin, buyer] and the harness resolves that to ADMIN, so it opens signed in as the admin. Copy tester/.tester-runs/session-buyer.json over session.json, CLOSE THE BROWSER, then sign in as karthik.new@gmail.com / TempPass123!.",
|
|
91
91
|
"Open /user/notifications and read the ban-lift notification's title AND its body.",
|
|
92
92
|
],
|
|
93
93
|
inputs: { targetUser: "karthik.new@gmail.com" },
|
|
@@ -100,7 +100,7 @@ export const authored = {
|
|
|
100
100
|
startPage: "/products/product-beyblade-burst-valkyrie",
|
|
101
101
|
steps: [
|
|
102
102
|
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
103
|
-
"Open a product this account has bought and leave a review.",
|
|
103
|
+
"Open a product this account has bought and leave a review. 🛑 EXPECT NO CONTROL FOR THIS and record that as the finding rather than as a failure to look properly: createReviewAction, useCreateReview and the UI_TEXT.WRITE_REVIEW string all exist, but no .tsx consumes any of them — the only review modal is read-only. If there is genuinely no way to write a review, answer null for this case and report the missing control; do not improvise through an API, which would test a path no buyer can reach.",
|
|
104
104
|
"Sign out and sign in as tyson@beybladearena.in / TempPass123!, the store owner.",
|
|
105
105
|
"Open /store and check for a notification about the new review.",
|
|
106
106
|
"Read its title, its body and where its link goes.",
|
|
@@ -79,7 +79,7 @@ export const authored = {
|
|
|
79
79
|
],
|
|
80
80
|
inputs: { productId: "product-beyblade-burst-valkyrie", quantity: 1 },
|
|
81
81
|
expectedBehaviour: "The bar's controls are the real controls, not decorative copies — each performs the same action as its counterpart in the page panel and reflects its own loading state.",
|
|
82
|
-
expectedUiState: "The label changes while the request runs and the cart badge increases. /cart holds '
|
|
82
|
+
expectedUiState: "The label changes while the request runs and the cart badge increases. /cart holds 'Beyblade Burst Valkyrie' at ₹1,899.00. The wishlist control in the bar also acts rather than doing nothing.",
|
|
83
83
|
endResult: "Empty the cart and the wishlist afterwards so later cases start clean.",
|
|
84
84
|
},
|
|
85
85
|
"checklist-design-ux-sticky-cta-bar-desktop-not-covering-footer": {
|
|
@@ -123,7 +123,7 @@ export const authored = {
|
|
|
123
123
|
"Check the bar offers bidding and not 'Add to Cart'.",
|
|
124
124
|
],
|
|
125
125
|
expectedBehaviour: "An auction's bar carries the live countdown and a bidding action, because auctions are capability-blocked from the cart. A bar offering Add to Cart here means it is publishing the default rather than the type's own.",
|
|
126
|
-
expectedUiState: "BEFORE: the bar read '₹15,000.00 · 1 bid' to anyone. AFTER, signed out: it reads 'Sign in to see the
|
|
126
|
+
expectedUiState: "BEFORE: the bar read '₹15,000.00 · 1 bid' to anyone. AFTER, signed out: it reads exactly 'Sign in to see price' — the whole label, with the bid-count suffix DROPPED. Record that suffix loss: a bid count is not an amount (it is deliberately excluded from the money-sort list for that reason), so hiding it is inconsistent with the rest of the gate, but it is what the one label-building branch does today and is not this case's pass/fail. A ticking countdown whose seconds figure is lower after 3 seconds sits beside it. Its action is 'Place a bid' or Buy Now — never 'Add to Cart'. A frozen countdown is a fail even though the number looks right.",
|
|
127
127
|
endResult: "Read-only; restore the window width afterwards.",
|
|
128
128
|
},
|
|
129
129
|
"checklist-design-ux-sticky-cta-bar-ended-auction-no-bar": {
|
|
@@ -11,6 +11,21 @@
|
|
|
11
11
|
* nothing, or wrote the wrong thing. The screen after saving looked correct in
|
|
12
12
|
* every one of them; only the reload told the truth.
|
|
13
13
|
*
|
|
14
|
+
* 🛑 SLOTS 1-5 ARE ALREADY BOOKED IN THE SEED (corrected 2026-09-29), so the
|
|
15
|
+
* first case could not start: it told the tester to pull slot 3, and slot 3 is
|
|
16
|
+
* taken by 'Arjun M'. `maxPullsPerUser` is 1 on this lottery, so a pull is also
|
|
17
|
+
* a once-per-persona-per-run action and a poor fixture for a case about
|
|
18
|
+
* surviving an edit. The seeded bookings ARE the fixture; no pull is needed.
|
|
19
|
+
*
|
|
20
|
+
* 🛑 AND NONE OF THE FIVE BOOKERS IS A REAL ACCOUNT. user-ravi-k,
|
|
21
|
+
* user-priya-s, user-arjun-m, user-sneha-p and user-vikram-r appear in
|
|
22
|
+
* events-seed-data.ts (as lotteryConfig.slots[].bookedByUserId) and in
|
|
23
|
+
* lottery-entries-seed-data.ts, and NONE of them exists in users-seed-data.ts.
|
|
24
|
+
* So nobody can sign in as the person who booked slot 3, and any step asking
|
|
25
|
+
* for that is unperformable. The buyer-side check is done from the public page
|
|
26
|
+
* instead, which needs no account. Recorded in OUTOFSCOPE: dangling seed FKs
|
|
27
|
+
* are data, and repairing them is not a case edit.
|
|
28
|
+
*
|
|
14
29
|
* @tag domain:tester
|
|
15
30
|
* @tag layer:seed
|
|
16
31
|
* @tag pattern:none
|
|
@@ -20,23 +35,28 @@
|
|
|
20
35
|
*/
|
|
21
36
|
export const authored = {
|
|
22
37
|
"checklist-page-wiring-data-loss-lottery-edit-preserves-bookings": {
|
|
23
|
-
roles: ["
|
|
38
|
+
roles: ["admin", "guest"],
|
|
24
39
|
startPage: "/admin/lotteries",
|
|
25
40
|
steps: [
|
|
26
|
-
"Sign in as
|
|
27
|
-
"
|
|
28
|
-
"Read the slot grid and note that slot 3 now shows as booked, with the buyer name and lottery number against it.",
|
|
29
|
-
"Sign out and sign in as admin@letitrip.in / TempPass123!.",
|
|
41
|
+
"Sign in as admin@letitrip.in / TempPass123! and open /lottery/event-pokemon-number-draw-july-2026.",
|
|
42
|
+
"Read the slot grid and write down slots 1 to 5 — all five are booked in the seed — recording each slot number, the buyer name shown against it and its lottery number.",
|
|
30
43
|
"Open /admin/lotteries and open the editor for that lottery.",
|
|
31
|
-
"Rename slot number 7 to 'QA Slot lottery-edit-preserves-bookings' —
|
|
44
|
+
"Rename slot number 7 to 'QA Slot lottery-edit-preserves-bookings'. Slot 7 is 'Alakazam Base Set Holo' and is NOT booked — renaming an unbooked slot is the whole point.",
|
|
32
45
|
"Save.",
|
|
33
|
-
"Reload the editor and read slot
|
|
34
|
-
"
|
|
46
|
+
"Reload the editor and read slots 1 to 5 against what was written down, then read slot 7.",
|
|
47
|
+
"Read the price on each of slots 1 to 5 as well — slot 1 is 5000, slot 3 is 2500 — and confirm none has become 0.",
|
|
48
|
+
"Sign out and open /lottery/event-pokemon-number-draw-july-2026 to read the same five slots as a visitor sees them.",
|
|
35
49
|
],
|
|
36
|
-
inputs: {
|
|
50
|
+
inputs: {
|
|
51
|
+
bookedSlots: "1, 2, 3, 4, 5",
|
|
52
|
+
renamedSlot: 7,
|
|
53
|
+
newName: "QA Slot lottery-edit-preserves-bookings",
|
|
54
|
+
slot1Price: 5000,
|
|
55
|
+
slot3Price: 2500,
|
|
56
|
+
},
|
|
37
57
|
expectedBehaviour: "The write shape cannot express booking state at all, so an admin editing prize names cannot touch attendance. Bookings are re-attached from the stored config and matched by slot NUMBER, never by array position — deleting a slot shifts every later index, and an index-wise merge hands slot 7's buyer the prize that was slot 8's.",
|
|
38
|
-
expectedUiState: "After the save and reload,
|
|
39
|
-
expectedData: {
|
|
58
|
+
expectedUiState: "After the save and reload, all five booked slots are still booked, carrying the same buyer names and the same lottery numbers. Slot 7 carries its new name. Every price is unchanged — a grid of zeros is the same defect's twin, caused by seeding the editor from the public projection, which strips price and weight. The public page shows the same five slots still taken.",
|
|
59
|
+
expectedData: { bookedSlotsAfterSave: 5, slotsPricedZero: 0 },
|
|
40
60
|
endResult: "The pull survives the admin edit. The editor once sent isBooked:false for every slot into a passthrough route, so the first save of a live lottery marked every purchased slot available again and erased the buyers — with a success message and no error anywhere.",
|
|
41
61
|
},
|
|
42
62
|
"checklist-page-wiring-data-loss-lottery-booked-slot-cannot-be-deleted": {
|
|
@@ -45,7 +65,7 @@ export const authored = {
|
|
|
45
65
|
steps: [
|
|
46
66
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
47
67
|
"Open /admin/lotteries and open the editor for event-pokemon-number-draw-july-2026.",
|
|
48
|
-
"Find the
|
|
68
|
+
"Find slot number 3, which the seed ships already booked by 'Arjun M' — no earlier case has to run for this to be true.",
|
|
49
69
|
"Remove that slot from the list.",
|
|
50
70
|
"Save.",
|
|
51
71
|
"Read the error message.",
|
|
@@ -62,16 +82,19 @@ export const authored = {
|
|
|
62
82
|
startPage: "/admin/grouped-listings",
|
|
63
83
|
steps: [
|
|
64
84
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
65
|
-
"Open /admin/grouped-listings
|
|
66
|
-
"Open
|
|
85
|
+
"Open /admin/grouped-listings, find group-beyblade-original-lineage, and write down its exact title.",
|
|
86
|
+
"Open /admin/grouped-listings/group-beyblade-original-lineage/edit.",
|
|
67
87
|
"Replace the title with 'QA Group admin-grouped-listing-title-actually-saves'.",
|
|
68
88
|
"Save and read the confirmation.",
|
|
69
89
|
"RELOAD the page.",
|
|
70
90
|
"Read the title.",
|
|
71
91
|
"Set the title back to what it was and save.",
|
|
72
92
|
],
|
|
73
|
-
inputs: {
|
|
74
|
-
|
|
93
|
+
inputs: {
|
|
94
|
+
group: "group-beyblade-original-lineage",
|
|
95
|
+
newTitle: "QA Group admin-grouped-listing-title-actually-saves",
|
|
96
|
+
},
|
|
97
|
+
expectedBehaviour: "The admin PATCH accepts every field the editor can send, not just productIds. A Zod object schema STRIPS unknown keys rather than rejecting them, so a schema listing only productIds turned a title change into a perfectly normal 200 that wrote nothing at all. Verified fixed on 2026-09-29 — the admin route now parses the same strict schema as the seller route, so a pass here is the expected result. It is kept because the failure was invisible without a reload and would return the moment the two schemas diverge again.",
|
|
75
98
|
expectedUiState: "After the reload the title is the new one. A save confirmation followed by the OLD title after reload is the exact failure — and without the reload the screen looks identical either way, because the form is still showing what was typed.",
|
|
76
99
|
expectedData: { titlePersisted: true },
|
|
77
100
|
endResult: "The title is restored to its original value by the final step, so other cases that read this group by name still work.",
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* WHY: Authored six-part procedures for the page-wiring/detail-pages page.
|
|
3
|
-
* WHAT:
|
|
3
|
+
* WHAT: 3 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* 🛑 REHAN NEVER BID (corrected 2026-09-29). The identity case said to find a
|
|
6
|
+
* bid placed by rehan.sheikh@gmail.com. Only three personas bid anywhere in the
|
|
7
|
+
* seed: user-rohit-collector, user-ananya-collector and user-meera-bey. So the
|
|
8
|
+
* step found nothing, and its buyer half would then have been signing in as
|
|
9
|
+
* someone looking at another person's bid, which is a different test entirely.
|
|
10
|
+
*
|
|
11
|
+
* Bid ids are DERIVED and therefore knowable:
|
|
12
|
+
* bid-{auctionSuffix}-{userSuffix}-20260601-{NNN}
|
|
13
|
+
* so the first bid on auction-beyblade-original-dragoon-storm is
|
|
14
|
+
* bid-beyblade-original-dragoon-storm-rohit-collector-20260601-000
|
|
15
|
+
* That auction has three distinct bidders, which is what makes it the right
|
|
16
|
+
* fixture for a case about seeing other people's identities.
|
|
17
|
+
*
|
|
18
|
+
* ONE builder, FOUR viewers. `buildBidDetailFields(bid, viewer)` is called by
|
|
19
|
+
* AdminBidsView's modal ('admin'), UserBidsView ('buyer'), SellerBidsView
|
|
20
|
+
* ('seller') and the shared BidDetailPageClient behind all three /view pages.
|
|
21
|
+
* Its only viewer-dependent row is Bidder, added when viewer !== 'buyer'. The
|
|
22
|
+
* seller leg had no case at all and now has one.
|
|
4
23
|
*
|
|
5
24
|
* Written by hand, case by case, against the label each one states. There is no
|
|
6
25
|
* generator: the authoring scripts were deleted once it was clear they were
|
|
@@ -21,8 +40,8 @@ export const authored = {
|
|
|
21
40
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
22
41
|
"Open /admin/bids and open the first bid row so its modal appears.",
|
|
23
42
|
"Write down every field label the modal shows, in order.",
|
|
24
|
-
"
|
|
25
|
-
"
|
|
43
|
+
"Click the modal's 'Open full page' link and note the URL it lands on.",
|
|
44
|
+
"Confirm that URL is /admin/bids/{that bid id}/view.",
|
|
26
45
|
"Write down every field label that page shows, in order.",
|
|
27
46
|
"Compare the two lists.",
|
|
28
47
|
],
|
|
@@ -35,16 +54,32 @@ export const authored = {
|
|
|
35
54
|
startPage: "/admin/bids",
|
|
36
55
|
steps: [
|
|
37
56
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
38
|
-
"Open /admin/bids
|
|
39
|
-
"Copy that bid's id and open /admin/bids/{id}/view.",
|
|
57
|
+
"Open /admin/bids/bid-beyblade-original-dragoon-storm-rohit-collector-20260601-000/view directly. It is the first of three bids on auction-beyblade-original-dragoon-storm, placed by rohit.collect@gmail.com.",
|
|
40
58
|
"Write down every bidder name and identifier shown anywhere on the page.",
|
|
41
|
-
"Sign out and sign in as
|
|
42
|
-
"Open /user/bids/
|
|
59
|
+
"Sign out and sign in as rohit.collect@gmail.com / TempPass123!, the buyer who placed it.",
|
|
60
|
+
"Open /user/bids/bid-beyblade-original-dragoon-storm-rohit-collector-20260601-000/view.",
|
|
43
61
|
"Write down every bidder name and identifier shown anywhere on that page, including in the page source.",
|
|
44
62
|
],
|
|
45
63
|
expectedBehaviour: "One viewer argument decides what each portal reveals, in one place. The admin view may name other bidders because moderating a dispute requires it; the buyer's own view must not, because a competitor's identity is not the buyer's to see.",
|
|
46
|
-
expectedUiState: "The admin page
|
|
64
|
+
expectedUiState: "The admin page shows a Bidder row naming who placed it; the buyer page omits that row entirely — it is the one field buildBidDetailFields makes viewer-dependent, added only when the viewer is not the buyer. Check the page source too, not merely what is rendered. A competing bidder's real name anywhere in the buyer view is a leak.",
|
|
47
65
|
expectedData: { otherBidderNamesInBuyerView: 0 },
|
|
48
66
|
endResult: "Read-only; nothing persists. A buyer view that shows nothing at all also fails — the buyer must still see their own bid.",
|
|
49
67
|
},
|
|
68
|
+
"checklist-page-wiring-detail-pages-detail-page-seller-sees-bidder": {
|
|
69
|
+
roles: ["seller"],
|
|
70
|
+
startPage: "/store/bids",
|
|
71
|
+
steps: [
|
|
72
|
+
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
73
|
+
"Open /store/bids and open the first bid row so its modal appears.",
|
|
74
|
+
"Write down every field label the modal shows, in order.",
|
|
75
|
+
"Open /store/bids/bid-beyblade-original-dragoon-storm-rohit-collector-20260601-000/view directly.",
|
|
76
|
+
"Write down every field label that page shows, in order, and compare the two lists.",
|
|
77
|
+
"Read whether a Bidder row is present and what it names.",
|
|
78
|
+
],
|
|
79
|
+
inputs: { bidId: "bid-beyblade-original-dragoon-storm-rohit-collector-20260601-000", viewer: "seller" },
|
|
80
|
+
expectedBehaviour: "The seller is the third viewer of the same field builder, and the only one with no case until now. A seller running an auction needs to know who bid, so the Bidder row is present for them as it is for an admin; the buyer is the single viewer it is withheld from.",
|
|
81
|
+
expectedUiState: "The modal and the page show the same labels in the same order. A Bidder row is present and names the bidder. If it is absent, the seller cannot tell who is bidding on their own auction — and if the buyer view gained one, that is the leak the case above tests.",
|
|
82
|
+
expectedData: { bidderRowShown: true },
|
|
83
|
+
endResult: "Read-only; nothing persists. Every bid on this auction belongs to store-beyblade-arena, which is tyson's store, so the seller is entitled to see it.",
|
|
84
|
+
},
|
|
50
85
|
};
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* WHY: Authored six-part procedures for the page-wiring/drawer-pages page.
|
|
3
|
-
* WHAT:
|
|
3
|
+
* WHAT: 3 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* 🛑 "EDITOR AS A PAGE" IS TWO DIFFERENT SHAPES, and the cases assumed one
|
|
6
|
+
* (corrected 2026-09-29). Checked route by route:
|
|
7
|
+
*
|
|
8
|
+
* drawer-as-page /admin/team/new, /admin/navigation/new — the editor hard-
|
|
9
|
+
* renders <SideDrawer> with no headless mode, so the page
|
|
10
|
+
* mounts it permanently open and wires onClose to navigate
|
|
11
|
+
* back to the list. Here "close the panel" is literal.
|
|
12
|
+
* full page /admin/tester-checklist/new (StackedViewShell +
|
|
13
|
+
* SectionForm), /admin/carousels/new (a Section/Container
|
|
14
|
+
* with a back Link), /store/stickers/new (a product shell).
|
|
15
|
+
* There is no panel and nothing to close; the way back is a
|
|
16
|
+
* Cancel button or a link.
|
|
17
|
+
*
|
|
18
|
+
* Both are correct. What matters for every case here is the same two things —
|
|
19
|
+
* the form is usable on arrival, and there is a way back to its list — so the
|
|
20
|
+
* steps now ask for that rather than for a drawer that two thirds of these
|
|
21
|
+
* routes do not have. A tester hunting a panel on /store/stickers/new would
|
|
22
|
+
* otherwise report a defect that is really a second, equally valid shape.
|
|
23
|
+
*
|
|
24
|
+
* All 19 routes named in step prose below were verified to exist on
|
|
25
|
+
* 2026-09-29. Worth repeating rather than trusting: the hrefs audit validates
|
|
26
|
+
* href and startPage only, so a route named inside a step is checked by nobody.
|
|
4
27
|
*
|
|
5
28
|
* Written by hand, case by case, against the label each one states. There is no
|
|
6
29
|
* generator: the authoring scripts were deleted once it was clear they were
|
|
@@ -20,15 +43,18 @@ export const authored = {
|
|
|
20
43
|
steps: [
|
|
21
44
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
22
45
|
"Open /admin/team/new directly in the address bar.",
|
|
23
|
-
"Read what is on screen without clicking anything.",
|
|
46
|
+
"Read what is on screen without clicking anything — this one is a drawer mounted permanently open.",
|
|
24
47
|
"Close the panel and read the address bar.",
|
|
25
|
-
"Open /admin/navigation/new directly
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"Close it and read the address bar.",
|
|
48
|
+
"Open /admin/navigation/new directly, read what is on screen, close it, and read the address bar. This is the same drawer-as-page shape.",
|
|
49
|
+
"Open /admin/tester-checklist/new directly and read what is on screen. This one is a FULL PAGE, not a drawer, so look for a Cancel or back control rather than a panel to close.",
|
|
50
|
+
"Use that control and read the address bar.",
|
|
29
51
|
],
|
|
30
|
-
|
|
31
|
-
|
|
52
|
+
inputs: {
|
|
53
|
+
drawerAsPage: "/admin/team/new, /admin/navigation/new",
|
|
54
|
+
fullPage: "/admin/tester-checklist/new",
|
|
55
|
+
},
|
|
56
|
+
expectedBehaviour: "An editor reached by URL is usable the moment it loads, and offers a way back to the list it belongs to — so the page is a real destination rather than a dead end. Whether that is a drawer mounted open or an ordinary page is an implementation choice and both are correct; what fails is arriving at a blank page, or having no way back.",
|
|
57
|
+
expectedUiState: "All three URLs render their form immediately, with no blank page and nothing to click first. Leaving each one lands on /admin/team, /admin/navigation and /admin/tester-checklist respectively, not on a 404 and not on the dashboard. 🛑 Only the first two have a panel to close; the third is a full page and its absence of a drawer is not a finding.",
|
|
32
58
|
endResult: "Nothing is created — close each panel rather than saving. A blank page behind a closed drawer is the failure this catches.",
|
|
33
59
|
},
|
|
34
60
|
"checklist-page-wiring-drawer-pages-page-drawer-deep-link-survives-reload": {
|
|
@@ -53,14 +79,14 @@ export const authored = {
|
|
|
53
79
|
steps: [
|
|
54
80
|
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
55
81
|
"Open each of these by URL in turn: /admin/categories/new, /admin/brands/new, /admin/bundles/new, /admin/faqs/new, /admin/ads/new, /admin/shipments/new, /admin/addresses/new, /admin/grouped-listings/new, /admin/sublisting-categories/new, /admin/carousel/new, /admin/carousels/new.",
|
|
56
|
-
"On each, note whether the form is
|
|
57
|
-
"
|
|
82
|
+
"On each, note whether the form is usable on arrival or the page is blank.",
|
|
83
|
+
"Leave each one — a drawer close, a Cancel button or a back link, whichever it offers — and note where the browser lands.",
|
|
58
84
|
"Sign in as tyson@beybladearena.in / TempPass123! and repeat for /store/addresses/new, /store/sublisting-categories/new, /store/stickers/new, /store/pre-orders/new and /store/listing-templates/new.",
|
|
59
85
|
"Record every route that arrives blank and every cancel that lands nowhere.",
|
|
60
86
|
],
|
|
61
|
-
expectedBehaviour: "Every editor-as-a-page route
|
|
62
|
-
expectedUiState: "All sixteen arrive with
|
|
63
|
-
expectedData: { blankEditorRoutes: 0 },
|
|
64
|
-
endResult: "Nothing is saved.",
|
|
87
|
+
expectedBehaviour: "Every editor-as-a-page route arrives with its form usable and offers a way back to its own list. These sixteen are distinct from the three named in the first case on this page, and none of them is named anywhere else in the catalogue, so a blank one is a working URL with nothing on it and no error to report.",
|
|
88
|
+
expectedUiState: "All sixteen arrive with a usable form and get back to the matching list. Each blank arrival is a finding, and so is each exit that lands on a dead route, both named by route. 🛑 These are NOT all drawers: /admin/carousels/new is a plain page with a back link and /store/stickers/new is a product shell, so record how each one offers its way back rather than expecting a panel.",
|
|
89
|
+
expectedData: { blankEditorRoutes: 0, routesChecked: 16 },
|
|
90
|
+
endResult: "Nothing is saved. Every one of these routes was verified to exist on 2026-09-29, so a 404 here means one was deleted since, which is itself the finding.",
|
|
65
91
|
},
|
|
66
92
|
};
|