@shko.online/lookupobjects-mock
Version:
Mocking Dataverse Lookup Objects to simplify writing soties for PCF components
197 lines (195 loc) • 9.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
require("./LookupCss.css");
var _SingleEntityFilter = _interopRequireDefault(require("./SingleEntityFilter"));
var _MultiEntityFilter = _interopRequireDefault(require("./MultiEntityFilter"));
var _Header = _interopRequireDefault(require("./Header"));
var _Footer = _interopRequireDefault(require("./Footer"));
var _SelectedRecord = _interopRequireDefault(require("./SelectedRecord"));
var _SearchLookup = _interopRequireDefault(require("./SearchLookup"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/* eslint-disable sonarjs/no-nested-template-literals */
function LookupComponent(_ref) {
let {
unmount,
resolve,
lookupOptions,
db
} = _ref;
const {
allowMultiSelect,
entityTypes
} = lookupOptions;
const [results, setResults] = (0, _react.useState)(null);
const [selected, setSelected] = (0, _react.useState)(null);
const selectedIds = (0, _react.useMemo)(() => selected?.map(i => i.id) || [], [selected]);
const inpuRef = (0, _react.useRef)();
const onCloseClick = (0, _react.useCallback)(() => {
console.log('unmount?');
unmount();
resolve([]);
}, [resolve, unmount]);
const searchRecords = (0, _react.useCallback)(search => {
const result = [];
entityTypes.forEach(value => {
const metadata = db.getTableMetadata(value);
const select = `SELECT ${metadata.PrimaryIdAttribute}, ${metadata.PrimaryNameAttribute}
FROM ${metadata.LogicalName}
${search ? `WHERE ${metadata.PrimaryNameAttribute || 'name'} LIKE '%${search}%'` : ''}`;
const res = db.db.exec(select).map(v => ({
entityType: value,
id: v[metadata.PrimaryIdAttribute],
name: v[metadata.PrimaryNameAttribute]
}));
result.push(...res);
});
console.log('Result', result);
setResults(result.filter(i => !selectedIds.includes(i.id)));
}, [db, entityTypes, selectedIds]);
const searchByEntityRecords = (0, _react.useCallback)(entity => {
const search = inpuRef?.current?.value;
const result = [];
console.log(entity);
lookupOptions.entityTypes.forEach(value => {
if (entity && value !== entity) {
return;
}
const metadata = db.getTableMetadata(value);
const select = `SELECT ${metadata.PrimaryIdAttribute}, ${metadata.PrimaryNameAttribute}
FROM ${metadata.LogicalName}
${search ? `WHERE ${metadata.PrimaryNameAttribute || 'name'} LIKE '%${search}%'` : ''}`;
const res = db.db.exec(select).map(v => ({
entityType: value,
id: v[metadata.PrimaryIdAttribute],
name: v[metadata.PrimaryNameAttribute]
}));
result.push(...res);
});
console.log('Result', result);
setResults(result.filter(i => !selectedIds?.includes(i.id)));
}, [db, lookupOptions.entityTypes, selectedIds]);
const OnSearchClick = (0, _react.useCallback)(() => {
const search = inpuRef.current.value;
searchRecords(search);
}, [searchRecords]);
const onSelect = (0, _react.useCallback)(lookup => {
if (allowMultiSelect) {
setSelected(prev => {
return prev ? [...prev, lookup] : [lookup];
});
setResults(prev => {
return prev.filter(i => i.id !== lookup.id);
});
} else {
setSelected([lookup]);
setResults(null);
}
}, [allowMultiSelect]);
const onUnSelect = (0, _react.useCallback)(lookup => {
setSelected(prev => {
const state = prev.filter(item => item.id !== lookup.id);
return state.length === 0 ? null : state;
});
if (allowMultiSelect) setResults(prev => [...prev, lookup]);
if (inpuRef?.current?.value) inpuRef.current.value = '';
}, [allowMultiSelect]);
const onAddClick = (0, _react.useCallback)(() => {
resolve(selected);
setSelected(null);
unmount();
}, [resolve, selected, unmount]);
const lookForRecords = (0, _react.useMemo)(() => {
if (lookupOptions.entityTypes.length > 1) {
return 'Look for records';
}
const metadata = db.getTableMetadata(lookupOptions.entityTypes[0]);
return 'Look for ' + (metadata?.DisplayCollectionName || metadata?.DisplayName || metadata?.LogicalName);
}, [db, lookupOptions.entityTypes]);
const entityTypesFilter = (0, _react.useMemo)(() => {
const metadata = db.getTableMetadata(lookupOptions.entityTypes[0]);
// return 'Look for ' + (metadata.DisplayCollectionName || metadata.DisplayName || metadata.LogicalName);
return lookupOptions.entityTypes.length === 1 ? /*#__PURE__*/_react.default.createElement(_SingleEntityFilter.default, {
entity: metadata?.DisplayName || metadata?.LogicalName
}) : /*#__PURE__*/_react.default.createElement(_MultiEntityFilter.default, {
db: db,
entityTypes: lookupOptions.entityTypes,
results: results,
searchByEntityRecords: searchByEntityRecords
});
}, [db, lookupOptions.entityTypes, results, searchByEntityRecords]);
return /*#__PURE__*/_react.default.createElement("div", {
className: "so.fixed so.top-0 so.bottom-0 so.right-0 so.left-0 so.z-50 so.w-full so.bg-opacity-30 so.bg-black so.flex so.justify-end"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex so.flex-col so.h-full so.box-border so.bg-white so.border-solid so.border-2 so.border-transparent so.overflow-auto so.flex-nowrap so.w-[400px] so.content-start so.outline-none so.text-neutral-800 so.font-sans so.font-normal so.antialiased so.visible"
}, /*#__PURE__*/_react.default.createElement("section", {
className: "so.flex so.flex-col so.flex-1"
}, /*#__PURE__*/_react.default.createElement(_Header.default, {
onCloseClick: onCloseClick
}), /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex so.overflow-visible so.mb-6 so.mx-2 so.mt-4 so.justify-between so.h-full so.flex-col",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex so.w-full",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.max-w-full so.flex-1 so.flex",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex so.flex-col so.w-full so.border so.border-zinc-100 so.border-solid",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex so.w-full",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.rounded so.w-full so.bg-gray-100",
role: "presentation"
}, /*#__PURE__*/_react.default.createElement("div", {
"aria-atomic": "true",
role: "status"
}), selected === null && /*#__PURE__*/_react.default.createElement(_SearchLookup.default, {
inputRef: inpuRef,
lookForRecords: lookForRecords,
onSearchClick: OnSearchClick,
searchRecords: searchRecords
}), selected != null && /*#__PURE__*/_react.default.createElement(_SelectedRecord.default, {
allowMultiSelect: allowMultiSelect,
inputRef: inpuRef,
onSearchClick: OnSearchClick,
onUnSelect: onUnSelect,
searchRecords: searchRecords,
selected: selected
}))), /*#__PURE__*/_react.default.createElement("div", {
className: "so.w-full so.flex so.flex-1 so.flex-col",
role: "presentation"
}, results === null && /*#__PURE__*/_react.default.createElement("span", {
className: "so.p-2 so.text-sm so.leading-8 so.cursor-default so.text-neutral-800"
}, "Type to search or press Enter to browse"), results?.length === 0 && /*#__PURE__*/_react.default.createElement("span", {
className: "so.p-2 so.text-sm so.leading-8 so.cursor-default so.text-neutral-800"
}, "No records found. Create a new record."), results?.length > 0 && entityTypesFilter, results?.length > 0 && /*#__PURE__*/_react.default.createElement("ul", {
className: "so.flex-1 so.flex-col so.scroll-auto"
}, results.map(r => /*#__PURE__*/_react.default.createElement("li", {
className: "so.flex",
key: r.id
}, /*#__PURE__*/_react.default.createElement("button", {
className: "so.flex so.flex-1 so.gap-x-1 so.min-h-12 so.items-center so.overflow-hidden so.rounded hover:so.bg-gray-200",
key: r.id,
onClick: () => onSelect(r)
}, /*#__PURE__*/_react.default.createElement("div", {
className: "so.justify-start so.flex so.text-sm so.items-center so.px-1"
}, /*#__PURE__*/_react.default.createElement("img", {
className: "so.h-6 so.w-6",
src: "./favicon.ico"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "so.flex-1 so.truncate so.text-start"
}, r.name)))))))))), /*#__PURE__*/_react.default.createElement(_Footer.default, {
onAddClick: onAddClick,
onCloseClick: onCloseClick
}))));
}
var _default = exports.default = LookupComponent;