TryGhost/Ghost

View on GitHub
ghost/admin/app/components/collections/collection-form.js

Summary

Maintainability
A
25 mins
Test Coverage
import Component from '@glimmer/component';
import {action} from '@ember/object';
import {inject} from 'ghost-admin/decorators/inject';
import {inject as service} from '@ember/service';
import {slugify} from '@tryghost/string';

const TYPES = [{
    name: 'Manual',
    value: 'manual'
}, {
    name: 'Automatic',
    value: 'automatic'
}];

export default class CollectionForm extends Component {
    @service feature;
    @service settings;

    @inject config;

    availableTypes = TYPES;

    get selectedType() {
        const {collection} = this.args;
        return this.availableTypes.findBy('value', collection.type) || {value: '!unknown'};
    }

    @action
    setCollectionProperty(property, newValue) {
        const {collection} = this.args;

        if (newValue) {
            newValue = newValue.trim();
        }

        // Generate slug based on name for new collection when empty
        if (property === 'title' && collection.isNew && !this.hasChangedSlug) {
            let slugValue = slugify(newValue);
            if (/^#/.test(newValue)) {
                slugValue = 'hash-' + slugValue;
            }
            collection.slug = slugValue;
        }

        // ensure manual changes of slug don't get reset when changing name
        if (property === 'slug') {
            this.hasChangedSlug = !!newValue;
        }

        collection[property] = newValue;

        // clear validation message when typing
        collection.hasValidated.addObject(property);
    }

    @action
    changeType(type) {
        this.setCollectionProperty('type', type.value);
    }

    @action
    validateCollectionProperty(property) {
        return this.args.collection.validate({property});
    }
}