dinocollab-core 2.1.38 → 2.1.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/form/decorator.js.map +1 -1
- package/dist/src/mfe-shared/navigation.js +1 -1
- package/dist/src/mfe-shared/navigation.js.map +1 -1
- package/dist/src/table/ui.units.js +1 -1
- package/dist/src/table/ui.units.js.map +1 -1
- package/dist/src/utils/helpers.js +1 -1
- package/dist/src/utils/helpers.js.map +1 -1
- package/dist/types/form/decorator.d.ts +1 -1
- package/dist/types/form/index.d.ts +1 -1
- package/dist/types/mfe-shared/navigation.d.ts +3 -0
- package/dist/types/utils/helpers.d.ts +10 -10
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorator.js","sources":["../../../src/form/decorator.ts"],"sourcesContent":["import 'reflect-metadata'\r\nimport { ComponentType } from 'react'\r\nimport { IFormInputBase } from './types'\r\nimport { IConfigValue, IFormValidatorConfig } from './validator'\r\n\r\nconst ClassRegistry = new Map<string, any>()\r\n\r\nexport function registerForm(name?: string) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n const key = name || constructor.name\r\n ClassRegistry.set(key, constructor)\r\n class RegisteredClass extends constructor {\r\n __class = key\r\n constructor(...args: any[]) {\r\n super(...args)\r\n this.__class = key\r\n }\r\n }\r\n Object.defineProperty(RegisteredClass, 'name', { value: constructor.name })\r\n Object.defineProperty(RegisteredClass, '__class', { value: key })\r\n return RegisteredClass\r\n }\r\n}\r\n\r\n/**\r\n * Check whether a class (constructor) or an instance has been registered\r\n * with the @registerForm decorator.\r\n *\r\n * Accepts:\r\n * - the decorated constructor (function)\r\n * - the original constructor (function)\r\n * - an instance of the class\r\n *\r\n * Returns true when the underlying registry contains an entry for the\r\n * class key (either the custom name provided to the decorator or the\r\n * constructor name).\r\n */\r\nexport function isFormRegistered(target: any): boolean {\r\n if (!target) return false\r\n const ctor = typeof target === 'function' ? target : target?.constructor\r\n if (!ctor) return false\r\n const key = (ctor as any).__class || (ctor as any).name\r\n if (!key) return false\r\n return ClassRegistry.has(key)\r\n}\r\n\r\nexport interface IPreSubmitMetadata<T = any> {\r\n handler: (data: T, oldData: T) => Promise<any> | any\r\n}\r\n\r\nexport function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n Reflect.defineMetadata('form:presubmit', { handler }, constructor)\r\n return constructor\r\n }\r\n}\r\n\r\nexport function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined {\r\n return Reflect.getMetadata('form:presubmit', targetClass)\r\n}\r\n\r\nexport interface IFieldMetadata<T = any> {\r\n name: keyof T | string\r\n label?: string\r\n placeholder?: string\r\n defaultValue?: any\r\n type?: any\r\n size?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>>\r\n visible?: boolean | ((data?: T) => boolean)\r\n disabled?: boolean | ((data?: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport function formField(options: Omit<IFieldMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const designType = Reflect.getMetadata('design:type', target, propertyKey)\r\n const actualType = options.type || designType\r\n\r\n // Get existing fields metadata - use hasOwnMetadata to avoid parent pollution\r\n const existing: IFieldMetadata[] = Reflect.hasOwnMetadata('form:fields', target.constructor)\r\n ? Reflect.getOwnMetadata('form:fields', target.constructor)\r\n : []\r\n\r\n // Check if this field already exists (override case)\r\n const existingIndex = existing.findIndex((f) => f.name === propertyKey)\r\n\r\n // Get default value from property if not explicitly provided\r\n // Need to create a temporary instance to get the initialized value\r\n let defaultValue = options.defaultValue\r\n if (defaultValue === undefined) {\r\n try {\r\n const tempInstance = new (target.constructor as any)()\r\n defaultValue = tempInstance[propertyKey]\r\n } catch {\r\n // If constructor fails, use undefined\r\n defaultValue = undefined\r\n }\r\n }\r\n\r\n const newField: IFieldMetadata = {\r\n name: propertyKey,\r\n type: actualType,\r\n label: options.label || propertyKey,\r\n ...options,\r\n defaultValue\r\n }\r\n\r\n if (existingIndex >= 0) {\r\n // Override existing field, keep position\r\n existing[existingIndex] = newField\r\n Reflect.defineMetadata('form:fields', existing, target.constructor)\r\n } else {\r\n // New field, append to end\r\n const fields = [...existing, newField]\r\n Reflect.defineMetadata('form:fields', fields, target.constructor)\r\n }\r\n }\r\n}\r\n\r\nexport const getFormFields = (targetClass: any): IFieldMetadata[] => {\r\n // Get parent class\r\n const parentClass = Object.getPrototypeOf(targetClass)\r\n\r\n // Get parent fields recursively\r\n const parentFields: IFieldMetadata[] = parentClass && parentClass !== Function.prototype ? getFormFields(parentClass) : []\r\n\r\n // Get current class fields\r\n const currentFields: IFieldMetadata[] = Reflect.getMetadata('form:fields', targetClass) || []\r\n\r\n // If no parent, return current fields directly\r\n if (parentFields.length === 0) {\r\n return currentFields\r\n }\r\n\r\n // Merge parent and current fields\r\n // Start with parent fields as base\r\n const mergedFields = [...parentFields]\r\n const fieldNames = new Set(parentFields.map((f) => f.name.toString()))\r\n\r\n // Process current class fields\r\n currentFields.forEach((currentField) => {\r\n const fieldName = currentField.name.toString()\r\n\r\n if (fieldNames.has(fieldName)) {\r\n // Override parent field - find and replace it in place\r\n const index = mergedFields.findIndex((f) => f.name.toString() === fieldName)\r\n if (index >= 0) {\r\n mergedFields[index] = currentField\r\n }\r\n } else {\r\n // New field - append to end\r\n mergedFields.push(currentField)\r\n fieldNames.add(fieldName)\r\n }\r\n })\r\n\r\n return mergedFields\r\n}\r\n\r\nexport interface IValidationMetadata extends IConfigValue {\r\n name: string\r\n}\r\n\r\nexport function formValidate(options: Omit<IValidationMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const existing: IValidationMetadata[] = Reflect.getMetadata('form:validators', target.constructor) || []\r\n const validators = [...existing]\r\n validators.push({ name: propertyKey, ...options })\r\n Reflect.defineMetadata('form:validators', validators, target.constructor)\r\n }\r\n}\r\n\r\nexport function getFormValidators<T = any>(targetClass: any): IFormValidatorConfig<T> {\r\n const metas: IValidationMetadata[] = Reflect.getMetadata('form:validators', targetClass) || []\r\n return metas.reduce<IFormValidatorConfig<T>>((acc, curr) => {\r\n acc[curr.name as keyof T] = { Rules: curr.Rules, label: curr.label }\r\n return acc\r\n }, {})\r\n}\r\n"],"names":["ClassRegistry","Map","registerForm","name","constructor","key","set","RegisteredClass","_constructor","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","__class","_inherits","_createClass","Object","defineProperty","value","isFormRegistered","target","ctor","has","formPreSubmit","handler","Reflect","defineMetadata","getFormPreSubmit","targetClass","getMetadata","formField","options","propertyKey","designType","actualType","type","existing","hasOwnMetadata","getOwnMetadata","existingIndex","findIndex","f","defaultValue","undefined","_unused","newField","_objectSpread","label","fields","_toConsumableArray","getFormFields","parentClass","getPrototypeOf","parentFields","Function","prototype","currentFields","mergedFields","fieldNames","Set","map","toString","forEach","currentField","fieldName","index","push","add","formValidate","validators","getFormValidators","reduce","acc","curr","Rules"],"mappings":"2NAKA,IAAMA,EAAgB,IAAIC,IAEpB,SAAUC,EAAaC,GAC3B,OAAO,SAAkDC,GACvD,IAAMC,EAAMF,GAAQC,EAAYD,KAChCH,EAAcM,IAAID,EAAKD,GAAY,IAC7BG,WAAgBC,GAEpB,SAAAD,IAA0B,IAAAE,EAAAC,OAAAH,GAAA,IAAA,IAAAI,EAAAC,UAAAC,OAAXC,EAAWC,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAXF,EAAWE,GAAAJ,UAAAI,GAEN,OADlBP,EAAAQ,EAAAC,KAAAX,EAAAY,GAAAA,OAASL,IAAKM,EAAAX,EAAA,UAFNJ,GAGRI,EAAKY,QAAUhB,EAAGI,CACpB,CAAC,OAAAa,EAAAf,EAAAC,GAAAe,EAAAhB,EAAA,EAL2BH,GAS9B,OAFAoB,OAAOC,eAAelB,EAAiB,OAAQ,CAAEmB,MAAOtB,EAAYD,OACpEqB,OAAOC,eAAelB,EAAiB,UAAW,CAAEmB,MAAOrB,IACpDE,CACR,CACH,CAeM,SAAUoB,EAAiBC,GAC/B,IAAKA,EAAQ,OAAO,EACpB,IAAMC,EAAyB,mBAAXD,EAAwBA,EAASA,aAAAA,EAAAA,EAAQxB,YAC7D,IAAKyB,EAAM,OAAO,EAClB,IAAMxB,EAAOwB,EAAaR,SAAYQ,EAAa1B,KACnD,QAAKE,GACEL,EAAc8B,IAAIzB,EAC3B,CAMM,SAAU0B,EAAuBC,GACrC,OAAO,SAAkD5B,GAEvD,OADA6B,QAAQC,eAAe,iBAAkB,CAAEF,QAAAA,GAAW5B,GAC/CA,CACR,CACH,CAEM,SAAU+B,EAAiBC,GAC/B,OAAOH,QAAQI,YAAY,iBAAkBD,EAC/C,CAcM,SAAUE,EAAUC,GACxB,OAAO,SAAUX,EAAaY,GAC5B,IAAMC,EAAaR,QAAQI,YAAY,cAAeT,EAAQY,GACxDE,EAAaH,EAAQI,MAAQF,EAG7BG,EAA6BX,QAAQY,eAAe,cAAejB,EAAOxB,aAC5E6B,QAAQa,eAAe,cAAelB,EAAOxB,aAC7C,GAGE2C,EAAgBH,EAASI,UAAU,SAACC,GAAC,OAAKA,EAAE9C,OAASqC,IAIvDU,EAAeX,EAAQW,aAC3B,QAAqBC,IAAjBD,EACF,IAEEA,GADqB,IAAKtB,EAAOxB,aACLoC,EAC7B,CAAC,MAAAY,GAEAF,OAAeC,CAChB,CAGH,IAAME,EAAQC,EAAAA,EAAA,CACZnD,KAAMqC,EACNG,KAAMD,EACNa,MAAOhB,EAAQgB,OAASf,GACrBD,GAAO,GAAA,CACVW,aAAAA,IAGF,GAAIH,GAAiB,EAEnBH,EAASG,GAAiBM,EAC1BpB,QAAQC,eAAe,cAAeU,EAAUhB,EAAOxB,iBAClD,CAEL,IAAMoD,KAAMrC,OAAAsC,EAAOb,GAAUS,CAAAA,IAC7BpB,QAAQC,eAAe,cAAesB,EAAQ5B,EAAOxB,YACtD,CACF,CACH,CAEO,IAAMsD,EAAgB,SAACtB,GAE5B,IAAMuB,EAAcnC,OAAOoC,eAAexB,GAGpCyB,EAAiCF,GAAeA,IAAgBG,SAASC,UAAYL,EAAcC,GAAe,GAGlHK,EAAkC/B,QAAQI,YAAY,cAAeD,IAAgB,GAG3F,GAA4B,IAAxByB,EAAahD,OACf,OAAOmD,EAKT,IAAMC,EAAYR,EAAOI,GACnBK,EAAa,IAAIC,IAAIN,EAAaO,IAAI,SAACnB,GAAC,OAAKA,EAAE9C,KAAKkE,UAAU,IAmBpE,OAhBAL,EAAcM,QAAQ,SAACC,GACrB,IAAMC,EAAYD,EAAapE,KAAKkE,WAEpC,GAAIH,EAAWpC,IAAI0C,GAAY,CAE7B,IAAMC,EAAQR,EAAajB,UAAU,SAACC,GAAC,OAAKA,EAAE9C,KAAKkE,aAAeG,IAC9DC,GAAS,IACXR,EAAaQ,GAASF,EAEzB,MAECN,EAAaS,KAAKH,GAClBL,EAAWS,IAAIH,EAEnB,GAEOP,CACT,EAMM,SAAUW,EAAarC,GAC3B,OAAO,SAAUX,EAAaY,GAC5B,IAAMI,EAAkCX,QAAQI,YAAY,kBAAmBT,EAAOxB,cAAgB,GAChGyE,EAAUpB,EAAOb,GACvBiC,EAAWH,KAAIpB,EAAA,CAAGnD,KAAMqC,GAAgBD,IACxCN,QAAQC,eAAe,kBAAmB2C,EAAYjD,EAAOxB,YAC9D,CACH,CAEM,SAAU0E,EAA2B1C,GAEzC,OADqCH,QAAQI,YAAY,kBAAmBD,IAAgB,IAC/E2C,OAAgC,SAACC,EAAKC,GAEjD,OADAD,EAAIC,EAAK9E,MAAmB,CAAE+E,MAAOD,EAAKC,MAAO3B,MAAO0B,EAAK1B,OACtDyB,CACR,EAAE,GACL"}
|
|
1
|
+
{"version":3,"file":"decorator.js","sources":["../../../src/form/decorator.ts"],"sourcesContent":["import 'reflect-metadata'\r\nimport { ComponentType } from 'react'\r\nimport { IFormInputBase } from './types'\r\nimport { IConfigValue, IFormValidatorConfig } from './validator'\r\n\r\nconst ClassRegistry = new Map<string, any>()\r\n\r\nexport function registerForm(name?: string) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n const key = name || constructor.name\r\n ClassRegistry.set(key, constructor)\r\n class RegisteredClass extends constructor {\r\n __class = key\r\n constructor(...args: any[]) {\r\n super(...args)\r\n this.__class = key\r\n }\r\n }\r\n Object.defineProperty(RegisteredClass, 'name', { value: constructor.name })\r\n Object.defineProperty(RegisteredClass, '__class', { value: key })\r\n return RegisteredClass\r\n }\r\n}\r\n\r\n/**\r\n * Check whether a class (constructor) or an instance has been registered\r\n * with the @registerForm decorator.\r\n *\r\n * Accepts:\r\n * - the decorated constructor (function)\r\n * - the original constructor (function)\r\n * - an instance of the class\r\n *\r\n * Returns true when the underlying registry contains an entry for the\r\n * class key (either the custom name provided to the decorator or the\r\n * constructor name).\r\n */\r\nexport function isFormRegistered(target: any): boolean {\r\n if (!target) return false\r\n const ctor = typeof target === 'function' ? target : target?.constructor\r\n if (!ctor) return false\r\n const key = (ctor as any).__class || (ctor as any).name\r\n if (!key) return false\r\n return ClassRegistry.has(key)\r\n}\r\n\r\nexport interface IPreSubmitMetadata<T = any> {\r\n handler: (data: T, oldData: T) => Promise<any> | any\r\n}\r\n\r\nexport function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n Reflect.defineMetadata('form:presubmit', { handler }, constructor)\r\n return constructor\r\n }\r\n}\r\n\r\nexport function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined {\r\n return Reflect.getMetadata('form:presubmit', targetClass)\r\n}\r\n\r\nexport interface IFieldMetadata<T = any, O = {}> {\r\n name: keyof T | string\r\n label?: string\r\n placeholder?: string\r\n defaultValue?: any\r\n type?: any\r\n size?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>>\r\n visible?: boolean | ((data?: T) => boolean)\r\n disabled?: boolean | ((data?: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport function formField(options: Omit<IFieldMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const designType = Reflect.getMetadata('design:type', target, propertyKey)\r\n const actualType = options.type || designType\r\n\r\n // Get existing fields metadata - use hasOwnMetadata to avoid parent pollution\r\n const isMetaData = Reflect.hasOwnMetadata('form:fields', target.constructor)\r\n const existing: IFieldMetadata[] = isMetaData ? Reflect.getOwnMetadata('form:fields', target.constructor) : []\r\n\r\n // Check if this field already exists (override case)\r\n const existingIndex = existing.findIndex((f) => f.name === propertyKey)\r\n\r\n // Get default value from property if not explicitly provided\r\n // Need to create a temporary instance to get the initialized value\r\n let defaultValue = options.defaultValue\r\n if (defaultValue === undefined) {\r\n try {\r\n const tempInstance = new (target.constructor as any)()\r\n defaultValue = tempInstance[propertyKey]\r\n } catch {\r\n // If constructor fails, use undefined\r\n defaultValue = undefined\r\n }\r\n }\r\n\r\n const newField: IFieldMetadata = { name: propertyKey, type: actualType, label: options.label || propertyKey, ...options, defaultValue }\r\n\r\n if (existingIndex >= 0) {\r\n // Override existing field, keep position\r\n existing[existingIndex] = newField\r\n Reflect.defineMetadata('form:fields', existing, target.constructor)\r\n } else {\r\n // New field, append to end\r\n const fields = [...existing, newField]\r\n Reflect.defineMetadata('form:fields', fields, target.constructor)\r\n }\r\n }\r\n}\r\n\r\nexport const getFormFields = (targetClass: any): IFieldMetadata[] => {\r\n // Get parent class\r\n const parentClass = Object.getPrototypeOf(targetClass)\r\n\r\n // Get parent fields recursively\r\n const parentFields: IFieldMetadata[] = parentClass && parentClass !== Function.prototype ? getFormFields(parentClass) : []\r\n\r\n // Get current class fields\r\n const currentFields: IFieldMetadata[] = Reflect.getMetadata('form:fields', targetClass) || []\r\n\r\n // If no parent, return current fields directly\r\n if (parentFields.length === 0) {\r\n return currentFields\r\n }\r\n\r\n // Merge parent and current fields\r\n // Start with parent fields as base\r\n const mergedFields = [...parentFields]\r\n const fieldNames = new Set(parentFields.map((f) => f.name.toString()))\r\n\r\n // Process current class fields\r\n currentFields.forEach((currentField) => {\r\n const fieldName = currentField.name.toString()\r\n\r\n if (fieldNames.has(fieldName)) {\r\n // Override parent field - find and replace it in place\r\n const index = mergedFields.findIndex((f) => f.name.toString() === fieldName)\r\n if (index >= 0) {\r\n mergedFields[index] = currentField\r\n }\r\n } else {\r\n // New field - append to end\r\n mergedFields.push(currentField)\r\n fieldNames.add(fieldName)\r\n }\r\n })\r\n\r\n return mergedFields\r\n}\r\n\r\nexport interface IValidationMetadata extends IConfigValue {\r\n name: string\r\n}\r\n\r\nexport function formValidate(options: Omit<IValidationMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const existing: IValidationMetadata[] = Reflect.getMetadata('form:validators', target.constructor) || []\r\n const validators = [...existing]\r\n validators.push({ name: propertyKey, ...options })\r\n Reflect.defineMetadata('form:validators', validators, target.constructor)\r\n }\r\n}\r\n\r\nexport function getFormValidators<T = any>(targetClass: any): IFormValidatorConfig<T> {\r\n const metas: IValidationMetadata[] = Reflect.getMetadata('form:validators', targetClass) || []\r\n return metas.reduce<IFormValidatorConfig<T>>((acc, curr) => {\r\n acc[curr.name as keyof T] = { Rules: curr.Rules, label: curr.label }\r\n return acc\r\n }, {})\r\n}\r\n"],"names":["ClassRegistry","Map","registerForm","name","constructor","key","set","RegisteredClass","_constructor","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","__class","_inherits","_createClass","Object","defineProperty","value","isFormRegistered","target","ctor","has","formPreSubmit","handler","Reflect","defineMetadata","getFormPreSubmit","targetClass","getMetadata","formField","options","propertyKey","designType","actualType","type","existing","hasOwnMetadata","getOwnMetadata","existingIndex","findIndex","f","defaultValue","undefined","_unused","newField","_objectSpread","label","fields","_toConsumableArray","getFormFields","parentClass","getPrototypeOf","parentFields","Function","prototype","currentFields","mergedFields","fieldNames","Set","map","toString","forEach","currentField","fieldName","index","push","add","formValidate","validators","getFormValidators","reduce","acc","curr","Rules"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{inherits as e,createClass as t,superPropGet as r,typeof as i,objectWithoutProperties as n,objectSpread2 as o,classCallCheck as a,callSuper as s,defineProperty as u}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,Fragment as c}from"react/jsx-runtime";import f from"events";import{forwardRef as v,useEffect as p}from"react";var g=["onClick","routeKey"],h=function(){function i(){var e;return a(this,i),e=s(this,i),u(e,"_createWrapListener",function(e){return function(){try{e.apply(void 0,arguments)}catch(e){console.error("Error in MfeBridge listener:",e)}}}),e}return e(i,f),t(i,[{key:"subscribe",value:function(e,t){var n=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?this._createWrapListener(t):t;return r(i,"addListener",this)([e,o]),function(){r(i,"removeListener",n)([e,o])}}}])}();function d(){if(void 0===("undefined"==typeof globalThis?"undefined":i(globalThis)))return null;void 0===globalThis.MfeNavigationEventStore&&(globalThis.MfeNavigationEventStore=new h);var e=globalThis.MfeNavigationEventStore;return e.setMaxListeners(50),e}var m=function(e){return p(function(){var t=d();if(t){var r=t.subscribe("navigation",function(t){e.navigation&&e.navigation(t.routeKey,t.options)});return function(){r()}}},[]),l(c,{})},b=v(function(e,t){var r=e.onClick,i=e.routeKey,a=n(e,g);return l("a",o(o({},
|
|
1
|
+
import{inherits as e,createClass as t,superPropGet as r,typeof as i,objectWithoutProperties as n,objectSpread2 as o,classCallCheck as a,callSuper as s,defineProperty as u}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,Fragment as c}from"react/jsx-runtime";import f from"events";import{forwardRef as v,useEffect as p}from"react";var g=["onClick","routeKey","site"],h=function(){function i(){var e;return a(this,i),e=s(this,i),u(e,"_createWrapListener",function(e){return function(){try{e.apply(void 0,arguments)}catch(e){console.error("Error in MfeBridge listener:",e)}}}),e}return e(i,f),t(i,[{key:"subscribe",value:function(e,t){var n=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?this._createWrapListener(t):t;return r(i,"addListener",this)([e,o]),function(){r(i,"removeListener",n)([e,o])}}}])}();function d(){if(void 0===("undefined"==typeof globalThis?"undefined":i(globalThis)))return null;void 0===globalThis.MfeNavigationEventStore&&(globalThis.MfeNavigationEventStore=new h);var e=globalThis.MfeNavigationEventStore;return e.setMaxListeners(50),e}var m=function(e){return p(function(){var t=d();if(t){var r=t.subscribe("navigation",function(t){e.navigation&&e.navigation(t.routeKey,t.options)});return function(){r()}}},[]),l(c,{})},b=v(function(e,t){var r=e.onClick,i=e.routeKey,a=e.site,s=n(e,g);return l("a",o(o({},s),{},{ref:t,onClick:function(e){if(r&&r(e),!e.defaultPrevented){var t=d();if(t&&i){e.preventDefault(),e.stopPropagation();var n=s.target,o=s.rel,u=s.href,l={message:"Link clicked"};n&&(l.target=n),o&&(l.rel=o),u&&(l.href=u),a&&(l.site=a),t.emit("navigation",{routeKey:i,options:l})}}}}))}),y=function(e,t){var r=d();r&&r.emit("navigation",{routeKey:e,options:o({message:"Navigating to ".concat(e)},t)})};export{b as MfeLink,h as MfeNavigationEventStore,m as MfeNavigationProvider,d as getMfeNavigationEventStore,y as mfeNavigation};
|
|
2
2
|
//# sourceMappingURL=navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sources":["../../../src/mfe-shared/navigation.tsx"],"sourcesContent":["import EventEmitter from 'events'\r\nimport { FC, forwardRef, useEffect } from 'react'\r\n\r\ninterface IEventOptions {\r\n message?: string\r\n href?: string\r\n target?: string\r\n rel?: string\r\n}\r\n\r\nexport interface IMfeNavigationEventConfigs {\r\n navigation: [{ routeKey?: string; options?: IEventOptions }]\r\n}\r\n\r\nexport class MfeNavigationEventStore extends EventEmitter<IMfeNavigationEventConfigs> {\r\n constructor() {\r\n super()\r\n }\r\n /**\r\n * Subscribe to a specific channel\r\n * @param channel The channel to subscribe to\r\n * @param callback Function to call when an event occurs on this channel\r\n * @returns Unsubscribe function to remove the event listener\r\n */\r\n _createWrapListener = (callback: (...payload: any[]) => void) => {\r\n return (...payload: any[]) => {\r\n try {\r\n callback(...payload)\r\n } catch (error) {\r\n console.error('Error in MfeBridge listener:', error)\r\n }\r\n }\r\n }\r\n subscribe<K extends keyof IMfeNavigationEventConfigs>(\r\n eventName: K,\r\n listener: K extends keyof IMfeNavigationEventConfigs\r\n ? IMfeNavigationEventConfigs[K] extends unknown[]\r\n ? (...args: IMfeNavigationEventConfigs[K]) => void\r\n : never\r\n : never,\r\n isTry: boolean = true\r\n ) {\r\n const action = isTry ? this._createWrapListener(listener) : listener\r\n super.addListener(eventName, action as any)\r\n return () => {\r\n super.removeListener(eventName, action as any)\r\n }\r\n }\r\n}\r\n\r\nexport function getMfeNavigationEventStore() {\r\n if (typeof globalThis === undefined) return null\r\n\r\n if (typeof (globalThis as any).MfeNavigationEventStore === 'undefined') {\r\n // If MfeNavigationEventStore is not defined globally, define it\r\n // This allows it to be used in other parts of the application\r\n // without needing to import it explicitly\r\n ;(globalThis as any).MfeNavigationEventStore = new MfeNavigationEventStore()\r\n }\r\n const eventEmitter = (globalThis as any).MfeNavigationEventStore as MfeNavigationEventStore\r\n eventEmitter.setMaxListeners(50)\r\n return eventEmitter\r\n}\r\n\r\ntype INavigationFunction = (routeKey?: string, options?: IEventOptions) => void\r\n\r\nexport interface IMfeNavigationProviderProps {\r\n navigation?: INavigationFunction\r\n}\r\n\r\nexport const MfeNavigationProvider: FC<IMfeNavigationProviderProps> = (props) => {\r\n useEffect(() => {\r\n const eventStore = getMfeNavigationEventStore()\r\n if (!eventStore) return\r\n\r\n const unsubscribe = eventStore.subscribe('navigation', (payload) => {\r\n if (props.navigation) {\r\n props.navigation(payload.routeKey, payload.options)\r\n }\r\n })\r\n\r\n return () => {\r\n unsubscribe()\r\n }\r\n }, [])\r\n\r\n return <></>\r\n}\r\n\r\nexport interface IMfeLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\r\n routeKey?: string\r\n}\r\n\r\nexport const MfeLink = forwardRef<HTMLAnchorElement, IMfeLinkProps>(({ onClick, routeKey, ...props }, ref) => {\r\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\r\n if (onClick) {\r\n onClick(event)\r\n }\r\n if (event.defaultPrevented) {\r\n return // nothing to do if event already handled\r\n }\r\n const eventStore = getMfeNavigationEventStore()\r\n if (eventStore && !!routeKey) {\r\n event.preventDefault() // Prevent default link behavior\r\n event.stopPropagation() // Stop the event from bubbling up\r\n const { target, rel, href } = props\r\n const options: IEventOptions = { message: 'Link clicked' }\r\n if (target) options.target = target\r\n if (rel) options.rel = rel\r\n if (href) options.href = href\r\n eventStore.emit('navigation', { routeKey: routeKey, options })\r\n }\r\n }\r\n return <a {...props} ref={ref} onClick={handleClick} />\r\n})\r\n\r\nexport const mfeNavigation = (routeKey: string, options?: IEventOptions) => {\r\n const eventStore = getMfeNavigationEventStore()\r\n if (eventStore) {\r\n eventStore.emit('navigation', { routeKey: routeKey, options: { message: `Navigating to ${routeKey}`, ...options } })\r\n }\r\n}\r\n"],"names":["MfeNavigationEventStore","_this","_classCallCheck","_callSuper","this","_defineProperty","callback","apply","arguments","error","console","_inherits","EventEmitter","_createClass","key","value","eventName","listener","_this2","action","_createWrapListener","_superPropGet","getMfeNavigationEventStore","undefined","globalThis","_typeof","eventEmitter","setMaxListeners","MfeNavigationProvider","props","useEffect","eventStore","unsubscribe","subscribe","payload","navigation","routeKey","options","_jsx","MfeLink","forwardRef","_ref","ref","onClick","_objectWithoutProperties","_excluded","_objectSpread","event","defaultPrevented","preventDefault","stopPropagation","target","rel","href","message","emit","mfeNavigation","concat"],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigation.js","sources":["../../../src/mfe-shared/navigation.tsx"],"sourcesContent":["import EventEmitter from 'events'\r\nimport { FC, forwardRef, useEffect } from 'react'\r\n\r\nexport type TSite = 'admin' | 'client' | 'music' | 'home' | (string & {})\r\n\r\ninterface IEventOptions {\r\n message?: string\r\n href?: string\r\n target?: string\r\n rel?: string\r\n site?: TSite\r\n}\r\n\r\nexport interface IMfeNavigationEventConfigs {\r\n navigation: [{ routeKey?: string; options?: IEventOptions }]\r\n}\r\n\r\nexport class MfeNavigationEventStore extends EventEmitter<IMfeNavigationEventConfigs> {\r\n constructor() {\r\n super()\r\n }\r\n /**\r\n * Subscribe to a specific channel\r\n * @param channel The channel to subscribe to\r\n * @param callback Function to call when an event occurs on this channel\r\n * @returns Unsubscribe function to remove the event listener\r\n */\r\n _createWrapListener = (callback: (...payload: any[]) => void) => {\r\n return (...payload: any[]) => {\r\n try {\r\n callback(...payload)\r\n } catch (error) {\r\n console.error('Error in MfeBridge listener:', error)\r\n }\r\n }\r\n }\r\n subscribe<K extends keyof IMfeNavigationEventConfigs>(\r\n eventName: K,\r\n listener: K extends keyof IMfeNavigationEventConfigs\r\n ? IMfeNavigationEventConfigs[K] extends unknown[]\r\n ? (...args: IMfeNavigationEventConfigs[K]) => void\r\n : never\r\n : never,\r\n isTry: boolean = true\r\n ) {\r\n const action = isTry ? this._createWrapListener(listener) : listener\r\n super.addListener(eventName, action as any)\r\n return () => {\r\n super.removeListener(eventName, action as any)\r\n }\r\n }\r\n}\r\n\r\nexport function getMfeNavigationEventStore() {\r\n if (typeof globalThis === undefined) return null\r\n\r\n if (typeof (globalThis as any).MfeNavigationEventStore === 'undefined') {\r\n // If MfeNavigationEventStore is not defined globally, define it\r\n // This allows it to be used in other parts of the application\r\n // without needing to import it explicitly\r\n ;(globalThis as any).MfeNavigationEventStore = new MfeNavigationEventStore()\r\n }\r\n const eventEmitter = (globalThis as any).MfeNavigationEventStore as MfeNavigationEventStore\r\n eventEmitter.setMaxListeners(50)\r\n return eventEmitter\r\n}\r\n\r\ntype INavigationFunction = (routeKey?: string, options?: IEventOptions) => void\r\n\r\nexport interface IMfeNavigationProviderProps {\r\n navigation?: INavigationFunction\r\n}\r\n\r\nexport const MfeNavigationProvider: FC<IMfeNavigationProviderProps> = (props) => {\r\n useEffect(() => {\r\n const eventStore = getMfeNavigationEventStore()\r\n if (!eventStore) return\r\n\r\n const unsubscribe = eventStore.subscribe('navigation', (payload) => {\r\n if (props.navigation) {\r\n props.navigation(payload.routeKey, payload.options)\r\n }\r\n })\r\n\r\n return () => {\r\n unsubscribe()\r\n }\r\n }, [])\r\n\r\n return <></>\r\n}\r\n\r\nexport interface IMfeLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\r\n routeKey?: string\r\n site?: TSite\r\n}\r\n\r\nexport const MfeLink = forwardRef<HTMLAnchorElement, IMfeLinkProps>(({ onClick, routeKey, site, ...props }, ref) => {\r\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\r\n if (onClick) {\r\n onClick(event)\r\n }\r\n if (event.defaultPrevented) {\r\n return // nothing to do if event already handled\r\n }\r\n const eventStore = getMfeNavigationEventStore()\r\n if (eventStore && !!routeKey) {\r\n event.preventDefault() // Prevent default link behavior\r\n event.stopPropagation() // Stop the event from bubbling up\r\n const { target, rel, href } = props\r\n const options: IEventOptions = { message: 'Link clicked' }\r\n if (target) options.target = target\r\n if (rel) options.rel = rel\r\n if (href) options.href = href\r\n if (site) options.site = site\r\n eventStore.emit('navigation', { routeKey: routeKey, options })\r\n }\r\n }\r\n return <a {...props} ref={ref} onClick={handleClick} />\r\n})\r\n\r\nexport const mfeNavigation = (routeKey: string, options?: IEventOptions) => {\r\n const eventStore = getMfeNavigationEventStore()\r\n if (eventStore) {\r\n eventStore.emit('navigation', { routeKey: routeKey, options: { message: `Navigating to ${routeKey}`, ...options } })\r\n }\r\n}\r\n"],"names":["MfeNavigationEventStore","_this","_classCallCheck","_callSuper","this","_defineProperty","callback","apply","arguments","error","console","_inherits","EventEmitter","_createClass","key","value","eventName","listener","_this2","action","_createWrapListener","_superPropGet","getMfeNavigationEventStore","undefined","globalThis","_typeof","eventEmitter","setMaxListeners","MfeNavigationProvider","props","useEffect","eventStore","unsubscribe","subscribe","payload","navigation","routeKey","options","_jsx","MfeLink","forwardRef","_ref","ref","onClick","site","_objectWithoutProperties","_excluded","_objectSpread","event","defaultPrevented","preventDefault","stopPropagation","target","rel","href","message","emit","mfeNavigation","concat"],"mappings":"+XAiBaA,aACX,SAAAA,IAAA,IAAAC,EAiBC,OAjBDC,OAAAF,GACEC,EAAAE,EAAAC,KAAAJ,GAEFK,EAAAJ,EAMsB,sBAAA,SAACK,GACrB,OAAO,WACL,IACEA,EAAQC,WAAAC,EAAAA,UACT,CAAC,MAAOC,GACPC,QAAQD,MAAM,+BAAgCA,EAC/C,CACF,IACFR,CAfD,CAAC,OAAAU,EAAAX,EAH0CY,GAG1CC,EAAAb,EAAA,CAAA,CAAAc,IAAA,YAAAC,MAgBD,SACEC,EACAC,GAKqB,IAAAC,EAAAd,KAEfe,6DAAiBf,KAAKgB,oBAAoBH,GAAYA,EAE5D,OADAI,EAAArB,EAAkBgB,cAAAA,KAAlBK,CAAkBL,CAAAA,EAAWG,IACtB,WACLE,EAAArB,EAAA,iBAAAkB,EAAAG,CAAqBL,CAAAA,EAAWG,GACjC,CACH,IAAC,aAGaG,IACd,QAA0BC,KAAL,oBAAVC,WAAU,YAAAC,EAAVD,aAA0B,OAAO,UAEe,IAA/CA,WAAmBxB,0BAI3BwB,WAAmBxB,wBAA0B,IAAIA,GAErD,IAAM0B,EAAgBF,WAAmBxB,wBAEzC,OADA0B,EAAaC,gBAAgB,IACtBD,CACT,KAQaE,EAAyD,SAACC,GAgBrE,OAfAC,EAAU,WACR,IAAMC,EAAaT,IACnB,GAAKS,EAAL,CAEA,IAAMC,EAAcD,EAAWE,UAAU,aAAc,SAACC,GAClDL,EAAMM,YACRN,EAAMM,WAAWD,EAAQE,SAAUF,EAAQG,QAE/C,GAEA,OAAO,WACLL,GACD,CAVgB,CAWlB,EAAE,IAEIM,OACT,EAOaC,EAAUC,EAA6C,SAAAC,EAAwCC,GAAO,IAA5CC,EAAOF,EAAPE,QAASP,EAAQK,EAARL,SAAUQ,EAAIH,EAAJG,KAASf,EAAKgB,EAAAJ,EAAAK,GAqBtG,OAAOR,EAAA,IAAAS,EAAAA,KAAOlB,GAAK,GAAA,CAAEa,IAAKA,EAAKC,QApBX,SAACK,GAInB,GAHIL,GACFA,EAAQK,IAENA,EAAMC,iBAAV,CAGA,IAAMlB,EAAaT,IACnB,GAAIS,GAAgBK,EAAU,CAC5BY,EAAME,iBACNF,EAAMG,kBACN,IAAQC,EAAsBvB,EAAtBuB,OAAQC,EAAcxB,EAAdwB,IAAKC,EAASzB,EAATyB,KACfjB,EAAyB,CAAEkB,QAAS,gBACtCH,IAAQf,EAAQe,OAASA,GACzBC,IAAKhB,EAAQgB,IAAMA,GACnBC,IAAMjB,EAAQiB,KAAOA,GACrBV,IAAMP,EAAQO,KAAOA,GACzBb,EAAWyB,KAAK,aAAc,CAAEpB,SAAUA,EAAUC,QAAAA,GACrD,CAZA,CAaF,IAEH,GAEaoB,EAAgB,SAACrB,EAAkBC,GAC9C,IAAMN,EAAaT,IACfS,GACFA,EAAWyB,KAAK,aAAc,CAAEpB,SAAUA,EAAUC,QAAOU,EAAA,CAAIQ,QAAO,iBAAAG,OAAmBtB,IAAeC,IAE5G"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectWithoutProperties as
|
|
1
|
+
import{objectWithoutProperties as r,objectSpread2 as e,slicedToArray as i}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as a,jsxs as l}from"react/jsx-runtime";import{useState as n,useEffect as o}from"react";import{styled as c,Typography as p,Box as m,Chip as s,Tooltip as u,IconButton as d,Divider as f}from"@mui/material";import v from"@mui/icons-material/OpenInNew";import{mergeObjects as g}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{HelpTooltipWrap as h}from"../components/help-tooltip.js";import{CopyToClipboard as x}from"../components/copy-to-clipboard.js";import b from"dayjs";var y=["children"],k=function(r,i){return function(l){var n,o,c,p,m;return l.value?t(j,e(e({onClick:l.onClick},null===(n=l.slots)||void 0===n?void 0:n.typographyProps),{},{sx:(c=l.value,p=l.sx,m=l.slots,Object.assign({},c?r[c]:{},null==i?void 0:i.sx,p,null==m||null===(o=m.typographyProps)||void 0===o?void 0:o.sx)),children:l.title||l.value})):t(a,{})}},j=c(p)({borderRadius:"4px",fontSize:"0.8rem",padding:"4px 9px",fontWeight:600,minWidth:"70px",textAlign:"center",color:"#ffffff",display:"inline-block"}),w=function(r){var e,a=n(null!==(e=r.imageUri)&&void 0!==e?e:r.fallbackSrc),c=i(a,2),s=c[0],u=c[1];return o(function(){var e;u(null!==(e=r.imageUri)&&void 0!==e?e:r.fallbackSrc)},[r.imageUri,r.fallbackSrc]),l(m,{sx:{display:"flex",alignItems:"center",height:"100%",gap:"10px"},children:[t(F,{src:s,onError:function(){return u(r.fallbackSrc)}}),t(p,{variant:"body1",children:r.value})]})},S=function(r){var e,a=n(null!==(e=r.imageUri)&&void 0!==e?e:r.imageFallback),l=i(a,2),c=l[0],p=l[1];return o(function(){var e;p(null!==(e=r.imageUri)&&void 0!==e?e:r.imageFallback)},[r.imageUri,r.imageFallback]),t(F,{src:c,onError:function(){return p(r.imageFallback)},sx:r.sx})},F=c("img")({backgroundRepeat:"no-repeat",height:"50px",width:"50px",backgroundSize:"contain",borderRadius:"8px",boxShadow:"rgba(0, 0, 0, 0.16) 0px 1px 4px"}),U=function(r){var i,a=null!==(i=r.valueFormatted)&&void 0!==i?i:r.value,n=!!r.copyToClipboard&&!!a;return l(W,e(e({title:a},r.wrapProps),{},{children:[!!r.imageUrl&&t(S,{imageUri:r.imageUrl,sx:{mr:"10px"},imageFallback:r.imageFallbackSrc}),!!r.icon&&r.icon,t(p,e(e({variant:"body2",component:"span",noWrap:!0,sx:{flex:1}},r.typographyProps),{},{children:a})),a&&!0===r.openInNewTab&&t(u,{arrow:!0,title:"Open new tab",children:t(d,{component:"a",href:a,target:"_blank",children:t(v,{fontSize:"small",sx:{color:"#1A75E2"}})})}),n&&t(x,{value:a}),a&&!0===r.beforeLine&&t(f,{flexItem:!0,variant:"middle",orientation:"vertical"})]}))},W=c(function(i){var a=i.children,l=r(i,y);return t(m,e(e({},l),{},{children:t("div",{children:a})}))})({flex:1,width:"100%",height:"100%",position:"relative",top:0,left:0,"& > div":{display:"flex",alignItems:"center",width:"100%",height:"100%",position:"absolute",top:0,left:0}}),I=function(r){var e,i;if("string"!=typeof r.value)return null!==(e=r.value)&&void 0!==e?e:t(a,{});var n=r.value.split(null!==(i=null==r?void 0:r.separator)&&void 0!==i?i:"|").filter(function(r){return!!r}),o=null!=r&&r.maximum?n.slice(0,r.maximum):n,c=null!=r&&r.maximum&&n.length>r.maximum?n.length-r.maximum:0;return l(m,{sx:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"4px",height:"100%"},children:[o.map(function(e,i){return t(P,{label:r.valueFormatter?r.valueFormatter(e):e,size:"small"},"key"+i)}),c>0&&t(h,{title:"Artists",content:t(m,{sx:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"4px"},children:n.map(function(r,e){return t(P,{label:r,size:"small"},"key"+e)})}),children:t(P,{label:"+".concat(c),size:"small"},"remaining")})]})},P=c(s)({lineHeight:1}),z=function(r){try{var i,a,l=null!==(i=null==r?void 0:r.showRelative)&&void 0!==i&&i,n=b(r.value),o=n.format(r.formatString),c=l?"".concat(o," (").concat(b().to(n),")"):o,m=r.styledGetter?r.styledGetter(r.value):{flex:1},s=g({},null!==(a=r.typographyProps)&&void 0!==a?a:{},{sx:m});return t(p,e(e({variant:"body2",component:"span",noWrap:!0,title:"".concat(c," formatted with ").concat(r.formatString)},s),{},{children:c}))}catch(r){return t(p,{variant:"body2",component:"span",noWrap:!0,children:"format invalid"})}};export{U as CellBase,I as CellChips,z as CellDate,w as CellImageSmall,k as CreateStatusCell,S as ImageSmallFallback};
|
|
2
2
|
//# sourceMappingURL=ui.units.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.units.js","sources":["../../../src/table/ui.units.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\nimport { Box, BoxProps, Chip, Divider, IconButton, styled, SxProps, Theme, Tooltip, Typography, TypographyProps } from '@mui/material'\r\nimport type { ComponentType, FC, PropsWithChildren, ReactNode } from 'react'\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\r\nimport { dayjsCustom, mergeObjects } from '../utils'\r\nimport { CopyToClipboard, HelpTooltipWrap } from '../components'\r\n\r\n//#region CellImageSmall\r\nexport type IStatusCellConfig<T extends string> = { [key in T]: SxProps<Theme> }\r\n\r\nexport interface IStatusCellOptions {\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport interface IStatusCellProps<T extends string> extends PropsWithChildren {\r\n value?: T\r\n title?: string\r\n sx?: SxProps<Theme>\r\n onClick?: TypographyProps['onClick']\r\n slots?: {\r\n typographyProps?: TypographyProps\r\n }\r\n}\r\n\r\nexport const CreateStatusCell = function <T extends string>(\r\n config: IStatusCellConfig<T>,\r\n options?: IStatusCellOptions\r\n): ComponentType<IStatusCellProps<T>> {\r\n const StatusCell: FC<IStatusCellProps<T>> = (props) => {\r\n const getSxProps = (): SxProps<Theme> => {\r\n const { value: data, sx, slots } = props\r\n return Object.assign({}, data ? config[data] : {}, options?.sx, sx, slots?.typographyProps?.sx)\r\n }\r\n\r\n if (!props.value) return <></>\r\n return (\r\n <CustomTypography onClick={props.onClick} {...props.slots?.typographyProps} sx={getSxProps()}>\r\n {props.title || props.value}\r\n </CustomTypography>\r\n )\r\n }\r\n return StatusCell\r\n}\r\n\r\nconst CustomTypography = styled(Typography)({\r\n borderRadius: '4px',\r\n fontSize: '0.8rem',\r\n padding: '4px 9px',\r\n fontWeight: 600,\r\n minWidth: '70px',\r\n textAlign: 'center',\r\n color: '#ffffff',\r\n display: 'inline-block'\r\n})\r\n\r\n//#region CellImageSmall\r\ninterface CellImageSmallProps {\r\n value: string\r\n imageUri?: string\r\n fallbackSrc?: string\r\n}\r\n\r\nexport const CellImageSmall: FC<CellImageSmallProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.fallbackSrc)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.fallbackSrc)\r\n }, [props.imageUri, props.fallbackSrc])\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', height: '100%', gap: '10px' }}>\r\n <ImageSmall src={imgSrc} onError={() => setImgSrc(props.fallbackSrc)} />\r\n <Typography variant='body1'>{props.value}</Typography>\r\n </Box>\r\n )\r\n}\r\n\r\ninterface ImageSmallFallbackProps {\r\n imageUri?: string\r\n imageFallback?: string\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport const ImageSmallFallback: FC<ImageSmallFallbackProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.imageFallback)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.imageFallback)\r\n }, [props.imageUri, props.imageFallback])\r\n return <ImageSmall src={imgSrc} onError={() => setImgSrc(props.imageFallback)} sx={props.sx} />\r\n}\r\n\r\nconst ImageSmall = styled('img')({\r\n backgroundRepeat: 'no-repeat',\r\n height: '50px',\r\n width: '50px',\r\n backgroundSize: 'contain',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px'\r\n})\r\n//#endregion\r\n\r\n//#region CellBase\r\n\r\nexport interface CellBaseOptions {\r\n openInNewTab?: boolean\r\n beforeLine?: boolean\r\n copyToClipboard?: boolean\r\n icon?: ReactNode\r\n imageUrl?: string\r\n imageFallbackSrc?: string\r\n valueFormatter?: (value?: string) => string\r\n wrapProps?: BoxProps & { [key: string]: any }\r\n typographyProps?: TypographyProps & { [key: string]: any }\r\n}\r\n\r\ninterface CellBaseProps extends CellBaseOptions {\r\n value?: string\r\n valueFormatted?: string\r\n}\r\n\r\nexport const CellBase: FC<CellBaseProps> = (props) => {\r\n const value = props.valueFormatted ?? props.value\r\n const isCopyToClipboard = !!props.copyToClipboard && !!value\r\n return (\r\n <CellBaseWrap title={value} {...props.wrapProps}>\r\n {!!props.imageUrl && <ImageSmallFallback imageUri={props.imageUrl} sx={{ mr: '10px' }} imageFallback={props.imageFallbackSrc} />}\r\n {!!props.icon && props.icon}\r\n <Typography variant='body2' component='span' noWrap sx={{ flex: 1 }} {...props.typographyProps}>\r\n {value}\r\n </Typography>\r\n {value && props.openInNewTab === true && (\r\n <Tooltip arrow title='Open new tab'>\r\n <IconButton component='a' href={value} target='_blank'>\r\n <OpenInNewIcon fontSize='small' sx={{ color: '#1A75E2' }} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {isCopyToClipboard && <CopyToClipboard value={value} />}\r\n {value && props.beforeLine === true && <Divider flexItem variant='middle' orientation='vertical' />}\r\n </CellBaseWrap>\r\n )\r\n}\r\n\r\nconst CellBaseWrap = styled(({ children, ...props }: BoxProps) => (\r\n <Box {...props}>\r\n <div>{children}</div>\r\n </Box>\r\n))({\r\n flex: 1,\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n top: 0,\r\n left: 0,\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Chips\r\nexport interface CellChipsProps {\r\n value?: string\r\n valueFormatter?: (value: string) => string\r\n separator?: string\r\n maximum?: number\r\n}\r\n\r\nexport const CellChips: FC<CellChipsProps> = (props) => {\r\n if (typeof props.value !== 'string') return props.value ?? <></>\r\n\r\n const list = props.value.split(props?.separator ?? '|').filter((x) => !!x)\r\n const displayList = props?.maximum ? list.slice(0, props.maximum) : list\r\n const remainingCount = props?.maximum && list.length > props.maximum ? list.length - props.maximum : 0\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px', height: '100%' }}>\r\n {displayList.map((x, i) => (\r\n <CustomChip key={'key' + i} label={props.valueFormatter ? props.valueFormatter(x) : x} size='small' />\r\n ))}\r\n {remainingCount > 0 && (\r\n <HelpTooltipWrap\r\n title='Artists'\r\n content={\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px' }}>\r\n {list.map((x, i) => (\r\n <CustomChip key={'key' + i} label={x} size='small' />\r\n ))}\r\n </Box>\r\n }\r\n >\r\n <CustomChip key='remaining' label={`+${remainingCount}`} size='small' />\r\n </HelpTooltipWrap>\r\n )}\r\n </Box>\r\n )\r\n}\r\n\r\nconst CustomChip = styled(Chip)({\r\n lineHeight: 1\r\n})\r\n//#endregion\r\n\r\n//#region Date\r\nexport interface CellDatePropsOwner {\r\n formatString?: string\r\n showRelative?: boolean\r\n typographyProps?: TypographyProps\r\n styledGetter?: (value: any) => SxProps<Theme>\r\n}\r\nexport interface CellDateProps extends CellDatePropsOwner {\r\n value: any\r\n}\r\n\r\nexport const CellDate: FC<CellDateProps> = (props) => {\r\n try {\r\n const showRelative = props?.showRelative ?? false\r\n const date = dayjsCustom(props.value)\r\n const formatted = date.format(props.formatString)\r\n const value = showRelative ? `${formatted} (${dayjsCustom().to(date)})` : formatted\r\n const sx = props.styledGetter ? props.styledGetter(props.value) : { flex: 1 }\r\n const mergeTypographyProps = mergeObjects<TypographyProps>({}, props.typographyProps ?? {}, { sx })\r\n return (\r\n <Typography variant='body2' component='span' noWrap {...mergeTypographyProps}>\r\n {value}\r\n </Typography>\r\n )\r\n } catch {\r\n return (\r\n <Typography variant='body2' component='span' noWrap>\r\n format invalid\r\n </Typography>\r\n )\r\n }\r\n}\r\n//#endregion\r\n"],"names":["CreateStatusCell","config","options","props","_props$slots","_slots$typographyProp","data","sx","slots","value","_jsx","CustomTypography","_objectSpread","onClick","typographyProps","Object","assign","children","title","styled","Typography","borderRadius","fontSize","padding","fontWeight","minWidth","textAlign","color","display","CellImageSmall","_props$imageUri","_useState","useState","imageUri","fallbackSrc","_useState2","_slicedToArray","imgSrc","setImgSrc","useEffect","_props$imageUri2","_jsxs","Box","alignItems","height","gap","ImageSmall","src","onError","variant","ImageSmallFallback","_props$imageUri3","_useState3","imageFallback","_useState4","_props$imageUri4","backgroundRepeat","width","backgroundSize","boxShadow","CellBase","_props$valueFormatted","valueFormatted","isCopyToClipboard","copyToClipboard","CellBaseWrap","wrapProps","imageUrl","mr","imageFallbackSrc","icon","component","noWrap","flex","openInNewTab","Tooltip","arrow","IconButton","href","target","OpenInNewIcon","CopyToClipboard","beforeLine","Divider","flexItem","orientation","_ref","_objectWithoutProperties","_excluded","position","top","left","CellChips","_props$value","_props$separator","list","split","separator","filter","x","displayList","maximum","slice","remainingCount","length","flexWrap","map","i","CustomChip","label","valueFormatter","size","HelpTooltipWrap","content","concat","Chip","lineHeight","CellDate","_props$showRelative","_props$typographyProp","showRelative","date","dayjsCustom","formatted","format","formatString","to","styledGetter","mergeTypographyProps","mergeObjects","_unused"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.units.js","sources":["../../../src/table/ui.units.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\nimport { Box, BoxProps, Chip, Divider, IconButton, styled, SxProps, Theme, Tooltip, Typography, TypographyProps } from '@mui/material'\r\nimport type { ComponentType, FC, PropsWithChildren, ReactNode } from 'react'\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\r\nimport { dayjsCustom, mergeObjects } from '../utils'\r\nimport { CopyToClipboard, HelpTooltipWrap } from '../components'\r\n\r\n//#region CellImageSmall\r\nexport type IStatusCellConfig<T extends string> = { [key in T]: SxProps<Theme> }\r\n\r\nexport interface IStatusCellOptions {\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport interface IStatusCellProps<T extends string> extends PropsWithChildren {\r\n value?: T\r\n title?: string\r\n sx?: SxProps<Theme>\r\n onClick?: TypographyProps['onClick']\r\n slots?: {\r\n typographyProps?: TypographyProps\r\n }\r\n}\r\n\r\nexport const CreateStatusCell = function <T extends string>(\r\n config: IStatusCellConfig<T>,\r\n options?: IStatusCellOptions\r\n): ComponentType<IStatusCellProps<T>> {\r\n const StatusCell: FC<IStatusCellProps<T>> = (props) => {\r\n const getSxProps = (): SxProps<Theme> => {\r\n const { value: data, sx, slots } = props\r\n return Object.assign({}, data ? config[data] : {}, options?.sx, sx, slots?.typographyProps?.sx)\r\n }\r\n\r\n if (!props.value) return <></>\r\n return (\r\n <CustomTypography onClick={props.onClick} {...props.slots?.typographyProps} sx={getSxProps()}>\r\n {props.title || props.value}\r\n </CustomTypography>\r\n )\r\n }\r\n return StatusCell\r\n}\r\n\r\nconst CustomTypography = styled(Typography)({\r\n borderRadius: '4px',\r\n fontSize: '0.8rem',\r\n padding: '4px 9px',\r\n fontWeight: 600,\r\n minWidth: '70px',\r\n textAlign: 'center',\r\n color: '#ffffff',\r\n display: 'inline-block'\r\n})\r\n\r\n//#region CellImageSmall\r\ninterface CellImageSmallProps {\r\n value: string\r\n imageUri?: string\r\n fallbackSrc?: string\r\n}\r\n\r\nexport const CellImageSmall: FC<CellImageSmallProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.fallbackSrc)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.fallbackSrc)\r\n }, [props.imageUri, props.fallbackSrc])\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', height: '100%', gap: '10px' }}>\r\n <ImageSmall src={imgSrc} onError={() => setImgSrc(props.fallbackSrc)} />\r\n <Typography variant='body1'>{props.value}</Typography>\r\n </Box>\r\n )\r\n}\r\n\r\ninterface ImageSmallFallbackProps {\r\n imageUri?: string\r\n imageFallback?: string\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport const ImageSmallFallback: FC<ImageSmallFallbackProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.imageFallback)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.imageFallback)\r\n }, [props.imageUri, props.imageFallback])\r\n return <ImageSmall src={imgSrc} onError={() => setImgSrc(props.imageFallback)} sx={props.sx} />\r\n}\r\n\r\nconst ImageSmall = styled('img')({\r\n backgroundRepeat: 'no-repeat',\r\n height: '50px',\r\n width: '50px',\r\n backgroundSize: 'contain',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px'\r\n})\r\n//#endregion\r\n\r\n//#region CellBase\r\n\r\nexport interface CellBaseOptions {\r\n openInNewTab?: boolean\r\n beforeLine?: boolean\r\n copyToClipboard?: boolean\r\n icon?: ReactNode\r\n imageUrl?: string\r\n imageFallbackSrc?: string\r\n valueFormatter?: (value?: string) => string\r\n wrapProps?: BoxProps & { [key: string]: any }\r\n typographyProps?: TypographyProps & { [key: string]: any }\r\n}\r\n\r\ninterface CellBaseProps extends CellBaseOptions {\r\n value?: string\r\n valueFormatted?: string\r\n}\r\n\r\nexport const CellBase: FC<CellBaseProps> = (props) => {\r\n const value = props.valueFormatted ?? props.value\r\n const isCopyToClipboard = !!props.copyToClipboard && !!value\r\n return (\r\n <CellBaseWrap title={value} {...props.wrapProps}>\r\n {!!props.imageUrl && <ImageSmallFallback imageUri={props.imageUrl} sx={{ mr: '10px' }} imageFallback={props.imageFallbackSrc} />}\r\n {!!props.icon && props.icon}\r\n <Typography variant='body2' component='span' noWrap sx={{ flex: 1 }} {...props.typographyProps}>\r\n {value}\r\n </Typography>\r\n {value && props.openInNewTab === true && (\r\n <Tooltip arrow title='Open new tab'>\r\n <IconButton component='a' href={value} target='_blank'>\r\n <OpenInNewIcon fontSize='small' sx={{ color: '#1A75E2' }} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {isCopyToClipboard && <CopyToClipboard value={value} />}\r\n {value && props.beforeLine === true && <Divider flexItem variant='middle' orientation='vertical' />}\r\n </CellBaseWrap>\r\n )\r\n}\r\n\r\nconst CellBaseWrap = styled(({ children, ...props }: BoxProps) => (\r\n <Box {...props}>\r\n <div>{children}</div>\r\n </Box>\r\n))({\r\n flex: 1,\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n top: 0,\r\n left: 0,\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Chips\r\nexport interface CellChipsProps {\r\n value?: string\r\n valueFormatter?: (value: string) => string\r\n separator?: string\r\n maximum?: number\r\n}\r\n\r\nexport const CellChips: FC<CellChipsProps> = (props) => {\r\n if (typeof props.value !== 'string') return props.value ?? <></>\r\n\r\n const list = props.value.split(props?.separator ?? '|').filter((x) => !!x)\r\n const displayList = props?.maximum ? list.slice(0, props.maximum) : list\r\n const remainingCount = props?.maximum && list.length > props.maximum ? list.length - props.maximum : 0\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px', height: '100%' }}>\r\n {displayList.map((x, i) => (\r\n <CustomChip key={'key' + i} label={props.valueFormatter ? props.valueFormatter(x) : x} size='small' />\r\n ))}\r\n {remainingCount > 0 && (\r\n <HelpTooltipWrap\r\n title='Artists'\r\n content={\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px' }}>\r\n {list.map((x, i) => (\r\n <CustomChip key={'key' + i} label={x} size='small' />\r\n ))}\r\n </Box>\r\n }\r\n >\r\n <CustomChip key='remaining' label={`+${remainingCount}`} size='small' />\r\n </HelpTooltipWrap>\r\n )}\r\n </Box>\r\n )\r\n}\r\n\r\nconst CustomChip = styled(Chip)({\r\n lineHeight: 1\r\n})\r\n//#endregion\r\n\r\n//#region Date\r\nexport interface CellDatePropsOwner {\r\n formatString?: string\r\n showRelative?: boolean\r\n typographyProps?: TypographyProps\r\n styledGetter?: (value: any) => SxProps<Theme>\r\n}\r\nexport interface CellDateProps extends CellDatePropsOwner {\r\n value: any\r\n}\r\n\r\nexport const CellDate: FC<CellDateProps> = (props) => {\r\n try {\r\n const showRelative = props?.showRelative ?? false\r\n const date = dayjsCustom(props.value)\r\n const formatted = date.format(props.formatString)\r\n const value = showRelative ? `${formatted} (${dayjsCustom().to(date)})` : formatted\r\n const sx = props.styledGetter ? props.styledGetter(props.value) : { flex: 1 }\r\n const mergeTypographyProps = mergeObjects<TypographyProps>({}, props.typographyProps ?? {}, { sx })\r\n return (\r\n <Typography variant='body2' component='span' noWrap title={`${value} formatted with ${props.formatString}`} {...mergeTypographyProps}>\r\n {value}\r\n </Typography>\r\n )\r\n } catch {\r\n return (\r\n <Typography variant='body2' component='span' noWrap>\r\n format invalid\r\n </Typography>\r\n )\r\n }\r\n}\r\n//#endregion\r\n"],"names":["CreateStatusCell","config","options","props","_props$slots","_slots$typographyProp","data","sx","slots","value","_jsx","CustomTypography","_objectSpread","onClick","typographyProps","Object","assign","children","title","styled","Typography","borderRadius","fontSize","padding","fontWeight","minWidth","textAlign","color","display","CellImageSmall","_props$imageUri","_useState","useState","imageUri","fallbackSrc","_useState2","_slicedToArray","imgSrc","setImgSrc","useEffect","_props$imageUri2","_jsxs","Box","alignItems","height","gap","ImageSmall","src","onError","variant","ImageSmallFallback","_props$imageUri3","_useState3","imageFallback","_useState4","_props$imageUri4","backgroundRepeat","width","backgroundSize","boxShadow","CellBase","_props$valueFormatted","valueFormatted","isCopyToClipboard","copyToClipboard","CellBaseWrap","wrapProps","imageUrl","mr","imageFallbackSrc","icon","component","noWrap","flex","openInNewTab","Tooltip","arrow","IconButton","href","target","OpenInNewIcon","CopyToClipboard","beforeLine","Divider","flexItem","orientation","_ref","_objectWithoutProperties","_excluded","position","top","left","CellChips","_props$value","_props$separator","list","split","separator","filter","x","displayList","maximum","slice","remainingCount","length","flexWrap","map","i","CustomChip","label","valueFormatter","size","HelpTooltipWrap","content","concat","Chip","lineHeight","CellDate","_props$showRelative","_props$typographyProp","showRelative","date","dayjsCustom","formatted","format","formatString","to","styledGetter","mergeTypographyProps","mergeObjects","_unused"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator as e,objectSpread2 as o,toArray as a,arrayLikeToArray as
|
|
1
|
+
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator as e,objectSpread2 as o,toArray as a,arrayLikeToArray as i}from"../../_virtual/_rollupPluginBabelHelpers.js";import c from"dayjs";var u=function(r){return new Promise(function(t){return setTimeout(t,r)})},f=function(){var n=t(e().m(function t(n,o){var a,i,c;return e().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,Promise.all([n(),u(o)]);case 1:return a=t.v,i=r(a,1),c=i[0],t.a(2,c)}},t)}));return function(r,t){return n.apply(this,arguments)}}(),s=function(r){return/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(r)},l=function(r){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(r)},d=function(r){return/^(\+?\d{1,4}[\s-]?)?((\(\d{1,4}\))|\d{1,4})[\s-]?\d{1,4}[\s-]?\d{1,9}$/.test((null!=r?r:"").trim())},y=function(r){return/^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i.test(r)},v=function(r,t){setTimeout(function(){window.scrollTo(o({top:0,left:0,behavior:"smooth"},r))},t||50)},h=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},p=function(r){return r&&"object"===n(r)&&!Array.isArray(r)},A=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.reduce(function(r,t){return t?(Object.keys(t).forEach(function(n){p(r[n])&&p(t[n])?r[n]=A(r[n],t[n]):r[n]=t[n]}),r):r},{})},g=function(t){try{return t?Object.entries(t).reduce(function(t,n){var e=r(n,2),o=e[0],a=e[1];return void 0!==a&&(t[o]=a),t},{}):{}}catch(r){return{}}},m=function(t){if("object"!==n(t)||null===t)return t;var e=Array.isArray(t)?[]:{};return Object.entries(t).forEach(function(t){var o=r(t,2),a=o[0],i=o[1];if(null==i||"string"==typeof i&&""===i.trim()||"number"==typeof i&&isNaN(i)||Array.isArray(i)&&0===i.length||"object"===n(i)&&!Array.isArray(i)&&0===Object.keys(m(i)).length);else if("object"!==n(i)||Array.isArray(i))e[a]=i;else{var c=m(i);Object.keys(c).length>0&&(e[a]=c)}}),e},b=function(r){try{var t=(new TextEncoder).encode(r),n="";return t.forEach(function(r){n+=String.fromCharCode(r)}),btoa(n)}catch(r){return console.error("Error encoding to base64",r),""}},w=function(r){try{for(var t=atob(r),n=new Uint8Array(t.length),e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return(new TextDecoder).decode(n)}catch(r){return void console.error("Error decoding base64",r)}},j=function(r,t){try{return r?JSON.parse(r):t}catch(r){return console.log(r),t}},F=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{if(!r)return[];var n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return t}},M=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},S=function(r){return new Promise(function(t,n){var e=new FileReader;e.onload=function(){try{var r=e.result.split(/\r?\n/).filter(Boolean);if(r.length<1)return t([]);var n=r[0].split(",").map(function(r){return r.trim()}),o=r.slice(1).map(function(r){var t=r.split(",").map(function(r){return r.trim()}),e={};return n.forEach(function(r,n){var o;e[r]=null!==(o=t[n])&&void 0!==o?o:""}),e});t(o)}catch(r){t([])}},e.onerror=function(){n(new Error("Error reading file"))},e.readAsText(r)})},Y=function(r){return r<1024?r.toFixed(2)+" Kb":r<1048576?(r/1024).toFixed(2)+" Mb":r<1073741824?(r/1048576).toFixed(2)+" Gb":(r/1073741824).toFixed(2)+" Tb"},E=function(r){var t=null==r,n="string"==typeof r&&isNaN(Number(r));if(t||n)return"00:00:00";var e=Math.round(r),o=Math.floor(e/3600),a=Math.floor(e%3600/60),i=e%60,c=String(o).padStart(2,"0"),u=String(a).padStart(2,"0"),f=String(i).padStart(2,"0");return"".concat(c,":").concat(u,":").concat(f)},T=function(t){var n,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$ ",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{n=parseFloat(t),isNaN(n)&&(n=0)}catch(r){n=0}var a=n.toFixed(2).split("."),i=r(a,2),c=i[0],u=i[1],f=c.replace(/\B(?=(\d{3})+(?!\d))/g," "),s=f;return"00"!==u&&(s="".concat(f,".").concat(u)),"".concat(e).concat(s).concat(o)},x=function(r){return r.toLocaleString("en-US")},N=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!r)return r;var t=Array.from(r),n=a(t),e=n[0],o=i(n).slice(1);return"".concat(e.toUpperCase()).concat(o.join(""))},O={style1:"DD/MM/YYYY HH:mm",style2:"MMMM D, YYYY",style3:"MM-DD-YYYY"},D=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"style1";try{var n;if(!r)throw new Error;var e=null!==(n=O[t])&&void 0!==n?n:t;return c(r).format(e)}catch(r){return"unknown"}};export{g as cleanObject,w as decodeBase64,m as deepRemoveEmptyFields,b as encodeBase64,f as fetchDelay,N as formatCapitalizeFirstText,T as formatCurrency,D as formatDatetime,O as formatDatetimeStyles,E as formatDuration,Y as formatFileSize,x as formatNumberWithCommas,s as isGuid,l as isValidEmail,d as isValidPhoneNumber,y as isValidURL,h as mergeClasses,A as mergeObjects,u as sleep,F as tryParseArray,S as tryParseCsvFileToArray,M as tryParseIntRequired,j as tryParseObject,v as windowScrollToTop};
|
|
2
2
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\n//#region Object\r\n/**\r\n * Simple object check.\r\n * @param item\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj: any) => {\r\n return obj && typeof obj === 'object' && !Array.isArray(obj)\r\n}\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n return objects.reduce((prev, obj) => {\r\n if (!obj) return prev\r\n Object.keys(obj).forEach((key) => {\r\n if (isObject((prev as any)[key]) && isObject((obj as any)[key])) {\r\n ;(prev as any)[key] = mergeObjects((prev as any)[key], (obj as any)[key])\r\n } else {\r\n ;(prev as any)[key] = (obj as any)[key]\r\n }\r\n })\r\n return prev\r\n }, {} as T) as any\r\n}\r\n\r\nexport const cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\n//#region Try Parse\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) return defaultValue\r\n return JSON.parse(value)\r\n } catch (error) {\r\n console.log(error)\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseCsvFileToArray = (file: File): Promise<Record<string, string>[]> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string\r\n const rows = text.split(/\\r?\\n/).filter(Boolean)\r\n\r\n if (rows.length < 1) return resolve([])\r\n\r\n const headers = rows[0].split(',').map((h) => h.trim())\r\n\r\n const data = rows.slice(1).map((row) => {\r\n const values = row.split(',').map((v) => v.trim())\r\n const item: Record<string, string> = {}\r\n\r\n headers.forEach((header, index) => {\r\n item[header] = values[index] ?? ''\r\n })\r\n\r\n return item\r\n })\r\n\r\n resolve(data)\r\n } catch (error) {\r\n resolve([])\r\n }\r\n }\r\n\r\n reader.onerror = () => {\r\n reject(new Error('Error reading file'))\r\n }\r\n\r\n reader.readAsText(file)\r\n })\r\n}\r\n//#endregion\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nconst formatDatetimeStyle = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: 'MMMM D, YYYY' → e.g., 'April 25, 2025'\r\n * - style2: 'MM-DD-YYYY' → e.g., '04-25-2025'\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key: 'style1' or 'style2'. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: keyof typeof formatDatetimeStyle = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n return dayjs(value).format(formatDatetimeStyle[format])\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","isObject","obj","_typeof","isArray","mergeObjects","_len2","objects","_key2","reduce","prev","Object","keys","forEach","key","cleanObject","entries","acc","_ref2","_ref3","undefined","error","deepRemoveEmptyFields","result","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","JSON","parse","log","tryParseArray","parseValue","_unused","tryParseIntRequired","parseInt","_unused2","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","filter","Boolean","headers","map","h","data","slice","row","values","item","header","index","_values$index","onerror","Error","readAsText","formatFileSize","sizeInKb","toFixed","formatCurrency","parsedValue","prefix","suffix","parseFloat","e","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","concat","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","_arrayLikeToArray","toUpperCase","formatDatetimeStyle","style1","style2","style3","formatDatetime","format","dayjs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\n//#region Object\r\n/**\r\n * Simple object check.\r\n * @param item\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj: any) => {\r\n return obj && typeof obj === 'object' && !Array.isArray(obj)\r\n}\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n return objects.reduce((prev, obj) => {\r\n if (!obj) return prev\r\n Object.keys(obj).forEach((key) => {\r\n if (isObject((prev as any)[key]) && isObject((obj as any)[key])) {\r\n ;(prev as any)[key] = mergeObjects((prev as any)[key], (obj as any)[key])\r\n } else {\r\n ;(prev as any)[key] = (obj as any)[key]\r\n }\r\n })\r\n return prev\r\n }, {} as T) as any\r\n}\r\n\r\nexport const cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\n//#region Try Parse\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) return defaultValue\r\n return JSON.parse(value)\r\n } catch (error) {\r\n console.log(error)\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseCsvFileToArray = (file: File): Promise<Record<string, string>[]> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string\r\n const rows = text.split(/\\r?\\n/).filter(Boolean)\r\n\r\n if (rows.length < 1) return resolve([])\r\n\r\n const headers = rows[0].split(',').map((h) => h.trim())\r\n\r\n const data = rows.slice(1).map((row) => {\r\n const values = row.split(',').map((v) => v.trim())\r\n const item: Record<string, string> = {}\r\n\r\n headers.forEach((header, index) => {\r\n item[header] = values[index] ?? ''\r\n })\r\n\r\n return item\r\n })\r\n\r\n resolve(data)\r\n } catch (error) {\r\n resolve([])\r\n }\r\n }\r\n\r\n reader.onerror = () => {\r\n reject(new Error('Error reading file'))\r\n }\r\n\r\n reader.readAsText(file)\r\n })\r\n}\r\n//#endregion\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatDuration = (duration?: number): string => {\r\n const isNotValidDuration = duration === undefined || duration === null\r\n const isNotNumber = typeof duration === 'string' && isNaN(Number(duration))\r\n if (isNotValidDuration || isNotNumber) return '00:00:00'\r\n\r\n // Round the duration to the nearest second\r\n const totalSeconds = Math.round(duration)\r\n\r\n // Calculate hours, minutes, and seconds\r\n const hours = Math.floor(totalSeconds / 3600)\r\n const minutes = Math.floor((totalSeconds % 3600) / 60)\r\n const seconds = totalSeconds % 60\r\n\r\n // Format each component to ensure it has two digits\r\n const hoursString = String(hours).padStart(2, '0')\r\n const minutesString = String(minutes).padStart(2, '0')\r\n const secondsString = String(seconds).padStart(2, '0')\r\n\r\n // Combine the components into a single string\r\n return `${hoursString}:${minutesString}:${secondsString}`\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nexport type FormatDatetimeStyle = 'style1' | 'style2' | 'style3'\r\n\r\nexport const formatDatetimeStyles: Record<FormatDatetimeStyle, string> = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles or a custom format string.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: MMMM D, YYYY → e.g., 'April 25, 2025'\r\n * - style3: MM-DD-YYYY → e.g., '04-25-2025'\r\n * - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'\r\n *\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: FormatDatetimeStyle | (string & {}) = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n const finalFormat = formatDatetimeStyles[format as FormatDatetimeStyle] ?? format\r\n return dayjs(value).format(finalFormat)\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","isObject","obj","_typeof","isArray","mergeObjects","_len2","objects","_key2","reduce","prev","Object","keys","forEach","key","cleanObject","entries","acc","_ref2","_ref3","undefined","error","deepRemoveEmptyFields","result","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","JSON","parse","log","tryParseArray","parseValue","_unused","tryParseIntRequired","parseInt","_unused2","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","filter","Boolean","headers","map","h","data","slice","row","values","item","header","index","_values$index","onerror","Error","readAsText","formatFileSize","sizeInKb","toFixed","formatDuration","duration","isNotValidDuration","isNotNumber","Number","totalSeconds","Math","round","hours","floor","minutes","seconds","hoursString","padStart","minutesString","secondsString","concat","formatCurrency","parsedValue","prefix","suffix","parseFloat","e","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","_arrayLikeToArray","toUpperCase","formatDatetimeStyles","style1","style2","style3","formatDatetime","format","_formatDatetimeStyles","finalFormat","dayjs"],"mappings":"8MAEaA,EAAQ,SAACC,GAAW,OAAK,IAAIC,QAAQ,SAACC,GAAG,OAAKC,WAAWD,EAAKF,IAAK,EAEnEI,EAAU,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,EAAG,SAAAC,EAAwBC,EAA+BV,GAAW,IAAAW,EAAAC,EAAAV,EAAA,OAAAK,IAAAM,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACtEd,QAAQe,IAAI,CAACN,IAAUX,EAAMC,KAAM,KAAA,EAA7C,OAA6CW,EAAAG,EAAAG,EAAAL,EAAAM,EAAAP,EAAA,GAAhDT,EAAGU,EAAA,GAAAE,EAAAK,EAAA,EACHjB,GAAG,EAAAO,MACX,OAAA,SAHsBW,EAAAC,GAAA,OAAAhB,EAAAiB,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAKVC,EAAS,SAACC,GAErB,MADkB,gFACDC,KAAKD,EACxB,EAEaE,EAAe,SAACF,GAE3B,MADc,mDACDC,KAAKD,EACpB,EAEaG,EAAqB,SAACC,GAEjC,MADmB,yEACDH,MAAMG,QAAAA,EAAe,IAAIC,OAC7C,EAEaC,EAAa,SAACC,GAEzB,MADc,wCACDN,KAAKM,EACpB,EAEaC,EAAoB,SAACC,EAA2BC,GAC3DjC,WAAW,WACTkC,OAAOC,SAAQC,EAAA,CAAGC,IAAK,EAAGC,KAAM,EAAGC,SAAU,UAAaP,GAC5D,EAAGC,GAAS,GACd,EAEaO,EAAe,WAAyB,IAAA,IAAAC,EAAApB,UAAAqB,OAArBC,EAAiBC,IAAAA,MAAAH,GAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAjBF,EAAiBE,GAAAxB,UAAAwB,GAC/C,OAAOF,EAAQG,KAAK,IACtB,EAQMC,EAAW,SAACC,GAChB,OAAOA,GAAsB,WAAfC,EAAOD,KAAqBJ,MAAMM,QAAQF,EAC1D,EAIaG,EAAe,WAAuC,IAAA,IAAAC,EAAA/B,UAAAqB,OAAhCW,EAAyBT,IAAAA,MAAAQ,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAzBD,EAAyBC,GAAAjC,UAAAiC,GAC1D,OAAOD,EAAQE,OAAO,SAACC,EAAMR,GAC3B,OAAKA,GACLS,OAAOC,KAAKV,GAAKW,QAAQ,SAACC,GACpBb,EAAUS,EAAaI,KAASb,EAAUC,EAAYY,IACtDJ,EAAaI,GAAOT,EAAcK,EAAaI,GAAOZ,EAAYY,IAElEJ,EAAaI,GAAQZ,EAAYY,EAEvC,GACOJ,GARUA,CASlB,EAAE,GACL,EAEaK,EAAc,SAAmBb,GAC5C,IACE,OAAKA,EACES,OAAOK,QAAQd,GAAKO,OAAO,SAACQ,EAAGC,GAAkB,IAAAC,EAAAlD,EAAAiD,EAAA,GAAfJ,EAAGK,EAAA,GAAE1C,EAAK0C,EAAA,GAIjD,YAHcC,IAAV3C,IACAwC,EAAYH,GAAOrC,GAEhBwC,CACR,EAAE,IANc,CAAE,CAOpB,CAAC,MAAOI,GACP,MAAO,CAAE,CACV,CACH,EAEaC,EAAwB,SAAmBpB,GACtD,GAAmB,WAAfC,EAAOD,IAA4B,OAARA,EAAc,OAAOA,EACpD,IAAMqB,EAAczB,MAAMM,QAAQF,GAAO,GAAK,CAAE,EAkBhD,OAjBAS,OAAOK,QAAQd,GAAKW,QAAQ,SAAAW,GAAiB,IAAAC,EAAAxD,EAAAuD,EAAA,GAAfV,EAAGW,EAAA,GAAEhD,EAAKgD,EAAA,GACtC,GACEhD,SAEkB,iBAAVA,GAAuC,KAAjBA,EAAMK,QAClB,iBAAVL,GAAsBiD,MAAMjD,IACnCqB,MAAMM,QAAQ3B,IAA2B,IAAjBA,EAAMmB,QACb,WAAjBO,EAAO1B,KAAuBqB,MAAMM,QAAQ3B,IAA+D,IAArDkC,OAAOC,KAAKU,EAAsB7C,IAAQmB,aAG5F,GAAqB,WAAjBO,EAAO1B,IAAuBqB,MAAMM,QAAQ3B,GAIrD8C,EAAOT,GAAOrC,MAJ+C,CAC7D,IAAMkD,EAAUL,EAAsB7C,GAClCkC,OAAOC,KAAKe,GAAS/B,OAAS,IAAG2B,EAAOT,GAAOa,EACpD,CAGH,GACOJ,CACT,EAGaK,EAAe,SAACC,GAC3B,IACE,IAAMC,GAAY,IAAIC,aAAcC,OAAOH,GACvCI,EAAe,GAInB,OAHAH,EAAUjB,QAAQ,SAACqB,GACjBD,GAAgBE,OAAOC,aAAaF,EACtC,GACOG,KAAKJ,EACb,CAAC,MAAOZ,GAEP,OADAiB,QAAQjB,MAAM,2BAA4BA,GACnC,EACR,CACH,EAEakB,EAAe,SAACC,GAC3B,IAGE,IAFA,IAAMP,EAAeQ,KAAKD,GACpBV,EAAY,IAAIY,WAAWT,EAAarC,QACrC+C,EAAI,EAAGA,EAAIV,EAAarC,OAAQ+C,IACvCb,EAAUa,GAAKV,EAAaW,WAAWD,GAEzC,OAAO,IAAIE,aAAcC,OAAOhB,EACjC,CAAC,MAAOT,GAEP,YADAiB,QAAQjB,MAAM,wBAAyBA,EAExC,CACH,EAGa0B,EAAiB,SAAatE,EAAYuE,GACrD,IACE,OAAKvE,EACEwE,KAAKC,MAAMzE,GADCuE,CAEpB,CAAC,MAAO3B,GAEP,OADAiB,QAAQa,IAAI9B,GACL2B,CACR,CACH,EAEaI,EAAgB,SAAa3E,GAAkC,IAAtBuE,yDAAoB,GACxE,IACE,IAAKvE,EAAO,MAAO,GACnB,IAAM4E,EAAaJ,KAAKC,MAAMzE,GAC9B,OAAOqB,MAAMM,QAAQiD,GAAcA,EAAa,EACjD,CAAC,MAAAC,GACA,OAAON,CACR,CACH,EAEaO,EAAsB,SAAU9E,EAAYuE,GACvD,IACE,OAAKvE,EACE+E,SAAS/E,GADGuE,CAEpB,CAAC,MAAAS,GACA,OAAOT,CACR,CACH,EAEaU,EAAyB,SAACC,GACrC,OAAO,IAAI3G,QAAQ,SAAC4G,EAASC,GAC3B,IAAMC,EAAS,IAAIC,WAEnBD,EAAOE,OAAS,WACd,IACE,IACMC,EADOH,EAAOvC,OACF2C,MAAM,SAASC,OAAOC,SAExC,GAAIH,EAAKrE,OAAS,EAAG,OAAOgE,EAAQ,IAEpC,IAAMS,EAAUJ,EAAK,GAAGC,MAAM,KAAKI,IAAI,SAACC,GAAC,OAAKA,EAAEzF,SAE1C0F,EAAOP,EAAKQ,MAAM,GAAGH,IAAI,SAACI,GAC9B,IAAMC,EAASD,EAAIR,MAAM,KAAKI,IAAI,SAACtG,GAAC,OAAKA,EAAEc,SACrC8F,EAA+B,CAAE,EAMvC,OAJAP,EAAQxD,QAAQ,SAACgE,EAAQC,GAAS,IAAAC,EAChCH,EAAKC,GAAuBE,QAAhBA,EAAGJ,EAAOG,UAAMC,IAAAA,EAAAA,EAAI,EAClC,GAEOH,CACT,GAEAhB,EAAQY,EACT,CAAC,MAAOnD,GACPuC,EAAQ,GACT,CACF,EAEDE,EAAOkB,QAAU,WACfnB,EAAO,IAAIoB,MAAM,sBAClB,EAEDnB,EAAOoB,WAAWvB,EACpB,EACF,EAIawB,EAAiB,SAACC,GAC7B,OAAIA,EAAW,KACNA,EAASC,QAAQ,GAAK,MACpBD,EAAW,SACZA,EAAW,MAAMC,QAAQ,GAAK,MAC7BD,EAAW,YACZA,EAAQ,SAAkBC,QAAQ,GAAK,OAEvCD,EAAY,YAAqBC,QAAQ,GAAK,KAE1D,EAEaC,EAAiB,SAACC,GAC7B,IAAMC,EAAqBD,QACrBE,EAAkC,iBAAbF,GAAyB7D,MAAMgE,OAAOH,IACjE,GAAIC,GAAsBC,EAAa,MAAO,WAG9C,IAAME,EAAeC,KAAKC,MAAMN,GAG1BO,EAAQF,KAAKG,MAAMJ,EAAe,MAClCK,EAAUJ,KAAKG,MAAOJ,EAAe,KAAQ,IAC7CM,EAAUN,EAAe,GAGzBO,EAAc/D,OAAO2D,GAAOK,SAAS,EAAG,KACxCC,EAAgBjE,OAAO6D,GAASG,SAAS,EAAG,KAC5CE,EAAgBlE,OAAO8D,GAASE,SAAS,EAAG,KAGlD,MAAAG,GAAAA,OAAUJ,EAAWI,KAAAA,OAAIF,EAAa,KAAAE,OAAID,EAC5C,EAEaE,EAAiB,SAAC9H,GAAmD,IAC5E+H,EADsCC,EAAMlI,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAG,KAAMmI,EAAMnI,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAG,GAElE,IACEiI,EAAcG,WAAWlI,GACrBiD,MAAM8E,KAAcA,EAAc,EACvC,CAAC,MAAOI,GACPJ,EAAc,CACf,CACD,IACAK,EADqBL,EAAYnB,QAAQ,GACOnB,MAAM,KAAI4C,EAAA7I,EAAA4I,EAAA,GAAnDE,EAAWD,EAAA,GAAEE,EAAWF,EAAA,GACzBG,EAAuBF,EAAYG,QAAQ,wBAAyB,KAEtEC,EAAiBF,EAIrB,MAHoB,OAAhBD,IACFG,EAAc,GAAAb,OAAMW,OAAoBX,OAAIU,IAE9CV,GAAAA,OAAUG,GAAMH,OAAGa,GAAcb,OAAGI,EACtC,EAEaU,EAAyB,SAACC,GACrC,OAAOA,EAAOC,eAAe,QAC/B,EAEaC,EAA4B,WAAuB,IAAtB9I,EAAgBF,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAA,GACxD,IAAKE,EAAO,OAAOA,EACnB,IAAA+I,EAAyB1H,MAAM2H,KAAKhJ,GAAMiJ,EAAAC,EAAAH,GAAnCI,EAAKF,EAAA,GAAKlD,EAAIqD,EAAAH,GAAAjD,MAAA,GACrB,MAAA,GAAA6B,OAAUsB,EAAME,eAAaxB,OAAG9B,EAAKxE,KAAK,IAC5C,EAIa+H,EAA4D,CACvEC,OAAQ,mBACRC,OAAQ,eACRC,OAAQ,cAgBGC,EAAiB,SAAC1J,GAAiF,IAAlE2J,EAAA7J,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAA8C,SAC1F,IAAI,IAAA8J,EACF,IAAK5J,EAAO,MAAM,IAAIwG,MACtB,IAAMqD,EAAiED,QAAtDA,EAAGN,EAAqBK,UAA8BC,IAAAA,EAAAA,EAAID,EAC3E,OAAOG,EAAM9J,GAAO2J,OAAOE,EAC5B,CAAC,MAAOjH,GACP,MAAO,SACR,CACH"}
|
|
@@ -26,7 +26,7 @@ export interface IPreSubmitMetadata<T = any> {
|
|
|
26
26
|
}
|
|
27
27
|
export declare function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']): <T_1 extends new (...args: any[]) => {}>(constructor: T_1) => T_1;
|
|
28
28
|
export declare function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined;
|
|
29
|
-
export interface IFieldMetadata<T = any> {
|
|
29
|
+
export interface IFieldMetadata<T = any, O = {}> {
|
|
30
30
|
name: keyof T | string;
|
|
31
31
|
label?: string;
|
|
32
32
|
placeholder?: string;
|
|
@@ -3,7 +3,7 @@ export { default as FormValidator } from './validator';
|
|
|
3
3
|
export * from './validator';
|
|
4
4
|
export { default as DinoForm } from './dino-form';
|
|
5
5
|
export { getErrorMessage, convertFormDataToJson, validateCsvModel } from './helpers';
|
|
6
|
-
export type { ISelectWithApiOption } from './create.select-with-api';
|
|
6
|
+
export type { ISelectWithApiOption, ISelectWithApiFetchData, ISelectWithApiParams } from './create.select-with-api';
|
|
7
7
|
export type { InputBaseImage } from './create.input';
|
|
8
8
|
export * from './decorator';
|
|
9
9
|
export * from './decorator.form';
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import EventEmitter from 'events';
|
|
3
3
|
import { FC } from 'react';
|
|
4
|
+
export type TSite = 'admin' | 'client' | 'music' | 'home' | (string & {});
|
|
4
5
|
interface IEventOptions {
|
|
5
6
|
message?: string;
|
|
6
7
|
href?: string;
|
|
7
8
|
target?: string;
|
|
8
9
|
rel?: string;
|
|
10
|
+
site?: TSite;
|
|
9
11
|
}
|
|
10
12
|
export interface IMfeNavigationEventConfigs {
|
|
11
13
|
navigation: [{
|
|
@@ -32,6 +34,7 @@ export interface IMfeNavigationProviderProps {
|
|
|
32
34
|
export declare const MfeNavigationProvider: FC<IMfeNavigationProviderProps>;
|
|
33
35
|
export interface IMfeLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
34
36
|
routeKey?: string;
|
|
37
|
+
site?: TSite;
|
|
35
38
|
}
|
|
36
39
|
export declare const MfeLink: import("react").ForwardRefExoticComponent<IMfeLinkProps & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
37
40
|
export declare const mfeNavigation: (routeKey: string, options?: IEventOptions) => void;
|
|
@@ -19,24 +19,24 @@ export declare const tryParseArray: <T>(value: any, defaultValue?: T[]) => T[];
|
|
|
19
19
|
export declare const tryParseIntRequired: (value: any, defaultValue: number) => number;
|
|
20
20
|
export declare const tryParseCsvFileToArray: (file: File) => Promise<Record<string, string>[]>;
|
|
21
21
|
export declare const formatFileSize: (sizeInKb: number) => string;
|
|
22
|
+
export declare const formatDuration: (duration?: number) => string;
|
|
22
23
|
export declare const formatCurrency: (value?: any, prefix?: string, suffix?: string) => string;
|
|
23
24
|
export declare const formatNumberWithCommas: (number: number) => string;
|
|
24
25
|
export declare const formatCapitalizeFirstText: (value?: string) => string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
style2: string;
|
|
28
|
-
style3: string;
|
|
29
|
-
};
|
|
26
|
+
export type FormatDatetimeStyle = 'style1' | 'style2' | 'style3';
|
|
27
|
+
export declare const formatDatetimeStyles: Record<FormatDatetimeStyle, string>;
|
|
30
28
|
/**
|
|
31
|
-
* Formats a datetime string using one of the predefined styles.
|
|
29
|
+
* Formats a datetime string using one of the predefined styles or a custom format string.
|
|
32
30
|
*
|
|
33
31
|
* Available format styles:
|
|
34
32
|
* - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'
|
|
35
|
-
* - style2:
|
|
36
|
-
* -
|
|
33
|
+
* - style2: MMMM D, YYYY → e.g., 'April 25, 2025'
|
|
34
|
+
* - style3: MM-DD-YYYY → e.g., '04-25-2025'
|
|
35
|
+
* - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'
|
|
36
|
+
*
|
|
37
37
|
* @param value - A datetime string (ISO format or any format parsable by dayjs).
|
|
38
|
-
* @param format - Format style key
|
|
38
|
+
* @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. Defaults to 'style1'.
|
|
39
39
|
* @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.
|
|
40
40
|
*/
|
|
41
|
-
export declare const formatDatetime: (value: string, format?:
|
|
41
|
+
export declare const formatDatetime: (value: string, format?: FormatDatetimeStyle | (string & {})) => string;
|
|
42
42
|
export {};
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{cleanObject,decodeBase64,deepRemoveEmptyFields,encodeBase64,fetchDelay,formatCapitalizeFirstText,formatCurrency,formatDatetime,formatFileSize,formatNumberWithCommas,isGuid,isValidEmail,isValidPhoneNumber,isValidURL,mergeClasses,mergeObjects,sleep,tryParseArray,tryParseCsvFileToArray,tryParseIntRequired,tryParseObject,windowScrollToTop}from"../src/utils/helpers.js";import"../src/utils/dayjs-config.js";export{default as JObject}from"../src/utils/json-object.js";export{QueryParam}from"../src/utils/query-param.js";export{createObjectSingleton}from"../src/utils/singletone.js";export{default as dayjsCustom}from"dayjs";
|
|
1
|
+
export{cleanObject,decodeBase64,deepRemoveEmptyFields,encodeBase64,fetchDelay,formatCapitalizeFirstText,formatCurrency,formatDatetime,formatDatetimeStyles,formatDuration,formatFileSize,formatNumberWithCommas,isGuid,isValidEmail,isValidPhoneNumber,isValidURL,mergeClasses,mergeObjects,sleep,tryParseArray,tryParseCsvFileToArray,tryParseIntRequired,tryParseObject,windowScrollToTop}from"../src/utils/helpers.js";import"../src/utils/dayjs-config.js";export{default as JObject}from"../src/utils/json-object.js";export{QueryParam}from"../src/utils/query-param.js";export{createObjectSingleton}from"../src/utils/singletone.js";export{default as dayjsCustom}from"dayjs";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|