@ngx-dummy/select-simple
Version:
A simple select component to use in Angular / Ionic projects .. (WIP) and sample app using it
89 lines • 13.7 kB
JavaScript
/*!
* @ngx-dummy/select-Simple library
* Simple select created for angular / ionic projects.
* https://github.com/ngx-dummy/select-simple
*
* Copyright Vladimir Ovsyukov <ovsyukov@yandex.com>
* Published under MIT License
*/
import { SecurityContext } from '@angular/core';
export const imgBase64ToBlob = (Base64Image, imageType = 'image/png') => {
const parts = Base64Image.split(';base64,');
const decodedData = window.atob(parts[1]);
const uInt8Array = new Uint8Array(decodedData.length);
for (let i = 0; i < decodedData.length; ++i) {
uInt8Array[i] = decodedData.charCodeAt(i);
}
return new Blob([uInt8Array], { type: imageType });
};
export const svgToBase64src = (rawSvg) => 'data:image/svg+xml;base64,' + btoa(rawSvg);
export const prepRes = (item, sanitizer) => sanitizer.bypassSecurityTrustResourceUrl(item);
export const sanitizeHTML = (item, sanitizer) => sanitizer.sanitize(SecurityContext.HTML, item);
export const getSvgSafeRes = (file, sanitizer) => prepRes(svgToBase64src(file), sanitizer);
export const getPngSafeRes = (file, sanitizer) => prepRes(URL.createObjectURL(imgBase64ToBlob(file)), sanitizer);
export const blobToSafeRes = (blob, sanitizer) => prepRes(URL.createObjectURL(blob), sanitizer);
/**
*
* @param data - option value (could be simple string or complex object to resolve)
* @param field - the key (or complex lookup object key) of data object to resolve value by
* @returns resolved single option value (Input for SelectItem)
*/
export const resolveFieldData = (data, field) => {
if (isEmpty(data))
return null;
if (isString(data))
return data;
if (isSelectItem(data)) {
if (data['label'])
return data['label'];
if (data['value'])
data = data['value'];
}
if (field) {
if (isString(field) && field.indexOf('.') === -1) {
return data[field];
}
else if (isString(field)) {
const fields = field.split('.');
let value = data;
for (let i = 0, len = fields.length; i < len; ++i) {
if (value == null) {
return null;
}
value = value[fields[i]];
}
return resolveFieldData(value);
}
}
else {
return resolveFieldData(Object.values(data)[0]);
}
return null;
};
export const isValue = (obj) => obj !== undefined && obj !== null;
export const isEmpty = (obj) => !isValue(obj);
export const isString = (obj) => typeof obj === 'string';
export const isObject = (obj) => typeof obj !== 'string' && !Array.isArray(obj) && typeof obj === 'object';
export const isSelectItem = (obj) => (isObject(obj) && !!obj.value) || !!obj.label;
export const areEqual = (obj1, obj2, field) => {
if (isEmpty(obj1) || isEmpty(obj2))
return false;
if (isString(obj1) && isString(obj2))
return obj1 === obj2;
if (field)
return resolveFieldData(obj1, field) === resolveFieldData(obj2, field);
return JSON.stringify(obj1) === JSON.stringify(obj2);
};
export var OptionKeyboardEventHandleKeys;
(function (OptionKeyboardEventHandleKeys) {
OptionKeyboardEventHandleKeys["ArrowDown"] = "ArrowDown";
OptionKeyboardEventHandleKeys["Down"] = "Down";
OptionKeyboardEventHandleKeys["ArrowUp"] = "ArrowUp";
OptionKeyboardEventHandleKeys["Enter"] = "Enter";
OptionKeyboardEventHandleKeys["Escape"] = "Escape";
OptionKeyboardEventHandleKeys["Esc"] = "Esc";
OptionKeyboardEventHandleKeys["Up"] = "Up";
OptionKeyboardEventHandleKeys["Tab"] = "Tab";
OptionKeyboardEventHandleKeys["Space"] = " ";
})(OptionKeyboardEventHandleKeys || (OptionKeyboardEventHandleKeys = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NlbGVjdC1zaW1wbGUvc3JjL2xpYi9zZXR0aW5ncy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSWhELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQUUsU0FBUyxHQUFHLFdBQVcsRUFBRSxFQUFFO0lBQy9FLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDNUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5RixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFZLEVBQUUsU0FBdUIsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFD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QUFBO0lBQ1QsNENBQVcsQ0FBQTtJQUNYLDRDQUFXLENBQUE7QUFDWixDQUFDLEVBVlcsNkJBQTZCLEtBQTdCLDZCQUE2QixRQVV4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQG5neC1kdW1teS9zZWxlY3QtU2ltcGxlIGxpYnJhcnlcbiAqIFNpbXBsZSBzZWxlY3QgY3JlYXRlZCBmb3IgYW5ndWxhciAvIGlvbmljIHByb2plY3RzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25neC1kdW1teS9zZWxlY3Qtc2ltcGxlXG4gKlxuICogQ29weXJpZ2h0ICBWbGFkaW1pciBPdnN5dWtvdiA8b3ZzeXVrb3ZAeWFuZGV4LmNvbT5cbiAqIFB1Ymxpc2hlZCB1bmRlciBNSVQgTGljZW5zZVxuICovXG5pbXBvcnQgeyBTZWN1cml0eUNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSU9wdGlvbiwgSVNlbGVjdEl0ZW0gfSBmcm9tICcuL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBpbWdCYXNlNjRUb0Jsb2IgPSAoQmFzZTY0SW1hZ2U6IHN0cmluZywgaW1hZ2VUeXBlID0gJ2ltYWdlL3BuZycpID0+IHtcblx0Y29uc3QgcGFydHMgPSBCYXNlNjRJbWFnZS5zcGxpdCgnO2Jhc2U2NCwnKTtcblx0Y29uc3QgZGVjb2RlZERhdGEgPSB3aW5kb3cuYXRvYihwYXJ0c1sxXSk7XG5cdGNvbnN0IHVJbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkZWNvZGVkRGF0YS5sZW5ndGgpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWREYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0dUludDhBcnJheVtpXSA9IGRlY29kZWREYXRhLmNoYXJDb2RlQXQoaSk7XG5cdH1cblx0cmV0dXJuIG5ldyBCbG9iKFt1SW50OEFycmF5XSwgeyB0eXBlOiBpbWFnZVR5cGUgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc3ZnVG9CYXNlNjRzcmMgPSAocmF3U3ZnOiBzdHJpbmcpID0+ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKHJhd1N2Zyk7XG5leHBvcnQgY29uc3QgcHJlcFJlcyA9IChpdGVtOiBzdHJpbmcsIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSA9PiBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGl0ZW0pO1xuZXhwb3J0IGNvbnN0IHNhbml0aXplSFRNTCA9IChpdGVtOiBzdHJpbmcsIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSA9PiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIGl0ZW0pO1xuZXhwb3J0IGNvbnN0IGdldFN2Z1NhZmVSZXMgPSAoZmlsZTogc3RyaW5nLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikgPT4gcHJlcFJlcyhzdmdUb0Jhc2U2NHNyYyhmaWxlKSwgc2FuaXRpemVyKTtcbmV4cG9ydCBjb25zdCBnZXRQbmdTYWZlUmVzID0gKGZpbGU6IHN0cmluZywgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpID0+IHByZXBSZXMoVVJMLmNyZWF0ZU9iamVjdFVSTChpbWdCYXNlNjRUb0Jsb2IoZmlsZSkpLCBzYW5pdGl6ZXIpO1xuZXhwb3J0IGNvbnN0IGJsb2JUb1NhZmVSZXMgPSAoYmxvYjogQmxvYiwgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpID0+IHByZXBSZXMoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgc2FuaXRpemVyKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGEgLSBvcHRpb24gdmFsdWUgKGNvdWxkIGJlIHNpbXBsZSBzdHJpbmcgb3IgY29tcGxleCBvYmplY3QgdG8gcmVzb2x2ZSlcbiAqIEBwYXJhbSBmaWVsZCAtIHRoZSBrZXkgKG9yIGNvbXBsZXggbG9va3VwIG9iamVjdCBrZXkpIG9mIGRhdGEgb2JqZWN0IHRvIHJlc29sdmUgdmFsdWUgYnlcbiAqIEByZXR1cm5zIHJlc29sdmVkIHNpbmdsZSBvcHRpb24gdmFsdWUgKElucHV0IGZvciBTZWxlY3RJdGVtKVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpZWxkRGF0YSA9IChkYXRhOiBJT3B0aW9uLCBmaWVsZD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuXHRpZiAoaXNFbXB0eShkYXRhKSkgcmV0dXJuIG51bGw7XG5cdGlmIChpc1N0cmluZyhkYXRhKSkgcmV0dXJuIGRhdGE7XG5cdGlmIChpc1NlbGVjdEl0ZW0oZGF0YSkpIHtcblx0XHRpZiAoZGF0YVsnbGFiZWwnXSkgcmV0dXJuIGRhdGFbJ2xhYmVsJ107XG5cdFx0aWYgKGRhdGFbJ3ZhbHVlJ10pIGRhdGEgPSBkYXRhWyd2YWx1ZSddO1xuXHR9XG5cblx0aWYgKGZpZWxkKSB7XG5cdFx0aWYgKGlzU3RyaW5nKGZpZWxkKSAmJiBmaWVsZC5pbmRleE9mKCcuJykgPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gZGF0YVtmaWVsZF07XG5cdFx0fSBlbHNlIGlmIChpc1N0cmluZyhmaWVsZCkpIHtcblx0XHRcdGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBmaWVsZC5zcGxpdCgnLicpO1xuXHRcdFx0bGV0IHZhbHVlID0gZGF0YTtcblx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW2ZpZWxkc1tpXV07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzb2x2ZUZpZWxkRGF0YSh2YWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiByZXNvbHZlRmllbGREYXRhKE9iamVjdC52YWx1ZXMoZGF0YSlbMF0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgaXNWYWx1ZSA9IDxUPihvYmo6IFQpOiBvYmogaXMgVCA9PiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGw7XG5leHBvcnQgY29uc3QgaXNFbXB0eSA9IDxUPihvYmo6IFQpOiBvYmogaXMgVCA9PiAhaXNWYWx1ZShvYmopO1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKG9iajogSU9wdGlvbik6IG9iaiBpcyBzdHJpbmcgPT4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSA8VCBleHRlbmRzIG9iamVjdCB8IHN0cmluZz4ob2JqOiBUKTogb2JqIGlzIFQgPT4gdHlwZW9mIG9iaiAhPT0gJ3N0cmluZycgJiYgIUFycmF5LmlzQXJyYXkob2JqKSAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JztcbmV4cG9ydCBjb25zdCBpc1NlbGVjdEl0ZW0gPSAob2JqOiBJU2VsZWN0SXRlbSB8IHN0cmluZyk6IG9iaiBpcyBJU2VsZWN0SXRlbSA9PiAoaXNPYmplY3Qob2JqKSAmJiAhISg8SVNlbGVjdEl0ZW0+b2JqKS52YWx1ZSkgfHwgISEoPElTZWxlY3RJdGVtPm9iaikubGFiZWw7XG5leHBvcnQgY29uc3QgYXJlRXF1YWwgPSAob2JqMTogSU9wdGlvbiB8IG51bGwsIG9iajI6IElPcHRpb24gfCBudWxsLCBmaWVsZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuXHRpZiAoaXNFbXB0eShvYmoxKSB8fCBpc0VtcHR5KG9iajIpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChpc1N0cmluZyhvYmoxKSAmJiBpc1N0cmluZyhvYmoyKSkgcmV0dXJuIG9iajEgPT09IG9iajI7XG5cblx0aWYgKGZpZWxkKSByZXR1cm4gcmVzb2x2ZUZpZWxkRGF0YShvYmoxLCBmaWVsZCkgPT09IHJlc29sdmVGaWVsZERhdGEob2JqMiwgZmllbGQpO1xuXG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG59O1xuXG5leHBvcnQgZW51bSBPcHRpb25LZXlib2FyZEV2ZW50SGFuZGxlS2V5cyB7XG5cdEFycm93RG93biA9ICdBcnJvd0Rvd24nLFxuXHREb3duID0gJ0Rvd24nLFxuXHRBcnJvd1VwID0gJ0Fycm93VXAnLFxuXHRFbnRlciA9ICdFbnRlcicsXG5cdEVzY2FwZSA9ICdFc2NhcGUnLFxuXHRFc2MgPSAnRXNjJyxcblx0VXAgPSAnVXAnLFxuXHRUYWIgPSAnVGFiJyxcblx0U3BhY2UgPSAnICcsXG59XG4iXX0=