@operato/data-grist 7.1.30 → 7.1.32

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.
Files changed (175) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/src/data-grid/data-grid-body-style.js +2 -2
  3. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  4. package/dist/tsconfig.tsbuildinfo +1 -1
  5. package/package.json +10 -10
  6. package/.storybook/main.js +0 -3
  7. package/.storybook/preview.js +0 -52
  8. package/.storybook/server.mjs +0 -8
  9. package/demo/data-grist-test.html +0 -468
  10. package/demo/favicon.ico +0 -0
  11. package/demo/index.html +0 -541
  12. package/demo/report-test.html +0 -249
  13. package/dist/src/record-view/record-creator.d.ts +0 -17
  14. package/dist/src/record-view/record-creator.js +0 -148
  15. package/dist/src/record-view/record-creator.js.map +0 -1
  16. package/src/accumulator/accumulator.ts +0 -63
  17. package/src/configure/column-builder.ts +0 -114
  18. package/src/configure/config-builder.ts +0 -40
  19. package/src/configure/filters-option-builder.ts +0 -8
  20. package/src/configure/imex-option-builder.ts +0 -5
  21. package/src/configure/list-option-builder.ts +0 -9
  22. package/src/configure/rows-option-builder.ts +0 -38
  23. package/src/configure/tree-option-builder.ts +0 -22
  24. package/src/configure/zero-config.ts +0 -83
  25. package/src/const.ts +0 -1
  26. package/src/data-card/data-card-field.ts +0 -94
  27. package/src/data-card/data-card-gutter-menu.ts +0 -94
  28. package/src/data-card/data-card-gutter.ts +0 -103
  29. package/src/data-card/data-card.ts +0 -154
  30. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  31. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  32. package/src/data-card/record-card.ts +0 -289
  33. package/src/data-consumer.ts +0 -11
  34. package/src/data-grid/data-grid-accum-field.ts +0 -109
  35. package/src/data-grid/data-grid-body-style.ts +0 -99
  36. package/src/data-grid/data-grid-body.ts +0 -753
  37. package/src/data-grid/data-grid-field.ts +0 -236
  38. package/src/data-grid/data-grid-footer.ts +0 -117
  39. package/src/data-grid/data-grid-header.ts +0 -574
  40. package/src/data-grid/data-grid.ts +0 -293
  41. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  42. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  43. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  44. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  45. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  46. package/src/data-grist.ts +0 -1233
  47. package/src/data-list/data-list-field.ts +0 -82
  48. package/src/data-list/data-list-gutter.ts +0 -108
  49. package/src/data-list/data-list.ts +0 -145
  50. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  51. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  52. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  53. package/src/data-list/record-partial.ts +0 -255
  54. package/src/data-manipulator.ts +0 -426
  55. package/src/data-provider.ts +0 -271
  56. package/src/data-report/data-report-body-style.ts +0 -58
  57. package/src/data-report/data-report-body.ts +0 -189
  58. package/src/data-report/data-report-component.ts +0 -138
  59. package/src/data-report/data-report-field.ts +0 -83
  60. package/src/data-report/data-report-header.ts +0 -242
  61. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  62. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  63. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  64. package/src/data-report.ts +0 -424
  65. package/src/editors/index.ts +0 -4
  66. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  67. package/src/editors/ox-grist-editor-color.ts +0 -10
  68. package/src/editors/ox-grist-editor-date.ts +0 -10
  69. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  70. package/src/editors/ox-grist-editor-email.ts +0 -10
  71. package/src/editors/ox-grist-editor-file.ts +0 -28
  72. package/src/editors/ox-grist-editor-image.ts +0 -31
  73. package/src/editors/ox-grist-editor-month.ts +0 -10
  74. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  75. package/src/editors/ox-grist-editor-number.ts +0 -27
  76. package/src/editors/ox-grist-editor-password.ts +0 -10
  77. package/src/editors/ox-grist-editor-select.ts +0 -55
  78. package/src/editors/ox-grist-editor-tel.ts +0 -10
  79. package/src/editors/ox-grist-editor-text.ts +0 -14
  80. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  81. package/src/editors/ox-grist-editor-time.ts +0 -10
  82. package/src/editors/ox-grist-editor-tree.ts +0 -27
  83. package/src/editors/ox-grist-editor-varname.ts +0 -36
  84. package/src/editors/ox-grist-editor-week.ts +0 -10
  85. package/src/editors/ox-grist-editor.ts +0 -207
  86. package/src/editors/ox-input-tree.ts +0 -226
  87. package/src/editors/registry.ts +0 -82
  88. package/src/empty-note.ts +0 -46
  89. package/src/filters/filter-checkbox.ts +0 -49
  90. package/src/filters/filter-input-barcode.ts +0 -34
  91. package/src/filters/filter-input.ts +0 -30
  92. package/src/filters/filter-range-date.ts +0 -81
  93. package/src/filters/filter-range-number.ts +0 -64
  94. package/src/filters/filter-select-buttons.ts +0 -60
  95. package/src/filters/filter-select.ts +0 -68
  96. package/src/filters/filter-styles.ts +0 -119
  97. package/src/filters/filters-form.ts +0 -476
  98. package/src/filters/index.ts +0 -10
  99. package/src/filters/registry.ts +0 -56
  100. package/src/formatters/date-formatter.ts +0 -3
  101. package/src/formatters/index.ts +0 -1
  102. package/src/formatters/number-formatter.ts +0 -3
  103. package/src/formatters/registry.ts +0 -30
  104. package/src/formatters/text-formatter.ts +0 -3
  105. package/src/gutters/gutter-button.ts +0 -51
  106. package/src/gutters/gutter-dirty.ts +0 -96
  107. package/src/gutters/gutter-row-selector.ts +0 -89
  108. package/src/gutters/gutter-sequence.ts +0 -54
  109. package/src/gutters/index.ts +0 -1
  110. package/src/gutters/registry.ts +0 -32
  111. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  112. package/src/handlers/index.ts +0 -1
  113. package/src/handlers/move-down.ts +0 -44
  114. package/src/handlers/move-up.ts +0 -44
  115. package/src/handlers/record-copy.ts +0 -38
  116. package/src/handlers/record-delete.ts +0 -30
  117. package/src/handlers/record-view-handler.ts +0 -27
  118. package/src/handlers/registry.ts +0 -42
  119. package/src/handlers/select-row-toggle.ts +0 -30
  120. package/src/handlers/select-row.ts +0 -27
  121. package/src/index.ts +0 -17
  122. package/src/personalizer/index.ts +0 -1
  123. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  124. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  125. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  126. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  127. package/src/record-view/index.ts +0 -2
  128. package/src/record-view/ox-record-creator.ts +0 -289
  129. package/src/record-view/record-view-body.ts +0 -250
  130. package/src/record-view/record-view-handler.ts +0 -86
  131. package/src/record-view/record-view.ts +0 -122
  132. package/src/renderers/index.ts +0 -14
  133. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  134. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  135. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  136. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  137. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  138. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  139. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  140. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  141. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  142. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  143. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  144. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  145. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  146. package/src/renderers/ox-grist-renderer.ts +0 -35
  147. package/src/renderers/registry.ts +0 -111
  148. package/src/sorters/sorters-control.ts +0 -143
  149. package/src/types.ts +0 -813
  150. package/src/utils/index.ts +0 -2
  151. package/src/utils/list-param.ts +0 -72
  152. package/src/utils/supports-passive.ts +0 -13
  153. package/stories/accumulator-format.stories.ts +0 -276
  154. package/stories/barcode-input-filter.stories.ts +0 -216
  155. package/stories/bounded-select-filters.stories.ts +0 -333
  156. package/stories/bounded-select-record.stories.ts +0 -336
  157. package/stories/click-event-custom.stories.ts +0 -288
  158. package/stories/click-event.stories.ts +0 -283
  159. package/stories/creatable-only-column.stories.ts +0 -253
  160. package/stories/default-filters.stories.ts +0 -241
  161. package/stories/dynamic-editable.stories.ts +0 -313
  162. package/stories/empty-sorters.stories.ts +0 -180
  163. package/stories/explicit-fetch.stories.ts +0 -186
  164. package/stories/fixed-column.stories.ts +0 -416
  165. package/stories/grid-setting.stories.ts +0 -501
  166. package/stories/grist-modes.stories.ts +0 -451
  167. package/stories/group-header.stories.ts +0 -442
  168. package/stories/record-view.stories.ts +0 -143
  169. package/stories/textarea.stories.ts +0 -261
  170. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  171. package/stories/tree-column.stories.ts +0 -296
  172. package/tsconfig.json +0 -26
  173. package/web-dev-server.config.mjs +0 -27
  174. package/web-test-runner.config.mjs +0 -45
  175. package/yarn-error.log +0 -16971
@@ -1,82 +0,0 @@
1
- import { ColumnConfig, GristRecord } from '../types'
2
- import { LitElement, TemplateResult, css, html } from 'lit'
3
- import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
4
- import { customElement, property } from 'lit/decorators.js'
5
-
6
- @customElement('ox-list-field')
7
- export class DataListField extends LitElement {
8
- static styles = [
9
- css`
10
- :host {
11
- display: flex;
12
- align-items: center;
13
- justify-content: flex-start;
14
- position: relative;
15
-
16
- white-space: normal;
17
- padding: var(--spacing-tiny) var(--spacing-small);
18
-
19
- font: inherit;
20
- }
21
-
22
- :host > * {
23
- flex: 1;
24
- margin: var(--spacing-none);
25
- text-align: left;
26
- }
27
-
28
- :host > *[center] {
29
- flex: none;
30
- margin: var(--spacing-none) auto;
31
- }
32
-
33
- :host([thumbnail]) {
34
- flex-direction: column;
35
- justify-content: center;
36
- }
37
-
38
- :host([thumbnail]) > * {
39
- flex: unset;
40
- object-fit: contain;
41
- width: 100%;
42
- height: 100%;
43
- padding: var(--spacing-none);
44
- margin: var(--spacing-none);
45
- }
46
-
47
- label {
48
- flex: none;
49
- width: 33%;
50
- font: var(--data-list-item-etc-label-font);
51
- }
52
-
53
- @media only screen and (max-width: 460px) {
54
- *[center] {
55
- margin: initial;
56
- }
57
- }
58
- `
59
- ]
60
-
61
- @property({ attribute: true }) align?: string
62
- @property({ type: Object }) record: GristRecord = ZERO_RECORD
63
- @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN
64
- @property({ type: Number }) rowIndex: number = -1
65
- @property({ type: Object }) value?: object
66
-
67
- render(): TemplateResult {
68
- var { value, column, record, rowIndex } = this
69
-
70
- var {
71
- label,
72
- record: { renderer: fieldRenderer }
73
- } = column
74
-
75
- if (typeof label == 'object') {
76
- let { renderer: labelRenderer } = label
77
- return html`<label>${labelRenderer(column)}</label>${fieldRenderer(value, column, record, rowIndex, this)}`
78
- } else {
79
- return html`${fieldRenderer(value, column, record, rowIndex, this)}`
80
- }
81
- }
82
- }
@@ -1,108 +0,0 @@
1
- import { ColumnConfig, GristRecord } from '../types'
2
- import { LitElement, PropertyValues, TemplateResult, css, html } from 'lit'
3
- import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
4
- import { customElement, property } from 'lit/decorators.js'
5
-
6
- const DEFAULT_TEXT_ALIGN = 'left'
7
-
8
- @customElement('ox-list-gutter')
9
- export class DataListGutter extends LitElement {
10
- static styles = [
11
- css`
12
- :host {
13
- display: flex;
14
- align-items: center;
15
- justify-content: var(--data-list-gutter-justify-content, flex-start);
16
- position: relative;
17
-
18
- white-space: nowrap;
19
- overflow: hidden;
20
- background-color: transparent;
21
-
22
- font-size: var(--grid-record-wide-fontsize);
23
- text-overflow: ellipsis;
24
- color: var(--grid-record-color);
25
-
26
- padding-right: var(--spacing-medium);
27
- }
28
-
29
- :host-context(.expand)::after {
30
- content: '';
31
- position: absolute;
32
- left: 50%;
33
- top: 50%;
34
- transform: translate(-50%, -50%);
35
- width: 150%;
36
- height: 220%;
37
- }
38
-
39
- * {
40
- flex: 1;
41
- border: 0;
42
- font-size: var(--md-sys-typescale-label-medium-size, 0.8rem);
43
- line-height: var(--md-sys-typescale-label-medium-size, 0.8rem);
44
-
45
- background-color: transparent;
46
- padding: var(--spacing-small);
47
- }
48
-
49
- *[center] {
50
- flex: none;
51
- margin: var(--spacing-none) auto;
52
- }
53
-
54
- button {
55
- display: flex;
56
- gap: var(--spacing-small);
57
- border: 0;
58
- align-items: center;
59
- }
60
-
61
- button md-icon {
62
- border: 0;
63
- padding: 0;
64
- background-color: unset;
65
- }
66
- `
67
- ]
68
-
69
- @property({ attribute: true }) align?: string
70
- @property({ type: Object }) record: GristRecord = ZERO_RECORD
71
- @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN
72
- @property({ type: Number }) rowIndex: number = -1
73
- @property({ type: Object }) value?: object
74
-
75
- render(): TemplateResult {
76
- if (!this.column) {
77
- return html``
78
- }
79
-
80
- var { value, column, record, rowIndex } = this
81
- var { renderer } = column.record
82
-
83
- /* renderer가 html template이 아니고 단순한 값인 경우가 있으므로, html 템플릿으로 감싸준다. */
84
- return html` ${renderer(value, column, record, rowIndex, this)} `
85
- }
86
-
87
- updated(changes: PropertyValues<this>) {
88
- if (changes.has('column')) {
89
- var align = this.column.record.align || DEFAULT_TEXT_ALIGN
90
- if (align != DEFAULT_TEXT_ALIGN) {
91
- let justify = 'center'
92
- switch (align) {
93
- case 'right':
94
- justify = 'flex-end'
95
- break
96
- }
97
- this.style.setProperty('--data-list-gutter-justify-content', justify)
98
- }
99
-
100
- const { danger } = this.column
101
- if (danger) {
102
- this.setAttribute('danger', '')
103
- } else {
104
- this.removeAttribute('danger')
105
- }
106
- }
107
- }
108
- }
@@ -1,145 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import './record-partial'
3
-
4
- import { css, html, PropertyValues } from 'lit'
5
- import { customElement, property, state } from 'lit/decorators.js'
6
-
7
- import { DataManipulator } from '../data-manipulator'
8
- import { GristRecord } from '../types'
9
-
10
- @customElement('ox-list')
11
- export class DataList extends DataManipulator {
12
- static styles = [
13
- css`
14
- :host {
15
- background-color: var(--data-list-background-color);
16
- overflow-y: auto;
17
- }
18
-
19
- ox-record-partial:nth-child(even) {
20
- background-color: var(--grid-record-odd-background-color);
21
- }
22
-
23
- [selected-row] {
24
- background-color: var(--data-list-selected-background-color);
25
- }
26
-
27
- #upward {
28
- --md-icon-size: var(--icon-size-large);
29
- position: absolute;
30
- top: var(--data-list-fab-position-vertical);
31
- right: var(--data-list-fab-position-horizontal);
32
- background-color: rgba(255, 255, 255, 0.7);
33
- border-radius: var(--md-sys-shape-corner-large);
34
- color: var(--data-list-fab-color);
35
- box-shadow: var(--data-list-fab-shadow);
36
- padding: var(--spacing-small);
37
- }
38
-
39
- slot {
40
- width: 100%;
41
- }
42
-
43
- ox-empty-note {
44
- display: block;
45
- position: absolute;
46
- left: 50%;
47
- top: 50%;
48
- transform: translate(-50%, -50%);
49
- }
50
-
51
- ox-record-partial[emphasized-row],
52
- ox-record-partial[emphasized-row][focused] {
53
- background-color: var(--grid-record-emphasized-background-color);
54
- color: var(--grid-record-emphasized-color);
55
- }
56
- `
57
- ]
58
-
59
- @property({ type: Boolean }) empty?: boolean
60
-
61
- @state() private _records: GristRecord[] = []
62
- @state() private isTop: boolean = false
63
-
64
- private _total: number = 0
65
- private _limit: number = 20
66
- private _page: number = 1
67
-
68
- firstUpdated(changes: PropertyValues<this>) {
69
- this.isTop = true
70
-
71
- /* infinite scrolling */
72
- this.addEventListener('scroll', e => {
73
- const totalScrollHeight = this.scrollHeight
74
- const screenHeight = this.offsetHeight
75
- const currentScrollTop = this.scrollTop
76
-
77
- if (totalScrollHeight <= screenHeight + currentScrollTop + 1) {
78
- /* 마지막 페이지까지 계속 페이지를 증가시킨다. */
79
- var lastPage = Math.ceil(this._total / this._limit)
80
-
81
- if (this._page < lastPage) {
82
- this.dispatchEvent(new CustomEvent('attach-page', { bubbles: true, composed: true }))
83
- }
84
- }
85
-
86
- this.isTop = this.scrollTop == 0
87
- })
88
- }
89
-
90
- updated(changes: PropertyValues<this>) {
91
- if (changes.has('config')) {
92
- this._records = []
93
- this._page = 1
94
- }
95
-
96
- if (changes.has('data')) {
97
- this._records = this.data.records
98
- this._total = this.data.total || 0
99
- this._limit = this.data.limit || 20
100
- this._page = this.data.page || 0
101
- }
102
- }
103
-
104
- render() {
105
- var { classifier } = this.config.rows
106
-
107
- var records = this._records || []
108
-
109
- if (this.config && this.config.rows.appendable) {
110
- records = [...records, { __dirty__: '+' }]
111
- }
112
-
113
- return html`
114
- ${records.map((record, rowIndex) => {
115
- var { emphasized } = classifier.call(null, record, rowIndex) || {}
116
-
117
- return html`
118
- <ox-record-partial
119
- .config=${this.config}
120
- .data=${this.data}
121
- .record=${record}
122
- .rowIndex=${rowIndex}
123
- .emphasized=${emphasized}
124
- ?selected-row=${record['__selected__']}
125
- ?dirty=${record['__dirty__']}
126
- ></ox-record-partial>
127
- `
128
- })}
129
- ${this.empty ? html` <ox-empty-note title="NO RECORDS"></ox-empty-note> ` : html``}
130
- ${this.isTop
131
- ? html``
132
- : html` <md-icon id="upward" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</md-icon> `}
133
- `
134
- }
135
-
136
- gotoTop(e: Event) {
137
- this.scrollTop = 0
138
-
139
- e.stopPropagation()
140
- }
141
-
142
- get pullToRefreshTarget() {
143
- return this
144
- }
145
- }
@@ -1,34 +0,0 @@
1
- import { DataListField } from '../data-list-field'
2
- import { DataListGutter } from '../data-list-gutter'
3
- import { RecordPartial } from '../record-partial'
4
-
5
- /**
6
- * record-partial 의 click handler
7
- *
8
- * - handler의 this 는 record-partial임.
9
- */
10
- export function recordPartialClickHandler(this: RecordPartial, e: MouseEvent): void {
11
- e.stopPropagation()
12
-
13
- /* target should be [content] or 'ox-card-field' or 'ox-card-gutter' */
14
- var target = (e.target as Element).closest('ox-list-field, ox-list-gutter') as DataListField | DataListGutter
15
- var { column, rowIndex } = target || {}
16
-
17
- /* do column click handler */
18
- if (column) {
19
- var { click } = column.handlers
20
- if (click) {
21
- click(this.config.columns, this.data, column, this.record, rowIndex, target)
22
- return
23
- }
24
- }
25
-
26
- /* do rows click handler */
27
- var { click: rowsClick } = this.config.rows.handlers
28
- if (rowsClick) {
29
- rowsClick(this.config.columns, this.data, column, this.record, rowIndex, target)
30
- } else {
31
- /* content 가 클릭된 경우 - 레코드뷰 팝업을 실행한다. */
32
- this.config.rows.editable && this.popupRecordView()
33
- }
34
- }
@@ -1,33 +0,0 @@
1
- import { DataListField } from '../data-list-field'
2
- import { DataListGutter } from '../data-list-gutter'
3
- import { RecordPartial } from '../record-partial'
4
-
5
- /**
6
- * record-partial 의 dblclick handler
7
- *
8
- * - handler의 this 는 record-partial임.
9
- */
10
- export function recordPartialDblClickHandler(this: RecordPartial, e: MouseEvent): void {
11
- e.stopPropagation()
12
-
13
- /* target should be [content] or 'ox-card-field' or 'ox-card-gutter' */
14
- var target = (e.target as Element).closest('ox-list-field, ox-list-gutter') as DataListField | DataListGutter
15
- var { column, record, rowIndex } = target || {}
16
-
17
- if (column && column.type == 'gutter') {
18
- /*
19
- * Gutter가 클릭된 경우
20
- * TODO record-partial의 dblclick handling의 성능을 확인하고,
21
- * gutter에 dblclick를 적용할 수 있는 지 확인한 후에 활성화하자.
22
- */
23
- /* do column click handler */
24
- // var { dblclick } = column.handlers
25
- // dblclick && dblclick(this.columns, this.data, column, record, rowIndex, target)
26
- // return
27
- } else {
28
- var { dblclick: rowsDblClick } = this.config.rows.handlers
29
- if (rowsDblClick) {
30
- rowsDblClick(this.config.columns, this.data, column, record, rowIndex, target)
31
- }
32
- }
33
- }
@@ -1,33 +0,0 @@
1
- import { DataListField } from '../data-list-field'
2
- import { DataListGutter } from '../data-list-gutter'
3
- import { RecordPartial } from '../record-partial'
4
-
5
- /**
6
- * record-partial 의 long-press handler
7
- *
8
- * - handler의 this 는 record-partial임.
9
- */
10
- export function recordPartialLongPressHandler(this: RecordPartial, e: MouseEvent) {
11
- e.stopPropagation()
12
-
13
- /* target should be [content] or 'ox-card-field' or 'ox-card-gutter' */
14
- var target = (e.target as Element).closest('ox-list-field, ox-list-gutter') as DataListField | DataListGutter
15
- var { column, record, rowIndex } = target || {}
16
-
17
- if (column && column.type == 'gutter') {
18
- /*
19
- * Gutter가 클릭된 경우
20
- * TODO record-partial의 long-press handling의 성능을 확인하고,
21
- * gutter에 long-press를 적용할 수 있는 지 확인한 후에 활성화하자.
22
- */
23
- /* do column click handler */
24
- // var { dblclick } = column.handlers
25
- // dblclick && dblclick(this.columns, this.data, column, record, rowIndex, target)
26
- // return
27
- } else {
28
- var { dblclick: rowsDblClick } = this.config.rows.handlers || {}
29
- if (rowsDblClick) {
30
- rowsDblClick(this.config.columns, this.data, column, record, rowIndex, target)
31
- }
32
- }
33
- }
@@ -1,255 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import './data-list-gutter'
3
- import './data-list-field'
4
- import '../record-view'
5
-
6
- import { css, html, LitElement, PropertyValues } from 'lit'
7
- import { customElement, property } from 'lit/decorators.js'
8
-
9
- import { ZERO_CONFIG, ZERO_DATA, ZERO_RECORD } from '../configure/zero-config'
10
- import { RecordViewHandler } from '../record-view/record-view-handler'
11
- import { GristConfig, GristData, GristRecord } from '../types'
12
- import { recordPartialClickHandler } from './event-handlers/record-partial-click-handler'
13
- import { recordPartialDblClickHandler } from './event-handlers/record-partial-dblclick-handler'
14
-
15
- // import { recordPartialLongPressHandler } from './event-handlers/record-partial-long-press-handler'
16
-
17
- // TODO 로케일 설정에 따라서 포맷이 바뀌도록 해야한다.
18
- const OPTIONS: Intl.DateTimeFormatOptions = {
19
- year: 'numeric',
20
- month: 'numeric',
21
- day: 'numeric',
22
- hour: 'numeric',
23
- minute: 'numeric',
24
- second: 'numeric',
25
- hour12: false
26
- // timeZone: 'America/Los_Angeles'
27
- }
28
-
29
- const formatter = new Intl.DateTimeFormat(navigator.language, OPTIONS)
30
-
31
- @customElement('ox-record-partial')
32
- export class RecordPartial extends LitElement {
33
- static styles = [
34
- css`
35
- :host {
36
- display: flex;
37
- flex-direction: row;
38
- align-items: center;
39
- border-bottom: var(--data-list-item-border-bottom);
40
- position: relative;
41
- min-height: 42px;
42
- padding-left: var(--spacing-medium);
43
- }
44
-
45
- :host([dirty])::before {
46
- content: '';
47
- position: absolute;
48
- left: var(--spacing-none);
49
- top: var(--spacing-none);
50
-
51
- width: var(--spacing-none);
52
- height: var(--spacing-none);
53
- border-top: var(--grid-record-dirty-border-top);
54
- border-right: var(--grid-record-dirty-border-left);
55
- }
56
-
57
- :host[emphasized-row] {
58
- background-color: var(--grid-record-emphasized-background-color);
59
- color: var(--grid-record-emphasized-color);
60
- }
61
-
62
- :host [dirty] {
63
- position: absolute;
64
- margin: var(--spacing-none);
65
- height: 20px;
66
- font: var(--grid-record-dirty-icon-font);
67
- text-indent: 1px;
68
- left: var(--spacing-none);
69
- top: var(--spacing-none);
70
- color: var(--grid-record-dirty-color, var(--md-sys-color-error));
71
- }
72
-
73
- [content] {
74
- flex: auto;
75
- display: block;
76
- zoom: 1;
77
- }
78
-
79
- div[tail] {
80
- margin: var(--spacing-none);
81
- width: 100px;
82
- aspect-ratio: 1 / 1;
83
-
84
- display: flex;
85
- flex-direction: column;
86
- align-items: center;
87
- justify-content: center;
88
- }
89
-
90
- div[tail] > ox-list-field {
91
- flex: 1;
92
- }
93
-
94
- ox-list-field {
95
- font: var(--data-list-item-etc-font);
96
- color: var(--data-list-item-etc-color, var(--md-sys-color-on-surface));
97
- }
98
-
99
- ox-list-field[name] {
100
- font: var(--data-list-item-name-font);
101
- color: var(--data-list-item-name-color, var(--md-sys-color-secondary));
102
- }
103
-
104
- ox-list-field[desc] {
105
- font: var(--data-list-item-disc-font);
106
- color: var(--data-list-item-disc-color, var(--md-sys-color-on-tertiary-container));
107
- }
108
- `
109
- ]
110
-
111
- @property({ type: Object }) config: GristConfig = ZERO_CONFIG
112
- @property({ type: Object }) data: GristData = ZERO_DATA
113
- @property({ type: Object }) record: GristRecord = ZERO_RECORD
114
- @property({ type: Number }) rowIndex: number = -1
115
- /*
116
- * row-selector를 사용자가 변경할 때, record-partial의 update를 유도하기 위해 selected-row attribute를 property에 추가함.
117
- * (이를 해주지 않으면, 리스트 refresh 경우에 selected-row checkbox가 클리어되지 않는 현상이 발생함.)
118
- */
119
- @property({ type: Boolean, attribute: 'selected-row' }) selectedRow: boolean = false
120
- @property({ attribute: false }) emphasized: any = false
121
-
122
- private _recordView: any
123
-
124
- attributeChangedCallback(name: string, oldval: any, newval: any) {
125
- super.attributeChangedCallback(name, oldval, newval)
126
- }
127
-
128
- firstUpdated() {
129
- /*
130
- long-press
131
- TODO. performance를 확인한 후에 활성화하자.
132
- */
133
- // longpressable(this.renderRoot.querySelector('[content]'))
134
-
135
- // this.renderRoot.addEventListener('long-press', recordPartialLongPressHandler.bind(this))
136
- this.renderRoot.addEventListener('click', recordPartialClickHandler.bind(this) as EventListener)
137
- this.renderRoot.addEventListener('dblclick', recordPartialDblClickHandler.bind(this) as EventListener)
138
-
139
- this.addEventListener('show-record-view', () => this.popupRecordView())
140
- }
141
-
142
- updated(changes: PropertyValues<this>) {
143
- if (changes.has('record') && this._recordView) {
144
- this._recordView.record = this.record
145
- }
146
-
147
- const emphasized = this.emphasized
148
-
149
- if (!!emphasized) {
150
- this.setAttribute('emphasized-row', '')
151
-
152
- if (Symbol.iterator in Object(emphasized)) {
153
- const [backgroundColor, foregroundColor] = emphasized as string[]
154
- backgroundColor && this.style.setProperty('--grid-record-emphasized-background-color', backgroundColor)
155
- foregroundColor && this.style.setProperty('--grid-record-emphasized-color', foregroundColor)
156
- }
157
- } else {
158
- this.removeAttribute('emphasized-row')
159
- }
160
- }
161
-
162
- render() {
163
- var record = this.record
164
- var rowIndex = this.rowIndex
165
- var { columns, list } = this.config
166
- var { thumbnail, fields, details } = list || {}
167
-
168
- var displayColumns =
169
- [...fields, ...details].map(field => columns.find(column => column.name == field)).filter(column => column) || []
170
- var gutters = (columns || []).filter(column => column.type == 'gutter' && column.forList)
171
-
172
- const thumbnailColumn = thumbnail ? columns.find(column => column.name == thumbnail) : undefined
173
-
174
- if (this.hasAttribute('dirty')) {
175
- var dirtyIcon
176
-
177
- switch (this.record['__dirty__']) {
178
- case 'M':
179
- dirtyIcon = 'done'
180
- break
181
- case '+':
182
- dirtyIcon = 'add'
183
- break
184
- case '-':
185
- dirtyIcon = 'remove'
186
- break
187
- }
188
- }
189
-
190
- return html`
191
- ${dirtyIcon ? html` <md-icon dirty>${dirtyIcon}</md-icon> ` : html``}
192
- ${gutters.map(
193
- gutter => html`
194
- <ox-list-gutter
195
- class=${gutter.name === 'detail' ? 'expand' : ''}
196
- .rowIndex=${rowIndex}
197
- .column=${gutter}
198
- .record=${record}
199
- .value=${record[gutter.name]}
200
- ></ox-list-gutter>
201
- `
202
- )}
203
-
204
- <div content>
205
- ${displayColumns.map(
206
- (column, idx) => html`
207
- <ox-list-field
208
- .rowIndex=${rowIndex}
209
- .column=${column}
210
- .record=${record}
211
- .value=${record[column?.name || '']}
212
- ?name=${idx == 0}
213
- ?desc=${idx == 1}
214
- ></ox-list-field>
215
- `
216
- )}
217
- </div>
218
- ${thumbnail
219
- ? html`<div tail>
220
- <ox-list-field
221
- thumbnail
222
- .rowIndex=${rowIndex}
223
- .column=${thumbnailColumn}
224
- .record=${record}
225
- .value=${record[thumbnailColumn?.name || '']}
226
- ></ox-list-field>
227
- </div>`
228
- : html``}
229
- `
230
- }
231
-
232
- popupRecordView() {
233
- var titleField = this.config.list.fields[0] || 'name'
234
- var title = this.record[titleField]
235
-
236
- /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */
237
- if (typeof title == 'object') {
238
- var column = this.config.columns.find(column => column.name == titleField)
239
- title = column?.record.renderer(title, column, this.record, this.rowIndex, this /* cautious */)
240
- }
241
-
242
- this._recordView = RecordViewHandler(
243
- this.config.columns,
244
- this.record,
245
- this.rowIndex,
246
- this,
247
- {
248
- title
249
- },
250
- () => {
251
- delete this._recordView
252
- }
253
- )
254
- }
255
- }