Skip to main content

Dataset plugin

Datasets give you all the tools to easily extend your plugin schemas and forms.

Locations

A location is a reference to the place in the plugin frontend where a dataset will be placed.

Add location

Add a new location for a dataset and give it a name and description so that the admin can know that it is located in the frontend.

const name = {
es: 'Datos adicionales del salón de clase',
en: 'Additional classroom data',
};

const description = {
es: 'El profesor debe indicar datos de personalización del salón.',
en: 'The teacher must provide custom data for the classroom.',
};

const locationName = 'register-classroom-data';
const pluginName = 'plugins.classrooms';

await leemons.getPlugin('dataset').services.dataset.addLocation({
name,
description,
locationName,
pluginName,
});

/**
* @return { name, description, locationName, pluginName }
* */

Update location

Update location name and description

await leemons.getPlugin('dataset').services.dataset.updateLocation({
name,
description,
locationName,
pluginName,
});

/**
* @return { name, description, locationName, pluginName }
* */

Delete location

Deletes everything related to the location except the stored data.

await leemons.getPlugin('dataset').services.dataset.deleteLocation(locationName, pluginName);

/**
* @return boolean
* */

Location exists

Check if the location exists

await leemons.getPlugin('dataset').services.dataset.existLocation(locationName, pluginName);

/**
* @return boolean
* */

Retrieve location

If the location exists, the location is returned with its name and description.

If you specify the language to be returned, the name and description will arrive already translated into the requested language if exists.

If the language is not specified it will return the name and description as objects with all available languages.

const locale = 'en';

await leemons
.getPlugin('dataset')
.services.dataset.getLocation(locationName, pluginName, { locale });

/**
* @return {
* name: 'Additional classroom data',
* description: 'The teacher must provide custom data for the classroom.',
* locationName: 'register-classroom-data',
* pluginName: 'plugins.classrooms'
* }
* */

Schemas

react-jsonschema-form

The schemas are composed of two configuration objects:

  • jsonSchema: where you define which fields the form will have and what conditions each field must fulfil to be valid.
  • jsonUI: how it has to be shown in the frontend (appearance).

See some examples in react-jsonschema-form

Adding a schema

To add a schema you must first understand that the schema must support multiple languages, so you must have separate schemas and texts that can be translated into different objects, as the schema must always be the same regardless of the language, but the texts vary according to the language.

Let's add a basic schema/ui

For a better understanding, let's assume we want to add these schema and ui in multiple languages.

Show wrong schemas (English hardcoded)
const jsonSchema = {
title: 'A registration form',
description: 'A simple form example.',
type: 'object',
required: ['firstName', 'lastName'],
properties: {
firstName: {
type: 'string',
title: 'First name',
default: 'Chuck',
},
lastName: {
type: 'string',
title: 'Last name',
},
age: {
type: 'number',
},
telephone: {
type: 'string',
title: 'Telephone',
minLength: 10,
},
},
};

const jsonUI = {
firstName: {
'ui:autofocus': true,
'ui:emptyValue': '',
'ui:autocomplete': 'family-name',
},
lastName: {
'ui:emptyValue': '',
'ui:autocomplete': 'given-name',
},
age: {
'ui:widget': 'updown',
'ui:title': 'Age of person',
'ui:description': '(earthian year)',
},
telephone: {
'ui:options': {
inputType: 'tel',
},
},
};

Note that if we do so, we will no longer be able to display data entry forms in multiple languages.

What we need to do is to create the schemas using translation "keys", and then add the translations in the languages we need.

Show good schemas (Translation keys)
const jsonSchema = {
title: '{{it.title}}',
description: '{{it.description}}',
type: 'object',
required: ['firstName', 'lastName'],
properties: {
firstName: {
type: 'string',
title: '{{it.properties.firstName.title}}',
default: '{{it.properties.firstName.default}}',
},
lastName: { type: 'string', title: '{{it.properties.lastName.title}}' },
age: { type: 'number' },
telephone: {
type: 'string',
title: '{{it.properties.telephone.title}}',
minLength: 10,
},
},
};

const jsonUI = {
firstName: {
'ui:autofocus': true,
'ui:emptyValue': '',
'ui:autocomplete': 'family-name',
},
lastName: { 'ui:emptyValue': '', 'ui:autocomplete': 'given-name' },
age: {
'ui:widget': 'updown',
'ui:title': '{{it.age.ui_title}}',
'ui:description': '{{it.age.ui_description}}',
},
telephone: { 'ui:options': { inputType: 'tel' } },
};

Finally, add the schemas and translations to the location.

const locationName = 'register-classroom-data';
const pluginName = 'plugins.classrooms';

// Add the Schemas
await leemons.getPlugin('dataset').services.dataset.addSchema({
jsonSchema,
jsonUI,
locationName,
pluginName,
});

// Add the translations
const schemaTranslation = {
title: 'A registration form',
description: 'A simple form example.',
properties: {
firstName: { title: 'First name', default: 'Chuck' },
lastName: { title: 'Last name' },
telephone: { title: 'Telephone' },
},
};

const uiTranslation = {
age: { ui_title: 'Age of person', ui_description: '(earthian year)' },
password: { ui_help: 'Hint: Make it strong!' },
};
const locale = 'en';

await leemons.getPlugin('dataset').services.dataset.addSchemaLocale({
locationName,
pluginName,
schemaTranslation,
uiTranslation,
locale,
});
NOTE

We use squirrelly.js to compile the schema with translations. Check out its documentation for more information.

Update schema

Same as .addSchema. Throw an error if no schema is found.

await leemons.getPlugin('dataset').services.dataset.updateSchema({
jsonSchema,
jsonUI,
locationName,
pluginName,
});

/**
* @return {jsonSchema, jsonUI, locationName, pluginName}
* */

Delete schema

Delete all schemas and translations for a given location.

await leemons.getPlugin('dataset').services.dataset.deleteSchema(locationName, pluginName);

/**
* @return boolean
* */

Schema exists

Check if the schema exists for a given location.

await leemons.getPlugin('dataset').services.dataset.existSchema(locationName, pluginName);

/**
* @return boolean
* */

Retrieve schema

Returns the schema if it exists

await leemons.getPlugin('dataset').services.dataset.getSchema(locationName, pluginName);

/**
* @return {jsonSchema, jsonUI, locationName, pluginName}
* */

Retrieve schema compiled to a language

If the schema and the translation exist, compile the schema and return it.

const locale = 'en';

await leemons
.getPlugin('dataset')
.services.dataset.getSchemaWithLocale(locationName, pluginName, locale);

/**
* @return {
* jsonSchema,
* jsonUI,
* locationName,
* pluginName,
* schemaData,
* uiData,
* compileJsonSchema,
* compileJsonUI
* }
* */

Add schema translation

Add schema data for a particular language

const locale = 'en';

await leemons.getPlugin('dataset').services.dataset.addSchemaLocale({
locationName,
pluginName,
schemaData,
uiData,
locale,
});

/**
* @return {locationName, pluginName, schemaData, uiData, locale}
* */

Update schema translation

Same as .addSchemaLocale . Throw an error if no translation is found.

const locale = 'en';

await leemons.getPlugin('dataset').services.dataset.updateSchemaLocale({
locationName,
pluginName,
schemaData,
uiData,
locale,
});

/**
* @return {locationName, pluginName, schemaData, uiData, locale}
* */

Delete schema translation

Delete a translation for a schema

const locale = 'en';

await leemons
.getPlugin('dataset')
.services.dataset.deleteSchemaLocale({ locationName, pluginName, locale });

/**
* @return boolean
* */

Schema translation exists

Check if the schema translation exists.

const locale = 'en';

await leemons
.getPlugin('dataset')
.services.dataset.existSchemaLocale(locationName, pluginName, locale);

/**
* @return boolean
* */

Retrieve schema translations

Return translations of the schema if it exists in the requested language.

const locale = 'en';

await leemons
.getPlugin('dataset')
.services.dataset.getSchemaLocale(locationName, pluginName, locale);

/**
* @return {locationName, pluginName, schemaData, uiData, locale}
* */

Utilities

Transform final schema into schema and translation

This function must receive a schema from react-jsonschema-form and returns two objects; one of the objects needs to be compiled with squirrelly.js and the other object is to store texts as translations.

await leemons.getPlugin('dataset').services.dataset.transformJsonSchema(jsonSchema);

/**
* @return {
values, // Values to be stored as translation
json, // Schema in [squirrelly.js] format
}
* */

Transform final schema ui into ui and translation

This function must receive a ui schema from react-jsonschema-form and returns two objects; one of the ui needs to be compiled with squirrelly.js and the other is to store texts as translations.

await leemons.getPlugin('dataset').services.dataset.transformUiSchema(jsonSchema);

/**
* @return {
values, // Values to be stored as translation
json, // Schema in [squirrelly.js] format
}
* */

Values

Add values

Stores the values of a dataset form, validating them to schema conditions.

Optionally these values can be linked to whatever you want.

For example, we are going to store extra data for a user and we want to link that data to that user to retrieve it later. For that, we use the optional target parameter where we specify (in this case) the user id.

const target = 'user-id';
const formData = {
firstName: 'Chuck',
lastName: 'Norris',
telephone: '1234567890',
};

await leemons.getPlugin('dataset').services.dataset.addValues(
locationName,
pluginName,
formData,
{ target } // Optional
);

/**
* @return formData
* */

Update values

Same as .addValues. Throw an error if no values are found.

const target = 'user-id';
const formData = {
firstName: 'Chuck',
lastName: 'Norris',
telephone: '0000',
};

await leemons.getPlugin('dataset').services.dataset.updateValues(
locationName,
pluginName,
formData,
{ target } // Optional
);

/**
* @return formData
* */

Delete values

Deletes all values if they match the criteria.

const target = 'user-id';

await leemons.getPlugin('dataset').services.dataset.deleteValues(
locationName,
pluginName,
{ target } // Optional
);

/**
* @return boolean
* */

Values exist

Check if values exist.

const target = 'user-id';

await leemons.getPlugin('dataset').services.dataset.existValues(
locationName,
pluginName,
{ target } // Optional
);

/**
* @return boolean
* */

Retrieve values

When retrieving stored values you can decide whether to retrieve only some of the keys or all of them.

const keys = ['name', 'surname'];

await leemons.getPlugin('dataset').services.dataset.getValues(locationName, pluginName, {
target, // Optional
keys, // Optional
});

/**
* @return {name: 'string', surname: 'string'}
* */