{"id":476,"date":"2026-08-22T13:42:09","date_gmt":"2026-08-22T13:42:09","guid":{"rendered":"https:\/\/royalgambitpoker.com\/?page_id=476"},"modified":"2026-08-22T13:53:28","modified_gmt":"2026-08-22T13:53:28","slug":"rgp-dashboard","status":"publish","type":"page","link":"https:\/\/royalgambitpoker.com\/es\/rgp-dashboard\/","title":{"rendered":"Panel de control RGP"},"content":{"rendered":"<p><!DOCTYPE html><br \/>\n<html><br \/>\n<head><br \/>\n<meta charset=\"UTF-8\"><br \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><br \/>\n<title>RGP Dashboard<\/title><\/p>\n<style>\n  * { margin: 0; padding: 0; box-sizing: border-box; }\n  body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #000; color: #fff; min-height: 100vh; padding: 40px 20px; }\n  .dashboard-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 40px; }\n  .logo-refresh { width: 60px; height: 60px; cursor: pointer; opacity: 0.8; transition: opacity 0.3s; }\n  .logo-refresh:hover { opacity: 1; }\n  .dashboard-title { font-size: 24px; font-weight: 600; color: #d4af37; }\n  .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-bottom: 40px; }\n  .metric-card { background: #111; border: 1px solid #333; padding: 20px; border-radius: 8px; }\n  .metric-label { color: #999; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 10px; }\n  .metric-value { color: #d4af37; font-size: 32px; font-weight: 700; }\n  .metric-change { color: #0f0; font-size: 12px; margin-top: 8px; }\n  .charts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 30px; }\n  .chart-container { background: #111; border: 1px solid #333; padding: 20px; border-radius: 8px; }\n  .chart-title { color: #d4af37; font-weight: 600; margin-bottom: 20px; font-size: 14px; text-transform: uppercase; }\n  canvas { display: block; max-width: 100%; }\n<\/style>\n<p><\/head><br \/>\n<body><\/p>\n<div id=\"rgp-dashboard\">\n<div class=\"dashboard-header\">\n<div class=\"dashboard-title\">Royal Gambit Poker \u2014 Management Dashboard<\/div>\n<p>    <svg class=\"logo-refresh\" id=\"refresh-btn\" viewBox=\"0 0 200 200\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"filter: drop-shadow(0 0 8px #d4af37);\">\n      <circle cx=\"100\" cy=\"100\" r=\"90\" fill=\"none\" stroke=\"#d4af37\" stroke-width=\"2\"\/>\n      <circle cx=\"100\" cy=\"100\" r=\"60\" fill=\"#d4af37\" opacity=\"0.1\"\/>\n      <text x=\"100\" y=\"115\" text-anchor=\"middle\" font-size=\"50\" fill=\"#d4af37\" font-weight=\"bold\" font-family=\"serif\">\u2660<\/text>\n    <\/svg>\n  <\/div>\n<div class=\"metrics-grid\" id=\"metrics\"><\/div>\n<div class=\"charts-grid\">\n<div class=\"chart-container\">\n<div class=\"chart-title\">Daily Signups (Last 60 Days)<\/div>\n<p><canvas id=\"signupsChart\"><\/canvas><\/div>\n<div class=\"chart-container\">\n<div class=\"chart-title\">Articles Published<\/div>\n<p><canvas id=\"articlesChart\"><\/canvas><\/div>\n<\/p><\/div>\n<\/div>\n<p><script>\nconst API_URL = '\/wp-json\/wp\/v2';<\/p>\n<p>async function fetchDashboardData() {\n  try {\n    const users = await fetch(API_URL + '\/users?per_page=100&_fields=id,date').then(r => r.json()).catch(() => []);\n    const userCount = await fetch(API_URL + '\/users?per_page=1').then(r => parseInt(r.headers.get('x-wp-total') || '0')).catch(() => 0);\n    const posts = await fetch(API_URL + '\/posts?per_page=100&_fields=id,date,title').then(r => r.json()).catch(() => []);\n    const totalPosts = await fetch(API_URL + '\/posts?per_page=1').then(r => parseInt(r.headers.get('x-wp-total') || '0')).catch(() => 0);\n    return { users: Array.isArray(users) ? users : [], posts: Array.isArray(posts) ? posts : [], userCount, totalPosts };\n  } catch(err) { console.error(err); return null; }\n}<\/p>\n<p>function drawLineChart(canvas, labels, values, color) {\n  const ctx = canvas.getContext('2d');\n  const parent = canvas.parentElement;\n  canvas.width = Math.max(400, parent.offsetWidth - 40);\n  canvas.height = 250;<\/p>\n<p>  const w = canvas.width, h = canvas.height, p = 40;\n  const gw = w - p * 2, gh = h - p * 2, maxVal = (Math.max(...values, 1) * 1.1) || 1;<\/p>\n<p>  ctx.strokeStyle = '#333'; ctx.lineWidth = 0.5;\n  for(let i = 0; i <= 5; i++) {\n    const y = p + (i \/ 5) * gh;\n    ctx.beginPath(); ctx.moveTo(p, y); ctx.lineTo(w - p, y); ctx.stroke();\n  }\n  \n  ctx.strokeStyle = color; ctx.lineWidth = 2; ctx.beginPath();\n  for(let i = 0; i < values.length; i++) {\n    const x = p + (i \/ (values.length - 1 || 1)) * gw;\n    const y = h - p - (values[i] \/ maxVal) * gh;\n    if(i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);\n  }\n  ctx.stroke();\n  \n  ctx.fillStyle = color;\n  for(let i = 0; i < values.length; i++) {\n    const x = p + (i \/ (values.length - 1 || 1)) * gw;\n    const y = h - p - (values[i] \/ maxVal) * gh;\n    ctx.beginPath(); ctx.arc(x, y, 3, 0, Math.PI * 2); ctx.fill();\n  }\n}\n\nfunction drawBarChart(canvas, labels, values, color) {\n  const ctx = canvas.getContext('2d');\n  const parent = canvas.parentElement;\n  canvas.width = Math.max(400, parent.offsetWidth - 40);\n  canvas.height = 250;\n  \n  const w = canvas.width, h = canvas.height, p = 40;\n  const gw = w - p * 2, gh = h - p * 2, maxVal = (Math.max(...values, 1) * 1.1) || 1;\n  const barWidth = gw \/ values.length * 0.7;\n  \n  ctx.strokeStyle = '#333'; ctx.lineWidth = 0.5;\n  for(let i = 0; i <= 5; i++) {\n    const y = p + (i \/ 5) * gh;\n    ctx.beginPath(); ctx.moveTo(p, y); ctx.lineTo(w - p, y); ctx.stroke();\n  }\n  \n  ctx.fillStyle = color;\n  for(let i = 0; i < values.length; i++) {\n    const x = p + (i \/ values.length) * gw + (gw \/ values.length - barWidth) \/ 2;\n    const barHeight = (values[i] \/ maxVal) * gh;\n    ctx.fillRect(x, h - p - barHeight, barWidth, barHeight);\n  }\n}\n\nasync function updateDashboard() {\n  document.getElementById('refresh-btn').style.opacity = '0.5';\n  const data = await fetchDashboardData();\n  if(!data || !Array.isArray(data.users)) {\n    document.getElementById('metrics').innerHTML = '\n\n<div style=\"color:#f33;\">Failed to load data<\/div>\n<p>';\n    document.getElementById('refresh-btn').style.opacity = '0.8';\n    return;\n  }<\/p>\n<p>  const todaySignups = data.users.filter(u => new Date(u.date).toDateString() === new Date().toDateString()).length;\n  const lastWeekSignups = data.users.filter(u => new Date(u.date) >= new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)).length;<\/p>\n<p>  document.getElementById('metrics').innerHTML = `<\/p>\n<div class=\"metric-card\">\n<div class=\"metric-label\">Total Members<\/div>\n<div class=\"metric-value\">${data.userCount}<\/div>\n<div class=\"metric-change\">\u2191 ${todaySignups} today<\/div>\n<\/div>\n<div class=\"metric-card\">\n<div class=\"metric-label\">This Week<\/div>\n<div class=\"metric-value\">${lastWeekSignups}<\/div>\n<div class=\"metric-change\">New signups<\/div>\n<\/div>\n<div class=\"metric-card\">\n<div class=\"metric-label\">Published Articles<\/div>\n<div class=\"metric-value\">${data.totalPosts}<\/div>\n<div class=\"metric-change\">Content pieces<\/div>\n<\/div>\n<div class=\"metric-card\">\n<div class=\"metric-label\">Last Updated<\/div>\n<div class=\"metric-value\" style=\"font-size:14px;\">${new Date().toLocaleTimeString()}<\/div>\n<\/div>\n<p>  `;<\/p>\n<p>  const dailySignups = {};\n  const sixtyDaysAgo = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000);\n  data.users.forEach(u => {\n    const d = new Date(u.date);\n    if(d >= sixtyDaysAgo) {\n      const key = d.toISOString().split('T')[0];\n      dailySignups[key] = (dailySignups[key] || 0) + 1;\n    }\n  });<\/p>\n<p>  const dates = Object.keys(dailySignups).sort();\n  const values = dates.map(d => dailySignups[d]);\n  drawLineChart(document.getElementById('signupsChart'), dates.map(d => d.slice(5)), values, '#d4af37');<\/p>\n<p>  const monthlyPosts = {};\n  data.posts.forEach(p => {\n    const key = new Date(p.date).toISOString().slice(0, 7);\n    monthlyPosts[key] = (monthlyPosts[key] || 0) + 1;\n  });\n  const months = Object.keys(monthlyPosts).sort();\n  const monthNames = months.map(m => new Date(m + '-01').toLocaleDateString('en-US', {month: 'short', year: '2-digit'}));\n  const postValues = months.map(m => monthlyPosts[m]);\n  drawBarChart(document.getElementById('articlesChart'), monthNames, postValues, '#d4af37');<\/p>\n<p>  document.getElementById('refresh-btn').style.opacity = '0.8';\n}<\/p>\n<p>document.getElementById('refresh-btn').addEventListener('click', updateDashboard);\nupdateDashboard();\nsetInterval(updateDashboard, 24 * 60 * 60 * 1000);\n<\/script><br \/>\n<\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"<p>RGP Dashboard Royal Gambit Poker \u2014 Management Dashboard \u2660 Daily Signups (Last 60 Days) Articles Published<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":-1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-476","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/pages\/476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/comments?post=476"}],"version-history":[{"count":2,"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/pages\/476\/revisions"}],"predecessor-version":[{"id":478,"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/pages\/476\/revisions\/478"}],"wp:attachment":[{"href":"https:\/\/royalgambitpoker.com\/es\/wp-json\/wp\/v2\/media?parent=476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}