ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
70 lines • 8.77 kB
JavaScript
import { parseContent } from './parsers';
import defaultSchema from './schema';
const isEmptyInputValue = (value) => {
// we don't check for string here so it also works with arrays
return value === null || value.length === 0;
};
const hasValidLength = (value) => {
// non-strict comparison is intentional, to check for both `null` and `undefined` values
return value != null && typeof value.length === 'number';
};
const isDocEmpty = (doc) => {
if (!doc) {
return true;
}
const { childCount, firstChild } = doc;
return Boolean(childCount === 1 && firstChild?.isTextblock && firstChild.content.size === 0);
};
// @dynamic
export class Validators {
static required(userSchema) {
return (control) => {
const schema = userSchema || defaultSchema;
const doc = parseContent(control.value, schema);
const isEmpty = isDocEmpty(doc);
if (!isEmpty) {
return null;
}
return {
required: true
};
};
}
static maxLength(maxLength, userSchema) {
return (control) => {
const schema = userSchema || defaultSchema;
const doc = parseContent(control.value, schema);
const value = doc.textContent;
if (hasValidLength(value) && value.length > maxLength) {
return {
maxlength: {
requiredLength: maxLength,
actualLength: value.length
}
};
}
return null;
};
}
static minLength(minLength, userSchema) {
return (control) => {
const schema = userSchema || defaultSchema;
const doc = parseContent(control.value, schema);
const value = doc.textContent;
if (isEmptyInputValue(value) || !hasValidLength(value)) {
// don't validate empty values to allow optional controls
// don't validate values without `length` property
return null;
}
if (value.length < minLength) {
return {
minlength: {
requiredLength: minLength, actualLength: value.length
}
};
}
return null;
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lZGl0b3Ivc3JjL2xpYi92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxhQUFhLE1BQU0sVUFBVSxDQUFDO0FBSXJDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFVLEVBQVcsRUFBRTtJQUNoRCw4REFBOEQ7SUFDOUQsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBVSxFQUFXLEVBQUU7SUFDN0Msd0ZBQXdGO0lBQ3hGLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDO0FBQzNELENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBMkIsRUFBVyxFQUFFO0lBQzFELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDdkMsT0FBTyxPQUFPLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxVQUFVLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9GLENBQUMsQ0FBQztBQUVGLFdBQVc7QUFDWCxNQUFNLE9BQU8sVUFBVTtJQUVyQixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQW1CO1FBQ2pDLE9BQU8sQ0FBQyxPQUF3QixFQUEyQixFQUFFO1lBRTNELE1BQU0sTUFBTSxHQUFHLFVBQVUsSUFBSSxhQUFhLENBQUM7WUFDM0MsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFaEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUNyRCxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFVLElBQUksYUFBYSxDQUFDO1lBQzNDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWhELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFFOUIsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7Z0JBQ3JELE9BQU87b0JBQ0wsU0FBUyxFQUFFO3dCQUNULGNBQWMsRUFBRSxTQUFTO3dCQUN6QixZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU07cUJBQzNCO2lCQUNGLENBQUM7YUFDSDtZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBaUIsRUFBRSxVQUFtQjtRQUNyRCxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUUzRCxNQUFNLE1BQU0sR0FBRyxVQUFVLElBQUksYUFBYSxDQUFDO1lBQzNDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWhELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFFOUIsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEQseURBQXlEO2dCQUN6RCxrREFBa0Q7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxFQUFFO2dCQUM1QixPQUFPO29CQUNMLFNBQVMsRUFBRTt3QkFDVCxjQUFjLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTTtxQkFDdEQ7aUJBQ0YsQ0FBQzthQUNIO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2NoZW1hLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuaW1wb3J0IHsgcGFyc2VDb250ZW50IH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCBkZWZhdWx0U2NoZW1hIGZyb20gJy4vc2NoZW1hJztcblxudHlwZSBWYWxpZGF0aW9uRXJyb3JzID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuY29uc3QgaXNFbXB0eUlucHV0VmFsdWUgPSAodmFsdWU6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAvLyB3ZSBkb24ndCBjaGVjayBmb3Igc3RyaW5nIGhlcmUgc28gaXQgYWxzbyB3b3JrcyB3aXRoIGFycmF5c1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUubGVuZ3RoID09PSAwO1xufTtcblxuY29uc3QgaGFzVmFsaWRMZW5ndGggPSAodmFsdWU6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAvLyBub24tc3RyaWN0IGNvbXBhcmlzb24gaXMgaW50ZW50aW9uYWwsIHRvIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzXG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xufTtcblxuY29uc3QgaXNEb2NFbXB0eSA9IChkb2M6IFByb3NlTWlycm9yTm9kZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgaWYgKCFkb2MpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHsgY2hpbGRDb3VudCwgZmlyc3RDaGlsZCB9ID0gZG9jO1xuICByZXR1cm4gQm9vbGVhbihjaGlsZENvdW50ID09PSAxICYmIGZpcnN0Q2hpbGQ/LmlzVGV4dGJsb2NrICYmIGZpcnN0Q2hpbGQuY29udGVudC5zaXplID09PSAwKTtcbn07XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9ycyB7XG5cbiAgc3RhdGljIHJlcXVpcmVkKHVzZXJTY2hlbWE/OiBTY2hlbWEpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHVzZXJTY2hlbWEgfHwgZGVmYXVsdFNjaGVtYTtcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlQ29udGVudChjb250cm9sLnZhbHVlLCBzY2hlbWEpO1xuXG4gICAgICBjb25zdCBpc0VtcHR5ID0gaXNEb2NFbXB0eShkb2MpO1xuXG4gICAgICBpZiAoIWlzRW1wdHkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgbWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyLCB1c2VyU2NoZW1hPzogU2NoZW1hKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gdXNlclNjaGVtYSB8fCBkZWZhdWx0U2NoZW1hO1xuICAgICAgY29uc3QgZG9jID0gcGFyc2VDb250ZW50KGNvbnRyb2wudmFsdWUsIHNjaGVtYSk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZG9jLnRleHRDb250ZW50O1xuXG4gICAgICBpZiAoaGFzVmFsaWRMZW5ndGgodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1heGxlbmd0aDoge1xuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGg6IG1heExlbmd0aCxcbiAgICAgICAgICAgIGFjdHVhbExlbmd0aDogdmFsdWUubGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG1pbkxlbmd0aChtaW5MZW5ndGg6IG51bWJlciwgdXNlclNjaGVtYT86IFNjaGVtYSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcblxuICAgICAgY29uc3Qgc2NoZW1hID0gdXNlclNjaGVtYSB8fCBkZWZhdWx0U2NoZW1hO1xuICAgICAgY29uc3QgZG9jID0gcGFyc2VDb250ZW50KGNvbnRyb2wudmFsdWUsIHNjaGVtYSk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZG9jLnRleHRDb250ZW50O1xuXG4gICAgICBpZiAoaXNFbXB0eUlucHV0VmFsdWUodmFsdWUpIHx8ICFoYXNWYWxpZExlbmd0aCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzXG4gICAgICAgIC8vIGRvbid0IHZhbGlkYXRlIHZhbHVlcyB3aXRob3V0IGBsZW5ndGhgIHByb3BlcnR5XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWlubGVuZ3RoOiB7XG4gICAgICAgICAgICByZXF1aXJlZExlbmd0aDogbWluTGVuZ3RoLCBhY3R1YWxMZW5ndGg6IHZhbHVlLmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxufVxuIl19