@operato/data-grist 8.0.0-beta.0 → 8.0.0-beta.2
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/CHANGELOG.md +18 -0
- package/package.json +10 -10
- package/.storybook/main.js +0 -3
- package/.storybook/preview.js +0 -52
- package/.storybook/server.mjs +0 -8
- package/demo/data-grist-test.html +0 -468
- package/demo/favicon.ico +0 -0
- package/demo/index.html +0 -541
- package/demo/report-test.html +0 -249
- package/src/accumulator/accumulator.ts +0 -63
- package/src/configure/column-builder.ts +0 -114
- package/src/configure/config-builder.ts +0 -40
- package/src/configure/filters-option-builder.ts +0 -8
- package/src/configure/imex-option-builder.ts +0 -5
- package/src/configure/list-option-builder.ts +0 -9
- package/src/configure/rows-option-builder.ts +0 -38
- package/src/configure/tree-option-builder.ts +0 -22
- package/src/configure/zero-config.ts +0 -83
- package/src/const.ts +0 -1
- package/src/data-card/data-card-field.ts +0 -94
- package/src/data-card/data-card-gutter-menu.ts +0 -94
- package/src/data-card/data-card-gutter.ts +0 -103
- package/src/data-card/data-card.ts +0 -154
- package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
- package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
- package/src/data-card/record-card.ts +0 -298
- package/src/data-consumer.ts +0 -11
- package/src/data-grid/data-grid-accum-field.ts +0 -109
- package/src/data-grid/data-grid-body-style.ts +0 -85
- package/src/data-grid/data-grid-body.ts +0 -765
- package/src/data-grid/data-grid-field.ts +0 -227
- package/src/data-grid/data-grid-footer.ts +0 -119
- package/src/data-grid/data-grid-header.ts +0 -578
- package/src/data-grid/data-grid.ts +0 -293
- package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
- package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
- package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
- package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
- package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
- package/src/data-grist.ts +0 -1233
- package/src/data-list/data-list-field.ts +0 -82
- package/src/data-list/data-list-gutter.ts +0 -108
- package/src/data-list/data-list.ts +0 -145
- package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
- package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
- package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
- package/src/data-list/record-partial.ts +0 -264
- package/src/data-manipulator.ts +0 -426
- package/src/data-provider.ts +0 -271
- package/src/data-report/data-report-body-style.ts +0 -58
- package/src/data-report/data-report-body.ts +0 -189
- package/src/data-report/data-report-component.ts +0 -138
- package/src/data-report/data-report-field.ts +0 -83
- package/src/data-report/data-report-header.ts +0 -242
- package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
- package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
- package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
- package/src/data-report.ts +0 -424
- package/src/editors/index.ts +0 -4
- package/src/editors/ox-grist-editor-checkbox.ts +0 -28
- package/src/editors/ox-grist-editor-color.ts +0 -10
- package/src/editors/ox-grist-editor-date.ts +0 -10
- package/src/editors/ox-grist-editor-datetime.ts +0 -27
- package/src/editors/ox-grist-editor-email.ts +0 -10
- package/src/editors/ox-grist-editor-file.ts +0 -28
- package/src/editors/ox-grist-editor-image.ts +0 -31
- package/src/editors/ox-grist-editor-month.ts +0 -10
- package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
- package/src/editors/ox-grist-editor-number.ts +0 -27
- package/src/editors/ox-grist-editor-password.ts +0 -10
- package/src/editors/ox-grist-editor-select.ts +0 -55
- package/src/editors/ox-grist-editor-tel.ts +0 -10
- package/src/editors/ox-grist-editor-text.ts +0 -14
- package/src/editors/ox-grist-editor-textarea.ts +0 -16
- package/src/editors/ox-grist-editor-time.ts +0 -10
- package/src/editors/ox-grist-editor-tree.ts +0 -27
- package/src/editors/ox-grist-editor-varname.ts +0 -36
- package/src/editors/ox-grist-editor-week.ts +0 -10
- package/src/editors/ox-grist-editor.ts +0 -207
- package/src/editors/ox-input-tree.ts +0 -226
- package/src/editors/registry.ts +0 -82
- package/src/empty-note.ts +0 -46
- package/src/filters/filter-checkbox.ts +0 -49
- package/src/filters/filter-input-barcode.ts +0 -34
- package/src/filters/filter-input.ts +0 -30
- package/src/filters/filter-range-date.ts +0 -81
- package/src/filters/filter-range-number.ts +0 -64
- package/src/filters/filter-select-buttons.ts +0 -60
- package/src/filters/filter-select.ts +0 -68
- package/src/filters/filter-styles.ts +0 -119
- package/src/filters/filters-form.ts +0 -476
- package/src/filters/index.ts +0 -10
- package/src/filters/registry.ts +0 -56
- package/src/formatters/date-formatter.ts +0 -3
- package/src/formatters/index.ts +0 -1
- package/src/formatters/number-formatter.ts +0 -3
- package/src/formatters/registry.ts +0 -30
- package/src/formatters/text-formatter.ts +0 -3
- package/src/gutters/gutter-button.ts +0 -51
- package/src/gutters/gutter-dirty.ts +0 -96
- package/src/gutters/gutter-row-selector.ts +0 -89
- package/src/gutters/gutter-sequence.ts +0 -54
- package/src/gutters/index.ts +0 -1
- package/src/gutters/registry.ts +0 -32
- package/src/handlers/contextmenu-tree-mutation.ts +0 -80
- package/src/handlers/index.ts +0 -1
- package/src/handlers/move-down.ts +0 -44
- package/src/handlers/move-up.ts +0 -44
- package/src/handlers/record-copy.ts +0 -38
- package/src/handlers/record-delete.ts +0 -30
- package/src/handlers/record-view-handler.ts +0 -27
- package/src/handlers/registry.ts +0 -42
- package/src/handlers/select-row-toggle.ts +0 -30
- package/src/handlers/select-row.ts +0 -27
- package/src/index.ts +0 -17
- package/src/personalizer/index.ts +0 -1
- package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
- package/src/personalizer/ox-grist-personalizer.ts +0 -226
- package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
- package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
- package/src/record-view/index.ts +0 -2
- package/src/record-view/ox-record-creator.ts +0 -289
- package/src/record-view/record-view-body.ts +0 -257
- package/src/record-view/record-view-handler.ts +0 -86
- package/src/record-view/record-view.ts +0 -122
- package/src/renderers/index.ts +0 -14
- package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
- package/src/renderers/ox-grist-renderer-color.ts +0 -15
- package/src/renderers/ox-grist-renderer-date.ts +0 -62
- package/src/renderers/ox-grist-renderer-file.ts +0 -31
- package/src/renderers/ox-grist-renderer-image.ts +0 -27
- package/src/renderers/ox-grist-renderer-json5.ts +0 -36
- package/src/renderers/ox-grist-renderer-link.ts +0 -17
- package/src/renderers/ox-grist-renderer-password.ts +0 -7
- package/src/renderers/ox-grist-renderer-progress.ts +0 -45
- package/src/renderers/ox-grist-renderer-select.ts +0 -58
- package/src/renderers/ox-grist-renderer-text.ts +0 -16
- package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
- package/src/renderers/ox-grist-renderer-tree.ts +0 -189
- package/src/renderers/ox-grist-renderer.ts +0 -35
- package/src/renderers/registry.ts +0 -111
- package/src/sorters/sorters-control.ts +0 -143
- package/src/types.ts +0 -813
- package/src/utils/index.ts +0 -2
- package/src/utils/list-param.ts +0 -72
- package/src/utils/supports-passive.ts +0 -13
- package/stories/accumulator-format.stories.ts +0 -276
- package/stories/barcode-input-filter.stories.ts +0 -216
- package/stories/bounded-select-filters.stories.ts +0 -333
- package/stories/bounded-select-record.stories.ts +0 -336
- package/stories/click-event-custom.stories.ts +0 -287
- package/stories/click-event.stories.ts +0 -283
- package/stories/creatable-only-column.stories.ts +0 -253
- package/stories/default-filters.stories.ts +0 -241
- package/stories/dynamic-editable.stories.ts +0 -313
- package/stories/empty-sorters.stories.ts +0 -180
- package/stories/explicit-fetch.stories.ts +0 -186
- package/stories/fixed-column.stories.ts +0 -416
- package/stories/grid-setting.stories.ts +0 -501
- package/stories/grist-modes.stories.ts +0 -451
- package/stories/group-header.stories.ts +0 -442
- package/stories/record-view.stories.ts +0 -143
- package/stories/textarea.stories.ts +0 -261
- package/stories/tree-column-with-checkbox.stories.ts +0 -297
- package/stories/tree-column.stories.ts +0 -296
- package/tsconfig.json +0 -26
- package/web-dev-server.config.mjs +0 -27
- package/web-test-runner.config.mjs +0 -45
package/src/filters/registry.ts
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
import { FilterSelectRenderer } from '../types.js'
|
2
|
-
import { FilterCheckbox } from './filter-checkbox.js'
|
3
|
-
import { FilterInputBarcode } from './filter-input-barcode.js'
|
4
|
-
import { FilterInput } from './filter-input.js'
|
5
|
-
import { FilterRangeDate } from './filter-range-date.js'
|
6
|
-
import { FilterRangeNumber } from './filter-range-number.js'
|
7
|
-
import { FilterSelectButtons } from './filter-select-buttons.js'
|
8
|
-
import { FilterSelect } from './filter-select.js'
|
9
|
-
|
10
|
-
var RENDERERS: {
|
11
|
-
[name: string]: FilterSelectRenderer[]
|
12
|
-
} = {
|
13
|
-
string: [FilterInput],
|
14
|
-
text: [FilterInput],
|
15
|
-
email: [FilterInput],
|
16
|
-
tel: [FilterInput],
|
17
|
-
integer: [FilterInput, FilterRangeNumber],
|
18
|
-
float: [FilterInput, FilterRangeNumber],
|
19
|
-
number: [FilterInput, FilterRangeNumber],
|
20
|
-
select: [FilterSelect],
|
21
|
-
'select-buttons': [FilterSelectButtons],
|
22
|
-
boolean: [FilterCheckbox],
|
23
|
-
checkbox: [FilterCheckbox],
|
24
|
-
month: [FilterInput, FilterRangeDate],
|
25
|
-
week: [FilterInput, FilterRangeDate],
|
26
|
-
date: [FilterInput, FilterRangeDate],
|
27
|
-
time: [FilterInput, FilterRangeDate],
|
28
|
-
datetime: [FilterInput, FilterRangeDate],
|
29
|
-
color: [FilterInput],
|
30
|
-
progress: [FilterInput, FilterRangeNumber],
|
31
|
-
link: [FilterInput],
|
32
|
-
image: [FilterInput],
|
33
|
-
json5: [FilterInput],
|
34
|
-
scanner: [FilterInputBarcode],
|
35
|
-
barcode: [FilterInputBarcode]
|
36
|
-
}
|
37
|
-
|
38
|
-
export function registerFilterRenderer(type: string, renderer: FilterSelectRenderer[]) {
|
39
|
-
RENDERERS[type] = renderer
|
40
|
-
}
|
41
|
-
|
42
|
-
export function unregisterFilterRenderer(type: string): void {
|
43
|
-
delete RENDERERS[type]
|
44
|
-
}
|
45
|
-
|
46
|
-
export function getFilterRenderers(): { [name: string]: FilterSelectRenderer[] } {
|
47
|
-
return { ...RENDERERS }
|
48
|
-
}
|
49
|
-
|
50
|
-
export function getFilterRenderer(type: string): FilterSelectRenderer[] {
|
51
|
-
if (typeof type === 'function') {
|
52
|
-
return type
|
53
|
-
}
|
54
|
-
|
55
|
-
return RENDERERS[type || 'text'] || [FilterInput]
|
56
|
-
}
|
package/src/formatters/index.ts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
export * from './registry'
|
@@ -1,30 +0,0 @@
|
|
1
|
-
import { NOOP } from '../const'
|
2
|
-
import { DateFormatter } from './date-formatter'
|
3
|
-
import { NumberFormatter } from './number-formatter'
|
4
|
-
import { TextFormatter } from './text-formatter'
|
5
|
-
|
6
|
-
var FORMATTERS: { [name: string]: (value: any) => string } = {
|
7
|
-
number: NumberFormatter,
|
8
|
-
date: DateFormatter,
|
9
|
-
text: TextFormatter
|
10
|
-
}
|
11
|
-
|
12
|
-
export function registerFormatter(type: string, formatter: (value: any) => string) {
|
13
|
-
FORMATTERS[type] = formatter
|
14
|
-
}
|
15
|
-
|
16
|
-
export function unregisterFormatter(type: string) {
|
17
|
-
delete FORMATTERS[type]
|
18
|
-
}
|
19
|
-
|
20
|
-
export function getFormatters() {
|
21
|
-
return { ...FORMATTERS }
|
22
|
-
}
|
23
|
-
|
24
|
-
export function getFormatter(type: string) {
|
25
|
-
if (typeof type == 'function') {
|
26
|
-
return type
|
27
|
-
}
|
28
|
-
|
29
|
-
return FORMATTERS[type] || NOOP
|
30
|
-
}
|
@@ -1,51 +0,0 @@
|
|
1
|
-
import '@material/web/icon/icon.js'
|
2
|
-
|
3
|
-
import { html, nothing } from 'lit'
|
4
|
-
import { ifDefined } from 'lit/directives/if-defined.js'
|
5
|
-
|
6
|
-
import { ColumnConfig, FieldRenderer, GristRecord, HeaderRenderer } from '../types'
|
7
|
-
|
8
|
-
export class GutterButton {
|
9
|
-
static instance(config: Partial<ColumnConfig> = { type: 'gutter', gutterName: 'button' }) {
|
10
|
-
var { icon = 'edit', title, iconOnly = true } = config
|
11
|
-
|
12
|
-
var iconFn = typeof icon == 'function' ? icon : (record?: GristRecord) => icon
|
13
|
-
var titleFn = typeof title == 'function' ? title : (record?: GristRecord) => title
|
14
|
-
|
15
|
-
return Object.assign(
|
16
|
-
{},
|
17
|
-
{
|
18
|
-
type: 'gutter',
|
19
|
-
gutterName: 'button',
|
20
|
-
width: 26,
|
21
|
-
resizable: false,
|
22
|
-
sortable: false,
|
23
|
-
header: {
|
24
|
-
renderer: function (column) {
|
25
|
-
const title = titleFn()
|
26
|
-
const icon = iconFn()
|
27
|
-
|
28
|
-
return iconOnly ? html` <md-icon title=${ifDefined(title)}>${icon}</md-icon> ` : title
|
29
|
-
} as HeaderRenderer
|
30
|
-
},
|
31
|
-
record: {
|
32
|
-
align: 'center',
|
33
|
-
renderer: function (value, column, record, rowIndex, field) {
|
34
|
-
const title = titleFn(record)
|
35
|
-
const icon = iconFn(record)
|
36
|
-
|
37
|
-
return iconOnly
|
38
|
-
? html` <md-icon title=${ifDefined(title && titleFn(record))}>${iconFn(record)}</md-icon> `
|
39
|
-
: title || icon
|
40
|
-
? html`<button><md-icon>${iconFn(record)}</md-icon>${titleFn(record)}</button>`
|
41
|
-
: nothing
|
42
|
-
} as FieldRenderer
|
43
|
-
},
|
44
|
-
forGrid: true,
|
45
|
-
forList: true,
|
46
|
-
forCard: true
|
47
|
-
},
|
48
|
-
config
|
49
|
-
)
|
50
|
-
}
|
51
|
-
}
|
@@ -1,96 +0,0 @@
|
|
1
|
-
import '@material/web/icon/icon.js'
|
2
|
-
|
3
|
-
import { css, html, LitElement } from 'lit'
|
4
|
-
import { customElement, property } from 'lit/decorators.js'
|
5
|
-
|
6
|
-
import { ColumnConfig, FieldRenderer, GristEventHandler } from '../types'
|
7
|
-
|
8
|
-
@customElement('ox-gutter-dirty-element')
|
9
|
-
class GutterDirtyElement extends LitElement {
|
10
|
-
static styles = css`
|
11
|
-
:host {
|
12
|
-
display: flex;
|
13
|
-
margin: auto;
|
14
|
-
}
|
15
|
-
|
16
|
-
md-icon {
|
17
|
-
width: var(--grid-record-dirty-icon-size);
|
18
|
-
height: var(--grid-record-dirty-icon-size);
|
19
|
-
border-radius: 50%;
|
20
|
-
opacity: 0.8;
|
21
|
-
}
|
22
|
-
|
23
|
-
[add] {
|
24
|
-
background-color: var(--md-sys-color-on-primary-container);
|
25
|
-
}
|
26
|
-
|
27
|
-
[remove] {
|
28
|
-
background-color: var(--md-sys-color-error);
|
29
|
-
}
|
30
|
-
|
31
|
-
[done] {
|
32
|
-
background-color: var(--status-info-color);
|
33
|
-
}
|
34
|
-
`
|
35
|
-
|
36
|
-
@property({ type: String }) value?: string
|
37
|
-
|
38
|
-
render() {
|
39
|
-
switch (this.value) {
|
40
|
-
case '+':
|
41
|
-
return html` <md-icon style=${INLINESTYLE} center add>add</md-icon> `
|
42
|
-
case '-':
|
43
|
-
return html` <md-icon style=${INLINESTYLE} center remove>remove</md-icon> `
|
44
|
-
case 'M':
|
45
|
-
return html` <md-icon style=${INLINESTYLE} center done>done</md-icon> `
|
46
|
-
default:
|
47
|
-
return ''
|
48
|
-
}
|
49
|
-
}
|
50
|
-
}
|
51
|
-
|
52
|
-
const INLINESTYLE =
|
53
|
-
'font-size: var(--grid-record-fontsize); vertical-align: middle; color: var(--grid-record-dirty-color)'
|
54
|
-
|
55
|
-
export class GutterDirty {
|
56
|
-
static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__dirty__' }) {
|
57
|
-
return Object.assign(
|
58
|
-
{},
|
59
|
-
{
|
60
|
-
type: 'gutter',
|
61
|
-
name: '__dirty__',
|
62
|
-
gutterName: 'dirty',
|
63
|
-
width: 30,
|
64
|
-
resizable: false,
|
65
|
-
sortable: false,
|
66
|
-
header: '',
|
67
|
-
record: {
|
68
|
-
align: 'center',
|
69
|
-
renderer: function (value, column, record, rowIndex, field) {
|
70
|
-
return value ? html` <ox-gutter-dirty-element value=${value}></ox-gutter-dirty-element> ` : html``
|
71
|
-
} as FieldRenderer
|
72
|
-
},
|
73
|
-
forGrid: true,
|
74
|
-
forList: false,
|
75
|
-
forCard: false,
|
76
|
-
handlers: {
|
77
|
-
dblclick: ((columns, data, column, record, rowIndex, target) => {
|
78
|
-
target.dispatchEvent(
|
79
|
-
new CustomEvent('set-select-block', {
|
80
|
-
bubbles: true,
|
81
|
-
composed: true,
|
82
|
-
detail: {
|
83
|
-
startRow: rowIndex,
|
84
|
-
startColumn: 0,
|
85
|
-
endRow: rowIndex,
|
86
|
-
endColumn: -1
|
87
|
-
}
|
88
|
-
})
|
89
|
-
)
|
90
|
-
}) as GristEventHandler
|
91
|
-
}
|
92
|
-
},
|
93
|
-
config
|
94
|
-
)
|
95
|
-
}
|
96
|
-
}
|
@@ -1,89 +0,0 @@
|
|
1
|
-
import { html } from 'lit'
|
2
|
-
|
3
|
-
import { DataCard } from '../data-card/data-card'
|
4
|
-
import { DataGrid } from '../data-grid/data-grid'
|
5
|
-
import { DataList } from '../data-list/data-list'
|
6
|
-
import { ColumnConfig, FieldRenderer, HeaderRenderer } from '../types'
|
7
|
-
|
8
|
-
export class GutterRowSelector {
|
9
|
-
static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__selected__' }) {
|
10
|
-
return Object.assign(
|
11
|
-
{},
|
12
|
-
{
|
13
|
-
type: 'gutter',
|
14
|
-
name: '__selected__',
|
15
|
-
gutterName: 'row-selector',
|
16
|
-
width: 30,
|
17
|
-
resizable: false,
|
18
|
-
sortable: false,
|
19
|
-
header: {
|
20
|
-
renderer: function (this: DataGrid | DataList | DataCard, column) {
|
21
|
-
var checked = ((this.data || {}).records || []).find(record => record['__selected__'])
|
22
|
-
|
23
|
-
return html`
|
24
|
-
<input
|
25
|
-
type="checkbox"
|
26
|
-
.checked=${!!checked}
|
27
|
-
@change=${(e: Event) => {
|
28
|
-
let selected = column.multiple ? (e.target as HTMLInputElement).checked : false
|
29
|
-
|
30
|
-
this.dispatchEvent(
|
31
|
-
new CustomEvent('select-all-change', {
|
32
|
-
bubbles: true,
|
33
|
-
composed: true,
|
34
|
-
detail: {
|
35
|
-
selected
|
36
|
-
}
|
37
|
-
})
|
38
|
-
)
|
39
|
-
|
40
|
-
e.stopPropagation()
|
41
|
-
}}
|
42
|
-
/>
|
43
|
-
`
|
44
|
-
} as HeaderRenderer
|
45
|
-
},
|
46
|
-
record: {
|
47
|
-
align: 'center',
|
48
|
-
renderer: function (value, column, record, rowIndex, field) {
|
49
|
-
return html`
|
50
|
-
<input
|
51
|
-
type=${column.multiple ? 'checkbox' : 'radio'}
|
52
|
-
.checked=${!!value}
|
53
|
-
@click=${(e: Event) => {
|
54
|
-
e.stopPropagation()
|
55
|
-
}}
|
56
|
-
@change=${(e: Event) => {
|
57
|
-
let selected = (e.target as HTMLInputElement).checked
|
58
|
-
|
59
|
-
let detail = column.multiple
|
60
|
-
? {
|
61
|
-
added: selected ? [record] : [],
|
62
|
-
removed: selected ? [] : [record]
|
63
|
-
}
|
64
|
-
: {
|
65
|
-
records: selected ? [record] : []
|
66
|
-
}
|
67
|
-
|
68
|
-
field.dispatchEvent(
|
69
|
-
new CustomEvent('select-record-change', {
|
70
|
-
bubbles: true,
|
71
|
-
composed: true,
|
72
|
-
detail
|
73
|
-
})
|
74
|
-
)
|
75
|
-
|
76
|
-
e.stopPropagation()
|
77
|
-
}}
|
78
|
-
/>
|
79
|
-
`
|
80
|
-
} as FieldRenderer
|
81
|
-
},
|
82
|
-
forGrid: true,
|
83
|
-
forList: true,
|
84
|
-
forCard: true
|
85
|
-
},
|
86
|
-
config
|
87
|
-
)
|
88
|
-
}
|
89
|
-
}
|
@@ -1,54 +0,0 @@
|
|
1
|
-
import { DataCard } from '../data-card/data-card'
|
2
|
-
import { DataGrid } from '../data-grid/data-grid'
|
3
|
-
import { DataList } from '../data-list/data-list'
|
4
|
-
import { ColumnConfig, ColumnWidthCallback, FieldRenderer, GristEventHandler } from '../types'
|
5
|
-
|
6
|
-
export class GutterSequence {
|
7
|
-
static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__seq__' }) {
|
8
|
-
return {
|
9
|
-
type: 'gutter',
|
10
|
-
name: '__seq__',
|
11
|
-
getterType: 'sequence',
|
12
|
-
width: function (this: DataGrid | DataList | DataCard, column): string {
|
13
|
-
if (this.data) {
|
14
|
-
var { limit = 0, page = 1, records = [] } = this.data || {}
|
15
|
-
var lastIndex = (page - 1) * limit + records.length
|
16
|
-
} else {
|
17
|
-
var lastIndex = 100
|
18
|
-
}
|
19
|
-
|
20
|
-
/* 1ch의 폭은 해당 폰트 0의 폭을 의미함. Arial이 약 8px이며, 정수로 떨어지지 않을 수 있으므로, 다소 여유있게 10px을 기준으로 함. */
|
21
|
-
return `${Math.max(String(lastIndex).length * 10, 20)}px`
|
22
|
-
} as ColumnWidthCallback,
|
23
|
-
resizable: false,
|
24
|
-
sortable: false,
|
25
|
-
header: '#',
|
26
|
-
record: {
|
27
|
-
renderer: function (value, column, record, rowIndex, field) {
|
28
|
-
return value
|
29
|
-
} as FieldRenderer,
|
30
|
-
align: 'right'
|
31
|
-
},
|
32
|
-
forGrid: true,
|
33
|
-
forList: false,
|
34
|
-
forCard: false,
|
35
|
-
handlers: {
|
36
|
-
dblclick: ((columns, data, column, record, rowIndex, target) => {
|
37
|
-
target.dispatchEvent(
|
38
|
-
new CustomEvent('set-select-block', {
|
39
|
-
bubbles: true,
|
40
|
-
composed: true,
|
41
|
-
detail: {
|
42
|
-
startRow: rowIndex,
|
43
|
-
startColumn: 0,
|
44
|
-
endRow: rowIndex,
|
45
|
-
endColumn: -1
|
46
|
-
}
|
47
|
-
})
|
48
|
-
)
|
49
|
-
}) as GristEventHandler
|
50
|
-
},
|
51
|
-
...config
|
52
|
-
}
|
53
|
-
}
|
54
|
-
}
|
package/src/gutters/index.ts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
export * from './registry'
|
package/src/gutters/registry.ts
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
import { ColumnConfig } from '../types'
|
2
|
-
import { GutterButton } from './gutter-button'
|
3
|
-
import { GutterDirty } from './gutter-dirty'
|
4
|
-
import { GutterRowSelector } from './gutter-row-selector'
|
5
|
-
import { GutterSequence } from './gutter-sequence'
|
6
|
-
|
7
|
-
var GUTTERS: { [name: string]: any } = {
|
8
|
-
sequence: GutterSequence,
|
9
|
-
'row-selector': GutterRowSelector,
|
10
|
-
button: GutterButton,
|
11
|
-
dirty: GutterDirty
|
12
|
-
}
|
13
|
-
|
14
|
-
export function registerGutter(name: string, gutter: any) {
|
15
|
-
GUTTERS[name] = gutter
|
16
|
-
}
|
17
|
-
|
18
|
-
export function unregisterGutter(name: string) {
|
19
|
-
delete GUTTERS[name]
|
20
|
-
}
|
21
|
-
|
22
|
-
export function getGutters() {
|
23
|
-
return { ...GUTTERS }
|
24
|
-
}
|
25
|
-
|
26
|
-
export const generateGutterColumn = (config: ColumnConfig) => {
|
27
|
-
var clazz = GUTTERS[config.gutterName || '']
|
28
|
-
|
29
|
-
if (clazz) {
|
30
|
-
return clazz.instance(config)
|
31
|
-
}
|
32
|
-
}
|
@@ -1,80 +0,0 @@
|
|
1
|
-
import { html } from 'lit'
|
2
|
-
import { OxPopupMenu } from '@operato/popup'
|
3
|
-
|
4
|
-
import { DataGridField } from '../data-grid/data-grid-field'
|
5
|
-
import { ColumnConfig, GristData, GristRecord } from '../types'
|
6
|
-
|
7
|
-
function dispatchEvent(field: DataGridField, event: string) {
|
8
|
-
field.dispatchEvent(
|
9
|
-
new CustomEvent(event, {
|
10
|
-
bubbles: true,
|
11
|
-
composed: true,
|
12
|
-
detail: field.record
|
13
|
-
})
|
14
|
-
)
|
15
|
-
}
|
16
|
-
|
17
|
-
/*
|
18
|
-
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
19
|
-
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
20
|
-
*/
|
21
|
-
export const ContextMenuTreeMutation = function (
|
22
|
-
columns: ColumnConfig[],
|
23
|
-
data: GristData,
|
24
|
-
column: ColumnConfig,
|
25
|
-
record: GristRecord,
|
26
|
-
rowIndex: number,
|
27
|
-
field: DataGridField,
|
28
|
-
event: Event
|
29
|
-
): void {
|
30
|
-
const e = event as PointerEvent
|
31
|
-
if (!('pageX' in e && 'pageY' in e)) {
|
32
|
-
return
|
33
|
-
}
|
34
|
-
|
35
|
-
e.preventDefault()
|
36
|
-
|
37
|
-
OxPopupMenu.open({
|
38
|
-
template: html`
|
39
|
-
<ox-popup-menuitem
|
40
|
-
label="add sibling node"
|
41
|
-
@click=${() => {
|
42
|
-
dispatchEvent(field, 'add-sibling-node')
|
43
|
-
}}
|
44
|
-
>
|
45
|
-
<md-icon slot="icon">add</md-icon>
|
46
|
-
</ox-popup-menuitem>
|
47
|
-
|
48
|
-
<ox-popup-menuitem
|
49
|
-
label="add child node"
|
50
|
-
@click=${() => {
|
51
|
-
dispatchEvent(field, 'add-child-node')
|
52
|
-
}}
|
53
|
-
>
|
54
|
-
<md-icon slot="icon">playlist_add</md-icon>
|
55
|
-
</ox-popup-menuitem>
|
56
|
-
|
57
|
-
<div separator></div>
|
58
|
-
|
59
|
-
<ox-popup-menuitem
|
60
|
-
label="collapse all"
|
61
|
-
@click=${() => {
|
62
|
-
dispatchEvent(field, 'collapse-all')
|
63
|
-
}}
|
64
|
-
>
|
65
|
-
<md-icon slot="icon">unfold_less</md-icon>
|
66
|
-
</ox-popup-menuitem>
|
67
|
-
|
68
|
-
<ox-popup-menuitem
|
69
|
-
label="expand all"
|
70
|
-
@click=${() => {
|
71
|
-
dispatchEvent(field, 'expand-all')
|
72
|
-
}}
|
73
|
-
>
|
74
|
-
<md-icon slot="icon">unfold_more</md-icon>
|
75
|
-
</ox-popup-menuitem>
|
76
|
-
`,
|
77
|
-
top: e.pageY,
|
78
|
-
left: e.pageX
|
79
|
-
})
|
80
|
-
}
|
package/src/handlers/index.ts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
export * from './registry'
|
@@ -1,44 +0,0 @@
|
|
1
|
-
import { DataGridField } from '../data-grid/data-grid-field'
|
2
|
-
import { ColumnConfig, GristData, GristRecord } from '../types'
|
3
|
-
|
4
|
-
/*
|
5
|
-
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
6
|
-
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
7
|
-
*/
|
8
|
-
|
9
|
-
export const MoveDown = function (
|
10
|
-
columns: ColumnConfig[],
|
11
|
-
data: GristData,
|
12
|
-
column: ColumnConfig,
|
13
|
-
record: GristRecord,
|
14
|
-
rowIndex: number,
|
15
|
-
field: DataGridField
|
16
|
-
): void {
|
17
|
-
var moveTo = rowIndex + 1
|
18
|
-
var length = data.records.length
|
19
|
-
|
20
|
-
if (rowIndex >= length || moveTo < 0 || moveTo >= length) {
|
21
|
-
return
|
22
|
-
}
|
23
|
-
|
24
|
-
data.records.splice(rowIndex, 1)
|
25
|
-
data.records.splice(moveTo, 0, record)
|
26
|
-
|
27
|
-
field.dispatchEvent(
|
28
|
-
new CustomEvent('record-change', {
|
29
|
-
bubbles: true,
|
30
|
-
composed: true
|
31
|
-
})
|
32
|
-
)
|
33
|
-
|
34
|
-
field.dispatchEvent(
|
35
|
-
new CustomEvent('focus-change', {
|
36
|
-
bubbles: true,
|
37
|
-
composed: true,
|
38
|
-
detail: {
|
39
|
-
row: moveTo,
|
40
|
-
column: column
|
41
|
-
}
|
42
|
-
})
|
43
|
-
)
|
44
|
-
}
|
package/src/handlers/move-up.ts
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
import { DataGridField } from '../data-grid/data-grid-field'
|
2
|
-
import { ColumnConfig, GristData, GristRecord } from '../types'
|
3
|
-
|
4
|
-
/*
|
5
|
-
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
6
|
-
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
7
|
-
*/
|
8
|
-
|
9
|
-
export const MoveUp = function (
|
10
|
-
columns: ColumnConfig[],
|
11
|
-
data: GristData,
|
12
|
-
column: ColumnConfig,
|
13
|
-
record: GristRecord,
|
14
|
-
rowIndex: number,
|
15
|
-
field: DataGridField
|
16
|
-
): void {
|
17
|
-
var moveTo = rowIndex - 1
|
18
|
-
var length = data.records.length
|
19
|
-
|
20
|
-
if (rowIndex >= length || moveTo < 0 || moveTo >= length) {
|
21
|
-
return
|
22
|
-
}
|
23
|
-
|
24
|
-
data.records.splice(rowIndex, 1)
|
25
|
-
data.records.splice(moveTo, 0, record)
|
26
|
-
|
27
|
-
field.dispatchEvent(
|
28
|
-
new CustomEvent('record-change', {
|
29
|
-
bubbles: true,
|
30
|
-
composed: true
|
31
|
-
})
|
32
|
-
)
|
33
|
-
|
34
|
-
field.dispatchEvent(
|
35
|
-
new CustomEvent('focus-change', {
|
36
|
-
bubbles: true,
|
37
|
-
composed: true,
|
38
|
-
detail: {
|
39
|
-
row: moveTo,
|
40
|
-
column: column
|
41
|
-
}
|
42
|
-
})
|
43
|
-
)
|
44
|
-
}
|
@@ -1,38 +0,0 @@
|
|
1
|
-
import { DataGridField } from '../data-grid/data-grid-field'
|
2
|
-
import { ColumnConfig, GristData, GristRecord } from '../types'
|
3
|
-
|
4
|
-
/*
|
5
|
-
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
6
|
-
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
7
|
-
*/
|
8
|
-
|
9
|
-
export const RecordCopy = function (
|
10
|
-
columns: ColumnConfig[],
|
11
|
-
data: GristData,
|
12
|
-
column: ColumnConfig,
|
13
|
-
record: GristRecord,
|
14
|
-
rowIndex: number,
|
15
|
-
field: DataGridField
|
16
|
-
): void {
|
17
|
-
if (rowIndex >= data.records.length) {
|
18
|
-
return
|
19
|
-
}
|
20
|
-
|
21
|
-
var copiedRecord = {
|
22
|
-
__dirty__: '+'
|
23
|
-
} as GristRecord
|
24
|
-
|
25
|
-
columns
|
26
|
-
.filter(column => column.record.editable)
|
27
|
-
.forEach(column => {
|
28
|
-
copiedRecord[column.name] = record[column.name]
|
29
|
-
})
|
30
|
-
|
31
|
-
data.records.splice(rowIndex + 1, 0, copiedRecord)
|
32
|
-
field.dispatchEvent(
|
33
|
-
new CustomEvent('record-change', {
|
34
|
-
bubbles: true,
|
35
|
-
composed: true
|
36
|
-
})
|
37
|
-
)
|
38
|
-
}
|
@@ -1,30 +0,0 @@
|
|
1
|
-
import { DataGridField } from '../data-grid/data-grid-field'
|
2
|
-
import { ColumnConfig, GristData, GristRecord } from '../types'
|
3
|
-
|
4
|
-
/*
|
5
|
-
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
6
|
-
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
7
|
-
*/
|
8
|
-
|
9
|
-
export const RecordDelete = function (
|
10
|
-
columns: ColumnConfig[],
|
11
|
-
data: GristData,
|
12
|
-
column: ColumnConfig,
|
13
|
-
record: GristRecord,
|
14
|
-
rowIndex: number,
|
15
|
-
field: DataGridField
|
16
|
-
): void {
|
17
|
-
if (rowIndex >= data.records.length) {
|
18
|
-
return
|
19
|
-
}
|
20
|
-
|
21
|
-
record.__dirty__ = '-'
|
22
|
-
data.records.splice(rowIndex, 1)
|
23
|
-
|
24
|
-
field.dispatchEvent(
|
25
|
-
new CustomEvent('record-change', {
|
26
|
-
bubbles: true,
|
27
|
-
composed: true
|
28
|
-
})
|
29
|
-
)
|
30
|
-
}
|