@ng-atomic/common 18.2.1 → 18.4.0

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.
Files changed (83) hide show
  1. package/common.module.d.ts +15 -0
  2. package/esm2022/common.module.mjs +34 -0
  3. package/esm2022/index.mjs +2 -2
  4. package/esm2022/models/index.mjs +1 -1
  5. package/esm2022/pipes/data-accessor/data-accessor.pipe.mjs +4 -4
  6. package/esm2022/pipes/domain/domain.pipe.mjs +19 -1
  7. package/esm2022/pipes/smart-field/smart-field.pipe.mjs +2 -2
  8. package/esm2022/services/app/app.service.mjs +48 -2
  9. package/esm2022/services/fab/fab.service.mjs +11 -5
  10. package/esm2022/services/form/_index/index.service.mjs +2 -2
  11. package/esm2022/services/form/columns/columns.service.mjs +19 -10
  12. package/esm2022/services/form/json-schema/index.mjs +2 -0
  13. package/esm2022/services/form/json-schema/json-schema.mjs +51 -0
  14. package/esm2022/services/form/json-schema/json-schema.service.mjs +139 -0
  15. package/esm2022/services/form/json-schema/ng-atomic-common-services-form-json-schema.mjs +5 -0
  16. package/esm2022/services/initializer/initializer.service.mjs +2 -2
  17. package/esm2022/services/loading/loading.service.mjs +28 -31
  18. package/esm2022/services/root-property/root-property.service.mjs +3 -1
  19. package/esm2022/services/sheets/actions/actions.sheet.mjs +45 -0
  20. package/esm2022/services/sheets/actions/index.mjs +2 -0
  21. package/esm2022/services/sheets/actions/ng-atomic-common-services-sheets-actions.mjs +5 -0
  22. package/esm2022/services/sheets/index.mjs +3 -0
  23. package/esm2022/services/sheets/ng-atomic-common-services-sheets.mjs +5 -0
  24. package/esm2022/services/sheets/sheets.module.mjs +25 -0
  25. package/esm2022/services/sheets/sheets.service.mjs +22 -0
  26. package/esm2022/services/side-app/side-app.service.mjs +33 -3
  27. package/esm2022/services/ui/ui.helpers.mjs +47 -65
  28. package/esm2022/utils/inject/inject.mjs +61 -22
  29. package/fesm2022/ng-atomic-common-pipes-data-accessor.mjs +3 -3
  30. package/fesm2022/ng-atomic-common-pipes-data-accessor.mjs.map +1 -1
  31. package/fesm2022/ng-atomic-common-pipes-domain.mjs +18 -0
  32. package/fesm2022/ng-atomic-common-pipes-domain.mjs.map +1 -1
  33. package/fesm2022/ng-atomic-common-pipes-smart-field.mjs +1 -1
  34. package/fesm2022/ng-atomic-common-pipes-smart-field.mjs.map +1 -1
  35. package/fesm2022/ng-atomic-common-services-app.mjs +49 -3
  36. package/fesm2022/ng-atomic-common-services-app.mjs.map +1 -1
  37. package/fesm2022/ng-atomic-common-services-fab.mjs +10 -4
  38. package/fesm2022/ng-atomic-common-services-fab.mjs.map +1 -1
  39. package/fesm2022/ng-atomic-common-services-form-_index.mjs +1 -1
  40. package/fesm2022/ng-atomic-common-services-form-_index.mjs.map +1 -1
  41. package/fesm2022/ng-atomic-common-services-form-columns.mjs +18 -9
  42. package/fesm2022/ng-atomic-common-services-form-columns.mjs.map +1 -1
  43. package/fesm2022/ng-atomic-common-services-form-json-schema.mjs +193 -0
  44. package/fesm2022/ng-atomic-common-services-form-json-schema.mjs.map +1 -0
  45. package/fesm2022/ng-atomic-common-services-initializer.mjs +1 -1
  46. package/fesm2022/ng-atomic-common-services-initializer.mjs.map +1 -1
  47. package/fesm2022/ng-atomic-common-services-loading.mjs +26 -29
  48. package/fesm2022/ng-atomic-common-services-loading.mjs.map +1 -1
  49. package/fesm2022/ng-atomic-common-services-root-property.mjs +2 -0
  50. package/fesm2022/ng-atomic-common-services-root-property.mjs.map +1 -1
  51. package/fesm2022/ng-atomic-common-services-sheets-actions.mjs +52 -0
  52. package/fesm2022/ng-atomic-common-services-sheets-actions.mjs.map +1 -0
  53. package/fesm2022/ng-atomic-common-services-sheets.mjs +50 -0
  54. package/fesm2022/ng-atomic-common-services-sheets.mjs.map +1 -0
  55. package/fesm2022/ng-atomic-common-services-side-app.mjs +33 -3
  56. package/fesm2022/ng-atomic-common-services-side-app.mjs.map +1 -1
  57. package/fesm2022/ng-atomic-common-services-ui.mjs +46 -64
  58. package/fesm2022/ng-atomic-common-services-ui.mjs.map +1 -1
  59. package/fesm2022/ng-atomic-common-utils.mjs +62 -23
  60. package/fesm2022/ng-atomic-common-utils.mjs.map +1 -1
  61. package/fesm2022/ng-atomic-common.mjs +76 -0
  62. package/fesm2022/ng-atomic-common.mjs.map +1 -1
  63. package/index.d.ts +1 -1
  64. package/models/index.d.ts +1 -0
  65. package/package.json +20 -2
  66. package/pipes/data-accessor/data-accessor.pipe.d.ts +3 -3
  67. package/pipes/domain/domain.pipe.d.ts +2 -1
  68. package/pipes/smart-field/smart-field.pipe.d.ts +1 -1
  69. package/services/app/app.service.d.ts +12 -0
  70. package/services/fab/fab.service.d.ts +3 -3
  71. package/services/form/columns/columns.service.d.ts +8 -1
  72. package/services/form/json-schema/index.d.ts +1 -0
  73. package/services/form/json-schema/json-schema.d.ts +2 -0
  74. package/services/form/json-schema/json-schema.service.d.ts +54 -0
  75. package/services/loading/loading.service.d.ts +13 -12
  76. package/services/sheets/actions/actions.sheet.d.ts +9 -0
  77. package/services/sheets/actions/index.d.ts +1 -0
  78. package/services/sheets/index.d.ts +2 -0
  79. package/services/sheets/sheets.module.d.ts +11 -0
  80. package/services/sheets/sheets.service.d.ts +10 -0
  81. package/services/side-app/side-app.service.d.ts +12 -0
  82. package/services/ui/ui.helpers.d.ts +6 -5
  83. package/utils/inject/inject.d.ts +29 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-pipes-domain.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/domain/domain.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/domain/ng-atomic-common-pipes-domain.ts"],"sourcesContent":["import { InjectionToken, Injector, Pipe, Signal, inject, signal, PipeTransform } from '@angular/core';\nimport { Entity, Type, getLangMap, getModelName, getProps } from '@nx-ddd/common/domain/models';\nimport { SignalOrValue, wrapFactory } from '@ng-atomic/common/pipes/signal';\n\nexport type DomainLangMap = Record<string, string>;\nexport const DOMAIN_MODEL = new InjectionToken<Type<{id: string}>>('Domain Model');\nexport const DOMAIN_LANG_MAP = new InjectionToken<DomainLangMap>('domain lang map');\nexport const DOMAIN_PROPS = new InjectionToken<Signal<string[]>>('Domain Props');\nexport const DOMAIN_MODEL_NAME = new InjectionToken<Signal<string>>('Domain Model Name');\n\n@Pipe({standalone: true, name: 'domain', pure: true})\nexport class DomainPipe implements PipeTransform {\n protected map = inject(DOMAIN_LANG_MAP, {optional: true}) ?? {};\n\n transform(input: string, map: DomainLangMap = this.map) {\n return map[input] ?? input;\n }\n}\n\nexport function provideLangMap(useFactory: () => DomainLangMap) {\n return { provide: DOMAIN_LANG_MAP, useFactory };\n}\n\nexport function provideDomainLang<E>(domain: Type<E>, mergeObj: DomainLangMap = {}) {\n return provideLangMap(() => getLangMap(domain, mergeObj));\n}\n\nexport function provideModel<E>(useFactory: () => Type<E>) {\n return { provide: DOMAIN_MODEL, useFactory};\n}\n\nexport function injectModel<E = Entity>(): Type<E> {\n return inject(DOMAIN_MODEL, {optional: true}) as Type<E> ?? null;\n}\n\nexport function provideProps(useFactory: () => SignalOrValue<string[]>) {\n return { provide: DOMAIN_PROPS, useFactory: wrapFactory(useFactory)}\n}\n\nexport function provideModelName(useFactory: () => SignalOrValue<string>) {\n return { provide: DOMAIN_MODEL_NAME, useFactory: wrapFactory(useFactory)}\n}\n\nexport function injectProps(): Signal<string[]> {\n return inject(DOMAIN_PROPS, {optional: true}) ?? signal([]);\n}\n\nexport function injectModelName(injector?: Injector): Signal<string> {\n if (injector) return injector.get(DOMAIN_MODEL_NAME, null) ?? signal(null);\n return inject(DOMAIN_MODEL_NAME, {optional: true}) ?? signal(null);\n}\n\nexport function provideDomain<E>(useFactory: () => Type<E>) {\n return [\n provideModel(useFactory),\n provideLangMap(() => getLangMap(useFactory())),\n provideProps(() => getProps(useFactory())),\n provideModelName(() => getModelName(useFactory()))\n ]\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-atomic-common-pipes-domain.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/domain/domain.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/domain/ng-atomic-common-pipes-domain.ts"],"sourcesContent":["import { InjectionToken, Injector, Pipe, Signal, inject, signal, PipeTransform } from '@angular/core';\nimport { Entity, Type, getLangMap, getModelName, getProps } from '@nx-ddd/common/domain/models';\nimport { SignalOrValue, wrapFactory } from '@ng-atomic/common/pipes/signal';\nimport { get, has } from 'lodash-es';\n\nexport type DomainLangMap = Record<string, string>;\nexport const DOMAIN_MODEL = new InjectionToken<Type<{id: string}>>('Domain Model');\nexport const DOMAIN_LANG_MAP = new InjectionToken<DomainLangMap>('domain lang map');\nexport const DOMAIN_PROPS = new InjectionToken<Signal<string[]>>('Domain Props');\nexport const DOMAIN_MODEL_NAME = new InjectionToken<Signal<string>>('Domain Model Name');\n\n\n\n@Pipe({standalone: true, name: 'domain', pure: true})\nexport class DomainPipe implements PipeTransform {\n protected map = inject(DOMAIN_LANG_MAP, {optional: true}) ?? {};\n protected regexResolvers = Object.entries(this.map).map(([regexKey, value]) => {\n const regexIndicators = /[.*+?^${}()|[\\]\\\\]/;\n if (regexIndicators.test(regexKey)) {\n return (key: string) => {\n const regex = new RegExp(regexKey);\n return regex.test(key) ? value : null;\n }\n }\n return () => null;\n });\n\n transform(input: string, map: DomainLangMap = this.map) {\n if (has(map, input)) return get(map, input);\n for (const resolver of this.regexResolvers) {\n const result = resolver(input);\n if (result) return result;\n }\n return map[input] ?? input;\n }\n}\n\nexport function provideLangMap(useFactory: () => DomainLangMap) {\n return { provide: DOMAIN_LANG_MAP, useFactory };\n}\n\nexport function provideDomainLang<E>(domain: Type<E>, mergeObj: DomainLangMap = {}) {\n return provideLangMap(() => getLangMap(domain, mergeObj));\n}\n\nexport function provideModel<E>(useFactory: () => Type<E>) {\n return { provide: DOMAIN_MODEL, useFactory};\n}\n\nexport function injectModel<E = Entity>(): Type<E> {\n return inject(DOMAIN_MODEL, {optional: true}) as Type<E> ?? null;\n}\n\nexport function provideProps(useFactory: () => SignalOrValue<string[]>) {\n return { provide: DOMAIN_PROPS, useFactory: wrapFactory(useFactory)}\n}\n\nexport function provideModelName(useFactory: () => SignalOrValue<string>) {\n return { provide: DOMAIN_MODEL_NAME, useFactory: wrapFactory(useFactory)}\n}\n\nexport function injectProps(): Signal<string[]> {\n return inject(DOMAIN_PROPS, {optional: true}) ?? signal([]);\n}\n\nexport function injectModelName(injector?: Injector): Signal<string> {\n if (injector) return injector.get(DOMAIN_MODEL_NAME, null) ?? signal(null);\n return inject(DOMAIN_MODEL_NAME, {optional: true}) ?? signal(null);\n}\n\nexport function provideDomain<E>(useFactory: () => Type<E>) {\n return [\n provideModel(useFactory),\n provideLangMap(() => getLangMap(useFactory())),\n provideProps(() => getProps(useFactory())),\n provideModelName(() => getModelName(useFactory()))\n ]\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import get from 'lodash.get';
4
4
 
5
5
  /** @deprecated */
6
6
  const FORM_FIELD_MAP = new InjectionToken('[@ng-atomic] Smart Form Field');
7
- /** @deprecated */
7
+ /** @deprecated use fieldMap input*/
8
8
  function provideFormFieldMap(useFactory) {
9
9
  return { provide: FORM_FIELD_MAP, useFactory };
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-pipes-smart-field.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/smart-field/smart-field.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/smart-field/ng-atomic-common-pipes-smart-field.ts"],"sourcesContent":["import { InjectionToken, Pipe, PipeTransform, Signal, inject } from '@angular/core';\nimport { Action } from '@ng-atomic/core';\nimport { SignalOrValue } from '@ng-atomic/common/pipes/signal';\nimport get from 'lodash.get';\n\n\nexport interface Option<T> {\n name: string;\n value: T;\n}\n\ninterface BaseField {\n placeholder?: string;\n hint?: SignalOrValue<string>;\n actions?: Action[] | Signal<Action[]>;\n}\n\ninterface TextField extends BaseField {\n type: 'text';\n autoComplete?: SignalOrValue<string[]>;\n}\n\ninterface PasswordField extends BaseField {\n type: 'password';\n}\n\ninterface NumberField extends BaseField {\n type: 'number';\n}\n\ninterface TextareaField extends BaseField {\n type: 'textarea';\n rows?: number;\n}\n\ninterface DateInputField extends BaseField {\n type: 'date';\n}\n\ninterface DateRangeInputField extends BaseField {\n type: 'date-range';\n}\n\ninterface SelectField<T> extends BaseField {\n type: 'select';\n options: Option<T>[] | Signal<Option<T>[]>;\n multiple?: boolean;\n}\n\ninterface TimeRangeField extends BaseField {\n type: 'time-range';\n}\n\n//* @deprecated use multiple option */\ninterface MultiSelectField<T> extends BaseField {\n type: 'multi-select';\n options: Option<T>[] | Signal<Option<T>[]>;\n}\n\ninterface FileField extends BaseField {\n type: 'file';\n progress?: Signal<number | null>;\n}\n\ninterface ActionField extends BaseField {\n type: 'action';\n actions: Action[] | Signal<Action[]>;\n buttonType?: 'flat' | 'raised' | 'stroked' | 'icon';\n disabled?: boolean;\n}\n\ninterface AgreementField {\n type: 'agreement';\n labelTemp: null | any;\n}\n\ninterface SliderField extends BaseField {\n type: 'slider';\n slider: {\n min?: number;\n max?: number;\n step?: number;\n }\n}\n\ninterface HiddenField {\n type: 'hidden';\n}\n\ninterface PreviewField extends BaseField {\n type: 'preview';\n}\n\ninterface PreviewImageField extends BaseField {\n type: 'preview:image';\n}\n\nexport type FormField<V = any> = \n | TextField\n | PasswordField\n | TextareaField\n | DateInputField\n | DateRangeInputField\n | SelectField<V>\n | TimeRangeField\n | MultiSelectField<V>\n | FileField\n | ActionField\n | HiddenField\n | NumberField\n | PreviewField\n | AgreementField\n | SliderField\n | PreviewImageField;\n\nexport interface FormFieldMap {\n [key: string]: FormField<any> | FormFieldMap;\n}\n\n/** @deprecated */\nexport const FORM_FIELD_MAP = new InjectionToken<FormFieldMap>('[@ng-atomic] Smart Form Field');\n\n/** @deprecated */\nexport function provideFormFieldMap(useFactory: () => FormFieldMap) {\n return { provide: FORM_FIELD_MAP, useFactory };\n}\n\ntype Enum<T> = Record<string, T>;\n\n/** @deprecated */\nexport function buildOptions<T>(_enum: Enum<T>): Option<T>[] {\n return Object.values(_enum).map(value => ({value, name: value}) as Option<T>);\n}\n\n/** @deprecated */\n@Pipe({name: 'smartField', standalone: true, pure: true})\nexport class SmartFieldPipe implements PipeTransform {\n protected map = inject(FORM_FIELD_MAP, {optional: true}) ?? {\n createdAt: { type: 'date' },\n updatedAt: { type: 'date' },\n deletedAt: { type: 'date' },\n };\n\n transform(key: string, map: FormFieldMap = this.map): FormField<any> {\n return get(map, key) ?? {type: 'input'};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAuHA;MACa,cAAc,GAAG,IAAI,cAAc,CAAe,+BAA+B,EAAE;AAEhG;AACM,SAAU,mBAAmB,CAAC,UAA8B,EAAA;AAChE,IAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACjD,CAAC;AAID;AACM,SAAU,YAAY,CAAI,KAAc,EAAA;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAC,CAAc,CAAC,CAAC;AAChF,CAAC;AAED;MAEa,cAAc,CAAA;AAD3B,IAAA,WAAA,GAAA;QAEY,IAAG,CAAA,GAAA,GAAG,MAAM,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,IAAI;AAC1D,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC3B,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC3B,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAC5B,CAAC;AAKH,KAAA;AAHC,IAAA,SAAS,CAAC,GAAW,EAAE,GAAoB,GAAA,IAAI,CAAC,GAAG,EAAA;AACjD,QAAA,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;KACzC;8GATU,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,CAAA,EAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,IAAI;mBAAC,EAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAA;;;ACvIxD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-pipes-smart-field.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/smart-field/smart-field.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/smart-field/ng-atomic-common-pipes-smart-field.ts"],"sourcesContent":["import { InjectionToken, Pipe, PipeTransform, Signal, inject } from '@angular/core';\nimport { Action } from '@ng-atomic/core';\nimport { SignalOrValue } from '@ng-atomic/common/pipes/signal';\nimport get from 'lodash.get';\n\n\nexport interface Option<T> {\n name: string;\n value: T;\n}\n\ninterface BaseField {\n placeholder?: string;\n hint?: SignalOrValue<string>;\n actions?: Action[] | Signal<Action[]>;\n}\n\ninterface TextField extends BaseField {\n type: 'text';\n autoComplete?: SignalOrValue<string[]>;\n}\n\ninterface PasswordField extends BaseField {\n type: 'password';\n}\n\ninterface NumberField extends BaseField {\n type: 'number';\n}\n\ninterface TextareaField extends BaseField {\n type: 'textarea';\n rows?: number;\n}\n\ninterface DateInputField extends BaseField {\n type: 'date';\n}\n\ninterface DateRangeInputField extends BaseField {\n type: 'date-range';\n}\n\ninterface SelectField<T> extends BaseField {\n type: 'select';\n options: Option<T>[] | Signal<Option<T>[]>;\n multiple?: boolean;\n}\n\ninterface TimeRangeField extends BaseField {\n type: 'time-range';\n}\n\n//* @deprecated use multiple option */\ninterface MultiSelectField<T> extends BaseField {\n type: 'multi-select';\n options: Option<T>[] | Signal<Option<T>[]>;\n}\n\ninterface FileField extends BaseField {\n type: 'file';\n progress?: Signal<number | null>;\n}\n\ninterface ActionField extends BaseField {\n type: 'action';\n actions: Action[] | Signal<Action[]>;\n buttonType?: 'flat' | 'raised' | 'stroked' | 'icon';\n disabled?: boolean;\n}\n\ninterface AgreementField {\n type: 'agreement';\n labelTemp: null | any;\n}\n\ninterface SliderField extends BaseField {\n type: 'slider';\n slider: {\n min?: number;\n max?: number;\n step?: number;\n }\n}\n\ninterface HiddenField {\n type: 'hidden';\n}\n\ninterface PreviewField extends BaseField {\n type: 'preview';\n}\n\ninterface PreviewImageField extends BaseField {\n type: 'preview:image';\n}\n\nexport type FormField<V = any> = \n | TextField\n | PasswordField\n | TextareaField\n | DateInputField\n | DateRangeInputField\n | SelectField<V>\n | TimeRangeField\n | MultiSelectField<V>\n | FileField\n | ActionField\n | HiddenField\n | NumberField\n | PreviewField\n | AgreementField\n | SliderField\n | PreviewImageField;\n\nexport interface FormFieldMap {\n [key: string]: FormField<any> | FormFieldMap;\n}\n\n/** @deprecated */\nexport const FORM_FIELD_MAP = new InjectionToken<FormFieldMap>('[@ng-atomic] Smart Form Field');\n\n/** @deprecated use fieldMap input*/\nexport function provideFormFieldMap(useFactory: () => FormFieldMap) {\n return { provide: FORM_FIELD_MAP, useFactory };\n}\n\ntype Enum<T> = Record<string, T>;\n\n/** @deprecated */\nexport function buildOptions<T>(_enum: Enum<T>): Option<T>[] {\n return Object.values(_enum).map(value => ({value, name: value}) as Option<T>);\n}\n\n/** @deprecated */\n@Pipe({name: 'smartField', standalone: true, pure: true})\nexport class SmartFieldPipe implements PipeTransform {\n protected map = inject(FORM_FIELD_MAP, {optional: true}) ?? {\n createdAt: { type: 'date' },\n updatedAt: { type: 'date' },\n deletedAt: { type: 'date' },\n };\n\n transform(key: string, map: FormFieldMap = this.map): FormField<any> {\n return get(map, key) ?? {type: 'input'};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAuHA;MACa,cAAc,GAAG,IAAI,cAAc,CAAe,+BAA+B,EAAE;AAEhG;AACM,SAAU,mBAAmB,CAAC,UAA8B,EAAA;AAChE,IAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACjD,CAAC;AAID;AACM,SAAU,YAAY,CAAI,KAAc,EAAA;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAC,CAAc,CAAC,CAAC;AAChF,CAAC;AAED;MAEa,cAAc,CAAA;AAD3B,IAAA,WAAA,GAAA;QAEY,IAAG,CAAA,GAAA,GAAG,MAAM,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,IAAI;AAC1D,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC3B,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC3B,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAC5B,CAAC;AAKH,KAAA;AAHC,IAAA,SAAS,CAAC,GAAW,EAAE,GAAoB,GAAA,IAAI,CAAC,GAAG,EAAA;AACjD,QAAA,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;KACzC;8GATU,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,CAAA,EAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,IAAI;mBAAC,EAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAA;;;ACvIxD;;AAEG;;;;"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable } from '@angular/core';
3
- import { Router } from '@angular/router';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import * as i1 from '@angular/router';
4
+ import { NavigationStart, Router } from '@angular/router';
4
5
  import { LoadingService } from '@ng-atomic/common/services/loading';
5
6
  import { SideAppService } from '@ng-atomic/common/services/side-app';
6
7
  import { SideNavModeService } from '@ng-atomic/common/services/side-nav-mode';
@@ -8,11 +9,55 @@ import { FabService } from '@ng-atomic/common/services/fab';
8
9
  import { SnackBarService } from '@ng-atomic/common/services/snack-bar';
9
10
  import { Clipboard } from '@angular/cdk/clipboard';
10
11
  import { MatDialog } from '@angular/material/dialog';
12
+ import { SheetService } from '@ng-atomic/common/services/sheets';
11
13
 
14
+ class HistoryInjectorService {
15
+ constructor(router) {
16
+ this.router = router;
17
+ this.isInitialNavigation = true;
18
+ this.router.events.subscribe((event) => {
19
+ if (event instanceof NavigationStart && this.isInitialNavigation) {
20
+ this.isInitialNavigation = false; // 最初のナビゲーションのみ適用
21
+ this.injectParentRoutes(event.url);
22
+ }
23
+ });
24
+ }
25
+ async injectParentRoutes(currentUrl) {
26
+ const urlTree = this.router.parseUrl(currentUrl);
27
+ const segments = this.getFilteredSegments(urlTree);
28
+ console.debug('[HistoryInjector] Filtered segments:', segments);
29
+ if (segments.length > 1) {
30
+ for (let i = 1; i < segments.length; i++) {
31
+ const parentUrl = '/' + segments.slice(0, i).map(segment => segment.path).join('/');
32
+ console.debug('[HistoryInjector] Adding parent URL to history:', parentUrl);
33
+ await this.router.navigateByUrl(parentUrl);
34
+ }
35
+ // 最終的に元のURLに遷移
36
+ await this.router.navigateByUrl(currentUrl);
37
+ }
38
+ }
39
+ getFilteredSegments(urlTree) {
40
+ const segments = urlTree.root.children['primary']?.segments || [];
41
+ // `skip=true`のマトリクスパラメーターが含まれるセグメントを除外
42
+ return segments.filter(segment => {
43
+ const skip = segment.parameterMap.get('skip');
44
+ return skip !== 'true';
45
+ });
46
+ }
47
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: HistoryInjectorService, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
48
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: HistoryInjectorService, providedIn: 'root' }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: HistoryInjectorService, decorators: [{
51
+ type: Injectable,
52
+ args: [{
53
+ providedIn: 'root',
54
+ }]
55
+ }], ctorParameters: () => [{ type: i1.Router }] });
12
56
  class AppService {
13
57
  constructor() {
14
58
  this.dialog = inject(MatDialog);
15
59
  this.loading = inject(LoadingService);
60
+ this.sheet = inject(SheetService);
16
61
  this.sideApp = inject(SideAppService);
17
62
  this.sideNavMode = inject(SideNavModeService);
18
63
  this.sideNav = inject(SideNavModeService);
@@ -20,6 +65,7 @@ class AppService {
20
65
  this.fab = inject(FabService);
21
66
  this.snackBar = inject(SnackBarService);
22
67
  this.clipboard = inject(Clipboard);
68
+ this.navigationInterceptor = inject(HistoryInjectorService);
23
69
  }
24
70
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: AppService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
25
71
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: AppService, providedIn: 'root' }); }
@@ -35,5 +81,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
35
81
  * Generated bundle index. Do not edit.
36
82
  */
37
83
 
38
- export { AppService };
84
+ export { AppService, HistoryInjectorService };
39
85
  //# sourceMappingURL=ng-atomic-common-services-app.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-app.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/app/app.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/app/ng-atomic-common-services-app.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { LoadingService } from '@ng-atomic/common/services/loading';\nimport { SideAppService } from '@ng-atomic/common/services/side-app';\nimport { SideNavModeService } from '@ng-atomic/common/services/side-nav-mode';\nimport { FabService } from '@ng-atomic/common/services/fab';\nimport { SnackBarService } from '@ng-atomic/common/services/snack-bar';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppService {\n readonly dialog = inject(MatDialog);\n readonly loading = inject(LoadingService);\n readonly sideApp = inject(SideAppService);\n readonly sideNavMode = inject(SideNavModeService);\n readonly sideNav = inject(SideNavModeService);\n readonly router = inject(Router);\n readonly fab = inject(FabService);\n readonly snackBar = inject(SnackBarService);\n readonly clipboard = inject(Clipboard);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;MAaa,UAAU,CAAA;AAHvB,IAAA,WAAA,GAAA;AAIW,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC3B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACzC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACrC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACzB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACnC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,KAAA;8GAVY,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACZD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-services-app.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/app/app.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/app/ng-atomic-common-services-app.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { NavigationStart, Router, UrlSegment, UrlTree } from '@angular/router';\nimport { LoadingService } from '@ng-atomic/common/services/loading';\nimport { SideAppService } from '@ng-atomic/common/services/side-app';\nimport { SideNavModeService } from '@ng-atomic/common/services/side-nav-mode';\nimport { FabService } from '@ng-atomic/common/services/fab';\nimport { SnackBarService } from '@ng-atomic/common/services/snack-bar';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { MatDialog } from '@angular/material/dialog';\nimport { SheetService } from '@ng-atomic/common/services/sheets';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HistoryInjectorService {\n private isInitialNavigation = true;\n\n constructor(private router: Router) {\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart && this.isInitialNavigation) {\n this.isInitialNavigation = false; // 最初のナビゲーションのみ適用\n this.injectParentRoutes(event.url);\n }\n });\n }\n\n private async injectParentRoutes(currentUrl: string): Promise<void> {\n const urlTree: UrlTree = this.router.parseUrl(currentUrl);\n const segments = this.getFilteredSegments(urlTree);\n\n console.debug('[HistoryInjector] Filtered segments:', segments);\n\n if (segments.length > 1) {\n for (let i = 1; i < segments.length; i++) {\n const parentUrl = '/' + segments.slice(0, i).map(segment => segment.path).join('/');\n console.debug('[HistoryInjector] Adding parent URL to history:', parentUrl);\n await this.router.navigateByUrl(parentUrl);\n }\n\n // 最終的に元のURLに遷移\n await this.router.navigateByUrl(currentUrl);\n }\n }\n\n private getFilteredSegments(urlTree: UrlTree): UrlSegment[] {\n const segments = urlTree.root.children['primary']?.segments || [];\n\n // `skip=true`のマトリクスパラメーターが含まれるセグメントを除外\n return segments.filter(segment => {\n const skip = segment.parameterMap.get('skip');\n return skip !== 'true';\n });\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppService {\n readonly dialog = inject(MatDialog);\n readonly loading = inject(LoadingService);\n readonly sheet = inject(SheetService);\n readonly sideApp = inject(SideAppService);\n readonly sideNavMode = inject(SideNavModeService);\n readonly sideNav = inject(SideNavModeService);\n readonly router = inject(Router);\n readonly fab = inject(FabService);\n readonly snackBar = inject(SnackBarService);\n readonly clipboard = inject(Clipboard);\n readonly navigationInterceptor = inject(HistoryInjectorService);\n \n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, inject, Injectable } from '@angular/core';
3
- import { toSignal } from '@angular/core/rxjs-interop';
2
+ import { signal, inject, computed, isSignal, Injectable } from '@angular/core';
4
3
  import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
4
+ import { computedAsync } from 'ngxtension/computed-async';
5
5
  import { filter, map, switchMap } from 'rxjs';
6
6
 
7
7
  class FabService {
@@ -10,8 +10,14 @@ class FabService {
10
10
  this.router = inject(Router);
11
11
  this.route = inject(ActivatedRoute);
12
12
  this.route$ = this.router.events.pipe(filter(event => event instanceof NavigationEnd), map(() => this.findLastChild(this.route)));
13
- this.actions$ = this.route$.pipe(switchMap((route) => route.data), map(data => data.fabActions || []));
14
- this.actions = toSignal(this.actions$);
13
+ this.data = computedAsync(() => {
14
+ return this.route$.pipe(switchMap((route) => route.data));
15
+ });
16
+ this.actions = computed(() => {
17
+ return isSignal(this.data()?.fabActions)
18
+ ? this.data().fabActions()
19
+ : this.data()?.fabActions || [];
20
+ });
15
21
  }
16
22
  findLastChild(route) {
17
23
  let child = route;
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-fab.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/fab/fab.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/fab/ng-atomic-common-services-fab.ts"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { Action } from '@ng-atomic/core';\nimport { filter, map, Observable, switchMap, tap } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FabService {\n readonly hidden = signal(false);\n protected readonly router = inject(Router);\n protected readonly route = inject(ActivatedRoute);\n readonly route$ = this.router.events.pipe(\n filter(event => event instanceof NavigationEnd),\n map(() => this.findLastChild(this.route)),\n );\n\n readonly actions$: Observable<Action[]> = this.route$.pipe(\n switchMap((route) => route.data),\n map(data => data.fabActions || []),\n );\n readonly actions = toSignal(this.actions$);\n\n private findLastChild(route: ActivatedRoute): ActivatedRoute {\n let child = route;\n while (child.firstChild) {\n child = child.firstChild;\n }\n return child;\n }\n\n show() {\n this.hidden.set(false);\n }\n\n hide() {\n this.hidden.set(true);\n }\n\n toggle() {\n this.hidden.update(hidden => !hidden);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MASa,UAAU,CAAA;AAHvB,IAAA,WAAA,GAAA;AAIW,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACb,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACzC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACvC,MAAM,CAAC,KAAK,IAAI,KAAK,YAAY,aAAa,CAAC,EAC/C,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC1C,CAAC;AAEO,QAAA,IAAA,CAAA,QAAQ,GAAyB,IAAI,CAAC,MAAM,CAAC,IAAI,CACxD,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,EAChC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CACnC,CAAC;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAqB5C,KAAA;AAnBS,IAAA,aAAa,CAAC,KAAqB,EAAA;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE;AACvB,YAAA,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;SAC1B;AACD,QAAA,OAAO,KAAK,CAAC;KACd;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACxB;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;KACvC;8GAjCU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACRD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-services-fab.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/fab/fab.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/fab/ng-atomic-common-services-fab.ts"],"sourcesContent":["import { computed, inject, Injectable, isSignal, Signal, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { Action } from '@ng-atomic/core';\nimport { computedAsync } from 'ngxtension/computed-async';\nimport { filter, map, Observable, switchMap, tap } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FabService {\n readonly hidden = signal(false);\n protected readonly router = inject(Router);\n protected readonly route = inject(ActivatedRoute);\n readonly route$ = this.router.events.pipe(\n filter(event => event instanceof NavigationEnd),\n map(() => this.findLastChild(this.route)),\n );\n\n readonly data = computedAsync(() => {\n return this.route$.pipe(\n switchMap((route) => route.data),\n );\n });\n\n readonly actions = computed(() => {\n return isSignal(this.data()?.fabActions)\n ? this.data().fabActions()\n : this.data()?.fabActions || [];\n });\n\n private findLastChild(route: ActivatedRoute): ActivatedRoute {\n let child = route;\n while (child.firstChild) {\n child = child.firstChild;\n }\n return child;\n }\n\n show() {\n this.hidden.set(false);\n }\n\n hide() {\n this.hidden.set(true);\n }\n\n toggle() {\n this.hidden.update(hidden => !hidden);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAUa,UAAU,CAAA;AAHvB,IAAA,WAAA,GAAA;AAIW,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACb,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACzC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACvC,MAAM,CAAC,KAAK,IAAI,KAAK,YAAY,aAAa,CAAC,EAC/C,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC1C,CAAC;AAEO,QAAA,IAAA,CAAA,IAAI,GAAG,aAAa,CAAC,MAAK;AACjC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CACjC,CAAC;AACJ,SAAC,CAAC,CAAC;AAEM,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;YAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC;AACtC,kBAAE,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE;kBACxB,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC;AACpC,SAAC,CAAC,CAAC;AAqBJ,KAAA;AAnBS,IAAA,aAAa,CAAC,KAAqB,EAAA;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE;AACvB,YAAA,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;SAC1B;AACD,QAAA,OAAO,KAAK,CAAC;KACd;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACxB;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;KACvC;8GAvCU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACTD;;AAEG;;;;"}
@@ -35,7 +35,7 @@ function injectIndexFormBuilder() {
35
35
  return inject(IndexFormBuilder);
36
36
  }
37
37
  function injectIndexForm({ columns = undefined, sort = undefined, query = undefined, page = undefined } = {}) {
38
- return inject(IndexFormBuilder).build({
38
+ return injectIndexFormBuilder().build({
39
39
  columns,
40
40
  sort,
41
41
  query,
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-form-_index.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/form/_index/index.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/form/_index/ng-atomic-common-services-form-_index.ts"],"sourcesContent":["import { Injectable, inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { PaginationFormValue, PaginationService } from \"@ng-atomic/common/services/form/pagination\";\nimport { SortFormValue, SortService } from \"@ng-atomic/common/services/form/sort\";\nimport { injectProps } from \"@ng-atomic/common/pipes/domain\";\nimport { ColumnsFormBuilder, buildColumns, ColumnsFormValue } from \"@ng-atomic/common/services/form/columns\";\nimport { omitBy } from \"lodash-es\";\nexport { buildColumns }; \n\n@Injectable({ providedIn: 'root' })\nexport class IndexFormBuilder {\n readonly columns = inject(ColumnsFormBuilder);\n readonly sort = inject(SortService);\n readonly pagination = inject(PaginationService)\n readonly fb = inject(FormBuilder);\n\n build({\n query = undefined,\n sort = {},\n page,\n columns = buildColumns(['__checkbox', ...injectProps()(), '__actions'])\n }: {\n query?: string,\n page?: Partial<PaginationFormValue>,\n sort?: Partial<SortFormValue>,\n columns?: ColumnsFormValue,\n } = {}) {\n const omit = <T extends object>(obj: T) => omitBy(obj, value => value === undefined) as T;\n return this.fb.group(omit({\n query: typeof query !== 'undefined' ? this.fb.control(query) : undefined,\n page: page ? this.pagination.build(page) : undefined,\n sort: this.sort.build(sort),\n columns: this.columns.build(columns),\n }));\n }\n}\n\n\nexport function injectIndexFormBuilder() {\n return inject(IndexFormBuilder);\n}\n\nexport function injectIndexForm({\n columns = undefined,\n sort = undefined,\n query = undefined,\n page = undefined\n}: {\n columns?: ColumnsFormValue,\n sort?: Partial<SortFormValue>,\n query?: string,\n page?: Partial<PaginationFormValue>,\n} = {}) {\n return inject(IndexFormBuilder).build({\n columns,\n sort,\n query,\n page,\n });\n}\n\nexport {\n /** @deprecates use instead `IndexFormBuilder` */\n IndexFormBuilder as IndexTemplateFormBuilder,\n /** @deprecates use instead `injectIndexForm` */\n injectIndexForm as injectIndexTemplateForm,\n /** @deprecates use instead `injectIndexFormBuilder` */\n injectIndexFormBuilder as injectIndexTemplateFormBuilder,\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAUa,gBAAgB,CAAA;AAD7B,IAAA,WAAA,GAAA;AAEW,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACrC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACtC,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAqBnC,KAAA;AAnBC,IAAA,KAAK,CAAC,EACJ,KAAK,GAAG,SAAS,EACjB,IAAI,GAAG,EAAE,EACT,IAAI,EACJ,OAAO,GAAG,YAAY,CAAC,CAAC,YAAY,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,EAAA,GAMrE,EAAE,EAAA;AACJ,QAAA,MAAM,IAAI,GAAG,CAAmB,GAAM,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,SAAS,CAAM,CAAC;AAC1F,QAAA,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACxB,YAAA,KAAK,EAAE,OAAO,KAAK,KAAK,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS;AACxE,YAAA,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC,SAAA,CAAC,CAAC,CAAC;KACL;8GAxBU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;SA6BlB,sBAAsB,GAAA;AACpC,IAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClC,CAAC;AAEK,SAAU,eAAe,CAAC,EAC9B,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,SAAS,EAChB,KAAK,GAAG,SAAS,EACjB,IAAI,GAAG,SAAS,KAMd,EAAE,EAAA;AACJ,IAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC;QACpC,OAAO;QACP,IAAI;QACJ,KAAK;QACL,IAAI;AACL,KAAA,CAAC,CAAC;AACL;;AC3DA;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-services-form-_index.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/form/_index/index.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/form/_index/ng-atomic-common-services-form-_index.ts"],"sourcesContent":["import { Injectable, inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { PaginationFormValue, PaginationService } from \"@ng-atomic/common/services/form/pagination\";\nimport { SortFormValue, SortService } from \"@ng-atomic/common/services/form/sort\";\nimport { injectProps } from \"@ng-atomic/common/pipes/domain\";\nimport { ColumnsFormBuilder, buildColumns, ColumnsFormValue } from \"@ng-atomic/common/services/form/columns\";\nimport { omitBy } from \"lodash-es\";\nexport { buildColumns }; \n\n@Injectable({ providedIn: 'root' })\nexport class IndexFormBuilder {\n readonly columns = inject(ColumnsFormBuilder);\n readonly sort = inject(SortService);\n readonly pagination = inject(PaginationService)\n readonly fb = inject(FormBuilder);\n\n build({\n query = undefined,\n sort = {},\n page,\n columns = buildColumns(['__checkbox', ...injectProps()(), '__actions'])\n }: {\n query?: string,\n page?: Partial<PaginationFormValue>,\n sort?: Partial<SortFormValue>,\n columns?: ColumnsFormValue,\n } = {}) {\n const omit = <T extends object>(obj: T) => omitBy(obj, value => value === undefined) as T;\n return this.fb.group(omit({\n query: typeof query !== 'undefined' ? this.fb.control(query) : undefined,\n page: page ? this.pagination.build(page) : undefined,\n sort: this.sort.build(sort),\n columns: this.columns.build(columns),\n }));\n }\n}\n\n\nexport function injectIndexFormBuilder() {\n return inject(IndexFormBuilder);\n}\n\nexport function injectIndexForm({\n columns = undefined,\n sort = undefined,\n query = undefined,\n page = undefined\n}: {\n columns?: ColumnsFormValue,\n sort?: Partial<SortFormValue>,\n query?: string,\n page?: Partial<PaginationFormValue>,\n} = {}) {\n return injectIndexFormBuilder().build({\n columns,\n sort,\n query,\n page,\n });\n}\n\nexport {\n /** @deprecates use instead `IndexFormBuilder` */\n IndexFormBuilder as IndexTemplateFormBuilder,\n /** @deprecates use instead `injectIndexForm` */\n injectIndexForm as injectIndexTemplateForm,\n /** @deprecates use instead `injectIndexFormBuilder` */\n injectIndexFormBuilder as injectIndexTemplateFormBuilder,\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAUa,gBAAgB,CAAA;AAD7B,IAAA,WAAA,GAAA;AAEW,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACrC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACtC,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAqBnC,KAAA;AAnBC,IAAA,KAAK,CAAC,EACJ,KAAK,GAAG,SAAS,EACjB,IAAI,GAAG,EAAE,EACT,IAAI,EACJ,OAAO,GAAG,YAAY,CAAC,CAAC,YAAY,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,EAAA,GAMrE,EAAE,EAAA;AACJ,QAAA,MAAM,IAAI,GAAG,CAAmB,GAAM,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,SAAS,CAAM,CAAC;AAC1F,QAAA,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACxB,YAAA,KAAK,EAAE,OAAO,KAAK,KAAK,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS;AACxE,YAAA,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC,SAAA,CAAC,CAAC,CAAC;KACL;8GAxBU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;SA6BlB,sBAAsB,GAAA;AACpC,IAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClC,CAAC;AAEK,SAAU,eAAe,CAAC,EAC9B,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,SAAS,EAChB,KAAK,GAAG,SAAS,EACjB,IAAI,GAAG,SAAS,KAMd,EAAE,EAAA;AACJ,IAAA,OAAO,sBAAsB,EAAE,CAAC,KAAK,CAAC;QACpC,OAAO;QACP,IAAI;QACJ,KAAK;QACL,IAAI;AACL,KAAA,CAAC,CAAC;AACL;;AC3DA;;AAEG;;;;"}
@@ -39,26 +39,30 @@ class ColumnsFormBuilder {
39
39
  type: this.fb.control({ value: 'tree', disabled: true }),
40
40
  headerText: this.fb.control(column.headerText),
41
41
  visible: this.fb.control(column.visible),
42
- width: this.fb.control(80),
42
+ width: this.fb.control(column.width),
43
+ sticky: this.fb.control(column.sticky),
43
44
  });
44
45
  case 'text':
45
46
  return this.fb.group({
46
47
  type: this.fb.control({ value: 'text', disabled: true }),
47
48
  visible: this.fb.control(column.visible),
48
- width: this.fb.control(80),
49
+ width: this.fb.control(column.width),
50
+ sticky: this.fb.control(column.sticky),
49
51
  });
50
52
  case 'checkbox':
51
53
  return this.fb.group({
52
54
  type: this.fb.control({ value: 'checkbox', disabled: true }),
53
55
  visible: this.fb.control(column.visible),
54
- width: this.fb.control(80),
56
+ width: this.fb.control(column.width),
57
+ sticky: this.fb.control(column.sticky),
55
58
  });
56
59
  case 'actions':
57
60
  return this.fb.group({
58
61
  type: this.fb.control({ value: 'actions', disabled: true }),
59
62
  visible: this.fb.control(column.visible),
60
- width: this.fb.control(80),
63
+ width: this.fb.control(column.width),
61
64
  actions: this.fb.control(column.actions),
65
+ sticky: this.fb.control(column.sticky),
62
66
  });
63
67
  default:
64
68
  throw new Error(`Unknown column type: ${column.type}`);
@@ -74,7 +78,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
74
78
  function injectColumnsForm() {
75
79
  return inject(ColumnsFormBuilder).build();
76
80
  }
77
- function toColumns(column, i) {
81
+ function toColumns(column, i, sticky) {
78
82
  if (typeof column === 'string') {
79
83
  if (column === '__actions') {
80
84
  return {
@@ -82,6 +86,7 @@ function toColumns(column, i) {
82
86
  name: `actions_${i}`,
83
87
  visible: true,
84
88
  width: 80,
89
+ sticky,
85
90
  };
86
91
  }
87
92
  else if (column === '__checkbox') {
@@ -89,7 +94,8 @@ function toColumns(column, i) {
89
94
  type: 'checkbox',
90
95
  name: 'checkbox',
91
96
  visible: true,
92
- width: 80,
97
+ width: 24,
98
+ sticky,
93
99
  };
94
100
  }
95
101
  else if (column.startsWith('__tree')) {
@@ -98,7 +104,8 @@ function toColumns(column, i) {
98
104
  name: column.split('__tree_')?.[1] ?? '__tree',
99
105
  headerText: column.split('__tree_')?.[1] ?? '',
100
106
  visible: true,
101
- width: 200,
107
+ width: 320,
108
+ sticky,
102
109
  };
103
110
  }
104
111
  else {
@@ -107,6 +114,7 @@ function toColumns(column, i) {
107
114
  name: column,
108
115
  visible: true,
109
116
  width: 80,
117
+ sticky,
110
118
  };
111
119
  }
112
120
  }
@@ -116,12 +124,13 @@ function toColumns(column, i) {
116
124
  name: `actions_${i}`,
117
125
  visible: true,
118
126
  width: 80,
127
+ sticky,
119
128
  actions: wrapActions(column),
120
129
  };
121
130
  }
122
131
  }
123
- function buildColumns(columns) {
124
- const _columns = columns.map((column, i) => toColumns(column, i));
132
+ function buildColumns(columns, { stickyStart = 0, stickyEnd = 0, } = {}) {
133
+ const _columns = columns.map((column, i) => toColumns(column, i, i < stickyStart || i >= columns.length - stickyEnd));
125
134
  return {
126
135
  ids: _columns.map((column) => column.name),
127
136
  map: _columns.reduce((obj, column) => ({ ...obj, [column.name]: column }), {}),
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-form-columns.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/form/columns/columns.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/form/columns/ng-atomic-common-services-form-columns.ts"],"sourcesContent":["import { inject, Injectable } from \"@angular/core\";\nimport { FormArray, FormBuilder, FormControl, FormGroup, FormRecord, Validators } from \"@angular/forms\";\nimport { Actions, wrapActions } from \"@ng-atomic/core\";\nimport { Column } from \"@ng-atomic/common/models\";\n\nexport type ActionsColumnForm = FormGroup<{\n type: FormControl<'actions'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n actions: FormControl<any>,\n}>;\n\nexport type CheckboxColumnForm = FormGroup<{\n type: FormControl<'checkbox'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n}>;\n\nexport type TextColumnForm = FormGroup<{\n type: FormControl<'text'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n}>;\n\nexport type TreeColumnForm = FormGroup<{\n type: FormControl<'tree'>,\n headerText: FormControl<string>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n}>;\n\nexport type ColumnsForm = FormArray<FormRecord<ActionsColumnForm | CheckboxColumnForm | TextColumnForm | TreeColumnForm>>;\n\nexport interface ColumnsFormValue {\n ids: string[],\n map: { [key: string]: Column },\n}\n\n@Injectable({providedIn: 'root'})\nexport class ColumnsFormBuilder {\n protected readonly fb = inject(FormBuilder).nonNullable;\n\n build(columns: ColumnsFormValue = {\n ids: ['id', 'user'],\n map: {\n user: {\n type: 'text' as const,\n headerText: 'User',\n width: 80,\n visible: true,\n },\n id: {\n type: 'text',\n headerText: 'ID',\n width: 80,\n visible: true,\n },\n },\n }) {\n return this.fb.group({\n ids: this.fb.control(columns.ids, Validators.required),\n map: this.fb.group(Object.entries(columns.map).reduce((obj, [key, value]) => ({\n ...obj,\n [key]: this.buildColumnForm(value),\n }), {})),\n });\n }\n\n protected buildColumnForm(column: Column) {\n switch (column.type) {\n case 'tree':\n return this.fb.group({\n type: this.fb.control({value: 'tree' as const, disabled: true}),\n headerText: this.fb.control(column.headerText),\n visible: this.fb.control(column.visible),\n width: this.fb.control(80),\n }) as TreeColumnForm;\n case 'text': \n return this.fb.group({\n type: this.fb.control({value: 'text' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(80),\n }) as TextColumnForm;\n case 'checkbox':\n return this.fb.group({\n type: this.fb.control({value: 'checkbox' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(80),\n }) as CheckboxColumnForm;\n case 'actions':\n return this.fb.group({\n type: this.fb.control({value: 'actions' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(80),\n actions: this.fb.control(column.actions),\n }) as ActionsColumnForm;\n default:\n throw new Error(`Unknown column type: ${(column as any).type}`);\n }\n }\n}\n\nexport function injectColumnsForm() {\n return inject(ColumnsFormBuilder).build();\n}\n\nfunction toColumns(column: (string | Actions), i: number): Column {\n if (typeof column === 'string') {\n if (column === '__actions') {\n return {\n type: 'actions',\n name: `actions_${i}`,\n visible: true,\n width: 80,\n }\n } else if (column === '__checkbox') {\n return {\n type: 'checkbox',\n name: 'checkbox',\n visible: true,\n width: 80,\n }\n } else if (column.startsWith('__tree')) {\n return {\n type: 'tree',\n name: column.split('__tree_')?.[1] ?? '__tree',\n headerText: column.split('__tree_')?.[1] ?? '',\n visible: true,\n width: 200,\n }\n } else {\n return {\n type: 'text',\n name: column,\n visible: true,\n width: 80,\n };\n } \n } else {\n return {\n type: 'actions',\n name: `actions_${i}`,\n visible: true,\n width: 80,\n actions: wrapActions(column),\n };\n }\n}\n\nexport function buildColumns(columns: (string | Actions)[]): {ids: string[], map: {[key: string]: Column}} {\n const _columns = columns.map((column, i) => toColumns(column, i));\n return {\n ids: _columns.map((column) => column.name),\n map: _columns.reduce((obj, column) => ({...obj, [column.name]: column}), {}),\n };\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-atomic-common-services-form-columns.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/form/columns/columns.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/form/columns/ng-atomic-common-services-form-columns.ts"],"sourcesContent":["import { inject, Injectable } from \"@angular/core\";\nimport { FormArray, FormBuilder, FormControl, FormGroup, FormRecord, Validators } from \"@angular/forms\";\nimport { Actions, wrapActions } from \"@ng-atomic/core\";\nimport { Column } from \"@ng-atomic/common/models\";\n\nexport type ActionsColumnForm = FormGroup<{\n type: FormControl<'actions'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n actions: FormControl<any>,\n sticky: FormControl<boolean>,\n}>;\n\nexport type CheckboxColumnForm = FormGroup<{\n type: FormControl<'checkbox'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n sticky: FormControl<boolean>,\n}>;\n\nexport type TextColumnForm = FormGroup<{\n type: FormControl<'text'>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n sticky: FormControl<boolean>,\n}>;\n\nexport type TreeColumnForm = FormGroup<{\n type: FormControl<'tree'>,\n headerText: FormControl<string>,\n visible: FormControl<boolean>,\n width: FormControl<number>,\n sticky: FormControl<boolean>,\n}>;\n\nexport type ColumnsForm = FormArray<FormRecord<ActionsColumnForm | CheckboxColumnForm | TextColumnForm | TreeColumnForm>>;\n\nexport interface ColumnsFormValue {\n ids: string[],\n map: { [key: string]: Column },\n}\n\n@Injectable({providedIn: 'root'})\nexport class ColumnsFormBuilder {\n protected readonly fb = inject(FormBuilder).nonNullable;\n\n build(columns: ColumnsFormValue = {\n ids: ['id', 'user'],\n map: {\n user: {\n type: 'text' as const,\n headerText: 'User',\n width: 80,\n visible: true,\n },\n id: {\n type: 'text',\n headerText: 'ID',\n width: 80,\n visible: true,\n },\n },\n }) {\n return this.fb.group({\n ids: this.fb.control(columns.ids, Validators.required),\n map: this.fb.group(Object.entries(columns.map).reduce((obj, [key, value]) => ({\n ...obj,\n [key]: this.buildColumnForm(value),\n }), {})),\n });\n }\n\n protected buildColumnForm(column: Column) {\n switch (column.type) {\n case 'tree':\n return this.fb.group({\n type: this.fb.control({value: 'tree' as const, disabled: true}),\n headerText: this.fb.control(column.headerText),\n visible: this.fb.control(column.visible),\n width: this.fb.control(column.width),\n sticky: this.fb.control(column.sticky),\n }) as TreeColumnForm;\n case 'text': \n return this.fb.group({\n type: this.fb.control({value: 'text' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(column.width),\n sticky: this.fb.control(column.sticky),\n }) as TextColumnForm;\n case 'checkbox':\n return this.fb.group({\n type: this.fb.control({value: 'checkbox' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(column.width),\n sticky: this.fb.control(column.sticky),\n }) as CheckboxColumnForm;\n case 'actions':\n return this.fb.group({\n type: this.fb.control({value: 'actions' as const, disabled: true}),\n visible: this.fb.control(column.visible),\n width: this.fb.control(column.width),\n actions: this.fb.control(column.actions),\n sticky: this.fb.control(column.sticky),\n }) as ActionsColumnForm;\n default:\n throw new Error(`Unknown column type: ${(column as any).type}`);\n }\n }\n}\n\nexport function injectColumnsForm() {\n return inject(ColumnsFormBuilder).build();\n}\n\nfunction toColumns(column: (string | Actions), i: number, sticky: boolean): Column {\n if (typeof column === 'string') {\n if (column === '__actions') {\n return {\n type: 'actions',\n name: `actions_${i}`,\n visible: true,\n width: 80,\n sticky,\n }\n } else if (column === '__checkbox') {\n return {\n type: 'checkbox',\n name: 'checkbox',\n visible: true,\n width: 24,\n sticky,\n }\n } else if (column.startsWith('__tree')) {\n return {\n type: 'tree',\n name: column.split('__tree_')?.[1] ?? '__tree',\n headerText: column.split('__tree_')?.[1] ?? '',\n visible: true,\n width: 320,\n sticky,\n }\n } else {\n return {\n type: 'text',\n name: column,\n visible: true,\n width: 80,\n sticky,\n };\n } \n } else {\n return {\n type: 'actions',\n name: `actions_${i}`,\n visible: true,\n width: 80,\n sticky,\n actions: wrapActions(column),\n };\n }\n}\n\nexport function buildColumns(columns: (string | Actions)[], {\n stickyStart = 0,\n stickyEnd = 0,\n}: {\n stickyStart?: number,\n stickyEnd?: number,\n} = {}): {ids: string[], map: {[key: string]: Column}} {\n const _columns = columns.map((column, i) => toColumns(column, i, i < stickyStart || i >= columns.length - stickyEnd));\n return {\n ids: _columns.map((column) => column.name),\n map: _columns.reduce((obj, column) => ({...obj, [column.name]: column}), {}),\n };\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { Validators, FormBuilder } from '@angular/forms';
4
+ import { ValidationTypes } from 'class-validator';
5
+ import { targetConstructorToSchema as targetConstructorToSchema$1 } from 'class-validator-jsonschema';
6
+ import { defaultMetadataStorage } from 'class-transformer/esm5/storage';
7
+ import { merge } from 'lodash-es';
8
+
9
+ function getPropType(target, property) {
10
+ return Reflect.getMetadata('design:type', target, property);
11
+ }
12
+ function targetToSchema(type, options) {
13
+ if (typeof type === 'function') {
14
+ if (type.prototype === String.prototype ||
15
+ type.prototype === Symbol.prototype) {
16
+ return { type: 'string' };
17
+ }
18
+ else if (type.prototype === Number.prototype) {
19
+ return { type: 'number' };
20
+ }
21
+ else if (type.prototype === Boolean.prototype) {
22
+ return { type: 'boolean' };
23
+ }
24
+ return targetConstructorToSchema(type, options);
25
+ }
26
+ }
27
+ const additionalConverters = {
28
+ [ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
29
+ if (typeof meta.target === 'function') {
30
+ const typeMeta = options.classTransformerMetadataStorage
31
+ ? options.classTransformerMetadataStorage.findTypeMetadata(meta.target, meta.propertyName)
32
+ : null;
33
+ const childType = typeMeta
34
+ ? typeMeta.typeFunction()
35
+ : getPropType(meta.target.prototype, meta.propertyName);
36
+ return targetToSchema(childType, options);
37
+ }
38
+ },
39
+ isDayjs: (meta) => {
40
+ return {
41
+ type: 'string',
42
+ format: 'date-time', // JSON Schemaで日付型を指定
43
+ };
44
+ },
45
+ };
46
+ function targetConstructorToSchema(target, options = {}) {
47
+ return targetConstructorToSchema$1(target, {
48
+ ...options,
49
+ additionalConverters,
50
+ classTransformerMetadataStorage: defaultMetadataStorage,
51
+ });
52
+ }
53
+
54
+ function buildFormGroupByJsonSchema(schema, { fb = inject(FormBuilder).nonNullable, value = {}, } = {}) {
55
+ if (!schema || !schema?.properties) {
56
+ return fb.group({});
57
+ }
58
+ const group = {};
59
+ for (const key in schema.properties) {
60
+ const property = schema.properties[key];
61
+ const validators = [];
62
+ if (schema.required && schema.required.includes(key)) {
63
+ validators.push(Validators.required);
64
+ }
65
+ group[key] = buildFormByJsonSchemaProperty(property, { fb, value: value?.[key], validators });
66
+ }
67
+ return fb.group(group);
68
+ }
69
+ function buildFormArrayByJsonSchema(schema, { fb = inject(FormBuilder).nonNullable, value = [], } = {}) {
70
+ if (!schema || !schema.items) {
71
+ return fb.array([]);
72
+ }
73
+ console.debug('[buildFormArrayByJsonSchema] schema:', schema);
74
+ const array = fb.array([
75
+ buildFormGroupByJsonSchema(schema.items, { fb }),
76
+ ]);
77
+ return array;
78
+ }
79
+ function buildFormByJsonSchemaProperty(property, { fb = inject(FormBuilder).nonNullable, value = null, validators = [], } = {}) {
80
+ if (property.type === 'string') {
81
+ if (property.format === 'date-time') {
82
+ return fb.control(value ?? property.default ?? null, validators);
83
+ }
84
+ else if (property.format === 'binary') {
85
+ return fb.control(value ?? property.default ?? null, validators);
86
+ }
87
+ else {
88
+ return fb.control(value ?? property.default ?? '', validators);
89
+ }
90
+ }
91
+ else if (property.type === 'integer') {
92
+ return fb.control(value ?? property.default ?? 0, validators);
93
+ }
94
+ else if (property.type === 'number') {
95
+ return fb.control(value ?? property.default ?? 0, validators);
96
+ }
97
+ else if (property.type === 'object') {
98
+ return buildFormGroupByJsonSchema(property, { fb, value: (value || {}) });
99
+ }
100
+ else if (property.type === 'array') {
101
+ return buildFormArrayByJsonSchema(property, { fb, value: (value || []) });
102
+ }
103
+ }
104
+ function buildFormFieldMapByJsonSchema(schema, options = {}) {
105
+ if (!schema || !schema.properties) {
106
+ return {
107
+ id: { type: 'hidden' },
108
+ };
109
+ }
110
+ const fieldMap = {};
111
+ for (const key in schema.properties) {
112
+ const property = schema.properties[key];
113
+ if (property.type === 'string') {
114
+ if (property.enum) {
115
+ fieldMap[key] = { type: 'select', options: property.enum.map((v) => ({ value: v, name: v })) };
116
+ }
117
+ else if (property.format === 'date-time') {
118
+ fieldMap[key] = { type: 'date' };
119
+ }
120
+ else if (property.format === 'binary') {
121
+ fieldMap[key] = { type: 'file' };
122
+ }
123
+ else {
124
+ fieldMap[key] = { type: 'text' };
125
+ }
126
+ }
127
+ else if (property.type === 'object') {
128
+ const childFieldMap = buildFormFieldMapByJsonSchema(property, options);
129
+ for (const childKey in childFieldMap) {
130
+ fieldMap[`${key}.${childKey}`] = childFieldMap[childKey];
131
+ }
132
+ }
133
+ else if (property.type === 'array') {
134
+ const childFieldMap = buildFormFieldMapByJsonSchema(property.items, options);
135
+ for (const childKey in childFieldMap) {
136
+ // TODO: 正規表現でパスマッチを判定できるようにする。
137
+ fieldMap[`${key}.\\d+.${childKey}`] = childFieldMap[childKey];
138
+ }
139
+ }
140
+ else {
141
+ fieldMap[key] = { type: property.type };
142
+ }
143
+ // const type = ? 'date' : property.type;
144
+ }
145
+ console.debug('[buildFormFieldMapByJsonSchema] fieldMap:', fieldMap);
146
+ return merge(fieldMap, options.merge);
147
+ }
148
+ function buildFormByJsonSchema(schema, { fb = inject(FormBuilder).nonNullable, value = {}, fieldMap = {}, } = {}) {
149
+ return {
150
+ form: buildFormGroupByJsonSchema(schema, { fb, value }),
151
+ fieldMap: buildFormFieldMapByJsonSchema(schema, { merge: fieldMap }),
152
+ };
153
+ }
154
+ function buildFormGroup(klass, { fb = inject(FormBuilder).nonNullable, value, }) {
155
+ const schema = targetConstructorToSchema(klass);
156
+ return buildFormGroupByJsonSchema(schema, { fb, value });
157
+ }
158
+ function buildFormFieldMap(klass, options) {
159
+ const schema = targetConstructorToSchema(klass);
160
+ const map = buildFormFieldMapByJsonSchema(schema, options);
161
+ return merge(map, options.merge);
162
+ }
163
+ function buildForm(klass, { fb = inject(FormBuilder).nonNullable, value = {}, fieldMap = {}, } = {}) {
164
+ const schema = targetConstructorToSchema(klass);
165
+ return {
166
+ form: buildFormGroupByJsonSchema(schema, { fb, value }),
167
+ fieldMap: buildFormFieldMapByJsonSchema(schema, { merge: fieldMap }),
168
+ };
169
+ }
170
+ class JsonSchemaFormService {
171
+ constructor() {
172
+ this.fb = inject(FormBuilder).nonNullable;
173
+ }
174
+ build(schema, { fb = this.fb, value = {}, } = {}) {
175
+ return buildFormGroupByJsonSchema(schema, { fb, value });
176
+ }
177
+ buildFieldMap(schema, options = {}) {
178
+ return buildFormFieldMapByJsonSchema(schema, options);
179
+ }
180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: JsonSchemaFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
181
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: JsonSchemaFormService, providedIn: 'root' }); }
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: JsonSchemaFormService, decorators: [{
184
+ type: Injectable,
185
+ args: [{ providedIn: 'root' }]
186
+ }] });
187
+
188
+ /**
189
+ * Generated bundle index. Do not edit.
190
+ */
191
+
192
+ export { JsonSchemaFormService, buildForm, buildFormArrayByJsonSchema, buildFormByJsonSchema, buildFormByJsonSchemaProperty, buildFormFieldMap, buildFormFieldMapByJsonSchema, buildFormGroup, buildFormGroupByJsonSchema };
193
+ //# sourceMappingURL=ng-atomic-common-services-form-json-schema.mjs.map