@ng-atomic/common 19.0.0-preview.29 → 19.0.0-preview.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common.module.d.ts +1 -1
- package/fesm2022/ng-atomic-common-pipes-auto-columns.mjs +1 -1
- package/fesm2022/ng-atomic-common-pipes-auto-columns.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-pipes-domain.mjs +1 -1
- package/fesm2022/ng-atomic-common-pipes-domain.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-query-resolver.mjs +1 -1
- package/fesm2022/ng-atomic-common-services-query-resolver.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-sheets.mjs +6 -0
- package/fesm2022/ng-atomic-common-services-sheets.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-spreadsheet.mjs +178 -72
- package/fesm2022/ng-atomic-common-services-spreadsheet.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-stores-entities.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-utils.mjs.map +1 -1
- package/fesm2022/ng-atomic-common.mjs +45 -6
- package/fesm2022/ng-atomic-common.mjs.map +1 -1
- package/package.json +4 -4
- package/pipes/domain/domain.pipe.d.ts +1 -1
- package/services/sheets/sheets.module.d.ts +4 -0
- package/services/spreadsheet/features/clipboard.service.d.ts +3 -9
- package/services/spreadsheet/features/data.service.d.ts +11 -2
- package/services/spreadsheet/features/editor.service.d.ts +0 -2
- package/services/spreadsheet/features/grid.service.d.ts +8 -5
- package/services/spreadsheet/features/navigation.service.d.ts +3 -1
- package/services/spreadsheet/features/selection.service.d.ts +1 -2
- package/services/spreadsheet/spreadsheet.service.d.ts +2 -0
- package/stores/entities/di.d.ts +1 -1
- package/stores/entities/entity-store-adapter.d.ts +1 -1
- package/stores/entities/entity-store-manager.d.ts +1 -1
- package/stores/entities/entity-store.d.ts +1 -1
- package/utils/inject/inject.d.ts +1 -1
package/common.module.d.ts
CHANGED
|
@@ -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 "
|
|
5
|
+
import * as i3 from "./services/sheets/sheets.module";
|
|
6
6
|
export declare class NgAtomicCommonModule {
|
|
7
7
|
static forRoot(): {
|
|
8
8
|
ngModule: typeof NgAtomicCommonModule;
|
|
@@ -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';\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/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,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';
|
|
3
|
+
import { getLangMap, getProps, getModelName } from '@nx-ddd/common/domain/models';
|
|
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';\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/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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"}
|
|
@@ -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';
|
|
5
|
+
import { flattenExcludeDayjs } from '@nx-ddd/core/util/walk-obj';
|
|
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';\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/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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"}
|
|
@@ -22,6 +22,12 @@ 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
|
+
}
|
|
25
31
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NgAtomicSheetsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
26
32
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.4", ngImport: i0, type: NgAtomicSheetsModule, imports: [MatBottomSheetModule] }); }
|
|
27
33
|
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","/**\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;
|
|
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,31 +1,48 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, Injectable, inject,
|
|
2
|
+
import { signal, computed, Injectable, inject, 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';
|
|
5
6
|
import { SnackBarService } from '@ng-atomic/common/services/snack-bar';
|
|
7
|
+
import { LanguageService } from '@ng-atomic/common/services/language';
|
|
6
8
|
import { injectDataAccessor } from '@ng-atomic/common/pipes/data-accessor';
|
|
7
9
|
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
|
-
}] });
|
|
22
10
|
|
|
23
11
|
class GridService {
|
|
24
12
|
constructor() {
|
|
13
|
+
this.data = signal([[]]);
|
|
14
|
+
this.columns = computed(() => Array.from({ length: this.data()[0].length }, (_, i) => String.fromCharCode(65 + i)));
|
|
25
15
|
this.contextMap = new Map();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
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
|
+
});
|
|
29
46
|
}
|
|
30
47
|
setContext(context) {
|
|
31
48
|
this.contextMap.set(this.buildKey(context.position), context);
|
|
@@ -44,29 +61,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
44
61
|
}] });
|
|
45
62
|
|
|
46
63
|
class NavigationService {
|
|
47
|
-
constructor() {
|
|
48
|
-
this.gridService =
|
|
64
|
+
constructor(gridService) {
|
|
65
|
+
this.gridService = gridService;
|
|
49
66
|
}
|
|
50
67
|
moveToNextCell({ row, col }) {
|
|
51
|
-
|
|
68
|
+
const columns = this.gridService.columns();
|
|
69
|
+
if (col < columns.length - 1) {
|
|
52
70
|
return { row, col: col + 1 };
|
|
53
71
|
}
|
|
54
|
-
else if (row < this.gridService.
|
|
72
|
+
else if (row < this.gridService.data().length - 1) {
|
|
55
73
|
return { row: row + 1, col: 0 };
|
|
56
74
|
}
|
|
57
75
|
return { row, col };
|
|
58
76
|
}
|
|
59
77
|
moveToPreviousCell({ row, col }) {
|
|
78
|
+
const columns = this.gridService.columns();
|
|
60
79
|
if (col > 0) {
|
|
61
80
|
return { row, col: col - 1 };
|
|
62
81
|
}
|
|
63
82
|
else if (row > 0) {
|
|
64
|
-
return { row: row - 1, col:
|
|
83
|
+
return { row: row - 1, col: columns.length - 1 };
|
|
65
84
|
}
|
|
66
85
|
return { row, col };
|
|
67
86
|
}
|
|
68
87
|
moveToNextRow({ row, col }) {
|
|
69
|
-
if (row < this.gridService.
|
|
88
|
+
if (row < this.gridService.data().length - 1) {
|
|
70
89
|
return { row: row + 1, col };
|
|
71
90
|
}
|
|
72
91
|
return { row, col };
|
|
@@ -77,9 +96,8 @@ class NavigationService {
|
|
|
77
96
|
}
|
|
78
97
|
return { row, col };
|
|
79
98
|
}
|
|
80
|
-
moveRight(
|
|
81
|
-
|
|
82
|
-
if (col < this.gridService.maxCol()) {
|
|
99
|
+
moveRight({ row, col }) {
|
|
100
|
+
if (col < this.gridService.columns().length - 1) {
|
|
83
101
|
return { row, col: col + 1 };
|
|
84
102
|
}
|
|
85
103
|
return { row, col };
|
|
@@ -97,21 +115,20 @@ class NavigationService {
|
|
|
97
115
|
return { row, col };
|
|
98
116
|
}
|
|
99
117
|
moveDown({ row, col }) {
|
|
100
|
-
if (row < this.gridService.
|
|
118
|
+
if (row < this.gridService.data().length - 1) {
|
|
101
119
|
return { row: row + 1, col };
|
|
102
120
|
}
|
|
103
121
|
return { row, col };
|
|
104
122
|
}
|
|
105
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
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 }); }
|
|
106
124
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService }); }
|
|
107
125
|
}
|
|
108
126
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, decorators: [{
|
|
109
127
|
type: Injectable
|
|
110
|
-
}] });
|
|
128
|
+
}], ctorParameters: () => [{ type: GridService }] });
|
|
111
129
|
|
|
112
130
|
class SelectionService {
|
|
113
131
|
constructor() {
|
|
114
|
-
this.data = inject(SpreadSheetDataService);
|
|
115
132
|
this.selection = signal({ start: { row: 1, col: 0 }, end: null });
|
|
116
133
|
this.selectionStart = computed(() => this.selection().start, { equal: isEqual });
|
|
117
134
|
this.isMouseDown = signal(false);
|
|
@@ -175,6 +192,17 @@ class SelectionService {
|
|
|
175
192
|
getSelectionEndOrStart() {
|
|
176
193
|
return this.selection()?.end || this.selection()?.start;
|
|
177
194
|
}
|
|
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
|
+
}
|
|
178
206
|
updateSelectionEnd(position) {
|
|
179
207
|
this.selection.update((selection) => ({ ...selection, end: position }));
|
|
180
208
|
}
|
|
@@ -187,6 +215,18 @@ class SelectionService {
|
|
|
187
215
|
}
|
|
188
216
|
}
|
|
189
217
|
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
|
+
}
|
|
190
230
|
}
|
|
191
231
|
setCell(position, el) {
|
|
192
232
|
this.cellElMap.set(`${this.buildKey(position)}`, el);
|
|
@@ -213,58 +253,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
213
253
|
}], ctorParameters: () => [] });
|
|
214
254
|
|
|
215
255
|
class ClipboardService {
|
|
216
|
-
constructor(selectionService) {
|
|
256
|
+
constructor(gridService, selectionService) {
|
|
257
|
+
this.gridService = gridService;
|
|
217
258
|
this.selectionService = selectionService;
|
|
218
259
|
this.clipboard = inject(Clipboard);
|
|
219
260
|
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));
|
|
237
261
|
}
|
|
238
262
|
async copy() {
|
|
239
263
|
const selection = this.selectionService.getSelection();
|
|
240
264
|
if (!selection)
|
|
241
265
|
return;
|
|
242
|
-
|
|
243
|
-
|
|
266
|
+
const { start, end } = selection;
|
|
267
|
+
if (!end) {
|
|
268
|
+
this.copyText(this.gridService.data()[start.row][start.col].dataValue);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
244
271
|
const minRow = Math.min(start.row, end.row);
|
|
245
272
|
const maxRow = Math.max(start.row, end.row);
|
|
246
273
|
const minCol = Math.min(start.col, end.col);
|
|
247
274
|
const maxCol = Math.max(start.col, end.col);
|
|
248
|
-
const
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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);
|
|
255
286
|
}
|
|
256
287
|
copyText(text) {
|
|
257
288
|
this.clipboard.copy(text);
|
|
258
289
|
this.snackBar.open('クリップボードにコピーしました。');
|
|
259
290
|
}
|
|
260
291
|
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
|
+
}
|
|
261
309
|
}
|
|
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 }); }
|
|
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 }); }
|
|
263
311
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService }); }
|
|
264
312
|
}
|
|
265
313
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, decorators: [{
|
|
266
314
|
type: Injectable
|
|
267
|
-
}], ctorParameters: () => [{ type: SelectionService }] });
|
|
315
|
+
}], ctorParameters: () => [{ type: GridService }, { type: SelectionService }] });
|
|
268
316
|
|
|
269
317
|
const COLUMN_PROTECTOR = new InjectionToken('COLUMN_PROTECTOR', {
|
|
270
318
|
providedIn: 'root',
|
|
@@ -291,7 +339,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
291
339
|
|
|
292
340
|
class EditorService {
|
|
293
341
|
constructor() {
|
|
294
|
-
this.data = inject(SpreadSheetDataService);
|
|
295
342
|
this.grid = inject(GridService);
|
|
296
343
|
this.selection = inject(SelectionService);
|
|
297
344
|
this.protection = inject(ProtectionService);
|
|
@@ -324,8 +371,9 @@ class EditorService {
|
|
|
324
371
|
});
|
|
325
372
|
}
|
|
326
373
|
getEditingCell() {
|
|
327
|
-
|
|
328
|
-
|
|
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++) {
|
|
329
377
|
if (this.isEditing({ row: i, col: j })) {
|
|
330
378
|
return { row: i, col: j };
|
|
331
379
|
}
|
|
@@ -349,11 +397,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
349
397
|
type: Injectable
|
|
350
398
|
}] });
|
|
351
399
|
|
|
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
|
+
|
|
352
458
|
class SpreadSheetService {
|
|
353
459
|
constructor() {
|
|
354
460
|
this.config = { paste: false };
|
|
355
461
|
this.grid = inject(GridService);
|
|
356
|
-
|
|
462
|
+
this.data = inject(SpreadSheetDataService);
|
|
357
463
|
this.navigation = inject(NavigationService);
|
|
358
464
|
this.selection = inject(SelectionService);
|
|
359
465
|
this.clipboard = inject(ClipboardService);
|
|
@@ -391,7 +497,7 @@ class SpreadSheetService {
|
|
|
391
497
|
}
|
|
392
498
|
handleKeyDownOnSelecting(event) {
|
|
393
499
|
if (event.key === 'Tab') {
|
|
394
|
-
const selectedCell = this.selection.
|
|
500
|
+
const selectedCell = this.selection.findSelectedCell();
|
|
395
501
|
event.preventDefault();
|
|
396
502
|
event.stopPropagation();
|
|
397
503
|
if (event.shiftKey) {
|
|
@@ -403,7 +509,7 @@ class SpreadSheetService {
|
|
|
403
509
|
return;
|
|
404
510
|
}
|
|
405
511
|
else if (event.key === 'Enter') {
|
|
406
|
-
const selectedCell = this.selection.
|
|
512
|
+
const selectedCell = this.selection.findSelectedCell();
|
|
407
513
|
if (selectedCell) {
|
|
408
514
|
this.editor.startEditing(selectedCell);
|
|
409
515
|
event.preventDefault();
|
|
@@ -417,7 +523,7 @@ class SpreadSheetService {
|
|
|
417
523
|
else if (event.key === 'v') {
|
|
418
524
|
if (!this.config.paste)
|
|
419
525
|
return;
|
|
420
|
-
const target = this.selection.
|
|
526
|
+
const target = this.selection.findSelectedCell();
|
|
421
527
|
if (target) {
|
|
422
528
|
this.clipboard.paste(target.row, target.col);
|
|
423
529
|
}
|
|
@@ -434,7 +540,7 @@ class SpreadSheetService {
|
|
|
434
540
|
}
|
|
435
541
|
}
|
|
436
542
|
else {
|
|
437
|
-
const
|
|
543
|
+
const selectedCell = this.selection.findSelectedCell();
|
|
438
544
|
let newPosition;
|
|
439
545
|
if (event.shiftKey) {
|
|
440
546
|
const selectionEnd = this.selection.getSelectionEndOrStart();
|
|
@@ -462,16 +568,16 @@ class SpreadSheetService {
|
|
|
462
568
|
else {
|
|
463
569
|
switch (event.key) {
|
|
464
570
|
case 'ArrowRight':
|
|
465
|
-
newPosition = this.navigation.moveRight(
|
|
571
|
+
newPosition = this.navigation.moveRight(selectedCell);
|
|
466
572
|
break;
|
|
467
573
|
case 'ArrowLeft':
|
|
468
|
-
newPosition = this.navigation.moveLeft(
|
|
574
|
+
newPosition = this.navigation.moveLeft(selectedCell);
|
|
469
575
|
break;
|
|
470
576
|
case 'ArrowUp':
|
|
471
|
-
newPosition = this.navigation.moveUp(
|
|
577
|
+
newPosition = this.navigation.moveUp(selectedCell);
|
|
472
578
|
break;
|
|
473
579
|
case 'ArrowDown':
|
|
474
|
-
newPosition = this.navigation.moveDown(
|
|
580
|
+
newPosition = this.navigation.moveDown(selectedCell);
|
|
475
581
|
break;
|
|
476
582
|
default:
|
|
477
583
|
return;
|