@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
JavaScript
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();
}