@qoollo/ngx-form-url-saver
Version:
Angular directive for syncing form's data with URL query
109 lines • 15.6 kB
JavaScript
import { DateTime } from 'luxon';
import { isDate } from '../utils/is-date';
export class SeparatedComplexQueryGenerationStrategy {
constructor(useDateTime) {
this.useDateTime = useDateTime;
this.COMPLEX_OBJECT_PREFIX = 'complex-';
}
inferFormValueFromQuery(queryParams, formValue) {
const simpleQuery = this.readAllSimpleQuery(queryParams, formValue);
const complexQuery = this.readAllComplexQuery(queryParams);
return { ...simpleQuery, ...complexQuery };
}
convertFormValueToQueryObject(formValue) {
const queryObject = {};
for (const key of Object.keys(formValue)) {
if (this.isObject(formValue[key]) && !DateTime.isDateTime(formValue[key])) {
queryObject[this.createComplexKey(key)] = JSON.stringify(formValue[key]);
}
else {
queryObject[key] = this.prepareValue(formValue[key]);
}
}
return queryObject;
}
createClearingObject(formValue) {
const filtersObject = {};
for (const key of Object.keys(formValue)) {
if (this.isObject(formValue[key])) {
filtersObject[this.createComplexKey(key)] = null;
}
else {
filtersObject[key] = null;
}
}
return filtersObject;
}
prepareValue(value) {
if (isDate(value) || DateTime.isDateTime(value)) {
return value.toJSON();
}
return value;
}
readAllSimpleQuery(queryParams, form) {
const simpleQueryObject = {};
for (const key of Object.keys(form)) {
const value = this.getNewValueByQueryKey(queryParams, key, form);
if (this.useDateTime && typeof value === 'string') {
const dateTimeValue = DateTime.fromISO(value);
simpleQueryObject[key] = dateTimeValue.isValid ? dateTimeValue : value;
}
else {
simpleQueryObject[key] = value;
}
}
return simpleQueryObject;
}
getNewValueByQueryKey(queryParams, key, form) {
const queryParamValue = ['true', 'false'].includes(queryParams[key])
? JSON.parse(queryParams[key])
: queryParams[key];
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const currentValue = form[key];
if (queryParamValue === undefined || queryParamValue === null) {
return currentValue;
}
const queryValueMustBeConvertedToArray = Array.isArray(currentValue) && !Array.isArray(queryParamValue);
return queryValueMustBeConvertedToArray
? [queryParamValue]
: queryParamValue;
}
readAllComplexQuery(queryParams) {
const complexQueryKeys = Object.keys(queryParams)
.filter(paramName => this.checkIfKeyIsComplex(paramName));
if (!complexQueryKeys.length) {
return {};
}
const newFormValue = {};
for (const complexKey of complexQueryKeys) {
const originKey = this.getOriginKey(complexKey);
try {
newFormValue[originKey] = JSON.parse(queryParams[complexKey]);
}
catch (error) { }
}
return newFormValue;
}
// #region Working with complex keys for nested objects
createComplexKey(objectKey) {
return this.COMPLEX_OBJECT_PREFIX + objectKey;
}
getOriginKey(complexKey) {
return complexKey.replace(this.COMPLEX_OBJECT_PREFIX, '');
}
checkIfKeyIsComplex(key) {
return key.includes(this.COMPLEX_OBJECT_PREFIX);
}
// #endregion
/**
* Checks whether the passed value is an object.
* Returns `false` for `date` or `array`.
*
* `Object.prototype.toString.call(new Date()) = [object Date]`
* `Object.prototype.toString.call(new Array()) = [object Array]`
*/
isObject(value) {
return Object.prototype.toString.call(value) === '[object Object]';
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwYXJhdGVkLWNvbXBsZXgtcXVlcnktZ2VuZXJhdGlvbi1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tdXJsLXNhdmVyLWxpYi9zcmMvbGliL3F1ZXJ5LWdlbmVyYXRpb24tc3RyYXRlZ2llcy9zZXBhcmF0ZWQtY29tcGxleC1xdWVyeS1nZW5lcmF0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFDLE1BQU0sT0FBTyx1Q0FBdUM7SUFJaEQsWUFDcUIsV0FBb0I7UUFBcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFIeEIsMEJBQXFCLEdBQUcsVUFBVSxDQUFDO0lBSWpELENBQUM7SUFFRyx1QkFBdUIsQ0FBQyxXQUFtQixFQUFFLFNBQWtDO1FBQ2xGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFcEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTNELE9BQU8sRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFHTSw2QkFBNkIsQ0FBQyxTQUFrQztRQUNuRSxNQUFNLFdBQVcsR0FBNEIsRUFBRSxDQUFDO1FBRWhELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FB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QyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsYUFBYTtJQUViOzs7Ozs7T0FNRztJQUNLLFFBQVEsQ0FBQyxLQUFjO1FBQzNCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGlCQUFpQixDQUFDO0lBQ3ZFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBRdWVyeUdlbmVyYXRpb25TdHJhdGVneSB9IGZyb20gJy4vcXVlcnktZ2VuZXJhdGlvbi1zdHJhdGVneS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICcuLi91dGlscy9pcy1kYXRlJztcblxuZXhwb3J0IGNsYXNzIFNlcGFyYXRlZENvbXBsZXhRdWVyeUdlbmVyYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFF1ZXJ5R2VuZXJhdGlvblN0cmF0ZWd5IHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgQ09NUExFWF9PQkpFQ1RfUFJFRklYID0gJ2NvbXBsZXgtJztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1c2VEYXRlVGltZTogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgaW5mZXJGb3JtVmFsdWVGcm9tUXVlcnkocXVlcnlQYXJhbXM6IFBhcmFtcywgZm9ybVZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHNpbXBsZVF1ZXJ5ID0gdGhpcy5yZWFkQWxsU2ltcGxlUXVlcnkocXVlcnlQYXJhbXMsIGZvcm1WYWx1ZSk7XG5cbiAgICAgICAgY29uc3QgY29tcGxleFF1ZXJ5ID0gdGhpcy5yZWFkQWxsQ29tcGxleFF1ZXJ5KHF1ZXJ5UGFyYW1zKTtcblxuICAgICAgICByZXR1cm4geyAuLi5zaW1wbGVRdWVyeSwgLi4uY29tcGxleFF1ZXJ5IH07XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgY29udmVydEZvcm1WYWx1ZVRvUXVlcnlPYmplY3QoZm9ybVZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZvcm1WYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KGZvcm1WYWx1ZVtrZXldKSAmJiAhRGF0ZVRpbWUuaXNEYXRlVGltZShmb3JtVmFsdWVba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeU9iamVjdFt0aGlzLmNyZWF0ZUNvbXBsZXhLZXkoa2V5KV0gPSBKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXJ5T2JqZWN0W2tleV0gPSB0aGlzLnByZXBhcmVWYWx1ZShmb3JtVmFsdWVba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnlPYmplY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNsZWFyaW5nT2JqZWN0KGZvcm1WYWx1ZTogUmVjb3JkPHN0cmluZywgdW5kZWZpbmVkPik6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIG51bGw+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZm9ybVZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNPYmplY3QoZm9ybVZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyc09iamVjdFt0aGlzLmNyZWF0ZUNvbXBsZXhLZXkoa2V5KV0gPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzT2JqZWN0W2tleV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnNPYmplY3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICAgICAgaWYgKGlzRGF0ZSh2YWx1ZSkgfHwgRGF0ZVRpbWUuaXNEYXRlVGltZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRBbGxTaW1wbGVRdWVyeShxdWVyeVBhcmFtczogUGFyYW1zLCBmb3JtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICBjb25zdCBzaW1wbGVRdWVyeU9iamVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmb3JtKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWU6IHVua25vd24gPSB0aGlzLmdldE5ld1ZhbHVlQnlRdWVyeUtleShxdWVyeVBhcmFtcywga2V5LCBmb3JtKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZURhdGVUaW1lICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlVGltZVZhbHVlID0gRGF0ZVRpbWUuZnJvbUlTTyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgc2ltcGxlUXVlcnlPYmplY3Rba2V5XSA9IGRhdGVUaW1lVmFsdWUuaXNWYWxpZCA/IGRhdGVUaW1lVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2ltcGxlUXVlcnlPYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpbXBsZVF1ZXJ5T2JqZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROZXdWYWx1ZUJ5UXVlcnlLZXkocXVlcnlQYXJhbXM6IFBhcmFtcywga2V5OiBzdHJpbmcsIGZvcm06IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1WYWx1ZTogdW5rbm93biA9IFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHF1ZXJ5UGFyYW1zW2tleV0pXG4gICAgICAgICAgICA/IEpTT04ucGFyc2UocXVlcnlQYXJhbXNba2V5XSlcbiAgICAgICAgICAgIDogcXVlcnlQYXJhbXNba2V5XTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZTogdW5rbm93biA9IGZvcm1ba2V5XTtcblxuICAgICAgICBpZiAocXVlcnlQYXJhbVZhbHVlID09PSB1bmRlZmluZWQgfHwgcXVlcnlQYXJhbVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnlWYWx1ZU11c3RCZUNvbnZlcnRlZFRvQXJyYXkgPSBBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgJiYgIUFycmF5LmlzQXJyYXkocXVlcnlQYXJhbVZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcXVlcnlWYWx1ZU11c3RCZUNvbnZlcnRlZFRvQXJyYXlcbiAgICAgICAgICAgID8gW3F1ZXJ5UGFyYW1WYWx1ZV1cbiAgICAgICAgICAgIDogcXVlcnlQYXJhbVZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZEFsbENvbXBsZXhRdWVyeShxdWVyeVBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGNvbXBsZXhRdWVyeUtleXMgPSBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcylcbiAgICAgICAgICAgIC5maWx0ZXIocGFyYW1OYW1lID0+IHRoaXMuY2hlY2tJZktleUlzQ29tcGxleChwYXJhbU5hbWUpKTtcblxuICAgICAgICBpZiAoIWNvbXBsZXhRdWVyeUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdGb3JtVmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21wbGV4S2V5IG9mIGNvbXBsZXhRdWVyeUtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbktleSA9IHRoaXMuZ2V0T3JpZ2luS2V5KGNvbXBsZXhLZXkpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG5ld0Zvcm1WYWx1ZVtvcmlnaW5LZXldID0gSlNPTi5wYXJzZShxdWVyeVBhcmFtc1tjb21wbGV4S2V5XSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdGb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gI3JlZ2lvbiBXb3JraW5nIHdpdGggY29tcGxleCBrZXlzIGZvciBuZXN0ZWQgb2JqZWN0c1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb21wbGV4S2V5KG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkNPTVBMRVhfT0JKRUNUX1BSRUZJWCArIG9iamVjdEtleTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9yaWdpbktleShjb21wbGV4S2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXhLZXkucmVwbGFjZSh0aGlzLkNPTVBMRVhfT0JKRUNUX1BSRUZJWCwgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tJZktleUlzQ29tcGxleChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4ga2V5LmluY2x1ZGVzKHRoaXMuQ09NUExFWF9PQkpFQ1RfUFJFRklYKTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgZm9yIGBkYXRlYCBvciBgYXJyYXlgLlxuICAgICAqXG4gICAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgRGF0ZSgpKSA9IFtvYmplY3QgRGF0ZV1gXG4gICAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgQXJyYXkoKSkgPSBbb2JqZWN0IEFycmF5XWBcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICAgIH1cbn1cbiJdfQ==