UNPKG

@tanglemedia/directus-extension-bundle-page-views

Version:

A Directus extension bundle that adds a page views collection and dashboard to track page views.

958 lines (951 loc) 18.2 kB
const COLLECTION_NAME = "tngl_page_views"; const COLLECTION_INSERTS = [ { accountability: "all", archive_app_filter: true, archive_field: null, archive_value: "archived", collapse: "open", collection: COLLECTION_NAME, color: null, display_template: "{{title}} - {{url}}", group: null, hidden: false, icon: "remove_red_eye", item_duplication_fields: null, note: null, preview_url: null, singleton: false, sort: null, sort_field: null, translations: JSON.stringify([ { language: "en-US", translation: "Page Views", }, { language: "en-CA", translation: "Page Views", }, ]), unarchive_value: "draft", versioning: false, }, ]; const FIELD_INSERTS = [ { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "country_code", group: "location", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 4, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "country_name", group: "location", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 5, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "datetime", display_options: null, field: "date_created", group: "performance", hidden: false, interface: "datetime", note: null, options: null, readonly: true, required: false, sort: 1, special: "date-created", translations: JSON.stringify([ { language: "en-US", translation: "Page Opened", }, { language: "en-CA", translation: "Page Opened", }, ]), validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "datetime", display_options: null, field: "date_updated", group: "performance", hidden: true, interface: "datetime", note: null, options: null, readonly: true, required: false, sort: 2, special: null, translations: JSON.stringify([ { language: "en-US", translation: "Page Closed", }, { language: "en-CA", translation: "Page Opened", }, ]), validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "labels", display_options: JSON.stringify({ choices: [ { text: "Desktop", value: "Desktop", }, { text: "Mobile", value: "Mobile", }, ], }), field: "device", group: "specifications", hidden: false, interface: "select-dropdown", note: null, options: JSON.stringify({ choices: [ { text: "Desktop", value: "Desktop", }, { text: "Mobile", value: "Mobile", }, ], }), readonly: true, required: false, sort: 2, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "device_height", group: "specifications", hidden: true, interface: "input", note: null, options: JSON.stringify({ min: 0, }), readonly: true, required: false, sort: 10, special: null, translations: null, validation: null, validation_message: null, width: "half", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "device_width", group: "specifications", hidden: true, interface: "input", note: null, options: JSON.stringify({ min: 0, }), readonly: true, required: false, sort: 9, special: null, translations: null, validation: null, validation_message: null, width: "half", }, { collection: COLLECTION_NAME, conditions: null, display: "formatted-value", display_options: JSON.stringify({ suffix: "ms", }), field: "duration", group: "performance", hidden: true, interface: "input", note: "in milliseconds (ms)", options: JSON.stringify({ min: 0, }), readonly: true, required: false, sort: 3, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "extension-display-link", display_options: JSON.stringify({ prefix: process.env.SITE_BASE_URL, showPrefix: true, }), field: "endpoint", group: "page", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 3, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "labels", display_options: JSON.stringify({ choices: [ { text: "Development", value: "Development", background: "#3399FF", foreground: "#FFFFFF", }, { text: "Staging", value: "Staging", background: "#FFA439", foreground: "#18222F", }, { text: "Production", value: "Production", background: "#2ECDA7", foreground: "#18222F", }, ], }), field: "environment", group: "specifications", hidden: false, interface: "select-dropdown", note: null, options: JSON.stringify({ choices: [ { text: "Development", value: "Development", }, { text: "Staging", value: "Staging", }, { text: "Production", value: "Production", }, ], }), readonly: true, required: false, sort: 6, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "raw", display_options: null, field: "geolocation", group: "location", hidden: false, interface: "map", note: null, options: JSON.stringify({ defaultView: { zoom: 0.1429493193490147, pitch: 0, center: { lat: 28.85018279638213, lng: 24.752118478332022, }, bearing: 0, }, geometryType: "Point", }), readonly: true, required: false, sort: 6, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "id", group: null, hidden: true, interface: "input", note: null, options: null, readonly: true, required: false, sort: 1, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "ip_address", group: "location", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 1, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "kind", group: "page", hidden: true, interface: "input", note: null, options: null, readonly: true, required: false, sort: 4, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "language", group: "specifications", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 4, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "language_name", group: "specifications", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 5, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "formatted-value", display_options: JSON.stringify({ suffix: "ms", }), field: "load_time", group: "performance", hidden: false, interface: "input", note: "in milliseconds (ms) - time waited until load event is finished", options: null, readonly: true, required: false, sort: 6, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, field: "location", special: "alias,no-data,group", interface: "group-detail", options: null, display: null, display_options: null, readonly: false, hidden: false, sort: 3, width: "full", translations: null, note: null, conditions: null, required: false, group: null, validation: null, validation_message: null, }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "location_payload", group: "location", hidden: true, interface: "input-code", note: null, options: JSON.stringify({ lineWrapping: true, }), readonly: true, required: false, sort: 7, special: "cast-json", translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "labels", display_options: JSON.stringify({ choices: [ { text: "Navigate", value: "Navigate", }, { text: "Reload", value: "Reload", }, { text: "History (Back/Forward)", value: "History", }, ], }), field: "navigation", group: "specifications", hidden: false, interface: "select-dropdown", note: null, options: JSON.stringify({ choices: [ { text: "Navigate", value: "Navigate", }, { text: "Reload", value: "Reload", }, { text: "History (Back/Forward)", value: "History", }, ], allowNone: true, }), readonly: true, required: false, sort: 8, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "labels", display_options: JSON.stringify({ choices: [ { text: "Landscape", value: "Landscape", }, { text: "Portrait", value: "Portrait", }, ], }), field: "orientation", group: "specifications", hidden: true, interface: "select-dropdown", note: null, options: JSON.stringify({ choices: [ { text: "Landscape", value: "Landscape", }, { text: "Portrait", value: "Portrait", }, ], }), readonly: true, required: false, sort: 7, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "origin", group: "page", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 7, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, field: "page", special: "alias,no-data,group", interface: "group-detail", options: null, display: null, display_options: null, readonly: false, hidden: false, sort: 1, width: "full", translations: null, note: null, conditions: null, required: false, group: null, validation: null, validation_message: null, }, { collection: COLLECTION_NAME, field: "performance", special: "alias,no-data,group", interface: "group-detail", options: null, display: null, display_options: null, readonly: false, hidden: false, sort: 4, width: "full", translations: null, note: null, conditions: null, required: false, group: null, validation: null, validation_message: null, }, { collection: COLLECTION_NAME, conditions: null, display: "raw", display_options: null, field: "platform", group: "specifications", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 3, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "formatted-value", display_options: JSON.stringify({ suffix: "ms", }), field: "render_time", group: "performance", hidden: false, interface: "input", note: "in milliseconds (ms) - page render time", options: null, readonly: true, required: false, sort: 5, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "formatted-value", display_options: JSON.stringify({ suffix: "ms", }), field: "request_response_time", group: "performance", hidden: false, interface: "input", note: "in milliseconds (ms) - network latency", options: null, readonly: true, required: false, sort: 4, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "screen_height", group: "specifications", hidden: true, interface: "input", note: null, options: JSON.stringify({ min: 0, }), readonly: true, required: false, sort: 12, special: null, translations: null, validation: null, validation_message: null, width: "half", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "screen_width", group: "specifications", hidden: true, interface: "input", note: null, options: JSON.stringify({ min: 0, }), readonly: true, required: false, sort: 11, special: null, translations: null, validation: null, validation_message: null, width: "half", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "section", group: "page", hidden: true, interface: "input", note: null, options: null, readonly: true, required: false, sort: 5, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "session_id", group: "specifications", hidden: true, interface: "input", note: null, options: null, readonly: true, required: false, sort: 1, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: "labels", display_options: JSON.stringify({ format: false, choices: [ { text: "Direct Traffic", value: "empty", }, ], }), field: "source", group: "page", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 6, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, field: "specifications", special: "alias,no-data,group", interface: "group-detail", options: null, display: null, display_options: null, readonly: false, hidden: false, sort: 2, width: "full", translations: null, note: null, conditions: null, required: false, group: null, validation: null, validation_message: null, }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "timezone", group: "location", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 2, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: null, field: "title", group: "page", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 1, special: null, translations: null, validation: null, validation_message: null, width: "full", }, { collection: COLLECTION_NAME, conditions: null, display: null, display_options: JSON.stringify({ showCopy: true, showLink: true, }), field: "url", group: "page", hidden: false, interface: "input", note: null, options: null, readonly: true, required: false, sort: 2, special: null, translations: null, validation: null, validation_message: null, width: "full", }, ]; export async function up(knex) { // if tngl_page_views exists in directus_collections table, do not proceed with migration const collectionExists = await knex("directus_collections") .select("collection") .where("collection", COLLECTION_NAME) .first(); // register tngl_page_views table into `directus_collections` table // for full list of directus_collections properties, refer to: https://docs.directus.io/reference/system/collections.html if (!collectionExists) { await knex("directus_collections").insert(COLLECTION_INSERTS); } // register tngl_page_views fields into `directus_fields` table // for full list of directus_fields properties, refer to: https://docs.directus.io/reference/system/fields.html await knex("directus_fields").insert(FIELD_INSERTS); } export async function down(knex) { // remove associated data from directus_fields table await knex("directus_fields").where("collection", COLLECTION_NAME).del(); // remove associated data from directus_collections table await knex("directus_collections").where("collection", COLLECTION_NAME).del(); }