@g1cloud/open-bluesea-grid 1.0.0-alpha.1
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/css/bluesea-grid.css +1 -0
- package/dist/BSGridColumnSettingModal-GMHDkrKO.js +4 -0
- package/dist/component/DateFilterModel.d.ts +18 -0
- package/dist/component/DateRangePresetModel.d.ts +15 -0
- package/dist/component/GridExtension.d.ts +16 -0
- package/dist/component/GridLib.d.ts +21 -0
- package/dist/component/GridModel.d.ts +402 -0
- package/dist/component/vDndSupport.d.ts +17 -0
- package/dist/index.d.ts +34 -0
- package/dist/model/FilterModel.d.ts +113 -0
- package/dist/model/PaginatedList.d.ts +29 -0
- package/dist/model/SearchModel.d.ts +21 -0
- package/dist/open-bluesea-grid.css +376 -0
- package/dist/open-bluesea-grid.es.js +3310 -0
- package/dist/open-bluesea-grid.umd.js +3315 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import '../dist/open-bluesea-grid.css';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BetweenDateFilter } from "@/model/FilterModel.ts";
|
|
2
|
+
import { Dayjs } from "dayjs";
|
|
3
|
+
import { type DateRangePreset } from "./DateRangePresetModel.ts";
|
|
4
|
+
import type { TimeZone } from "@g1cloud/open-bluesea-core";
|
|
5
|
+
export type DateRange = {
|
|
6
|
+
from?: string;
|
|
7
|
+
to?: string;
|
|
8
|
+
};
|
|
9
|
+
export type DateRangePresetKey = string;
|
|
10
|
+
export declare const convertDateRangePresetKey: (preset: DateRangePreset) => DateRangePresetKey;
|
|
11
|
+
export declare class BetweenDateFilterWithPreset extends BetweenDateFilter {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly fromValue?: (Date | Dayjs | string) | undefined;
|
|
14
|
+
readonly toValue?: (Date | Dayjs | string) | undefined;
|
|
15
|
+
presetKey?: DateRangePresetKey;
|
|
16
|
+
constructor(name: string, fromValue?: (Date | Dayjs | string) | undefined, toValue?: (Date | Dayjs | string) | undefined, preset?: DateRangePreset);
|
|
17
|
+
static createFromPresetKey(name: string, presetKey: DateRangePresetKey, candidatePresets: DateRangePreset[], timeZone: TimeZone): BetweenDateFilterWithPreset | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TimeZone } from "@g1cloud/open-bluesea-core";
|
|
2
|
+
import { Dayjs } from "dayjs";
|
|
3
|
+
import type { DateRange } from "./DateFilterModel.ts";
|
|
4
|
+
export type MomentType = 'TODAY' | 'THIS_WEEK' | 'THIS_MONTH' | 'THIS_YEAR' | 'LAST_HOURS' | 'LAST_DAYS' | 'DAYS_AGO' | 'WEEKS_AGO' | 'MONTHS_AGO' | 'YEARS_AGO';
|
|
5
|
+
export type MomentSetting = {
|
|
6
|
+
type: MomentType;
|
|
7
|
+
value?: number;
|
|
8
|
+
};
|
|
9
|
+
export type DateRangePreset = {
|
|
10
|
+
caption: string;
|
|
11
|
+
from?: MomentSetting;
|
|
12
|
+
to?: MomentSetting;
|
|
13
|
+
};
|
|
14
|
+
export declare const createDateRangeFromPreset: (value: DateRangePreset, timeZone: TimeZone) => DateRange;
|
|
15
|
+
export declare const resolveMoment: (setting: MomentSetting, from: boolean, timeZone: TimeZone, baseDate?: Dayjs) => Dayjs | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Column } from "./GridModel.ts";
|
|
2
|
+
import type { MenuItem } from "@g1cloud/open-bluesea-core";
|
|
3
|
+
export type GridExtensionContext = {
|
|
4
|
+
gridId?: string;
|
|
5
|
+
table?: HTMLTableElement;
|
|
6
|
+
};
|
|
7
|
+
export type GridContextMenuType = 'HeaderCell' | 'BodyCell';
|
|
8
|
+
export type GridContextMenuParam = {
|
|
9
|
+
type: GridContextMenuType;
|
|
10
|
+
column: Column;
|
|
11
|
+
row?: unknown;
|
|
12
|
+
cell?: unknown;
|
|
13
|
+
};
|
|
14
|
+
export type GridExtension = {
|
|
15
|
+
extendsContextMenu?: (event: MouseEvent, param: GridContextMenuParam, context: GridExtensionContext) => MenuItem[] | undefined;
|
|
16
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Column, GridColumnSetting } from "./GridModel";
|
|
2
|
+
import type { MenuItem } from "@g1cloud/open-bluesea-core";
|
|
3
|
+
import type { GridContextMenuParam } from "./GridExtension.ts";
|
|
4
|
+
export type ColumnRender = {
|
|
5
|
+
width: number;
|
|
6
|
+
fixed?: boolean;
|
|
7
|
+
hidden?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type InternalColumn = Column & {
|
|
10
|
+
templateId: string;
|
|
11
|
+
render: ColumnRender;
|
|
12
|
+
};
|
|
13
|
+
export declare const setFixedCellLeftStyle: (table?: HTMLTableElement | null) => Promise<void>;
|
|
14
|
+
export declare const styleCssToObject: (style?: string) => Record<string, string>;
|
|
15
|
+
export declare const styleClassToObject: (style?: string) => Record<string, boolean>;
|
|
16
|
+
export declare const filterSlotName: (column: Column) => string;
|
|
17
|
+
export declare const editComponentSlotName: (column: Column) => string;
|
|
18
|
+
export type GridExtensionHandler = {
|
|
19
|
+
handleExtendsContextMenu: (event: MouseEvent, param: GridContextMenuParam) => MenuItem[] | undefined;
|
|
20
|
+
};
|
|
21
|
+
export declare const mergeColumnSettings: (columns: Column[], settings: GridColumnSetting[]) => GridColumnSetting[];
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import type { SavePoint, DisplayDateResolution, KeyProvider, TimeZone, RawData } from "@g1cloud/open-bluesea-core";
|
|
2
|
+
import { SearchParam, type Sort } from "@/model/SearchModel";
|
|
3
|
+
import { PaginatedList } from "@/model/PaginatedList";
|
|
4
|
+
import { type Raw, type UnwrapNestedRefs } from "vue";
|
|
5
|
+
import { AndFilter, EqualFilter, type Filter, InFilter, LikeFilter, OrFilter } from "@/model/FilterModel";
|
|
6
|
+
export declare const DEFAULT_GRID_COLUMN_WIDTH = 100;
|
|
7
|
+
export type GridCellType = 'TEXT' | 'NUMBER' | 'DATE' | 'PERCENTAGE' | 'BOOL' | 'MULTI_LANG_STRING' | 'NAME' | 'TEL' | 'ADDRESS' | 'MONEY';
|
|
8
|
+
export type GridRowData = Record<string, any>;
|
|
9
|
+
export type Column<T extends GridRowData = GridRowData> = {
|
|
10
|
+
propertyId: string;
|
|
11
|
+
templateId?: string;
|
|
12
|
+
caption: string;
|
|
13
|
+
cellType?: GridCellType;
|
|
14
|
+
dateFormat?: string | DisplayDateResolution;
|
|
15
|
+
width?: number;
|
|
16
|
+
cellStyleClass?: string;
|
|
17
|
+
cellStyleCss?: string;
|
|
18
|
+
headerCellStyleClass?: string;
|
|
19
|
+
headerCellStyleCss?: string;
|
|
20
|
+
sortable?: boolean;
|
|
21
|
+
sortPropertyId?: string;
|
|
22
|
+
tooltipProvider?: (row: T) => string | undefined;
|
|
23
|
+
};
|
|
24
|
+
export type PageInfo = {
|
|
25
|
+
offset?: number;
|
|
26
|
+
limit?: number;
|
|
27
|
+
totalCount?: number;
|
|
28
|
+
};
|
|
29
|
+
export type FilterValueType = 'STRING' | 'NUMBER';
|
|
30
|
+
export type FilterItem = {
|
|
31
|
+
propertyId: string;
|
|
32
|
+
caption: string;
|
|
33
|
+
allowMultiLineFilter?: boolean;
|
|
34
|
+
filterType?: FilterValueType;
|
|
35
|
+
};
|
|
36
|
+
export type TextFilterCreator = (propertyId: string, keyword: string) => (InFilter | LikeFilter | EqualFilter | OrFilter)[] | Promise<(InFilter | LikeFilter | EqualFilter | OrFilter)[]>;
|
|
37
|
+
export type TextFilterItem = FilterItem & {
|
|
38
|
+
filterCreator?: TextFilterCreator;
|
|
39
|
+
prefix?: boolean;
|
|
40
|
+
suffix?: boolean;
|
|
41
|
+
};
|
|
42
|
+
export type GridLookupConfigTextFilter = {
|
|
43
|
+
filterItems: TextFilterItem[];
|
|
44
|
+
};
|
|
45
|
+
export type DateFilterItem = FilterItem & {
|
|
46
|
+
timeZone?: TimeZone;
|
|
47
|
+
dateFormat?: string;
|
|
48
|
+
popupDateFormat?: string;
|
|
49
|
+
filterWidth?: string;
|
|
50
|
+
};
|
|
51
|
+
export type GridLookupConfigDateFilter = {
|
|
52
|
+
filterItems: DateFilterItem[];
|
|
53
|
+
};
|
|
54
|
+
export type GridLookupConfig = {
|
|
55
|
+
textFilter?: GridLookupConfigTextFilter;
|
|
56
|
+
dateFilter?: GridLookupConfigDateFilter;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* BSGridLookup 에서 EmbeddableName property 에 사용할 수 있는 TextFilterCreator
|
|
60
|
+
*
|
|
61
|
+
* ```ts
|
|
62
|
+
* export const gridLookupConfig: GridLookupConfig = reactive({
|
|
63
|
+
* textFilter: {
|
|
64
|
+
* filterItems: [
|
|
65
|
+
* {propertyId: 'memberName', caption: '회원명', filterCreator: nameFilterCreator()}
|
|
66
|
+
* ]
|
|
67
|
+
* },
|
|
68
|
+
* ```
|
|
69
|
+
* @param maxIndex 예를 들어 이 값이 4 이면, name1, name2, name3, name4 에 대해 like 검색을 한다.
|
|
70
|
+
*/
|
|
71
|
+
export declare const nameFilterCreator: (maxIndex?: number) => TextFilterCreator;
|
|
72
|
+
export type EditingRow<T> = {
|
|
73
|
+
row: T;
|
|
74
|
+
savePoint?: SavePoint;
|
|
75
|
+
};
|
|
76
|
+
export declare class EditingRows<T> {
|
|
77
|
+
keyProvider?: KeyProvider<T> | undefined;
|
|
78
|
+
rows: EditingRow<T>[];
|
|
79
|
+
constructor(keyProvider?: KeyProvider<T> | undefined);
|
|
80
|
+
addEditingRow(row: EditingRow<T>): void;
|
|
81
|
+
addRow(row: T): void;
|
|
82
|
+
rowEquals(a: T, b: T): boolean;
|
|
83
|
+
removeRow(row: T): void;
|
|
84
|
+
clear(): void;
|
|
85
|
+
getEditingRow(row: T): EditingRow<T> | undefined;
|
|
86
|
+
isEditingRow(row: T): boolean;
|
|
87
|
+
getRows(): EditingRow<T>[];
|
|
88
|
+
getModifiedRows(): EditingRow<T>[];
|
|
89
|
+
}
|
|
90
|
+
export type SelectedRowsChangedEvent<T extends GridRowData> = {
|
|
91
|
+
allRows: boolean;
|
|
92
|
+
targetRows?: T[];
|
|
93
|
+
selected: boolean;
|
|
94
|
+
};
|
|
95
|
+
export interface PageGridHandler<T extends GridRowData> {
|
|
96
|
+
searchParam: SearchParam;
|
|
97
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
98
|
+
gridEventListener: GridEventListener<T>;
|
|
99
|
+
control?: UnwrapNestedRefs<GridControlBinding<T>>;
|
|
100
|
+
controlEventListener?: GridControlEventListener;
|
|
101
|
+
lookup?: UnwrapNestedRefs<GridLookupBinding>;
|
|
102
|
+
lookupEventListener?: GridLookupEventListener;
|
|
103
|
+
loadGridData: (offset?: number) => Promise<void>;
|
|
104
|
+
getSelectedRows: () => Set<T>;
|
|
105
|
+
getEditingRows: () => EditingRows<T>;
|
|
106
|
+
getAddedRows: () => T[];
|
|
107
|
+
getModifiedRows: () => T[];
|
|
108
|
+
getDeletedRows: () => T[];
|
|
109
|
+
isAddedRow: (row: T) => boolean;
|
|
110
|
+
addNewRow: (newRow: T) => number;
|
|
111
|
+
/**
|
|
112
|
+
* Grid 에 add, modified, delete 된 row 가 있으면 true 를 리턴한다.
|
|
113
|
+
*/
|
|
114
|
+
isGridModified: () => boolean;
|
|
115
|
+
preferenceLoaded: boolean;
|
|
116
|
+
}
|
|
117
|
+
export type GridBinding<T extends GridRowData> = {
|
|
118
|
+
gridId?: string;
|
|
119
|
+
pageInfo?: PageInfo;
|
|
120
|
+
sorts?: Sort[];
|
|
121
|
+
data: T[] | Raw<T[]>;
|
|
122
|
+
loading?: boolean;
|
|
123
|
+
keyProvider: KeyProvider<T>;
|
|
124
|
+
editable?: boolean;
|
|
125
|
+
rowEditPolicy?: (row: T, editingRows: EditingRows<T>) => boolean;
|
|
126
|
+
selectedRows?: Set<T>;
|
|
127
|
+
editingRows?: EditingRows<T>;
|
|
128
|
+
rowDisplayPolicy?: (row: T) => boolean;
|
|
129
|
+
rowSelectPolicy?: (row: T) => boolean;
|
|
130
|
+
columnSettings?: GridColumnSetting[];
|
|
131
|
+
fixedColumnCount?: number;
|
|
132
|
+
};
|
|
133
|
+
export type GridEventListener<T extends GridRowData> = {
|
|
134
|
+
'update:selectedRows'?: (rows: Set<T>) => void;
|
|
135
|
+
'update:editingRows'?: (editingRows: EditingRows<T>) => void;
|
|
136
|
+
offsetChanged?: (offset: number, pageInfo: PageInfo) => void;
|
|
137
|
+
changeEditingRow?: (row: T, editing: boolean) => void;
|
|
138
|
+
'update:sorts'?: (sorts: Sort[]) => void;
|
|
139
|
+
settingChanged?: (columnSettings?: GridColumnSetting[], fixedColumnCount?: number) => void;
|
|
140
|
+
};
|
|
141
|
+
export type GridControlBinding<T extends GridRowData> = {
|
|
142
|
+
gridId?: string;
|
|
143
|
+
limit?: number;
|
|
144
|
+
selectedRows?: Set<T>;
|
|
145
|
+
totalCount: number;
|
|
146
|
+
columnSettings?: GridColumnSetting[];
|
|
147
|
+
fixedColumnCount?: number;
|
|
148
|
+
};
|
|
149
|
+
export type GridControlEventListener = {
|
|
150
|
+
'update:limit'?: (limit: number) => void;
|
|
151
|
+
refresh?: () => void;
|
|
152
|
+
clearFilter?: () => void;
|
|
153
|
+
clickAdd?: () => void;
|
|
154
|
+
clickRemove?: () => void;
|
|
155
|
+
settingChanged?: (columnSettings?: GridColumnSetting[], fixedColumnCount?: number) => void;
|
|
156
|
+
};
|
|
157
|
+
export type GridLookupBinding = {
|
|
158
|
+
gridId?: string;
|
|
159
|
+
modelValue: Filter[];
|
|
160
|
+
gridPreferenceDateFilterValues?: RawData<AndFilter>;
|
|
161
|
+
};
|
|
162
|
+
export type GridLookupEventListener = {
|
|
163
|
+
'update:modelValue': (value: Filter[]) => void;
|
|
164
|
+
search: (filters: Filter[]) => void;
|
|
165
|
+
};
|
|
166
|
+
export type GridHandlerOption<T extends GridRowData> = {
|
|
167
|
+
/**
|
|
168
|
+
* Grid 설정 정보를 저장할 때 사용된다.
|
|
169
|
+
*/
|
|
170
|
+
gridId?: string;
|
|
171
|
+
/**
|
|
172
|
+
* 편집가능 여부
|
|
173
|
+
*/
|
|
174
|
+
editable?: boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Grid 에서 각 Row 를 구분할 수 있는 key 를 리턴한다. 주로 일련번호, 코드 등의 값이다.
|
|
177
|
+
* @param row
|
|
178
|
+
*/
|
|
179
|
+
getRowKey: (row: T) => string;
|
|
180
|
+
/**
|
|
181
|
+
* 새로운 Row 를 생성한다. '행 추가' 기능으로 행이 추가될 때 호출된다.
|
|
182
|
+
*/
|
|
183
|
+
newRowCreator?: () => T | undefined;
|
|
184
|
+
/**
|
|
185
|
+
* 이 값이 true 이면 행 추가 시 Grid data 마지막에 추가된다. 디폴트는 false 이다.
|
|
186
|
+
*/
|
|
187
|
+
addRowToLast?: boolean;
|
|
188
|
+
/**
|
|
189
|
+
* 행이 삭제될 때 호출되는 함수.
|
|
190
|
+
* 이 함수를 지정하지 않거나 false 를 리턴하면, grid data 목록에서 해당 행이 삭제된다.
|
|
191
|
+
* 이 함수가 true 를 리턴하면 GridHandler 는 아무런 작업도 하지 않는다.
|
|
192
|
+
* @param rows 선택된 행
|
|
193
|
+
* @return 이 handler 에서 행 삭제를 처리했으면 true 를 리턴. 그렇지 않으면 false 를 리턴.
|
|
194
|
+
*/
|
|
195
|
+
removeRowHandler?: (rows: Set<T>) => boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Row 가 편집가능한지 여부를 리턴한다.
|
|
198
|
+
* Row 별로 편집가능여부를 제어할 때 사용.
|
|
199
|
+
* @param row 편집이 가능한지 확인하려는 Row
|
|
200
|
+
* @param editingRows 현재 편집중인 Row
|
|
201
|
+
*/
|
|
202
|
+
isRowEditable?: (row: T, editingRows: EditingRows<T>) => boolean;
|
|
203
|
+
/**
|
|
204
|
+
* Row 가 선택 가능한지 여부를 리턴한다.
|
|
205
|
+
* Row 별로 선택가능여부를 제어할 때 사용.
|
|
206
|
+
* @param row
|
|
207
|
+
*/
|
|
208
|
+
isRowSelectable?: (row: T) => boolean;
|
|
209
|
+
};
|
|
210
|
+
export type PageGridHandlerOption<T extends GridRowData> = GridHandlerOption<T> & {
|
|
211
|
+
getGridData: (param: SearchParam) => PaginatedList<T> | Promise<PaginatedList<T>>;
|
|
212
|
+
/**
|
|
213
|
+
* 초기 Limit 개수. 디폴트: 100
|
|
214
|
+
*/
|
|
215
|
+
limit?: number;
|
|
216
|
+
/**
|
|
217
|
+
* Limit 목록. 디폴트: [100, 300, 500]
|
|
218
|
+
*/
|
|
219
|
+
limitItems?: number[];
|
|
220
|
+
defaultFilter?: Filter[];
|
|
221
|
+
defaultSorts?: Sort[];
|
|
222
|
+
};
|
|
223
|
+
export declare const createPageGridHandler: <T extends GridRowData>(option: PageGridHandlerOption<T>) => PageGridHandler<T>;
|
|
224
|
+
export declare class PageGridHandlerImpl<T extends GridRowData> implements PageGridHandler<T> {
|
|
225
|
+
option: PageGridHandlerOption<T>;
|
|
226
|
+
searchParam: SearchParam;
|
|
227
|
+
selectDeleteSupport: GridHandlerSelectDeleteSupport<T>;
|
|
228
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
229
|
+
gridEventListener: GridEventListener<T>;
|
|
230
|
+
control: UnwrapNestedRefs<GridControlBinding<T>>;
|
|
231
|
+
controlEventListener: GridControlEventListener;
|
|
232
|
+
lookup: GridLookupBinding;
|
|
233
|
+
lookupEventListener: GridLookupEventListener;
|
|
234
|
+
preferenceLoader?: GridPreferenceLoader;
|
|
235
|
+
constructor(option: PageGridHandlerOption<T>);
|
|
236
|
+
get preferenceLoaded(): boolean;
|
|
237
|
+
getSelectedRows(): Set<T>;
|
|
238
|
+
getEditingRows(): EditingRows<T>;
|
|
239
|
+
getAddedRows(): T[];
|
|
240
|
+
getModifiedRows(): T[];
|
|
241
|
+
getDeletedRows(): T[];
|
|
242
|
+
isAddedRow(_row: T): boolean;
|
|
243
|
+
addNewRow(_newRow: T): number;
|
|
244
|
+
isGridModified(): boolean;
|
|
245
|
+
/**
|
|
246
|
+
*
|
|
247
|
+
* @param offset
|
|
248
|
+
*/
|
|
249
|
+
loadGridData(offset?: number): Promise<void>;
|
|
250
|
+
loadPreference(): void;
|
|
251
|
+
protected doSetSearchResult(result: PaginatedList<T>): void;
|
|
252
|
+
protected updateCounts(): void;
|
|
253
|
+
}
|
|
254
|
+
export declare class EditablePageGridHandlerImpl<T extends GridRowData> extends PageGridHandlerImpl<T> {
|
|
255
|
+
editableSupport: GridHandlerEditableSupport<T>;
|
|
256
|
+
constructor(option: PageGridHandlerOption<T>);
|
|
257
|
+
getModifiedRows(): T[];
|
|
258
|
+
getAddedRows(): T[];
|
|
259
|
+
isAddedRow(row: T): boolean;
|
|
260
|
+
addNewRow(newRow: T): number;
|
|
261
|
+
protected doSetSearchResult(result: PaginatedList<T>): void;
|
|
262
|
+
}
|
|
263
|
+
export interface InputGridHandler<T extends GridRowData> {
|
|
264
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
265
|
+
gridEventListener: GridEventListener<T>;
|
|
266
|
+
control: UnwrapNestedRefs<GridControlBinding<T>>;
|
|
267
|
+
controlEventListener: GridControlEventListener;
|
|
268
|
+
gridFilter: Record<string, any>;
|
|
269
|
+
setGridData: (data?: T[]) => void;
|
|
270
|
+
getSelectedRows: () => Set<T>;
|
|
271
|
+
getEditingRows: () => EditingRows<T>;
|
|
272
|
+
getAddedRows: () => T[];
|
|
273
|
+
getModifiedRows: () => T[];
|
|
274
|
+
getDeletedRows: () => T[];
|
|
275
|
+
isAddedRow: (row: T) => boolean;
|
|
276
|
+
addNewRow: (newRow: T) => number;
|
|
277
|
+
/**
|
|
278
|
+
* Grid 에 add, modified, delete 된 row 가 있으면 true 를 리턴한다.
|
|
279
|
+
*/
|
|
280
|
+
isGridModified: () => boolean;
|
|
281
|
+
preferenceLoaded: boolean;
|
|
282
|
+
}
|
|
283
|
+
export type InputGridHandlerOption<T extends GridRowData> = GridHandlerOption<T> & {};
|
|
284
|
+
export declare const createInputGridHandler: <T extends GridRowData>(option: InputGridHandlerOption<T>) => InputGridHandler<T>;
|
|
285
|
+
export declare class InputGridHandlerImpl<T extends GridRowData> implements InputGridHandler<T> {
|
|
286
|
+
option: InputGridHandlerOption<T>;
|
|
287
|
+
selectDeleteSupport: GridHandlerSelectDeleteSupport<T>;
|
|
288
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
289
|
+
gridEventListener: GridEventListener<T>;
|
|
290
|
+
control: UnwrapNestedRefs<GridControlBinding<T>>;
|
|
291
|
+
controlEventListener: GridControlEventListener;
|
|
292
|
+
gridFilter: Record<string, any>;
|
|
293
|
+
preferenceLoader?: GridPreferenceLoader;
|
|
294
|
+
constructor(option: InputGridHandlerOption<T>);
|
|
295
|
+
get preferenceLoaded(): boolean;
|
|
296
|
+
setGridData(data?: T[]): void;
|
|
297
|
+
getSelectedRows(): Set<T>;
|
|
298
|
+
getEditingRows(): EditingRows<T>;
|
|
299
|
+
getDeletedRows(): T[];
|
|
300
|
+
getAddedRows(): T[];
|
|
301
|
+
getModifiedRows(): T[];
|
|
302
|
+
isAddedRow(_row: T): boolean;
|
|
303
|
+
addNewRow(_newRow: T): number;
|
|
304
|
+
isGridModified(): boolean;
|
|
305
|
+
loadPreference(): void;
|
|
306
|
+
protected updateCounts(): void;
|
|
307
|
+
protected applyGridFilter(row: T): boolean;
|
|
308
|
+
}
|
|
309
|
+
export declare class EditableInputGridHandlerImpl<T extends GridRowData> extends InputGridHandlerImpl<T> {
|
|
310
|
+
editableSupport: GridHandlerEditableSupport<T>;
|
|
311
|
+
constructor(option: InputGridHandlerOption<T>);
|
|
312
|
+
setGridData(data: T[]): void;
|
|
313
|
+
getModifiedRows(): T[];
|
|
314
|
+
getAddedRows(): T[];
|
|
315
|
+
isAddedRow(row: T): boolean;
|
|
316
|
+
addNewRow(newRow: T): number;
|
|
317
|
+
}
|
|
318
|
+
export declare class GridHandlerSelectDeleteSupport<T extends GridRowData> {
|
|
319
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
320
|
+
control: UnwrapNestedRefs<GridControlBinding<T>>;
|
|
321
|
+
controlEventListener: GridControlEventListener;
|
|
322
|
+
removeRowHandler?: ((rows: Set<T>) => boolean) | undefined;
|
|
323
|
+
private listener?;
|
|
324
|
+
selectedRows: import("vue").Reactive<Set<T>>;
|
|
325
|
+
deletedRows: T[];
|
|
326
|
+
isAddedRow?: (row: T) => boolean;
|
|
327
|
+
removeIfAddedRow?: (row: T) => void;
|
|
328
|
+
constructor(grid: UnwrapNestedRefs<GridBinding<T>>, control: UnwrapNestedRefs<GridControlBinding<T>>, controlEventListener: GridControlEventListener, removeRowHandler?: ((rows: Set<T>) => boolean) | undefined, listener?: ((eventType: "selectedRowsChanged") => void) | undefined);
|
|
329
|
+
removeSelectedRows(): void;
|
|
330
|
+
clear(): void;
|
|
331
|
+
}
|
|
332
|
+
export declare class GridHandlerEditableSupport<T extends GridRowData> {
|
|
333
|
+
grid: UnwrapNestedRefs<GridBinding<T>>;
|
|
334
|
+
gridEventListener: GridEventListener<T>;
|
|
335
|
+
controlEventListener: GridControlEventListener;
|
|
336
|
+
newRowCreator?: (() => T | undefined) | undefined;
|
|
337
|
+
addRowToLast?: boolean | undefined;
|
|
338
|
+
private listener?;
|
|
339
|
+
addedRows: T[];
|
|
340
|
+
constructor(grid: UnwrapNestedRefs<GridBinding<T>>, gridEventListener: GridEventListener<T>, controlEventListener: GridControlEventListener, getRowKey: KeyProvider<T>, newRowCreator?: (() => T | undefined) | undefined, addRowToLast?: boolean | undefined, listener?: ((eventType: "rowAdded" | "rowRemoved") => void) | undefined);
|
|
341
|
+
static cleanUpData<T extends GridRowData>(data: T[]): void;
|
|
342
|
+
getModifiedRows(): T[];
|
|
343
|
+
getAddedRows(): T[];
|
|
344
|
+
clearAddedRows(): void;
|
|
345
|
+
isAddedRow(row: T): boolean;
|
|
346
|
+
getNewRowKey(row: T): string | undefined;
|
|
347
|
+
setNewRowKey(row: T): void;
|
|
348
|
+
removeIfAddedRow(row: T): boolean;
|
|
349
|
+
addNewRow(newRow: T): number;
|
|
350
|
+
protected appendAddedRow(row: T): void;
|
|
351
|
+
protected createAndAddNewRow(): void;
|
|
352
|
+
}
|
|
353
|
+
declare class GridPreferenceLoader {
|
|
354
|
+
private gridId;
|
|
355
|
+
private handler;
|
|
356
|
+
preferenceLoaded: import("vue").Ref<boolean, boolean>;
|
|
357
|
+
private loadPromise;
|
|
358
|
+
constructor(gridId: string, handler: PageGridHandler<any> | InputGridHandler<any>);
|
|
359
|
+
loadGridPreference(): Promise<void>;
|
|
360
|
+
waitForLoaded(): Promise<void>;
|
|
361
|
+
}
|
|
362
|
+
export type GridColumnSetting = {
|
|
363
|
+
propertyId: string;
|
|
364
|
+
hidden?: boolean;
|
|
365
|
+
width?: number;
|
|
366
|
+
};
|
|
367
|
+
export type GridPreference = {
|
|
368
|
+
columnSettings?: GridColumnSetting[];
|
|
369
|
+
fixedColumnCount?: number;
|
|
370
|
+
dateFilterValues?: RawData<AndFilter>;
|
|
371
|
+
};
|
|
372
|
+
export interface GridPreferenceStore {
|
|
373
|
+
storePreference: (gridId: string, preference: GridPreference) => Promise<void>;
|
|
374
|
+
loadPreference: (gridId: string) => Promise<GridPreference | undefined>;
|
|
375
|
+
removePreference: (gridId: string) => Promise<void>;
|
|
376
|
+
}
|
|
377
|
+
export declare class LocalStorageGridPreferenceStore implements GridPreferenceStore {
|
|
378
|
+
storePreference(gridId: string, preference: GridPreference): Promise<void>;
|
|
379
|
+
loadPreference(gridId: string): Promise<any>;
|
|
380
|
+
removePreference(gridId: string): Promise<void>;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* BSGrid 에서 값이 같은 cell 을 세로로 머지한다.
|
|
384
|
+
*
|
|
385
|
+
* @table-changed 이벤트 핸들러에서 이 함수를 호출하는 방식으로 사용함.
|
|
386
|
+
*
|
|
387
|
+
* ```
|
|
388
|
+
* <BSGrid ...
|
|
389
|
+
* @table-changed="table => mergeSameValueVertical(['supplierCode'], table)">
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* @param propertyIds
|
|
393
|
+
* @param table
|
|
394
|
+
*/
|
|
395
|
+
export declare const mergeSameValueVertical: (propertyIds: string[], table?: HTMLTableElement) => void;
|
|
396
|
+
/**
|
|
397
|
+
* default cell formatter for BSGridCell
|
|
398
|
+
* @param column
|
|
399
|
+
* @param value
|
|
400
|
+
*/
|
|
401
|
+
export declare const defaultCellFormatter: <T>(column: Column, value: T) => string | T | null;
|
|
402
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DirectiveBinding } from "vue";
|
|
2
|
+
export type DndContext = {
|
|
3
|
+
sourceElement: HTMLElement;
|
|
4
|
+
key?: unknown;
|
|
5
|
+
sourceType?: string;
|
|
6
|
+
dropPosition?: HTMLElement;
|
|
7
|
+
};
|
|
8
|
+
export type KeyProvider = (sourceElement: HTMLElement) => unknown;
|
|
9
|
+
export type CreateDropPosition = (dndContext: DndContext, target: HTMLElement, direction: 'horizontal' | 'vertical') => HTMLElement;
|
|
10
|
+
export type LocateDropPosition = (dndContext: DndContext, target: HTMLElement, dropPosition: HTMLElement, beforeOrAfter: 'before' | 'after', direction: 'horizontal' | 'vertical') => void;
|
|
11
|
+
export type DropHandler = (dndContext: DndContext, target: HTMLElement, beforeOrAfter: 'before' | 'after') => void;
|
|
12
|
+
export declare const vDragSupport: {
|
|
13
|
+
mounted: (el: HTMLElement, binding: DirectiveBinding) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare const vDropSupport: {
|
|
16
|
+
mounted: (el: HTMLElement, binding: DirectiveBinding) => void;
|
|
17
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export { default as BSGrid } from './component/BSGrid.vue';
|
|
2
|
+
export { default as BSGridCell } from './component/BSGridCell.vue';
|
|
3
|
+
export { default as BSGridCellCheckbox } from './component/BSGridCellCheckbox.vue';
|
|
4
|
+
export { default as BSGridCellDragHandle } from './component/BSGridCellDragHandle.vue';
|
|
5
|
+
export { default as BSGridCellEdit } from './component/BSGridCellEdit.vue';
|
|
6
|
+
export { default as BSGridCellSerialNo } from './component/BSGridCellSerialNo.vue';
|
|
7
|
+
export { default as BSGridColumnSettingModal } from './component/BSGridColumnSettingModal.vue';
|
|
8
|
+
export { default as BSGridControl } from './component/BSGridControl.vue';
|
|
9
|
+
export { default as BSGridHeaderCell } from './component/BSGridHeaderCell.vue';
|
|
10
|
+
export { default as BSGridHeaderCellCheckbox } from './component/BSGridHeaderCellCheckbox.vue';
|
|
11
|
+
export { default as BSGridHeaderCellResizeHandle } from './component/BSGridHeaderCellResizeHandle.vue';
|
|
12
|
+
export { default as BSGridHeaderCellSerialNo } from './component/BSGridHeaderCellSerialNo.vue';
|
|
13
|
+
export { default as BSGridLookup } from './component/BSGridLookup.vue';
|
|
14
|
+
export { default as BSGridRow } from './component/BSGridRow.vue';
|
|
15
|
+
export { default as BSTextFilter } from './component/BSTextFilter.vue';
|
|
16
|
+
export { default as BSDateRangeFilter } from './component/BSDateRangeFilter.vue';
|
|
17
|
+
export { default as BSDateRangeFilters } from './component/BSDateRangeFilters.vue';
|
|
18
|
+
export { default as BSDateRangePresets } from './component/BSDateRangePresets.vue';
|
|
19
|
+
export { vDragSupport, vDropSupport } from './component/vDndSupport';
|
|
20
|
+
export type * from './component/vDndSupport';
|
|
21
|
+
export * from './component/GridModel';
|
|
22
|
+
export type * from './component/GridModel';
|
|
23
|
+
export * from './component/GridLib';
|
|
24
|
+
export * from './component/GridExtension';
|
|
25
|
+
export * from './component/DateFilterModel';
|
|
26
|
+
export type * from './component/DateFilterModel';
|
|
27
|
+
export * from './component/DateRangePresetModel';
|
|
28
|
+
export type * from './component/DateRangePresetModel';
|
|
29
|
+
export * from './model/FilterModel';
|
|
30
|
+
export type * from './model/FilterModel';
|
|
31
|
+
export * from './model/PaginatedList';
|
|
32
|
+
export type * from './model/PaginatedList';
|
|
33
|
+
export * from './model/SearchModel';
|
|
34
|
+
export type * from './model/SearchModel';
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Dayjs } from "dayjs";
|
|
2
|
+
export type FilterType = 'AND' | 'OR' | 'IN' | 'BT_V' | 'BT_D' | 'EQ' | 'NOT' | 'LIKE' | 'NU' | 'NN';
|
|
3
|
+
export interface Filter {
|
|
4
|
+
serialize(): unknown[] | undefined;
|
|
5
|
+
isEmpty(): boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface LeafFilter {
|
|
8
|
+
getFilterValueString(): string | string[];
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class AbstractFilter implements Filter {
|
|
11
|
+
protected type: FilterType;
|
|
12
|
+
protected constructor(type: FilterType);
|
|
13
|
+
serialize(): unknown[] | undefined;
|
|
14
|
+
isEmpty(): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class AndFilter extends AbstractFilter {
|
|
17
|
+
readonly filters: Filter[];
|
|
18
|
+
constructor(filters: Filter[]);
|
|
19
|
+
toString(): string;
|
|
20
|
+
serialize(): unknown[] | undefined;
|
|
21
|
+
isEmpty(): boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class OrFilter extends AbstractFilter {
|
|
24
|
+
readonly filters: Filter[];
|
|
25
|
+
constructor(filters: Filter[]);
|
|
26
|
+
toString(): string;
|
|
27
|
+
serialize(): unknown[] | undefined;
|
|
28
|
+
isEmpty(): boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class NotFilter extends AbstractFilter {
|
|
31
|
+
readonly filter: Filter;
|
|
32
|
+
constructor(filter: Filter);
|
|
33
|
+
toString(): string;
|
|
34
|
+
serialize(): unknown[] | undefined;
|
|
35
|
+
isEmpty(): boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare class InFilter extends AbstractFilter implements LeafFilter {
|
|
38
|
+
readonly names: string[];
|
|
39
|
+
readonly values: (string | number)[];
|
|
40
|
+
readonly ignoreCase?: boolean | undefined;
|
|
41
|
+
constructor(names: string[], values: (string | number)[], ignoreCase?: boolean | undefined);
|
|
42
|
+
toString(): string;
|
|
43
|
+
serialize(): unknown[] | undefined;
|
|
44
|
+
getFilterValueString(): string | string[];
|
|
45
|
+
isEmpty(): boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare class LikeFilter extends AbstractFilter implements LeafFilter {
|
|
48
|
+
readonly names: string[];
|
|
49
|
+
readonly value: string;
|
|
50
|
+
readonly prefix?: boolean | undefined;
|
|
51
|
+
readonly suffix?: boolean | undefined;
|
|
52
|
+
readonly ignoreCase: boolean;
|
|
53
|
+
constructor(names: string[], value: string, prefix?: boolean | undefined, suffix?: boolean | undefined, ignoreCase?: boolean);
|
|
54
|
+
toString(): string;
|
|
55
|
+
serialize(): unknown[] | undefined;
|
|
56
|
+
getFilterValueString(): string | string[];
|
|
57
|
+
isEmpty(): boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare class EqualFilter extends AbstractFilter implements LeafFilter {
|
|
60
|
+
readonly names: string[];
|
|
61
|
+
readonly value: string | number | boolean;
|
|
62
|
+
readonly ignoreCase?: boolean | undefined;
|
|
63
|
+
constructor(names: string[], value: string | number | boolean, ignoreCase?: boolean | undefined);
|
|
64
|
+
toString(): string;
|
|
65
|
+
serialize(): unknown[] | undefined;
|
|
66
|
+
getFilterValueString(): string | string[];
|
|
67
|
+
isEmpty(): boolean;
|
|
68
|
+
}
|
|
69
|
+
export declare class BetweenFilter extends AbstractFilter {
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly fromValue?: string | number | undefined;
|
|
72
|
+
readonly toValue?: string | number | undefined;
|
|
73
|
+
constructor(name: string, fromValue?: string | number | undefined, toValue?: string | number | undefined);
|
|
74
|
+
toString(): string;
|
|
75
|
+
serialize(): unknown[] | undefined;
|
|
76
|
+
isEmpty(): boolean;
|
|
77
|
+
}
|
|
78
|
+
export declare class BetweenDateFilter extends AbstractFilter {
|
|
79
|
+
readonly name: string;
|
|
80
|
+
readonly fromValue?: (Date | Dayjs | string) | undefined;
|
|
81
|
+
readonly toValue?: (Date | Dayjs | string) | undefined;
|
|
82
|
+
constructor(name: string, fromValue?: (Date | Dayjs | string) | undefined, toValue?: (Date | Dayjs | string) | undefined);
|
|
83
|
+
toString(): string;
|
|
84
|
+
serialize(): unknown[] | undefined;
|
|
85
|
+
isEmpty(): boolean;
|
|
86
|
+
}
|
|
87
|
+
export declare class IsNullFilter extends AbstractFilter implements LeafFilter {
|
|
88
|
+
readonly names: string[];
|
|
89
|
+
constructor(names: string[]);
|
|
90
|
+
toString(): string;
|
|
91
|
+
serialize(): unknown[] | undefined;
|
|
92
|
+
getFilterValueString(): string | string[];
|
|
93
|
+
isEmpty(): boolean;
|
|
94
|
+
}
|
|
95
|
+
export declare class IsNotNullFilter extends AbstractFilter implements LeafFilter {
|
|
96
|
+
readonly names: string[];
|
|
97
|
+
constructor(names: string[]);
|
|
98
|
+
toString(): string;
|
|
99
|
+
serialize(): unknown[] | undefined;
|
|
100
|
+
getFilterValueString(): string | string[];
|
|
101
|
+
isEmpty(): boolean;
|
|
102
|
+
}
|
|
103
|
+
export declare const andFilter: (filters: Filter[]) => AndFilter;
|
|
104
|
+
export declare const orFilter: (filters: Filter[]) => OrFilter;
|
|
105
|
+
export declare const notFilter: (filter: Filter) => NotFilter;
|
|
106
|
+
export declare const inFilter: (names: string[], values: (string | number)[], ignoreCase?: boolean) => InFilter;
|
|
107
|
+
export declare const likeFilter: (names: string[], value: string, prefix?: boolean, suffix?: boolean, ignoreCase?: boolean) => LikeFilter;
|
|
108
|
+
export declare const equalFilter: (names: string[], value: string | number | boolean, ignoreCase?: boolean) => EqualFilter;
|
|
109
|
+
export declare const betweenFilter: (name: string, fromValue?: string | number, toValue?: string | number) => BetweenFilter;
|
|
110
|
+
export declare const betweenDateFilter: (name: string, fromValue?: Date | Dayjs | string, toValue?: Date | Dayjs | string) => BetweenDateFilter;
|
|
111
|
+
export declare const isNullFilter: (names: string[]) => IsNullFilter;
|
|
112
|
+
export declare const isNotNullFilter: (names: string[]) => IsNotNullFilter;
|
|
113
|
+
export declare const acceptFilter: (filter: Filter, visit: (filter: Filter) => boolean | undefined) => void;
|