@ng-atomic/common 19.0.0-preview.3 → 19.0.0-preview.31

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 (30) hide show
  1. package/common.module.d.ts +1 -1
  2. package/fesm2022/ng-atomic-common-pipes-auto-columns.mjs +1 -1
  3. package/fesm2022/ng-atomic-common-pipes-auto-columns.mjs.map +1 -1
  4. package/fesm2022/ng-atomic-common-pipes-domain.mjs +1 -1
  5. package/fesm2022/ng-atomic-common-pipes-domain.mjs.map +1 -1
  6. package/fesm2022/ng-atomic-common-services-query-resolver.mjs +1 -1
  7. package/fesm2022/ng-atomic-common-services-query-resolver.mjs.map +1 -1
  8. package/fesm2022/ng-atomic-common-services-sheets.mjs +0 -6
  9. package/fesm2022/ng-atomic-common-services-sheets.mjs.map +1 -1
  10. package/fesm2022/ng-atomic-common-services-spreadsheet.mjs +72 -178
  11. package/fesm2022/ng-atomic-common-services-spreadsheet.mjs.map +1 -1
  12. package/fesm2022/ng-atomic-common-stores-entities.mjs.map +1 -1
  13. package/fesm2022/ng-atomic-common-utils.mjs.map +1 -1
  14. package/fesm2022/ng-atomic-common.mjs +6 -45
  15. package/fesm2022/ng-atomic-common.mjs.map +1 -1
  16. package/package.json +8 -8
  17. package/pipes/domain/domain.pipe.d.ts +1 -1
  18. package/services/sheets/sheets.module.d.ts +0 -4
  19. package/services/spreadsheet/features/clipboard.service.d.ts +9 -3
  20. package/services/spreadsheet/features/data.service.d.ts +2 -11
  21. package/services/spreadsheet/features/editor.service.d.ts +2 -0
  22. package/services/spreadsheet/features/grid.service.d.ts +5 -8
  23. package/services/spreadsheet/features/navigation.service.d.ts +1 -3
  24. package/services/spreadsheet/features/selection.service.d.ts +2 -1
  25. package/services/spreadsheet/spreadsheet.service.d.ts +0 -2
  26. package/stores/entities/di.d.ts +1 -1
  27. package/stores/entities/entity-store-adapter.d.ts +1 -1
  28. package/stores/entities/entity-store-manager.d.ts +1 -1
  29. package/stores/entities/entity-store.d.ts +1 -1
  30. package/utils/inject/inject.d.ts +1 -1
@@ -2,7 +2,7 @@ import { EnvironmentProviders } from "@angular/core";
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/material/dialog";
4
4
  import * as i2 from "@angular/material/snack-bar";
5
- import * as i3 from "./services/sheets/sheets.module";
5
+ import * as i3 from "@ng-atomic/common/services/sheets";
6
6
  export declare class NgAtomicCommonModule {
7
7
  static forRoot(): {
8
8
  ngModule: typeof NgAtomicCommonModule;
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Pipe } from '@angular/core';
3
- import { flattenExcludeDayjs } from '@nx-ddd/core/util/walk-obj';
3
+ import { flattenExcludeDayjs } from '@nx-ddd/core';
4
4
 
5
5
  class AutoColumnsPipe {
6
6
  transform(items) {
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-pipes-auto-columns.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/auto-columns/auto-columns.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/auto-columns/ng-atomic-common-pipes-auto-columns.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { flattenExcludeDayjs } from '@nx-ddd/core/util/walk-obj';\n\n@Pipe({name: 'autoColumns', standalone: true, pure: true})\nexport class AutoColumnsPipe<T> implements PipeTransform {\n transform(items: T[]): string[] {\n const keys = new Set<string>();\n items.slice(0, 1).forEach(item => {\n const obj = flattenExcludeDayjs(item);\n Object.keys(obj).forEach(key => keys.add(key));\n })\n return [...keys, '__actions'];\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAIa,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,KAAU,EAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;AAC/B,YAAA,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChD,SAAC,CAAC;AACF,QAAA,OAAO,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC;;8GAPpB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,IAAI;mBAAC,EAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC;;;ACHzD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-pipes-auto-columns.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/pipes/auto-columns/auto-columns.pipe.ts","../../../../../packages/@ng-atomic/common/src/lib/pipes/auto-columns/ng-atomic-common-pipes-auto-columns.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { flattenExcludeDayjs } from '@nx-ddd/core';\n\n@Pipe({name: 'autoColumns', standalone: true, pure: true})\nexport class AutoColumnsPipe<T> implements PipeTransform {\n transform(items: T[]): string[] {\n const keys = new Set<string>();\n items.slice(0, 1).forEach(item => {\n const obj = flattenExcludeDayjs(item);\n Object.keys(obj).forEach(key => keys.add(key));\n })\n return [...keys, '__actions'];\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAIa,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,KAAU,EAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;AAC/B,YAAA,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChD,SAAC,CAAC;AACF,QAAA,OAAO,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC;;8GAPpB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,IAAI;mBAAC,EAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC;;;ACHzD;;AAEG;;;;"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Pipe, signal } from '@angular/core';
3
- import { getLangMap, getProps, getModelName } from '@nx-ddd/common/domain/models';
3
+ import { getLangMap, getProps, getModelName } from '@nx-ddd/common/domain';
4
4
  import { wrapFactory } from '@ng-atomic/common/pipes/signal';
5
5
  import { LanguageService, DOMAIN_LANG_MAP } from '@ng-atomic/common/services/language';
6
6
 
@@ -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';\nimport { DOMAIN_LANG_MAP, DomainLangMap, LanguageService } from '@ng-atomic/common/services/language';\n\nexport const DOMAIN_MODEL = new InjectionToken<Type<{id: string}>>('Domain Model');\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({\n standalone: true,\n name: 'domain',\n pure: true,\n})\nexport class DomainPipe implements PipeTransform {\n readonly language = inject(LanguageService);\n\n transform(input: string, map?: DomainLangMap) {\n return this.language.transform(input, map);\n }\n}\n\nexport function injectParentDomainLangMap(): DomainLangMap {\n return inject(DOMAIN_LANG_MAP, {skipSelf: true, optional: true}) ?? {};\n}\n\nexport function provideLangMap(useFactory: () => DomainLangMap, {\n merge = true\n}: {\n merge?: boolean\n} = {}) {\n return {\n provide: DOMAIN_LANG_MAP,\n useFactory: () => {\n if (merge) return {...injectParentDomainLangMap(), ...useFactory()};\n return useFactory();\n }\n };\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';\nimport { SignalOrValue, wrapFactory } from '@ng-atomic/common/pipes/signal';\nimport { DOMAIN_LANG_MAP, DomainLangMap, LanguageService } from '@ng-atomic/common/services/language';\n\nexport const DOMAIN_MODEL = new InjectionToken<Type<{id: string}>>('Domain Model');\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({\n standalone: true,\n name: 'domain',\n pure: true,\n})\nexport class DomainPipe implements PipeTransform {\n readonly language = inject(LanguageService);\n\n transform(input: string, map?: DomainLangMap) {\n return this.language.transform(input, map);\n }\n}\n\nexport function injectParentDomainLangMap(): DomainLangMap {\n return inject(DOMAIN_LANG_MAP, {skipSelf: true, optional: true}) ?? {};\n}\n\nexport function provideLangMap(useFactory: () => DomainLangMap, {\n merge = true\n}: {\n merge?: boolean\n} = {}) {\n return {\n provide: DOMAIN_LANG_MAP,\n useFactory: () => {\n if (merge) return {...injectParentDomainLangMap(), ...useFactory()};\n return useFactory();\n }\n };\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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"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, inject } from '@angular/core';
3
3
  import { DOMAIN_LANG_MAP } from '@ng-atomic/common/services/language';
4
4
  import { defaultExpressionTransformer, EXPRESSION_TRANSFORMER, toObject } from '@ng-atomic/common/utils';
5
- import { flattenExcludeDayjs } from '@nx-ddd/core/util/walk-obj';
5
+ import { flattenExcludeDayjs } from '@nx-ddd/core';
6
6
  import dayjs from 'dayjs';
7
7
  import { defaultDataAccessor, DATA_ACCESSOR } from '@ng-atomic/common/pipes/data-accessor';
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-query-resolver.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/query-resolver/query-resolver.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/query-resolver/ng-atomic-common-services-query-resolver.ts"],"sourcesContent":["import { Injectable, inject } from \"@angular/core\";\nimport { DOMAIN_LANG_MAP } from \"@ng-atomic/common/services/language\";\nimport { defaultExpressionTransformer, EXPRESSION_TRANSFORMER, toObject } from '@ng-atomic/common/utils';\nimport { flattenExcludeDayjs as flatten } from '@nx-ddd/core/util/walk-obj';\nimport dayjs from 'dayjs';\nimport { DATA_ACCESSOR, defaultDataAccessor } from \"@ng-atomic/common/pipes/data-accessor\";\n\ninterface Query {\n key: string;\n operator: ':' | '>' | '<' | '=';\n value: string;\n not: boolean;\n}\n\n@Injectable({ providedIn: 'any' })\nexport class QueryParserService {\n parse(query: string): Query[] {\n return query.split(' ').filter(q => q.length).map(str => {\n const not = str.startsWith('-');\n if (not) str = str.slice(1);\n\n for (const operator of ['=', '>', '<', ':'] as const) {\n if (str.includes(operator)) {\n const [key, value] = str.split(operator);\n return { key, operator, value, not };\n }\n }\n return { key: '*', operator: ':', value: str, not };\n });\n }\n}\n\n@Injectable({ providedIn: 'any' })\nexport class QueryResolverService<T extends object> {\n protected parser = inject(QueryParserService);\n protected dataAccessor = inject(DATA_ACCESSOR, {optional: true}) ?? defaultDataAccessor;\n protected transformer = inject(EXPRESSION_TRANSFORMER, {optional: true}) ?? defaultExpressionTransformer;\n protected map = inject(DOMAIN_LANG_MAP, {optional: true}) ?? {};\n protected reversedMap = Object.entries(this.map).reduce((p, [k, v]) => ({...p, [v]: k}), {} as Record<string, string>);\n\n resolve(items: T[], queryStr = ''): T[] {\n return this.parser.parse(queryStr).reduce((_items, query) => this.executeQuery(_items, query), items);\n }\n\n protected executeQuery(items: T[], query: Query): T[] {\n if (query.key === '*' && query.operator === ':')\n return items.filter(item => this.operateByAllKey(item, in_, query));\n switch (query.operator) {\n case ':': return items.filter(item => this.operateByKey(item, in_, query));\n case '=': return items.filter(item => this.operateByKey(item, eq, query));\n case '>': return items.filter(item => this.operateByKey(item, gt, query));\n case '<': return items.filter(item => this.operateByKey(item, lt, query));\n }\n }\n\n protected operateByKey(item: T, operator: QueryOperator, {key, value, not}: Query): boolean {\n let itemValue: any;\n itemValue = this.dataAccessor(item, key);\n itemValue = this.transformer(itemValue, key);\n return not ? !operator(itemValue, value) : operator(itemValue, value);\n }\n\n protected operateByAllKey(item: T, operator: QueryOperator, query: Query) {\n const flattenObj = flatten(toObject(item));\n return Object.keys(flattenObj).some((key) => this.operateByKey(item, operator, {...query, key}));\n }\n}\n\ntype QueryOperator = (_value: any, query: string) => boolean;\n\nfunction in_(value: any, query: string): boolean {\n return typeof value === 'string' ? value?.includes(query) : false;\n}\n\nfunction eq(value: any, query: string): boolean {\n return typeof value === 'string' ? value === query : false;\n}\n\nfunction gt(value: any, query: string): boolean {\n // const value = dayjs.isDayjs(v) ? v : this.transformer(v, k);\n return typeof value === 'string' \n ? parseFloat(value) > parseFloat(query) \n : typeof value === 'number'\n ? value > parseFloat(query)\n : dayjs.isDayjs(value)\n ? dayjs(query).isBefore(value)\n : false;\n}\n\nfunction lt(value: any, query: string): boolean {\n // const value = dayjs.isDayjs(v) ? v : this.transformer(v, k);\n return typeof value === 'string' \n ? parseFloat(value) < parseFloat(query) \n : typeof value === 'number'\n ? value < parseFloat(query)\n : dayjs.isDayjs(value)\n ? dayjs(query).isAfter(value)\n : false;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["flatten"],"mappings":"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"}
1
+ {"version":3,"file":"ng-atomic-common-services-query-resolver.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/query-resolver/query-resolver.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/query-resolver/ng-atomic-common-services-query-resolver.ts"],"sourcesContent":["import { Injectable, inject } from \"@angular/core\";\nimport { DOMAIN_LANG_MAP } from \"@ng-atomic/common/services/language\";\nimport { defaultExpressionTransformer, EXPRESSION_TRANSFORMER, toObject } from '@ng-atomic/common/utils';\nimport { flattenExcludeDayjs as flatten } from '@nx-ddd/core';\nimport dayjs from 'dayjs';\nimport { DATA_ACCESSOR, defaultDataAccessor } from \"@ng-atomic/common/pipes/data-accessor\";\n\ninterface Query {\n key: string;\n operator: ':' | '>' | '<' | '=';\n value: string;\n not: boolean;\n}\n\n@Injectable({ providedIn: 'any' })\nexport class QueryParserService {\n parse(query: string): Query[] {\n return query.split(' ').filter(q => q.length).map(str => {\n const not = str.startsWith('-');\n if (not) str = str.slice(1);\n\n for (const operator of ['=', '>', '<', ':'] as const) {\n if (str.includes(operator)) {\n const [key, value] = str.split(operator);\n return { key, operator, value, not };\n }\n }\n return { key: '*', operator: ':', value: str, not };\n });\n }\n}\n\n@Injectable({ providedIn: 'any' })\nexport class QueryResolverService<T extends object> {\n protected parser = inject(QueryParserService);\n protected dataAccessor = inject(DATA_ACCESSOR, {optional: true}) ?? defaultDataAccessor;\n protected transformer = inject(EXPRESSION_TRANSFORMER, {optional: true}) ?? defaultExpressionTransformer;\n protected map = inject(DOMAIN_LANG_MAP, {optional: true}) ?? {};\n protected reversedMap = Object.entries(this.map).reduce((p, [k, v]) => ({...p, [v]: k}), {} as Record<string, string>);\n\n resolve(items: T[], queryStr = ''): T[] {\n return this.parser.parse(queryStr).reduce((_items, query) => this.executeQuery(_items, query), items);\n }\n\n protected executeQuery(items: T[], query: Query): T[] {\n if (query.key === '*' && query.operator === ':')\n return items.filter(item => this.operateByAllKey(item, in_, query));\n switch (query.operator) {\n case ':': return items.filter(item => this.operateByKey(item, in_, query));\n case '=': return items.filter(item => this.operateByKey(item, eq, query));\n case '>': return items.filter(item => this.operateByKey(item, gt, query));\n case '<': return items.filter(item => this.operateByKey(item, lt, query));\n }\n }\n\n protected operateByKey(item: T, operator: QueryOperator, {key, value, not}: Query): boolean {\n let itemValue: any;\n itemValue = this.dataAccessor(item, key);\n itemValue = this.transformer(itemValue, key);\n return not ? !operator(itemValue, value) : operator(itemValue, value);\n }\n\n protected operateByAllKey(item: T, operator: QueryOperator, query: Query) {\n const flattenObj = flatten(toObject(item));\n return Object.keys(flattenObj).some((key) => this.operateByKey(item, operator, {...query, key}));\n }\n}\n\ntype QueryOperator = (_value: any, query: string) => boolean;\n\nfunction in_(value: any, query: string): boolean {\n return typeof value === 'string' ? value?.includes(query) : false;\n}\n\nfunction eq(value: any, query: string): boolean {\n return typeof value === 'string' ? value === query : false;\n}\n\nfunction gt(value: any, query: string): boolean {\n // const value = dayjs.isDayjs(v) ? v : this.transformer(v, k);\n return typeof value === 'string' \n ? parseFloat(value) > parseFloat(query) \n : typeof value === 'number'\n ? value > parseFloat(query)\n : dayjs.isDayjs(value)\n ? dayjs(query).isBefore(value)\n : false;\n}\n\nfunction lt(value: any, query: string): boolean {\n // const value = dayjs.isDayjs(v) ? v : this.transformer(v, k);\n return typeof value === 'string' \n ? parseFloat(value) < parseFloat(query) \n : typeof value === 'number'\n ? value < parseFloat(query)\n : dayjs.isDayjs(value)\n ? dayjs(query).isAfter(value)\n : false;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["flatten"],"mappings":"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"}
@@ -22,12 +22,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
22
22
  }], ctorParameters: () => [{ type: i1.MatBottomSheet }] });
23
23
 
24
24
  class NgAtomicSheetsModule {
25
- static forRoot() {
26
- return {
27
- ngModule: NgAtomicSheetsModule,
28
- providers: [],
29
- };
30
- }
31
25
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NgAtomicSheetsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
32
26
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.4", ngImport: i0, type: NgAtomicSheetsModule, imports: [MatBottomSheetModule] }); }
33
27
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NgAtomicSheetsModule, providers: [SheetService], imports: [MatBottomSheetModule] }); }
@@ -1 +1 @@
1
- {"version":3,"file":"ng-atomic-common-services-sheets.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/sheets/sheets.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/sheets/sheets.module.ts","../../../../../packages/@ng-atomic/common/src/lib/services/sheets/ng-atomic-common-services-sheets.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MatBottomSheet, MatBottomSheetRef } from '@angular/material/bottom-sheet';\nimport { Action } from '@ng-atomic/core';\n\n@Injectable()\nexport class SheetService {\n\n constructor(private bottomSheet: MatBottomSheet) { }\n\n async openActions(actions: Action[]): Promise<Action | null> {\n return import('@ng-atomic/common/services/sheets/actions').then(({ActionsSheet}) => {\n return this.bottomSheet.open(ActionsSheet, {data: actions});\n }).then((ref: MatBottomSheetRef) => {\n return ref.afterDismissed().toPromise();\n });\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\nimport { SheetService } from \"./sheets.service\";\n\n@NgModule({\n imports: [\n MatBottomSheetModule\n ],\n providers: [SheetService]\n})\nexport class NgAtomicSheetsModule {\n static forRoot() {\n return {\n ngModule: NgAtomicSheetsModule,\n providers: [\n\n ],\n };\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAKa,YAAY,CAAA;AAEvB,IAAA,WAAA,CAAoB,WAA2B,EAAA;QAA3B,IAAW,CAAA,WAAA,GAAX,WAAW;;IAE/B,MAAM,WAAW,CAAC,OAAiB,EAAA;AACjC,QAAA,OAAO,OAAO,2CAA2C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,YAAY,EAAC,KAAI;AACjF,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;AAC7D,SAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAsB,KAAI;AACjC,YAAA,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE;AACzC,SAAC,CAAC;;8GATO,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAZ,YAAY,EAAA,CAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCMY,oBAAoB,CAAA;AAC/B,IAAA,OAAO,OAAO,GAAA;QACZ,OAAO;AACL,YAAA,QAAQ,EAAE,oBAAoB;AAC9B,YAAA,SAAS,EAAE,EAEV;SACF;;8GAPQ,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAJ7B,oBAAoB,CAAA,EAAA,CAAA,CAAA;AAIX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EAFpB,SAAA,EAAA,CAAC,YAAY,CAAC,YAFvB,oBAAoB,CAAA,EAAA,CAAA,CAAA;;2FAIX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP;AACD,qBAAA;oBACD,SAAS,EAAE,CAAC,YAAY;AACzB,iBAAA;;;ACTD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-atomic-common-services-sheets.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/sheets/sheets.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/sheets/sheets.module.ts","../../../../../packages/@ng-atomic/common/src/lib/services/sheets/ng-atomic-common-services-sheets.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MatBottomSheet, MatBottomSheetRef } from '@angular/material/bottom-sheet';\nimport { Action } from '@ng-atomic/core';\n\n@Injectable()\nexport class SheetService {\n\n constructor(private bottomSheet: MatBottomSheet) { }\n\n async openActions(actions: Action[]): Promise<Action | null> {\n return import('@ng-atomic/common/services/sheets/actions').then(({ActionsSheet}) => {\n return this.bottomSheet.open(ActionsSheet, {data: actions});\n }).then((ref: MatBottomSheetRef) => {\n return ref.afterDismissed().toPromise();\n });\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\nimport { SheetService } from \"./sheets.service\";\n\n@NgModule({\n imports: [\n MatBottomSheetModule\n ],\n providers: [SheetService]\n})\nexport class NgAtomicSheetsModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAKa,YAAY,CAAA;AAEvB,IAAA,WAAA,CAAoB,WAA2B,EAAA;QAA3B,IAAW,CAAA,WAAA,GAAX,WAAW;;IAE/B,MAAM,WAAW,CAAC,OAAiB,EAAA;AACjC,QAAA,OAAO,OAAO,2CAA2C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,YAAY,EAAC,KAAI;AACjF,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;AAC7D,SAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAsB,KAAI;AACjC,YAAA,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE;AACzC,SAAC,CAAC;;8GATO,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAZ,YAAY,EAAA,CAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCMY,oBAAoB,CAAA;8GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAJ7B,oBAAoB,CAAA,EAAA,CAAA,CAAA;AAIX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EAFpB,SAAA,EAAA,CAAC,YAAY,CAAC,YAFvB,oBAAoB,CAAA,EAAA,CAAA,CAAA;;2FAIX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP;AACD,qBAAA;oBACD,SAAS,EAAE,CAAC,YAAY;AACzB,iBAAA;;;ACTD;;AAEG;;;;"}
@@ -1,48 +1,31 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, Injectable, inject, effect, InjectionToken, ElementRef, input, Directive } from '@angular/core';
2
+ import { signal, Injectable, inject, computed, effect, InjectionToken, ElementRef, input, Directive } from '@angular/core';
3
3
  import { isEqual } from 'lodash-es';
4
4
  import { Clipboard } from '@angular/cdk/clipboard';
5
- import papaparse from 'papaparse';
6
5
  import { SnackBarService } from '@ng-atomic/common/services/snack-bar';
7
- import { LanguageService } from '@ng-atomic/common/services/language';
8
6
  import { injectDataAccessor } from '@ng-atomic/common/pipes/data-accessor';
9
7
  import { EXPRESSION_TRANSFORMER } from '@ng-atomic/common/utils';
8
+ import { LanguageService } from '@ng-atomic/common/services/language';
9
+ import papaparse from 'papaparse';
10
+
11
+ class SpreadSheetDataService {
12
+ constructor() {
13
+ this.displayedColumns = signal([]);
14
+ this.items = signal([]);
15
+ }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
17
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService }); }
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService, decorators: [{
20
+ type: Injectable
21
+ }] });
10
22
 
11
23
  class GridService {
12
24
  constructor() {
13
- this.data = signal([[]]);
14
- this.columns = computed(() => Array.from({ length: this.data()[0].length }, (_, i) => String.fromCharCode(65 + i)));
15
25
  this.contextMap = new Map();
16
- }
17
- updateCell(row, col, value) {
18
- this.data.update(data => {
19
- data[row][col] = {
20
- dataValue: value,
21
- expressionValue: value,
22
- };
23
- return [...data];
24
- });
25
- }
26
- getValue(position) {
27
- return this.getCell(position)?.dataValue ?? null;
28
- }
29
- getExpressionValue(position) {
30
- return this.getCell(position)?.expressionValue ?? null;
31
- }
32
- getCell(position) {
33
- return this.data()[position.row]?.[position.col] ?? null;
34
- }
35
- updateAllCells(predicate, updates) {
36
- this.data.update(data => {
37
- for (let i = 0; i < data.length; i++) {
38
- for (let j = 0; j < data[0].length; j++) {
39
- if (predicate(data[i][j])) {
40
- data[i][j] = { ...data[i][j], ...updates };
41
- }
42
- }
43
- }
44
- return [...data];
45
- });
26
+ this.data = inject(SpreadSheetDataService);
27
+ this.maxCol = computed(() => this.data.displayedColumns().length - 1);
28
+ this.maxRow = computed(() => this.data.items().length);
46
29
  }
47
30
  setContext(context) {
48
31
  this.contextMap.set(this.buildKey(context.position), context);
@@ -61,31 +44,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
61
44
  }] });
62
45
 
63
46
  class NavigationService {
64
- constructor(gridService) {
65
- this.gridService = gridService;
47
+ constructor() {
48
+ this.gridService = inject(GridService);
66
49
  }
67
50
  moveToNextCell({ row, col }) {
68
- const columns = this.gridService.columns();
69
- if (col < columns.length - 1) {
51
+ if (col < this.gridService.maxCol()) {
70
52
  return { row, col: col + 1 };
71
53
  }
72
- else if (row < this.gridService.data().length - 1) {
54
+ else if (row < this.gridService.maxRow()) {
73
55
  return { row: row + 1, col: 0 };
74
56
  }
75
57
  return { row, col };
76
58
  }
77
59
  moveToPreviousCell({ row, col }) {
78
- const columns = this.gridService.columns();
79
60
  if (col > 0) {
80
61
  return { row, col: col - 1 };
81
62
  }
82
63
  else if (row > 0) {
83
- return { row: row - 1, col: columns.length - 1 };
64
+ return { row: row - 1, col: this.gridService.maxCol() };
84
65
  }
85
66
  return { row, col };
86
67
  }
87
68
  moveToNextRow({ row, col }) {
88
- if (row < this.gridService.data().length - 1) {
69
+ if (row < this.gridService.maxRow()) {
89
70
  return { row: row + 1, col };
90
71
  }
91
72
  return { row, col };
@@ -96,8 +77,9 @@ class NavigationService {
96
77
  }
97
78
  return { row, col };
98
79
  }
99
- moveRight({ row, col }) {
100
- if (col < this.gridService.columns().length - 1) {
80
+ moveRight(position) {
81
+ const { row, col } = position;
82
+ if (col < this.gridService.maxCol()) {
101
83
  return { row, col: col + 1 };
102
84
  }
103
85
  return { row, col };
@@ -115,20 +97,21 @@ class NavigationService {
115
97
  return { row, col };
116
98
  }
117
99
  moveDown({ row, col }) {
118
- if (row < this.gridService.data().length - 1) {
100
+ if (row < this.gridService.maxRow()) {
119
101
  return { row: row + 1, col };
120
102
  }
121
103
  return { row, col };
122
104
  }
123
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, deps: [{ token: GridService }], target: i0.ɵɵFactoryTarget.Injectable }); }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
124
106
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService }); }
125
107
  }
126
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, decorators: [{
127
109
  type: Injectable
128
- }], ctorParameters: () => [{ type: GridService }] });
110
+ }] });
129
111
 
130
112
  class SelectionService {
131
113
  constructor() {
114
+ this.data = inject(SpreadSheetDataService);
132
115
  this.selection = signal({ start: { row: 1, col: 0 }, end: null });
133
116
  this.selectionStart = computed(() => this.selection().start, { equal: isEqual });
134
117
  this.isMouseDown = signal(false);
@@ -192,17 +175,6 @@ class SelectionService {
192
175
  getSelectionEndOrStart() {
193
176
  return this.selection()?.end || this.selection()?.start;
194
177
  }
195
- findSelectedCell() {
196
- const data = this.grid.data();
197
- for (let i = 0; i < data.length; i++) {
198
- for (let j = 0; j < data[i].length; j++) {
199
- if (this.isSelected({ row: i, col: j })) {
200
- return { row: i, col: j };
201
- }
202
- }
203
- }
204
- return null;
205
- }
206
178
  updateSelectionEnd(position) {
207
179
  this.selection.update((selection) => ({ ...selection, end: position }));
208
180
  }
@@ -215,18 +187,6 @@ class SelectionService {
215
187
  }
216
188
  }
217
189
  clearSelectedRange(selection) {
218
- const minRow = Math.min(selection.start.row, selection.end.row);
219
- const maxRow = Math.max(selection.start.row, selection.end.row);
220
- const minCol = Math.min(selection.start.col, selection.end.col);
221
- const maxCol = Math.max(selection.start.col, selection.end.col);
222
- for (let i = minRow; i <= maxRow; i++) {
223
- for (let j = minCol; j <= maxCol; j++) {
224
- this.grid.updateCell(i, j, {
225
- dataValue: '',
226
- expressionValue: ''
227
- });
228
- }
229
- }
230
190
  }
231
191
  setCell(position, el) {
232
192
  this.cellElMap.set(`${this.buildKey(position)}`, el);
@@ -253,66 +213,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
253
213
  }], ctorParameters: () => [] });
254
214
 
255
215
  class ClipboardService {
256
- constructor(gridService, selectionService) {
257
- this.gridService = gridService;
216
+ constructor(selectionService) {
258
217
  this.selectionService = selectionService;
259
218
  this.clipboard = inject(Clipboard);
260
219
  this.snackBar = inject(SnackBarService);
220
+ this.data = inject(SpreadSheetDataService);
221
+ this.dataAccessor = injectDataAccessor();
222
+ this.expression = inject(EXPRESSION_TRANSFORMER);
223
+ this.language = inject(LanguageService);
224
+ }
225
+ buildGridData(range) {
226
+ const header = this.data.displayedColumns().map(column => ({
227
+ dataValue: this.language.transform(column),
228
+ expressionValue: this.language.transform(column),
229
+ isHeader: true
230
+ }));
231
+ const rows = this.data.items().map(item => this.data.displayedColumns().map(column => ({
232
+ dataValue: this.dataAccessor(item, column),
233
+ expressionValue: this.expression(this.dataAccessor(item, column), { item, name: column }),
234
+ })));
235
+ const fullData = [header, ...rows];
236
+ return fullData.slice(range.minRow, range.maxRow + 1).map(row => row.slice(range.minCol, range.maxCol + 1));
261
237
  }
262
238
  async copy() {
263
239
  const selection = this.selectionService.getSelection();
264
240
  if (!selection)
265
241
  return;
266
- const { start, end } = selection;
267
- if (!end) {
268
- this.copyText(this.gridService.data()[start.row][start.col].dataValue);
269
- return;
270
- }
242
+ let { start, end } = selection;
243
+ end = end ?? start;
271
244
  const minRow = Math.min(start.row, end.row);
272
245
  const maxRow = Math.max(start.row, end.row);
273
246
  const minCol = Math.min(start.col, end.col);
274
247
  const maxCol = Math.max(start.col, end.col);
275
- const data = this.gridService.data();
276
- const clipboardData = [];
277
- for (let i = minRow; i <= maxRow; i++) {
278
- const row = [];
279
- for (let j = minCol; j <= maxCol; j++) {
280
- row.push(data[i][j].dataValue);
281
- }
282
- clipboardData.push(row);
283
- }
284
- const tsv = papaparse.unparse(clipboardData, { delimiter: '\t', newline: '\n', header: false });
285
- this.clipboard.copy(tsv);
248
+ const selectedData = this.buildGridData({ minRow, maxRow, minCol, maxCol });
249
+ const tsv = papaparse.unparse(selectedData.map(row => row.map(cell => cell.dataValue)), { delimiter: "\t", newline: "\n", header: false });
250
+ this.copyText(tsv);
251
+ }
252
+ setData(items, displayedColumns) {
253
+ this.data.displayedColumns.set(displayedColumns);
254
+ this.data.items.set(items);
286
255
  }
287
256
  copyText(text) {
288
257
  this.clipboard.copy(text);
289
258
  this.snackBar.open('クリップボードにコピーしました。');
290
259
  }
291
260
  async paste(targetRow, targetCol) {
292
- try {
293
- const clipboardText = await navigator.clipboard.readText();
294
- const rows = clipboardText.split('\n');
295
- const data = this.gridService.data();
296
- const rowCount = Math.min(rows.length, data.length - targetRow);
297
- for (let i = 0; i < rowCount; i++) {
298
- const cells = rows[i].split('\t');
299
- const colCount = Math.min(cells.length, this.gridService.columns().length - targetCol);
300
- for (let j = 0; j < colCount; j++) {
301
- this.gridService.updateCell(targetRow + i, targetCol + j, cells[j]);
302
- }
303
- }
304
- console.log('Data pasted from clipboard as TSV');
305
- }
306
- catch (err) {
307
- console.error('Failed to read data from clipboard', err);
308
- }
309
261
  }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, deps: [{ token: GridService }, { token: SelectionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, deps: [{ token: SelectionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
311
263
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService }); }
312
264
  }
313
265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, decorators: [{
314
266
  type: Injectable
315
- }], ctorParameters: () => [{ type: GridService }, { type: SelectionService }] });
267
+ }], ctorParameters: () => [{ type: SelectionService }] });
316
268
 
317
269
  const COLUMN_PROTECTOR = new InjectionToken('COLUMN_PROTECTOR', {
318
270
  providedIn: 'root',
@@ -339,6 +291,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
339
291
 
340
292
  class EditorService {
341
293
  constructor() {
294
+ this.data = inject(SpreadSheetDataService);
342
295
  this.grid = inject(GridService);
343
296
  this.selection = inject(SelectionService);
344
297
  this.protection = inject(ProtectionService);
@@ -371,9 +324,8 @@ class EditorService {
371
324
  });
372
325
  }
373
326
  getEditingCell() {
374
- const data = this.grid.data();
375
- for (let i = 0; i < data.length; i++) {
376
- for (let j = 0; j < data[i].length; j++) {
327
+ for (let i = 0; i < this.data.items().length; i++) {
328
+ for (let j = 0; j < this.data.displayedColumns().length; j++) {
377
329
  if (this.isEditing({ row: i, col: j })) {
378
330
  return { row: i, col: j };
379
331
  }
@@ -397,69 +349,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
397
349
  type: Injectable
398
350
  }] });
399
351
 
400
- class SpreadSheetDataService {
401
- constructor() {
402
- this.cache = new Map();
403
- this.language = inject(LanguageService);
404
- this.dataAccessor = injectDataAccessor();
405
- this.expression = inject(EXPRESSION_TRANSFORMER);
406
- }
407
- buildGridData(items, displayedColumns) {
408
- return [
409
- this.buildGridHeaderRow(displayedColumns),
410
- ...items.map((item) => this.buildGridRow(item, displayedColumns))
411
- ];
412
- }
413
- buildGridHeaderRow(columns) {
414
- const key = this.buildKey({ columns });
415
- const cached = this.cache.get(key);
416
- if (cached)
417
- return cached;
418
- const row = columns.map((column) => ({
419
- dataValue: this.language.transform(column),
420
- expressionValue: this.language.transform(column),
421
- isHeader: true
422
- }));
423
- this.cache.set(key, row);
424
- return row;
425
- }
426
- buildGridRow(item, displayedColumns) {
427
- const key = this.buildKey({ item, displayedColumns });
428
- const cached = this.cache.get(key);
429
- if (cached)
430
- return cached;
431
- const row = displayedColumns.map((column) => this.buildGridCell(item, column));
432
- this.cache.set(key, row);
433
- return row;
434
- }
435
- buildGridCell(item, column) {
436
- const key = this.buildKey({ item, column });
437
- const cached = this.cache.get(key);
438
- if (cached)
439
- return cached;
440
- const cell = {
441
- dataValue: this.dataAccessor(item, column),
442
- expressionValue: this.expression(this.dataAccessor(item, column), { item, name: column }),
443
- };
444
- this.cache.set(key, cell);
445
- return cell;
446
- }
447
- buildKey(obj) {
448
- // return CryptoJS.MD5(JSON.stringify(obj)).toString(CryptoJS.enc.Base64).slice(0, 10);
449
- return JSON.stringify(obj);
450
- }
451
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
452
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService }); }
453
- }
454
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SpreadSheetDataService, decorators: [{
455
- type: Injectable
456
- }] });
457
-
458
352
  class SpreadSheetService {
459
353
  constructor() {
460
354
  this.config = { paste: false };
461
355
  this.grid = inject(GridService);
462
- this.data = inject(SpreadSheetDataService);
356
+ // readonly data = inject(SpreadSheetDataService);
463
357
  this.navigation = inject(NavigationService);
464
358
  this.selection = inject(SelectionService);
465
359
  this.clipboard = inject(ClipboardService);
@@ -497,7 +391,7 @@ class SpreadSheetService {
497
391
  }
498
392
  handleKeyDownOnSelecting(event) {
499
393
  if (event.key === 'Tab') {
500
- const selectedCell = this.selection.findSelectedCell();
394
+ const selectedCell = this.selection.getSelection().start;
501
395
  event.preventDefault();
502
396
  event.stopPropagation();
503
397
  if (event.shiftKey) {
@@ -509,7 +403,7 @@ class SpreadSheetService {
509
403
  return;
510
404
  }
511
405
  else if (event.key === 'Enter') {
512
- const selectedCell = this.selection.findSelectedCell();
406
+ const selectedCell = this.selection.getSelection().start;
513
407
  if (selectedCell) {
514
408
  this.editor.startEditing(selectedCell);
515
409
  event.preventDefault();
@@ -523,7 +417,7 @@ class SpreadSheetService {
523
417
  else if (event.key === 'v') {
524
418
  if (!this.config.paste)
525
419
  return;
526
- const target = this.selection.findSelectedCell();
420
+ const target = this.selection.getSelection().start;
527
421
  if (target) {
528
422
  this.clipboard.paste(target.row, target.col);
529
423
  }
@@ -540,7 +434,7 @@ class SpreadSheetService {
540
434
  }
541
435
  }
542
436
  else {
543
- const selectedCell = this.selection.findSelectedCell();
437
+ const selection = this.selection.getSelection().start;
544
438
  let newPosition;
545
439
  if (event.shiftKey) {
546
440
  const selectionEnd = this.selection.getSelectionEndOrStart();
@@ -568,16 +462,16 @@ class SpreadSheetService {
568
462
  else {
569
463
  switch (event.key) {
570
464
  case 'ArrowRight':
571
- newPosition = this.navigation.moveRight(selectedCell);
465
+ newPosition = this.navigation.moveRight(selection);
572
466
  break;
573
467
  case 'ArrowLeft':
574
- newPosition = this.navigation.moveLeft(selectedCell);
468
+ newPosition = this.navigation.moveLeft(selection);
575
469
  break;
576
470
  case 'ArrowUp':
577
- newPosition = this.navigation.moveUp(selectedCell);
471
+ newPosition = this.navigation.moveUp(selection);
578
472
  break;
579
473
  case 'ArrowDown':
580
- newPosition = this.navigation.moveDown(selectedCell);
474
+ newPosition = this.navigation.moveDown(selection);
581
475
  break;
582
476
  default:
583
477
  return;