Options
All
  • Public
  • Public/Protected
  • All
Menu

dc-extensions-sdk

Build Status npm version

An SDK that enables the creation of Extensions for Dynamic Content. Extensions are custom form controls that can be used in the content editing form in the Dynamic Content App.

Installation

Using npm:

npm install dc-extensions-sdk --save

Using yarn:

yarn add dc-extensions-sdk

Using cdn:

<script src="https://unpkg.com/dc-extensions-sdk@^2"></script>

Usage

Creating a vanilla Javascript extension

import { init } from 'dc-extensions-sdk';

async function initialize() {
  const sdk = await init();
}

initialize();

or

const dcExtensionsSdk = require('dc-extensions-sdk');

async function initialize() {
  const sdk = await dcExtensionsSdk.init();
}

initialize();

Creating a typed Content Field extension with Typescript

import { init } from 'dc-extensions-sdk';
import type { ContentFieldExtension } from 'dc-extensions-sdk';

// define the input field model
interface FieldModel {
  title: string;
  type: string;
  control: string;
  format: string;
  minLength: number;
  maxLength: number;
}

// define the installation config parameters
interface Parameters {
  instance: {};
  installation: {
    configParam: string;
  };
}

async function initialize() {
  const sdk = await init<ContentFieldExtension<FieldModel, Parameters>>();
}

initialize();

Creating a typed Dashboard extension with Typescript

import { init } from 'dc-extensions-sdk';
import type { DashboardExtension } from 'dc-extensions-sdk';

// define the installation config parameters
interface Parameters {
  instance: {};
  installation: {
    configParam: string;
  };
}

async function initialize() {
  const sdk = await init<DashboardExtension<Parameters>>();
}

initialize();

Creating a typed Content Editor extension with Typescript

import { init } from 'dc-extensions-sdk';
import type { ContentEditorExtension } from 'dc-extensions-sdk';

// define the installation config parameters
interface Parameters {
  installation: {
    configParam: string;
  };
}

async function initialize() {
  const sdk = await init<ContentEditorExtension<Parameters>>();
}

initialize();

Options

You can configure your extension with the options object passed into the init function.

import { init } from 'dc-extensions-sdk';

const options = {
  // enable useful behind-the-scenes info
  debug: false,
  // the max time to wait for a connection to establish
  connectionTimeout: 4500,
};

async function initialize() {
  const sdk = await init(options);

  //..
}

initialize();

Content Field Usage

Field

Fetching the field value

const fieldValue = await sdk.field.getValue();

console.log(fieldValue);

Setting the field value

Note: The field model isn't updated when the form is in a read only state.

const sdk = await init();

await sdk.field.setValue('some value');

Resetting the field value

This will reset to the previously saved state or undefined if the item hasn't been saved.

const sdk = await init();

await sdk.field.resetValue();

Retrieving the field schema

const sdk = await init();

const schema = sdk.field.schema;

Test if a model is valid

Will evaluate the supplied model against the schema. Returns a boolean.

const sdk = await init();

const isValid = await sdk.field.isValid('some value');

Test if a model is valid (with errors)

Will evaluate the supplied model against the schema. Will either return an array of errors or undefined.

const sdk = await init();

const errors = await sdk.field.validate('some value');

Content Item

Use to fetch the Content Item that is currently being edited.

const sdk = await init();

const contentItem = await sdk.contentItem.getCurrent();

Example Content Item:

{
  "id": "4801f662-de68-43d3-8864-52d2d9c10bf4",
  "deliveryId": "4801f662-de68-43d3-8864-52d2d9c10bf4",
  "locale": "en-GB",
  "body": {
    "_meta": {
      "name": "hello-world",
      "schema": "http://www.hello-world.com"
    },
    "helloWorld": "Test"
  },
  "label": "Hello World",
  "version": 8
}

Assets

Use to get assets.

const sdk await init();

const asset = await sdk.assets.getById('123-456-789');

Example asset:

{
  "srcName": "an-image.jpg",
  "revisionNumber": 8,
  "bucketID": "00000000-0000-0000-0000-000000000000",
  "label": "an-image.jpg",
  "mimeType": "image/jpeg",
  "type": "image",
  "userID": "00000000-0000-0000-0000-000000000000",
  "thumbFile": "00000000-0000-0000-0000-000000000000",
  "folderID": "00000000-0000-0000-0000-000000000000",
  "file": "00000000-0000-0000-0000-000000000000",
  "createdDate": 1683798022161,
  "name": "an-image",
  "subType": null,
  "id": "00000000-0000-0000-0000-000000000000",
  "thumbURL": "https://thumbs.amplience.net/r/00000000-0000-0000-0000-000000000000",
  "publishStatus": "PUBLISHED",
  "status": "active",
  "timestamp": 1688563779803
}

Frame

Setting the height

This changes the height of the extension. It will measure the height of the application and change the container's height to fit. You can also force a height by specifying an integer value.

const sdk = await init();

sdk.frame.setHeight(); // measures height
sdk.frame.setHeight(300); // override height

Auto Resizing

While the application's height will be automatically set on load, your application's size might change over time. When this happens you can either trigger sdk.frame.setHeight(); or use the Auto Resizer.

The Auto Resizer will listen for any change to the DOM as well as window resizing. When it is triggered it will automatically resize the container’s height to the size of the extension.

NOTE: If your application dynamically loads images we suggest you attach a load event listener that will trigger sdk.frame.setHeight();

const sdk = await init();
// turn on the Auto Resizer
sdk.frame.startAutoResizer();

// turn off the Auto Resizer
sdk.frame.stopAutoResizer();

Locales

The available locales for the Content Item.

const sdk = await init();

const locales = sdk.locales;

console.log(locales);

Example:

{
  "default": ["en-GB", "fr-FR"],
  "available": [
    {
      "locale": "en-GB",
      "language": "en",
      "country": "GB",
      "index": 0,
      "selected": true
    },
    {
      "locale": "fr-FR",
      "language": "fr",
      "country": "FR",
      "index": 1,
      "selected": false
    }
  ]
}

Params

These allow your component to be configurable. They can be defined in the JSON Schema (instance) or defined in the registry (installation), or both.

const sdk = await init();

console.log(sdk.params);
{
  instance: {},
  installation: {}
}

Media Link

Use this to trigger an image or video browser.

const sdk = await init();

const image = await sdk.mediaLink.getImage();
const video = await sdk.mediaLink.getVideo();

Content Link

Use this to trigger an content-item browser for including content-links. Include a list of schemas to browse for.

const sdk = await init();

const contentLink = await sdk.contentLink.get(['http://my.schema/carousel.json']);

Content Reference

Use this to trigger an content-item browser for including content references. Include a list of schemas to browse for.

const sdk = await init();

const contentReference = await sdk.contentReference.get(['http://my.schema/carousel.json']);

Form

Model

Use this to fetch the in-progress form model. This can change while the extension is open.

const sdk = await init();

const formModel = await sdk.form.getValue();

Read Only

In some contexts in the form content is not editable and we provide a boolean value that specifies if content should not be editable if you want to react to these changes we give you a function to do so.

Note: The field model isn't updated when the form is in a read only state.

const input = document.querySelector('input');
const sdk = await init();

// the state is set on load of the form
console.log(sdk.form.readOnly);

sdk.form.onReadOnlyChange((readOnly) => {
  if (readOnly) {
    input.setAttribute('disabled', true);
  } else {
    input.removeAttribute('disabled');
  }
});

Dashboard

Application Navigator

The ApplicationNavigator is exposed on the Dashboard extension under the property applicationNavigator.

For each of the open commands you can supply an additional options argument if you wish to only return the href. This maybe useful if you need to set the href directly on an anchor within your extension.

const sdk = await init();
const href = sdk.applicationNavigator.openEventsCalendar({ returnHref: true });

const anchor = window.document.getElementById('my-anchor');
anchor.setAttribute('href', href);

Open the events calendar

const sdk = await init();
sdk.applicationNavigator.openEventsCalendar();

Open the events timeline

const sdk = await init();
sdk.applicationNavigator.openEventsTimeline();

Open the events list

const sdk = await init();
sdk.applicationNavigator.openEventsList();

Open an event by id

const sdk = await init();
sdk.applicationNavigator.openEvent({ id: 'EVENT_ID...' });

Open edition by edition id & event id

const sdk = await init();
sdk.applicationNavigator.openEdition({ id: 'EDITION_ID...', eventId: 'EVENT_ID...' });

Open the content Library

const sdk = await init();
sdk.applicationNavigator.openContentLibrary();

Open a content item by id

const sdk = await init();
sdk.applicationNavigator.openContentItem({ id: 'CONTENT_ITEM_ID...' });

Content Editor

Get Current Model

Fetching will give you the current model of the content item you're viewing.

const sdk = await init();
const model = await sdk.form.getValue();

Set Model

Setting the model will return Error Report if there is any invalid content

const sdk = await init();
try {
  await sdk.form.setValue({ title: 'hello world' });
} catch (errors) {
  if (errors.length) {
    console.log(errors);
  }
}

Validate

You can validate an object against the schema and get the full error report back

const sdk = await init();
const errors = await sdk.form.validate({
  title: 'hello world',
});

if (errors) {
  console.log(errors);
}

Example:

[
  {
    errorCategory: 'DATA',
    errorData: {
      keyword: 'maxLength',
      params: {
        limit: 10,
      },
    },
    errorSeverity: 'FATAL',
    errorType: 'DATA_VALIDATION_ERROR',
    message: 'should NOT be longer than 10 characters',
    schema: {
      id: 'https://simple-text.com',
      originalId: 'https://simple-text.com',
      location: {
        pointer: '/properties/title/maxLength',
      },
    },
    data: {
      location: {
        pointer: '/title',
      },
    },
  },
];

isValid

A boolean value is returned showing whether the content is valid

const sdk = await init();
const isValid = await sdk.form.isValid({
  title: 'hello world',
});

console.log(isValid); // false

onModelChange

For syncing your model with Dynamic Content on content changes outside the extension e.g delivery key change

const sdk = await init();

sdk.form.onModelChange((errors, model) => {
  setErrors(errors);
  setModel(model);
});

returns a unsubscribe function to unsubscribe call back

const unsubscribe = sdk.form.onModelChange((errors, model) => {
  setErrors(errors);
  setModel(model);
});

unsubscribe();

Client (Supported on Content Field, Dashboard & Content Editor extensions)

Use client with dc-management-sdk-js

import { init } from 'dc-extensions-sdk';
import { DynamicContent } from 'dc-management-sdk-js';

const dcExtension = await init();
const dcManagement = new DynamicContent({}, {}, dcExtension.client);

const hubs = await dcManagement.hubs.list();

Users (Supported on Content Field, Dashboard & Content Editor extensions)

Return users logged in to the Content Management application

import { init } from 'dc-extensions-sdk';

const dcExtension = await init();

const users = await dcExtension.users.list();
console.log(users);

Example:

[
  {
    id: '7078e5e7-d5bf-4015-4832-b75fb6f60537',
    firstName: 'Test',
    lastName: 'User',
    email: 'testuser@bigcontent.io',
  }
]

Index

Enumerations

Classes

Interfaces

Type aliases

Variables

Functions

Object literals

Type aliases

Body

Body<T>: ObjectMap<T & { _meta: ContentMeta }>

Type parameters

  • T = {}

ContentItemModel

ContentItemModel<T>: { body: Body<T>; deliveryId: string; id: string; label: string; locale?: undefined | string; version: number }

Type parameters

  • T = {}

Type declaration

  • body: Body<T>
  • deliveryId: string
  • id: string
  • label: string
  • Optional locale?: undefined | string
  • version: number

ErrorReport

ErrorReport: { data: SchemaValidationError; message: string; pointer: string; schema: { id: string; pointer: string } }

The JSON Schema errors that have been discovered on your set value.

Type declaration

  • data: SchemaValidationError
  • message: string
  • pointer: string
  • schema: { id: string; pointer: string }
    • id: string
    • pointer: string

FieldSchema

FieldSchema<ParamType>: ObjectMap<{ description?: undefined | string; title?: undefined | string; type?: undefined | string; ui:extension: UiExtension<ParamType> }>

Type parameters

Hub

Hub: { id: string; name: string; organizationId?: undefined | string }

Type declaration

  • id: string
  • name: string
  • Optional organizationId?: undefined | string

ObjectMap

ObjectMap<T, K>: T & {}

Type parameters

  • T = Object

  • K = any

SchemaType

SchemaType: ObjectMap<{ $id?: undefined | string; $schema: string; allOf: Array<{ $ref: string }>; description?: undefined | string; id?: undefined | string; properties: ObjectMap<any, FieldSchema>; propertyOrder?: Array<string>; required?: Array<string>; title?: undefined | string; type?: undefined | string }>

SchemaValidationErrorParameters

onFormValueChangeHandler

onFormValueChangeHandler: (formModel: Record<string, unknown>) => void

Type declaration

    • (formModel: Record<string, unknown>): void
    • Parameters

      • formModel: Record<string, unknown>

      Returns void

onModelChangeArgs

onModelChangeArgs: { content: any; errors: null | ErrorReport[] }

Type declaration

onModelChangeHandler

onModelChangeHandler: (errors: null | ErrorReport[], content: any) => void

Type declaration

    • Parameters

      Returns void

onReadOnlyChangeHandler

onReadOnlyChangeHandler: (readonly: boolean) => void

Type declaration

    • (readonly: boolean): void
    • Parameters

      • readonly: boolean

      Returns void

Variables

Const USERS_URL

USERS_URL: "https://auth.amplience.net/users" = 'https://auth.amplience.net/users' as const

Const orgUsersQuery

orgUsersQuery: "query getOrganizationMembersByOrgId($orgId: ID!, $first: Int!, $after: String) {node(id: $orgId) {id... on Organization {idmembers(first: $first, after: $after) {edges {node {idemailpicturename}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}}}}" = `query getOrganizationMembersByOrgId($orgId: ID!, $first: Int!, $after: String) {node(id: $orgId) {id... on Organization {idmembers(first: $first, after: $after) {edges {node {idemailpicturename}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}}}}`

Const testError

testError: ErrorReport = ({message: 'wrong',pointer: '/here',data: {keyword: 'fail',params: {},},schema: {id: 'aschema',pointer: '/blah/blah',},} as unknown) as ErrorReport

Functions

extensionFactory

init

  • init<ExtensionType>(options?: Partial<InitOptions>): Promise<ExtensionType>
  • The method that starts it all

    Type parameters

    Parameters

    • Default value options: Partial<InitOptions> = {}

      The configuration object to change the behaviour of the extension

    Returns Promise<ExtensionType>

    Returns a promise that will resolve with a new [[SDK]] instance

    import { init } from 'dc-extensions-sdk';
    
    async function initialize() {
     const contentFieldExtension = await <ContentFieldExtension>init();
    
     //.. setup extension
    }
    

isContentEditorContextObject

isContentFieldContextObject

isContextObject

  • isContextObject(context: unknown | ContextObject): context is ContextObject

isDashboardContextObject

Object literals

Const asset

asset: object

bucketID

bucketID: string = "00000000-0000-0000-0000-000000000000"

createdDate

createdDate: number = 1683798022161

file

file: string = "00000000-0000-0000-0000-000000000000"

folderID

folderID: string = "00000000-0000-0000-0000-000000000000"

id

id: string = "00000000-0000-0000-0000-000000000000"

label

label: string = "an-image.jpg"

mimeType

mimeType: string = "image/jpeg"

name

name: string = "an-image"

publishStatus

publishStatus: string = "PUBLISHED"

revisionNumber

revisionNumber: number = 8

srcName

srcName: string = "an-image.jpg"

status

status: string = "active"

subType

subType: null = null

thumbFile

thumbFile: string = "00000000-0000-0000-0000-000000000000"

thumbURL

thumbURL: string = "https://thumbs.amplience.net/r/00000000-0000-0000-0000-000000000000"

timestamp

timestamp: number = 1688563779803

type

type: string = "image"

userID

userID: string = "00000000-0000-0000-0000-000000000000"

Const defaultOptions

defaultOptions: object

connectionTimeout

connectionTimeout: false = false

debug

debug: false = false

timeout

timeout: false = false

window

window: Window & globalThis = window

Const testValue

testValue: object

hello

hello: string = "world"

Legend

  • Constructor
  • Property
  • Method
  • Private property
  • Private method
  • Property
  • Inherited property
  • Protected property

Generated using TypeDoc