@croz/nrich-registry-core
Version:
Contains core utilities related to the nrich-registry module
569 lines (552 loc) • 20.5 kB
JavaScript
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/component/RegistryEntityContext.tsx
import React, { useContext } from "react";
// src/store/registry-configuration-store.ts
import create from "zustand";
var useRegistryConfigurationStore = create((set) => ({
groupConfigurations: [],
load: (groupConfigurations) => set(() => ({
groupConfigurations
})),
entityFormatters: {},
setEntityFormatters: (entityFormatters) => set(() => ({
entityFormatters
})),
registryConfiguration: {},
setRegistryConfiguration: (registryConfiguration) => set(() => ({
registryConfiguration
}))
}));
// src/component/RegistryEntityContext.tsx
var RegistryEntityContext = React.createContext(void 0);
var useRegistryEntityContext = () => {
const context = useContext(RegistryEntityContext);
if (!context) {
throw new Error("Cannot use RegistryEntityContext without RegistryEntityContextProvider!");
}
return context;
};
var RegistryEntityContextProvider = ({ entityConfiguration, children }) => {
const entityConfigurations = useRegistryConfigurationStore((state) => state.groupConfigurations.flatMap((groupConfiguration) => groupConfiguration.entityConfigurationList));
const singularAssociationsMap = React.useMemo(() => {
const singularAssociations = [...entityConfiguration.propertyConfigurationList, ...entityConfiguration.embeddedIdPropertyConfigurationList].filter((property) => property.singularAssociation).map((property) => property.singularAssociationReferencedClass);
return singularAssociations.reduce(
(all, current) => __spreadProps(__spreadValues({}, all), { [current]: entityConfigurations.find((configuration) => configuration.classFullName === current) }),
{}
);
}, [entityConfiguration]);
const finalProperties = React.useMemo(() => {
if (entityConfiguration.embeddedIdentity) {
return entityConfiguration.propertyConfigurationList.flatMap((property) => {
if (property.id) {
return entityConfiguration.embeddedIdPropertyConfigurationList;
}
return property;
});
}
return entityConfiguration.propertyConfigurationList;
}, [entityConfiguration]);
const value = React.useMemo(() => ({
entityConfiguration,
finalProperties,
singularAssociationsMap
}), [entityConfiguration]);
return /* @__PURE__ */ React.createElement(RegistryEntityContext.Provider, {
value
}, children);
};
// src/component/RegistryProvider.tsx
import React2 from "react";
// src/service/service.ts
var loadRegistryConfiguration = () => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/configuration/fetch`, __spreadValues({
method: "POST"
}, additionalOptions));
const data = yield response.json();
return data;
});
var loadEntities = (request) => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/data/list`, __spreadValues({
method: "POST",
body: JSON.stringify(request),
headers: { "Content-Type": "application/json" }
}, additionalOptions));
const data = yield response.json();
return data;
});
var bulkLoadEntities = (requests) => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/data/list-bulk`, __spreadValues({
method: "POST",
body: JSON.stringify({
registryRequestList: requests
}),
headers: { "Content-Type": "application/json" }
}, additionalOptions));
const data = yield response.json();
return data;
});
var createEntity = (classFullName, createData) => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/data/create`, __spreadValues({
method: "POST",
body: JSON.stringify({
classFullName,
jsonEntityData: JSON.stringify(createData)
}),
headers: { "Content-Type": "application/json" }
}, additionalOptions));
const data = yield response.json();
return data;
});
var updateEntity = (classFullName, id, updateData) => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/data/update`, __spreadValues({
method: "POST",
body: JSON.stringify({
classFullName,
id,
jsonEntityData: JSON.stringify(updateData)
}),
headers: { "Content-Type": "application/json" }
}, additionalOptions));
const data = yield response.json();
return data;
});
var removeEntity = (classFullName, id) => __async(void 0, null, function* () {
var _a;
const { registryConfiguration } = useRegistryConfigurationStore.getState();
const additionalOptions = ((_a = registryConfiguration.requestOptionsResolver) == null ? void 0 : _a.call(registryConfiguration)) || {};
const finalBaseUrl = registryConfiguration.baseURL || "/nrich/registry";
const response = yield fetch(`${finalBaseUrl}/data/delete`, __spreadValues({
method: "POST",
body: JSON.stringify({ classFullName, id }),
headers: { "Content-Type": "application/json" }
}, additionalOptions));
return response;
});
// src/component/RegistryProvider.tsx
var RegistryProvider = ({ children, registryConfiguration = {}, entityFormatters = {} }) => {
const { load, setRegistryConfiguration, setEntityFormatters } = useRegistryConfigurationStore();
const [loading, setLoading] = React2.useState(true);
React2.useEffect(() => {
const loadConfiguration = () => __async(void 0, null, function* () {
setRegistryConfiguration(__spreadValues({}, registryConfiguration));
setEntityFormatters(entityFormatters);
const configuration = yield loadRegistryConfiguration();
load(configuration);
setLoading(false);
});
loadConfiguration();
}, []);
if (loading) {
return /* @__PURE__ */ React2.createElement("div", null, "Loading...");
}
return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children);
};
// src/hook/use-registry-entity.ts
import React3 from "react";
// src/hook/use-entity-configuration.ts
var useEntityConfiguration = (name) => {
const entityConfiguration = useRegistryConfigurationStore((state) => state.groupConfigurations.flatMap((groupConfiguration) => groupConfiguration.entityConfigurationList).find((configuration) => configuration.name === name || configuration.classFullName === name));
if (entityConfiguration === void 0) {
return void 0;
}
const entityIdProperty = entityConfiguration.propertyConfigurationList.find((property) => property.id);
return { entityConfiguration, entityIdProperty };
};
// src/hook/use-registry-entity.ts
var INITIAL_PAGE_SIZE = 25;
var DEFAULT_INITIAL_REQUEST = {
pageNumber: 0,
pageSize: INITIAL_PAGE_SIZE
};
var useRegistryEntity = (name, initialRequest = DEFAULT_INITIAL_REQUEST) => {
const { entityConfiguration, entityIdProperty } = useEntityConfiguration(name);
const [data, setData] = React3.useState({
content: [],
empty: true,
first: true,
last: true,
sort: {
sorted: false,
unsorted: true
},
numberOfElements: 0,
totalElements: 0,
totalPages: 0
});
const load = (request) => __async(void 0, null, function* () {
const loadedData = yield loadEntities(__spreadValues({ classFullName: entityConfiguration.classFullName }, request));
setData(loadedData);
});
React3.useEffect(() => {
load(initialRequest);
}, []);
const add = (createData) => __async(void 0, null, function* () {
const response = yield createEntity(entityConfiguration.classFullName, createData);
yield load(initialRequest);
return response;
});
const edit = (id, updateData) => __async(void 0, null, function* () {
const response = yield updateEntity(entityConfiguration.classFullName, id, updateData);
yield load(initialRequest);
return response;
});
const remove = (id) => __async(void 0, null, function* () {
const response = yield removeEntity(entityConfiguration.classFullName, id);
yield load(initialRequest);
return response;
});
return {
entityConfiguration,
entityIdProperty,
data,
load,
add,
edit,
remove
};
};
// src/hook/use-registry-entity-administration.ts
import React5 from "react";
// src/util/registry-entity-utils.ts
var resolveId = (entityConfiguration, data) => {
if (entityConfiguration.idClassIdentity) {
const id = {};
entityConfiguration.idClassPropertyNameList.forEach((property) => {
id[property.name] = data[property.name];
});
return id;
}
const idField = entityConfiguration.propertyConfigurationList.find((property) => property.id === true);
return data[idField.name];
};
var resolveValue = (propertyConfiguration, data) => {
const fieldPath = propertyConfiguration.name;
if (fieldPath.includes(".")) {
let current = data;
fieldPath.split(".").forEach((fieldPathPart) => {
current = current[fieldPathPart];
});
return current;
}
return data[fieldPath];
};
var restructureSubmitValue = (value) => {
const result = {};
Object.keys(value).forEach((key) => {
if (key.includes(".")) {
let current = result;
key.split(".").forEach((fieldPathPart, i, arr) => {
var _a;
if (i === arr.length - 1) {
current[fieldPathPart] = value[key];
} else {
current[fieldPathPart] = __spreadValues({}, (_a = current[fieldPathPart]) != null ? _a : {});
current = current[fieldPathPart];
}
});
} else {
result[key] = value[key];
}
});
return result;
};
var formatIdName = (classFullName, idFieldName, id) => `${classFullName.split(".").pop()}[${idFieldName}=${id}]`;
var findIdField = (entityConfiguration) => entityConfiguration.propertyConfigurationList.find((property) => property.id);
// src/hook/use-update-effect.ts
import React4 from "react";
var useUpdateEffect = (effect, dependencies) => {
const firstRender = React4.useRef(true);
React4.useEffect(() => {
firstRender.current = true;
}, []);
React4.useEffect(() => {
if (!firstRender.current) {
return effect();
}
firstRender.current = false;
return void 0;
}, dependencies);
};
var useDebouncedUpdateEffect = (effect, debounceTime, dependencies) => {
const firstRender = React4.useRef(true);
const timeoutRef = React4.useRef(null);
const clearTimeout = () => window.clearTimeout(timeoutRef.current);
React4.useEffect(() => {
firstRender.current = true;
clearTimeout();
}, []);
React4.useEffect(() => {
clearTimeout();
if (!firstRender.current) {
timeoutRef.current = setTimeout(() => {
effect();
}, debounceTime);
}
firstRender.current = false;
}, dependencies);
};
// src/hook/use-registry-entity-administration.ts
var useRegistryEntityAdministration = (entityName) => {
const [request, setRequest] = React5.useState(DEFAULT_INITIAL_REQUEST);
const registryEntity = useRegistryEntity(entityName, request);
const [formModalOpen, setFormModalOpen] = React5.useState(false);
const [formType, setFormType] = React5.useState(void 0);
const [formData, setFormData] = React5.useState();
const [loading, setLoading] = React5.useState(false);
const {
entityConfiguration,
entityIdProperty,
data,
add,
edit,
remove
} = registryEntity;
const handlePagingUpdate = (newPagingRequest) => __async(void 0, null, function* () {
setRequest((oldRequest) => __spreadValues(__spreadValues({}, oldRequest), newPagingRequest));
});
const handleFilterUpdate = (searchParameter) => __async(void 0, null, function* () {
setRequest((oldRequest) => __spreadProps(__spreadValues({}, oldRequest), { pageNumber: 0, searchParameter }));
});
useUpdateEffect(() => {
const reload = () => __async(void 0, null, function* () {
setLoading(true);
yield registryEntity.load(request);
setLoading(false);
});
reload();
}, [request]);
const handleAddClick = () => {
setFormModalOpen(true);
setFormType("create");
setFormData(void 0);
};
const handleAddFromCopyClick = (row) => {
setFormModalOpen(true);
setFormType("create");
setFormData(row);
};
const handleEditClick = (id, row) => {
setFormModalOpen(true);
setFormType("update");
setFormData(row);
};
const handlePreviewClick = (row) => {
setFormModalOpen(true);
setFormType("preview");
setFormData(row);
};
const handleSubmitClick = (values) => __async(void 0, null, function* () {
const finalValue = restructureSubmitValue(values);
let actionResponse;
setFormModalOpen(false);
setLoading(true);
if (formType === "update") {
actionResponse = yield edit(formData[entityIdProperty.name], finalValue);
} else {
actionResponse = yield add(finalValue);
}
setLoading(false);
setFormType(void 0);
setFormData(void 0);
return actionResponse;
});
const closeFormModal = () => {
setFormModalOpen(false);
setFormType(void 0);
setFormData(void 0);
};
return {
entityConfiguration,
entityIdProperty,
data,
request,
handlePagingUpdate,
handleFilterUpdate,
handleAddClick,
handleAddFromCopyClick,
handleEditClick,
handlePreviewClick,
handleSubmitClick,
formType,
formData,
formModalOpen,
closeFormModal,
loading,
remove
};
};
// src/hook/use-registry-entity-form-configuration.ts
import { useYupFormConfiguration } from "@croz/nrich-form-configuration-core";
var useRegistryEntityYupFormConfiguration = (classFullName, type) => useYupFormConfiguration(`${classFullName}:::${type}`);
// src/hook/use-registry-filter.ts
import React6 from "react";
var INITIAL_FILTER_VALUE = { query: "", propertyNameList: [] };
var useRegistryFilter = (initialFilterValue = INITIAL_FILTER_VALUE) => {
const { finalProperties } = React6.useContext(RegistryEntityContext);
const [searchParameter, setSearchParameter] = React6.useState(initialFilterValue);
const handleFieldsChange = (event) => {
const { value } = event.target;
const newValue = typeof value === "string" ? value.split(",") : value;
setSearchParameter((oldSearchParameter) => __spreadProps(__spreadValues({}, oldSearchParameter), { propertyNameList: newValue }));
};
const handleQueryChange = (event) => {
const { value } = event.target;
setSearchParameter((oldSearchParameter) => __spreadProps(__spreadValues({}, oldSearchParameter), { query: value }));
};
const availableFields = React6.useMemo(
() => finalProperties.filter((property) => property.searchable).map((property) => ({ value: property.name, label: property.columnHeader })),
[finalProperties]
);
return {
availableFields,
searchParameter,
handleFieldsChange,
handleQueryChange
};
};
// src/hook/use-registry-form.ts
import React7 from "react";
var useRegistryForm = (initialValues, type) => {
const { entityConfiguration, finalProperties } = React7.useContext(RegistryEntityContext);
const yupSchema = useRegistryEntityYupFormConfiguration(entityConfiguration.classFullName, type);
const finalInitialValues = React7.useMemo(() => {
if (initialValues === void 0) {
const values2 = {};
finalProperties.forEach((property) => {
values2[property.name] = null;
});
return values2;
}
const values = {};
finalProperties.forEach((property) => {
values[property.name] = resolveValue(property, initialValues);
});
return values;
}, [initialValues]);
const properties = type === "update" ? finalProperties : finalProperties.filter((property) => property.editable);
return {
entityConfiguration,
yupSchema,
finalInitialValues,
properties
};
};
// src/hook/use-registry-sort.ts
import React8 from "react";
var useRegistrySort = (propertyConfiguration, value, onChange, allowMultiple = true) => {
const sortDirection = React8.useMemo(() => {
const sortProperty = value.find((pagingRequestSortProperty) => pagingRequestSortProperty.property === propertyConfiguration.name);
if (sortProperty === void 0) {
return void 0;
}
return sortProperty.direction;
}, [propertyConfiguration, value]);
const sortChangeHandler = () => {
const sortProperty = value.find((pagingRequestSortProperty) => pagingRequestSortProperty.property === propertyConfiguration.name);
if (sortProperty === void 0) {
onChange([
...allowMultiple ? value : [],
{ property: propertyConfiguration.name, direction: "ASC" }
]);
} else if (sortProperty.direction === "ASC") {
onChange(value.map((pagingRequestSortProperty) => {
if (pagingRequestSortProperty.property === propertyConfiguration.name) {
return __spreadProps(__spreadValues({}, pagingRequestSortProperty), { direction: "DESC" });
}
return pagingRequestSortProperty;
}));
} else {
onChange(value.filter((pagingRequestSortProperty) => pagingRequestSortProperty.property !== propertyConfiguration.name));
}
};
return {
sortDirection,
sortChangeHandler
};
};
export {
DEFAULT_INITIAL_REQUEST,
RegistryEntityContext,
RegistryEntityContextProvider,
RegistryProvider,
bulkLoadEntities,
createEntity,
findIdField,
formatIdName,
loadEntities,
loadRegistryConfiguration,
removeEntity,
resolveId,
resolveValue,
restructureSubmitValue,
updateEntity,
useDebouncedUpdateEffect,
useRegistryConfigurationStore,
useRegistryEntity,
useRegistryEntityAdministration,
useRegistryEntityContext,
useRegistryEntityYupFormConfiguration,
useRegistryFilter,
useRegistryForm,
useRegistrySort,
useUpdateEffect
};
//# sourceMappingURL=index.mjs.map