@ng-atomic/common 19.0.0-preview.3 → 19.0.0-preview.30
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 +72 -178
- 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 +1 -3
- package/services/spreadsheet/features/selection.service.d.ts +2 -1
- 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/utils/mat-dayjs-date/dayjs-date.adapter.d.ts +0 -5
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.
|
|
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(
|
|
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 };
|
|
@@ -96,8 +77,9 @@ class NavigationService {
|
|
|
96
77
|
}
|
|
97
78
|
return { row, col };
|
|
98
79
|
}
|
|
99
|
-
moveRight(
|
|
100
|
-
|
|
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.
|
|
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: [
|
|
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
|
-
}]
|
|
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(
|
|
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
|
-
|
|
267
|
-
|
|
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
|
|
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);
|
|
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:
|
|
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:
|
|
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
|
-
|
|
375
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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(
|
|
465
|
+
newPosition = this.navigation.moveRight(selection);
|
|
572
466
|
break;
|
|
573
467
|
case 'ArrowLeft':
|
|
574
|
-
newPosition = this.navigation.moveLeft(
|
|
468
|
+
newPosition = this.navigation.moveLeft(selection);
|
|
575
469
|
break;
|
|
576
470
|
case 'ArrowUp':
|
|
577
|
-
newPosition = this.navigation.moveUp(
|
|
471
|
+
newPosition = this.navigation.moveUp(selection);
|
|
578
472
|
break;
|
|
579
473
|
case 'ArrowDown':
|
|
580
|
-
newPosition = this.navigation.moveDown(
|
|
474
|
+
newPosition = this.navigation.moveDown(selection);
|
|
581
475
|
break;
|
|
582
476
|
default:
|
|
583
477
|
return;
|