@tanglemedia/directus-collection-resource
Version:
Installs the Resource Collection to your Directus project.
448 lines (439 loc) • 9.31 kB
JavaScript
const COLLECTION_NAME = "tngl_resource";
let SITE_BASE_URL = process.env.SITE_BASE_URL ?? "";
const SECTION_NAME = "resources";
function removeTrailingSlash(url) {
return url.endsWith("/") ? url.slice(0, -1) : url;
}
if (SITE_BASE_URL) {
SITE_BASE_URL = removeTrailingSlash(SITE_BASE_URL);
}
const COLLECTION_INSERTS = [
{
accountability: "all",
archive_app_filter: true,
archive_field: "status",
archive_value: "archived",
collapse: "open",
collection: COLLECTION_NAME,
color: null,
display_template: "{{cover_thumbnail}} {{title}}",
group: null,
hidden: false,
icon: "file_present",
item_duplication_fields: null,
note: null,
preview_url: null,
singleton: false,
sort: null,
sort_field: null,
translations: JSON.stringify([
{
language: "en-US",
translation: "Resources",
},
{
language: "en-CA",
translation: "Resources",
},
]),
unarchive_value: "draft",
versioning: false,
},
];
const FIELD_INSERTS = [
{
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,
field: "sort",
special: null,
interface: "input",
options: null,
display: null,
display_options: null,
readonly: false,
hidden: true,
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: "labels",
display_options: JSON.stringify({
choices: [
{
text: "$t:published",
color: "var(--theme--primary)",
value: "published",
background: "var(--theme--primary-background)",
foreground: "var(--theme--primary)",
},
{
text: "$t:draft",
color: "var(--theme--foreground)",
value: "draft",
background: "var(--theme--background-normal)",
foreground: "var(--theme--foreground)",
},
{
text: "$t:archived",
color: "var(--theme--warning)",
value: "archived",
background: "var(--theme--warning-background)",
foreground: "var(--theme--warning)",
},
],
showAsDot: true,
}),
field: "status",
group: null,
hidden: false,
interface: "select-dropdown",
note: null,
options: JSON.stringify({
choices: [
{
text: "$t:published",
color: "var(--theme--primary)",
value: "published",
},
{
text: "$t:draft",
color: "var(--theme--foreground)",
value: "draft",
},
{
text: "$t:archived",
color: "var(--theme--warning)",
value: "archived",
},
],
}),
readonly: false,
required: false,
sort: 3,
special: null,
translations: null,
validation: null,
validation_message: null,
width: "full",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "user",
display_options: null,
field: "user_created",
group: null,
hidden: true,
interface: "select-dropdown-m2o",
note: null,
options: JSON.stringify({
template: "{{avatar.$thumbnail}} {{first_name}} {{last_name}}",
}),
readonly: true,
required: false,
sort: 4,
special: "user-created",
translations: null,
validation: null,
validation_message: null,
width: "half",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "user",
display_options: null,
field: "user_updated",
group: null,
hidden: true,
interface: "select-dropdown-m2o",
note: null,
options: JSON.stringify({
template: "{{avatar.$thumbnail}} {{first_name}} {{last_name}}",
}),
readonly: true,
required: false,
sort: 5,
special: "user-updated",
translations: null,
validation: null,
validation_message: null,
width: "half",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "datetime",
display_options: JSON.stringify({
relative: true,
}),
field: "date_created",
group: null,
hidden: true,
interface: "datetime",
note: null,
options: null,
readonly: true,
required: false,
sort: 6,
special: "date-created",
translations: null,
validation: null,
validation_message: null,
width: "half",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "datetime",
display_options: JSON.stringify({
relative: true,
}),
field: "date_updated",
group: null,
hidden: true,
interface: "datetime",
note: null,
options: null,
readonly: true,
required: false,
sort: 7,
special: "date-updated",
translations: null,
validation: null,
validation_message: null,
width: "half",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "formatted-value",
display_options: null,
field: "title",
group: null,
hidden: false,
interface: "input",
note: null,
options: null,
readonly: false,
required: true,
sort: 8,
special: null,
translations: null,
validation: null,
validation_message: null,
width: null,
},
{
collection: COLLECTION_NAME,
field: "slug",
special: null,
interface: "extension-wpslug",
options: JSON.stringify({
slug: true,
trim: true,
prefix: `${SITE_BASE_URL}/${SECTION_NAME}/`,
iconLeft: null,
template: "{{title}}",
placeholder: null,
}),
display: "extension-display-link",
display_options: JSON.stringify({
prefix: `${SITE_BASE_URL}/${SECTION_NAME}/`,
showPrefix: true,
}),
readonly: false,
hidden: false,
sort: 9,
width: null,
translations: JSON.stringify([
{
language: "en-US",
translation: "URL",
},
{
language: "en-CA",
translation: "URL",
},
]),
note: null,
conditions: null,
required: true,
group: null,
validation: JSON.stringify({
_and: [
{
_and: [
{
slug: {
_neq: '""',
},
},
{
slug: {
_nnull: true,
},
},
{
slug: {
_nempty: true,
},
},
],
},
],
}),
validation_message: null,
},
{
collection: COLLECTION_NAME,
conditions: null,
display: "image",
display_options: null,
field: "cover_thumbnail",
group: null,
hidden: false,
interface: "file-image",
note: "Thumbnail image that gets displayed when viewing this resource in card or list view on the website.",
options: JSON.stringify({
crop: false,
}),
readonly: false,
required: false,
sort: 10,
special: "file",
translations: null,
validation: null,
validation_message: null,
width: "full",
},
{
collection: COLLECTION_NAME,
conditions: null,
display: null,
display_options: null,
field: "file",
group: null,
hidden: false,
interface: "file",
note: "Attached file of this resource. This is displayed on the website that can be downloaded.",
options: null,
readonly: false,
required: false,
sort: 11,
special: "file",
translations: null,
validation: null,
validation_message: null,
width: "full",
},
{
collection: COLLECTION_NAME,
field: "seo",
special: "alias,no-data,group",
interface: "group-detail",
options: null,
display: null,
display_options: null,
readonly: false,
hidden: false,
sort: 30,
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: "keywords",
group: "seo",
hidden: false,
interface: "tags",
note: null,
options: null,
readonly: false,
required: false,
sort: 1,
special: "cast-json",
translations: null,
validation: null,
validation_message: null,
width: null,
},
{
collection: COLLECTION_NAME,
conditions: null,
display: null,
display_options: null,
field: "description",
group: "seo",
hidden: false,
interface: "input-multiline",
note: null,
options: null,
readonly: false,
required: false,
sort: 2,
special: null,
translations: null,
validation: null,
validation_message: null,
width: null,
},
];
export async function up(knex) {
// if row exists in directus_collections table, do not proceed with migration
const collectionExists = await knex("directus_collections")
.select("collection")
.where("collection", COLLECTION_NAME)
.first();
// register 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 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();
}