@operato/data-grist 1.11.7 → 1.11.9

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.
@@ -1,310 +0,0 @@
1
- import '../src/index.js';
2
- import '../src/filters/filters-form.js';
3
- import '../src/sorters/sorters-control.js';
4
- import '../src/record-view/record-creator.js';
5
- import '@operato/popup/ox-popup-list.js';
6
- import '@material/mwc-icon';
7
- import { html } from 'lit';
8
- function flattenTree(tree, __parent__ = null, __depth__ = 0) {
9
- return tree.reduce((acc, node) => {
10
- const newNode = { ...node, __parent__, __depth__ };
11
- if (newNode.children && !node.__collapsed__) {
12
- const children = flattenTree(newNode.children, newNode, __depth__ + 1);
13
- console.log(children);
14
- return acc.concat(newNode, ...((children === null || children === void 0 ? void 0 : children.length) > 0 ? children : []));
15
- }
16
- return acc.concat(newNode);
17
- }, []);
18
- }
19
- const fetchHandler = async ({ page, limit }) => {
20
- var total = 120993;
21
- var start = (page - 1) * limit;
22
- await new Promise(resolve => setTimeout(resolve, 500));
23
- var records = Array(limit * page > total ? total % limit : limit)
24
- .fill('')
25
- .map((item, idx) => {
26
- return {
27
- id: String(idx),
28
- name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
29
- description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,
30
- active: Math.round(Math.random() * 2) % 2 ? true : false,
31
- createdAt: Date.now(),
32
- updatedAt: Date.now(),
33
- children: [
34
- ...Array.from({ length: 3 }, (_, idx) => {
35
- return {
36
- id: '1:' + String(idx),
37
- name: 'subitem' + idx,
38
- description: 'sub items...',
39
- active: Math.round(Math.random() * 2) % 2 ? true : false,
40
- children: [],
41
- createdAt: Date.now(),
42
- updatedAt: Date.now()
43
- };
44
- })
45
- ],
46
- __collapsed__: false
47
- };
48
- });
49
- return {
50
- total,
51
- records: flattenTree(records)
52
- };
53
- };
54
- const config = {
55
- list: {
56
- thumbnail: 'thumbnail',
57
- fields: ['name', 'description'],
58
- details: ['role', 'email']
59
- },
60
- columns: [
61
- {
62
- type: 'gutter',
63
- gutterName: 'dirty',
64
- fixed: true
65
- },
66
- {
67
- type: 'gutter',
68
- gutterName: 'sequence',
69
- fixed: true
70
- },
71
- {
72
- type: 'tree',
73
- name: 'name',
74
- label: true,
75
- header: 'name',
76
- record: {
77
- editable: false,
78
- childrenProperty: 'children'
79
- },
80
- filter: 'search',
81
- sortable: true,
82
- width: 120,
83
- fixed: true
84
- },
85
- {
86
- type: 'string',
87
- name: 'description',
88
- header: 'description',
89
- filter: 'search',
90
- record: {
91
- editable: true,
92
- align: 'left'
93
- },
94
- width: 200,
95
- handlers: {
96
- click: (columns, data, column, record, rowIndex, target) => {
97
- alert(`${column.name} ${record[column.name]}, row : ${rowIndex}`);
98
- }
99
- }
100
- },
101
- {
102
- type: 'boolean',
103
- name: 'active',
104
- header: 'active',
105
- record: {
106
- editable: true
107
- },
108
- filter: true,
109
- handlers: {
110
- dblclick: () => {
111
- const grist = document.querySelector('ox-grist');
112
- console.log(grist.dirtyRecords);
113
- }
114
- },
115
- sortable: true,
116
- width: 60
117
- },
118
- {
119
- type: 'datetime',
120
- name: 'updatedAt',
121
- header: 'updated at',
122
- record: {
123
- editable: true,
124
- defaultValue: {
125
- name: 'now'
126
- }
127
- },
128
- filter: 'between',
129
- sortable: true,
130
- width: 180
131
- }
132
- ],
133
- rows: {
134
- selectable: {
135
- multiple: true
136
- },
137
- handlers: {
138
- focus: 'select-row-toggle'
139
- },
140
- classifier: function (record, rowIndex) {
141
- const rate = record['rate'];
142
- const emphasized = rate < 10 ? ['black', 'white'] : rate < 25 ? ['yellow', 'blue'] : rate < 40 ? ['cyan', 'red'] : undefined;
143
- return {
144
- emphasized
145
- };
146
- }
147
- },
148
- sorters: [
149
- {
150
- name: 'name',
151
- desc: true
152
- },
153
- {
154
- name: 'email'
155
- }
156
- ],
157
- pagination: {
158
- pages: [20, 30, 50, 100, 200]
159
- }
160
- };
161
- export default {
162
- title: 'tree column',
163
- component: 'ox-grist',
164
- argTypes: {
165
- config: { control: 'object' }
166
- }
167
- };
168
- const Template = ({ config }) => html ` <link
169
- href="https://fonts.googleapis.com/css?family=Material+Icons&display=block"
170
- rel="stylesheet"
171
- />
172
- <link href="/themes/app-theme.css" rel="stylesheet" />
173
- <link href="/themes/oops-theme.css" rel="stylesheet" />
174
- <link href="/themes/grist-theme.css" rel="stylesheet" />
175
-
176
- <style>
177
- [slot='headroom'] {
178
- display: flex;
179
- flex-direction: row;
180
- align-items: center;
181
- padding: var(--padding-default) var(--padding-wide);
182
- background-color: var(--theme-white-color);
183
- box-shadow: var(--box-shadow);
184
-
185
- --mdc-icon-size: 24px;
186
- }
187
- #sorters mwc-icon,
188
- #modes mwc-icon {
189
- --mdc-icon-size: 18px;
190
- }
191
- #sorters {
192
- margin-left: auto;
193
- margin-right: var(--margin-default);
194
- padding-left: var(--padding-narrow);
195
- border-bottom: var(--border-dark-color);
196
- position: relative;
197
- color: var(--secondary-color);
198
- font-size: var(--fontsize-default);
199
- user-select: none;
200
- }
201
-
202
- #sorters > * {
203
- padding: var(--padding-narrow);
204
- vertical-align: middle;
205
- }
206
-
207
- #modes > * {
208
- padding: var(--padding-narrow);
209
- opacity: 0.5;
210
- color: var(--primary-text-color);
211
- cursor: pointer;
212
- }
213
-
214
- #modes > mwc-icon[active] {
215
- border-radius: 9px;
216
- background-color: rgba(var(--primary-color-rgb), 0.05);
217
- opacity: 1;
218
- color: var(--secondary-text-color);
219
- cursor: default;
220
- }
221
-
222
- #modes > mwc-icon:hover {
223
- opacity: 1;
224
- color: var(--secondary-text-color);
225
- }
226
-
227
- #add {
228
- width: 50px;
229
- text-align: right;
230
- }
231
-
232
- #add button {
233
- background-color: var(--primary-color);
234
- border: 0;
235
- border-radius: 50%;
236
- padding: 5px;
237
- width: 36px;
238
- height: 36px;
239
- cursor: pointer;
240
- }
241
-
242
- #add button:hover {
243
- background-color: var(--focus-background-color);
244
- box-shadow: var(--box-shadow);
245
- }
246
-
247
- #add button mwc-icon {
248
- font-size: 2em;
249
- color: var(--theme-white-color);
250
- }
251
-
252
- #filters {
253
- display: flex;
254
- justify-content: center;
255
- align-items: center;
256
- }
257
-
258
- #filters * {
259
- margin-right: var(--margin-default);
260
- }
261
-
262
- @media only screen and (max-width: 460px) {
263
- #filters {
264
- flex-direction: column;
265
- }
266
-
267
- #modes {
268
- display: none;
269
- }
270
- }
271
- </style>
272
-
273
- <ox-grist
274
- mode="GRID"
275
- .config=${config}
276
- .fetchHandler=${fetchHandler}
277
- @filters-change=${(e) => console.log('filters', e.target.filters)}
278
- >
279
- <div slot="headroom">
280
- <div id="filters">
281
- <ox-filters-form autofocus></ox-filters-form>
282
- </div>
283
-
284
- <div id="sorters">
285
- Sort
286
- <mwc-icon
287
- @click=${(e) => {
288
- const target = e.currentTarget;
289
- target.closest('#sorters').querySelector('#sorter-control').open({
290
- right: 0,
291
- top: target.offsetTop + target.offsetHeight
292
- });
293
- }}
294
- >expand_more</mwc-icon
295
- >
296
- <ox-popup id="sorter-control">
297
- <ox-sorters-control> </ox-sorters-control>
298
- </ox-popup>
299
- </div>
300
-
301
- <ox-record-creator id="add" light-popup>
302
- <button><mwc-icon>add</mwc-icon></button>
303
- </ox-record-creator>
304
- </div>
305
- </ox-grist>`;
306
- export const Regular = Template.bind({});
307
- Regular.args = {
308
- config
309
- };
310
- //# sourceMappingURL=tree-column.stories.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-column.stories.js","sourceRoot":"","sources":["../../stories/tree-column.stories.ts"],"names":[],"mappings":"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","sourcesContent":["import '../src/index.js'\nimport '../src/filters/filters-form.js'\nimport '../src/sorters/sorters-control.js'\nimport '../src/record-view/record-creator.js'\nimport '@operato/popup/ox-popup-list.js'\nimport '@material/mwc-icon'\n\nimport { html, TemplateResult } from 'lit'\n\nimport {\n ColumnConfig,\n FetchHandler,\n GristClassifier,\n GristEventHandlerSet,\n GristRecord,\n ValidationCallback\n} from '../src/types.js'\n\nfunction flattenTree(tree: any[], __parent__ = null, __depth__ = 0): any[] {\n return tree.reduce((acc, node) => {\n const newNode = { ...node, __parent__, __depth__ }\n\n if ((newNode.children as any[]) && !node.__collapsed__) {\n const children = flattenTree(newNode.children, newNode, __depth__ + 1)\n console.log(children)\n return acc.concat(newNode, ...(children?.length > 0 ? children : []))\n }\n\n return acc.concat(newNode)\n }, [])\n}\n\nconst fetchHandler: FetchHandler = async ({ page, limit }) => {\n var total = 120993\n var start = (page! - 1) * limit!\n\n await new Promise(resolve => setTimeout(resolve, 500))\n\n var records = Array(limit! * page! > total ? total % limit! : limit)\n .fill('')\n .map((item, idx) => {\n return {\n id: String(idx),\n name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,\n description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,\n active: Math.round(Math.random() * 2) % 2 ? true : false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n children: [\n ...Array.from({ length: 3 }, (_, idx) => {\n return {\n id: '1:' + String(idx),\n name: 'subitem' + idx,\n description: 'sub items...',\n active: Math.round(Math.random() * 2) % 2 ? true : false,\n children: [],\n createdAt: Date.now(),\n updatedAt: Date.now()\n }\n })\n ],\n __collapsed__: false\n }\n })\n\n return {\n total,\n records: flattenTree(records)\n }\n}\n\nconst config = {\n list: {\n thumbnail: 'thumbnail',\n fields: ['name', 'description'],\n details: ['role', 'email']\n },\n columns: [\n {\n type: 'gutter',\n gutterName: 'dirty',\n fixed: true\n },\n {\n type: 'gutter',\n gutterName: 'sequence',\n fixed: true\n },\n {\n type: 'tree',\n name: 'name',\n label: true,\n header: 'name',\n record: {\n editable: false,\n childrenProperty: 'children'\n },\n filter: 'search',\n sortable: true,\n width: 120,\n fixed: true\n },\n {\n type: 'string',\n name: 'description',\n header: 'description',\n filter: 'search',\n record: {\n editable: true,\n align: 'left'\n },\n width: 200,\n handlers: {\n click: (columns, data, column, record, rowIndex, target) => {\n alert(`${column!.name} ${record![column!.name]}, row : ${rowIndex}`)\n }\n } as GristEventHandlerSet\n },\n {\n type: 'boolean',\n name: 'active',\n header: 'active',\n record: {\n editable: true\n },\n filter: true,\n handlers: {\n dblclick: () => {\n const grist = document.querySelector('ox-grist') as any\n console.log(grist!.dirtyRecords)\n }\n },\n sortable: true,\n width: 60\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: 'updated at',\n record: {\n editable: true,\n defaultValue: {\n name: 'now'\n }\n },\n filter: 'between',\n sortable: true,\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n },\n handlers: {\n focus: 'select-row-toggle'\n },\n classifier: function (record, rowIndex) {\n const rate = record['rate']\n const emphasized =\n rate < 10 ? ['black', 'white'] : rate < 25 ? ['yellow', 'blue'] : rate < 40 ? ['cyan', 'red'] : undefined\n return {\n emphasized\n }\n } as GristClassifier\n },\n sorters: [\n {\n name: 'name',\n desc: true\n },\n {\n name: 'email'\n }\n ],\n pagination: {\n pages: [20, 30, 50, 100, 200]\n }\n}\n\nexport default {\n title: 'tree column',\n component: 'ox-grist',\n argTypes: {\n config: { control: 'object' }\n }\n}\n\ninterface Story<T> {\n (args: T): TemplateResult\n args?: Partial<T>\n argTypes?: Record<string, unknown>\n}\n\ninterface ArgTypes {\n config: object\n}\n\nconst Template: Story<ArgTypes> = ({ config }: ArgTypes) => html` <link\n href=\"https://fonts.googleapis.com/css?family=Material+Icons&display=block\"\n rel=\"stylesheet\"\n />\n <link href=\"/themes/app-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/oops-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/grist-theme.css\" rel=\"stylesheet\" />\n\n <style>\n [slot='headroom'] {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: var(--padding-default) var(--padding-wide);\n background-color: var(--theme-white-color);\n box-shadow: var(--box-shadow);\n\n --mdc-icon-size: 24px;\n }\n #sorters mwc-icon,\n #modes mwc-icon {\n --mdc-icon-size: 18px;\n }\n #sorters {\n margin-left: auto;\n margin-right: var(--margin-default);\n padding-left: var(--padding-narrow);\n border-bottom: var(--border-dark-color);\n position: relative;\n color: var(--secondary-color);\n font-size: var(--fontsize-default);\n user-select: none;\n }\n\n #sorters > * {\n padding: var(--padding-narrow);\n vertical-align: middle;\n }\n\n #modes > * {\n padding: var(--padding-narrow);\n opacity: 0.5;\n color: var(--primary-text-color);\n cursor: pointer;\n }\n\n #modes > mwc-icon[active] {\n border-radius: 9px;\n background-color: rgba(var(--primary-color-rgb), 0.05);\n opacity: 1;\n color: var(--secondary-text-color);\n cursor: default;\n }\n\n #modes > mwc-icon:hover {\n opacity: 1;\n color: var(--secondary-text-color);\n }\n\n #add {\n width: 50px;\n text-align: right;\n }\n\n #add button {\n background-color: var(--primary-color);\n border: 0;\n border-radius: 50%;\n padding: 5px;\n width: 36px;\n height: 36px;\n cursor: pointer;\n }\n\n #add button:hover {\n background-color: var(--focus-background-color);\n box-shadow: var(--box-shadow);\n }\n\n #add button mwc-icon {\n font-size: 2em;\n color: var(--theme-white-color);\n }\n\n #filters {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n #filters * {\n margin-right: var(--margin-default);\n }\n\n @media only screen and (max-width: 460px) {\n #filters {\n flex-direction: column;\n }\n\n #modes {\n display: none;\n }\n }\n </style>\n\n <ox-grist\n mode=\"GRID\"\n .config=${config}\n .fetchHandler=${fetchHandler}\n @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}\n >\n <div slot=\"headroom\">\n <div id=\"filters\">\n <ox-filters-form autofocus></ox-filters-form>\n </div>\n\n <div id=\"sorters\">\n Sort\n <mwc-icon\n @click=${(e: Event) => {\n const target = e.currentTarget as HTMLElement\n ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({\n right: 0,\n top: target.offsetTop + target.offsetHeight\n })\n }}\n >expand_more</mwc-icon\n >\n <ox-popup id=\"sorter-control\">\n <ox-sorters-control> </ox-sorters-control>\n </ox-popup>\n </div>\n\n <ox-record-creator id=\"add\" light-popup>\n <button><mwc-icon>add</mwc-icon></button>\n </ox-record-creator>\n </div>\n </ox-grist>`\n\nexport const Regular = Template.bind({})\nRegular.args = {\n config\n}\n"]}