API Docs for: 0.25.0
Show:

File: addon/components/eosf-project-nav/component.js

import Ember from 'ember';
import DS from 'ember-data';

import layout from './template';

import permissions from '../../const/permissions';

/**
 * @module ember-osf
 * @submodule components
 */

/**
 * Project header navigation bar, with links to various sub-pages within a project
 * Sample usage:
 * ```handlebars
 * {{eosf-project-nav
 *   node=node
 *   user=user}}
 * ```
 * @class eosf-project-nav
 */
export default Ember.Component.extend({
    layout,
    i18n: Ember.inject.service(),
    node: null,
    user: null,

    projectLabel: Ember.computed('node.category', function() {
        let category = this.get('node.category');
        return category === 'project' ? 'Project' : 'Component';
    }),

    isProjectContributor: Ember.computed('user', 'node', function() {
        // Is the user a contributor on this node? (returns false if the user is not logged in)
        let node = this.get('node');
        let userID = this.get('user.id');

        return DS.PromiseObject.create({
            promise: node.isContributor(userID)
        });
    }),

    /**
     * If this is a withdrawn registration, hide a block of buttons.
     * @property isWithdrawnRegistration
     */
    isWithdrawnRegistration: Ember.computed.and('node.isRegistration', 'node.withdrawn'),

    parentExists: Ember.computed('node', function() {
        // Determine if a parent exists (field not empty), without trying to fetch it.
        // This provides a way to use conditionals without errors that hang the page
        let node = this.get('node');
        return !!node.belongsTo('parent').link();
    }),
    showParentProjectLink: Ember.computed('node.parent', function() {
        // TODO: Rewrite this to rely on embeds, which are more efficient
        // If the parent node is not visible to the contributor, it will be identified in the API response, but not accessible.
        // Only show the parent link if the relationship resolves to a successful response.
        let parent = this.get('node.parent');
        if (parent) {
            // Report whether the parent relationship request failed.
            let response = parent.then(()=> true).catch(()=> false);
            return DS.PromiseObject.create({
                promise: response
            });
        }
        // If no parent, don't show parent link.
        return false;
    }),
    showAnalyticsTab: Ember.computed.or('node.public', 'isProjectContributor'),
    showRegistrationsTab: Ember.computed('node.isRegistration', 'node.isAnonymous', function() {
        // Do not show registrations tab for view-only links
        return !this.get('node.isRegistration') && !this.get('node.isAnonymous');
    }),
    showForksTab: Ember.computed.not('node.isAnonymous'),
    showContributorsTab: Ember.computed.alias('isProjectContributor'),
    showSettingsTab: Ember.computed('node', function() {
        let node = this.get('node');
        if (node.get('isProject')) {
            return node.get('currentUserPermissions').indexOf(permissions.WRITE) !== -1;
        } else if (node.get('isRegistration')) {
            return node.get('currentUserPermissions').indexOf(permissions.ADMIN) !== -1;
        }
        return false;  // No idea what this resource is, so don't show tab
    }),

    showCommentsButton: Ember.computed('node', function() {
        // TODO: Implement. Depends on resolution of https://openscience.atlassian.net/browse/OSF-6701
        // <!--% if user['can_comment'] or node['has_comments']:-->
        return false;
    })
});