Home Reference Source Repository

js/Models/ResourceList.js

import BaseModel from './BaseModel';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';
import ResourceCollection from 'js/Collections/ResourceCollection';

/**
 * ResourceList.
 */
export default class ResourceList extends BaseModel
{
///////////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Initialize.
     *
     * @param {object} options Backbone.Model options object
     */
    initialize(options)
    {
        this._updateResourceTypeFull();
        this.on('change:resource_type', () => this._updateResourceTypeFull());

        // If the creator is null (i.e. was not uploaded by a person), inject a dummy.
        if (this.get('creator') === null)
        {
            this.set('creator', 'generated result');
        }
    }

    /**
     * Override of Backbone.Model.parse. If the 'creator' is null it gets set to 'generated result'.
     *
     * @param {object} response JSON response from server
     * @return {object} response object
     */
    parse(response)
    {
        if (response.creator === null)
        {
            response.creator = 'generated result';
        }
        return response;
    }

    /**
     * Returns defaults.
     *
     * @return {object} object holding default values
     */
    defaults()
    {
        return {
            creator: {first_name: null, last_name: null, username: null},
            created: null,
            updated: null
        };
    }

    /**
     * Returns UUID of associated ResourceType.
     *
     * @return {string} UUID of associated ResourceType; null if DNE
     */
    getResourceTypeUuid()
    {
        if (this.get('resource_type'))
        {
            var lastSlash = this.get('resource_type').lastIndexOf('/');
            var subString = this.get('resource_type').substring(0, lastSlash);
            var secondLastSlash = subString.lastIndexOf('/');
            return this.get('resource_type').substring(secondLastSlash + 1, lastSlash);
        }
        return null;
    }

///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Updates full description of resource type.
     */
    _updateResourceTypeFull()
    {
        var resourceTypeId = this.getResourceTypeUuid();
        var jsonString = {};
        if (resourceTypeId !== null)
        {
            var resourceTypeCollection = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_RESOURCETYPE_COLLECTION);
            jsonString = resourceTypeCollection.get(resourceTypeId).toJSON();
        }
        this.set('resource_type_full', jsonString); 
    }
}
ResourceList.prototype.routeName = 'resourcelists';