@ng-atomic/common 19.0.0-preview.2 → 19.0.0-preview.21
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 +0 -6
- package/fesm2022/ng-atomic-common-services-sheets.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-spreadsheet.mjs +64 -161
- 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 +6 -45
- package/fesm2022/ng-atomic-common.mjs.map +1 -1
- package/package.json +8 -8
- package/pipes/domain/domain.pipe.d.ts +1 -1
- package/services/sheets/sheets.module.d.ts +0 -4
- package/services/spreadsheet/features/clipboard.service.d.ts +9 -3
- package/services/spreadsheet/features/data.service.d.ts +2 -11
- package/services/spreadsheet/features/editor.service.d.ts +2 -0
- package/services/spreadsheet/features/grid.service.d.ts +5 -8
- package/services/spreadsheet/features/navigation.service.d.ts +0 -2
- package/services/spreadsheet/features/selection.service.d.ts +2 -0
- package/services/spreadsheet/spreadsheet.service.d.ts +0 -2
- 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 "@ng-atomic/common/services/sheets";
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
18
|
-
this.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 - 1);
|
|
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(
|
|
65
|
-
this.gridService =
|
|
47
|
+
constructor() {
|
|
48
|
+
this.gridService = inject(GridService);
|
|
66
49
|
}
|
|
67
50
|
moveToNextCell({ row, col }) {
|
|
68
|
-
|
|
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.
|
|
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:
|
|
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.
|
|
69
|
+
if (row < this.gridService.maxRow()) {
|
|
89
70
|
return { row: row + 1, col };
|
|
90
71
|
}
|
|
91
72
|
return { row, col };
|
|
@@ -97,7 +78,7 @@ class NavigationService {
|
|
|
97
78
|
return { row, col };
|
|
98
79
|
}
|
|
99
80
|
moveRight({ row, col }) {
|
|
100
|
-
if (col < this.gridService.
|
|
81
|
+
if (col < this.gridService.maxCol()) {
|
|
101
82
|
return { row, col: col + 1 };
|
|
102
83
|
}
|
|
103
84
|
return { row, col };
|
|
@@ -115,20 +96,21 @@ class NavigationService {
|
|
|
115
96
|
return { row, col };
|
|
116
97
|
}
|
|
117
98
|
moveDown({ row, col }) {
|
|
118
|
-
if (row < this.gridService.
|
|
99
|
+
if (row < this.gridService.maxRow()) {
|
|
119
100
|
return { row: row + 1, col };
|
|
120
101
|
}
|
|
121
102
|
return { row, col };
|
|
122
103
|
}
|
|
123
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, deps: [
|
|
104
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
124
105
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService }); }
|
|
125
106
|
}
|
|
126
107
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NavigationService, decorators: [{
|
|
127
108
|
type: Injectable
|
|
128
|
-
}]
|
|
109
|
+
}] });
|
|
129
110
|
|
|
130
111
|
class SelectionService {
|
|
131
112
|
constructor() {
|
|
113
|
+
this.data = inject(SpreadSheetDataService);
|
|
132
114
|
this.selection = signal({ start: { row: 1, col: 0 }, end: null });
|
|
133
115
|
this.selectionStart = computed(() => this.selection().start, { equal: isEqual });
|
|
134
116
|
this.isMouseDown = signal(false);
|
|
@@ -193,9 +175,8 @@ class SelectionService {
|
|
|
193
175
|
return this.selection()?.end || this.selection()?.start;
|
|
194
176
|
}
|
|
195
177
|
findSelectedCell() {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
for (let j = 0; j < data[i].length; j++) {
|
|
178
|
+
for (let i = 0; i < this.data.items().length; i++) {
|
|
179
|
+
for (let j = 0; j < this.data.displayedColumns().length; j++) {
|
|
199
180
|
if (this.isSelected({ row: i, col: j })) {
|
|
200
181
|
return { row: i, col: j };
|
|
201
182
|
}
|
|
@@ -215,18 +196,6 @@ class SelectionService {
|
|
|
215
196
|
}
|
|
216
197
|
}
|
|
217
198
|
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
199
|
}
|
|
231
200
|
setCell(position, el) {
|
|
232
201
|
this.cellElMap.set(`${this.buildKey(position)}`, el);
|
|
@@ -253,66 +222,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
253
222
|
}], ctorParameters: () => [] });
|
|
254
223
|
|
|
255
224
|
class ClipboardService {
|
|
256
|
-
constructor(
|
|
257
|
-
this.gridService = gridService;
|
|
225
|
+
constructor(selectionService) {
|
|
258
226
|
this.selectionService = selectionService;
|
|
259
227
|
this.clipboard = inject(Clipboard);
|
|
260
228
|
this.snackBar = inject(SnackBarService);
|
|
229
|
+
this.data = inject(SpreadSheetDataService);
|
|
230
|
+
this.dataAccessor = injectDataAccessor();
|
|
231
|
+
this.expression = inject(EXPRESSION_TRANSFORMER);
|
|
232
|
+
this.language = inject(LanguageService);
|
|
233
|
+
}
|
|
234
|
+
buildGridData(range) {
|
|
235
|
+
const header = this.data.displayedColumns().map(column => ({
|
|
236
|
+
dataValue: this.language.transform(column),
|
|
237
|
+
expressionValue: this.language.transform(column),
|
|
238
|
+
isHeader: true
|
|
239
|
+
}));
|
|
240
|
+
const rows = this.data.items().map(item => this.data.displayedColumns().map(column => ({
|
|
241
|
+
dataValue: this.dataAccessor(item, column),
|
|
242
|
+
expressionValue: this.expression(this.dataAccessor(item, column), { item, name: column }),
|
|
243
|
+
})));
|
|
244
|
+
const fullData = [header, ...rows];
|
|
245
|
+
return fullData.slice(range.minRow, range.maxRow + 1).map(row => row.slice(range.minCol, range.maxCol + 1));
|
|
261
246
|
}
|
|
262
247
|
async copy() {
|
|
263
248
|
const selection = this.selectionService.getSelection();
|
|
264
249
|
if (!selection)
|
|
265
250
|
return;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
this.copyText(this.gridService.data()[start.row][start.col].dataValue);
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
251
|
+
let { start, end } = selection;
|
|
252
|
+
end = end ?? start;
|
|
271
253
|
const minRow = Math.min(start.row, end.row);
|
|
272
254
|
const maxRow = Math.max(start.row, end.row);
|
|
273
255
|
const minCol = Math.min(start.col, end.col);
|
|
274
256
|
const maxCol = Math.max(start.col, end.col);
|
|
275
|
-
const
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
clipboardData.push(row);
|
|
283
|
-
}
|
|
284
|
-
const tsv = papaparse.unparse(clipboardData, { delimiter: '\t', newline: '\n', header: false });
|
|
285
|
-
this.clipboard.copy(tsv);
|
|
257
|
+
const selectedData = this.buildGridData({ minRow, maxRow, minCol, maxCol });
|
|
258
|
+
const tsv = papaparse.unparse(selectedData.map(row => row.map(cell => cell.dataValue)), { delimiter: "\t", newline: "\n", header: false });
|
|
259
|
+
this.copyText(tsv);
|
|
260
|
+
}
|
|
261
|
+
setData(items, displayedColumns) {
|
|
262
|
+
this.data.displayedColumns.set(displayedColumns);
|
|
263
|
+
this.data.items.set(items);
|
|
286
264
|
}
|
|
287
265
|
copyText(text) {
|
|
288
266
|
this.clipboard.copy(text);
|
|
289
267
|
this.snackBar.open('クリップボードにコピーしました。');
|
|
290
268
|
}
|
|
291
269
|
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
270
|
}
|
|
310
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, deps: [{ token:
|
|
271
|
+
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
272
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService }); }
|
|
312
273
|
}
|
|
313
274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: ClipboardService, decorators: [{
|
|
314
275
|
type: Injectable
|
|
315
|
-
}], ctorParameters: () => [{ type:
|
|
276
|
+
}], ctorParameters: () => [{ type: SelectionService }] });
|
|
316
277
|
|
|
317
278
|
const COLUMN_PROTECTOR = new InjectionToken('COLUMN_PROTECTOR', {
|
|
318
279
|
providedIn: 'root',
|
|
@@ -339,6 +300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
339
300
|
|
|
340
301
|
class EditorService {
|
|
341
302
|
constructor() {
|
|
303
|
+
this.data = inject(SpreadSheetDataService);
|
|
342
304
|
this.grid = inject(GridService);
|
|
343
305
|
this.selection = inject(SelectionService);
|
|
344
306
|
this.protection = inject(ProtectionService);
|
|
@@ -371,9 +333,8 @@ class EditorService {
|
|
|
371
333
|
});
|
|
372
334
|
}
|
|
373
335
|
getEditingCell() {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
for (let j = 0; j < data[i].length; j++) {
|
|
336
|
+
for (let i = 0; i < this.data.items().length; i++) {
|
|
337
|
+
for (let j = 0; j < this.data.displayedColumns().length; j++) {
|
|
377
338
|
if (this.isEditing({ row: i, col: j })) {
|
|
378
339
|
return { row: i, col: j };
|
|
379
340
|
}
|
|
@@ -397,69 +358,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
397
358
|
type: Injectable
|
|
398
359
|
}] });
|
|
399
360
|
|
|
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
361
|
class SpreadSheetService {
|
|
459
362
|
constructor() {
|
|
460
363
|
this.config = { paste: false };
|
|
461
364
|
this.grid = inject(GridService);
|
|
462
|
-
|
|
365
|
+
// readonly data = inject(SpreadSheetDataService);
|
|
463
366
|
this.navigation = inject(NavigationService);
|
|
464
367
|
this.selection = inject(SelectionService);
|
|
465
368
|
this.clipboard = inject(ClipboardService);
|