UNPKG

@ngqp/core

Version:

Synchronizing form controls with the URL for Angular

66 lines 7.86 kB
import { Directive, Inject, Input, Optional, Self } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { QueryParamGroupService } from './query-param-group.service'; import { selectValueAccessor } from '../accessors/util'; /** * Binds a {@link QueryParam} to a DOM element. * * This directive accepts the name of a {@link QueryParam} inside its parent {@link QueryParamGroup}. * It binds this parameter to the host element, which is required to have a [ControlValueAccessor] * {@link https://angular.io/api/forms/ControlValueAccessor}. */ export class QueryParamNameDirective { /** @internal */ constructor(groupService, valueAccessors) { this.groupService = groupService; this._name = null; if (!this.groupService) { throw new Error(`No parent configuration found. Did you forget to add [queryParamGroup]?`); } this.valueAccessor = selectValueAccessor(valueAccessors); } /** * The name of the {@link QueryParam} inside its parent {@link QueryParamGroup}. * Note that this does not refer to the [parameter name]{@link QueryParam#urlParam}. */ set name(name) { this._name = name; } get name() { if (!this._name) { throw new Error(`No queryParamName has been specified.`); } return this._name; } /** @ignore */ ngOnChanges(changes) { const nameChange = changes['name']; if (nameChange) { if (!nameChange.firstChange) { this.groupService.deregisterQueryParamDirective(nameChange.previousValue); } if (nameChange.currentValue) { this.groupService.registerQueryParamDirective(this); } } } /** @ignore */ ngOnDestroy() { if (this.groupService) { this.groupService.deregisterQueryParamDirective(this.name); } } } QueryParamNameDirective.decorators = [ { type: Directive, args: [{ selector: '[queryParamName]', },] } ]; QueryParamNameDirective.ctorParameters = () => [ { type: QueryParamGroupService, decorators: [{ type: Optional }] }, { type: Array, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NG_VALUE_ACCESSOR,] }] } ]; QueryParamNameDirective.propDecorators = { name: [{ type: Input, args: ['queryParamName',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW0tbmFtZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdxcC9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3F1ZXJ5LXBhcmFtLW5hbWUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBd0IsUUFBUSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhEOzs7Ozs7R0FNRztBQUlILE1BQU0sT0FBTyx1QkFBdUI7SUF3QmhDLGdCQUFnQjtJQUNoQixZQUN3QixZQUFvQyxFQUNULGNBQXNDO1FBRGpFLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUpwRCxVQUFLLEdBQWtCLElBQUksQ0FBQztRQU9oQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7U0FDOUY7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFoQ0Q7OztPQUdHO0lBQ0gsSUFDVyxJQUFJLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQW1CRCxjQUFjO0lBQ1AsV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLFVBQVUsRUFBRTtZQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3RTtZQUVELElBQUksVUFBVSxDQUFDLFlBQVksRUFBRTtnQkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2RDtTQUNKO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDUCxXQUFXO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQzs7O1lBMURKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2FBQy9COzs7WUFiUSxzQkFBc0IsdUJBd0N0QixRQUFRO3dDQUNSLFFBQVEsWUFBSSxJQUFJLFlBQUksTUFBTSxTQUFDLGlCQUFpQjs7O21CQXJCaEQsS0FBSyxTQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBTZWxmLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtR3JvdXBTZXJ2aWNlIH0gZnJvbSAnLi9xdWVyeS1wYXJhbS1ncm91cC5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1BY2Nlc3NvciB9IGZyb20gJy4vcXVlcnktcGFyYW0tYWNjZXNzb3IuaW50ZXJmYWNlJztcbmltcG9ydCB7IHNlbGVjdFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi9hY2Nlc3NvcnMvdXRpbCc7XG5cbi8qKlxuICogQmluZHMgYSB7QGxpbmsgUXVlcnlQYXJhbX0gdG8gYSBET00gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBhY2NlcHRzIHRoZSBuYW1lIG9mIGEge0BsaW5rIFF1ZXJ5UGFyYW19IGluc2lkZSBpdHMgcGFyZW50IHtAbGluayBRdWVyeVBhcmFtR3JvdXB9LlxuICogSXQgYmluZHMgdGhpcyBwYXJhbWV0ZXIgdG8gdGhlIGhvc3QgZWxlbWVudCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIFtDb250cm9sVmFsdWVBY2Nlc3Nvcl1cbiAqIHtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0NvbnRyb2xWYWx1ZUFjY2Vzc29yfS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbcXVlcnlQYXJhbU5hbWVdJyxcbn0pXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJhbU5hbWVEaXJlY3RpdmUgaW1wbGVtZW50cyBRdWVyeVBhcmFtQWNjZXNzb3IsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgUXVlcnlQYXJhbX0gaW5zaWRlIGl0cyBwYXJlbnQge0BsaW5rIFF1ZXJ5UGFyYW1Hcm91cH0uXG4gICAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVmZXIgdG8gdGhlIFtwYXJhbWV0ZXIgbmFtZV17QGxpbmsgUXVlcnlQYXJhbSN1cmxQYXJhbX0uXG4gICAgICovXG4gICAgQElucHV0KCdxdWVyeVBhcmFtTmFtZScpXG4gICAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLl9uYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHF1ZXJ5UGFyYW1OYW1lIGhhcyBiZWVuIHNwZWNpZmllZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgdmFsdWVBY2Nlc3NvcjogQ29udHJvbFZhbHVlQWNjZXNzb3I7XG5cbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBncm91cFNlcnZpY2U6IFF1ZXJ5UGFyYW1Hcm91cFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUikgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10sXG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5ncm91cFNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGFyZW50IGNvbmZpZ3VyYXRpb24gZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCBbcXVlcnlQYXJhbUdyb3VwXT9gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvcnMpO1xuICAgIH1cblxuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgbmFtZUNoYW5nZSA9IGNoYW5nZXNbJ25hbWUnXTtcbiAgICAgICAgaWYgKG5hbWVDaGFuZ2UpIHtcbiAgICAgICAgICAgIGlmICghbmFtZUNoYW5nZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBTZXJ2aWNlLmRlcmVnaXN0ZXJRdWVyeVBhcmFtRGlyZWN0aXZlKG5hbWVDaGFuZ2UucHJldmlvdXNWYWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuYW1lQ2hhbmdlLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBTZXJ2aWNlLnJlZ2lzdGVyUXVlcnlQYXJhbURpcmVjdGl2ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5ncm91cFNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBTZXJ2aWNlLmRlcmVnaXN0ZXJRdWVyeVBhcmFtRGlyZWN0aXZlKHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==