@operato/data-grist 2.0.0-alpha.114 → 2.0.0-alpha.116

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/src/data-grist.ts CHANGED
@@ -170,7 +170,7 @@ export class DataGrist extends LitElement implements DataConsumer {
170
170
  */
171
171
  @property({ type: Boolean, attribute: 'url-params-sensitive' }) urlParamsSensitive?: boolean
172
172
 
173
- @property({ type: Object }) personalSetting?: {
173
+ @property({ type: Object }) personalConfig?: {
174
174
  columns?: Partial<ColumnConfig>[]
175
175
  [key: string]: any
176
176
  }
@@ -309,8 +309,8 @@ export class DataGrist extends LitElement implements DataConsumer {
309
309
  const config = this.config
310
310
  const { columns } = config
311
311
 
312
- if (this.personalSetting) {
313
- const { columns: personalColumns } = this.personalSetting
312
+ if (this.personalConfig) {
313
+ const { columns: personalColumns } = this.personalConfig
314
314
 
315
315
  if (personalColumns) {
316
316
  config.columns = columns.map((column: Partial<ColumnConfig>) => {
@@ -552,7 +552,7 @@ export class DataGrist extends LitElement implements DataConsumer {
552
552
  await this.requestUpdate()
553
553
  }
554
554
 
555
- if (changes.has('config')) {
555
+ if (changes.has('config') || changes.has('personalConfig')) {
556
556
  this.applyUpdatedConfiguration()
557
557
  }
558
558
 
@@ -0,0 +1,138 @@
1
+ import '@material/web/icon/icon.js'
2
+
3
+ import { css, html, LitElement } from 'lit'
4
+ import { customElement, property, state } from 'lit/decorators.js'
5
+
6
+ import { OxPopupList } from '@operato/popup'
7
+
8
+ import { ColumnConfig, GristConfig } from '../types'
9
+ import { DataGrist } from '../data-grist'
10
+
11
+ export type PersonalPagePreference = {
12
+ columns?: Partial<ColumnConfig>[]
13
+ [key: string]: any
14
+ }
15
+
16
+ @customElement('ox-grist-personalizer')
17
+ export class OxGristPersonalizer extends LitElement {
18
+ static styles = [
19
+ css`
20
+ md-icon {
21
+ --md-icon-size: 14px;
22
+ width: 16px;
23
+ height: 16px;
24
+ background-color: rgba(var(--secondary-color-rgb), 0.6);
25
+ color: var(--primary-color);
26
+ border-radius: 0px 0px 7px 7px;
27
+ cursor: pointer;
28
+
29
+ &:hover {
30
+ color: var(--theme-white-color);
31
+ }
32
+ }
33
+ `
34
+ ]
35
+
36
+ @property({ type: String }) page!: string
37
+ @property({ type: String }) element!: string
38
+ @property({ type: Object }) saveCallback?: (
39
+ page: string,
40
+ element: string,
41
+ preference?: PersonalPagePreference
42
+ ) => void
43
+
44
+ @state() private preference?: PersonalPagePreference
45
+
46
+ render() {
47
+ return html`
48
+ <md-icon
49
+ @click=${(e: MouseEvent) => {
50
+ const grist = this.closest('ox-grist') as DataGrist
51
+
52
+ const { compiledConfig: config } = grist
53
+ const columns = (config as GristConfig).columns.filter(
54
+ column => column.name && column.type !== 'gutter' && column.name != 'id'
55
+ )
56
+
57
+ this.preference = columns.map(column => {
58
+ return {
59
+ name: column.name,
60
+ hidden: column.hidden,
61
+ width: column.width
62
+ }
63
+ })
64
+
65
+ const template = html`
66
+ <div class="personalizer-header" slot="header">
67
+ select to show<md-icon
68
+ style="margin-left: auto;"
69
+ @click=${(e: MouseEvent) => {
70
+ this.dispatchEvent(
71
+ new CustomEvent('save', {
72
+ detail: {
73
+ page: this.page,
74
+ element: this.element,
75
+ preference: this.preference
76
+ }
77
+ })
78
+ )
79
+ ;((e.target as HTMLElement).closest('ox-popup-list') as OxPopupList)?.close()
80
+ }}
81
+ >save</md-icon
82
+ >
83
+ </div>
84
+
85
+ ${columns.map(
86
+ column =>
87
+ html`<ox-checkbox label="checkbox" ?checked=${!column.hidden} value=${column.name} option />${column.name}</ox-checkbox>`
88
+ )}
89
+ `
90
+
91
+ const popup = OxPopupList.open({
92
+ template,
93
+ multiple: true,
94
+ attrSelected: 'checked',
95
+ top: e.pageY,
96
+ left: e.pageX,
97
+ styles: css`
98
+ :host {
99
+ width: 200px;
100
+ max-height: 300px;
101
+ overflow: scroll;
102
+ }
103
+
104
+ ::slotted(.personalizer-header) {
105
+ --md-icon-size: 1.2em;
106
+
107
+ display: flex;
108
+ flex-direction: row;
109
+ align-items: center;
110
+ text-transform: capitalize;
111
+ }
112
+ `
113
+ })
114
+
115
+ popup.onselect = (e: Event) => {
116
+ const selected = (e as CustomEvent).detail
117
+
118
+ const pconfig: PersonalPagePreference = grist.personalConfig || {}
119
+ pconfig.columns = columns.map(column => {
120
+ return {
121
+ name: column.name,
122
+ hidden: selected.indexOf(column.name) == -1,
123
+ width: column.width
124
+ }
125
+ })
126
+
127
+ this.preference = pconfig
128
+
129
+ grist.personalConfig = this.preference
130
+
131
+ grist.applyUpdatedConfiguration()
132
+ }
133
+ }}
134
+ >settings</md-icon
135
+ >
136
+ `
137
+ }
138
+ }
@@ -1,9 +1,11 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/popup/ox-popup-list.js'
3
+
1
4
  import '../src/index.js'
2
5
  import '../src/filters/filters-form.js'
3
6
  import '../src/sorters/sorters-control.js'
4
7
  import '../src/record-view/record-creator.js'
5
- import '@operato/popup/ox-popup-list.js'
6
- import '@material/web/icon/icon.js'
8
+ import '../src/personalizer/ox-grist-personalizer.js'
7
9
 
8
10
  import { html, TemplateResult } from 'lit'
9
11
 
@@ -382,47 +384,11 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
382
384
  ${CommonGristStyles.cssText} ${CommonHeaderStyles.cssText}
383
385
  </style>
384
386
 
385
- <style>
386
- ox-popup-list {
387
- width: 200px;
388
- max-height: 300px;
389
- overflow: scroll;
390
- }
391
-
392
- [slot='setting'] {
393
- --md-icon-size: 14px;
394
- width: 16px;
395
- height: 16px;
396
- background-color: rgba(var(--secondary-color-rgb), 0.6);
397
- border-radius: 0px 0px 7px 7px;
398
- color: var(--theme-white-color);
399
- cursor: pointer;
400
- }
401
-
402
- [slot='setting']:hover {
403
- color: var(--primary-color);
404
- }
405
-
406
- ox-popup-list {
407
- .header {
408
- display: flex;
409
- flex-direction: row;
410
- align-items: center;
411
- text-transform: capitalize;
412
- }
413
-
414
- .header md-icon {
415
- --md-icon-size: 1.2em;
416
- margin-left: auto;
417
- }
418
- }
419
- </style>
420
-
421
387
  <ox-grist
422
388
  .mode=${mode}
423
389
  .config=${config}
424
390
  .fetchHandler=${fetchHandler}
425
- .personalSetting=${{
391
+ .personalConfig=${{
426
392
  columns: [{ name: 'description', hidden: true }]
427
393
  }}
428
394
  ?url-params-sensitive=${urlParamsSensitive}
@@ -461,57 +427,15 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
461
427
  </ox-record-creator>
462
428
  </div>
463
429
 
464
- <md-icon
465
- title="personal setting"
430
+ <ox-grist-personalizer
431
+ page="sample-page"
432
+ element="sample-element"
466
433
  slot="setting"
467
- @click=${(e: MouseEvent) => {
468
- const grist = (e.target as HTMLElement).closest('ox-grist') as DataGrist
469
-
470
- const { compiledConfig: config } = grist
471
- const columns = (config as GristConfig).columns.filter(
472
- column => column.name && column.type !== 'gutter' && column.name != 'id'
473
- )
474
-
475
- const template = html`
476
- <div class="header">
477
- select to show<md-icon
478
- @click=${(e: MouseEvent) =>
479
- ((e.target as HTMLElement).closest('ox-popup-list') as OxPopupList)?.close()}
480
- >save</md-icon
481
- >
482
- </div>
483
- ${columns.map(
484
- column =>
485
- html`<ox-checkbox label="checkbox" ?checked=${!column.hidden} value=${column.name} option />${column.name}</ox-checkbox>`
486
- )}
487
- `
488
-
489
- const popup = OxPopupList.open({
490
- template,
491
- multiple: true,
492
- attrSelected: 'checked',
493
- top: e.pageY,
494
- left: e.pageX
495
- })
496
-
497
- popup.onselect = (e: Event) => {
498
- console.log('select', e.target, (e as CustomEvent).detail, (e.target as OxPopupList).value)
499
- const selected = (e as CustomEvent).detail
500
-
501
- const pconfig = grist.personalSetting || {}
502
- pconfig.columns = columns.map(column => {
503
- return {
504
- name: column.name,
505
- hidden: selected.indexOf(column.name) == -1
506
- }
507
- })
508
- grist.personalSetting = pconfig
509
-
510
- grist.applyUpdatedConfiguration()
511
- }
434
+ @save=${(e: CustomEvent) => {
435
+ const { page, element, preference } = e.detail as any
436
+ console.log(page, element, preference)
512
437
  }}
513
- >tune</md-icon
514
- >
438
+ ></ox-grist-personalizer>
515
439
  </ox-grist>`
516
440
 
517
441
  export const Regular = Template.bind({})