← back to Marketing Command Center
chore: lint + refactor + v1.6.0 (session close — reel/FB-page picker hardening)
540ae08e4c1b3347eb6ac7f964c2e53318b70e92 · 2026-07-20 13:21:47 -0700 · Steve
Files touched
M modules/channels/index.jsM modules/composer/index.jsM package-lock.jsonM package.jsonM public/panels/composer.js
Diff
commit 540ae08e4c1b3347eb6ac7f964c2e53318b70e92
Author: Steve <steve@designerwallcoverings.com>
Date: Mon Jul 20 13:21:47 2026 -0700
chore: lint + refactor + v1.6.0 (session close — reel/FB-page picker hardening)
---
modules/channels/index.js | 4 +++-
modules/composer/index.js | 1 +
package-lock.json | 4 ++--
package.json | 2 +-
public/panels/composer.js | 2 +-
5 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/modules/channels/index.js b/modules/channels/index.js
index 2776c9d..f42041e 100644
--- a/modules/channels/index.js
+++ b/modules/channels/index.js
@@ -379,7 +379,9 @@ async function postFacebook(content, opts = {}) {
if (!targets.length) return [{ ok: false, error: 'selected Pages not in cache — click ↻ refresh on the Pages picker' }];
} else {
const token = env('FB_PAGE_ACCESS_TOKEN');
- targets = env('FB_PAGE_IDS').split(',').map(s => s.trim()).filter(Boolean).map(id => ({ id, token, name: id }));
+ const ids = env('FB_PAGE_IDS');
+ if (!ids) return [{ ok: false, error: 'No Facebook Page selected and FB_PAGE_IDS not configured' }];
+ targets = ids.split(',').map(s => s.trim()).filter(Boolean).map(id => ({ id, token, name: id }));
}
const results = [];
for (const t of targets) {
diff --git a/modules/composer/index.js b/modules/composer/index.js
index 61f8bf5..12ce7ab 100644
--- a/modules/composer/index.js
+++ b/modules/composer/index.js
@@ -51,6 +51,7 @@ module.exports = {
// stays snappy. Each carries a public .mp4 URL Meta/Bluesky can fetch.
router.get('/reels', (_req, res) => {
const { path: manPath, reels } = readReelsManifest();
+ // cap at 40 so the picker stays snappy (more than enough for a scroll)
const list = (Array.isArray(reels) ? reels : (reels.reels || [])).slice(0, 40).map(r => ({
file: r.file,
url: `${REELS_PUBLIC_BASE}/reels/${encodeURIComponent(r.file)}`,
diff --git a/package-lock.json b/package-lock.json
index 8636f60..500ad98 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "marketing-command-center",
- "version": "1.5.0",
+ "version": "1.6.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "marketing-command-center",
- "version": "1.5.0",
+ "version": "1.6.0",
"dependencies": {
"express": "^4.22.2",
"pg": "^8.22.0"
diff --git a/package.json b/package.json
index 7046b77..83c5f9e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "marketing-command-center",
- "version": "1.5.0",
+ "version": "1.6.0",
"description": "DW Marketing Command Center — Constant Contact, marketing calendar, suggested copy, on-demand layouts",
"main": "server.js",
"scripts": {
diff --git a/public/panels/composer.js b/public/panels/composer.js
index b05b3a9..90366af 100644
--- a/public/panels/composer.js
+++ b/public/panels/composer.js
@@ -141,7 +141,7 @@ window.MCC_PANELS['composer'] = {
state.videoUrl = r.url; state.mediaUrl = '';
const img = $('#cmp-img'); img.style.display = 'none';
const bf = $('#cmp-banner'); if (bf) bf.style.display = 'none';
- const v = $('#cmp-video'); v.src = r.url; v.style.display = 'block';
+ const v = $('#cmp-video'); if (v) { v.src = r.url; v.style.display = 'block'; } // guard: mirror select()
$('#cmp-preview').querySelector('.cmp-ph').style.display = 'none';
// seed the reel's own caption when the box is empty (keeps media + copy aligned)
if (r.caption && !$('#cmp-caption').value.trim()) { $('#cmp-caption').value = r.caption; countIt(); }
← 97dcfe7 Composer: add reel/story asset picker + Facebook Page select
·
back to Marketing Command Center
·
calendars: filter Schumacher (internal-only) out of both cal 5ea8d24 →