ghost 6.24.0 → 6.25.1
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/components/tryghost-i18n-6.25.1.tgz +0 -0
- package/components/tryghost-parse-email-address-6.25.1.tgz +0 -0
- package/core/boot.js +3 -1
- package/core/built/admin/assets/{PolarAngleAxis-7TlIQL3R.js → PolarAngleAxis-C6ZeSpZB.js} +1 -1
- package/core/built/admin/assets/{_baseAssignValue-DJsCJz6y.js → _baseAssignValue-BKAl5FrV.js} +1 -1
- package/core/built/admin/assets/{a-large-small-BnBpzYwl.js → a-large-small-B_ulQCIs.js} +1 -1
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-De3K_osj.mjs → code-editor-view-CBYT1gA1.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-bGxDzD13.mjs → index-CN5CixaU.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-5D8KqsFU.mjs → index-CPQODntW.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-BIUDn7ot.mjs → index-CgTfOd7g.mjs} +9 -9
- package/core/built/admin/assets/admin-x-settings/{modals-DuokUyAH.mjs → modals-_y-6HROx.mjs} +2 -2
- package/core/built/admin/assets/{at-sign-DC4NtDDM.js → at-sign-B8xWKM0y.js} +1 -1
- package/core/built/admin/assets/{audience-CC5U4UxI.js → audience-CBOR--z9.js} +1 -1
- package/core/built/admin/assets/{avatar-flipboard-_GQfQXQc.js → avatar-flipboard-IipGb_wZ.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-BKyzPl9y.js → bluesky-sharing-CkI1QuAm.js} +1 -1
- package/core/built/admin/assets/{chart-BCQFlmhJ.js → chart-_slUcr-K.js} +1 -1
- package/core/built/admin/assets/{chunk.423.dae9a3bbe7845c3a3cfc.js → chunk.434.de8a15730373eccfeefe.js} +13 -101
- package/core/built/admin/assets/{chunk.524.b5e454aa74df4428420c.js → chunk.524.5b9b463506a16221fc91.js} +6 -6
- package/core/built/admin/assets/{chunk.582.20635869be68725e6d5c.js → chunk.582.d8eae1661d753befaefd.js} +7 -7
- package/core/built/admin/assets/{chunk.123.1255d9e815f933dfdc57.js → chunk.630.3dbb0231a2d871126a80.js} +8 -6
- package/core/built/admin/assets/{code-editor-view-BXnjo7qe.js → code-editor-view-BWMqr2JV.js} +1 -1
- package/core/built/admin/assets/comments-BeoA0nfK.js +1 -0
- package/core/built/admin/assets/{content-helpers-CQXipRWa.js → content-helpers-CmTGdEmL.js} +1 -1
- package/core/built/admin/assets/{copy-B-MxRWPu.js → copy-CDHcAPJw.js} +1 -1
- package/core/built/admin/assets/{data-list-B2sqn7IE.js → data-list-Crb1ffbp.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-DQi676Dy.js → deleted-feed-item-DBW0zJQg.js} +1 -1
- package/core/built/admin/assets/{dropzone-GgOCfK2j.js → dropzone-B9JUsQlW.js} +3 -3
- package/core/built/admin/assets/{edit-profile-COx5FmF9.js → edit-profile-Dz-IhetN.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-Bf4Dqk72.js → empty-indicator-2QGnEbtY.js} +1 -1
- package/core/built/admin/assets/{en-BkI47Ou-.js → en-BRQS1Z8j.js} +1 -1
- package/core/built/admin/assets/{feed-Dzc-8jwd.js → feed-T3kW9UJA.js} +1 -1
- package/core/built/admin/assets/filters-ChOMQQZW.js +1 -0
- package/core/built/admin/assets/{gh-chart-Ch6dYUac.js → gh-chart-fuWw60Ka.js} +1 -1
- package/core/built/admin/assets/{ghost-69e448feab2cb78aba64f7177fa4d6f0.js → ghost-78b4a517ac907213ab47708eef33bc6f.js} +423 -542
- package/core/built/admin/assets/{growth-BIBJdcm6.js → growth-D9sCnmon.js} +1 -1
- package/core/built/admin/assets/{hash-BGd7HEsT.js → hash-CI1pQ1UC.js} +1 -1
- package/core/built/admin/assets/header-OevT95FI.js +1 -0
- package/core/built/admin/assets/{inbox-CFzKvW3h.js → inbox-DYY8-M1K.js} +1 -1
- package/core/built/admin/assets/{index-Dy8dCc8t.js → index-8CZdLQzu.js} +4 -4
- package/core/built/admin/assets/{index-DIO8ceib.js → index-BDAOs7pI.js} +1 -1
- package/core/built/admin/assets/{index-BZyG96u1.js → index-BEEgMX-_.js} +1 -1
- package/core/built/admin/assets/index-BbveDn8H.css +1 -0
- package/core/built/admin/assets/{index-BYXKsmpv.js → index-C-Cpbee5.js} +1 -1
- package/core/built/admin/assets/{index-DDJAHYHQ.js → index-CCF2RKxR.js} +12 -12
- package/core/built/admin/assets/{index-ZuWSQ3L6.js → index-CEnfjH5h.js} +93 -93
- package/core/built/admin/assets/{index-_WMp37yL.js → index-CcFVbffG.js} +1 -1
- package/core/built/admin/assets/{index-DpZazR71.js → index-CyMlhfZJ.js} +1 -1
- package/core/built/admin/assets/{index-DM98UB_U.js → index-DBZYUfjO.js} +1 -1
- package/core/built/admin/assets/{index-D0gRP4Gp.js → index-DJa3pLmx.js} +1 -1
- package/core/built/admin/assets/{index-n5opb8tL.js → index-DVqmhe-L.js} +1 -1
- package/core/built/admin/assets/{index-S2DGJkmz.js → index-DW5aEj6O.js} +2 -2
- package/core/built/admin/assets/{index-CvX5YYEz.js → index-DcFgRUSN.js} +1 -1
- package/core/built/admin/assets/{index-7NTHsKgE.js → index-DjgsxHeB.js} +1 -1
- package/core/built/admin/assets/index-mqQc8MVd.js +1 -0
- package/core/built/admin/assets/{index-CsHjDdYB.js → index-qQZsxgFE.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-8qAZ5o1x.js → koenig-lexical-CsbE6fpi.js} +1 -1
- package/core/built/admin/assets/kpis-Dw04ruBN.js +1 -0
- package/core/built/admin/assets/{label-CofMdj8x.js → label-tBvn89sm.js} +1 -1
- package/core/built/admin/assets/{links-MSlYSad1.js → links-Do4jcjIh.js} +1 -1
- package/core/built/admin/assets/{loader-circle-CF5G2g_Z.js → loader-circle-C8exRUku.js} +4 -4
- package/core/built/admin/assets/{lucide-react-DZiAu6PQ.js → lucide-react-4VO5Dwow.js} +1 -1
- package/core/built/admin/assets/{main-layout-DEVUkqt_.js → main-layout-BAqXRgAx.js} +1 -1
- package/core/built/admin/assets/{member-route-mLKS-PsA.js → member-route-D4n-RbQd.js} +1 -1
- package/core/built/admin/assets/members-DRLgwCgJ.js +15 -0
- package/core/built/admin/assets/{message-square-text-DESy3kSk.js → message-square-text-CC_1bY-Q.js} +5 -5
- package/core/built/admin/assets/{minus-DVNwSjD6.js → minus-DSyx9DCe.js} +1 -1
- package/core/built/admin/assets/{modals-FYjLOMaQ.js → modals-AryZr_DA.js} +13 -13
- package/core/built/admin/assets/{moderation-u4WS46a-.js → moderation-DwKm9LO-.js} +1 -1
- package/core/built/admin/assets/{newsletter-Cj0UCg4J.js → newsletter-C0rydPGS.js} +1 -1
- package/core/built/admin/assets/{newsletters-_UvhdBE3.js → newsletters-DKdmxfDG.js} +1 -1
- package/core/built/admin/assets/{note-CRnFryTp.js → note-996Zos9G.js} +1 -1
- package/core/built/admin/assets/{overview-Cr0dGxEU.js → overview-r17hlWAB.js} +1 -1
- package/core/built/admin/assets/{pagemenu-BqoDENpI.js → pagemenu-DzpB1AkZ.js} +17 -17
- package/core/built/admin/assets/{post-analytics-DIr_rDtL.js → post-analytics-AwufPVFE.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-WA--pwK5.js → post-analytics-context-GFe0lMc-.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-D97SoEaV.js → post-analytics-header-DmGyNvP9.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-DBxR7WCX.js → post-share-modal-CTpdCS2X.js} +1 -1
- package/core/built/admin/assets/posts/{comments-Bswx2dzs.mjs → comments-Cvt31uBs.mjs} +597 -674
- package/core/built/admin/assets/posts/{dialog-67vvNv8e.mjs → dialog-DaViJlnd.mjs} +3 -3
- package/core/built/admin/assets/posts/{dropdown-menu-BKZfsAPJ.mjs → dropdown-menu-B4KGMiRI.mjs} +5 -5
- package/core/built/admin/assets/posts/{empty-indicator-DTmBQa_3.mjs → empty-indicator-BaD6pCXM.mjs} +2 -2
- package/core/built/admin/assets/posts/filters-BsCI4RJg.mjs +2835 -0
- package/core/built/admin/assets/posts/{get-site-timezone-D75cHSJ1.mjs → get-site-timezone-Bo-iI2bI.mjs} +2 -2
- package/core/built/admin/assets/posts/{growth-BqJWjpAp.mjs → growth-BJxIDp2o.mjs} +14 -14
- package/core/built/admin/assets/posts/header-7zhnErbb.mjs +100 -0
- package/core/built/admin/assets/posts/{heading-DXxLDQ96.mjs → heading-BCDx_eVF.mjs} +2 -2
- package/core/built/admin/assets/posts/{hooks-pVotzebr.mjs → hooks-DQL2O_El.mjs} +2 -2
- package/core/built/admin/assets/posts/{index-DZ1HzbGS.mjs → index-0mEgtljt.mjs} +3 -3
- package/core/built/admin/assets/posts/{index-By5yPnMZ.mjs → index-BTzJVQ6S.mjs} +10 -10
- package/core/built/admin/assets/posts/{input-DdXe2Fjm.mjs → input-DaHXv92f.mjs} +2 -2
- package/core/built/admin/assets/posts/{kpis-1MXZeSC9.mjs → kpis-GRsx6fPV.mjs} +10 -10
- package/core/built/admin/assets/posts/{links-DGzzdzsH.mjs → links-B1q_pqE9.mjs} +4 -4
- package/core/built/admin/assets/posts/{loading-indicator-CSj2spwS.mjs → loading-indicator-DiYqXomj.mjs} +3 -3
- package/core/built/admin/assets/posts/{main-layout-CGs25JVH.mjs → main-layout-DeqPTJTe.mjs} +2 -2
- package/core/built/admin/assets/posts/{members-BRcED5fL.mjs → members-LABk5yI5.mjs} +4102 -3442
- package/core/built/admin/assets/posts/{newsletter-D706LlgM.mjs → newsletter-C_nbHBaP.mjs} +15 -15
- package/core/built/admin/assets/posts/{overview-5dG5ypjx.mjs → overview-AJnKv4Ze.mjs} +16 -16
- package/core/built/admin/assets/posts/{post-analytics-wvNuOa4c.mjs → post-analytics-b_CKsePp.mjs} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-context-BqnFe05q.mjs → post-analytics-context-D6jtpxxm.mjs} +5 -5
- package/core/built/admin/assets/posts/{post-analytics-header-Dsi5l6hb.mjs → post-analytics-header-R5UF_tF0.mjs} +11 -11
- package/core/built/admin/assets/posts/{post-share-modal-DWe35McY.mjs → post-share-modal-y4BEOajk.mjs} +4 -4
- package/core/built/admin/assets/posts/posts-C2hNrf1c.mjs +37 -0
- package/core/built/admin/assets/posts/posts.js +1 -1
- package/core/built/admin/assets/posts/{reply-B4vwBMwj.mjs → reply-2Uvi3Kxb.mjs} +2 -2
- package/core/built/admin/assets/posts/{search-DQuB1WMm.mjs → search-se7meOnL.mjs} +2 -2
- package/core/built/admin/assets/posts/{select-BMPHyOdQ.mjs → select-DpUpauFg.mjs} +8 -8
- package/core/built/admin/assets/posts/{separator-DgZ2VF9r.mjs → separator-CdBM46dw.mjs} +3 -3
- package/core/built/admin/assets/posts/{settings-D-wnf7Qg.mjs → settings-Chhj9xKP.mjs} +2 -2
- package/core/built/admin/assets/posts/{sheet-SOdCzxUt.mjs → sheet--k3SiDko.mjs} +3 -3
- package/core/built/admin/assets/posts/{skeleton-Du7JXZ_1.mjs → skeleton-CUSLSLoY.mjs} +3 -3
- package/core/built/admin/assets/posts/{source-icon-DcBtKbCl.mjs → source-icon-BjYUIoXN.mjs} +3 -3
- package/core/built/admin/assets/posts/{stats-CeLav-Hu.mjs → stats-BRdXKaxM.mjs} +4 -4
- package/core/built/admin/assets/posts/{table-DlaJMBps.mjs → table-Bgi_UcfL.mjs} +2 -2
- package/core/built/admin/assets/posts/{tabs-BQQbtw2g.mjs → tabs-DT8Bh72E.mjs} +14 -14
- package/core/built/admin/assets/posts/tags-BCFLnZYl.mjs +399 -0
- package/core/built/admin/assets/posts/{tags-CLyaNf39.mjs → tags-Kv2q0o3p.mjs} +2 -2
- package/core/built/admin/assets/posts/use-scroll-restoration-CLAUAal3.mjs +517 -0
- package/core/built/admin/assets/posts/{use-infinite-virtual-scroll-B_NwiBXK.mjs → virtual-list-window-CQDEqNBL.mjs} +246 -262
- package/core/built/admin/assets/posts/{web-TEVKbXSI.mjs → web-CqN0MQU6.mjs} +18 -18
- package/core/built/admin/assets/posts-GvXDuhVG.js +1 -0
- package/core/built/admin/assets/{referrers-J4vexZCf.js → referrers-Bd9pW-WX.js} +1 -1
- package/core/built/admin/assets/{repeat-BxOK9zhN.js → repeat-y6HlMgGO.js} +2 -2
- package/core/built/admin/assets/{reply-BoTN-eE0.js → reply-Cc8ryI5v.js} +2 -2
- package/core/built/admin/assets/{select-Bd1zcqox.js → select-CGr_5qad.js} +1 -1
- package/core/built/admin/assets/{settings-D72z6T_a.js → settings-BPsfSgg3.js} +1 -1
- package/core/built/admin/assets/{settings-BGbGoa4s.js → settings-BTd0Adha.js} +19 -19
- package/core/built/admin/assets/{sort-button-BOLTpImz.js → sort-button-k76_5HR2.js} +1 -1
- package/core/built/admin/assets/{source-icon-BqEM5MvU.js → source-icon-DMt0UskC.js} +1 -1
- package/core/built/admin/assets/{sprout-Bf-wc2Vo.js → sprout-Td9eaOoY.js} +2 -2
- package/core/built/admin/assets/{square-Cj_bJ0HZ.js → square-Df8vEYlG.js} +1 -1
- package/core/built/admin/assets/stats/{audience-BiHYBUzT.mjs → audience-DMTObpL8.mjs} +3 -3
- package/core/built/admin/assets/stats/{content-helpers-CIXZiyCm.mjs → content-helpers-ReMp9KJN.mjs} +4 -4
- package/core/built/admin/assets/stats/{index-CkKk-p14.mjs → index-6L-yLKFX.mjs} +8 -8
- package/core/built/admin/assets/stats/{index-DBB8Oih1.mjs → index-CIUyjeP-.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-9zQR4gr0.mjs → index-CMSDpQm3.mjs} +3626 -3513
- package/core/built/admin/assets/stats/{index-DErXBfDM.mjs → index-Ca-_KJzy.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-DMSmQLxG.mjs → index-CfO5yPSP.mjs} +5 -5
- package/core/built/admin/assets/stats/{sort-button-BqY7GFaO.mjs → sort-button-BB_M2CdZ.mjs} +3 -3
- package/core/built/admin/assets/stats/{stats-BeJgKX2G.mjs → stats-B2nnuLeU.mjs} +4 -4
- package/core/built/admin/assets/stats/stats.js +1 -1
- package/core/built/admin/assets/stats/{tabs-CPz357mW.mjs → tabs-DjJG-d3O.mjs} +3 -3
- package/core/built/admin/assets/stats/{use-growth-stats-WMYXBQE3.mjs → use-growth-stats-BMT5M7l6.mjs} +3 -3
- package/core/built/admin/assets/{stats-DWpHtRym.js → stats-Bs9ZbmXX.js} +1 -1
- package/core/built/admin/assets/stats-view-BWoPuaLz.js +1 -0
- package/core/built/admin/assets/{step-1-Bjya9Gt0.js → step-1-BUvsuCs0.js} +1 -1
- package/core/built/admin/assets/{step-2-CJ6I8JNc.js → step-2-DI9ekXls.js} +1 -1
- package/core/built/admin/assets/{step-3-3fs6Y2Kj.js → step-3-DzT_XhaS.js} +2 -2
- package/core/built/admin/assets/{table-B4zlzEDP.js → table-BKqaEGAm.js} +1 -1
- package/core/built/admin/assets/{tabs-mR5oJGm5.js → tabs-G6Ql8vbf.js} +1 -1
- package/core/built/admin/assets/tags-BHm-dlBs.js +1 -0
- package/core/built/admin/assets/{tags-CsgMtkFL.js → tags-_taMP0sJ.js} +1 -1
- package/core/built/admin/assets/{textarea-CQjEvapR.js → textarea-DcVuGYYq.js} +1 -1
- package/core/built/admin/assets/{tiers-CQE0v797.js → tiers-kv-xBoqQ.js} +1 -1
- package/core/built/admin/assets/{toggle-group-CR-Z-bJL.js → toggle-group-DsatLdt7.js} +1 -1
- package/core/built/admin/assets/{topic-filter-_NyD55eH.js → topic-filter-DkJyIuAf.js} +1 -1
- package/core/built/admin/assets/{trash-BFSLkv0z.js → trash-BeZZgbn-.js} +1 -1
- package/core/built/admin/assets/{upload-BTxT4v2z.js → upload-BG7KNIn7.js} +4 -4
- package/core/built/admin/assets/{use-growth-stats-BGymNu5O.js → use-growth-stats-CNGdl44N.js} +1 -1
- package/core/built/admin/assets/use-scroll-restoration-CQ3w0W98.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-Cq7Afp_c.js → use-simple-pagination-BeIJ_5Vv.js} +1 -1
- package/core/built/admin/assets/{user-plus-DMl69yKl.js → user-plus-CMxR50-Y.js} +1 -1
- package/core/built/admin/assets/{user-round-check-CVuZXUPz.js → user-round-check-2nhPmqP3.js} +1 -1
- package/core/built/admin/assets/virtual-list-window-Uq8oKYVG.js +4 -0
- package/core/built/admin/assets/{wallet-cards-zHR_y6Sp.js → wallet-cards-CJcVzH0D.js} +1 -1
- package/core/built/admin/assets/{web-CmFHgeQw.js → web-BPwTFKrc.js} +1 -1
- package/core/built/admin/index.html +7 -7
- package/core/frontend/helpers/ghost_head.js +1 -4
- package/core/server/data/migrations/versions/6.25/2026-03-26-15-47-00-insert-default-email-design-settings-row.js +42 -0
- package/core/server/data/migrations/versions/6.25/2026-03-30-20-22-25-add-email-design-setting-permissions.js +44 -0
- package/core/server/data/migrations/versions/6.25/2026-03-30-22-16-43-add-email-design-setting-id-to-automated-emails.js +8 -0
- package/core/server/data/migrations/versions/6.25/2026-03-31-13-12-10-backfill-automated-emails-email-design-setting-id.js +45 -0
- package/core/server/data/migrations/versions/6.25/2026-03-31-20-31-19-drop-nullable-on-automated-emails-email-design-setting-id.js +3 -0
- package/core/server/data/schema/fixtures/fixtures.json +35 -0
- package/core/server/data/schema/schema.js +1 -0
- package/core/server/data/seeders/importers/comment-reports-importer.js +1 -3
- package/core/server/data/seeders/importers/comments-importer.js +3 -2
- package/core/server/data/seeders/importers/email-batches-importer.js +3 -3
- package/core/server/data/seeders/importers/email-recipients-importer.js +6 -6
- package/core/server/data/seeders/importers/emails-importer.js +4 -3
- package/core/server/data/seeders/importers/members-click-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-created-events-importer.js +2 -1
- package/core/server/data/seeders/importers/members-feedback-importer.js +3 -4
- package/core/server/data/seeders/importers/members-login-events-importer.js +3 -2
- package/core/server/data/seeders/importers/members-status-events-importer.js +1 -2
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +2 -1
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +4 -2
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +1 -2
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +3 -1
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +3 -3
- package/core/server/data/seeders/utils/database-date.js +26 -1
- package/core/server/models/automated-email.js +27 -0
- package/core/server/models/email-design-setting.js +27 -0
- package/core/server/services/members/service.js +0 -22
- package/core/server/services/stripe/service.js +1 -2
- package/core/server/services/verification/verification-webhook-service.js +2 -2
- package/core/server/services/verification/verification-webhook-service.ts +2 -2
- package/core/server/services/verification-trigger.js +34 -69
- package/core/server/services/webhooks/webhook-trigger.js +1 -1
- package/core/shared/labs.js +2 -2
- package/package.json +10 -28
- package/tsconfig.tsbuildinfo +1 -1
- package/yarn.lock +423 -107
- package/components/tryghost-i18n-6.24.0.tgz +0 -0
- package/components/tryghost-parse-email-address-6.24.0.tgz +0 -0
- package/core/built/admin/assets/comments-CteqV7ZN.js +0 -1
- package/core/built/admin/assets/filters-DXXaCya7.js +0 -1
- package/core/built/admin/assets/index-QB-va_sk.css +0 -1
- package/core/built/admin/assets/index-nBUk6L1X.js +0 -1
- package/core/built/admin/assets/kpis-Cv75oSPY.js +0 -1
- package/core/built/admin/assets/members-DcElgZ2t.js +0 -15
- package/core/built/admin/assets/posts/filters-Ds_ZaYIU.mjs +0 -2722
- package/core/built/admin/assets/posts/posts-DI5YQFp4.mjs +0 -17
- package/core/built/admin/assets/posts/tags-CjwolIiT.mjs +0 -395
- package/core/built/admin/assets/posts/use-scroll-restoration-YSR5jwQl.mjs +0 -232
- package/core/built/admin/assets/posts-CJHEP4C-.js +0 -1
- package/core/built/admin/assets/stats-view-CcyaLPwj.js +0 -1
- package/core/built/admin/assets/tags-DEFC6GpD.js +0 -1
- package/core/built/admin/assets/use-infinite-virtual-scroll-CNqGwgHd.js +0 -4
- package/core/built/admin/assets/use-scroll-restoration-BWtb0NrS.js +0 -1
- package/core/shared/config/env/config.testing-browser.json +0 -98
- /package/core/built/admin/assets/{chunk.423.dae9a3bbe7845c3a3cfc.js.LICENSE.txt → chunk.434.de8a15730373eccfeefe.js.LICENSE.txt} +0 -0
package/core/built/admin/assets/{use-growth-stats-BGymNu5O.js → use-growth-stats-CNGdl44N.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as C,
|
|
1
|
+
import{r as C,ak as E,al as F,am as s,an as _,ao as H}from"./index-CEnfjH5h.js";import{u as v,a as V,b as j}from"./stats-Bs9ZbmXX.js";import{g as G}from"./currency-fEUUCkj0.js";const K=(r,b,D,i)=>{if(!r.length)return{totalMembers:0,freeMembers:0,paidMembers:0,mrr:0,percentChanges:{total:"0%",free:"0%",paid:"0%",mrr:"0%"},directions:{total:"same",free:"same",paid:"same",mrr:"same"}};const p=i||r[r.length-1],l=r.length>0?r[r.length-1]:{free:0,paid:0,comped:0},P=b.length>0?b[b.length-1]:{mrr:0},d=p.free+p.paid+p.comped,g=P.mrr,M={total:"0%",free:"0%",paid:"0%",mrr:"0%"},y={total:"same",free:"same",paid:"same",mrr:"same"};if(r.length>1){const t=r[0],e=t.free+t.paid+t.comped;if(e>0){const a=(d-e)/e*100;M.total=_(a/100),y.total=a>0?"up":a<0?"down":"same"}if(t.free>0){const a=(l.free-t.free)/t.free*100;M.free=_(a/100),y.free=a>0?"up":a<0?"down":"same"}const f=t.paid+t.comped,c=l.paid+l.comped;if(f>0){const a=(c-f)/f*100;M.paid=_(a/100),y.paid=a>0?"up":a<0?"down":"same"}}if(b.length>1){const t=s(D).format("YYYY-MM-DD"),e=b.find(a=>s(a.date).isSameOrAfter(t)),f=s(D).isSame(s().startOf("year"),"day")||s(D).year()<s().year();let c=0;if(e&&s(e.date).isSame(t,"day")?c=e.mrr:f?c=0:c=g,c>=0){const a=c===0?g>0?100:0:(g-c)/c*100;M.mrr=_(a/100),y.mrr=a>0?"up":a<0?"down":"same"}}return{totalMembers:d,freeMembers:p.free,paidMembers:p.paid+p.comped,mrr:g,percentChanges:M,directions:y}},N=(r,b)=>{const D=[...r].sort((t,e)=>new Date(t.date).getTime()-new Date(e.date).getTime()),i=[...b].sort((t,e)=>new Date(t.date).getTime()-new Date(e.date).getTime()),p=D.map(t=>t.date),l=i.map(t=>t.date),P=[...new Set([...p,...l])].sort((t,e)=>new Date(t).getTime()-new Date(e).getTime());let d=null,g=null;const M=new Map(D.map(t=>[t.date,t])),y=new Map(i.map(t=>[t.date,t]));return P.map(t=>{const e=M.get(t);e&&(d=e);const f=y.get(t);f&&(g=f);const c=d?.free??0,a=d?.paid??0,O=d?.comped??0,A=a+O,L=c+A,o=g?.mrr??0,R=d?.paid_subscribed??0,w=d?.paid_canceled??0;return{date:t,value:L,free:c,paid:A,comped:O,mrr:o,paid_subscribed:R,paid_canceled:w,formattedValue:H(L),label:"Total members"}})},X=r=>{const{startDate:b,endDate:D}=C.useMemo(()=>E(r),[r]),i=F(b),p=r===1?s(i).subtract(1,"day").format("YYYY-MM-DD"):i,{data:l,isLoading:P}=v({searchParams:{date_from:p}}),{data:d,isLoading:g}=V({searchParams:{date_from:p}}),{data:M,isLoading:y}=j(),t=C.useMemo(()=>{let o=[];if(l?.stats?o=l.stats:Array.isArray(l)&&(o=l),r===1&&o.length>=2){const R=o[o.length-2],w=o[o.length-1],S=s(i).format("YYYY-MM-DD"),m=s(i).add(1,"day").format("YYYY-MM-DD"),u={...R,date:S},T={...w,date:m};return[u,T]}return o},[l,r,i]),{mrrData:e,selectedCurrency:f}=C.useMemo(()=>{const o=s(i),R=r===1?s().endOf("day"):s().startOf("day");if(d?.stats&&d?.meta?.totals){const w=d.meta.totals;let S=w[0];if(!S)return{mrrData:[],selectedCurrency:"usd"};for(const n of w)n.mrr>S.mrr&&(S=n);const m=S.currency,u=d.stats.filter(n=>n.currency===m),T=u.filter(n=>s(n.date).isSameOrAfter(o)),x=[...u].sort((n,Y)=>new Date(Y.date).getTime()-new Date(n.date).getTime()),h=[...T];if(!h.some(n=>s(n.date).isSame(o,"day"))){const n=x.find(Y=>s(Y.date).isBefore(o));if(n)h.unshift({...n,date:o.format("YYYY-MM-DD")});else if(h.length>0){const Y=[...h].sort((B,I)=>new Date(B.date).getTime()-new Date(I.date).getTime())[0];h.unshift({...Y,date:o.format("YYYY-MM-DD")})}}const k=r===1?s().startOf("day"):R;if(!h.some(n=>s(n.date).isSame(k,"day"))&&h.length>0){const Y=[...h].sort((B,I)=>new Date(I.date).getTime()-new Date(B.date).getTime())[0];h.push({...Y,date:k.format("YYYY-MM-DD")})}return{mrrData:h.sort((n,Y)=>new Date(n.date).getTime()-new Date(Y.date).getTime()),selectedCurrency:m}}return{mrrData:[],selectedCurrency:"usd"}},[d,i,r]),c=C.useMemo(()=>K(t,e,i,l?.meta?.totals),[t,e,i,l?.meta?.totals]),a=C.useMemo(()=>N(t,e),[t,e]),O=C.useMemo(()=>G(f),[f]),A=C.useMemo(()=>P||g||y,[P,g,y]),L=C.useMemo(()=>{if(!M?.stats)return[];const o=M.stats.reduce((m,u)=>{const T=u.date;return m[T]||(m[T]={date:T,signups:0,cancellations:0}),m[T].signups+=u.signups,m[T].cancellations+=u.cancellations,m},{}),R=Object.values(o).sort((m,u)=>new Date(m.date).getTime()-new Date(u.date).getTime()),w=s(i),S=s(D);return R.filter(m=>{const u=s(m.date);return u.isSameOrAfter(w)&&u.isSameOrBefore(S)})},[M,i,D]);return{isLoading:A,memberData:t,mrrData:e,dateFrom:i,endDate:D,totals:c,chartData:a,subscriptionData:L,selectedCurrency:f,currencySymbol:O}};export{X as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cQ as V,r as l,ai as z,cz as $,cA as Q,cy as k,j as M,z as Y,bS as q,cn as G}from"./index-CEnfjH5h.js";import{b as U}from"./posts-GvXDuhVG.js";import{g as X}from"./virtual-list-window-Uq8oKYVG.js";function j(e){return`'${e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function J(e,t){if(t.length!==0)return`${e}:[${t.map(o=>j(o)).join(",")}]`}function he(e,t){const o=t.trim().toLowerCase();return o?e.filter(n=>n.label.toLowerCase().includes(o)||n.detail?.toLowerCase().includes(o)):e}function B(...e){const t=new Map;for(const o of e)if(o)for(const n of o)t.has(n.value)||t.set(n.value,n);return[...t.values()]}const H=()=>{};function W(e){return function(o={}){const{enabled:n=!0}=o,s=()=>{const u=e.useBrowse("",{enabled:!0}),a=l.useMemo(()=>(u.data||[]).map(e.toOption),[u.data]);return{items:u.data,options:a,isLoading:u.isLoading,pagination:u.pagination}},d=({query:u,selectedValues:a})=>{const[c]=V(u,e.debounceMs??200),i=e.useBrowse(c,{enabled:n}),r=e.useHydrate?.(a,{enabled:n}),h=l.useMemo(()=>(i.data||[]).map(e.toOption),[i.data]),f=l.useMemo(()=>(r?.data||[]).map(e.toOption),[r?.data]),p=l.useMemo(()=>B(f,h),[f,h]);return n?{options:p,isInitialLoad:i.isLoading&&p.length===0,isSearching:!i.isLoading&&i.isRefreshing&&!i.isLoadingMore,isLoadingMore:i.isLoadingMore,hasMore:i.hasMore,loadMore:i.loadMore??H}:{options:[],isInitialLoad:!1,isSearching:!1,isLoadingMore:!1,hasMore:!1,loadMore:H}};return{id:e.id,useInitialBrowse:s,useOptions:d}}}function Z(e){return{filter:e}}function ee(e){return J("id",e)}function C(e){return{limit:"100",...e}}function D({id:e,buildBrowseSearchParams:t,buildHydrateSearchParams:o=Z,buildHydrateFilter:n=ee,debounceMs:s,selectItems:d,toOption:u,useQuery:a}){return W({id:e,useBrowse:(c,i)=>{const r=a({enabled:i.enabled??!0,searchParams:C(t(c))});return{data:d(r.data),isLoading:r.isLoading,isRefreshing:r.isFetching,isLoadingMore:r.isFetchingNextPage,hasMore:!!r.hasNextPage,loadMore:r.fetchNextPage,pagination:r.data?.meta?.pagination}},useHydrate:(c,i)=>{const r=n(c),h={};typeof r=="string"&&Object.assign(h,C(o(r)));const p=a({enabled:(i.enabled??!0)&&c.length>0,searchParams:h});return{data:d(p.data),isLoading:p.isLoading}},toOption:u,debounceMs:s})}const te="PagesResponseType",oe=z({dataType:te,path:"/pages/",defaultNextPageParams:(e,t)=>{var o;if((o=e.meta)!=null&&o.pagination.next)return{...t,page:e.meta.pagination.next.toString()}},returnData:e=>{const{pages:t}=e,o=t.flatMap(s=>s.pages),n=t[t.length-1].meta;return{pages:o,meta:n,isEnd:n?n.pagination.pages===n.pagination.page:!0}}});function ne(e,t){return function(n){const s=e(n),d=t(n),u=l.useCallback(({query:a,selectedValues:c})=>{const i=s.useOptions({query:a,selectedValues:c}),r=d.useOptions({query:a,selectedValues:c});return{options:B(i.options,r.options),isInitialLoad:i.options.length===0&&r.options.length===0&&(i.isInitialLoad||r.isInitialLoad),isSearching:i.isSearching||r.isSearching,isLoadingMore:i.isLoadingMore||r.isLoadingMore,hasMore:i.hasMore||r.hasMore,loadMore:()=>{i.hasMore&&i.loadMore(),r.hasMore&&r.loadMore()}}},[s,d]);return l.useMemo(()=>({id:`${s.id}+${d.id}`,useOptions:u}),[s.id,d.id,u])}}function re(e){return e?`status:published+title:~${j(e)}`:"status:published"}function se(e){return{value:e.id,label:e.title}}function ie(e){return{value:e.id,label:e.title,detail:"Page"}}const K=e=>({filter:re(e),limit:"25",fields:"id,title",order:"published_at DESC"}),A=e=>({fields:"id,title",filter:e}),ae=D({id:"posts.published.remote",buildBrowseSearchParams:K,buildHydrateSearchParams:A,selectItems:e=>e?.posts,useQuery:({enabled:e,searchParams:t})=>U({enabled:e,keepPreviousData:!0,searchParams:t}),toOption:se}),ue=D({id:"pages.published.remote",buildBrowseSearchParams:K,buildHydrateSearchParams:A,selectItems:e=>e?.pages,useQuery:({enabled:e,searchParams:t})=>oe({enabled:e,keepPreviousData:!0,searchParams:t}),toOption:ie}),ce=ne(ae,ue);function Se(){return ce()}function Pe({avatarImage:e,memberId:t,memberName:o,memberEmail:n,isHidden:s,className:d}){const u={name:o||void 0,email:n||void 0},a=!!(o||n),c=a?$(u):null,i=a?Q(k(u),"75","55"):void 0;return M.jsxs("div",{className:Y("relative flex size-6 min-w-6 items-center justify-center overflow-hidden rounded-full md:size-8 md:min-w-8",!a&&"bg-accent",s&&"opacity-50",d),style:a?{backgroundColor:i}:void 0,children:[c?M.jsx("span",{className:"text-xs font-semibold text-white md:text-sm",children:c}):M.jsx(q,{className:"size-3! text-muted-foreground md:size-4!",size:12}),t&&e&&M.jsx("div",{className:"absolute inset-0",children:M.jsx("img",{alt:"Member avatar",src:e})})]})}const x=new Map,I="ghostVirtualListScrollPosition",N=150,le=500;function T(){if(!(typeof window>"u"))return window.history.state}function E(e){const t=e?.key;if(typeof t=="string"||typeof t=="number")return String(t);const o=e?.idx;if(typeof o=="number")return String(o)}function _(e,t){const o=E(e);if(o)return`${o}::${t}`}function de(e,t){const o=e?.[I];if(!o||typeof o!="object")return;const n=o[t];if(typeof n=="number")return n}function fe(e,t,o){if(typeof window>"u")return;const n=e?.[I],s={...e??{},[I]:{...n&&typeof n=="object"?n:{},[t]:o}};window.history.replaceState(s,"")}function ye({parentRef:e,enabled:t=!0,isLoading:o=!1}){const n=G(),[s,d]=l.useState(null),u=l.useRef(null),a=l.useRef(0),c=l.useRef(0),i=l.useRef(0),r=l.useRef(null),h=l.useRef(new Set),f=n.pathname+n.search;l.useEffect(()=>{if(!t||!e.current)return;const p=X(e.current);d(p)},[t,e]),l.useEffect(()=>{if(!t||!s)return;const p=T(),L=E(p),S=_(p,f),y=()=>{r.current!==null&&(window.clearTimeout(r.current),r.current=null)},b=g=>{S&&x.set(S,g);const m=T();E(m)===L&&fe(m,f,g),c.current=Date.now(),i.current=g},v=({persistToHistory:g=!0}={})=>{if(y(),!g){const m=a.current;S&&x.set(S,m),c.current=Date.now(),i.current=m;return}b(a.current)},O=()=>{const g=Date.now();if(Math.abs(a.current-i.current)>=le||g-c.current>=N){y(),b(a.current);return}r.current===null&&(r.current=window.setTimeout(()=>{r.current=null,b(a.current)},N))},w=()=>{a.current=s.scrollTop,O()},P=()=>{v()};return a.current=s.scrollTop,s.addEventListener("scroll",w),window.addEventListener("pagehide",P),()=>{v({persistToHistory:!1}),s.removeEventListener("scroll",w),window.removeEventListener("pagehide",P)}},[t,f,s]),l.useEffect(()=>{const p=T(),L=_(p,f),S=(L?x.get(L):void 0)??de(p,f);if(!(!t||!s||o)){if(S!==void 0&&u.current!==f){u.current=f;let y=0;const b=20,v=()=>{for(const P of h.current)window.clearTimeout(P);h.current.clear()},O=(P,g)=>{const m=window.setTimeout(()=>{h.current.delete(m),P()},g);h.current.add(m)},w=()=>{if(y+=1,!s)return;const P=s.scrollTop,g=s.scrollHeight,m=s.clientHeight,R=g-m;if(S>R&&y<b){O(w,100);return}if(Math.abs(S-P)>5){const F=Math.min(S,R);s.scrollTop=F}};return O(w,150),()=>v()}u.current=f}},[t,f,s,o])}export{Pe as M,ye as a,J as b,D as c,j as e,he as f,B as m,Se as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as u,j as i,z as l,B as c,
|
|
1
|
+
import{t as u,j as i,z as l,B as c,aJ as h,r as m}from"./index-CEnfjH5h.js";import{A as N}from"./lucide-react-4VO5Dwow.js";const j=u.forwardRef(({className:e,children:t,...n},a)=>i.jsx("div",{ref:a,className:l("flex items-center justify-between gap-4 pb-6 text-sm",e),...n,children:t}));j.displayName="SimplePagination";const w=u.forwardRef(({className:e,currentPage:t,totalPages:n,...a},r)=>i.jsxs("span",{ref:r,className:l("text-muted-foreground",e),...a,children:["Pages ",t," of ",n]}));w.displayName="SimplePaginationPages";const v=u.forwardRef(({className:e,children:t,...n},a)=>i.jsx("div",{ref:a,className:l("flex items-center gap-1.5",e),...n,children:t}));v.displayName="SimplePaginationNavigation";const M=u.forwardRef(({variant:e="outline",...t},n)=>i.jsx(c,{ref:n,size:"sm",variant:e,...t,children:i.jsx(h,{})}));M.displayName="SimplePaginationPreviousButton";const R=u.forwardRef(({variant:e="outline",...t},n)=>i.jsx(c,{ref:n,size:"sm",variant:e,...t,children:i.jsx(N,{})}));R.displayName="SimplePaginationNextButton";function b({data:e,itemsPerPage:t,initialPage:n=1}){const[a,r]=m.useState(n);if(t<=0)throw new Error("itemsPerPage must be a positive number");const p=s=>{const S=Math.max(1,Math.min(o,s));r(S)},o=m.useMemo(()=>e?Math.ceil(e.length/t):1,[e,t]);m.useEffect(()=>{a>o&&r(1)},[a,o]);const g=m.useMemo(()=>{if(!e)return null;const s=(a-1)*t;return e.slice(s,s+t)},[e,a,t]),f=()=>{r(s=>Math.min(o,s+1))},x=()=>{r(s=>Math.max(1,s-1))},P=a<o,d=a>1;return{currentPage:a,setCurrentPage:p,totalPages:o,paginatedData:g,nextPage:f,previousPage:x,hasNextPage:P,hasPreviousPage:d}}export{j as S,v as a,M as b,R as c,w as d,b as u};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{j as E,B as A,r as g,as as F,cn as L}from"./index-CEnfjH5h.js";const ee=({isLoading:n,onClick:l})=>{const e=!!n;return E.jsx("div",{className:"flex justify-center px-4 py-6",children:E.jsx(A,{disabled:e,variant:"outline",onClick:l,children:e?"Loading more...":"Load more"})})};function _(n){const e=n instanceof HTMLElement&&window.getComputedStyle(n).overflowY,t=e!=="visible"&&e!=="hidden";if(n){if(t&&n.scrollHeight>=n.clientHeight)return n}else return null;return _(n.parentNode)||document.body}function b(n,l,e){let t=e.initialDeps??[],s;function o(){var i,r,a,c;let h;e.key&&((i=e.debug)!=null&&i.call(e))&&(h=Date.now());const d=n();if(!(d.length!==t.length||d.some((f,p)=>t[p]!==f)))return s;t=d;let m;if(e.key&&((r=e.debug)!=null&&r.call(e))&&(m=Date.now()),s=l(...d),e.key&&((a=e.debug)!=null&&a.call(e))){const f=Math.round((Date.now()-h)*100)/100,p=Math.round((Date.now()-m)*100)/100,w=p/16,y=(v,W)=>{for(v=String(v);v.length<W;)v=" "+v;return v};console.info(`%c⏱ ${y(p,5)} /${y(f,5)} ms`,`
|
|
2
|
+
font-size: .6rem;
|
|
3
|
+
font-weight: bold;
|
|
4
|
+
color: hsl(${Math.max(0,Math.min(120-120*w,120))}deg 100% 31%);`,e?.key)}return(c=e?.onChange)==null||c.call(e,s),s}return o.updateDeps=i=>{t=i},o}function M(n,l){if(n===void 0)throw new Error("Unexpected undefined");return n}const D=(n,l)=>Math.abs(n-l)<1.01,j=(n,l,e)=>{let t;return function(...s){n.clearTimeout(t),t=n.setTimeout(()=>l.apply(this,s),e)}},z=n=>{const{offsetWidth:l,offsetHeight:e}=n;return{width:l,height:e}},V=n=>n,B=n=>{const l=Math.max(n.startIndex-n.overscan,0),e=Math.min(n.endIndex+n.overscan,n.count-1),t=[];for(let s=l;s<=e;s++)t.push(s);return t},N=(n,l)=>{const e=n.scrollElement;if(!e)return;const t=n.targetWindow;if(!t)return;const s=i=>{const{width:r,height:a}=i;l({width:Math.round(r),height:Math.round(a)})};if(s(z(e)),!t.ResizeObserver)return()=>{};const o=new t.ResizeObserver(i=>{const r=()=>{const a=i[0];if(a?.borderBoxSize){const c=a.borderBoxSize[0];if(c){s({width:c.inlineSize,height:c.blockSize});return}}s(z(e))};n.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(r):r()});return o.observe(e,{box:"border-box"}),()=>{o.unobserve(e)}},O={passive:!0},I=typeof window>"u"?!0:"onscrollend"in window,H=(n,l)=>{const e=n.scrollElement;if(!e)return;const t=n.targetWindow;if(!t)return;let s=0;const o=n.options.useScrollendEvent&&I?()=>{}:j(t,()=>{l(s,!1)},n.options.isScrollingResetDelay),i=h=>()=>{const{horizontal:d,isRtl:u}=n.options;s=d?e.scrollLeft*(u&&-1||1):e.scrollTop,o(),l(s,h)},r=i(!0),a=i(!1);a(),e.addEventListener("scroll",r,O);const c=n.options.useScrollendEvent&&I;return c&&e.addEventListener("scrollend",a,O),()=>{e.removeEventListener("scroll",r),c&&e.removeEventListener("scrollend",a)}},K=(n,l,e)=>{if(l?.borderBoxSize){const t=l.borderBoxSize[0];if(t)return Math.round(t[e.options.horizontal?"inlineSize":"blockSize"])}return n[e.options.horizontal?"offsetWidth":"offsetHeight"]},P=(n,{adjustments:l=0,behavior:e},t)=>{var s,o;const i=n+l;(o=(s=t.scrollElement)==null?void 0:s.scrollTo)==null||o.call(s,{[t.options.horizontal?"left":"top"]:i,behavior:e})};class U{constructor(l){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.measurementsCache=[],this.itemSizeCache=new Map,this.pendingMeasuredCacheIndexes=[],this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.observer=(()=>{let e=null;const t=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(s=>{s.forEach(o=>{const i=()=>{this._measureElement(o.target,o)};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(i):i()})}));return{disconnect:()=>{var s;(s=t())==null||s.disconnect(),e=null},observe:s=>{var o;return(o=t())==null?void 0:o.observe(s,{box:"border-box"})},unobserve:s=>{var o;return(o=t())==null?void 0:o.unobserve(s)}}})(),this.range=null,this.setOptions=e=>{Object.entries(e).forEach(([t,s])=>{typeof s>"u"&&delete e[t]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:V,rangeExtractor:B,onChange:()=>{},measureElement:K,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,...e}},this.notify=e=>{var t,s;(s=(t=this.options).onChange)==null||s.call(t,this,e)},this.maybeNotify=b(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var e;const t=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==t){if(this.cleanup(),!t){this.maybeNotify();return}this.scrollElement=t,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((e=this.scrollElement)==null?void 0:e.window)??null,this.elementsCache.forEach(s=>{this.observer.observe(s)}),this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0}),this.unsubs.push(this.options.observeElementRect(this,s=>{this.scrollRect=s,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(s,o)=>{this.scrollAdjustments=0,this.scrollDirection=o?this.getScrollOffset()<s?"forward":"backward":null,this.scrollOffset=s,this.isScrolling=o,this.maybeNotify()}))}},this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(e,t)=>{const s=new Map,o=new Map;for(let i=t-1;i>=0;i--){const r=e[i];if(s.has(r.lane))continue;const a=o.get(r.lane);if(a==null||r.end>a.end?o.set(r.lane,r):r.end<a.end&&s.set(r.lane,!0),s.size===this.options.lanes)break}return o.size===this.options.lanes?Array.from(o.values()).sort((i,r)=>i.end===r.end?i.index-r.index:i.end-r.end)[0]:void 0},this.getMeasurementOptions=b(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled],(e,t,s,o,i)=>(this.pendingMeasuredCacheIndexes=[],{count:e,paddingStart:t,scrollMargin:s,getItemKey:o,enabled:i}),{key:!1}),this.getMeasurements=b(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:e,paddingStart:t,scrollMargin:s,getItemKey:o,enabled:i},r)=>{if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),[];this.measurementsCache.length===0&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(h=>{this.itemSizeCache.set(h.key,h.size)}));const a=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const c=this.measurementsCache.slice(0,a);for(let h=a;h<e;h++){const d=o(h),u=this.options.lanes===1?c[h-1]:this.getFurthestMeasurement(c,h),m=u?u.end+this.options.gap:t+s,f=r.get(d),p=typeof f=="number"?f:this.options.estimateSize(h),w=m+p,y=u?u.lane:h%this.options.lanes;c[h]={index:h,start:m,size:p,end:w,key:d,lane:y}}return this.measurementsCache=c,c},{key:!1,debug:()=>this.options.debug}),this.calculateRange=b(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,s,o)=>this.range=e.length>0&&t>0?$({measurements:e,outerSize:t,scrollOffset:s,lanes:o}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=b(()=>{let e=null,t=null;const s=this.calculateRange();return s&&(e=s.startIndex,t=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,s,o,i)=>o===null||i===null?[]:e({startIndex:o,endIndex:i,overscan:t,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const t=this.options.indexAttribute,s=e.getAttribute(t);return s?parseInt(s,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this._measureElement=(e,t)=>{const s=this.indexFromElement(e),o=this.measurementsCache[s];if(!o)return;const i=o.key,r=this.elementsCache.get(i);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(i,e)),e.isConnected&&this.resizeItem(s,this.options.measureElement(e,t,this))},this.resizeItem=(e,t)=>{const s=this.measurementsCache[e];if(!s)return;const o=this.itemSizeCache.get(s.key)??s.size,i=t-o;i!==0&&((this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(s,i,this):s.start<this.getScrollOffset()+this.scrollAdjustments)&&this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=i,behavior:void 0}),this.pendingMeasuredCacheIndexes.push(s.index),this.itemSizeCache=new Map(this.itemSizeCache.set(s.key,t)),this.notify(!1))},this.measureElement=e=>{if(!e){this.elementsCache.forEach((t,s)=>{t.isConnected||(this.observer.unobserve(t),this.elementsCache.delete(s))});return}this._measureElement(e,void 0)},this.getVirtualItems=b(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{const s=[];for(let o=0,i=e.length;o<i;o++){const r=e[o],a=t[r];s.push(a)}return s},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{const t=this.getMeasurements();if(t.length!==0)return M(t[T(0,t.length-1,s=>M(t[s]).start,e)])},this.getOffsetForAlignment=(e,t,s=0)=>{const o=this.getSize(),i=this.getScrollOffset();t==="auto"&&(t=e>=i+o?"end":"start"),t==="center"?e+=(s-o)/2:t==="end"&&(e-=o);const r=this.getTotalSize()+this.options.scrollMargin-o;return Math.max(Math.min(r,e),0)},this.getOffsetForIndex=(e,t="auto")=>{e=Math.max(0,Math.min(e,this.options.count-1));const s=this.measurementsCache[e];if(!s)return;const o=this.getSize(),i=this.getScrollOffset();if(t==="auto")if(s.end>=i+o-this.options.scrollPaddingEnd)t="end";else if(s.start<=i+this.options.scrollPaddingStart)t="start";else return[i,t];const r=t==="end"?s.end+this.options.scrollPaddingEnd:s.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(r,t,s.size),t]},this.isDynamicMode=()=>this.elementsCache.size>0,this.scrollToOffset=(e,{align:t="start",behavior:s}={})=>{s==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getOffsetForAlignment(e,t),{adjustments:void 0,behavior:s})},this.scrollToIndex=(e,{align:t="auto",behavior:s}={})=>{s==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),e=Math.max(0,Math.min(e,this.options.count-1));let o=0;const i=10,r=c=>{if(!this.targetWindow)return;const h=this.getOffsetForIndex(e,c);if(!h){console.warn("Failed to get offset for index:",e);return}const[d,u]=h;this._scrollToOffset(d,{adjustments:void 0,behavior:s}),this.targetWindow.requestAnimationFrame(()=>{const m=this.getScrollOffset(),f=this.getOffsetForIndex(e,u);if(!f){console.warn("Failed to get offset for index:",e);return}D(f[0],m)||a(u)})},a=c=>{this.targetWindow&&(o++,o<i?this.targetWindow.requestAnimationFrame(()=>r(c)):console.warn(`Failed to scroll to index ${e} after ${i} attempts.`))};r(t)},this.scrollBy=(e,{behavior:t}={})=>{t==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getScrollOffset()+e,{adjustments:void 0,behavior:t})},this.getTotalSize=()=>{var e;const t=this.getMeasurements();let s;if(t.length===0)s=this.options.paddingStart;else if(this.options.lanes===1)s=((e=t[t.length-1])==null?void 0:e.end)??0;else{const o=Array(this.options.lanes).fill(null);let i=t.length-1;for(;i>=0&&o.some(r=>r===null);){const r=t[i];o[r.lane]===null&&(o[r.lane]=r.end),i--}s=Math.max(...o.filter(r=>r!==null))}return Math.max(s-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(e,{adjustments:t,behavior:s})=>{this.options.scrollToFn(e,{behavior:s,adjustments:t},this)},this.measure=()=>{this.itemSizeCache=new Map,this.notify(!1)},this.setOptions(l)}}const T=(n,l,e,t)=>{for(;n<=l;){const s=(n+l)/2|0,o=e(s);if(o<t)n=s+1;else if(o>t)l=s-1;else return s}return n>0?n-1:0};function $({measurements:n,outerSize:l,scrollOffset:e,lanes:t}){const s=n.length-1,o=a=>n[a].start;if(n.length<=t)return{startIndex:0,endIndex:s};let i=T(0,s,o,e),r=i;if(t===1)for(;r<s&&n[r].end<e+l;)r++;else if(t>1){const a=Array(t).fill(0);for(;r<s&&a.some(h=>h<e+l);){const h=n[r];a[h.lane]=h.end,r++}const c=Array(t).fill(e+l);for(;i>=0&&c.some(h=>h>=e);){const h=n[i];c[h.lane]=h.start,i--}i=Math.max(0,i-i%t),r=Math.min(s,r+(t-1-r%t))}return{startIndex:i,endIndex:r}}const C=typeof document<"u"?g.useLayoutEffect:g.useEffect;function q(n){const l=g.useReducer(()=>({}),{})[1],e={...n,onChange:(s,o)=>{var i;o?F.flushSync(l):l(),(i=n.onChange)==null||i.call(n,s,o)}},[t]=g.useState(()=>new U(e));return t.setOptions(e),C(()=>t._didMount(),[]),C(()=>t._willUpdate()),t}function Y(n){return q({observeElementRect:N,observeElementOffset:H,scrollToFn:P,...n})}function te({items:n,totalItems:l,parentRef:e,hasNextPage:t,isFetchingNextPage:s,fetchNextPage:o,estimateSize:i=()=>100,overscan:r=5}){const a=Y({count:l,getScrollElement:()=>_(e.current),estimateSize:i,overscan:r}),c=a.getVirtualItems(),h=c.length>0?(c.at(0)?.start??0)-a.options.scrollMargin:0,d=c.length>0?a.getTotalSize()-(c.at(-1)?.end??0):0,u=c.map(f=>({virtualItem:f,key:f.key,item:n[f.index],props:{ref:a.measureElement,"data-index":f.index}})),m=u.at(-1)&&!u.at(-1)?.item;return g.useEffect(()=>{t&&m&&!s&&o()},[t,m,s,o]),{visibleItems:u,virtualizer:a,spaceBefore:h,spaceAfter:d}}const k=1e3,x="ghostVirtualListWindow";function Z({totalItems:n,unlockedItemCount:l}){const e=Math.min(n,l);return{visibleItemCount:e,canLoadMore:n>e}}function G(n){return n+k}function J(n,l){return`${n}::${l}`}function R(n,l,e=k){const t=n?.[x];if(!t||typeof t!="object")return e;const s=t[l];return typeof s!="number"||!Number.isFinite(s)?e:Math.max(1,Math.floor(s))}function Q(n,l,e){if(typeof window>"u")return;const t=n?.[x],s={...n??{},[x]:{...t&&typeof t=="object"?t:{},[l]:e}};window.history.replaceState(s,"")}function S(){if(!(typeof window>"u"))return window.history.state}function se(n,{resetKey:l}={}){const{key:e,pathname:t,search:s}=L(),i=J(t,l??s),[r,a]=g.useState(()=>R(S(),i)),c=g.useRef(i);g.useEffect(()=>{if(c.current!==i){c.current=i,a(R(S(),i));return}Q(S(),i,r)},[i,e,r]);const{visibleItemCount:h,canLoadMore:d}=Z({totalItems:n,unlockedItemCount:r});return{visibleItemCount:h,canLoadMore:d,loadMore:()=>a(u=>G(u))}}export{ee as L,te as a,_ as g,se as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as t,a_ as be,aZ as xe,bO as Se,bP as je,B as oe,bQ as _e,bR as Ce,bS as Ne,bT as ve,co as Le,am as ye,al as Te,b0 as Fe,r as l,cp as Ee,a$ as Z,aL as Oe,ai as ne,aj as K,cq as ke,bW as De,aX as Me,u as Ie,b1 as Ae,aY as Pe}from"./index-ZuWSQ3L6.js";import{S as we,a as Ue,b as Ve,c as Re,d as Be,e as ze,f as $e}from"./select-Bd1zcqox.js";import{u as W,S as ie,a as re,A as J,b as z,c as q,U as le}from"./post-analytics-context-WA--pwK5.js";import{a as Ke,F as Ge}from"./loader-circle-CF5G2g_Z.js";import{g as We,a as He,S as Qe,b as Ye}from"./kpis-Cv75oSPY.js";import{F as qe,c as H,e as ce}from"./en-BkI47Ou-.js";import{C as ue,a as Xe,b as Ze,h as Je,c as de,i as et,u as $,j as ee}from"./pagemenu-BqoDENpI.js";import{D as tt,h as st,i as te,a as at,b as ot,c as nt,d as it,e as rt,f as lt,g as ct}from"./data-list-B2sqn7IE.js";import{a as ut}from"./wallet-cards-zHR_y6Sp.js";import{P as dt,a as mt}from"./post-analytics-header-D97SoEaV.js";import{F as pt,c as ht}from"./filters-DXXaCya7.js";import{b as gt,c as ft,F as bt,S as xt,T as St}from"./lucide-react-DZiAu6PQ.js";import{U as jt}from"./user-plus-DMl69yKl.js";import{M as _t}from"./upload-BTxT4v2z.js";import{F as Ct}from"./message-square-text-DESy3kSk.js";import{E as Nt}from"./empty-indicator-Bf4Dqk72.js";import"./posts-CJHEP4C-.js";import"./source-icon-BqEM5MvU.js";import"./source-utils-B1S3ZHA2.js";import"./gh-chart-Ch6dYUac.js";import"./chart-BCQFlmhJ.js";import"./_baseAssignValue-DJsCJz6y.js";import"./index-DIO8ceib.js";import"./tabs-mR5oJGm5.js";import"./post-share-modal-DBxR7WCX.js";import"./get-site-timezone-BDBAcjmq.js";import"./post-helpers-gInwAwEv.js";import"./trash-BFSLkv0z.js";import"./sprout-Bf-wc2Vo.js";import"./a-large-small-BnBpzYwl.js";import"./at-sign-DC4NtDDM.js";import"./copy-B-MxRWPu.js";import"./hash-BGd7HEsT.js";import"./inbox-CFzKvW3h.js";import"./minus-DVNwSjD6.js";import"./tags-CsgMtkFL.js";import"./square-Cj_bJ0HZ.js";import"./user-round-check-CVuZXUPz.js";import"./repeat-BxOK9zhN.js";import"./reply-BoTN-eE0.js";const se=()=>{const{range:e,setRange:s}=W();return t.jsxs(we,{value:`${e}`,onValueChange:a=>{s(Number(a))},children:[t.jsxs(Ue,{className:"w-auto",children:[t.jsx(Ke,{className:"mr-2",size:16,strokeWidth:1.5}),t.jsx(Ve,{placeholder:"Select a period"})]}),t.jsx(Re,{align:"end",children:t.jsxs(Be,{children:[t.jsx(ze,{children:"Period"}),Object.values(ie).map(a=>t.jsx($e,{value:`${a.value}`,children:a.name},a.value))]})})]})};H.registerLocale(ce);const vt=e=>re[e]||H.getName(e,"en")||"Unknown",Lt=e=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=e.toUpperCase();return s[a]||(e.length>2?e.substring(0,2):e)},ae=({tableHeader:e,data:s,onLocationClick:a})=>t.jsxs(tt,{children:[e&&t.jsxs(st,{children:[t.jsx(te,{children:"Country"}),t.jsx(te,{children:"Visitors"})]}),t.jsx(at,{children:s.map(i=>{const o=vt(`${i.location}`),r=a&&i.location!=="Unknown",c=i.location?i.location.toLowerCase():"unknown";return t.jsxs(ot,{className:r?"cursor-pointer":"","data-testid":`location-row-${c}`,onClick:r?()=>a(i.location):void 0,children:[t.jsx(nt,{style:{width:`${i.percentage?Math.round(i.percentage*100):0}%`}}),t.jsx(it,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:t.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:o,children:[t.jsx(qe,{countryCode:`${Lt(i.location)}`,fallback:t.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:t.jsx(Le.SkullAndBones,{className:"size-3"})})}),t.jsx("div",{className:"truncate font-medium",children:o})]})}),t.jsxs(rt,{children:[t.jsx(lt,{children:ye(Number(i.visits))}),t.jsx(ct,{children:Te(i.percentage)})]})]},i.location||"unknown")})})]}),yt=({data:e,isLoading:s,onLocationClick:a})=>{const i=e.slice(0,10);return t.jsx(t.Fragment,{children:s?"":t.jsx(t.Fragment,{children:e&&e.length>0&&t.jsxs(ue,{className:"group/datalist","data-testid":"locations-card",children:[t.jsxs("div",{className:"flex items-center justify-between p-6",children:[t.jsxs(Xe,{className:"p-0",children:[t.jsx(Ze,{children:"Locations"}),t.jsx(Je,{children:"Where are the readers of this post"})]}),t.jsx(be,{className:"mr-2",children:"Visitors"})]}),t.jsxs(de,{className:"overflow-hidden",children:[t.jsx(xe,{}),t.jsx(ae,{data:i,tableHeader:!1,onLocationClick:a})]}),e.length>10&&t.jsx(et,{children:t.jsxs(Se,{children:[t.jsx(je,{asChild:!0,children:t.jsxs(oe,{variant:"outline",children:["View all ",t.jsx(ut,{})]})}),t.jsxs(_e,{className:"overflow-y-auto pt-0 sm:max-w-[600px]",children:[t.jsxs(Ce,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[t.jsx(Ne,{children:"Top locations"}),t.jsx(ve,{children:"Where are the readers of this post"})]}),t.jsx("div",{className:"group/datalist",children:t.jsx(ae,{data:e,tableHeader:!0,onLocationClick:a})})]})]})})]})})})},me=e=>!e||e.length===0?J:z.filter(s=>e.includes(s.value)).reduce((s,a)=>s|a.bit,0)||J,pe=e=>{const s=[];return(e&q.PUBLIC)!==0&&s.push(z[0].value),(e&q.FREE)!==0&&s.push(z[1].value),(e&q.PAID)!==0&&s.push(z[2].value),s.join(",")};H.registerLocale(ce);const Tt=e=>re[e]||H.getName(e,"en")||e,Ft=({visits:e})=>t.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:e.toLocaleString()}),Et={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:e=>({value:e||"",label:e||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(e){const s=String(e.location||"");return s!==""&&!le.includes(s)},transformValue:e=>({value:e,label:Tt(e)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:e=>({value:e,label:e==="mobile-ios"?"iOS":e==="mobile-android"?"Android":e==="desktop"?"Desktop":e==="bot"?"Bot":e})}},Ot=(e,s,a)=>{const i={...a};return e.forEach(o=>{if(o.field===s||o.values.length===0)return;const r=o.values[0];o.field!=="audience"&&(o.field==="source"||o.field==="device"||o.field==="location"||o.field.startsWith("utm_"))&&(i[o.field]=r)}),i},O=(e,s=[],a,i={})=>{const{enabled:o=!0}=i,{statsConfig:r,range:c}=W(),{startDate:b,endDate:m,timezone:x}=ne(c),p=Et[e],d=l.useMemo(()=>{const j=s.find(h=>h.field==="audience");return me(j?.values)},[s]),S=l.useMemo(()=>{const j={site_uuid:r?.id||"",date_from:K(b),date_to:K(m),timezone:x,member_status:pe(d),limit:"50"};return a&&(j.post_uuid=a),Ot(s,e,j)},[r?.id,b,m,x,d,s,e,a]),{data:v,loading:k}=$({endpoint:p?.endpoint||"",statsConfig:r,params:S,enabled:o&&!!p});return{options:l.useMemo(()=>p?(v||[]).filter(h=>p.filterItem?p.filterItem(h):!0).map(h=>{const F=String(h[p.valueKey]??""),A=Number(h.visits)||0,{value:E,label:y}=p.transformValue?p.transformValue(F):{value:F,label:F};return{label:y,value:E,icon:t.jsx(Ft,{visits:A})}}):[],[v,p]),loading:k}};function kt({filters:e,onChange:s,...a}){const{appSettings:i}=Fe(),{post:o}=W(),r=o?.uuid,[c,b]=l.useState(null),[m,x]=l.useState(!1);l.useEffect(()=>{const g=window.matchMedia("(max-width: 1024px)"),C=T=>{x(T.matches)};return C(g),g.addEventListener("change",C),()=>g.removeEventListener("change",C)},[]);const p=l.useMemo(()=>{const g=[{value:"undefined",label:"Public visitors",icon:t.jsx(Z,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:t.jsx(Oe,{className:"text-green"})},{value:"paid",label:"Paid members",icon:t.jsx(jt,{className:"text-orange"})}];return i?.paidMembersEnabled?g:g.filter(C=>C.value!=="paid")},[i?.paidMembersEnabled]),d=l.useCallback(g=>{const C=c===g,T=e.some(n=>n.field===g);return C||T},[c,e]),{options:S,loading:v}=O("utm_source",e,r,{enabled:d("utm_source")}),{options:k,loading:I}=O("utm_medium",e,r,{enabled:d("utm_medium")}),{options:j,loading:h}=O("utm_campaign",e,r,{enabled:d("utm_campaign")}),{options:F,loading:A}=O("utm_content",e,r,{enabled:d("utm_content")}),{options:E,loading:y}=O("utm_term",e,r,{enabled:d("utm_term")}),{options:R,loading:D}=O("source",e,r,{enabled:d("source")}),{options:U,loading:M}=O("device",e,r,{enabled:d("device")}),{options:B,loading:P}=O("location",e,r,{enabled:d("location")}),_=l.useMemo(()=>[{value:"is",label:"is"}],[]),Q=l.useMemo(()=>{const g=[{key:"utm_source",label:"UTM Source",type:"select",icon:t.jsx(_t,{className:"size-4"}),placeholder:"Select source",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:S,isLoading:v,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:t.jsx(xt,{className:"size-4"}),placeholder:"Select medium",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:k,isLoading:I,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:t.jsx(Ct,{className:"size-4"}),placeholder:"Select campaign",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:j,isLoading:h,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:t.jsx(St,{className:"size-4"}),placeholder:"Select content",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:F,isLoading:A,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:t.jsx(ke,{className:"size-4"}),placeholder:"Select term",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:E,isLoading:y,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:t.jsx(Ee,{}),options:p.map(({value:C,label:T,icon:n})=>({value:C,label:T,icon:n})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:t.jsx(Z,{className:"size-4"}),placeholder:"Select source",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:R,isLoading:D,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:t.jsx(gt,{className:"size-4"}),placeholder:"Select device",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:U,isLoading:M,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:t.jsx(ft,{className:"size-4"}),placeholder:"Select location",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:B,isLoading:P,searchable:!0,selectedOptionsClassName:"hidden"}]},{group:"UTM parameters",fields:g}]},[S,v,k,I,j,h,F,A,E,y,_,p,R,D,U,M,B,P]),w=e.length>0,Y=l.useCallback(()=>{s&&s([])},[s]);return t.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[t.jsx(pt,{addButtonIcon:t.jsx(Ge,{}),addButtonText:w?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${w&&"[&>button]:border-none"}`,fields:Q,filters:e,keyboardShortcut:"f",popoverAlign:m||w?"start":"end",showSearchInput:!1,onActiveFieldChange:b,onChange:s||(()=>{}),...a}),w&&t.jsxs(oe,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:Y,children:[t.jsx(bt,{}),"Clear"]})]})}const G=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],he="__empty__",ge="%2C";function Dt(e){const s=new URLSearchParams;return e.forEach(a=>{if(G.includes(a.field)&&a.values.length>0){const i=a.values.map(o=>o===""?he:String(o).replace(/,/g,ge)).join(",");s.set(a.field,i)}}),s}const X=new Map;function Mt(e){return X.has(e)||X.set(e,`url-${e}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),X.get(e)}function It(e){const s=[],a=new Set(G);return e.forEach((i,o)=>{if(!a.has(o))return;const r=i.split(",").map(c=>c===he?"":c.replace(new RegExp(ge,"g"),","));if(r.length>0){const c=o==="audience"?"is any of":"is";s.push({id:Mt(o),field:o,operator:c,values:r})}}),s}function At(e={}){const[s,a]=De(),{onFiltersChange:i}=e,o=l.useRef(!1),r=l.useMemo(()=>It(s),[s]);l.useEffect(()=>{!o.current&&i&&i(r)},[r,i]);const c=l.useCallback(m=>{o.current=!0;const x=typeof m=="function"?m(r):m,p=Dt(x),d=new URLSearchParams(s);G.forEach(S=>{d.delete(S)}),p.forEach((S,v)=>{d.set(v,S)}),a(d,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[r,s,a]),b=l.useCallback(()=>{o.current=!0;const m=new URLSearchParams(s);G.forEach(x=>{m.delete(x)}),a(m,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[s,a]);return{filters:r,setFilters:c,clearFilters:b}}const Cs=()=>{const e=Me(),{postId:s}=Ie(),{statsConfig:a,isLoading:i,range:o,data:r,post:c,isPostLoading:b}=W(),{filters:m,setFilters:x}=At(),p=l.useMemo(()=>{const n=m.find(f=>f.field==="audience");return me(n?.values)},[m]);l.useEffect(()=>{!b&&c?.email_only&&e(`/posts/analytics/${s}`)},[b,c?.email_only,e,s]);const d=l.useMemo(()=>{if(!c?.published_at)return ie.ALL_TIME.value;const n=Ae(c.published_at);return o>n?n:o},[c?.published_at,o]),{startDate:S,endDate:v,timezone:k}=ne(d),I=l.useCallback(()=>{const n=document.querySelector(".overflow-y-scroll");n&&n.scrollTo({top:0,behavior:"smooth"})},[]),j=l.useMemo(()=>{const n={};return m.forEach(f=>{const N=f.field,L=f.values;if(N==="audience")return;const u=L&&L.length>0&&L[0]!==null&&L[0]!==void 0,V=N==="source"&&L?.[0]==="";if(u&&(L[0]!==""||V)){const fe=String(L[0]);n[N]=fe}}),n},[m]),h=l.useCallback((n,f)=>{x(N=>N.find(u=>u.field===n)?N.map(u=>u.field===n?{...u,values:[f]}:u):[...N,ht(n,"is",[f])]),I()},[x,I]),F=l.useCallback(n=>h("location",n),[h]),A=l.useCallback(n=>h("source",n),[h]),E=l.useMemo(()=>{const n={site_uuid:a?.id||"",date_from:K(S),date_to:K(v),timezone:k,member_status:pe(p),post_uuid:"",...j};return!b&&c?.uuid?{...n,post_uuid:c.uuid}:n},[b,c,a?.id,S,v,k,p,j]),{data:y,loading:R}=$({endpoint:"api_kpis",statsConfig:a||{id:""},params:E}),{data:D,loading:U}=$({endpoint:"api_top_locations",statsConfig:a||{id:""},params:E}),{data:M,loading:B}=$({endpoint:"api_top_sources",statsConfig:a||{id:""},params:E}),P=l.useMemo(()=>D?.reduce((n,f)=>n+Number(f.visits),0)||0,[D]),_=l.useMemo(()=>M?M.reduce((n,f)=>n+Number(f.visits||0),0):0,[M]),Q=r?.url,w=r?.icon,Y=l.useMemo(()=>{const n=D?.map(u=>({location:String(u.location),visits:Number(u.visits),percentage:P>0?Number(u.visits)/P:0,isUnknown:le.includes(String(u.location))}))||[],f=n.filter(u=>!u.isUnknown),N=n.filter(u=>u.isUnknown),L=N.length>0?[{location:"Unknown",visits:N.reduce((u,V)=>u+V.visits,0),percentage:N.reduce((u,V)=>u+V.percentage,0)}]:[];return[...f,...L]},[D,P]),g=i||b||R||U||B,C=We(y),T=m.length>0;return t.jsxs(t.Fragment,{children:[t.jsxs(dt,{currentTab:"Web",children:[T&&t.jsx(ee,{children:t.jsx(se,{})}),t.jsxs(ee,{className:`${T?"mt-0! [grid-area:subactions] lg:mt-[25px]!":"[grid-area:actions]"}`,children:[t.jsx(kt,{filters:m,onChange:x}),!T&&t.jsx(se,{})]})]}),t.jsx(mt,{children:g?t.jsx(ue,{className:"size-full",variant:"plain",children:t.jsx(de,{className:"size-full items-center justify-center",children:t.jsx(Pe,{})})}):y&&y.length!==0&&C.visits!=="0"?t.jsxs(t.Fragment,{children:[t.jsx(He,{data:y,range:d}),t.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[t.jsx(yt,{data:Y,isLoading:U,onLocationClick:F}),t.jsx(Qe,{data:M,range:d,siteIcon:w,siteUrl:Q,totalVisitors:_,onSourceClick:A})]})]}):t.jsx("div",{className:"grow",children:t.jsx(Nt,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${Ye(o)}`,children:t.jsx(Z,{strokeWidth:1.5})})})})]})};export{Cs as default};
|
|
1
|
+
import{j as t,aW as be,aV as xe,bJ as Se,bK as je,B as oe,bL as _e,bM as Ne,bN as Ce,bO as ve,ck as Le,ao as ye,an as Te,aY as Fe,r as l,cl as Ee,aX as J,bS as Oe,ak as ne,al as $,cm as ke,bR as De,aT as Me,u as Ie,aZ as Ae,aU as we}from"./index-CEnfjH5h.js";import{S as Pe,a as Ue,b as Ve,c as Re,d as Be,e as ze,f as Ke}from"./select-CGr_5qad.js";import{u as W,S as ie,a as re,A as Z,b as z,c as X,U as le}from"./post-analytics-context-GFe0lMc-.js";import{a as $e,F as Ge}from"./loader-circle-C8exRUku.js";import{g as We,a as He,S as Qe,b as Ye}from"./kpis-Dw04ruBN.js";import{F as Xe,c as H,e as ce}from"./en-BRQS1Z8j.js";import{C as ue,a as qe,b as Je,h as Ze,c as de,i as et,u as K,j as ee}from"./pagemenu-DzpB1AkZ.js";import{D as tt,h as st,i as te,a as at,b as ot,c as nt,d as it,e as rt,f as lt,g as ct}from"./data-list-Crb1ffbp.js";import{a as ut}from"./wallet-cards-CJcVzH0D.js";import{P as dt,a as mt}from"./post-analytics-header-DmGyNvP9.js";import{F as pt,c as ht}from"./filters-ChOMQQZW.js";import{b as gt,c as ft,F as bt,S as xt,T as St}from"./lucide-react-4VO5Dwow.js";import{U as jt}from"./user-plus-CMxR50-Y.js";import{M as _t}from"./upload-BG7KNIn7.js";import{F as Nt}from"./message-square-text-CC_1bY-Q.js";import{E as Ct}from"./empty-indicator-2QGnEbtY.js";import"./posts-GvXDuhVG.js";import"./source-icon-DMt0UskC.js";import"./source-utils-B1S3ZHA2.js";import"./gh-chart-fuWw60Ka.js";import"./chart-_slUcr-K.js";import"./_baseAssignValue-BKAl5FrV.js";import"./index-BDAOs7pI.js";import"./tabs-G6Ql8vbf.js";import"./post-share-modal-CTpdCS2X.js";import"./get-site-timezone-BDBAcjmq.js";import"./post-helpers-gInwAwEv.js";import"./trash-BeZZgbn-.js";import"./sprout-Td9eaOoY.js";import"./a-large-small-B_ulQCIs.js";import"./at-sign-B8xWKM0y.js";import"./copy-CDHcAPJw.js";import"./hash-CI1pQ1UC.js";import"./inbox-DYY8-M1K.js";import"./minus-DSyx9DCe.js";import"./tags-_taMP0sJ.js";import"./square-Df8vEYlG.js";import"./user-round-check-2nhPmqP3.js";import"./repeat-y6HlMgGO.js";import"./reply-Cc8ryI5v.js";const se=()=>{const{range:e,setRange:s}=W();return t.jsxs(Pe,{value:`${e}`,onValueChange:a=>{s(Number(a))},children:[t.jsxs(Ue,{className:"w-auto",children:[t.jsx($e,{className:"mr-2",size:16,strokeWidth:1.5}),t.jsx(Ve,{placeholder:"Select a period"})]}),t.jsx(Re,{align:"end",children:t.jsxs(Be,{children:[t.jsx(ze,{children:"Period"}),Object.values(ie).map(a=>t.jsx(Ke,{value:`${a.value}`,children:a.name},a.value))]})})]})};H.registerLocale(ce);const vt=e=>re[e]||H.getName(e,"en")||"Unknown",Lt=e=>{const s={"UNITED STATES":"US","UNITED STATES OF AMERICA":"US",USA:"US","UNITED KINGDOM":"GB",UK:"GB","GREAT BRITAIN":"GB",NETHERLANDS:"NL"},a=e.toUpperCase();return s[a]||(e.length>2?e.substring(0,2):e)},ae=({tableHeader:e,data:s,onLocationClick:a})=>t.jsxs(tt,{children:[e&&t.jsxs(st,{children:[t.jsx(te,{children:"Country"}),t.jsx(te,{children:"Visitors"})]}),t.jsx(at,{children:s.map(i=>{const o=vt(`${i.location}`),r=a&&i.location!=="Unknown",c=i.location?i.location.toLowerCase():"unknown";return t.jsxs(ot,{className:r?"cursor-pointer":"","data-testid":`location-row-${c}`,onClick:r?()=>a(i.location):void 0,children:[t.jsx(nt,{style:{width:`${i.percentage?Math.round(i.percentage*100):0}%`}}),t.jsx(it,{className:"group-hover/data:max-w-[calc(100%-140px)]",children:t.jsxs("div",{className:"flex items-center space-x-3 overflow-hidden",title:o,children:[t.jsx(Xe,{countryCode:`${Lt(i.location)}`,fallback:t.jsx("span",{className:"flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white",children:t.jsx(Le.SkullAndBones,{className:"size-3"})})}),t.jsx("div",{className:"truncate font-medium",children:o})]})}),t.jsxs(rt,{children:[t.jsx(lt,{children:ye(Number(i.visits))}),t.jsx(ct,{children:Te(i.percentage)})]})]},i.location||"unknown")})})]}),yt=({data:e,isLoading:s,onLocationClick:a})=>{const i=e.slice(0,10);return t.jsx(t.Fragment,{children:s?"":t.jsx(t.Fragment,{children:e&&e.length>0&&t.jsxs(ue,{className:"group/datalist","data-testid":"locations-card",children:[t.jsxs("div",{className:"flex items-center justify-between p-6",children:[t.jsxs(qe,{className:"p-0",children:[t.jsx(Je,{children:"Locations"}),t.jsx(Ze,{children:"Where are the readers of this post"})]}),t.jsx(be,{className:"mr-2",children:"Visitors"})]}),t.jsxs(de,{className:"overflow-hidden",children:[t.jsx(xe,{}),t.jsx(ae,{data:i,tableHeader:!1,onLocationClick:a})]}),e.length>10&&t.jsx(et,{children:t.jsxs(Se,{children:[t.jsx(je,{asChild:!0,children:t.jsxs(oe,{variant:"outline",children:["View all ",t.jsx(ut,{})]})}),t.jsxs(_e,{className:"overflow-y-auto pt-0 sm:max-w-[600px]",children:[t.jsxs(Ne,{className:"sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur",children:[t.jsx(Ce,{children:"Top locations"}),t.jsx(ve,{children:"Where are the readers of this post"})]}),t.jsx("div",{className:"group/datalist",children:t.jsx(ae,{data:e,tableHeader:!0,onLocationClick:a})})]})]})})]})})})},me=e=>!e||e.length===0?Z:z.filter(s=>e.includes(s.value)).reduce((s,a)=>s|a.bit,0)||Z,pe=e=>{const s=[];return(e&X.PUBLIC)!==0&&s.push(z[0].value),(e&X.FREE)!==0&&s.push(z[1].value),(e&X.PAID)!==0&&s.push(z[2].value),s.join(",")};H.registerLocale(ce);const Tt=e=>re[e]||H.getName(e,"en")||e,Ft=({visits:e})=>t.jsx("span",{className:"order-2 font-mono text-xs text-muted-foreground",children:e.toLocaleString()}),Et={utm_source:{endpoint:"api_top_utm_sources",valueKey:"utm_source",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_medium:{endpoint:"api_top_utm_mediums",valueKey:"utm_medium",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_campaign:{endpoint:"api_top_utm_campaigns",valueKey:"utm_campaign",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_content:{endpoint:"api_top_utm_contents",valueKey:"utm_content",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},utm_term:{endpoint:"api_top_utm_terms",valueKey:"utm_term",transformValue:e=>({value:e||"(not set)",label:e||"(not set)"})},source:{endpoint:"api_top_sources",valueKey:"source",transformValue:e=>({value:e||"",label:e||"Direct"})},location:{endpoint:"api_top_locations",valueKey:"location",filterItem(e){const s=String(e.location||"");return s!==""&&!le.includes(s)},transformValue:e=>({value:e,label:Tt(e)})},device:{endpoint:"api_top_devices",valueKey:"device",transformValue:e=>({value:e,label:e==="mobile-ios"?"iOS":e==="mobile-android"?"Android":e==="desktop"?"Desktop":e==="bot"?"Bot":e})}},Ot=(e,s,a)=>{const i={...a};return e.forEach(o=>{if(o.field===s||o.values.length===0)return;const r=o.values[0];o.field!=="audience"&&(o.field==="source"||o.field==="device"||o.field==="location"||o.field.startsWith("utm_"))&&(i[o.field]=r)}),i},O=(e,s=[],a,i={})=>{const{enabled:o=!0}=i,{statsConfig:r,range:c}=W(),{startDate:b,endDate:m,timezone:x}=ne(c),p=Et[e],d=l.useMemo(()=>{const j=s.find(h=>h.field==="audience");return me(j?.values)},[s]),S=l.useMemo(()=>{const j={site_uuid:r?.id||"",date_from:$(b),date_to:$(m),timezone:x,member_status:pe(d),limit:"50"};return a&&(j.post_uuid=a),Ot(s,e,j)},[r?.id,b,m,x,d,s,e,a]),{data:v,loading:k}=K({endpoint:p?.endpoint||"",statsConfig:r,params:S,enabled:o&&!!p});return{options:l.useMemo(()=>p?(v||[]).filter(h=>p.filterItem?p.filterItem(h):!0).map(h=>{const F=String(h[p.valueKey]??""),A=Number(h.visits)||0,{value:E,label:y}=p.transformValue?p.transformValue(F):{value:F,label:F};return{label:y,value:E,icon:t.jsx(Ft,{visits:A})}}):[],[v,p]),loading:k}};function kt({filters:e,onChange:s,...a}){const{appSettings:i}=Fe(),{post:o}=W(),r=o?.uuid,[c,b]=l.useState(null),[m,x]=l.useState(!1);l.useEffect(()=>{const g=window.matchMedia("(max-width: 1024px)"),N=T=>{x(T.matches)};return N(g),g.addEventListener("change",N),()=>g.removeEventListener("change",N)},[]);const p=l.useMemo(()=>{const g=[{value:"undefined",label:"Public visitors",icon:t.jsx(J,{className:"text-gray-700"})},{value:"free",label:"Free members",icon:t.jsx(Oe,{className:"text-green"})},{value:"paid",label:"Paid members",icon:t.jsx(jt,{className:"text-orange"})}];return i?.paidMembersEnabled?g:g.filter(N=>N.value!=="paid")},[i?.paidMembersEnabled]),d=l.useCallback(g=>{const N=c===g,T=e.some(n=>n.field===g);return N||T},[c,e]),{options:S,loading:v}=O("utm_source",e,r,{enabled:d("utm_source")}),{options:k,loading:I}=O("utm_medium",e,r,{enabled:d("utm_medium")}),{options:j,loading:h}=O("utm_campaign",e,r,{enabled:d("utm_campaign")}),{options:F,loading:A}=O("utm_content",e,r,{enabled:d("utm_content")}),{options:E,loading:y}=O("utm_term",e,r,{enabled:d("utm_term")}),{options:R,loading:D}=O("source",e,r,{enabled:d("source")}),{options:U,loading:M}=O("device",e,r,{enabled:d("device")}),{options:B,loading:w}=O("location",e,r,{enabled:d("location")}),_=l.useMemo(()=>[{value:"is",label:"is"}],[]),Q=l.useMemo(()=>{const g=[{key:"utm_source",label:"UTM Source",type:"select",icon:t.jsx(_t,{className:"size-4"}),placeholder:"Select source",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:S,isLoading:v,searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_medium",label:"UTM Medium",type:"select",icon:t.jsx(xt,{className:"size-4"}),placeholder:"Select medium",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:k,isLoading:I,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_campaign",label:"UTM Campaign",type:"select",icon:t.jsx(Nt,{className:"size-4"}),placeholder:"Select campaign",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:j,isLoading:h,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_content",label:"UTM Content",type:"select",icon:t.jsx(St,{className:"size-4"}),placeholder:"Select content",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:F,isLoading:A,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"utm_term",label:"UTM Term",type:"select",icon:t.jsx(ke,{className:"size-4"}),placeholder:"Select term",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:E,isLoading:y,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"}];return[{group:"Basic",fields:[{key:"audience",label:"Audience",type:"multiselect",icon:t.jsx(Ee,{}),options:p.map(({value:N,label:T,icon:n})=>({value:N,label:T,icon:n})),defaultOperator:"is any of",hideOperatorSelect:!0,autoCloseOnSelect:!0},{key:"source",label:"Source",type:"select",icon:t.jsx(J,{className:"size-4"}),placeholder:"Select source",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:R,isLoading:D,className:"w-60",popoverContentClassName:"w-60",searchable:!0,selectedOptionsClassName:"hidden"},{key:"device",label:"Device",type:"select",icon:t.jsx(gt,{className:"size-4"}),placeholder:"Select device",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:U,isLoading:M,selectedOptionsClassName:"hidden"},{key:"location",label:"Location",type:"select",icon:t.jsx(ft,{className:"size-4"}),placeholder:"Select location",operators:_,defaultOperator:"is",hideOperatorSelect:!0,options:B,isLoading:w,searchable:!0,selectedOptionsClassName:"hidden"}]},{group:"UTM parameters",fields:g}]},[S,v,k,I,j,h,F,A,E,y,_,p,R,D,U,M,B,w]),P=e.length>0,Y=l.useCallback(()=>{s&&s([])},[s]);return t.jsxs("div",{className:"mt-3 flex w-full justify-between gap-2 lg:mt-0","data-testid":"stats-filter-container",children:[t.jsx(pt,{addButtonIcon:t.jsx(Ge,{}),addButtonText:P?"Add filter":"Filter",allowMultiple:!1,className:`[&>button]:order-last ${P&&"[&>button]:border-none"}`,fields:Q,filters:e,keyboardShortcut:"f",popoverAlign:m||P?"start":"end",showSearchInput:!1,onActiveFieldChange:b,onChange:s||(()=>{}),...a}),P&&t.jsxs(oe,{className:"hidden font-normal text-muted-foreground lg:flex","data-testid":"stats-filter-clear-button",variant:"ghost",onClick:Y,children:[t.jsx(bt,{}),"Clear"]})]})}const G=["audience","source","device","location","utm_source","utm_medium","utm_campaign","utm_content","utm_term"],he="__empty__",ge="%2C";function Dt(e){const s=new URLSearchParams;return e.forEach(a=>{if(G.includes(a.field)&&a.values.length>0){const i=a.values.map(o=>o===""?he:String(o).replace(/,/g,ge)).join(",");s.set(a.field,i)}}),s}const q=new Map;function Mt(e){return q.has(e)||q.set(e,`url-${e}-${Date.now()}-${Math.random().toString(36).substring(2,11)}`),q.get(e)}function It(e){const s=[],a=new Set(G);return e.forEach((i,o)=>{if(!a.has(o))return;const r=i.split(",").map(c=>c===he?"":c.replace(new RegExp(ge,"g"),","));if(r.length>0){const c=o==="audience"?"is any of":"is";s.push({id:Mt(o),field:o,operator:c,values:r})}}),s}function At(e={}){const[s,a]=De(),{onFiltersChange:i}=e,o=l.useRef(!1),r=l.useMemo(()=>It(s),[s]);l.useEffect(()=>{!o.current&&i&&i(r)},[r,i]);const c=l.useCallback(m=>{o.current=!0;const x=typeof m=="function"?m(r):m,p=Dt(x),d=new URLSearchParams(s);G.forEach(S=>{d.delete(S)}),p.forEach((S,v)=>{d.set(v,S)}),a(d,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[r,s,a]),b=l.useCallback(()=>{o.current=!0;const m=new URLSearchParams(s);G.forEach(x=>{m.delete(x)}),a(m,{replace:!0}),setTimeout(()=>{o.current=!1},0)},[s,a]);return{filters:r,setFilters:c,clearFilters:b}}const Ns=()=>{const e=Me(),{postId:s}=Ie(),{statsConfig:a,isLoading:i,range:o,data:r,post:c,isPostLoading:b}=W(),{filters:m,setFilters:x}=At(),p=l.useMemo(()=>{const n=m.find(f=>f.field==="audience");return me(n?.values)},[m]);l.useEffect(()=>{!b&&c?.email_only&&e(`/posts/analytics/${s}`)},[b,c?.email_only,e,s]);const d=l.useMemo(()=>{if(!c?.published_at)return ie.ALL_TIME.value;const n=Ae(c.published_at);return o>n?n:o},[c?.published_at,o]),{startDate:S,endDate:v,timezone:k}=ne(d),I=l.useCallback(()=>{const n=document.querySelector(".overflow-y-scroll");n&&n.scrollTo({top:0,behavior:"smooth"})},[]),j=l.useMemo(()=>{const n={};return m.forEach(f=>{const C=f.field,L=f.values;if(C==="audience")return;const u=L&&L.length>0&&L[0]!==null&&L[0]!==void 0,V=C==="source"&&L?.[0]==="";if(u&&(L[0]!==""||V)){const fe=String(L[0]);n[C]=fe}}),n},[m]),h=l.useCallback((n,f)=>{x(C=>C.find(u=>u.field===n)?C.map(u=>u.field===n?{...u,values:[f]}:u):[...C,ht(n,"is",[f])]),I()},[x,I]),F=l.useCallback(n=>h("location",n),[h]),A=l.useCallback(n=>h("source",n),[h]),E=l.useMemo(()=>{const n={site_uuid:a?.id||"",date_from:$(S),date_to:$(v),timezone:k,member_status:pe(p),post_uuid:"",...j};return!b&&c?.uuid?{...n,post_uuid:c.uuid}:n},[b,c,a?.id,S,v,k,p,j]),{data:y,loading:R}=K({endpoint:"api_kpis",statsConfig:a||{id:""},params:E}),{data:D,loading:U}=K({endpoint:"api_top_locations",statsConfig:a||{id:""},params:E}),{data:M,loading:B}=K({endpoint:"api_top_sources",statsConfig:a||{id:""},params:E}),w=l.useMemo(()=>D?.reduce((n,f)=>n+Number(f.visits),0)||0,[D]),_=l.useMemo(()=>M?M.reduce((n,f)=>n+Number(f.visits||0),0):0,[M]),Q=r?.url,P=r?.icon,Y=l.useMemo(()=>{const n=D?.map(u=>({location:String(u.location),visits:Number(u.visits),percentage:w>0?Number(u.visits)/w:0,isUnknown:le.includes(String(u.location))}))||[],f=n.filter(u=>!u.isUnknown),C=n.filter(u=>u.isUnknown),L=C.length>0?[{location:"Unknown",visits:C.reduce((u,V)=>u+V.visits,0),percentage:C.reduce((u,V)=>u+V.percentage,0)}]:[];return[...f,...L]},[D,w]),g=i||b||R||U||B,N=We(y),T=m.length>0;return t.jsxs(t.Fragment,{children:[t.jsxs(dt,{currentTab:"Web",children:[T&&t.jsx(ee,{children:t.jsx(se,{})}),t.jsxs(ee,{className:`${T?"mt-0! [grid-area:subactions] lg:mt-[25px]!":"[grid-area:actions]"}`,children:[t.jsx(kt,{filters:m,onChange:x}),!T&&t.jsx(se,{})]})]}),t.jsx(mt,{children:g?t.jsx(ue,{className:"size-full",variant:"plain",children:t.jsx(de,{className:"size-full items-center justify-center",children:t.jsx(we,{})})}):y&&y.length!==0&&N.visits!=="0"?t.jsxs(t.Fragment,{children:[t.jsx(He,{data:y,range:d}),t.jsxs("div",{className:"flex flex-col gap-6 lg:grid lg:grid-cols-2",children:[t.jsx(yt,{data:Y,isLoading:U,onLocationClick:F}),t.jsx(Qe,{data:M,range:d,siteIcon:P,siteUrl:Q,totalVisitors:_,onSourceClick:A})]})]}):t.jsx("div",{className:"grow",children:t.jsx(Ct,{className:"h-full",description:"Try adjusting filters to see more data.",title:`No visitors ${Ye(o)}`,children:t.jsx(J,{strokeWidth:1.5})})})})]})};export{Ns as default};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<link rel="stylesheet" href="./assets/vendor-0ede59da8efb5e28fa929557f7ff7154.css">
|
|
5
5
|
<link rel="stylesheet" href="./assets/ghost-1627c2071621864e79a845529769ff19.css">
|
|
6
|
-
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.
|
|
6
|
+
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.25%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%22602b9df7f2%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22137a664063%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%22a90e835dda%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%222962cc8c0a%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22c6bb98ee14%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
|
|
7
7
|
|
|
8
8
|
<meta charset="UTF-8" />
|
|
9
9
|
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
<meta name="apple-mobile-web-app-title" content="Ghost" />
|
|
18
18
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
19
19
|
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
|
20
|
-
<script type="module" crossorigin src="./assets/index-
|
|
21
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
20
|
+
<script type="module" crossorigin src="./assets/index-CEnfjH5h.js"></script>
|
|
21
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BbveDn8H.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body class="react-admin">
|
|
24
24
|
<div id="ember-alerts-wormhole"></div>
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
<div id="ember-liquid-wormhole"></div>
|
|
39
39
|
<div id="ember-notifications-wormhole"></div>
|
|
40
40
|
<script src="./assets/vendor-0e6161f8da2ad46cf62cef0a53cfb16a.js"></script>
|
|
41
|
-
<script src="./assets/chunk.
|
|
42
|
-
<script src="./assets/chunk.
|
|
43
|
-
<script src="./assets/chunk.524.
|
|
44
|
-
<script src="./assets/ghost-
|
|
41
|
+
<script src="./assets/chunk.434.de8a15730373eccfeefe.js"></script>
|
|
42
|
+
<script src="./assets/chunk.630.3dbb0231a2d871126a80.js"></script>
|
|
43
|
+
<script src="./assets/chunk.524.5b9b463506a16221fc91.js"></script>
|
|
44
|
+
<script src="./assets/ghost-78b4a517ac907213ab47708eef33bc6f.js"></script>
|
|
45
45
|
</body>
|
|
46
46
|
</html>
|
|
@@ -75,10 +75,7 @@ function getMembersHelper(data, frontendKey, excludeList) {
|
|
|
75
75
|
membersHelper += (`<style id="gh-members-styles">${templateStyles}</style>`);
|
|
76
76
|
}
|
|
77
77
|
if (settingsCache.get('paid_members_enabled')) {
|
|
78
|
-
|
|
79
|
-
const isFraudSignalsEnabled = process.env.NODE_ENV === 'testing-browser' ? '?advancedFraudSignals=false' : '';
|
|
80
|
-
|
|
81
|
-
membersHelper += `<script async src="https://js.stripe.com/v3/${isFraudSignalsEnabled}"></script>`;
|
|
78
|
+
membersHelper += `<script async src="https://js.stripe.com/v3/"></script>`;
|
|
82
79
|
}
|
|
83
80
|
return membersHelper;
|
|
84
81
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const logging = require('@tryghost/logging');
|
|
2
|
+
const {default: ObjectID} = require('bson-objectid');
|
|
3
|
+
const {createTransactionalMigration} = require('../../utils');
|
|
4
|
+
|
|
5
|
+
const DEFAULT_SLUG = 'default-automated-email';
|
|
6
|
+
|
|
7
|
+
module.exports = createTransactionalMigration(
|
|
8
|
+
async function up(knex) {
|
|
9
|
+
logging.info('Inserting default email_design_settings row');
|
|
10
|
+
|
|
11
|
+
const existing = await knex('email_design_settings').where({slug: DEFAULT_SLUG}).first();
|
|
12
|
+
|
|
13
|
+
if (existing) {
|
|
14
|
+
logging.warn('Default email_design_settings row already exists, skipping');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
await knex('email_design_settings').insert({
|
|
19
|
+
id: (new ObjectID()).toHexString(),
|
|
20
|
+
slug: DEFAULT_SLUG,
|
|
21
|
+
background_color: 'light',
|
|
22
|
+
header_background_color: 'transparent',
|
|
23
|
+
show_header_title: true,
|
|
24
|
+
button_color: 'accent',
|
|
25
|
+
button_corners: 'rounded',
|
|
26
|
+
button_style: 'fill',
|
|
27
|
+
link_color: 'accent',
|
|
28
|
+
link_style: 'underline',
|
|
29
|
+
body_font_category: 'sans_serif',
|
|
30
|
+
title_font_category: 'sans_serif',
|
|
31
|
+
title_font_weight: 'bold',
|
|
32
|
+
image_corners: 'square',
|
|
33
|
+
show_badge: true,
|
|
34
|
+
created_at: knex.raw('current_timestamp')
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
async function down(knex) {
|
|
38
|
+
logging.info('Deleting default email_design_settings row');
|
|
39
|
+
|
|
40
|
+
await knex('email_design_settings').where({slug: DEFAULT_SLUG}).del();
|
|
41
|
+
}
|
|
42
|
+
);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const {combineTransactionalMigrations, addPermissionWithRoles} = require('../../utils');
|
|
2
|
+
|
|
3
|
+
module.exports = combineTransactionalMigrations(
|
|
4
|
+
addPermissionWithRoles({
|
|
5
|
+
name: 'Browse email design settings',
|
|
6
|
+
action: 'browse',
|
|
7
|
+
object: 'email_design_setting'
|
|
8
|
+
}, [
|
|
9
|
+
'Administrator',
|
|
10
|
+
'Admin Integration'
|
|
11
|
+
]),
|
|
12
|
+
addPermissionWithRoles({
|
|
13
|
+
name: 'Read email design settings',
|
|
14
|
+
action: 'read',
|
|
15
|
+
object: 'email_design_setting'
|
|
16
|
+
}, [
|
|
17
|
+
'Administrator',
|
|
18
|
+
'Admin Integration'
|
|
19
|
+
]),
|
|
20
|
+
addPermissionWithRoles({
|
|
21
|
+
name: 'Edit email design settings',
|
|
22
|
+
action: 'edit',
|
|
23
|
+
object: 'email_design_setting'
|
|
24
|
+
}, [
|
|
25
|
+
'Administrator',
|
|
26
|
+
'Admin Integration'
|
|
27
|
+
]),
|
|
28
|
+
addPermissionWithRoles({
|
|
29
|
+
name: 'Add email design settings',
|
|
30
|
+
action: 'add',
|
|
31
|
+
object: 'email_design_setting'
|
|
32
|
+
}, [
|
|
33
|
+
'Administrator',
|
|
34
|
+
'Admin Integration'
|
|
35
|
+
]),
|
|
36
|
+
addPermissionWithRoles({
|
|
37
|
+
name: 'Delete email design settings',
|
|
38
|
+
action: 'destroy',
|
|
39
|
+
object: 'email_design_setting'
|
|
40
|
+
}, [
|
|
41
|
+
'Administrator',
|
|
42
|
+
'Admin Integration'
|
|
43
|
+
])
|
|
44
|
+
);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const {MigrationError} = require('@tryghost/errors');
|
|
2
|
+
const logging = require('@tryghost/logging');
|
|
3
|
+
const {createTransactionalMigration} = require('../../utils');
|
|
4
|
+
|
|
5
|
+
const DEFAULT_SLUG = 'default-automated-email';
|
|
6
|
+
|
|
7
|
+
module.exports = createTransactionalMigration(
|
|
8
|
+
async function up(knex) {
|
|
9
|
+
logging.info('Backfilling automated_emails.email_design_setting_id');
|
|
10
|
+
|
|
11
|
+
const defaultEmailDesignSetting = await knex('email_design_settings')
|
|
12
|
+
.where({slug: DEFAULT_SLUG})
|
|
13
|
+
.first();
|
|
14
|
+
|
|
15
|
+
if (!defaultEmailDesignSetting) {
|
|
16
|
+
throw new MigrationError({
|
|
17
|
+
message: `Missing default email_design_settings row for slug: ${DEFAULT_SLUG}`
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
await knex('automated_emails')
|
|
22
|
+
.whereNull('email_design_setting_id')
|
|
23
|
+
.update({
|
|
24
|
+
email_design_setting_id: defaultEmailDesignSetting.id
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
async function down(knex) {
|
|
28
|
+
logging.info('Reverting automated_emails.email_design_setting_id backfill');
|
|
29
|
+
|
|
30
|
+
const defaultEmailDesignSetting = await knex('email_design_settings')
|
|
31
|
+
.where({slug: DEFAULT_SLUG})
|
|
32
|
+
.first();
|
|
33
|
+
|
|
34
|
+
if (!defaultEmailDesignSetting) {
|
|
35
|
+
logging.warn(`Default email_design_settings row not found for slug: ${DEFAULT_SLUG} — skipping revert`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await knex('automated_emails')
|
|
40
|
+
.where({email_design_setting_id: defaultEmailDesignSetting.id})
|
|
41
|
+
.update({
|
|
42
|
+
email_design_setting_id: null
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
);
|
|
@@ -51,6 +51,14 @@
|
|
|
51
51
|
}
|
|
52
52
|
]
|
|
53
53
|
},
|
|
54
|
+
{
|
|
55
|
+
"name": "EmailDesignSetting",
|
|
56
|
+
"entries": [
|
|
57
|
+
{
|
|
58
|
+
"slug": "default-automated-email"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
54
62
|
{
|
|
55
63
|
"name": "Tag",
|
|
56
64
|
"entries": [
|
|
@@ -536,6 +544,31 @@
|
|
|
536
544
|
"action_type": "destroy",
|
|
537
545
|
"object_type": "automated_email"
|
|
538
546
|
},
|
|
547
|
+
{
|
|
548
|
+
"name": "Browse email design settings",
|
|
549
|
+
"action_type": "browse",
|
|
550
|
+
"object_type": "email_design_setting"
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
"name": "Read email design settings",
|
|
554
|
+
"action_type": "read",
|
|
555
|
+
"object_type": "email_design_setting"
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
"name": "Edit email design settings",
|
|
559
|
+
"action_type": "edit",
|
|
560
|
+
"object_type": "email_design_setting"
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"name": "Add email design settings",
|
|
564
|
+
"action_type": "add",
|
|
565
|
+
"object_type": "email_design_setting"
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"name": "Delete email design settings",
|
|
569
|
+
"action_type": "destroy",
|
|
570
|
+
"object_type": "email_design_setting"
|
|
571
|
+
},
|
|
539
572
|
{
|
|
540
573
|
"name": "Read member signin urls",
|
|
541
574
|
"action_type": "read",
|
|
@@ -892,6 +925,7 @@
|
|
|
892
925
|
"product": "all",
|
|
893
926
|
"label": "all",
|
|
894
927
|
"automated_email": "all",
|
|
928
|
+
"email_design_setting": "all",
|
|
895
929
|
"email_preview": "all",
|
|
896
930
|
"email": "all",
|
|
897
931
|
"member_signin_url": "read",
|
|
@@ -941,6 +975,7 @@
|
|
|
941
975
|
"member": "all",
|
|
942
976
|
"label": "all",
|
|
943
977
|
"automated_email": "all",
|
|
978
|
+
"email_design_setting": "all",
|
|
944
979
|
"email_preview": "all",
|
|
945
980
|
"email": "all",
|
|
946
981
|
"snippet": "all",
|
|
@@ -1177,6 +1177,7 @@ module.exports = {
|
|
|
1177
1177
|
sender_name: {type: 'string', maxlength: 191, nullable: true},
|
|
1178
1178
|
sender_email: {type: 'string', maxlength: 191, nullable: true, validations: {isEmail: true}},
|
|
1179
1179
|
sender_reply_to: {type: 'string', maxlength: 191, nullable: true, validations: {isEmail: true}},
|
|
1180
|
+
email_design_setting_id: {type: 'string', maxlength: 24, nullable: false, references: 'email_design_settings.id'},
|
|
1180
1181
|
created_at: {type: 'dateTime', nullable: false},
|
|
1181
1182
|
updated_at: {type: 'dateTime', nullable: true},
|
|
1182
1183
|
'@@INDEXES@@': [
|
|
@@ -49,9 +49,7 @@ class CommentReportsImporter extends TableImporter {
|
|
|
49
49
|
return null;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const
|
|
53
|
-
const now = new Date();
|
|
54
|
-
const reportTime = faker.date.between(commentCreatedAt, now);
|
|
52
|
+
const reportTime = dateToDatabaseString.randomBetween(this.model.created_at, new Date());
|
|
55
53
|
|
|
56
54
|
const reporter = this.possibleReporters[faker.datatype.number(this.possibleReporters.length - 1)];
|
|
57
55
|
|
|
@@ -24,6 +24,7 @@ class CommentsImporter extends TableImporter {
|
|
|
24
24
|
|
|
25
25
|
setReferencedModel(model) {
|
|
26
26
|
this.model = model;
|
|
27
|
+
const publishedAt = dateToDatabaseString.parse(model.published_at);
|
|
27
28
|
|
|
28
29
|
this.commentIds = []; // Store [id, parent_id, timestamp] tuples for reply-to-reply
|
|
29
30
|
|
|
@@ -32,11 +33,11 @@ class CommentsImporter extends TableImporter {
|
|
|
32
33
|
trend: 'negative',
|
|
33
34
|
// Use commentsPerPost as a baseline with some variance (+/- 20%)
|
|
34
35
|
total: Math.round(this.commentsPerPost * faker.datatype.float({min: 0.8, max: 1.2})),
|
|
35
|
-
startTime:
|
|
36
|
+
startTime: publishedAt,
|
|
36
37
|
endTime: new Date()
|
|
37
38
|
}).sort((a, b) => a.getTime() - b.getTime()); // Sort chronologically so replies always come after their targets
|
|
38
39
|
|
|
39
|
-
this.possibleMembers = this.members.filter(member =>
|
|
40
|
+
this.possibleMembers = this.members.filter(member => dateToDatabaseString.parse(member.created_at) < publishedAt);
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
generate() {
|
|
@@ -20,8 +20,8 @@ class EmailBatchesImporter extends TableImporter {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
generate() {
|
|
23
|
-
const emailSentDate =
|
|
24
|
-
const latestUpdatedDate =
|
|
23
|
+
const emailSentDate = dateToDatabaseString.parse(this.model.created_at);
|
|
24
|
+
const latestUpdatedDate = dateToDatabaseString.parse(this.model.created_at);
|
|
25
25
|
latestUpdatedDate.setHours(latestUpdatedDate.getHours() + 1);
|
|
26
26
|
|
|
27
27
|
return {
|
|
@@ -30,7 +30,7 @@ class EmailBatchesImporter extends TableImporter {
|
|
|
30
30
|
provider_id: `${new Date().toISOString().split('.')[0].replace(/[^0-9]/g, '')}.${faker.datatype.hexadecimal({length: 16, prefix: '', case: 'lower'})}@m.example.com`,
|
|
31
31
|
status: 'submitted', // TODO: introduce failures
|
|
32
32
|
created_at: this.model.created_at,
|
|
33
|
-
updated_at: dateToDatabaseString(
|
|
33
|
+
updated_at: dateToDatabaseString(dateToDatabaseString.randomBetween(emailSentDate, latestUpdatedDate))
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -111,7 +111,7 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
111
111
|
|
|
112
112
|
if (!(memberSubscribeEvent.created_at instanceof Date)) {
|
|
113
113
|
// SQLite fix
|
|
114
|
-
memberSubscribeEvent.created_at =
|
|
114
|
+
memberSubscribeEvent.created_at = dateToDatabaseString.parse(memberSubscribeEvent.created_at);
|
|
115
115
|
}
|
|
116
116
|
this.membersSubscribeEventsCreatedAtsByNewsletterId.get(memberSubscribeEvent.newsletter_id).push(memberSubscribeEvent.created_at.getTime());
|
|
117
117
|
}
|
|
@@ -125,8 +125,8 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
125
125
|
this.batchIndex = this.batch.index;
|
|
126
126
|
|
|
127
127
|
// Shallow clone members list so we can shuffle and modify it
|
|
128
|
-
const earliestOpenTime =
|
|
129
|
-
const latestOpenTime =
|
|
128
|
+
const earliestOpenTime = dateToDatabaseString.parse(this.batch.updated_at);
|
|
129
|
+
const latestOpenTime = dateToDatabaseString.parse(this.batch.updated_at);
|
|
130
130
|
latestOpenTime.setDate(latestOpenTime.getDate() + 14);
|
|
131
131
|
|
|
132
132
|
// Get all members that were subscribed to this newsletter BEFORE the batch was sent
|
|
@@ -164,7 +164,7 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
// The events are generated for a different time, so we need to move them to the batch time
|
|
167
|
-
timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() +
|
|
167
|
+
timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() + dateToDatabaseString.parse(this.batch.updated_at).getTime());
|
|
168
168
|
|
|
169
169
|
if (timestamp > new Date()) {
|
|
170
170
|
timestamp = new Date();
|
|
@@ -187,9 +187,9 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
187
187
|
|
|
188
188
|
let deliveredTime;
|
|
189
189
|
if (status === emailStatus.opened) {
|
|
190
|
-
const startDate = this.batch.updated_at;
|
|
190
|
+
const startDate = dateToDatabaseString.parse(this.batch.updated_at);
|
|
191
191
|
const endDate = timestamp;
|
|
192
|
-
deliveredTime =
|
|
192
|
+
deliveredTime = dateToDatabaseString.randomBetween(startDate, endDate);
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
return {
|
|
@@ -42,19 +42,20 @@ class EmailsImporter extends TableImporter {
|
|
|
42
42
|
: this.newsletters[1];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
const publishedAt = dateToDatabaseString.parse(this.model.published_at);
|
|
45
46
|
const timestamp = luck(60)
|
|
46
|
-
?
|
|
47
|
+
? publishedAt
|
|
47
48
|
: generateEvents({
|
|
48
49
|
shape: 'ease-out',
|
|
49
50
|
trend: 'negative',
|
|
50
51
|
total: 1,
|
|
51
|
-
startTime:
|
|
52
|
+
startTime: publishedAt,
|
|
52
53
|
endTime: new Date()
|
|
53
54
|
})[0];
|
|
54
55
|
|
|
55
56
|
const recipientCount = this.membersSubscribeEvents
|
|
56
57
|
.filter(entry => entry.newsletter_id === newsletter.id)
|
|
57
|
-
.filter(entry =>
|
|
58
|
+
.filter(entry => dateToDatabaseString.parse(entry.created_at) < timestamp).length;
|
|
58
59
|
const deliveredCount = Math.ceil(recipientCount * faker.datatype.float({
|
|
59
60
|
max: 1,
|
|
60
61
|
min: 0.9,
|