UNPKG

@knowmax/genericlist-core

Version:

Knowmax Generic list with basic CRUD support without any user interface implementation.

161 lines (160 loc) 5.84 kB
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); }); };