@operato/data-grist 2.0.0-alpha.5 → 2.0.0-alpha.52
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 +230 -0
- package/dist/src/accumulator/accumulator.js +4 -4
- package/dist/src/accumulator/accumulator.js.map +1 -1
- package/dist/src/configure/rows-option-builder.js +2 -1
- package/dist/src/configure/rows-option-builder.js.map +1 -1
- package/dist/src/configure/zero-config.js +1 -0
- package/dist/src/configure/zero-config.js.map +1 -1
- package/dist/src/data-card/data-card.d.ts +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
- package/dist/src/data-card/record-card.d.ts +1 -1
- package/dist/src/data-grid/data-grid-accum-field.js +3 -2
- package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +3 -3
- package/dist/src/data-grid/data-grid-body.js +9 -4
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +1 -1
- package/dist/src/data-grid/data-grid-field.js +2 -2
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-footer.d.ts +1 -1
- package/dist/src/data-grid/data-grid-header.js +1 -3
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +1 -1
- package/dist/src/data-grid/data-grid.js +1 -1
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grist.d.ts +226 -4
- package/dist/src/data-grist.js +196 -4
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-list/data-list-gutter.js +12 -0
- package/dist/src/data-list/data-list-gutter.js.map +1 -1
- package/dist/src/data-list/data-list.d.ts +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
- package/dist/src/data-list/record-partial.d.ts +1 -1
- package/dist/src/data-list/record-partial.js +2 -0
- package/dist/src/data-list/record-partial.js.map +1 -1
- package/dist/src/data-manipulator.d.ts +6 -6
- package/dist/src/data-manipulator.js +44 -29
- package/dist/src/data-manipulator.js.map +1 -1
- package/dist/src/data-report/data-report-body.d.ts +1 -1
- package/dist/src/data-report/data-report-component.d.ts +1 -1
- package/dist/src/data-report.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-checkbox.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-checkbox.js +9 -2
- package/dist/src/editors/ox-grist-editor-checkbox.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-color.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-date.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-datetime.d.ts +2 -2
- package/dist/src/editors/ox-grist-editor-datetime.js +1 -2
- package/dist/src/editors/ox-grist-editor-datetime.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-email.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-file.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-file.js +8 -2
- package/dist/src/editors/ox-grist-editor-file.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-image.d.ts +2 -2
- package/dist/src/editors/ox-grist-editor-image.js +8 -8
- package/dist/src/editors/ox-grist-editor-image.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-month.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-multiple-select.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-number.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-number.js +9 -9
- package/dist/src/editors/ox-grist-editor-number.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-password.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-select.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-tel.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-text.d.ts +2 -1
- package/dist/src/editors/ox-grist-editor-text.js +3 -0
- package/dist/src/editors/ox-grist-editor-text.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-textarea.d.ts +2 -1
- package/dist/src/editors/ox-grist-editor-textarea.js +3 -0
- package/dist/src/editors/ox-grist-editor-textarea.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-time.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-tree.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-week.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor.d.ts +4 -4
- package/dist/src/editors/ox-grist-editor.js +14 -12
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/ox-input-tree.d.ts +1 -1
- package/dist/src/empty-note.d.ts +1 -1
- package/dist/src/filters/filter-range-date.js +12 -1
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filters-form.d.ts +1 -0
- package/dist/src/filters/filters-form.js +21 -3
- package/dist/src/filters/filters-form.js.map +1 -1
- package/dist/src/handlers/contextmenu-tree-mutation.js +1 -19
- package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/record-view/record-creator.d.ts +1 -1
- package/dist/src/record-view/record-view-body.d.ts +2 -2
- package/dist/src/record-view/record-view.d.ts +1 -1
- package/dist/src/renderers/ox-grist-renderer-progress.d.ts +1 -1
- package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -1
- package/dist/src/renderers/ox-grist-renderer.d.ts +2 -2
- package/dist/src/types.d.ts +1 -8
- package/dist/src/types.js.map +1 -1
- package/dist/stories/accumulator.stories.js +10 -5
- package/dist/stories/accumulator.stories.js.map +1 -1
- package/dist/stories/dynamic-editable.stories.js +89 -80
- package/dist/stories/dynamic-editable.stories.js.map +1 -1
- package/dist/stories/fixed-column.stories.js +1 -2
- package/dist/stories/fixed-column.stories.js.map +1 -1
- package/dist/stories/grist-modes.stories.js +23 -2
- package/dist/stories/grist-modes.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/default-value/default-value.md +1 -1
- package/docs/default-value/value-generator/date-generator.md +2 -2
- package/docs/default-value/value-generator/month-date-generator.md +2 -2
- package/docs/default-value/value-generator/week-date-generator.md +2 -2
- package/docs/default-value/value-generator/year-date-generator.md +2 -2
- package/package.json +20 -19
- package/src/accumulator/accumulator.ts +4 -4
- package/src/configure/rows-option-builder.ts +11 -1
- package/src/configure/zero-config.ts +1 -0
- package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
- package/src/data-grid/data-grid-accum-field.ts +3 -2
- package/src/data-grid/data-grid-body.ts +10 -5
- package/src/data-grid/data-grid-field.ts +1 -1
- package/src/data-grid/data-grid-header.ts +2 -4
- package/src/data-grid/data-grid.ts +3 -3
- package/src/data-grist.ts +251 -4
- package/src/data-list/data-list-gutter.ts +12 -0
- package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
- package/src/data-list/record-partial.ts +2 -0
- package/src/data-manipulator.ts +52 -31
- package/src/editors/ox-grist-editor-checkbox.ts +12 -2
- package/src/editors/ox-grist-editor-datetime.ts +1 -2
- package/src/editors/ox-grist-editor-file.ts +12 -2
- package/src/editors/ox-grist-editor-image.ts +10 -7
- package/src/editors/ox-grist-editor-number.ts +11 -9
- package/src/editors/ox-grist-editor-text.ts +4 -0
- package/src/editors/ox-grist-editor-textarea.ts +4 -0
- package/src/editors/ox-grist-editor.ts +14 -10
- package/src/filters/filter-range-date.ts +16 -1
- package/src/filters/filters-form.ts +25 -2
- package/src/handlers/contextmenu-tree-mutation.ts +1 -19
- package/src/index.ts +0 -1
- package/src/types.ts +1 -9
- package/stories/accumulator.stories.ts +10 -5
- package/stories/dynamic-editable.stories.ts +96 -86
- package/stories/fixed-column.stories.ts +1 -2
- package/stories/grist-modes.stories.ts +23 -2
- package/themes/grist-theme.css +1 -1
- package/dist/src/value-generator/date-generator.d.ts +0 -6
- package/dist/src/value-generator/date-generator.js +0 -30
- package/dist/src/value-generator/date-generator.js.map +0 -1
- package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
- package/dist/src/value-generator/hour-time-generator.js +0 -29
- package/dist/src/value-generator/hour-time-generator.js.map +0 -1
- package/dist/src/value-generator/index.d.ts +0 -1
- package/dist/src/value-generator/index.js +0 -2
- package/dist/src/value-generator/index.js.map +0 -1
- package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
- package/dist/src/value-generator/minute-time-generator.js +0 -29
- package/dist/src/value-generator/minute-time-generator.js.map +0 -1
- package/dist/src/value-generator/month-date-generator.d.ts +0 -7
- package/dist/src/value-generator/month-date-generator.js +0 -31
- package/dist/src/value-generator/month-date-generator.js.map +0 -1
- package/dist/src/value-generator/now-generator.d.ts +0 -4
- package/dist/src/value-generator/now-generator.js +0 -8
- package/dist/src/value-generator/now-generator.js.map +0 -1
- package/dist/src/value-generator/registry.d.ts +0 -11
- package/dist/src/value-generator/registry.js +0 -50
- package/dist/src/value-generator/registry.js.map +0 -1
- package/dist/src/value-generator/time-generator.d.ts +0 -6
- package/dist/src/value-generator/time-generator.js +0 -28
- package/dist/src/value-generator/time-generator.js.map +0 -1
- package/dist/src/value-generator/today-generator.d.ts +0 -4
- package/dist/src/value-generator/today-generator.js +0 -8
- package/dist/src/value-generator/today-generator.js.map +0 -1
- package/dist/src/value-generator/week-date-generator.d.ts +0 -7
- package/dist/src/value-generator/week-date-generator.js +0 -29
- package/dist/src/value-generator/week-date-generator.js.map +0 -1
- package/dist/src/value-generator/year-date-generator.d.ts +0 -7
- package/dist/src/value-generator/year-date-generator.js +0 -29
- package/dist/src/value-generator/year-date-generator.js.map +0 -1
- package/src/value-generator/date-generator.ts +0 -35
- package/src/value-generator/hour-time-generator.ts +0 -43
- package/src/value-generator/index.ts +0 -1
- package/src/value-generator/minute-time-generator.ts +0 -43
- package/src/value-generator/month-date-generator.ts +0 -38
- package/src/value-generator/now-generator.ts +0 -10
- package/src/value-generator/registry.ts +0 -58
- package/src/value-generator/time-generator.ts +0 -33
- package/src/value-generator/today-generator.ts +0 -10
- package/src/value-generator/week-date-generator.ts +0 -40
- package/src/value-generator/year-date-generator.ts +0 -36
@@ -12,17 +12,20 @@ export class OxGristEditorImage extends OxGristEditor {
|
|
12
12
|
|
13
13
|
_onchange(e: Event) {
|
14
14
|
e.stopPropagation()
|
15
|
-
this._dirtyValue = this.formatFromEditor(e)
|
16
|
-
this._onfocusout()
|
17
|
-
}
|
18
15
|
|
19
|
-
formatFromEditor(e: Event) {
|
20
|
-
// value가 image file object인지, image url인지 확인
|
21
16
|
const input = e.target as HTMLInputElement
|
17
|
+
|
18
|
+
// value가 image file object인지, image url인지 확인
|
22
19
|
if (input.files?.[0]) {
|
23
|
-
|
20
|
+
this._dirtyValue = this.formatFromEditor(input.files[0])
|
24
21
|
} else {
|
25
|
-
|
22
|
+
this._dirtyValue = this.formatFromEditor(input.value)
|
26
23
|
}
|
24
|
+
|
25
|
+
this._onfocusout()
|
26
|
+
}
|
27
|
+
|
28
|
+
formatFromEditor(value: any) {
|
29
|
+
return value
|
27
30
|
}
|
28
31
|
}
|
@@ -1,20 +1,22 @@
|
|
1
1
|
import { OxGristEditor } from './ox-grist-editor.js'
|
2
2
|
import { customElement } from 'lit/decorators.js'
|
3
3
|
import { html } from 'lit'
|
4
|
+
import { parseToNumberOrNull } from '@operato/utils'
|
4
5
|
|
5
6
|
@customElement('ox-grist-editor-number')
|
6
7
|
export class OxGristEditorNumber extends OxGristEditor {
|
7
|
-
|
8
|
-
|
8
|
+
get inlineEditable() {
|
9
|
+
return true
|
10
|
+
}
|
11
|
+
|
12
|
+
formatFromEditor(value: any) {
|
13
|
+
const parsed = parseToNumberOrNull(value) || null
|
9
14
|
|
10
|
-
|
11
|
-
|
12
|
-
return Number.parseFloat(value)
|
13
|
-
case 'integer':
|
14
|
-
return Number.parseInt(value)
|
15
|
-
default:
|
16
|
-
return Number(value)
|
15
|
+
if (parsed !== null && this.column.type == 'integer') {
|
16
|
+
return Math.floor(parsed)
|
17
17
|
}
|
18
|
+
|
19
|
+
return parsed
|
18
20
|
}
|
19
21
|
|
20
22
|
get editorTemplate() {
|
@@ -4,6 +4,10 @@ import { html } from 'lit'
|
|
4
4
|
|
5
5
|
@customElement('ox-grist-editor-text')
|
6
6
|
export class OxGristEditorText extends OxGristEditor {
|
7
|
+
get inlineEditable() {
|
8
|
+
return true
|
9
|
+
}
|
10
|
+
|
7
11
|
get editorTemplate() {
|
8
12
|
return html` <input type="text" .value=${this.value} /> `
|
9
13
|
}
|
@@ -6,6 +6,10 @@ import { html } from 'lit'
|
|
6
6
|
|
7
7
|
@customElement('ox-grist-editor-textarea')
|
8
8
|
export class OxGristEditorTextarea extends OxGristEditor {
|
9
|
+
get inlineEditable() {
|
10
|
+
return true
|
11
|
+
}
|
12
|
+
|
9
13
|
get editorTemplate() {
|
10
14
|
return html` <ox-input-textarea .value=${this.value}></ox-input-textarea> `
|
11
15
|
}
|
@@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js'
|
|
4
4
|
import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
|
5
5
|
import { DataGridField } from '../data-grid/data-grid-field'
|
6
6
|
import { ColumnConfig, GristRecord } from '../types'
|
7
|
-
import { getDefaultValue } from '
|
7
|
+
import { getDefaultValue } from '@operato/time-calculator'
|
8
8
|
|
9
9
|
const STYLE = css`
|
10
10
|
:host {
|
@@ -91,8 +91,8 @@ export class OxGristEditor extends LitElement {
|
|
91
91
|
return this.renderRoot.firstElementChild as HTMLElement
|
92
92
|
}
|
93
93
|
|
94
|
-
get
|
95
|
-
return
|
94
|
+
get inlineEditable() {
|
95
|
+
return false
|
96
96
|
}
|
97
97
|
|
98
98
|
async firstUpdated() {
|
@@ -121,19 +121,21 @@ export class OxGristEditor extends LitElement {
|
|
121
121
|
currentValue = getDefaultValue(defaultValue, this.record)
|
122
122
|
}
|
123
123
|
|
124
|
+
this.value = this._dirtyValue = this.formatForEditor(currentValue)
|
125
|
+
|
124
126
|
// 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환
|
125
|
-
const
|
126
|
-
this.value = this._dirtyValue =
|
127
|
+
const valueWith = this.inlineEditable && this.field?.valueWith
|
128
|
+
this.value = this._dirtyValue = valueWith ? this.formatFromEditor(valueWith) : this.formatForEditor(currentValue)
|
127
129
|
|
128
130
|
requestAnimationFrame(() => {
|
129
131
|
this.focus()
|
130
|
-
this.select()
|
132
|
+
!valueWith && this.select()
|
131
133
|
})
|
132
134
|
}
|
133
135
|
|
134
136
|
select() {
|
135
137
|
const editor = this.editor
|
136
|
-
if ((editor as HTMLInputElement)?.select
|
138
|
+
if ((editor as HTMLInputElement)?.select) {
|
137
139
|
return (editor as HTMLInputElement).select()
|
138
140
|
}
|
139
141
|
}
|
@@ -149,8 +151,8 @@ export class OxGristEditor extends LitElement {
|
|
149
151
|
return value == null ? '' : value
|
150
152
|
}
|
151
153
|
|
152
|
-
formatFromEditor(
|
153
|
-
return
|
154
|
+
formatFromEditor(value: any): any {
|
155
|
+
return value
|
154
156
|
}
|
155
157
|
|
156
158
|
_onfocusout() {
|
@@ -180,7 +182,9 @@ export class OxGristEditor extends LitElement {
|
|
180
182
|
_onchange(e: Event): void {
|
181
183
|
e.stopPropagation()
|
182
184
|
|
183
|
-
|
185
|
+
const value = (e.target as any)?.value
|
186
|
+
|
187
|
+
this._dirtyValue = this.formatFromEditor(value)
|
184
188
|
}
|
185
189
|
|
186
190
|
_onkeydown(e: Event): void {}
|
@@ -2,16 +2,31 @@ import { FilterConfigObject, FilterSelectRenderer } from '../types'
|
|
2
2
|
|
3
3
|
import { html } from 'lit-html'
|
4
4
|
|
5
|
+
function formatDate(type: string, date: Date) {
|
6
|
+
var year = date.getFullYear()
|
7
|
+
var month = ('0' + (date.getMonth() + 1)).slice(-2)
|
8
|
+
var day = ('0' + date.getDate()).slice(-2)
|
9
|
+
var hours = ('0' + date.getHours()).slice(-2)
|
10
|
+
var minutes = ('0' + date.getMinutes()).slice(-2)
|
11
|
+
|
12
|
+
var formatDate = year + '-' + month + '-' + day
|
13
|
+
|
14
|
+
return type == 'date' ? formatDate : formatDate + 'T' + hours + ':' + minutes
|
15
|
+
}
|
16
|
+
|
5
17
|
export const FilterRangeDate: FilterSelectRenderer = (column, value, owner) => {
|
6
18
|
const filter = column.filter as FilterConfigObject
|
7
19
|
|
8
|
-
|
20
|
+
var [from, to] = value instanceof Array ? value : []
|
9
21
|
|
10
22
|
var type: any = filter?.type || column.type
|
11
23
|
if (type === 'datetime') {
|
12
24
|
type = 'datetime-local'
|
13
25
|
}
|
14
26
|
|
27
|
+
from = formatDate(type, new Date(from))
|
28
|
+
to = formatDate(type, new Date(to))
|
29
|
+
|
15
30
|
return html`
|
16
31
|
<input
|
17
32
|
name=${column.name}
|
@@ -6,6 +6,8 @@ import '@operato/input/ox-input-search.js'
|
|
6
6
|
import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'
|
7
7
|
import { customElement, property, queryAsync, state } from 'lit/decorators.js'
|
8
8
|
|
9
|
+
import { getDefaultValue } from '@operato/time-calculator'
|
10
|
+
|
9
11
|
import { FilterConfigObject } from '..'
|
10
12
|
import { DataGrist } from '../data-grist'
|
11
13
|
import { ColumnConfig, FilterOperator, FilterValue, GristConfig } from '../types'
|
@@ -72,7 +74,6 @@ export class FiltersForm extends LitElement {
|
|
72
74
|
|
73
75
|
if (grist) {
|
74
76
|
this.config = grist.compiledConfig
|
75
|
-
this.value = grist.filters || []
|
76
77
|
|
77
78
|
grist.addEventListener('config-change', (e: Event) => {
|
78
79
|
this.config = (e as CustomEvent).detail
|
@@ -102,6 +103,17 @@ export class FiltersForm extends LitElement {
|
|
102
103
|
}
|
103
104
|
}
|
104
105
|
|
106
|
+
buildDefaultValue(operator: string, defaultValue: any) {
|
107
|
+
if (defaultValue === undefined) {
|
108
|
+
return
|
109
|
+
}
|
110
|
+
if (operator == 'between') {
|
111
|
+
return (defaultValue as Array<any>).map(v => getDefaultValue(v, this))
|
112
|
+
} else {
|
113
|
+
return getDefaultValue(defaultValue, this)
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
105
117
|
updated(changes: PropertyValues<this>) {
|
106
118
|
if (changes.has('config')) {
|
107
119
|
const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter)
|
@@ -114,6 +126,15 @@ export class FiltersForm extends LitElement {
|
|
114
126
|
return filter!.operator === 'search'
|
115
127
|
})
|
116
128
|
|
129
|
+
const grist = this.closest('ox-grist') as DataGrist
|
130
|
+
|
131
|
+
this.value = (grist.filters || []).map(filter => {
|
132
|
+
return {
|
133
|
+
...filter,
|
134
|
+
value: this.buildDefaultValue(filter!.operator, filter!.value)
|
135
|
+
}
|
136
|
+
})
|
137
|
+
|
117
138
|
this.empty = (this.searchColumns.length === 0 || this.withoutSearch) && this.filterColumns.length === 0
|
118
139
|
}
|
119
140
|
}
|
@@ -160,7 +181,9 @@ export class FiltersForm extends LitElement {
|
|
160
181
|
? 'text'
|
161
182
|
: type
|
162
183
|
)[idx]
|
163
|
-
const value =
|
184
|
+
const value =
|
185
|
+
this.value?.find(filter => filter.name == name)?.value ??
|
186
|
+
this.buildDefaultValue(operator!, (filter as FilterConfigObject)?.value)
|
164
187
|
|
165
188
|
if (!renderer) {
|
166
189
|
return html``
|
@@ -9,7 +9,7 @@ function dispatchEvent(field: DataGridField, event: string) {
|
|
9
9
|
new CustomEvent(event, {
|
10
10
|
bubbles: true,
|
11
11
|
composed: true,
|
12
|
-
detail: field
|
12
|
+
detail: field.record
|
13
13
|
})
|
14
14
|
)
|
15
15
|
}
|
@@ -54,24 +54,6 @@ export const ContextMenuTreeMutation = function (
|
|
54
54
|
<mwc-icon slot="icon">playlist_add</mwc-icon>
|
55
55
|
</ox-popup-menuitem>
|
56
56
|
|
57
|
-
<ox-popup-menuitem
|
58
|
-
label="move up"
|
59
|
-
@click=${() => {
|
60
|
-
dispatchEvent(field, 'move-up')
|
61
|
-
}}
|
62
|
-
>
|
63
|
-
<mwc-icon slot="icon">arrow_upward</mwc-icon>
|
64
|
-
</ox-popup-menuitem>
|
65
|
-
|
66
|
-
<ox-popup-menuitem
|
67
|
-
label="move down"
|
68
|
-
@click=${() => {
|
69
|
-
dispatchEvent(field, 'move-down')
|
70
|
-
}}
|
71
|
-
>
|
72
|
-
<mwc-icon slot="icon">arrow_downward</mwc-icon>
|
73
|
-
</ox-popup-menuitem>
|
74
|
-
|
75
57
|
<div separator></div>
|
76
58
|
|
77
59
|
<ox-popup-menuitem
|
package/src/index.ts
CHANGED
package/src/types.ts
CHANGED
@@ -427,15 +427,6 @@ export type HeaderConfig = {
|
|
427
427
|
*/
|
428
428
|
export type HeaderRenderer = (column: ColumnConfig) => any
|
429
429
|
|
430
|
-
/**
|
431
|
-
* Function type for generating values.
|
432
|
-
*
|
433
|
-
* @callback ValueGeneratorFn
|
434
|
-
* @param {...any} args - The arguments used for generating a value.
|
435
|
-
* @returns {*} - The generated value.
|
436
|
-
*/
|
437
|
-
export type ValueGeneratorFn = (...args: any[]) => any
|
438
|
-
|
439
430
|
/**
|
440
431
|
* Configuration for specifying default values for fields in a record.
|
441
432
|
* Default values can be set using predefined value generator functions or custom user-defined functions.
|
@@ -627,6 +618,7 @@ export type ImexConfig = {
|
|
627
618
|
export type RowsConfig = {
|
628
619
|
accumulator?: boolean
|
629
620
|
appendable: boolean
|
621
|
+
editable: boolean
|
630
622
|
insertable: boolean
|
631
623
|
selectable?: RowSelectableConfig
|
632
624
|
groups: GroupConfig[]
|
@@ -79,7 +79,8 @@ const config = {
|
|
79
79
|
},
|
80
80
|
filter: 'search',
|
81
81
|
sortable: true,
|
82
|
-
width: 120
|
82
|
+
width: 120,
|
83
|
+
fixed: true
|
83
84
|
},
|
84
85
|
{
|
85
86
|
type: 'string',
|
@@ -105,6 +106,10 @@ const config = {
|
|
105
106
|
align: 'right'
|
106
107
|
},
|
107
108
|
accumulator: 'avg',
|
109
|
+
// accumulator: {
|
110
|
+
// type: 'avg',
|
111
|
+
// tag: true
|
112
|
+
// },
|
108
113
|
sortable: true,
|
109
114
|
width: 130
|
110
115
|
},
|
@@ -115,7 +120,10 @@ const config = {
|
|
115
120
|
header: 'accval2',
|
116
121
|
record: {
|
117
122
|
editable: true,
|
118
|
-
align: 'right'
|
123
|
+
align: 'right',
|
124
|
+
renderer: (value: any, column: any, record: any) => {
|
125
|
+
return value && Intl.NumberFormat('en-US').format(value)
|
126
|
+
}
|
119
127
|
},
|
120
128
|
accumulator: {
|
121
129
|
type: 'sum',
|
@@ -162,9 +170,6 @@ const config = {
|
|
162
170
|
{
|
163
171
|
name: 'name',
|
164
172
|
desc: true
|
165
|
-
},
|
166
|
-
{
|
167
|
-
name: 'email'
|
168
173
|
}
|
169
174
|
],
|
170
175
|
pagination: {
|
@@ -24,6 +24,7 @@ const fetchHandler: FetchHandler = async ({ sorters = [], filters, page, limit }
|
|
24
24
|
name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
|
25
25
|
description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,
|
26
26
|
number: idx,
|
27
|
+
float: 1.3,
|
27
28
|
date: '2023-09-20',
|
28
29
|
routing: {
|
29
30
|
id: '006dc64d-4fb9-4afc-a9ea-962bd1b9e110',
|
@@ -101,7 +102,8 @@ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
|
|
101
102
|
editable: (value: any, column: any, record: any, rowIndex: any, field: any) => {
|
102
103
|
return record?.name !== 'heartyoh-3'
|
103
104
|
}
|
104
|
-
}
|
105
|
+
},
|
106
|
+
width: 40
|
105
107
|
},
|
106
108
|
{
|
107
109
|
type: 'number',
|
@@ -117,6 +119,15 @@ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
|
|
117
119
|
},
|
118
120
|
width: 80
|
119
121
|
},
|
122
|
+
{
|
123
|
+
type: 'float',
|
124
|
+
name: 'float',
|
125
|
+
header: 'float',
|
126
|
+
record: {
|
127
|
+
editable: true
|
128
|
+
},
|
129
|
+
width: 80
|
130
|
+
},
|
120
131
|
{
|
121
132
|
type: 'date',
|
122
133
|
name: 'date',
|
@@ -182,102 +193,101 @@ interface ArgTypes {
|
|
182
193
|
headerFilter: boolean
|
183
194
|
}
|
184
195
|
|
185
|
-
const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
|
186
|
-
|
187
|
-
rel="stylesheet"
|
188
|
-
|
189
|
-
|
190
|
-
<link href="/themes/oops-theme.css" rel="stylesheet" />
|
191
|
-
<link href="/themes/grist-theme.css" rel="stylesheet" />
|
196
|
+
const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
|
197
|
+
html` <link href="https://fonts.googleapis.com/css?family=Material+Icons&display=block" rel="stylesheet" />
|
198
|
+
<link href="/themes/app-theme.css" rel="stylesheet" />
|
199
|
+
<link href="/themes/oops-theme.css" rel="stylesheet" />
|
200
|
+
<link href="/themes/grist-theme.css" rel="stylesheet" />
|
192
201
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
202
|
+
<style>
|
203
|
+
[slot='headroom'] {
|
204
|
+
display: flex;
|
205
|
+
flex-direction: row;
|
206
|
+
align-items: center;
|
207
|
+
padding: var(--padding-default) var(--padding-wide);
|
208
|
+
background-color: var(--theme-white-color);
|
209
|
+
box-shadow: var(--box-shadow);
|
201
210
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
#sorters > * {
|
220
|
-
padding: var(--padding-narrow);
|
221
|
-
vertical-align: middle;
|
222
|
-
}
|
223
|
-
|
224
|
-
#filters {
|
225
|
-
display: flex;
|
226
|
-
justify-content: center;
|
227
|
-
align-items: center;
|
228
|
-
}
|
211
|
+
--mdc-icon-size: 24px;
|
212
|
+
}
|
213
|
+
#sorters mwc-icon,
|
214
|
+
#modes mwc-icon {
|
215
|
+
--mdc-icon-size: 18px;
|
216
|
+
}
|
217
|
+
#sorters {
|
218
|
+
margin-left: auto;
|
219
|
+
margin-right: var(--margin-default);
|
220
|
+
padding-left: var(--padding-narrow);
|
221
|
+
border-bottom: var(--border-dark-color);
|
222
|
+
position: relative;
|
223
|
+
color: var(--secondary-color);
|
224
|
+
font-size: var(--fontsize-default);
|
225
|
+
user-select: none;
|
226
|
+
}
|
229
227
|
|
230
|
-
|
231
|
-
|
232
|
-
|
228
|
+
#sorters > * {
|
229
|
+
padding: var(--padding-narrow);
|
230
|
+
vertical-align: middle;
|
231
|
+
}
|
233
232
|
|
234
|
-
@media only screen and (max-width: 460px) {
|
235
233
|
#filters {
|
236
|
-
|
234
|
+
display: flex;
|
235
|
+
justify-content: center;
|
236
|
+
align-items: center;
|
237
237
|
}
|
238
238
|
|
239
|
-
#
|
240
|
-
|
239
|
+
#filters * {
|
240
|
+
margin-right: var(--margin-default);
|
241
241
|
}
|
242
|
-
}
|
243
|
-
</style>
|
244
242
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
@filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
|
250
|
-
@field-change="${(e: any) => {
|
251
|
-
console.log(e.detail.record.name, e.detail.record.number)
|
252
|
-
}}"
|
253
|
-
>
|
254
|
-
<div slot="headroom">
|
255
|
-
<div id="filters">
|
256
|
-
<ox-filters-form></ox-filters-form>
|
257
|
-
</div>
|
243
|
+
@media only screen and (max-width: 460px) {
|
244
|
+
#filters {
|
245
|
+
flex-direction: column;
|
246
|
+
}
|
258
247
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
|
265
|
-
right: 0,
|
266
|
-
top: target.offsetTop + target.offsetHeight
|
267
|
-
})
|
268
|
-
}}
|
269
|
-
>expand_more</mwc-icon
|
270
|
-
>
|
271
|
-
<ox-popup id="sorter-control">
|
272
|
-
<ox-sorters-control> </ox-sorters-control>
|
273
|
-
</ox-popup>
|
274
|
-
</div>
|
248
|
+
#modes {
|
249
|
+
display: none;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
</style>
|
275
253
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
254
|
+
<ox-grist
|
255
|
+
.config=${buildConfig({ headerFilter })}
|
256
|
+
mode="GRID"
|
257
|
+
.fetchHandler=${fetchHandler}
|
258
|
+
@filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
|
259
|
+
@field-change=${(e: any) => {
|
260
|
+
const { name, number, chk } = e.detail.record
|
261
|
+
console.log(name, number, chk)
|
262
|
+
}}
|
263
|
+
>
|
264
|
+
<div slot="headroom">
|
265
|
+
<div id="filters">
|
266
|
+
<ox-filters-form></ox-filters-form>
|
267
|
+
</div>
|
268
|
+
|
269
|
+
<div id="sorters">
|
270
|
+
Sort
|
271
|
+
<mwc-icon
|
272
|
+
@click=${(e: Event) => {
|
273
|
+
const target = e.currentTarget as HTMLElement
|
274
|
+
;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
|
275
|
+
right: 0,
|
276
|
+
top: target.offsetTop + target.offsetHeight
|
277
|
+
})
|
278
|
+
}}
|
279
|
+
>expand_more</mwc-icon
|
280
|
+
>
|
281
|
+
<ox-popup id="sorter-control">
|
282
|
+
<ox-sorters-control> </ox-sorters-control>
|
283
|
+
</ox-popup>
|
284
|
+
</div>
|
285
|
+
|
286
|
+
<ox-record-creator id="add" light-popup>
|
287
|
+
<button><mwc-icon>add</mwc-icon></button>
|
288
|
+
</ox-record-creator>
|
289
|
+
</div>
|
290
|
+
</ox-grist>`
|
281
291
|
|
282
292
|
export const Regular = Template.bind({})
|
283
293
|
Regular.args = {}
|
@@ -237,7 +237,10 @@ const config = {
|
|
237
237
|
editable: true,
|
238
238
|
defaultValue: 10000.1
|
239
239
|
},
|
240
|
-
filter:
|
240
|
+
filter: {
|
241
|
+
operator: 'between',
|
242
|
+
value: [1, 100]
|
243
|
+
},
|
241
244
|
sortable: true,
|
242
245
|
width: 50
|
243
246
|
},
|
@@ -266,7 +269,25 @@ const config = {
|
|
266
269
|
name: 'now'
|
267
270
|
}
|
268
271
|
},
|
269
|
-
filter:
|
272
|
+
filter: {
|
273
|
+
operator: 'between',
|
274
|
+
type: 'datetime',
|
275
|
+
value: [
|
276
|
+
{
|
277
|
+
name: 'today',
|
278
|
+
params: {
|
279
|
+
type: 'datetime'
|
280
|
+
}
|
281
|
+
},
|
282
|
+
{
|
283
|
+
name: 'now',
|
284
|
+
params: {
|
285
|
+
type: 'datetime',
|
286
|
+
relativeDays: 1
|
287
|
+
}
|
288
|
+
}
|
289
|
+
]
|
290
|
+
},
|
270
291
|
sortable: true,
|
271
292
|
width: 180
|
272
293
|
},
|
package/themes/grist-theme.css
CHANGED
@@ -41,7 +41,7 @@ body {
|
|
41
41
|
|
42
42
|
--grid-record-background-color: var(--theme-white-color);
|
43
43
|
--grid-record-odd-background-color: #f9f7f5;
|
44
|
-
--grid-record-padding: 0
|
44
|
+
--grid-record-padding: 0 5px 0 5px;
|
45
45
|
--grid-record-color: var(--secondary-color);
|
46
46
|
--grid-record-color-hover: var(--primary-color);
|
47
47
|
--grid-record-wide-fontsize: var(--fontsize-small);
|
@@ -1,30 +0,0 @@
|
|
1
|
-
export const getRelativeDate = (params = {}) => {
|
2
|
-
const { relativeDate = 0, timeZone, format } = params;
|
3
|
-
const relativeSeconds = relativeDate * 24 * 60 * 60;
|
4
|
-
const now = new Date();
|
5
|
-
let currentDate;
|
6
|
-
if (timeZone) {
|
7
|
-
const options = { timeZone };
|
8
|
-
const currentDateISOString = now.toLocaleString('en-US', options).split(',')[0];
|
9
|
-
currentDate = new Date(currentDateISOString);
|
10
|
-
}
|
11
|
-
else {
|
12
|
-
currentDate = now;
|
13
|
-
}
|
14
|
-
const startOfDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
|
15
|
-
const targetTime = startOfDay.getTime() + relativeSeconds * 1000;
|
16
|
-
if (format === 'date') {
|
17
|
-
return new Date(targetTime);
|
18
|
-
}
|
19
|
-
else if (format === 'timestamp') {
|
20
|
-
return targetTime;
|
21
|
-
}
|
22
|
-
else if (format) {
|
23
|
-
const formatter = new Intl.DateTimeFormat(undefined, format);
|
24
|
-
return formatter.format(new Date(targetTime));
|
25
|
-
}
|
26
|
-
else {
|
27
|
-
return new Date(targetTime);
|
28
|
-
}
|
29
|
-
};
|
30
|
-
//# sourceMappingURL=date-generator.js.map
|