@ng-atomic/common 19.0.0-preview.11 → 19.0.0-preview.12
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/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-services-query-resolver.mjs +1 -1
- package/fesm2022/ng-atomic-common-services-query-resolver.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/package.json +8 -8
- 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
|
@@ -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;;;;"}
|
|
@@ -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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"}
|
|
@@ -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);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-atomic-common-services-spreadsheet.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/grid.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/navigation.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/selection.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/clipboard.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/protection.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/editor.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/data.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/spreadsheet.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/directives/grid-cell.directive.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/ng-atomic-common-services-spreadsheet.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\nimport { Cell, CellContext, Position } from '../models/cell.model';\n\n@Injectable()\nexport class GridService {\n readonly data = signal<Cell[][]>([[]]);\n readonly columns = computed(() => Array.from({ length: this.data()[0].length }, (_, i) => String.fromCharCode(65 + i)));\n protected readonly contextMap = new Map<string, CellContext>();\n\n updateCell(row: number, col: number, value: any): void {\n this.data.update(data => {\n data[row][col] = {\n dataValue: value,\n expressionValue: value,\n }\n return [...data];\n });\n }\n\n getValue(position: Position): any | null {\n return this.getCell(position)?.dataValue ?? null;\n }\n\n getExpressionValue(position: Position): any | null {\n return this.getCell(position)?.expressionValue ?? null;\n }\n\n protected getCell(position: Position): Cell | null {\n return this.data()[position.row]?.[position.col] ?? null;\n }\n\n updateAllCells(predicate: (cell: Cell) => boolean, updates: Partial<Cell>): void {\n this.data.update(data => {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[0].length; j++) {\n if (predicate(data[i][j])) {\n data[i][j] = { ...data[i][j], ...updates };\n }\n }\n }\n return [...data];\n }); \n }\n\n setContext(context: CellContext): void {\n this.contextMap.set(this.buildKey(context.position), context);\n }\n\n getContext(position: Position): CellContext | null {\n return this.contextMap.get(this.buildKey(position)) ?? null;\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { Injectable } from '@angular/core';\nimport { Position } from '../models/cell.model';\nimport { GridService } from './grid.service';\n\n@Injectable()\nexport class NavigationService {\n constructor(private gridService: GridService) {}\n\n moveToNextCell({row, col}: Position): Position {\n const columns = this.gridService.columns();\n if (col < columns.length - 1) {\n return { row, col: col + 1 };\n } else if (row < this.gridService.data().length - 1) {\n return { row: row + 1, col: 0 };\n }\n return { row, col };\n }\n\n moveToPreviousCell({row, col}: Position): Position {\n const columns = this.gridService.columns();\n if (col > 0) {\n return { row, col: col - 1 };\n } else if (row > 0) {\n return { row: row - 1, col: columns.length - 1 };\n }\n return { row, col };\n }\n\n moveToNextRow({row, col}: Position): Position {\n if (row < this.gridService.data().length - 1) {\n return { row: row + 1, col };\n }\n return { row, col };\n }\n\n moveToPreviousRow({row, col}: Position): Position {\n if (row > 0) {\n return { row: row - 1, col };\n }\n return { row, col };\n }\n\n moveRight({row, col}: Position): Position {\n if (col < this.gridService.columns().length - 1) {\n return { row, col: col + 1 };\n }\n return { row, col };\n }\n\n moveLeft({row, col}: Position): Position {\n if (col > 0) {\n return { row, col: col - 1 };\n }\n return { row, col };\n }\n\n moveUp({row, col}: Position): Position {\n if (row > 0) {\n return { row: row - 1, col };\n }\n return { row, col };\n }\n\n moveDown({row, col}: Position): Position {\n if (row < this.gridService.data().length - 1) {\n return { row: row + 1, col };\n }\n return { row, col };\n }\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Selection, Position } from '../models/cell.model';\nimport { GridService } from './grid.service';\nimport { isEqual } from 'lodash-es';\n\n@Injectable()\nexport class SelectionService {\n private readonly selection = signal<Selection>({ start: { row: 1, col: 0}, end: null });\n private readonly selectionStart = computed(() => this.selection().start, { equal: isEqual });\n private readonly isMouseDown = signal(false);\n private readonly grid = inject(GridService);\n private readonly cellElMap = new Map<string, HTMLTableCellElement>();\n\n constructor() {\n effect(() => {\n const position = this.selectionStart();\n if (position) this.focus(position);\n });\n }\n\n isSelected(position: Position): boolean {\n // selectionの範囲に含まれているかどうかを返す\n const selection = this.selection();\n if (!selection) return false;\n\n const { start, end } = selection;\n const minRow = Math.min(start.row, end?.row ?? start.row);\n const maxRow = Math.max(start.row, end?.row ?? start.row);\n const minCol = Math.min(start.col, end?.col ?? start.col);\n const maxCol = Math.max(start.col, end?.col ?? start.col);\n const { row, col } = position;\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol;\n }\n\n isCursorPosition(position: Position): boolean {\n return isEqual(this.selection().start, position);\n }\n\n handleMouseDown(position: Position, event?: MouseEvent): void {\n this.isMouseDown.set(true);\n if (!event?.shiftKey) {\n this.startSelection(position);\n }\n }\n\n handleMouseUp(): void {\n this.isMouseDown.set(false);\n }\n\n handleMouseEnter(position: Position): void {\n if (this.isMouseDown()) {\n this.updateSelection(position);\n }\n }\n\n handleClick(position: Position, event?: MouseEvent): void {\n if (!this.isMouseDown()) {\n if (event?.shiftKey) {\n this.updateSelectionEnd(position);\n } else {\n this.startSelection(position);\n }\n }\n }\n\n clearSelection(): void {\n this.selection.update((selection) => ({...selection, start: selection.start, end: null}));\n }\n\n setStartPosition(position: Position): void {\n this.selection.update((selection) => ({...selection, start: position, end: null}));\n }\n\n getSelection(): Selection | null {\n return this.selection();\n }\n\n getSelectionEndOrStart(): Position {\n return this.selection()?.end || this.selection()?.start;\n }\n\n findSelectedCell(): Position | null {\n const data = this.grid.data();\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n if (this.isSelected({row: i, col: j})) {\n return { row: i, col: j };\n }\n }\n }\n return null;\n }\n\n updateSelectionEnd(position: Position): void {\n this.selection.update((selection) => ({...selection, end: position}));\n }\n\n private startSelection(position: Position): void {\n this.selection.set({ start: position, end: null });\n }\n\n private updateSelection(position: Position): void {\n if (this.selection()) {\n this.selection.update((selection) => ({...selection, end: position}));\n }\n }\n\n clearSelectedRange(selection: { start: { row: number; col: number }; end: { row: number; col: number } }): void {\n const minRow = Math.min(selection.start.row, selection.end.row);\n const maxRow = Math.max(selection.start.row, selection.end.row);\n const minCol = Math.min(selection.start.col, selection.end.col);\n const maxCol = Math.max(selection.start.col, selection.end.col);\n\n for (let i = minRow; i <= maxRow; i++) {\n for (let j = minCol; j <= maxCol; j++) {\n this.grid.updateCell(i, j, {\n dataValue: '',\n expressionValue: ''\n });\n }\n }\n }\n\n setCell(position: Position, el: HTMLTableCellElement): void {\n this.cellElMap.set(`${this.buildKey(position)}`, el);\n }\n\n getCell(position: Position): HTMLTableCellElement | null {\n return this.cellElMap.get(this.buildKey(position)) ?? null;\n }\n\n focus(position: Position): void {\n setTimeout(() => {\n const el = this.getCell(position);\n if (el && el !== document.activeElement) {\n el.focus();\n }\n });\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { GridService } from './grid.service';\nimport { SelectionService } from './selection.service';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport papaparse from 'papaparse';\nimport { SnackBarService } from '@ng-atomic/common/services/snack-bar';\n\n@Injectable()\nexport class ClipboardService {\n private clipboard = inject(Clipboard);\n private snackBar = inject(SnackBarService);\n\n constructor(\n private gridService: GridService,\n private selectionService: SelectionService,\n ) { }\n\n async copy(): Promise<void> {\n const selection = this.selectionService.getSelection();\n if (!selection) return;\n\n const { start, end } = selection;\n\n if (!end) {\n this.copyText(this.gridService.data()[start.row][start.col].dataValue);\n return;\n }\n\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n const data = this.gridService.data();\n const clipboardData: string[][] = [];\n\n for (let i = minRow; i <= maxRow; i++) {\n const row: string[] = [];\n for (let j = minCol; j <= maxCol; j++) {\n row.push(data[i][j].dataValue);\n }\n clipboardData.push(row);\n }\n\n const tsv = papaparse.unparse(clipboardData, \n { delimiter: '\\t', newline: '\\n', header: false }\n );\n this.clipboard.copy(tsv);\n }\n\n protected copyText(text: string) {\n this.clipboard.copy(text);\n this.snackBar.open('クリップボードにコピーしました。');\n }\n\n async paste(targetRow: number, targetCol: number): Promise<void> {\n try {\n const clipboardText = await navigator.clipboard.readText();\n const rows = clipboardText.split('\\n');\n const data = this.gridService.data();\n\n const rowCount = Math.min(rows.length, data.length - targetRow);\n\n for (let i = 0; i < rowCount; i++) {\n const cells = rows[i].split('\\t');\n const colCount = Math.min(cells.length, this.gridService.columns().length - targetCol);\n\n for (let j = 0; j < colCount; j++) {\n this.gridService.updateCell(targetRow + i, targetCol + j, cells[j]);\n }\n }\n\n console.log('Data pasted from clipboard as TSV');\n } catch (err) {\n console.error('Failed to read data from clipboard', err);\n }\n }\n}","import { inject, Injectable, InjectionToken } from \"@angular/core\";\n\ninterface CellContext<T> {\n item: T;\n name: string;\n position: {\n row: number;\n col: number;\n }\n}\n\nexport type CellProtector = (value: any, context: CellContext<any>) => boolean;\nexport const COLUMN_PROTECTOR = new InjectionToken<CellProtector[]>('COLUMN_PROTECTOR', {\n providedIn: 'root',\n factory: () => [],\n});\nexport function provideCellProtector(useFactory: () => CellProtector) {\n return { provide: COLUMN_PROTECTOR, useFactory, multi: true };\n}\n\n@Injectable()\nexport class ProtectionService {\n readonly protectors = inject(COLUMN_PROTECTOR, {optional: true});\n\n isEditable(value: any, context: CellContext<any>): boolean {\n if (!this.protectors) return true;\n return this.protectors.every((protector) => protector(value, context));\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { GridService } from './grid.service';\nimport { SelectionService } from './selection.service';\nimport { ProtectionService } from './protection.service';\nimport { Position } from '../models/cell.model';\n\n@Injectable()\nexport class EditorService {\n private grid = inject(GridService);\n private selection = inject(SelectionService);\n private protection = inject(ProtectionService);\n readonly editinngCell = signal<{ row: number, col: number } | null>(null);\n protected readonly inputMap = new Map<string, HTMLInputElement>();\n\n isEditing(position: Position): boolean {\n return this.editinngCell()?.row === position.row && this.editinngCell()?.col === position.col;\n }\n\n startEditing(position: Position): void {\n const context = this.grid.getContext(position);\n console.debug('context:', context);\n if (!this.protection.isEditable(null, context)) {\n return;\n }\n this.selection.clearSelection();\n this.editinngCell.set(position);\n this.focus(position);\n }\n\n stopEditing(): void {\n this.editinngCell.set(null);\n }\n\n focus(position: Position): void {\n setTimeout(() => {\n const input = this.getInput(position);\n if (input && input !== document.activeElement) {\n input.focus();\n input.select();\n }\n });\n }\n\n getEditingCell(): Position | null {\n const data = this.grid.data();\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n if (this.isEditing({row: i, col: j})) {\n return { row: i, col: j };\n }\n }\n }\n return null;\n }\n\n setInput(input: HTMLInputElement, position: Position): void {\n this.inputMap.set(`${this.buildKey(position)}`, input);\n }\n\n getInput(position: Position): HTMLInputElement | null {\n return this.inputMap.get(this.buildKey(position)) ?? null;\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { inject, Injectable } from \"@angular/core\";\nimport { Cell } from \"../models\";\nimport { LanguageService } from \"@ng-atomic/common/services/language\";\nimport { injectDataAccessor } from \"@ng-atomic/common/pipes/data-accessor\";\nimport { EXPRESSION_TRANSFORMER } from \"@ng-atomic/common/utils\";\nimport CryptoJS from \"crypto-js\";\n\n@Injectable()\nexport class SpreadSheetDataService {\n readonly cache = new Map<string, Cell | Cell[]>();\n readonly language = inject(LanguageService);\n readonly dataAccessor = injectDataAccessor();\n readonly expression = inject(EXPRESSION_TRANSFORMER);\n\n buildGridData(items: any[], displayedColumns: string[]): Cell[][] {\n return [\n this.buildGridHeaderRow(displayedColumns),\n ...items.map((item) => this.buildGridRow(item, displayedColumns))\n ];\n }\n\n protected buildGridHeaderRow(columns: string[]): Cell[] {\n const key = this.buildKey({columns});\n const cached = this.cache.get(key);\n if (cached) return cached as Cell[];\n const row = columns.map((column) => ({\n dataValue: this.language.transform(column),\n expressionValue: this.language.transform(column),\n isHeader: true\n }));\n this.cache.set(key, row);\n return row;\n }\n\n protected buildGridRow(item: object, displayedColumns: string[]): Cell[] {\n const key = this.buildKey({item, displayedColumns});\n const cached = this.cache.get(key);\n if (cached) return cached as Cell[];\n const row = displayedColumns.map((column) => this.buildGridCell(item, column));\n this.cache.set(key, row);\n return row;\n }\n\n protected buildGridCell(item: object, column: string): Cell {\n const key = this.buildKey({item, column});\n const cached = this.cache.get(key);\n if (cached) return cached as Cell;\n const cell = {\n dataValue: this.dataAccessor(item, column),\n expressionValue: this.expression(this.dataAccessor(item, column), {item, name: column}),\n };\n this.cache.set(key, cell);\n return cell;\n }\n\n protected buildKey(obj: object): string {\n // return CryptoJS.MD5(JSON.stringify(obj)).toString(CryptoJS.enc.Base64).slice(0, 10);\n return JSON.stringify(obj);\n }\n\n}","import { inject, Injectable, Provider } from '@angular/core';\nimport { Position } from './models/cell.model';\nimport { GridService } from './features/grid.service';\nimport { NavigationService } from './features/navigation.service';\nimport { SelectionService } from './features/selection.service';\nimport { ClipboardService } from './features/clipboard.service';\nimport { EditorService } from './features/editor.service';\nimport { ProtectionService } from './features/protection.service';\nimport { SpreadSheetDataService } from './features/data.service';\n\n@Injectable()\nexport class SpreadSheetService {\n readonly config = { paste: false };\n readonly grid = inject(GridService);\n readonly data = inject(SpreadSheetDataService);\n readonly navigation = inject(NavigationService);\n readonly selection = inject(SelectionService);\n readonly clipboard = inject(ClipboardService);\n readonly editor = inject(EditorService);\n readonly protection = inject(ProtectionService);\n\n handleKeyDown(event: KeyboardEvent): void {\n if (this.editor.editinngCell()) {\n this.handleKeyDownOnEditing(event);\n } else {\n this.handleKeyDownOnSelecting(event);\n }\n }\n\n protected handleKeyDownOnEditing(event: KeyboardEvent): void {\n const cell = this.editor.editinngCell();\n if (event.key === 'Tab') {\n event.preventDefault();\n if (event.shiftKey) {\n this.move(cell, 'left', 'select');\n } else {\n this.move(cell, 'right', 'select');\n }\n } else if (event.key === 'Enter') {\n event.preventDefault();\n if (event.shiftKey) {\n this.move(cell, 'top', 'select');\n } else {\n this.move(cell, 'bottom', 'select');\n }\n }\n }\n\n protected handleKeyDownOnSelecting(event: KeyboardEvent): void {\n if (event.key === 'Tab') {\n const selectedCell = this.selection.findSelectedCell();\n event.preventDefault();\n event.stopPropagation();\n if (event.shiftKey) {\n this.move(selectedCell, 'left', 'select');\n } else {\n this.move(selectedCell, 'right', 'select');\n }\n return;\n } else if (event.key === 'Enter') {\n const selectedCell = this.selection.findSelectedCell();\n if (selectedCell) {\n this.editor.startEditing(selectedCell);\n event.preventDefault();\n }\n } else if (event.ctrlKey || event.metaKey) {\n if (event.key === 'c') {\n this.clipboard.copy();\n event.preventDefault();\n } else if (event.key === 'v') {\n if (!this.config.paste) return;\n const target = this.selection.findSelectedCell();\n if (target) {\n this.clipboard.paste(target.row, target.col);\n }\n event.preventDefault();\n }\n return;\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const selection = this.selection.getSelection();\n if (selection) {\n this.selection.clearSelectedRange(selection);\n event.preventDefault();\n return;\n }\n } else {\n const selectedCell = this.selection.findSelectedCell();\n let newPosition: Position;\n if (event.shiftKey) {\n const selectionEnd = this.selection.getSelectionEndOrStart();\n switch (event.key) {\n case 'ArrowRight':\n newPosition = this.navigation.moveRight(selectionEnd);\n break;\n case 'ArrowLeft':\n newPosition = this.navigation.moveLeft(selectionEnd);\n break;\n case 'ArrowUp':\n newPosition = this.navigation.moveUp(selectionEnd);\n break;\n case 'ArrowDown':\n newPosition = this.navigation.moveDown(selectionEnd);\n break;\n default:\n return;\n }\n if (newPosition) {\n event.preventDefault();\n this.selection.updateSelectionEnd(newPosition);\n }\n } else {\n switch (event.key) {\n case 'ArrowRight':\n newPosition = this.navigation.moveRight(selectedCell);\n break;\n case 'ArrowLeft':\n newPosition = this.navigation.moveLeft(selectedCell);\n break;\n case 'ArrowUp':\n newPosition = this.navigation.moveUp(selectedCell);\n break;\n case 'ArrowDown':\n newPosition = this.navigation.moveDown(selectedCell);\n break;\n default:\n return;\n }\n if (newPosition) {\n event.preventDefault();\n this.selection.clearSelection();\n this.selection.handleClick(newPosition);\n }\n }\n }\n }\n\n protected move(_position: Position, dest: 'top' | 'bottom' | 'left' | 'right', mode: 'edit' | 'select') {\n this.editor.stopEditing();\n let position: Position;\n if (dest === 'top') {\n position = this.navigation.moveToPreviousRow(_position);\n } else if (dest === 'bottom') {\n position = this.navigation.moveToNextRow(_position);\n } else if (dest === 'left') {\n position = this.navigation.moveToPreviousCell(_position);\n } else if (dest === 'right') {\n position = this.navigation.moveToNextCell(_position);\n }\n\n this.selection.setStartPosition(position);\n\n if (mode === 'edit') {\n this.editor.startEditing(position);\n }\n }\n}\n\nexport function provideSpreadSheetService(): Provider[] {\n return [\n ClipboardService,\n SpreadSheetDataService,\n EditorService,\n SpreadSheetService,\n GridService,\n NavigationService,\n SelectionService,\n ProtectionService\n ];\n}\n","import { computed, Directive, effect, ElementRef, inject, input, signal, AfterViewInit } from \"@angular/core\";\nimport { SpreadSheetService } from \"../spreadsheet.service\";\nimport { CellContext } from \"../models/cell.model\";\n\n@Directive({\n standalone: true,\n selector: '[ssCell]',\n host: {\n '[class.selected]': 'ss.selection.isSelected(position())',\n '[class.editing]': 'ss.editor.isEditing(position())',\n '(mousedown)': 'ss.selection.handleMouseDown(position(), $event)',\n '(mouseup)': 'ss.selection.handleMouseUp()',\n '(mouseenter)': 'ss.selection.handleMouseEnter(position())',\n '(click)': 'ss.selection.handleClick(position(), $event)',\n '(dblclick)': 'onDbClick()',\n }\n})\nexport class SpreadSheetCell implements AfterViewInit {\n protected ss = inject(SpreadSheetService);\n readonly el = inject<ElementRef<HTMLTableCellElement>>(ElementRef);\n\n readonly position = input<{row: number, col: number}>({row: 0, col: 0}, {alias: 'ssCell'});\n readonly editable = input<boolean>(false, {alias: 'ssCellEditable'});\n readonly context = input<CellContext>(null, {alias: 'ssCellContext'});\n readonly isSelected = computed(() => this.ss.selection.isSelected(this.position()));\n readonly isEditing = computed(() => this.ss.editor.isEditing(this.position()));\n readonly frameEl = signal<HTMLDivElement | null>(null);\n\n constructor() {\n effect(() => {\n if (!this.context()) return;\n this.ss.grid.setContext(this.context());\n });\n\n effect(() => {\n const isCursor = this.ss.selection.isCursorPosition(this.position());\n let frame = this.frameEl();\n\n if (isCursor) {\n if (!frame) {\n frame = this.buildOutlineFrame();\n this.el.nativeElement.appendChild(frame);\n this.frameEl.set(frame);\n }\n } else {\n frame?.remove();\n this.frameEl.set(null);\n }\n });\n }\n\n onDbClick(): void {\n if (!this.editable()) return;\n this.ss.editor.startEditing(this.position());\n }\n\n ngAfterViewInit(): void {\n this.ss.selection.setCell(this.position(), this.el.nativeElement);\n if (this.isSelected() && !this.isEditing()) {\n this.ss.selection.focus(this.position());\n }\n }\n\n protected buildOutlineFrame(): HTMLDivElement {\n const frame = document.createElement('div');\n frame.classList.add('selection-frame');\n frame.style.position = 'absolute';\n frame.style.top = '0';\n frame.style.left = '0';\n frame.style.width = '100%';\n frame.style.height = '100%';\n frame.style.border = '2px solid #2196f3';\n frame.style.borderRadius = '4px';\n frame.style.pointerEvents = 'none';\n frame.style.boxSizing = 'border-box';\n return frame;\n }\n\n protected createLabelElement(options: {\n label: string\n color: string\n }) {\n const el = document.createElement('span');\n el.textContent = options.label;\n el.style.backgroundColor = `${options.color}`;\n el.style.color = '#fff';\n el.style.padding = '2px 4px';\n el.style.position = 'absolute';\n el.style.fontSize = '10px';\n el.style.top = '0';\n el.style.left = '0';\n el.style.zIndex = '9999';\n el.style.lineHeight = '1.5em';\n el.style.whiteSpace = 'nowrap';\n this.el.nativeElement.appendChild(el);\n }\n}\n\n\n@Directive({\n standalone: true,\n selector: '[ssCellInput]',\n host: {\n '(blur)': 'stopEditing()',\n }\n})\nexport class SpreadSheetCellInput implements AfterViewInit {\n protected ss = inject(SpreadSheetService);\n readonly position = input<{row: number, col: number}>({row: 0, col: 0}, {alias: 'ssCellInput'});\n readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly isSelected = computed(() => this.ss.selection.isSelected(this.position()));\n readonly isEditing = computed(() => this.ss.editor.isEditing(this.position()));\n\n ngAfterViewInit(): void {\n this.ss.editor.setInput(this.el.nativeElement, this.position());\n if (this.isSelected() && this.isEditing()) {\n this.ss.editor.focus(this.position());\n }\n }\n\n protected stopEditing(): void {\n this.ss.editor.stopEditing();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.GridService","i2.SelectionService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-atomic-common-services-spreadsheet.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/data.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/grid.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/navigation.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/selection.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/clipboard.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/protection.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/features/editor.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/spreadsheet.service.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/directives/grid-cell.directive.ts","../../../../../packages/@ng-atomic/common/src/lib/services/spreadsheet/ng-atomic-common-services-spreadsheet.ts"],"sourcesContent":["import { Injectable, signal } from \"@angular/core\";\n\n\n@Injectable()\nexport class SpreadSheetDataService {\n readonly displayedColumns = signal<string[]>([]);\n readonly items = signal<any[]>([]);\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { CellContext, Position } from '../models/cell.model';\nimport { SpreadSheetDataService } from './data.service';\n\n@Injectable()\nexport class GridService {\n protected readonly contextMap = new Map<string, CellContext>();\n protected readonly data = inject(SpreadSheetDataService);\n\n readonly maxCol = computed(() => this.data.displayedColumns().length - 1);\n readonly maxRow = computed(() => this.data.items().length - 1);\n\n setContext(context: CellContext): void {\n this.contextMap.set(this.buildKey(context.position), context);\n }\n\n getContext(position: Position): CellContext | null {\n return this.contextMap.get(this.buildKey(position)) ?? null;\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { Position } from '../models/cell.model';\nimport { GridService } from './grid.service';\n\n@Injectable()\nexport class NavigationService {\n private gridService = inject(GridService)\n\n moveToNextCell({row, col}: Position): Position {\n if (col < this.gridService.maxCol()) {\n return { row, col: col + 1 };\n } else if (row < this.gridService.maxRow()) {\n return { row: row + 1, col: 0 };\n }\n return { row, col };\n }\n\n moveToPreviousCell({row, col}: Position): Position {\n if (col > 0) {\n return { row, col: col - 1 };\n } else if (row > 0) {\n return { row: row - 1, col: this.gridService.maxCol() };\n }\n return { row, col };\n }\n\n moveToNextRow({row, col}: Position): Position {\n if (row < this.gridService.maxRow()) {\n return { row: row + 1, col };\n }\n return { row, col };\n }\n\n moveToPreviousRow({row, col}: Position): Position {\n if (row > 0) {\n return { row: row - 1, col };\n }\n return { row, col };\n }\n\n moveRight({row, col}: Position): Position {\n if (col < this.gridService.maxCol()) {\n return { row, col: col + 1 };\n }\n return { row, col };\n }\n\n moveLeft({row, col}: Position): Position {\n if (col > 0) {\n return { row, col: col - 1 };\n }\n return { row, col };\n }\n\n moveUp({row, col}: Position): Position {\n if (row > 0) {\n return { row: row - 1, col };\n }\n return { row, col };\n }\n\n moveDown({row, col}: Position): Position {\n if (row < this.gridService.maxRow()) {\n return { row: row + 1, col };\n }\n return { row, col };\n }\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Selection, Position } from '../models/cell.model';\nimport { GridService } from './grid.service';\nimport { isEqual } from 'lodash-es';\nimport { SpreadSheetDataService } from './data.service';\n\n@Injectable()\nexport class SelectionService {\n protected readonly data = inject(SpreadSheetDataService);\n private readonly selection = signal<Selection>({ start: { row: 1, col: 0}, end: null });\n private readonly selectionStart = computed(() => this.selection().start, { equal: isEqual });\n private readonly isMouseDown = signal(false);\n private readonly grid = inject(GridService);\n private readonly cellElMap = new Map<string, HTMLTableCellElement>();\n\n constructor() {\n effect(() => {\n const position = this.selectionStart();\n if (position) this.focus(position);\n });\n }\n\n isSelected(position: Position): boolean {\n // selectionの範囲に含まれているかどうかを返す\n const selection = this.selection();\n if (!selection) return false;\n\n const { start, end } = selection;\n const minRow = Math.min(start.row, end?.row ?? start.row);\n const maxRow = Math.max(start.row, end?.row ?? start.row);\n const minCol = Math.min(start.col, end?.col ?? start.col);\n const maxCol = Math.max(start.col, end?.col ?? start.col);\n const { row, col } = position;\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol;\n }\n\n isCursorPosition(position: Position): boolean {\n return isEqual(this.selection().start, position);\n }\n\n handleMouseDown(position: Position, event?: MouseEvent): void {\n this.isMouseDown.set(true);\n if (!event?.shiftKey) {\n this.startSelection(position);\n }\n }\n\n handleMouseUp(): void {\n this.isMouseDown.set(false);\n }\n\n handleMouseEnter(position: Position): void {\n if (this.isMouseDown()) {\n this.updateSelection(position);\n }\n }\n\n handleClick(position: Position, event?: MouseEvent): void {\n if (!this.isMouseDown()) {\n if (event?.shiftKey) {\n this.updateSelectionEnd(position);\n } else {\n this.startSelection(position);\n }\n }\n }\n\n clearSelection(): void {\n this.selection.update((selection) => ({...selection, start: selection.start, end: null}));\n }\n\n setStartPosition(position: Position): void {\n this.selection.update((selection) => ({...selection, start: position, end: null}));\n }\n\n getSelection(): Selection | null {\n return this.selection();\n }\n\n getSelectionEndOrStart(): Position {\n return this.selection()?.end || this.selection()?.start;\n }\n\n findSelectedCell(): Position | null {\n for (let i = 0; i < this.data.items().length; i++) {\n for (let j = 0; j < this.data.displayedColumns().length; j++) {\n if (this.isSelected({row: i, col: j})) {\n return { row: i, col: j };\n }\n }\n }\n return null;\n }\n\n updateSelectionEnd(position: Position): void {\n this.selection.update((selection) => ({...selection, end: position}));\n }\n\n private startSelection(position: Position): void {\n this.selection.set({ start: position, end: null });\n }\n\n private updateSelection(position: Position): void {\n if (this.selection()) {\n this.selection.update((selection) => ({...selection, end: position}));\n }\n }\n\n clearSelectedRange(selection: { start: { row: number; col: number }; end: { row: number; col: number } }): void {\n\n }\n\n setCell(position: Position, el: HTMLTableCellElement): void {\n this.cellElMap.set(`${this.buildKey(position)}`, el);\n }\n\n getCell(position: Position): HTMLTableCellElement | null {\n return this.cellElMap.get(this.buildKey(position)) ?? null;\n }\n\n focus(position: Position): void {\n setTimeout(() => {\n const el = this.getCell(position);\n if (el && el !== document.activeElement) {\n el.focus();\n }\n });\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { SnackBarService } from '@ng-atomic/common/services/snack-bar';\nimport { injectDataAccessor } from '@ng-atomic/common/pipes/data-accessor';\nimport { EXPRESSION_TRANSFORMER } from '@ng-atomic/common/utils';\nimport { LanguageService } from '@ng-atomic/common/services/language';\nimport papaparse from 'papaparse';\nimport { Cell } from '../models';\nimport { SelectionService } from './selection.service';\nimport { SpreadSheetDataService } from './data.service';\n\n@Injectable()\nexport class ClipboardService {\n private clipboard = inject(Clipboard);\n private snackBar = inject(SnackBarService);\n protected data = inject(SpreadSheetDataService);\n readonly dataAccessor = injectDataAccessor();\n readonly expression = inject(EXPRESSION_TRANSFORMER);\n readonly language = inject(LanguageService);\n\n constructor(\n private selectionService: SelectionService,\n ) { }\n\n private buildGridData(range: {minRow: number; maxRow: number; minCol: number; maxCol: number}): Cell[][] {\n const header = this.data.displayedColumns().map(column => ({\n dataValue: this.language.transform(column),\n expressionValue: this.language.transform(column),\n isHeader: true\n }));\n const rows = this.data.items().map(item => this.data.displayedColumns().map(column => ({\n dataValue: this.dataAccessor(item, column),\n expressionValue: this.expression(this.dataAccessor(item, column), {item, name: column}),\n })));\n const fullData = [header, ...rows];\n return fullData.slice(range.minRow, range.maxRow + 1).map(row => row.slice(range.minCol, range.maxCol + 1));\n }\n\n async copy(): Promise<void> {\n const selection = this.selectionService.getSelection();\n if (!selection) return;\n let { start, end } = selection;\n end = end ?? start;\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n const selectedData = this.buildGridData({minRow, maxRow, minCol, maxCol});\n const tsv = papaparse.unparse(selectedData.map(row => row.map(cell => cell.dataValue)),\n { delimiter: \"\\t\", newline: \"\\n\", header: false });\n this.copyText(tsv);\n }\n\n setData(items: any[], displayedColumns: string[]): void {\n this.data.displayedColumns.set(displayedColumns);\n this.data.items.set(items);\n }\n\n protected copyText(text: string) {\n this.clipboard.copy(text);\n this.snackBar.open('クリップボードにコピーしました。');\n }\n\n async paste(targetRow: number, targetCol: number): Promise<void> {\n }\n}","import { inject, Injectable, InjectionToken } from \"@angular/core\";\n\ninterface CellContext<T> {\n item: T;\n name: string;\n position: {\n row: number;\n col: number;\n }\n}\n\nexport type CellProtector = (value: any, context: CellContext<any>) => boolean;\nexport const COLUMN_PROTECTOR = new InjectionToken<CellProtector[]>('COLUMN_PROTECTOR', {\n providedIn: 'root',\n factory: () => [],\n});\nexport function provideCellProtector(useFactory: () => CellProtector) {\n return { provide: COLUMN_PROTECTOR, useFactory, multi: true };\n}\n\n@Injectable()\nexport class ProtectionService {\n readonly protectors = inject(COLUMN_PROTECTOR, {optional: true});\n\n isEditable(value: any, context: CellContext<any>): boolean {\n if (!this.protectors) return true;\n return this.protectors.every((protector) => protector(value, context));\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { GridService } from './grid.service';\nimport { SelectionService } from './selection.service';\nimport { ProtectionService } from './protection.service';\nimport { Position } from '../models/cell.model';\nimport { SpreadSheetDataService } from './data.service';\n\n@Injectable()\nexport class EditorService {\n protected readonly data = inject(SpreadSheetDataService);\n private grid = inject(GridService);\n private selection = inject(SelectionService);\n private protection = inject(ProtectionService);\n readonly editinngCell = signal<{ row: number, col: number } | null>(null);\n protected readonly inputMap = new Map<string, HTMLInputElement>();\n\n isEditing(position: Position): boolean {\n return this.editinngCell()?.row === position.row && this.editinngCell()?.col === position.col;\n }\n\n startEditing(position: Position): void {\n const context = this.grid.getContext(position);\n console.debug('context:', context);\n if (!this.protection.isEditable(null, context)) {\n return;\n }\n this.selection.clearSelection();\n this.editinngCell.set(position);\n this.focus(position);\n }\n\n stopEditing(): void {\n this.editinngCell.set(null);\n }\n\n focus(position: Position): void {\n setTimeout(() => {\n const input = this.getInput(position);\n if (input && input !== document.activeElement) {\n input.focus();\n input.select();\n }\n });\n }\n\n getEditingCell(): Position | null {\n for (let i = 0; i < this.data.items().length; i++) {\n for (let j = 0; j < this.data.displayedColumns().length; j++) {\n if (this.isEditing({row: i, col: j})) {\n return { row: i, col: j };\n }\n }\n }\n return null;\n }\n\n setInput(input: HTMLInputElement, position: Position): void {\n this.inputMap.set(`${this.buildKey(position)}`, input);\n }\n\n getInput(position: Position): HTMLInputElement | null {\n return this.inputMap.get(this.buildKey(position)) ?? null;\n }\n\n protected buildKey(position: Position): string {\n return `(${position.row}, ${position.col})`;\n }\n}","import { inject, Injectable, Provider } from '@angular/core';\nimport { Position } from './models/cell.model';\nimport { GridService } from './features/grid.service';\nimport { NavigationService } from './features/navigation.service';\nimport { SelectionService } from './features/selection.service';\nimport { ClipboardService } from './features/clipboard.service';\nimport { EditorService } from './features/editor.service';\nimport { ProtectionService } from './features/protection.service';\nimport { SpreadSheetDataService } from './features/data.service';\n\n@Injectable()\nexport class SpreadSheetService {\n readonly config = { paste: false };\n readonly grid = inject(GridService);\n // readonly data = inject(SpreadSheetDataService);\n readonly navigation = inject(NavigationService);\n readonly selection = inject(SelectionService);\n readonly clipboard = inject(ClipboardService);\n readonly editor = inject(EditorService);\n readonly protection = inject(ProtectionService);\n\n handleKeyDown(event: KeyboardEvent): void {\n if (this.editor.editinngCell()) {\n this.handleKeyDownOnEditing(event);\n } else {\n this.handleKeyDownOnSelecting(event);\n }\n }\n\n protected handleKeyDownOnEditing(event: KeyboardEvent): void {\n const cell = this.editor.editinngCell();\n if (event.key === 'Tab') {\n event.preventDefault();\n if (event.shiftKey) {\n this.move(cell, 'left', 'select');\n } else {\n this.move(cell, 'right', 'select');\n }\n } else if (event.key === 'Enter') {\n event.preventDefault();\n if (event.shiftKey) {\n this.move(cell, 'top', 'select');\n } else {\n this.move(cell, 'bottom', 'select');\n }\n }\n }\n\n protected handleKeyDownOnSelecting(event: KeyboardEvent): void {\n if (event.key === 'Tab') {\n const selectedCell = this.selection.findSelectedCell();\n event.preventDefault();\n event.stopPropagation();\n if (event.shiftKey) {\n this.move(selectedCell, 'left', 'select');\n } else {\n this.move(selectedCell, 'right', 'select');\n }\n return;\n } else if (event.key === 'Enter') {\n const selectedCell = this.selection.findSelectedCell();\n if (selectedCell) {\n this.editor.startEditing(selectedCell);\n event.preventDefault();\n }\n } else if (event.ctrlKey || event.metaKey) {\n if (event.key === 'c') {\n this.clipboard.copy();\n event.preventDefault();\n } else if (event.key === 'v') {\n if (!this.config.paste) return;\n const target = this.selection.findSelectedCell();\n if (target) {\n this.clipboard.paste(target.row, target.col);\n }\n event.preventDefault();\n }\n return;\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const selection = this.selection.getSelection();\n if (selection) {\n this.selection.clearSelectedRange(selection);\n event.preventDefault();\n return;\n }\n } else {\n const selectedCell = this.selection.findSelectedCell();\n let newPosition: Position;\n if (event.shiftKey) {\n const selectionEnd = this.selection.getSelectionEndOrStart();\n switch (event.key) {\n case 'ArrowRight':\n newPosition = this.navigation.moveRight(selectionEnd);\n break;\n case 'ArrowLeft':\n newPosition = this.navigation.moveLeft(selectionEnd);\n break;\n case 'ArrowUp':\n newPosition = this.navigation.moveUp(selectionEnd);\n break;\n case 'ArrowDown':\n newPosition = this.navigation.moveDown(selectionEnd);\n break;\n default:\n return;\n }\n if (newPosition) {\n event.preventDefault();\n this.selection.updateSelectionEnd(newPosition);\n }\n } else {\n switch (event.key) {\n case 'ArrowRight':\n newPosition = this.navigation.moveRight(selectedCell);\n break;\n case 'ArrowLeft':\n newPosition = this.navigation.moveLeft(selectedCell);\n break;\n case 'ArrowUp':\n newPosition = this.navigation.moveUp(selectedCell);\n break;\n case 'ArrowDown':\n newPosition = this.navigation.moveDown(selectedCell);\n break;\n default:\n return;\n }\n if (newPosition) {\n event.preventDefault();\n this.selection.clearSelection();\n this.selection.handleClick(newPosition);\n }\n }\n }\n }\n\n protected move(_position: Position, dest: 'top' | 'bottom' | 'left' | 'right', mode: 'edit' | 'select') {\n this.editor.stopEditing();\n let position: Position;\n if (dest === 'top') {\n position = this.navigation.moveToPreviousRow(_position);\n } else if (dest === 'bottom') {\n position = this.navigation.moveToNextRow(_position);\n } else if (dest === 'left') {\n position = this.navigation.moveToPreviousCell(_position);\n } else if (dest === 'right') {\n position = this.navigation.moveToNextCell(_position);\n }\n\n this.selection.setStartPosition(position);\n\n if (mode === 'edit') {\n this.editor.startEditing(position);\n }\n }\n}\n\nexport function provideSpreadSheetService(): Provider[] {\n return [\n ClipboardService,\n SpreadSheetDataService,\n EditorService,\n SpreadSheetService,\n GridService,\n NavigationService,\n SelectionService,\n ProtectionService\n ];\n}\n","import { computed, Directive, effect, ElementRef, inject, input, signal, AfterViewInit } from \"@angular/core\";\nimport { SpreadSheetService } from \"../spreadsheet.service\";\nimport { CellContext } from \"../models/cell.model\";\n\n@Directive({\n standalone: true,\n selector: '[ssCell]',\n host: {\n '[class.selected]': 'ss.selection.isSelected(position())',\n '[class.editing]': 'ss.editor.isEditing(position())',\n '(mousedown)': 'ss.selection.handleMouseDown(position(), $event)',\n '(mouseup)': 'ss.selection.handleMouseUp()',\n '(mouseenter)': 'ss.selection.handleMouseEnter(position())',\n '(click)': 'ss.selection.handleClick(position(), $event)',\n '(dblclick)': 'onDbClick()',\n }\n})\nexport class SpreadSheetCell implements AfterViewInit {\n protected ss = inject(SpreadSheetService);\n readonly el = inject<ElementRef<HTMLTableCellElement>>(ElementRef);\n\n readonly position = input<{row: number, col: number}>({row: 0, col: 0}, {alias: 'ssCell'});\n readonly editable = input<boolean>(false, {alias: 'ssCellEditable'});\n readonly context = input<CellContext>(null, {alias: 'ssCellContext'});\n readonly isSelected = computed(() => this.ss.selection.isSelected(this.position()));\n readonly isEditing = computed(() => this.ss.editor.isEditing(this.position()));\n readonly frameEl = signal<HTMLDivElement | null>(null);\n\n constructor() {\n effect(() => {\n if (!this.context()) return;\n this.ss.grid.setContext(this.context());\n });\n\n effect(() => {\n const isCursor = this.ss.selection.isCursorPosition(this.position());\n let frame = this.frameEl();\n\n if (isCursor) {\n if (!frame) {\n frame = this.buildOutlineFrame();\n this.el.nativeElement.appendChild(frame);\n this.frameEl.set(frame);\n }\n } else {\n frame?.remove();\n this.frameEl.set(null);\n }\n });\n }\n\n onDbClick(): void {\n if (!this.editable()) return;\n this.ss.editor.startEditing(this.position());\n }\n\n ngAfterViewInit(): void {\n this.ss.selection.setCell(this.position(), this.el.nativeElement);\n if (this.isSelected() && !this.isEditing()) {\n this.ss.selection.focus(this.position());\n }\n }\n\n protected buildOutlineFrame(): HTMLDivElement {\n const frame = document.createElement('div');\n frame.classList.add('selection-frame');\n frame.style.position = 'absolute';\n frame.style.top = '0';\n frame.style.left = '0';\n frame.style.width = '100%';\n frame.style.height = '100%';\n frame.style.border = '2px solid #2196f3';\n frame.style.borderRadius = '4px';\n frame.style.pointerEvents = 'none';\n frame.style.boxSizing = 'border-box';\n return frame;\n }\n\n protected createLabelElement(options: {\n label: string\n color: string\n }) {\n const el = document.createElement('span');\n el.textContent = options.label;\n el.style.backgroundColor = `${options.color}`;\n el.style.color = '#fff';\n el.style.padding = '2px 4px';\n el.style.position = 'absolute';\n el.style.fontSize = '10px';\n el.style.top = '0';\n el.style.left = '0';\n el.style.zIndex = '9999';\n el.style.lineHeight = '1.5em';\n el.style.whiteSpace = 'nowrap';\n this.el.nativeElement.appendChild(el);\n }\n}\n\n\n@Directive({\n standalone: true,\n selector: '[ssCellInput]',\n host: {\n '(blur)': 'stopEditing()',\n }\n})\nexport class SpreadSheetCellInput implements AfterViewInit {\n protected ss = inject(SpreadSheetService);\n readonly position = input<{row: number, col: number}>({row: 0, col: 0}, {alias: 'ssCellInput'});\n readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly isSelected = computed(() => this.ss.selection.isSelected(this.position()));\n readonly isEditing = computed(() => this.ss.editor.isEditing(this.position()));\n\n ngAfterViewInit(): void {\n this.ss.editor.setInput(this.el.nativeElement, this.position());\n if (this.isSelected() && this.isEditing()) {\n this.ss.editor.focus(this.position());\n }\n }\n\n protected stopEditing(): void {\n this.ss.editor.stopEditing();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SelectionService"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-atomic/common",
|
|
3
|
-
"version": "19.0.0-preview.
|
|
3
|
+
"version": "19.0.0-preview.12",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/cdk": "19.1.2",
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
"@angular/material": "19.1.2",
|
|
12
12
|
"@angular/router": "19.1.4",
|
|
13
13
|
"@ngrx/component-store": "19.0.1",
|
|
14
|
-
"@nx-ddd/core": "19.0.0-preview.
|
|
14
|
+
"@nx-ddd/core": "19.0.0-preview.12",
|
|
15
15
|
"dayjs": "1.11.13",
|
|
16
16
|
"flat": "^6.0.0",
|
|
17
17
|
"lodash-es": "^4.17.15",
|
|
18
18
|
"papaparse": "^5.4.1",
|
|
19
19
|
"rxjs": "^7.0.0",
|
|
20
|
-
"@ng-atomic/core": "19.0.0-preview.
|
|
21
|
-
"@nx-ddd/common": "19.0.0-preview.
|
|
20
|
+
"@ng-atomic/core": "19.0.0-preview.12",
|
|
21
|
+
"@nx-ddd/common": "19.0.0-preview.12",
|
|
22
22
|
"class-validator": "^0.14.0",
|
|
23
23
|
"ngxtension": "^2.0.0",
|
|
24
24
|
"ffprobe-wasm": "^0.3.1",
|
|
@@ -223,14 +223,14 @@
|
|
|
223
223
|
"types": "./services/query-resolver/index.d.ts",
|
|
224
224
|
"default": "./fesm2022/ng-atomic-common-services-query-resolver.mjs"
|
|
225
225
|
},
|
|
226
|
-
"./services/root-property": {
|
|
227
|
-
"types": "./services/root-property/index.d.ts",
|
|
228
|
-
"default": "./fesm2022/ng-atomic-common-services-root-property.mjs"
|
|
229
|
-
},
|
|
230
226
|
"./services/router": {
|
|
231
227
|
"types": "./services/router/index.d.ts",
|
|
232
228
|
"default": "./fesm2022/ng-atomic-common-services-router.mjs"
|
|
233
229
|
},
|
|
230
|
+
"./services/root-property": {
|
|
231
|
+
"types": "./services/root-property/index.d.ts",
|
|
232
|
+
"default": "./fesm2022/ng-atomic-common-services-root-property.mjs"
|
|
233
|
+
},
|
|
234
234
|
"./services/secret": {
|
|
235
235
|
"types": "./services/secret/index.d.ts",
|
|
236
236
|
"default": "./fesm2022/ng-atomic-common-services-secret.mjs"
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LanguageService } from '@ng-atomic/common/services/language';
|
|
2
2
|
import { SelectionService } from './selection.service';
|
|
3
|
+
import { SpreadSheetDataService } from './data.service';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export declare class ClipboardService {
|
|
5
|
-
private gridService;
|
|
6
6
|
private selectionService;
|
|
7
7
|
private clipboard;
|
|
8
8
|
private snackBar;
|
|
9
|
-
|
|
9
|
+
protected data: SpreadSheetDataService;
|
|
10
|
+
readonly dataAccessor: import("@ng-atomic/common/pipes/data-accessor").DataAccessor<unknown>;
|
|
11
|
+
readonly expression: import("@ng-atomic/common/utils").ExpressionTransformer;
|
|
12
|
+
readonly language: LanguageService;
|
|
13
|
+
constructor(selectionService: SelectionService);
|
|
14
|
+
private buildGridData;
|
|
10
15
|
copy(): Promise<void>;
|
|
16
|
+
setData(items: any[], displayedColumns: string[]): void;
|
|
11
17
|
protected copyText(text: string): void;
|
|
12
18
|
paste(targetRow: number, targetCol: number): Promise<void>;
|
|
13
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<ClipboardService, never>;
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import { Cell } from "../models";
|
|
2
|
-
import { LanguageService } from "@ng-atomic/common/services/language";
|
|
3
1
|
import * as i0 from "@angular/core";
|
|
4
2
|
export declare class SpreadSheetDataService {
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
7
|
-
readonly dataAccessor: import("@ng-atomic/common/pipes/data-accessor").DataAccessor<unknown>;
|
|
8
|
-
readonly expression: import("@ng-atomic/common/utils").ExpressionTransformer;
|
|
9
|
-
buildGridData(items: any[], displayedColumns: string[]): Cell[][];
|
|
10
|
-
protected buildGridHeaderRow(columns: string[]): Cell[];
|
|
11
|
-
protected buildGridRow(item: object, displayedColumns: string[]): Cell[];
|
|
12
|
-
protected buildGridCell(item: object, column: string): Cell;
|
|
13
|
-
protected buildKey(obj: object): string;
|
|
3
|
+
readonly displayedColumns: import("@angular/core").WritableSignal<string[]>;
|
|
4
|
+
readonly items: import("@angular/core").WritableSignal<any[]>;
|
|
14
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<SpreadSheetDataService, never>;
|
|
15
6
|
static ɵprov: i0.ɵɵInjectableDeclaration<SpreadSheetDataService>;
|
|
16
7
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Position } from '../models/cell.model';
|
|
2
|
+
import { SpreadSheetDataService } from './data.service';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class EditorService {
|
|
5
|
+
protected readonly data: SpreadSheetDataService;
|
|
4
6
|
private grid;
|
|
5
7
|
private selection;
|
|
6
8
|
private protection;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CellContext, Position } from '../models/cell.model';
|
|
2
|
+
import { SpreadSheetDataService } from './data.service';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class GridService {
|
|
4
|
-
readonly data: import("@angular/core").WritableSignal<Cell[][]>;
|
|
5
|
-
readonly columns: import("@angular/core").Signal<string[]>;
|
|
6
5
|
protected readonly contextMap: Map<string, CellContext<any>>;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
protected getCell(position: Position): Cell | null;
|
|
11
|
-
updateAllCells(predicate: (cell: Cell) => boolean, updates: Partial<Cell>): void;
|
|
6
|
+
protected readonly data: SpreadSheetDataService;
|
|
7
|
+
readonly maxCol: import("@angular/core").Signal<number>;
|
|
8
|
+
readonly maxRow: import("@angular/core").Signal<number>;
|
|
12
9
|
setContext(context: CellContext): void;
|
|
13
10
|
getContext(position: Position): CellContext | null;
|
|
14
11
|
protected buildKey(position: Position): string;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { Position } from '../models/cell.model';
|
|
2
|
-
import { GridService } from './grid.service';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
export declare class NavigationService {
|
|
5
4
|
private gridService;
|
|
6
|
-
constructor(gridService: GridService);
|
|
7
5
|
moveToNextCell({ row, col }: Position): Position;
|
|
8
6
|
moveToPreviousCell({ row, col }: Position): Position;
|
|
9
7
|
moveToNextRow({ row, col }: Position): Position;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Selection, Position } from '../models/cell.model';
|
|
2
|
+
import { SpreadSheetDataService } from './data.service';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class SelectionService {
|
|
5
|
+
protected readonly data: SpreadSheetDataService;
|
|
4
6
|
private readonly selection;
|
|
5
7
|
private readonly selectionStart;
|
|
6
8
|
private readonly isMouseDown;
|
|
@@ -6,14 +6,12 @@ import { SelectionService } from './features/selection.service';
|
|
|
6
6
|
import { ClipboardService } from './features/clipboard.service';
|
|
7
7
|
import { EditorService } from './features/editor.service';
|
|
8
8
|
import { ProtectionService } from './features/protection.service';
|
|
9
|
-
import { SpreadSheetDataService } from './features/data.service';
|
|
10
9
|
import * as i0 from "@angular/core";
|
|
11
10
|
export declare class SpreadSheetService {
|
|
12
11
|
readonly config: {
|
|
13
12
|
paste: boolean;
|
|
14
13
|
};
|
|
15
14
|
readonly grid: GridService;
|
|
16
|
-
readonly data: SpreadSheetDataService;
|
|
17
15
|
readonly navigation: NavigationService;
|
|
18
16
|
readonly selection: SelectionService;
|
|
19
17
|
readonly clipboard: ClipboardService;
|