@operato/data-grist 7.1.31 → 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 (173) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +10 -10
  4. package/.storybook/main.js +0 -3
  5. package/.storybook/preview.js +0 -52
  6. package/.storybook/server.mjs +0 -8
  7. package/demo/data-grist-test.html +0 -468
  8. package/demo/favicon.ico +0 -0
  9. package/demo/index.html +0 -541
  10. package/demo/report-test.html +0 -249
  11. package/dist/src/record-view/record-creator.d.ts +0 -17
  12. package/dist/src/record-view/record-creator.js +0 -148
  13. package/dist/src/record-view/record-creator.js.map +0 -1
  14. package/src/accumulator/accumulator.ts +0 -63
  15. package/src/configure/column-builder.ts +0 -114
  16. package/src/configure/config-builder.ts +0 -40
  17. package/src/configure/filters-option-builder.ts +0 -8
  18. package/src/configure/imex-option-builder.ts +0 -5
  19. package/src/configure/list-option-builder.ts +0 -9
  20. package/src/configure/rows-option-builder.ts +0 -38
  21. package/src/configure/tree-option-builder.ts +0 -22
  22. package/src/configure/zero-config.ts +0 -83
  23. package/src/const.ts +0 -1
  24. package/src/data-card/data-card-field.ts +0 -94
  25. package/src/data-card/data-card-gutter-menu.ts +0 -94
  26. package/src/data-card/data-card-gutter.ts +0 -103
  27. package/src/data-card/data-card.ts +0 -154
  28. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  29. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  30. package/src/data-card/record-card.ts +0 -289
  31. package/src/data-consumer.ts +0 -11
  32. package/src/data-grid/data-grid-accum-field.ts +0 -109
  33. package/src/data-grid/data-grid-body-style.ts +0 -99
  34. package/src/data-grid/data-grid-body.ts +0 -753
  35. package/src/data-grid/data-grid-field.ts +0 -236
  36. package/src/data-grid/data-grid-footer.ts +0 -117
  37. package/src/data-grid/data-grid-header.ts +0 -574
  38. package/src/data-grid/data-grid.ts +0 -293
  39. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  40. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  41. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  42. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  43. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  44. package/src/data-grist.ts +0 -1233
  45. package/src/data-list/data-list-field.ts +0 -82
  46. package/src/data-list/data-list-gutter.ts +0 -108
  47. package/src/data-list/data-list.ts +0 -145
  48. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  49. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  50. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  51. package/src/data-list/record-partial.ts +0 -255
  52. package/src/data-manipulator.ts +0 -426
  53. package/src/data-provider.ts +0 -271
  54. package/src/data-report/data-report-body-style.ts +0 -58
  55. package/src/data-report/data-report-body.ts +0 -189
  56. package/src/data-report/data-report-component.ts +0 -138
  57. package/src/data-report/data-report-field.ts +0 -83
  58. package/src/data-report/data-report-header.ts +0 -242
  59. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  60. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  61. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  62. package/src/data-report.ts +0 -424
  63. package/src/editors/index.ts +0 -4
  64. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  65. package/src/editors/ox-grist-editor-color.ts +0 -10
  66. package/src/editors/ox-grist-editor-date.ts +0 -10
  67. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  68. package/src/editors/ox-grist-editor-email.ts +0 -10
  69. package/src/editors/ox-grist-editor-file.ts +0 -28
  70. package/src/editors/ox-grist-editor-image.ts +0 -31
  71. package/src/editors/ox-grist-editor-month.ts +0 -10
  72. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  73. package/src/editors/ox-grist-editor-number.ts +0 -27
  74. package/src/editors/ox-grist-editor-password.ts +0 -10
  75. package/src/editors/ox-grist-editor-select.ts +0 -55
  76. package/src/editors/ox-grist-editor-tel.ts +0 -10
  77. package/src/editors/ox-grist-editor-text.ts +0 -14
  78. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  79. package/src/editors/ox-grist-editor-time.ts +0 -10
  80. package/src/editors/ox-grist-editor-tree.ts +0 -27
  81. package/src/editors/ox-grist-editor-varname.ts +0 -36
  82. package/src/editors/ox-grist-editor-week.ts +0 -10
  83. package/src/editors/ox-grist-editor.ts +0 -207
  84. package/src/editors/ox-input-tree.ts +0 -226
  85. package/src/editors/registry.ts +0 -82
  86. package/src/empty-note.ts +0 -46
  87. package/src/filters/filter-checkbox.ts +0 -49
  88. package/src/filters/filter-input-barcode.ts +0 -34
  89. package/src/filters/filter-input.ts +0 -30
  90. package/src/filters/filter-range-date.ts +0 -81
  91. package/src/filters/filter-range-number.ts +0 -64
  92. package/src/filters/filter-select-buttons.ts +0 -60
  93. package/src/filters/filter-select.ts +0 -68
  94. package/src/filters/filter-styles.ts +0 -119
  95. package/src/filters/filters-form.ts +0 -476
  96. package/src/filters/index.ts +0 -10
  97. package/src/filters/registry.ts +0 -56
  98. package/src/formatters/date-formatter.ts +0 -3
  99. package/src/formatters/index.ts +0 -1
  100. package/src/formatters/number-formatter.ts +0 -3
  101. package/src/formatters/registry.ts +0 -30
  102. package/src/formatters/text-formatter.ts +0 -3
  103. package/src/gutters/gutter-button.ts +0 -51
  104. package/src/gutters/gutter-dirty.ts +0 -96
  105. package/src/gutters/gutter-row-selector.ts +0 -89
  106. package/src/gutters/gutter-sequence.ts +0 -54
  107. package/src/gutters/index.ts +0 -1
  108. package/src/gutters/registry.ts +0 -32
  109. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  110. package/src/handlers/index.ts +0 -1
  111. package/src/handlers/move-down.ts +0 -44
  112. package/src/handlers/move-up.ts +0 -44
  113. package/src/handlers/record-copy.ts +0 -38
  114. package/src/handlers/record-delete.ts +0 -30
  115. package/src/handlers/record-view-handler.ts +0 -27
  116. package/src/handlers/registry.ts +0 -42
  117. package/src/handlers/select-row-toggle.ts +0 -30
  118. package/src/handlers/select-row.ts +0 -27
  119. package/src/index.ts +0 -17
  120. package/src/personalizer/index.ts +0 -1
  121. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  122. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  123. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  124. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  125. package/src/record-view/index.ts +0 -2
  126. package/src/record-view/ox-record-creator.ts +0 -289
  127. package/src/record-view/record-view-body.ts +0 -250
  128. package/src/record-view/record-view-handler.ts +0 -86
  129. package/src/record-view/record-view.ts +0 -122
  130. package/src/renderers/index.ts +0 -14
  131. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  132. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  133. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  134. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  135. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  136. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  137. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  138. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  139. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  140. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  141. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  142. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  143. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  144. package/src/renderers/ox-grist-renderer.ts +0 -35
  145. package/src/renderers/registry.ts +0 -111
  146. package/src/sorters/sorters-control.ts +0 -143
  147. package/src/types.ts +0 -813
  148. package/src/utils/index.ts +0 -2
  149. package/src/utils/list-param.ts +0 -72
  150. package/src/utils/supports-passive.ts +0 -13
  151. package/stories/accumulator-format.stories.ts +0 -276
  152. package/stories/barcode-input-filter.stories.ts +0 -216
  153. package/stories/bounded-select-filters.stories.ts +0 -333
  154. package/stories/bounded-select-record.stories.ts +0 -336
  155. package/stories/click-event-custom.stories.ts +0 -288
  156. package/stories/click-event.stories.ts +0 -283
  157. package/stories/creatable-only-column.stories.ts +0 -253
  158. package/stories/default-filters.stories.ts +0 -241
  159. package/stories/dynamic-editable.stories.ts +0 -313
  160. package/stories/empty-sorters.stories.ts +0 -180
  161. package/stories/explicit-fetch.stories.ts +0 -186
  162. package/stories/fixed-column.stories.ts +0 -416
  163. package/stories/grid-setting.stories.ts +0 -501
  164. package/stories/grist-modes.stories.ts +0 -451
  165. package/stories/group-header.stories.ts +0 -442
  166. package/stories/record-view.stories.ts +0 -143
  167. package/stories/textarea.stories.ts +0 -261
  168. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  169. package/stories/tree-column.stories.ts +0 -296
  170. package/tsconfig.json +0 -26
  171. package/web-dev-server.config.mjs +0 -27
  172. package/web-test-runner.config.mjs +0 -45
  173. package/yarn-error.log +0 -16971
@@ -1,249 +0,0 @@
1
- <!doctype html>
2
- <html lang="en-GB">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
6
- <style>
7
- body {
8
- /* box-sizing: border-box; */
9
- margin: 0;
10
- padding: 0;
11
- overflow: hidden;
12
-
13
- /* This is a font-stack that tries to use the system-default sans-serifs first */
14
- font-family: Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
15
- line-height: 1.5;
16
- -webkit-font-smoothing: antialiased;
17
-
18
- width: 100vw;
19
- height: 100dvh;
20
-
21
- display: flex;
22
- flex-direction: column;
23
- }
24
-
25
- #demo {
26
- flex: 1;
27
- overflow: hidden;
28
-
29
- display: flex;
30
- flex-direction: column;
31
- }
32
-
33
- ox-report {
34
- flex: 1;
35
- }
36
- </style>
37
- <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet" />
38
- <link
39
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
40
- rel="stylesheet"
41
- />
42
- <link
43
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
44
- rel="stylesheet"
45
- />
46
- <link
47
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
48
- rel="stylesheet"
49
- />
50
-
51
- <link href="/themes/app-theme.css" rel="stylesheet" />
52
- <link href="/themes/oops-theme.css" rel="stylesheet" />
53
- <link href="/themes/report-theme.css" rel="stylesheet" />
54
- </head>
55
- <body>
56
- <script type="module">
57
- import { html, render } from 'lit'
58
- import '../dist/index.js'
59
-
60
- const fetchHandler = async ({ page, limit, sorters = [] }) => {
61
- var limit = 500
62
- var total = 120993
63
- var start = (page - 1) * limit
64
-
65
- await new Promise(resolve => setTimeout(resolve, 1000))
66
-
67
- return {
68
- total,
69
- records: Array(limit * page > total ? total % limit : limit)
70
- .fill()
71
- .map((item, idx) => {
72
- return {
73
- id: idx,
74
- name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
75
- description: idx % 2 ? `hatiolab manager-${start + idx + 1}` : `hatiosea manager-${start + idx + 1}`,
76
- email: idx % 2 ? `shnam@gmail.com` : `heartyoh@gmail.com`,
77
- active: Math.round(Math.random() * 2) % 2 ? true : false,
78
- company: idx % 5 ? 'HatioLAB' : 'HatioSEA',
79
- role: ['admin', 'worker', 'tester'][idx % 3],
80
- color: idx % 2 ? `#87f018` : `#180f87`,
81
- height: Math.round(Math.random() * 100),
82
- weight: Math.round(Math.random() * 100),
83
- count: Math.round(Math.random() * 100),
84
- homepage:
85
- idx % 2
86
- ? `http://hatiolab.com/${start + idx + 1}`
87
- : `http://deadpool.hatiolab.com/${start + idx + 1}`,
88
- createdAt: Date.now(),
89
- updatedAt: Date.now()
90
- }
91
- })
92
- }
93
- }
94
-
95
- const config = {
96
- columns: [
97
- {
98
- type: 'string',
99
- name: 'company',
100
- header: 'company',
101
- record: {
102
- align: 'center',
103
- options: {}
104
- },
105
- sortable: false,
106
- width: 240
107
- },
108
- {
109
- type: 'email',
110
- name: 'email',
111
- header: 'email',
112
- record: {
113
- align: 'center'
114
- },
115
- sortable: false,
116
- width: 130
117
- },
118
- {
119
- type: 'string',
120
- name: 'id',
121
- hidden: true
122
- },
123
- {
124
- type: 'link',
125
- name: 'name',
126
- header: 'name',
127
- record: {
128
- align: 'center',
129
- editable: true,
130
- options: {
131
- // href: 'http://hatiolab.com',
132
- href: function (column, record, rowIndex) {
133
- return record['homepage']
134
- }
135
- // target: '_blank'
136
- }
137
- },
138
- sortable: false,
139
- width: 120
140
- },
141
- {
142
- type: 'string',
143
- name: 'description',
144
- header: 'description',
145
- record: {
146
- align: 'left'
147
- },
148
- width: 200,
149
- handlers: {
150
- dblclick: (columns, data, column, record, rowIndex) => {
151
- alert(`${column.name} ${record[column.name]}, row : ${rowIndex}`)
152
- }
153
- }
154
- },
155
- {
156
- type: 'boolean',
157
- name: 'active',
158
- header: 'active',
159
- record: {
160
- align: 'center'
161
- },
162
- handlers: {
163
- dblclick: () => {
164
- console.log(this.report.dirtyRecords)
165
- }
166
- },
167
- sortable: false,
168
- width: 60
169
- },
170
- {
171
- type: 'string',
172
- name: 'role',
173
- header: 'role',
174
- record: {
175
- align: 'center'
176
- },
177
- sortable: false,
178
- width: 120
179
- },
180
- {
181
- type: 'number',
182
- name: 'weight',
183
- header: 'weight',
184
- record: {},
185
- sortable: false,
186
- width: 50
187
- },
188
- {
189
- type: 'number',
190
- name: 'height',
191
- header: 'height',
192
- record: {},
193
- sortable: false,
194
- width: 50
195
- },
196
- {
197
- type: 'number',
198
- name: 'count',
199
- header: 'count',
200
- record: {},
201
- sortable: false,
202
- width: 50
203
- },
204
- {
205
- type: 'datetime',
206
- name: 'updatedAt',
207
- header: 'updated_at',
208
- record: {
209
- align: 'center'
210
- },
211
- sortable: false,
212
- width: 180
213
- },
214
- {
215
- type: 'datetime',
216
- name: 'createdAt',
217
- header: 'created_at',
218
- record: {
219
- align: 'center'
220
- },
221
- sortable: false,
222
- width: 180
223
- }
224
- ],
225
- rows: {
226
- groups: [{ column: 'company', title: 'company total', align: 'right' }, { column: 'email' }],
227
- totals: ['weight', 'height', 'count']
228
- },
229
- sorters: [
230
- {
231
- name: 'company',
232
- desc: true
233
- },
234
- {
235
- name: 'email'
236
- }
237
- ]
238
- }
239
-
240
- render(
241
- html` <ox-report .config=${config} .fetchHandler=${fetchHandler} auto-fetch></ox-report> `,
242
- document.querySelector('#demo')
243
- )
244
- </script>
245
-
246
- <a href="./index.html">Grist Test</a>
247
- <div id="demo"></div>
248
- </body>
249
- </html>
@@ -1,17 +0,0 @@
1
- import '@material/web/icon/icon.js';
2
- import './record-view';
3
- import { LitElement } from 'lit';
4
- import { DataGrist } from '../data-grist';
5
- export declare class RecordCreator extends LitElement {
6
- grist?: DataGrist;
7
- callback?: (operation: {
8
- [key: string]: any;
9
- }) => boolean;
10
- lightPopup: boolean;
11
- preventCloseOnBlur: boolean;
12
- constructor();
13
- connectedCallback(): void;
14
- render(): import("lit-html").TemplateResult<1>;
15
- lightPopupRecordView(): void;
16
- popupRecordView(): void;
17
- }
@@ -1,148 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import '@material/web/icon/icon.js';
3
- import './record-view';
4
- import { html, LitElement } from 'lit';
5
- import { customElement, property, state } from 'lit/decorators.js';
6
- import { OxPopup } from '@operato/popup';
7
- let RecordCreator = class RecordCreator extends LitElement {
8
- constructor() {
9
- super();
10
- this.lightPopup = false;
11
- this.preventCloseOnBlur = false;
12
- this.addEventListener('click', (e) => {
13
- e.preventDefault();
14
- e.stopPropagation();
15
- if (this.lightPopup) {
16
- this.lightPopupRecordView();
17
- }
18
- else {
19
- this.popupRecordView();
20
- }
21
- });
22
- }
23
- connectedCallback() {
24
- super.connectedCallback();
25
- this.grist = this.closest('ox-grist');
26
- }
27
- render() {
28
- return html `<slot></slot>`;
29
- }
30
- lightPopupRecordView() {
31
- const config = this.grist.compiledConfig;
32
- var title = 'create';
33
- const rowIndex = -1;
34
- var record = {};
35
- const columns = config.columns;
36
- var popup = OxPopup.open({
37
- template: html `
38
- <div title>${title}</div>
39
- <ox-record-view
40
- @field-change=${(e) => {
41
- const view = e.currentTarget;
42
- var { after, before, column, record, row } = e.detail;
43
- var validation = column.validation;
44
- if (validation && typeof validation == 'function') {
45
- if (!validation.call(this, after, before, record, column)) {
46
- return;
47
- }
48
- }
49
- view.record = {
50
- ...record,
51
- [column.name]: after
52
- };
53
- }}
54
- .columns=${columns}
55
- .record=${record}
56
- .rowIndex=${rowIndex}
57
- @reset=${(e) => {
58
- const view = e.currentTarget;
59
- view.record = {};
60
- }}
61
- @cancel=${(e) => {
62
- popup.close();
63
- }}
64
- @ok=${(e) => {
65
- popup.close();
66
- const view = e.currentTarget;
67
- this.dispatchEvent(new CustomEvent('ok', {
68
- bubbles: true,
69
- composed: true,
70
- detail: view.record
71
- }));
72
- }}
73
- ></ox-record-view>
74
- `,
75
- parent: document.body,
76
- preventCloseOnBlur: this.preventCloseOnBlur
77
- });
78
- }
79
- popupRecordView() {
80
- const config = this.grist.compiledConfig;
81
- const rowIndex = -1;
82
- var record = {};
83
- const columns = config.columns;
84
- var title = 'create';
85
- var recordView = document.createElement('ox-record-view');
86
- recordView.columns = columns;
87
- recordView.record = record;
88
- recordView.rowIndex = rowIndex;
89
- document.dispatchEvent(new CustomEvent('open-popup', {
90
- detail: {
91
- template: recordView,
92
- options: {
93
- backdrop: true,
94
- size: 'large',
95
- title
96
- },
97
- callback: (popup) => {
98
- recordView.addEventListener('reset', (e) => {
99
- const view = e.currentTarget;
100
- view.record = {};
101
- });
102
- recordView.addEventListener('cancel', (e) => {
103
- popup.close();
104
- });
105
- recordView.addEventListener('ok', async (e) => {
106
- var _a;
107
- const view = e.currentTarget;
108
- if (await ((_a = this.callback) === null || _a === void 0 ? void 0 : _a.call(this, view.record))) {
109
- popup.close();
110
- }
111
- });
112
- recordView.addEventListener('field-change', async (e) => {
113
- const view = e.currentTarget;
114
- var { after, before, column, record, row } = e.detail;
115
- var validation = column.validation;
116
- if (validation && typeof validation == 'function') {
117
- if (!(await validation.call(this, after, before, record, column))) {
118
- return;
119
- }
120
- }
121
- view.record = {
122
- ...record,
123
- [column.name]: after
124
- };
125
- });
126
- popup.onclosed = () => { };
127
- }
128
- }
129
- }));
130
- }
131
- };
132
- __decorate([
133
- state()
134
- ], RecordCreator.prototype, "grist", void 0);
135
- __decorate([
136
- property({ type: Object })
137
- ], RecordCreator.prototype, "callback", void 0);
138
- __decorate([
139
- property({ type: Boolean, attribute: 'light-popup' })
140
- ], RecordCreator.prototype, "lightPopup", void 0);
141
- __decorate([
142
- property({ type: Boolean, attribute: 'prevent-close-on-blur' })
143
- ], RecordCreator.prototype, "preventCloseOnBlur", void 0);
144
- RecordCreator = __decorate([
145
- customElement('ox-record-creator')
146
- ], RecordCreator);
147
- export { RecordCreator };
148
- //# sourceMappingURL=record-creator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"record-creator.js","sourceRoot":"","sources":["../../../src/record-view/record-creator.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,eAAe,CAAA;AAEtB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAOjC,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAO3C;QACE,KAAK,EAAE,CAAA;QAJ8C,eAAU,GAAY,KAAK,CAAA;QACjB,uBAAkB,GAAG,KAAK,CAAA;QAKzF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;YAC1C,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,EAAE,CAAA;YACxB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAEzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAc,CAAA;IACpD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,eAAe,CAAA;IAC5B,CAAC;IAED,oBAAoB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAM,CAAC,cAAc,CAAA;QACzC,IAAI,KAAK,GAAG,QAAQ,CAAA;QACpB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAA;QACnB,IAAI,MAAM,GAAgB,EAAE,CAAA;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAE9B,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAA;qBACC,KAAK;;0BAEA,CAAC,CAAc,EAAE,EAAE;gBACjC,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;gBAE1C,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,CAAiB,CAAC,MAM/D,CAAA;gBAED,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;gBAClC,IAAI,UAAU,IAAI,OAAO,UAAU,IAAI,UAAU,EAAE,CAAC;oBAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;wBAC1D,OAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,MAAM;oBACT,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK;iBACrB,CAAA;YACH,CAAC;qBACU,OAAO;oBACR,MAAM;sBACJ,QAAQ;mBACX,CAAC,CAAQ,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;gBAC1C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;YAClB,CAAC;oBACS,CAAC,CAAQ,EAAE,EAAE;gBACrB,KAAK,CAAC,KAAK,EAAE,CAAA;YACf,CAAC;gBACK,CAAC,CAAQ,EAAE,EAAE;gBACjB,KAAK,CAAC,KAAK,EAAE,CAAA;gBAEb,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;gBAE1C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE;oBACpB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CACH,CAAA;YACH,CAAC;;OAEJ;YACD,MAAM,EAAE,QAAQ,CAAC,IAAI;YACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;IACJ,CAAC;IAED,eAAe;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAM,CAAC,cAAc,CAAA;QACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAA;QACnB,IAAI,MAAM,GAAgB,EAAE,CAAA;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAE9B,IAAI,KAAK,GAAG,QAAQ,CAAA;QAEpB,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAe,CAAA;QAEvE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAC5B,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;QAC1B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAE9B,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5B,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK;iBACN;gBACD,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;oBACvB,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;wBAChD,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;wBAC1C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;oBAClB,CAAC,CAAC,CAAA;oBAEF,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAQ,EAAE,EAAE;wBACjD,KAAK,CAAC,KAAK,EAAE,CAAA;oBACf,CAAC,CAAC,CAAA;oBAEF,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAQ,EAAE,EAAE;;wBACnD,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;wBAC1C,IAAI,MAAM,CAAA,MAAA,IAAI,CAAC,QAAQ,qDAAG,IAAI,CAAC,MAAM,CAAC,CAAA,EAAE,CAAC;4BACvC,KAAK,CAAC,KAAK,EAAE,CAAA;wBACf,CAAC;oBACH,CAAC,CAAC,CAAA;oBAEF,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,EAAE,CAAQ,EAAE,EAAE;wBAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,aAA2B,CAAA;wBAE1C,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,CAAiB,CAAC,MAM/D,CAAA;wBAED,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;wBAClC,IAAI,UAAU,IAAI,OAAO,UAAU,IAAI,UAAU,EAAE,CAAC;4BAClD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gCAClE,OAAM;4BACR,CAAC;wBACH,CAAC;wBAED,IAAI,CAAC,MAAM,GAAG;4BACZ,GAAG,MAAM;4BACT,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK;yBACrB,CAAA;oBACH,CAAC,CAAC,CAAA;oBAEF,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;gBAC3B,CAAC;aACF;SACF,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAA;AArKU;IAAR,KAAK,EAAE;4CAAkB;AAEE;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAA0D;AAC9B;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;iDAA4B;AACjB;IAAhE,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC;yDAA2B;AALhF,aAAa;IADzB,aAAa,CAAC,mBAAmB,CAAC;GACtB,aAAa,CAsKzB","sourcesContent":["import '@material/web/icon/icon.js'\nimport './record-view'\n\nimport { html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { OxPopup } from '@operato/popup'\n\nimport { DataGrist } from '../data-grist'\nimport { ColumnConfig, GristRecord } from '../types'\nimport { RecordView } from './record-view'\n\n@customElement('ox-record-creator')\nexport class RecordCreator extends LitElement {\n @state() grist?: DataGrist\n\n @property({ type: Object }) callback?: (operation: { [key: string]: any }) => boolean\n @property({ type: Boolean, attribute: 'light-popup' }) lightPopup: boolean = false\n @property({ type: Boolean, attribute: 'prevent-close-on-blur' }) preventCloseOnBlur = false\n\n constructor() {\n super()\n\n this.addEventListener('click', (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (this.lightPopup) {\n this.lightPopupRecordView()\n } else {\n this.popupRecordView()\n }\n })\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n this.grist = this.closest('ox-grist') as DataGrist\n }\n\n render() {\n return html`<slot></slot>`\n }\n\n lightPopupRecordView() {\n const config = this.grist!.compiledConfig\n var title = 'create'\n const rowIndex = -1\n var record: GristRecord = {}\n const columns = config.columns\n\n var popup = OxPopup.open({\n template: html`\n <div title>${title}</div>\n <ox-record-view\n @field-change=${(e: CustomEvent) => {\n const view = e.currentTarget as RecordView\n\n var { after, before, column, record, row } = (e as CustomEvent).detail as {\n after: any\n before: any\n column: ColumnConfig\n record: GristRecord\n row: number\n }\n\n var validation = column.validation\n if (validation && typeof validation == 'function') {\n if (!validation.call(this, after, before, record, column)) {\n return\n }\n }\n\n view.record = {\n ...record,\n [column.name]: after\n }\n }}\n .columns=${columns}\n .record=${record}\n .rowIndex=${rowIndex}\n @reset=${(e: Event) => {\n const view = e.currentTarget as RecordView\n view.record = {}\n }}\n @cancel=${(e: Event) => {\n popup.close()\n }}\n @ok=${(e: Event) => {\n popup.close()\n\n const view = e.currentTarget as RecordView\n\n this.dispatchEvent(\n new CustomEvent('ok', {\n bubbles: true,\n composed: true,\n detail: view.record\n })\n )\n }}\n ></ox-record-view>\n `,\n parent: document.body,\n preventCloseOnBlur: this.preventCloseOnBlur\n })\n }\n\n popupRecordView() {\n const config = this.grist!.compiledConfig\n const rowIndex = -1\n var record: GristRecord = {}\n const columns = config.columns\n\n var title = 'create'\n\n var recordView = document.createElement('ox-record-view') as RecordView\n\n recordView.columns = columns\n recordView.record = record\n recordView.rowIndex = rowIndex\n\n document.dispatchEvent(\n new CustomEvent('open-popup', {\n detail: {\n template: recordView,\n options: {\n backdrop: true,\n size: 'large',\n title\n },\n callback: (popup: any) => {\n recordView.addEventListener('reset', (e: Event) => {\n const view = e.currentTarget as RecordView\n view.record = {}\n })\n\n recordView.addEventListener('cancel', (e: Event) => {\n popup.close()\n })\n\n recordView.addEventListener('ok', async (e: Event) => {\n const view = e.currentTarget as RecordView\n if (await this.callback?.(view.record)) {\n popup.close()\n }\n })\n\n recordView.addEventListener('field-change', async (e: Event) => {\n const view = e.currentTarget as RecordView\n\n var { after, before, column, record, row } = (e as CustomEvent).detail as {\n after: any\n before: any\n column: ColumnConfig\n record: GristRecord\n row: number\n }\n\n var validation = column.validation\n if (validation && typeof validation == 'function') {\n if (!(await validation.call(this, after, before, record, column))) {\n return\n }\n }\n\n view.record = {\n ...record,\n [column.name]: after\n }\n })\n\n popup.onclosed = () => {}\n }\n }\n })\n )\n }\n}\n"]}
@@ -1,63 +0,0 @@
1
- import { AccumulatorObject, ColumnConfig, GristData } from '../types'
2
-
3
- function sum(data: GristData, column: ColumnConfig): number {
4
- const name = column.name
5
-
6
- return data.records
7
- .filter(record => !Number.isNaN(record[name]))
8
- .reduce((sum, record) => {
9
- return sum + Number(record[name] || 0)
10
- }, 0)
11
- }
12
-
13
- function avg(data: GristData, column: ColumnConfig): number {
14
- const name = column.name
15
- const effectiveRecords = data.records.filter(record => !Number.isNaN(record[name]))
16
-
17
- return (
18
- effectiveRecords.reduce((sum, record) => {
19
- return sum + Number(record[name] || 0)
20
- }, 0) / effectiveRecords.length
21
- )
22
- }
23
-
24
- function count(data: GristData, column: ColumnConfig): number {
25
- return data.records.length
26
- }
27
-
28
- function min(data: GristData, column: ColumnConfig): number {
29
- const name = column.name
30
-
31
- return Math.min.apply(
32
- null,
33
- data.records.filter(record => !Number.isNaN(record[name])).map(record => Number(record[name] || 0))
34
- )
35
- }
36
-
37
- function max(data: GristData, column: ColumnConfig): number {
38
- const name = column.name
39
-
40
- return Math.max.apply(
41
- null,
42
- data.records.filter(record => !Number.isNaN(record[name])).map(record => Number(record[name] || 0))
43
- )
44
- }
45
-
46
- const Accumulators: { [name: string]: (data: GristData, column: ColumnConfig) => string | number } = {
47
- sum,
48
- avg,
49
- count,
50
- min,
51
- max
52
- }
53
-
54
- export function accumulate(data: GristData, column: ColumnConfig, accumulator: AccumulatorObject) {
55
- accumulator = typeof accumulator === 'object' ? accumulator.type : accumulator
56
- var func = accumulator as (data: GristData, column: ColumnConfig) => string | number
57
-
58
- if (typeof accumulator == 'string') {
59
- func = Accumulators[accumulator]
60
- }
61
-
62
- return func.call(null, data, column)
63
- }
@@ -1,114 +0,0 @@
1
- import { FilterConfigObject, FilterOperator } from '..'
2
- import { NOOP } from '../const'
3
- import { getEditor } from '../editors'
4
- import { generateGutterColumn } from '../gutters'
5
- import { getGristEventHandler } from '../handlers'
6
- import { getRenderer } from '../renderers'
7
- import { ColumnConfig } from '../types'
8
-
9
- export const buildColumn = (column: any): ColumnConfig => {
10
- var compiled: ColumnConfig = { ...column }
11
-
12
- if (column.type == 'gutter') {
13
- compiled = generateGutterColumn(column)
14
- }
15
-
16
- var { name, header, record, handlers, label, filter } = compiled
17
-
18
- /* header */
19
-
20
- if (typeof header == 'string') {
21
- compiled.header = {
22
- renderer: () => header
23
- }
24
- }
25
-
26
- if (typeof compiled.header?.renderer == 'string') {
27
- const text = compiled.header.renderer
28
- compiled.header = {
29
- ...compiled.header,
30
- renderer: () => text
31
- }
32
- }
33
-
34
- /* label */
35
- if (label) {
36
- let type = typeof label
37
- switch (type) {
38
- case 'boolean':
39
- compiled.label = {
40
- renderer: compiled.header?.renderer || (() => name)
41
- }
42
- break
43
- case 'string':
44
- compiled.label = {
45
- renderer: () => label
46
- }
47
- break
48
- default:
49
- compiled.label = label
50
- }
51
- } else {
52
- compiled.label = false
53
- }
54
-
55
- /*
56
- * record
57
- */
58
- var { renderer: recordRenderer, editor, editable, classifier } = record || {}
59
-
60
- recordRenderer = getRenderer(recordRenderer || column.type)
61
-
62
- if (editable !== false && typeof editor !== 'function') {
63
- editor = getEditor(column.type)
64
- }
65
-
66
- if (typeof classifier !== 'function') {
67
- classifier = NOOP
68
- }
69
-
70
- compiled.record = {
71
- ...record,
72
- classifier,
73
- renderer: recordRenderer,
74
- editor
75
- }
76
-
77
- /* filter */
78
- if (filter) {
79
- let type = typeof filter
80
- switch (type) {
81
- case 'boolean':
82
- compiled.filter = {
83
- type: column.type,
84
- operator: 'eq'
85
- }
86
- break
87
- case 'string':
88
- compiled.filter = {
89
- type: column.type,
90
- operator: filter as FilterOperator
91
- }
92
- break
93
- default:
94
- compiled.filter = {
95
- //@ts-ignore
96
- type: column.type,
97
- operator: 'eq',
98
- ...(filter as FilterConfigObject)
99
- }
100
- }
101
- }
102
-
103
- /* handler */
104
- var { click, dblclick, focus, contextmenu } = handlers || {}
105
-
106
- compiled.handlers = {
107
- click: click && getGristEventHandler(click),
108
- dblclick: dblclick && getGristEventHandler(dblclick),
109
- focus: focus && getGristEventHandler(focus),
110
- contextmenu: contextmenu && getGristEventHandler(contextmenu)
111
- }
112
-
113
- return compiled
114
- }
@@ -1,40 +0,0 @@
1
- import { GristConfig, ColumnConfig } from '../types'
2
- import { buildColumn } from './column-builder'
3
- import { buildImexOptions } from './imex-option-builder'
4
- import { buildListOptions } from './list-option-builder'
5
- import { buildTreeOptions } from './tree-option-builder'
6
- import { buildRowsOptions } from './rows-option-builder'
7
- import { buildFiltersOptions } from './filters-option-builder'
8
-
9
- function findLastIndexWithCondition(arr: ColumnConfig[], condition: (x: ColumnConfig) => boolean) {
10
- for (let i = arr.length - 1; i >= 0; i--) {
11
- if (condition(arr[i])) {
12
- return i
13
- }
14
- }
15
- return -1
16
- }
17
-
18
- export const buildConfig = (config: any): GristConfig => {
19
- var { columns = [], rows = {}, pagination, sorters, filters, list, tree, imex } = config
20
-
21
- /* 마지막 fixed 컬럼 앞의 모든 컬럼의 fixed를 true로 설정한다. */
22
- const lastFixedIndex = findLastIndexWithCondition(columns, x => !!x.fixed)
23
- if (lastFixedIndex >= 0) {
24
- for (let i = 0; i < lastFixedIndex; i++) {
25
- columns[i].fixed = true
26
- }
27
- }
28
-
29
- return {
30
- ...config,
31
- columns: columns.map((column: any) => buildColumn(column)),
32
- rows: buildRowsOptions(rows),
33
- pagination,
34
- sorters,
35
- filters: buildFiltersOptions(filters),
36
- list: buildListOptions(list),
37
- tree: buildTreeOptions(tree),
38
- imex: buildImexOptions(imex)
39
- }
40
- }
@@ -1,8 +0,0 @@
1
- import { FiltersConfig } from '../types'
2
-
3
- export const buildFiltersOptions = (filtersConfig: FiltersConfig | undefined): FiltersConfig => {
4
- return {
5
- header: false,
6
- ...filtersConfig
7
- }
8
- }
@@ -1,5 +0,0 @@
1
- import { ImexConfig } from '../types'
2
-
3
- export const buildImexOptions = (imex: any): ImexConfig | undefined => {
4
- return imex
5
- }
@@ -1,9 +0,0 @@
1
- import { ListConfig } from '../types'
2
-
3
- export const buildListOptions = (list: ListConfig | undefined): ListConfig => {
4
- return {
5
- fields: ['name', 'description', 'updatedAt'],
6
- details: [],
7
- ...list
8
- }
9
- }