- Stage 8: replace 3x3 complexity x EAN grid with single syndicationType
dropdown -- Salsify Prep Only (4d), Syndication PDP (5d), Syndication
Non-PDP (3d). Advisor maps contentType to PDP/Non-PDP only; Salsify
Prep Only is not surfaced in the Advisor (team decision).
- Stage 6 (Advisor): derive complexity from staticWorkType / videoWorkType
/ needsHTML toggles via deriveProductionComplexity helper. Precedence
bespoke > creation > complex > simple, max across enabled toggles.
HTML-only falls back to complex (placeholder, may revisit).
- Bump config.json cache-bust to 2026050801.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Simple row reduced across all brackets (4/5/7/7/7 → 2/4/6/6/6). Creation reshaped (5/10/11/13/13 → 7/9/11/11/11). Simple default revision rounds 1 → 2. Complex, bespoke and Opera Upload unchanged. Cache-bust bumped to 2026050601 on both scripts so browsers refetch the new config.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors the change from commit d19f7e7 which removed handover from
the Advisor. Sets handover:0 for all stages, removes grey Handover
phase bars from Gantt, removes Handover column from summary table,
CSV export, and email copy. Bumps script version to bust cache.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Forces browsers to fetch updated market-script.js and script.js
with the Gantt red line position fix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The deadline marker was positioned relative to the outer container but
calculated relative to the timeline column only, placing it LABEL_W px
too far left. Adds LABEL_W offset so EST. COMPLETION (Advisor) and
SUGGESTED LIVE (Calculator) lines land on the correct dates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rename 'live by' label to 'When do you need Oliver tasks completed by?'
- Remove 2-week syndication buffer from calculation and all caveat text
- Add 'Brief Accepted By' + 'Submit Brief By' (2 days earlier) dual lozenges
- Update caveat to include 'assume suitable working files have been provided'
- Add rounds of amends inputs per content type (Static, Video, HTML, Translation)
- Remove handover days from all stage calculations
- Port Gantt sub-phase view to Brief Advisor (WIP/Feedback/Revision, Download PNG)
- Add hidden SLA one-pager link placeholder (#slaPagerLink)
- Restore 200–300 and 300–400 asset volume brackets in Brief Advisor dropdown
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Simplifies asset volume from 6 brackets to 3 (0–50, 50–100, 100–200) per team sign-off.
Updates Production cross-reference table and Opera Upload day map to match new brackets.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extends the 3-tier bracket structure to 5 tiers per updated SLA reference sheet.
Adds dropdown options, crossReferenceTable entries, and Opera Upload day mappings
for the two new tiers across all four complexity levels.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Simplifies asset volume from 6 brackets to 3 (0–50, 50–100, 100–200) per team sign-off.
Updates Production cross-reference table and Opera Upload day map to match new brackets.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- HTML/Rich media default brief type → Creation (was Adaptation)
- Video dropdown now shows all brief types (same as static)
- Static + Video combined: new asset wins over adapting → Creation
- Urgent Brief: hide deadline banner, timeline, and summary cards
- Urgent Brief: add Show/Hide timeline details toggle
- Urgent Brief (eventing, 0-30, static resizing): 6 hrs production + confirmation time
- Video tab: removed (new KV & Visual ID) label, restricted to Adaptation/Creation with video-specific descriptions
- Static feedback days label updated with urgent brief note
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of registering each page as a redirect URI in Azure AD, always
redirect to the registered /loreal-sla-calculator/ URL. Before initiating
the redirect, save the originating page in sessionStorage and navigate
back after the token exchange completes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
alcdn.msauth.net was failing to expose the msal global, causing
"msal is not defined" on auth init.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add analytics.html to STATIC_FILES in deploy.sh
- Add trackEvent/getVisitorId to script.js with page_view, show_results, copy_email hooks
- Add "Analytics →" nav link to index.html and market.html headers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dynamic redirectUri using window.location instead of hardcoded path.
Note: Vadym must register analytics.html as a redirect URI in Azure AD.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Track page views, results clicks, copy-to-email on market page.
Track login events with auth method (SSO/email) and L'Oréal domain detection.
New analytics.html dashboard with charts (Chart.js), period/page filters.
Localhost auth bypass for local dev testing.
Post-deploy: run npm run migrate to create usage_events table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Form: When Static imagery is toggled ON, shows 3 radio options:
- New Asset (creation) — default
- Adapting existing (adaptation)
- Resizing / Cropping (simple)
This feeds into determineBriefType() for smarter auto-suggestions.
Results: Replace static brief type text with a dropdown populated
from all 9 brief types in config.json (consistent with full calculator).
Changing the dropdown recalculates the entire timeline instantly.
Description shown in blue info box with bullet points.
Notes when brief type was manually changed from suggestion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The base stage matrix for brief types like country_pull_adaptation
includes Translation stages by default. In the Brief Advisor, the
user's toggles should be authoritative — if Translation is OFF, those
stages must be removed regardless of the base matrix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add step="0.1" to all 4 feedback day inputs (static, video, HTML, translation)
- Change parseInt → parseFloat so fractional values like 0.5 or 2.5 are preserved
- Business day arithmetic naturally rounds up fractions to next whole business day
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Copy for Email button with rich HTML table (Outlook-compatible)
- Show start → end dates on each timeline stage row
- Syndication toggled ON by default
- Fix translation feedback default to 5 days (matches config.json)
- Restore form validation (disabled button until all fields filled)
- Fix verdict logic in full calculator to include syndication buffer
in deadline comparison (suggestedGoLive vs goLive)
- Differentiate verdict message: production-over vs syndication-short
- Update README with client estimator docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename client.html → market.html and client-script.js → market-script.js
- Update top disclaimer to match bold amber results banner
- Add collapsible "Days needed for feedback" field on each toggle
(Static, Video, HTML, Translation); feeds into stage calculations
- Add "Earliest Go-Live" card in results showing the soonest possible
date if the brief were submitted today
- Update deploy.sh with new filenames
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new "Static imagery" toggle option to the client form.
Static-only production maps to Country Pull - Creation brief type,
while Video/HTML continues to map to Country Pull - Adaptation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The JS engine for client.html was never committed, causing the
date picker and all form logic to fail on the deployed site.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move lead-time and reference-only disclaimers from small grey text
at the bottom to bold amber warning banners positioned right after
the verdict/PM instruction (index.html) and deadline banner
(client.html). Uses warning icon, border-2, and font-bold/semibold
for visibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Brief Advisor page was missing from the Apache deployment,
returning a 404. Added both files to the STATIC_FILES array.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds "Assumes 2-week lead time between syndication and Live Date"
to the Syndication card and results section in both the full SLA
Calculator (index.html) and the Brief Advisor (client.html).
Includes a reference-only disclaimer with BCM confirmation guidance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Opera Upload (stage 7) is now permanently enabled for all brief types.
Toggle is disabled in Step 2, badge is non-clickable in Step 1, and a
"Required" label is shown in both views. Uses config-driven alwaysActive
flag — no hard-coded stage index in JS. Cache-busting bumped to v=2026031302.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Browsers were serving stale cached files after deploy. Added ?v=2026031201
query params to force fresh loads.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add non-contractual dates disclaimer banner at top of page
- Allow decimal values (0.1 step) in revision and approval fields
- Make Opera Upload mandatory for all brief types
- Remove Speed Up by % slider from Production stage
- Extend asset volume brackets: 100-200, 200-300, 300-400
- Update all 9 brief type descriptions with client scope definitions
- Render brief descriptions as bullet lists for clarity
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Base64-encode passwords on the frontend before sending in JSON body,
and decode on the backend before passing to bcrypt. Prevents Nginx WAF
from returning an HTML error page when passwords contain <, >, &, etc.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace bare-bones HTML with a table-based, fully inline-styled email
layout — black header with L'ORÉAL · PARIS wordmark, red accent bar,
clean white body, branded red CTA button, fallback plain-text URL, and
a styled footer. Both password-reset and verification emails share a
single reusable wrapper function.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Gate app access behind Microsoft login so only authenticated L'Oreal
users can use the calculator. Shows spinner overlay during sign-in,
displays user name in header with sign-out button.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- LIST/GANTT toggle buttons switch between table and visual views
- Pure CSS Gantt chart — no external library needed
- Horizontal bars show stage durations with purple gradient colors
- Month markers along the top for timeline context
- Red dashed GO-LIVE deadline marker when visible in range
- Stages 4 & 5 (Translation) shown as parallel bars
- Only active stages displayed in Gantt
- Hover tooltip shows date range and total days per stage
- Legend with stage duration and go-live indicators
- Works in both light and dark modes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Flatpickr now greys out Sat/Sun so they cannot be selected
- minDate set to 'today' to prevent picking dates in the past
- Business day calculations already excluded weekends (addBusinessDays)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Step 4 now shows a green checkmark like completed steps, since reaching
Results means the wizard is complete.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>