@hashuplabs/omni-filter
Version:
OmniFilter Search component
215 lines • 10 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
import { OmniToken } from '..';
// tslint:disable: no-string-literal
// tslint:disable: no-console
// tslint:disable: max-classes-per-file
var MappedFilter = /** @class */ (function () {
function MappedFilter(token) {
this.token = token;
}
MappedFilter.prototype.getData = function () {
var path = this.token.entity.entityName;
var atom = {};
var actor = atom;
var pathParts = path.split('.');
while (pathParts.length > 1) {
var kp = pathParts.shift();
actor[kp] = {};
actor = actor[kp];
}
var k = pathParts.shift();
actor[k] = {};
var valuePtr = this.token.filterValue;
actor[k][this.token.operator.op] = valuePtr;
return atom;
};
MappedFilter.fromData = function (parent, path, data) {
var _a;
return __awaiter(this, void 0, void 0, function () {
var pathParts, opKey, entityKey, entity, op, token, options, _b, self;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
pathParts = path.split('.');
opKey = pathParts.pop();
entityKey = pathParts.join('.');
entity = parent._entities.find(function (v) { return v.entityName === entityKey; });
op = entity === null || entity === void 0 ? void 0 : entity.type.operators.find(function (opx) { return opx.op === opKey; });
token = new OmniToken(parent);
token.entityName = entity.entityName;
token.entity = entity;
token.operator = op;
if (!((_a = entity === null || entity === void 0 ? void 0 : entity.filter) === null || _a === void 0 ? void 0 : _a.resolve)) return [3 /*break*/, 2];
return [4 /*yield*/, entity.filter.resolve()];
case 1:
_b = _c.sent();
return [3 /*break*/, 3];
case 2:
_b = [];
_c.label = 3;
case 3:
options = _b;
token.values = String(data)
.split('|')
.map(function (p) {
var _a, _b;
var sel = options.length ? (_b = (_a = options.find(function (v) { return v.id === p; })) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : 'INV' : String(p);
var resolved = {
id: String(p),
label: sel,
values: [p],
};
return resolved;
});
self = new MappedFilter(token);
return [2 /*return*/, self];
}
});
});
};
MappedFilter.prototype.toRequestString = function () {
var buffer = [];
buffer.push('omni.' + this.token.entityName);
buffer.push('.');
buffer.push(this.token.operator.op);
buffer.push('=');
var rawValues = Array.isArray(this.token.values) ? this.token.values : [this.token.values];
buffer.push(rawValues.map(function (v) { return v.values.join(','); }).join('|'));
return buffer.join('');
};
return MappedFilter;
}());
var FilterManager = /** @class */ (function () {
function FilterManager() {
this.filterMap = [];
}
FilterManager.prototype.all = function () {
return this.filterMap;
};
FilterManager.prototype.addToken = function (token) {
var filter = new MappedFilter(token);
this.filterMap.push(filter);
return;
};
FilterManager.prototype.removeToken = function (_token) {
var index = this.filterMap.findIndex(function (fm) { return fm.token.id === _token.id; });
if (index > -1) {
this.filterMap.splice(index, 1);
}
return;
};
FilterManager.prototype.toObject = function () {
var obj = { and: [] };
obj.and = this.filterMap.map(function (tok) { return tok.getData(); });
return obj;
};
FilterManager.prototype.toJSON = function () {
return '';
};
FilterManager.prototype.toString = function () {
return this.filterMap.map(function (token) { return token.toRequestString(); }).join('&');
};
FilterManager.fromRequestString = function (_requestString) {
return;
};
FilterManager.prototype.loadJSON = function (parent, _json) {
return __awaiter(this, void 0, void 0, function () {
var _mapped, _a, _b, _i, realKey, parts, k, normalized, _c, normalized_1, item, f;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_mapped = [];
_a = [];
for (_b in _json)
_a.push(_b);
_i = 0;
_d.label = 1;
case 1:
if (!(_i < _a.length)) return [3 /*break*/, 6];
realKey = _a[_i];
if (!_json.hasOwnProperty(realKey))
return [3 /*break*/, 5];
if (!realKey.startsWith('omni.'))
return [3 /*break*/, 5];
parts = realKey.split('.');
// TODO: Implement scoping for handling multiple omnisearches on 1 page
parts.shift();
k = parts.join('.');
normalized = Array.isArray(_json[realKey]) ? _json[realKey] : [_json[realKey]];
_c = 0, normalized_1 = normalized;
_d.label = 2;
case 2:
if (!(_c < normalized_1.length)) return [3 /*break*/, 5];
item = normalized_1[_c];
return [4 /*yield*/, MappedFilter.fromData(parent, k, item)];
case 3:
f = _d.sent();
_mapped.push(f);
_d.label = 4;
case 4:
_c++;
return [3 /*break*/, 2];
case 5:
_i++;
return [3 /*break*/, 1];
case 6:
this.filterMap = _mapped;
return [2 /*return*/];
}
});
});
};
FilterManager.fromJSON = function (parent, _json) {
return __awaiter(this, void 0, void 0, function () {
var fm;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fm = new this();
return [4 /*yield*/, fm.loadJSON(parent, _json)];
case 1:
_a.sent();
return [2 /*return*/, fm];
}
});
});
};
return FilterManager;
}());
export default FilterManager;
//# sourceMappingURL=FilterManager.js.map