From 7885343cbb6fcbbdf3e8a95579befa6d98faeeca Mon Sep 17 00:00:00 2001 From: DJP Date: Wed, 19 Nov 2025 22:21:20 -0500 Subject: [PATCH] Implemented dependent dropdowns, updated AI prompt for strict hierarchy and clarification logic, and added security rules --- .htaccess | 19 ++ api.php | 50 ++-- script.js | 76 +++-- ...porter_at_oliver_agency_1763606650508.json | 262 ++++++++++++++++ ...porter_at_oliver_agency_1763607466781.json | 282 ++++++++++++++++++ sheets_metadata.json | 16 + 6 files changed, 652 insertions(+), 53 deletions(-) create mode 100644 .htaccess create mode 100644 sheets/daveporter_at_oliver_agency_1763606650508.json create mode 100644 sheets/daveporter_at_oliver_agency_1763607466781.json diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..1a1d56d --- /dev/null +++ b/.htaccess @@ -0,0 +1,19 @@ +# Protect sensitive files + + Order Allow,Deny + Deny from all + + +# Prevent directory listing +Options -Indexes + +# Allow access to specific public files if needed, but the above rule is specific enough. +# The above rule blocks: +# - config.php +# - sheet_helpers.php +# - Any .json file (data.json, sheets/*.json) +# - Any .log file (activity.log) +# - Any hidden file (.git, .DS_Store) + +# Ensure index.php is the default index +DirectoryIndex index.php diff --git a/api.php b/api.php index b4e2197..84fe7a1 100644 --- a/api.php +++ b/api.php @@ -191,29 +191,31 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { - Number (Auto-generated, do not invent) - Title (String) - Status (Enum: Booked, To-do, In Progress, Done) - Default to 'Booked' - - Category (Enum: 'Digital', 'DOOH', 'Online - Banner - Celtra', 'OOH', 'Print', 'Video') - - Media (Enum: 'POS', 'OOH', 'Social', 'Community management', 'Online advertising', 'Banner', 'Rich media', 'Landing page', 'Static Image', 'Video', 'Push notifications', '.com', 'Print', 'Digital', 'Direct mail', 'Packaging', 'TV', 'Cinema', 'Radio', 'VOD') - - Sub-media (Dependent on Media): - * POS: Wobbler, Display, Sticker, Poster, Shelf Talker - * OOH: Billboard, City Light, Bus Stop, Digital Screen, Transit - * Social: Instagram, Facebook, TikTok, LinkedIn, Twitter/X, Pinterest, Snapchat, YouTube - * Community management: Post, Reply, Story, Moderation - * Online advertising: Display, Native, Programmatic - * Banner: Standard, Animated, HTML5, Static - * Rich media: Expandable, Interstitial, Video - * Landing page: Microsite, Product Page, Campaign Page - * Static Image: JPEG, PNG, Hero Image - * Video: TVC, OLV, Social Video, Bumper, Long Form - * Push notifications: App Push, Web Push - * .com: Homepage, Product Page, Blog - * Print: Magazine, Newspaper, Flyer, Poster, Brochure - * Digital: Banner, Email, Website, App - * Direct mail: Letter, Postcard, Catalog - * Packaging: Box, Label, Bag - * TV: Spot, Sponsorship - * Cinema: Pre-roll, Spot - * Radio: Spot, Sponsorship - * VOD: Pre-roll, Mid-roll + - Category (Enum: 'Digital', 'Print', 'Out of Home', 'Video') + - Media (Dependent on Category - see below) + - Sub-media (Dependent on Category AND Media - see below) + + HIERARCHY RULES (Strictly follow these combinations): + 1. Category: Digital + - Media: Online Advertising -> Sub-media: Banner, Rich Media, Landing Page, Static Image, Video, Push notifications, .com + - Media: Social -> Sub-media: GIF, Video, Static Image, Multi-Asset Build + - Media: Community management -> Sub-media: (None) + - Media: POS -> Sub-media: Digital + + 2. Category: Print + - Media: POS -> Sub-media: Print + - Media: Out of Home -> Sub-media: Print + - Media: Direct Mail -> Sub-media: Print + - Media: Packaging -> Sub-media: Print + + 3. Category: Out of Home + - Media: Out of Home -> Sub-media: Print, Digital + + 4. Category: Video + - Media: POS -> Sub-media: Video + - Media: Online Advertising -> Sub-media: Video + - Media: Social -> Sub-media: Video + - Media: Broadcast -> Sub-media: TV, Cinema, Radio, VOD - Format (String) - Extract sizes/dimensions here! e.g., '300x250', 'A4', '10x15cm', 'Full Page', '1080p'. - Supply date (YYYY-MM-DD) - Live date (YYYY-MM-DD) @@ -247,6 +249,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { Your calculation: 2 formats × 4 countries × 2 titles = 16 items Since 16 ≠ 10, return: {\"operation\": \"question\", \"text\": \"I calculated 16 items (2 formats × 4 countries × 2 titles). Did you mean 16 items total, or should I create only 10 items with a different pattern?\"} * ONLY create items if the math matches OR if the user didn't specify a total count. + * **EXCEPTION - CONFIRMATION**: If the user's input is a confirmation of the count (e.g., \"Yes\", \"20\", \"Correct\"), DO NOT ask again. EXECUTE with the confirmed count. + * **CHECK HISTORY**: If you just asked \"I calculated X...\", and user says \"X\", PROCEED immediately. - If the request is vague (no title, format, etc.), ask for clarification using the 'question' operation. diff --git a/script.js b/script.js index 1699ce3..e30658b 100644 --- a/script.js +++ b/script.js @@ -91,34 +91,34 @@ document.addEventListener('DOMContentLoaded', () => { { id: 'VI', name: 'Vietnamese' } ]; - const categoryOptions = ['Digital', 'DOOH', 'Online - Banner - Celtra', 'OOH', 'Print', 'Video']; - const mediaOptions = ['POS', 'OOH', 'Social', 'Community management', 'Online advertising', 'Banner', 'Rich media', 'Landing page', 'Static Image', 'Video', 'Push notifications', '.com', 'Print', 'Digital', 'Direct mail', 'Packaging', 'TV', 'Cinema', 'Radio', 'VOD']; - - const subMediaMap = { - 'POS': ['Wobbler', 'Display', 'Sticker', 'Poster', 'Shelf Talker'], - 'OOH': ['Billboard', 'City Light', 'Bus Stop', 'Digital Screen', 'Transit'], - 'Social': ['Instagram', 'Facebook', 'TikTok', 'LinkedIn', 'Twitter/X', 'Pinterest', 'Snapchat', 'YouTube'], - 'Community management': ['Post', 'Reply', 'Story', 'Moderation'], - 'Online advertising': ['Display', 'Native', 'Programmatic'], - 'Banner': ['Standard', 'Animated', 'HTML5', 'Static'], - 'Rich media': ['Expandable', 'Interstitial', 'Video'], - 'Landing page': ['Microsite', 'Product Page', 'Campaign Page'], - 'Static Image': ['JPEG', 'PNG', 'Hero Image'], - 'Video': ['TVC', 'OLV', 'Social Video', 'Bumper', 'Long Form'], - 'Push notifications': ['App Push', 'Web Push'], - '.com': ['Homepage', 'Product Page', 'Blog'], - 'Print': ['Magazine', 'Newspaper', 'Flyer', 'Poster', 'Brochure'], - 'Digital': ['Banner', 'Email', 'Website', 'App'], - 'Direct mail': ['Letter', 'Postcard', 'Catalog'], - 'Packaging': ['Box', 'Label', 'Bag'], - 'TV': ['Spot', 'Sponsorship'], - 'Cinema': ['Pre-roll', 'Spot'], - 'Radio': ['Spot', 'Sponsorship'], - 'VOD': ['Pre-roll', 'Mid-roll'] + // --- Data Hierarchy --- + const hierarchy = { + 'Digital': { + 'Online Advertising': ['Banner', 'Rich Media', 'Landing Page', 'Static Image', 'Video', 'Push notifications', '.com'], + 'Social': ['GIF', 'Video', 'Static Image', 'Multi-Asset Build'], + 'Community management': [], // No sub-media + 'POS': ['Digital'] + }, + 'Print': { + 'POS': ['Print'], + 'Out of Home': ['Print'], + 'Direct Mail': ['Print'], + 'Packaging': ['Print'] + }, + 'Out of Home': { + 'Out of Home': ['Print', 'Digital'] + }, + 'Video': { + 'POS': ['Video'], + 'Online Advertising': ['Video'], + 'Social': ['Video'], + 'Broadcast': ['TV', 'Cinema', 'Radio', 'VOD'] // Assumed 'War Cost' -> Broadcast + } }; - // Flatten unique sub-media options for the source - const allSubMediaOptions = [...new Set(Object.values(subMediaMap).flat())].sort(); + const categoryOptions = Object.keys(hierarchy); + const allMediaOptions = [...new Set(Object.values(hierarchy).flatMap(Object.keys))].sort(); + const allSubMediaOptions = [...new Set(Object.values(hierarchy).flatMap(m => Object.values(m)).flat())].sort(); // --- Sheet Management --- let activeSheetId = localStorage.getItem('activeSheetId') || null; @@ -355,7 +355,21 @@ document.addEventListener('DOMContentLoaded', () => { { type: 'text', title: 'Title', width: 300, name: 'Title' }, { type: 'dropdown', title: 'Status', width: 100, name: 'Status', source: statusOptions }, { type: 'dropdown', title: 'Category', width: 120, name: 'Category', source: categoryOptions }, - { type: 'dropdown', title: 'Media', width: 120, name: 'Media', source: mediaOptions }, + { + type: 'dropdown', + title: 'Media', + width: 120, + name: 'Media', + source: allMediaOptions, + filter: function (instance, cell, c, r, source) { + const jexcel = instance.jexcel || instance; + const categoryValue = jexcel.getValueFromCoords(3, r); // Category is at index 3 + if (hierarchy[categoryValue]) { + return Object.keys(hierarchy[categoryValue]); + } + return source; + } + }, { type: 'dropdown', title: 'Sub-media', @@ -364,11 +378,13 @@ document.addEventListener('DOMContentLoaded', () => { source: allSubMediaOptions, filter: function (instance, cell, c, r, source) { const jexcel = instance.jexcel || instance; + const categoryValue = jexcel.getValueFromCoords(3, r); // Category is at index 3 const mediaValue = jexcel.getValueFromCoords(4, r); // Media is at index 4 - if (subMediaMap[mediaValue]) { - return subMediaMap[mediaValue]; + + if (hierarchy[categoryValue] && hierarchy[categoryValue][mediaValue]) { + return hierarchy[categoryValue][mediaValue]; } - return source; + return []; // Return empty if invalid combination } }, { type: 'text', title: 'Format', width: 120, name: 'Format' }, diff --git a/sheets/daveporter_at_oliver_agency_1763606650508.json b/sheets/daveporter_at_oliver_agency_1763606650508.json new file mode 100644 index 0000000..12a61c5 --- /dev/null +++ b/sheets/daveporter_at_oliver_agency_1763606650508.json @@ -0,0 +1,262 @@ +[ + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1, + "Number": "DEL-001" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "GB", + "Country": "GB", + "Quantity": 1, + "Number": "DEL-002" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1, + "Number": "DEL-003" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1, + "Number": "DEL-004" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1, + "Number": "DEL-005" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "GB", + "Country": "GB", + "Quantity": 1, + "Number": "DEL-006" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1, + "Number": "DEL-007" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1, + "Number": "DEL-008" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1, + "Number": "DEL-009" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "GB", + "Country": "GB", + "Quantity": 1, + "Number": "DEL-010" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1, + "Number": "DEL-011" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1, + "Number": "DEL-012" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1, + "Number": "DEL-013" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "GB", + "Country": "GB", + "Quantity": 1, + "Number": "DEL-014" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1, + "Number": "DEL-015" + }, + { + "Title": "Christmas 20 25 women", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1, + "Number": "DEL-016" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1, + "Number": "DEL-017" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "GB", + "Country": "GB", + "Quantity": 1, + "Number": "DEL-018" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1, + "Number": "DEL-019" + }, + { + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2025-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1, + "Number": "DEL-020" + } +] \ No newline at end of file diff --git a/sheets/daveporter_at_oliver_agency_1763607466781.json b/sheets/daveporter_at_oliver_agency_1763607466781.json new file mode 100644 index 0000000..33aff05 --- /dev/null +++ b/sheets/daveporter_at_oliver_agency_1763607466781.json @@ -0,0 +1,282 @@ +[ + { + "Number": "DEL-001", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1 + }, + { + "Number": "DEL-002", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "EN", + "Country": "GB", + "Quantity": 1 + }, + { + "Number": "DEL-003", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1 + }, + { + "Number": "DEL-004", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1 + }, + { + "Number": "DEL-005", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1 + }, + { + "Number": "DEL-006", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "EN", + "Country": "GB", + "Quantity": 1 + }, + { + "Number": "DEL-007", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1 + }, + { + "Number": "DEL-008", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1 + }, + { + "Number": "DEL-009", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1 + }, + { + "Number": "DEL-010", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "EN", + "Country": "GB", + "Quantity": 1 + }, + { + "Number": "DEL-011", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1 + }, + { + "Number": "DEL-012", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1 + }, + { + "Number": "DEL-013", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1 + }, + { + "Number": "DEL-014", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "EN", + "Country": "GB", + "Quantity": 1 + }, + { + "Number": "DEL-015", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1 + }, + { + "Number": "DEL-016", + "Title": "Christmas campaign women", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "100x160cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1 + }, + { + "Number": "DEL-017", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "FR", + "Country": "FR", + "Quantity": 1 + }, + { + "Number": "DEL-018", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "EN", + "Country": "GB", + "Quantity": 1 + }, + { + "Number": "DEL-019", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "DE", + "Country": "DE", + "Quantity": 1 + }, + { + "Number": "DEL-020", + "Title": "Christmas campaign men", + "Status": "Booked", + "Category": "Print", + "Media": "POS", + "Sub-media": "Print", + "Format": "50x70cm", + "Supply date": "2025-12-01", + "Live date": "2020-12-25", + "Language": "ES", + "Country": "ES", + "Quantity": 1 + } +] \ No newline at end of file diff --git a/sheets_metadata.json b/sheets_metadata.json index d70be86..d4842e9 100644 --- a/sheets_metadata.json +++ b/sheets_metadata.json @@ -31,6 +31,22 @@ "modified": "2025-11-20T02:39:11+00:00", "itemCount": 16, "user": "daveporter@oliver.agency" + }, + { + "id": "1763606650508", + "name": "6546546", + "created": "2025-11-20T02:44:10+00:00", + "modified": "2025-11-20T02:44:45+00:00", + "itemCount": 20, + "user": "daveporter@oliver.agency" + }, + { + "id": "1763607466781", + "name": "231233", + "created": "2025-11-20T02:57:46+00:00", + "modified": "2025-11-20T03:00:12+00:00", + "itemCount": 20, + "user": "daveporter@oliver.agency" } ] } \ No newline at end of file