@ssv/ngx.command
Version:
Command pattern implementation for angular. Command used to encapsulate information which is needed to perform an action.
46 lines • 9.23 kB
JavaScript
import { PristineChangeEvent, StatusChangeEvent } from "@angular/forms";
import { map, distinctUntilChanged, filter, combineLatest, of, defer, concat } from "rxjs";
import { Command } from "./command";
import { computed } from "@angular/core";
/** Determines whether the arg object is of type `Command`. */
export function isCommand(arg) {
return arg instanceof Command;
}
/** Determines whether the arg object is of type `CommandCreator`. */
export function isCommandCreator(arg) {
if (arg instanceof Command) {
return false;
}
else if (isAssumedType(arg) && arg.execute && arg.host) {
return true;
}
return false;
}
const CAN_EXECUTE_FORM_OPTIONS_DEFAULTS = Object.freeze({
validity: true,
dirty: true,
});
/** Get can execute from form validity/pristine as an observable. */
export function canExecuteFromNgForm(form, options) {
const opts = options ?
{ ...CAN_EXECUTE_FORM_OPTIONS_DEFAULTS, ...options }
: CAN_EXECUTE_FORM_OPTIONS_DEFAULTS;
const pristine$ = opts.dirty
? concat(defer(() => of(form.pristine)), form.events.pipe(filter(x => x instanceof PristineChangeEvent), map(x => x.pristine))).pipe(distinctUntilChanged())
: of(true);
const valid$ = opts.validity
? concat(defer(() => of(form.valid)), form.events.pipe(filter(x => x instanceof StatusChangeEvent), map(x => x.status === "VALID"))).pipe(distinctUntilChanged())
: of(true);
return combineLatest([pristine$, valid$]).pipe(map(([pristine, valid]) => !!(!opts.validity || valid) && !!(!opts.dirty || !pristine)), distinctUntilChanged());
}
/** Can executed based on valid/dirty signal inputs. */
export function canExecuteFromSignals(signals, options) {
const opts = options ?
{ ...CAN_EXECUTE_FORM_OPTIONS_DEFAULTS, ...options }
: CAN_EXECUTE_FORM_OPTIONS_DEFAULTS;
return computed(() => !!(!opts.validity || signals.valid()) && !!(!opts.dirty || signals.dirty()));
}
function isAssumedType(x) {
return x !== null && typeof x === "object";
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9uZ3guY29tbWFuZC9zcmMvY29tbWFuZC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQWMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQWUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVk7SUFDckMsT0FBTyxHQUFHLFlBQVksT0FBTyxDQUFDO0FBQy9CLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVk7SUFDNUMsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFLENBQUM7UUFDNUIsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxhQUFhLENBQWlCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFFLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2QsQ0FBQztBQVVELE1BQU0saUNBQWlDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBd0I7SUFDOUUsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtDQUNYLENBQUMsQ0FBQTtBQUVGLG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsb0JBQW9CLENBQ25DLElBQXFCLEVBQ3JCLE9BQStCO0lBRS9CLE1BQU0sSUFBSSxHQUEwQixPQUFPLENBQUMsQ0FBQztRQUM1QyxFQUFFLEdBQUcsaUNBQWlDLEVBQUUsR0FBRyxPQUFPLEVBQUU7UUFDcEQsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDO0lBRXJDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLO1FBQzNCLENBQUMsQ0FBQyxNQUFNLENBQ1AsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLG1CQUFtQixDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FDcEIsQ0FDRCxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFFO1FBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFWixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUTtRQUMzQixDQUFDLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNmLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxpQkFBaUIsQ0FBQyxFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUM5QixDQUNELENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUU7UUFDL0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVaLE9BQU8sYUFBYSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ3ZGLG9CQUFvQixFQUFFLENBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxxQkFBcUIsQ0FDcEMsT0FBMkQsRUFDM0QsT0FBK0I7SUFFL0IsTUFBTSxJQUFJLEdBQTBCLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLEVBQUUsR0FBRyxpQ0FBaUMsRUFBRSxHQUFHLE9BQU8sRUFBRTtRQUNwRCxDQUFDLENBQUMsaUNBQWlDLENBQUM7SUFDckMsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLENBQUM7QUFHRCxTQUFTLGFBQWEsQ0FBOEIsQ0FBVTtJQUM3RCxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFByaXN0aW5lQ2hhbmdlRXZlbnQsIFN0YXR1c0NoYW5nZUV2ZW50IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGNvbWJpbmVMYXRlc3QsIG9mLCBkZWZlciwgY29uY2F0IH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29tbWFuZENyZWF0b3IsIElDb21tYW5kIH0gZnJvbSBcIi4vY29tbWFuZC5tb2RlbFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuL2NvbW1hbmRcIjtcbmltcG9ydCB7IHR5cGUgU2lnbmFsLCBjb21wdXRlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFyZyBvYmplY3QgaXMgb2YgdHlwZSBgQ29tbWFuZGAuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kKGFyZzogdW5rbm93bik6IGFyZyBpcyBJQ29tbWFuZCB7XG5cdHJldHVybiBhcmcgaW5zdGFuY2VvZiBDb21tYW5kO1xufVxuXG4vKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhcmcgb2JqZWN0IGlzIG9mIHR5cGUgYENvbW1hbmRDcmVhdG9yYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRDcmVhdG9yKGFyZzogdW5rbm93bik6IGFyZyBpcyBDb21tYW5kQ3JlYXRvciB7XG5cdGlmIChhcmcgaW5zdGFuY2VvZiBDb21tYW5kKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGVsc2UgaWYgKGlzQXNzdW1lZFR5cGU8Q29tbWFuZENyZWF0b3I+KGFyZykgJiYgYXJnLmV4ZWN1dGUgJiYgYXJnLmhvc3QpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuRXhlY3V0ZUZvcm1PcHRpb25zIHtcblx0LyoqIERldGVybWluZXMgd2hldGhlciB0byBjaGVjayBmb3IgdmFsaWRpdHkuIChkZWZhdWx0czogdHJ1ZSkgKi9cblx0dmFsaWRpdHk/OiBib29sZWFuO1xuXG5cdC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY2hlY2sgd2hldGhlciBVSSBoYXMgYmVlbiB0b3VjaGVkLiAoZGVmYXVsdHM6IHRydWUpICovXG5cdGRpcnR5PzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ0FOX0VYRUNVVEVfRk9STV9PUFRJT05TX0RFRkFVTFRTID0gT2JqZWN0LmZyZWV6ZTxDYW5FeGVjdXRlRm9ybU9wdGlvbnM+KHtcblx0dmFsaWRpdHk6IHRydWUsXG5cdGRpcnR5OiB0cnVlLFxufSlcblxuLyoqIEdldCBjYW4gZXhlY3V0ZSBmcm9tIGZvcm0gdmFsaWRpdHkvcHJpc3RpbmUgYXMgYW4gb2JzZXJ2YWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5FeGVjdXRlRnJvbU5nRm9ybShcblx0Zm9ybTogQWJzdHJhY3RDb250cm9sLFxuXHRvcHRpb25zPzogQ2FuRXhlY3V0ZUZvcm1PcHRpb25zXG4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcblx0Y29uc3Qgb3B0czogQ2FuRXhlY3V0ZUZvcm1PcHRpb25zID0gb3B0aW9ucyA/XG5cdFx0eyAuLi5DQU5fRVhFQ1VURV9GT1JNX09QVElPTlNfREVGQVVMVFMsIC4uLm9wdGlvbnMgfVxuXHRcdDogQ0FOX0VYRUNVVEVfRk9STV9PUFRJT05TX0RFRkFVTFRTO1xuXG5cdGNvbnN0IHByaXN0aW5lJCA9IG9wdHMuZGlydHlcblx0XHQ/IGNvbmNhdChcblx0XHRcdGRlZmVyKCgpID0+IG9mKGZvcm0ucHJpc3RpbmUpKSxcblx0XHRcdGZvcm0uZXZlbnRzLnBpcGUoXG5cdFx0XHRcdGZpbHRlcih4ID0+IHggaW5zdGFuY2VvZiBQcmlzdGluZUNoYW5nZUV2ZW50KSxcblx0XHRcdFx0bWFwKHggPT4geC5wcmlzdGluZSksXG5cdFx0XHQpXG5cdFx0KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksKVxuXHRcdDogb2YodHJ1ZSk7XG5cblx0Y29uc3QgdmFsaWQkID0gb3B0cy52YWxpZGl0eVxuXHRcdD8gY29uY2F0KFxuXHRcdFx0ZGVmZXIoKCkgPT4gb2YoZm9ybS52YWxpZCkpLFxuXHRcdFx0Zm9ybS5ldmVudHMucGlwZShcblx0XHRcdFx0ZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIFN0YXR1c0NoYW5nZUV2ZW50KSxcblx0XHRcdFx0bWFwKHggPT4geC5zdGF0dXMgPT09IFwiVkFMSURcIiksXG5cdFx0XHQpXG5cdFx0KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksKVxuXHRcdDogb2YodHJ1ZSk7XG5cblx0cmV0dXJuIGNvbWJpbmVMYXRlc3QoW3ByaXN0aW5lJCwgdmFsaWQkXSkucGlwZShcblx0XHRtYXAoKFtwcmlzdGluZSwgdmFsaWRdKSA9PiAhISghb3B0cy52YWxpZGl0eSB8fCB2YWxpZCkgJiYgISEoIW9wdHMuZGlydHkgfHwgIXByaXN0aW5lKSksXG5cdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcblx0KTtcbn1cblxuLyoqIENhbiBleGVjdXRlZCBiYXNlZCBvbiB2YWxpZC9kaXJ0eSBzaWduYWwgaW5wdXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkV4ZWN1dGVGcm9tU2lnbmFscyhcblx0c2lnbmFsczogeyB2YWxpZDogU2lnbmFsPGJvb2xlYW4+LCBkaXJ0eTogU2lnbmFsPGJvb2xlYW4+IH0sXG5cdG9wdGlvbnM/OiBDYW5FeGVjdXRlRm9ybU9wdGlvbnNcbik6IFNpZ25hbDxib29sZWFuPiB7XG5cdGNvbnN0IG9wdHM6IENhbkV4ZWN1dGVGb3JtT3B0aW9ucyA9IG9wdGlvbnMgP1xuXHRcdHsgLi4uQ0FOX0VYRUNVVEVfRk9STV9PUFRJT05TX0RFRkFVTFRTLCAuLi5vcHRpb25zIH1cblx0XHQ6IENBTl9FWEVDVVRFX0ZPUk1fT1BUSU9OU19ERUZBVUxUUztcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+ICEhKCFvcHRzLnZhbGlkaXR5IHx8IHNpZ25hbHMudmFsaWQoKSkgJiYgISEoIW9wdHMuZGlydHkgfHwgc2lnbmFscy5kaXJ0eSgpKSk7XG59XG5cblxuZnVuY3Rpb24gaXNBc3N1bWVkVHlwZTxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHg6IHVua25vd24pOiB4IGlzIFBhcnRpYWw8VD4ge1xuXHRyZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIjtcbn1cbiJdfQ==