@knowmax/genericlist-core
Version:
Knowmax Generic list with basic CRUD support without any user interface implementation.
161 lines (160 loc) • 5.84 kB
JavaScript
import { makeObservable, observable, action } from "mobx";
/** Responsible for all system settings in use for all generic lists. Allows system specific implementation of generic list components. */
export class GenericListSettings {
constructor() {
/** Never use directly. Always use getter. */
Object.defineProperty(this, "_onFetch", {
enumerable: true,
configurable: true,
writable: true,
value: defaultFetch
});
Object.defineProperty(this, "_onFetchSet", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
/** Never use directly. Always use getter. */
Object.defineProperty(this, "_onTranslate", {
enumerable: true,
configurable: true,
writable: true,
value: defaultTranslate
});
Object.defineProperty(this, "_onTranslateSet", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
/** Set after required configuration of onFetch and onTranslate were made. */
Object.defineProperty(this, "ready", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
/** Set to required bearer token for use in authentication of fetch requests. */
Object.defineProperty(this, "token", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
/** Set to required language of user for use in fetch requests to get localized data from server. */
Object.defineProperty(this, "language", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
/** Contains current set of values components user for state. */
Object.defineProperty(this, "params", {
enumerable: true,
configurable: true,
writable: true,
value: new URLSearchParams()
});
/** Override to handle custom serialization of user settings like sorting, filtering and paging. */
Object.defineProperty(this, "onSerialize", {
enumerable: true,
configurable: true,
writable: true,
value: defaultSerialize
});
/** Override for custom implementation of header generation for fetch requests. */
Object.defineProperty(this, "onGetHeaders", {
enumerable: true,
configurable: true,
writable: true,
value: defaultOnGetHeaders
});
/** Override for custom implementation of error message extraction after for example fetch requests. */
Object.defineProperty(this, "onErrorMessage", {
enumerable: true,
configurable: true,
writable: true,
value: defaultErrorMessage
});
makeObservable(this, {
ready: observable,
setReady: action,
token: observable,
setToken: action,
language: observable,
setLanguage: action,
params: observable,
setParams: action
});
}
/** Internally called after configuration of required settings was done. No need to call it externally. */
setReady(value) {
this.ready = value;
}
setToken(value) {
this.token = value;
}
setLanguage(value) {
this.language = value;
}
/** Set to current set of values for components to use for state. */
setParams(value) {
this.params = value;
}
/** Internally used to serialize params. By default set to internally maintained params. Override for custom onSerialize for custom serialization. */
serialize(params) {
this.onSerialize(params, this);
}
/** Used for fetching data from server. */
get onFetch() {
return this._onFetch;
}
set onFetch(value) {
this._onFetch = value;
this._onFetchSet = true;
this.setReady(this._onFetchSet && this._onTranslateSet);
}
/** Used for translation of all language sensitive contents. */
get onTranslate() {
return this._onTranslate;
}
set onTranslate(value) {
this._onTranslate = value;
this._onTranslateSet = true;
this.setReady(this._onFetchSet && this._onTranslateSet);
}
}
/** Default implementation for making fetch requests to server. Always needs to be overrriden with a custom implementation. */
const defaultFetch = (url, options) => {
return new Promise((resolve, reject) => {
console.warn('onFetch not configured');
reject('not implemented');
});
};
/** Default implementation for handling translations. Always need to be overriden with a custom implementation. */
const defaultTranslate = (key, options) => {
console.warn('onTranslate not configured');
return key;
};
/** Default imnplementation of serialization of settings like sorting, filtering and paging made by user */
const defaultSerialize = (params, settings) => {
settings.setParams(params);
};
/** Default implementation to get headers for requests to server. */
const defaultOnGetHeaders = (token, language, headers) => {
const h = headers ?? {};
if (token) {
h["Authorization"] = "Bearer " + token;
}
if (language) {
h["Accept-Language"] = language;
}
return h;
};
/** Default implementation to extract human readible error message from given Error object. */
const defaultErrorMessage = (error) => {
return new Promise((resolve) => {
resolve(error.message);
});
};