@operato/data-grist 7.0.43 → 7.0.45

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 (43) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/data-card/data-card-gutter.js +49 -22
  3. package/dist/src/data-card/data-card-gutter.js.map +1 -1
  4. package/dist/src/data-card/data-card.js +4 -3
  5. package/dist/src/data-card/data-card.js.map +1 -1
  6. package/dist/src/data-card/record-card.js +23 -52
  7. package/dist/src/data-card/record-card.js.map +1 -1
  8. package/dist/src/data-grid/data-grid-field.js +38 -1
  9. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  10. package/dist/src/data-list/data-list-gutter.js +26 -1
  11. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  12. package/dist/src/gutters/gutter-button.d.ts +18 -1
  13. package/dist/src/gutters/gutter-button.js +9 -8
  14. package/dist/src/gutters/gutter-button.js.map +1 -1
  15. package/dist/src/gutters/gutter-dirty.d.ts +3 -3
  16. package/dist/src/gutters/gutter-dirty.js +2 -2
  17. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  18. package/dist/src/gutters/gutter-row-selector.d.ts +19 -1
  19. package/dist/src/gutters/gutter-row-selector.js +3 -3
  20. package/dist/src/gutters/gutter-row-selector.js.map +1 -1
  21. package/dist/src/gutters/gutter-sequence.d.ts +33 -1
  22. package/dist/src/gutters/gutter-sequence.js +1 -1
  23. package/dist/src/gutters/gutter-sequence.js.map +1 -1
  24. package/dist/src/types.d.ts +6 -0
  25. package/dist/src/types.js.map +1 -1
  26. package/dist/stories/grid-setting.stories.js +2 -1
  27. package/dist/stories/grid-setting.stories.js.map +1 -1
  28. package/dist/stories/grist-modes.stories.js +8 -3
  29. package/dist/stories/grist-modes.stories.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +3 -3
  32. package/src/data-card/data-card-gutter.ts +49 -23
  33. package/src/data-card/data-card.ts +4 -3
  34. package/src/data-card/record-card.ts +23 -52
  35. package/src/data-grid/data-grid-field.ts +38 -1
  36. package/src/data-list/data-list-gutter.ts +26 -1
  37. package/src/gutters/gutter-button.ts +10 -10
  38. package/src/gutters/gutter-dirty.ts +3 -3
  39. package/src/gutters/gutter-row-selector.ts +4 -4
  40. package/src/gutters/gutter-sequence.ts +2 -2
  41. package/src/types.ts +6 -0
  42. package/stories/grid-setting.stories.ts +2 -1
  43. package/stories/grist-modes.stories.ts +8 -3
@@ -4,38 +4,61 @@ import { customElement, property } from 'lit/decorators.js'
4
4
  import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
5
5
  import { ColumnConfig, GristRecord } from '../types'
6
6
 
7
- const DEFAULT_TEXT_ALIGN = 'left'
8
-
9
7
  @customElement('ox-card-gutter')
10
8
  export class DataCardGutter extends LitElement {
11
9
  static styles = [
12
10
  css`
13
11
  :host {
12
+ display: flex;
14
13
  background-color: transparent;
15
14
  align-content: center;
16
- font-size: var(--grid-record-wide-fontsize);
15
+ align-items: center;
17
16
  text-overflow: ellipsis;
18
- color: var(--grid-record-color);
17
+ }
18
+
19
+ :host([row-selector]) {
20
+ margin-right: auto;
19
21
  }
20
22
 
21
23
  * {
22
- flex: 1;
23
- margin: var(--spacing-tiny);
24
- border: var(--data-card-item-btn-border);
25
- border-radius: var(--data-card-item-btn-border-radius);
26
- padding: var(--data-card-item-btn-padding);
27
- font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
24
+ border: 0;
25
+ font-size: var(--md-sys-typescale-label-medium-size, 0.8rem);
26
+ line-height: var(--md-sys-typescale-label-medium-size, 0.8rem);
27
+
28
+ color: var(--md-sys-color-on-primary);
29
+ background-color: var(--md-sys-color-primary);
30
+ border-radius: var(--data-card-item-btn-border-radius, var(--md-sys-shape-corner-tiny));
31
+
32
+ padding: var(--spacing-small);
28
33
  }
29
34
 
30
35
  *:hover {
31
36
  cursor: pointer;
32
- background-color: var(--md-sys-color-primary);
37
+ background-color: var(--md-sys-color-secondary);
38
+ color: var(--md-sys-color-on-secondary);
39
+ }
40
+
41
+ :host([danger]) button {
42
+ background-color: var(--md-sys-color-error);
33
43
  color: var(--md-sys-color-on-primary);
34
44
  }
35
45
 
36
- *[center] {
37
- flex: none;
38
- margin: var(--spacing-none) auto;
46
+ :host([danger]) button:hover {
47
+ background-color: var(--md-sys-color-secondary);
48
+ color: var(--md-sys-color-on-secondary);
49
+ }
50
+
51
+ button {
52
+ display: flex;
53
+ gap: var(--spacing-small);
54
+ border: 0;
55
+ align-items: center;
56
+ }
57
+
58
+ button md-icon {
59
+ border: 0;
60
+ padding: 0;
61
+ background-color: unset;
39
62
  }
40
63
  `
41
64
  ]
@@ -60,15 +83,18 @@ export class DataCardGutter extends LitElement {
60
83
 
61
84
  updated(changes: PropertyValues<this>) {
62
85
  if (changes.has('column')) {
63
- var align = this.column.record.align || DEFAULT_TEXT_ALIGN
64
- if (align != DEFAULT_TEXT_ALIGN) {
65
- let justify = 'center'
66
- switch (align) {
67
- case 'right':
68
- justify = 'flex-end'
69
- break
70
- }
71
- this.style.setProperty('--data-card-gutter-justify-content', justify)
86
+ const { gutterName, danger } = this.column
87
+
88
+ if (gutterName == 'row-selector') {
89
+ this.setAttribute('row-selector', '')
90
+ } else {
91
+ this.removeAttribute('row-selector')
92
+ }
93
+
94
+ if (danger) {
95
+ this.setAttribute('danger', '')
96
+ } else {
97
+ this.removeAttribute('danger')
72
98
  }
73
99
  }
74
100
  }
@@ -17,7 +17,7 @@ export class DataCard extends DataManipulator {
17
17
  padding: var(--spacing-medium);
18
18
 
19
19
  display: grid;
20
- grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
20
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
21
21
  grid-template-rows: min-content;
22
22
  grid-gap: var(--spacing-large);
23
23
  }
@@ -50,8 +50,8 @@ export class DataCard extends DataManipulator {
50
50
  transform: translate(-50%, -50%);
51
51
  }
52
52
 
53
- ox-record-card[emphasized-row],
54
- ox-record-card[emphasized-row][focused] {
53
+ [card][emphasized-row],
54
+ [card][emphasized-row][focused] {
55
55
  background-color: var(--grid-record-emphasized-background-color);
56
56
  color: var(--grid-record-emphasized-color);
57
57
  }
@@ -131,6 +131,7 @@ export class DataCard extends DataManipulator {
131
131
  .emphasized=${emphasized}
132
132
  ?selected-row=${record['__selected__']}
133
133
  ?dirty=${record['__dirty__']}
134
+ card
134
135
  ></ox-record-card>
135
136
  `
136
137
  })}
@@ -40,6 +40,7 @@ export class RecordCard extends LitElement {
40
40
  border-radius: var(--data-card-record-card-border-radius);
41
41
  border: var(--data-card-record-card-border);
42
42
  height: min-content;
43
+ padding: var(--spacing-small) var(--spacing-none);
43
44
  }
44
45
 
45
46
  :host(:hover) {
@@ -78,21 +79,16 @@ export class RecordCard extends LitElement {
78
79
  }
79
80
 
80
81
  [thumbnail] {
81
- width: 100%;
82
82
  height: var(--data-card-thumbnail-height);
83
83
  border-top-left-radius: var(--data-card-record-card-border-radius);
84
84
  border-top-right-radius: var(--data-card-record-card-border-radius);
85
85
  overflow: hidden;
86
- margin-top: var(--spacing-medium);
87
86
  }
88
87
 
89
88
  [content] {
90
- display: grid;
91
- gap: var(--spacing-tiny) var(--spacing-medium);
92
- grid-template:
93
- 'brief gutters'
94
- 'detail detail';
95
- grid-template-columns: 1fr 35px;
89
+ display: flex;
90
+ flex-direction: column;
91
+ gap: var(--spacing-tiny);
96
92
  margin: var(--data-card-item-margin);
97
93
  }
98
94
 
@@ -100,20 +96,16 @@ export class RecordCard extends LitElement {
100
96
  display: flex;
101
97
  flex-direction: column;
102
98
  gap: var(--spacing-tiny);
103
- grid-area: brief;
104
99
  overflow: hidden;
105
100
  }
106
101
 
107
102
  [gutters] {
108
- grid-area: gutters;
109
- }
110
-
111
- [detail] {
112
- grid-area: detail;
113
- }
114
-
115
- ox-card-gutter {
116
- flex: 0 0 14px;
103
+ display: flex;
104
+ flex-direction: row;
105
+ gap: var(--spacing-small);
106
+ margin: var(--spacing-small) var(--spacing-medium);
107
+ justify-content: end;
108
+ align-items: stretch;
117
109
  }
118
110
 
119
111
  ox-card-field {
@@ -194,7 +186,6 @@ export class RecordCard extends LitElement {
194
186
  const thumbnailColumn = thumbnail ? columns.find(column => column.name == thumbnail) : undefined
195
187
 
196
188
  const gutters = (columns || []).filter(column => column.type == 'gutter' && column.forList)
197
- const firstGutter = gutters[0]
198
189
 
199
190
  if (this.hasAttribute('dirty')) {
200
191
  var dirtyIcon
@@ -225,39 +216,6 @@ export class RecordCard extends LitElement {
225
216
  : html``}
226
217
 
227
218
  <div content>
228
- <div gutters>
229
- ${firstGutter
230
- ? html`
231
- <ox-card-gutter
232
- .rowIndex=${rowIndex}
233
- .column=${firstGutter}
234
- .record=${record}
235
- .value=${record[firstGutter.name]}
236
- ></ox-card-gutter>
237
- `
238
- : html``}
239
- ${gutters.length === 2
240
- ? html`
241
- <ox-card-gutter
242
- .rowIndex=${rowIndex}
243
- .column=${gutters[1]}
244
- .record=${record}
245
- .value=${record[gutters[1].name]}
246
- ></ox-card-gutter>
247
- `
248
- : gutters.length > 2
249
- ? html`
250
- <ox-card-gutter-menu
251
- .gutters=${gutters}
252
- .rowIndex=${rowIndex}
253
- .record=${record}
254
- .clickHandler=${this.clickHandler}
255
- .dblclickHandler=${this.dblclickHandler}
256
- ></ox-card-gutter-menu>
257
- `
258
- : html``}
259
- </div>
260
-
261
219
  <div brief>
262
220
  ${briefFields.map(
263
221
  (column, idx) => html`
@@ -289,6 +247,19 @@ export class RecordCard extends LitElement {
289
247
  `
290
248
  : html``}
291
249
  </div>
250
+
251
+ <div gutters>
252
+ ${gutters.map(gutter => {
253
+ return html`
254
+ <ox-card-gutter
255
+ .rowIndex=${rowIndex}
256
+ .column=${gutter}
257
+ .record=${record}
258
+ .value=${record[gutter.name]}
259
+ ></ox-card-gutter>
260
+ `
261
+ })}
262
+ </div>
292
263
  `
293
264
  }
294
265
 
@@ -39,7 +39,6 @@ export class DataGridField extends LitElement {
39
39
 
40
40
  :host([gutter]) * {
41
41
  cursor: default;
42
- font-size:1.2em;
43
42
  }
44
43
 
45
44
  :host([editing]) {
@@ -79,6 +78,37 @@ export class DataGridField extends LitElement {
79
78
  flex: none;
80
79
  margin: 0 auto;
81
80
  }
81
+
82
+ :host > button {
83
+ display: flex;
84
+ gap: var(--spacing-small);
85
+ border: 0;
86
+ align-items: center;
87
+ padding: var(--spacing-small);
88
+
89
+ color: var(--md-sys-color-on-primary);
90
+ background-color: var(--md-sys-color-primary);
91
+ border-radius: var(--data-card-item-btn-border-radius, var(--md-sys-shape-corner-tiny));
92
+
93
+ font-size: 0.8rem;
94
+ line-height: 0.8rem;
95
+
96
+ md-icon {
97
+ border: 0;
98
+ padding: 0;
99
+ background-color: unset;
100
+ }
101
+ }
102
+
103
+ :host([danger]) > button {
104
+ background-color: var(--md-sys-color-error);
105
+ color: var(--md-sys-color-on-primary);
106
+ }
107
+
108
+ :host([danger]) > button:hover {
109
+ background-color: var(--md-sys-color-secondary);
110
+ color: var(--md-sys-color-on-secondary);
111
+ }
82
112
  `
83
113
  ]
84
114
 
@@ -154,6 +184,13 @@ export class DataGridField extends LitElement {
154
184
  this.style.setProperty('--data-grid-field-justify-content', justify)
155
185
  this.style.setProperty('--data-grid-field-text-align', align)
156
186
  }
187
+
188
+ const { danger } = this.column
189
+ if (danger) {
190
+ this.setAttribute('danger', '')
191
+ } else {
192
+ this.removeAttribute('danger')
193
+ }
157
194
  }
158
195
 
159
196
  if (changes.has('fixed')) {
@@ -38,13 +38,31 @@ export class DataListGutter extends LitElement {
38
38
 
39
39
  * {
40
40
  flex: 1;
41
- margin: var(--spacing-none);
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);
42
47
  }
43
48
 
44
49
  *[center] {
45
50
  flex: none;
46
51
  margin: var(--spacing-none) auto;
47
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
+ }
48
66
  `
49
67
  ]
50
68
 
@@ -78,6 +96,13 @@ export class DataListGutter extends LitElement {
78
96
  }
79
97
  this.style.setProperty('--data-list-gutter-justify-content', justify)
80
98
  }
99
+
100
+ const { danger } = this.column
101
+ if (danger) {
102
+ this.setAttribute('danger', '')
103
+ } else {
104
+ this.removeAttribute('danger')
105
+ }
81
106
  }
82
107
  }
83
108
  }
@@ -1,35 +1,35 @@
1
1
  import '@material/web/icon/icon.js'
2
2
 
3
3
  import { html } from 'lit'
4
+ import { ifDefined } from 'lit/directives/if-defined.js'
4
5
 
5
- import { FieldRenderer, HeaderRenderer } from '../types'
6
+ import { ColumnConfig, FieldRenderer, GristRecord, HeaderRenderer } from '../types'
6
7
 
7
8
  export class GutterButton {
8
- static instance(config: any = {}) {
9
- var { icon = 'edit', title } = config
9
+ static instance(config: Partial<ColumnConfig> = { type: 'gutter', gutterName: 'button' }) {
10
+ var { icon = 'edit', title, iconOnly = true } = config
10
11
 
11
- var iconFn = typeof icon == 'function' ? icon : () => icon
12
-
13
- var inlineHeaderStyle = 'margin-top:1px;'
14
- var inlineRecordStyle = 'margin-top:1px;'
12
+ var iconFn = typeof icon == 'function' ? icon : (record?: GristRecord) => icon
15
13
 
16
14
  return Object.assign(
17
15
  {},
18
16
  {
19
17
  type: 'gutter',
20
- gutterType: 'button',
18
+ gutterName: 'button',
21
19
  width: 26,
22
20
  resizable: false,
23
21
  sortable: false,
24
22
  header: {
25
23
  renderer: function (column) {
26
- return html` <md-icon style=${inlineHeaderStyle} title=${title}>${iconFn()}</md-icon> `
24
+ return iconOnly ? html` <md-icon title=${ifDefined(title)}>${iconFn()}</md-icon> ` : title
27
25
  } as HeaderRenderer
28
26
  },
29
27
  record: {
30
28
  align: 'center',
31
29
  renderer: function (value, column, record, rowIndex, field) {
32
- return html` <md-icon style=${inlineRecordStyle} title=${title}>${iconFn(record)}</md-icon> `
30
+ return iconOnly
31
+ ? html` <md-icon title=${ifDefined(title)}>${iconFn(record)}</md-icon> `
32
+ : html`<button><md-icon>${iconFn()}</md-icon>${title}</button>`
33
33
  } as FieldRenderer
34
34
  },
35
35
  forGrid: true,
@@ -50,16 +50,16 @@ class GutterDirtyElement extends LitElement {
50
50
  }
51
51
 
52
52
  const INLINESTYLE =
53
- 'font-size: var(--grid-record-fontsize);vertical-align: middle; color: var(--grid-record-dirty-color)'
53
+ 'font-size: var(--grid-record-fontsize); vertical-align: middle; color: var(--grid-record-dirty-color)'
54
54
 
55
55
  export class GutterDirty {
56
- static instance(config: ColumnConfig = { type: 'gutter', name: '__dirty__' } as any) {
56
+ static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__dirty__' }) {
57
57
  return Object.assign(
58
58
  {},
59
59
  {
60
60
  type: 'gutter',
61
61
  name: '__dirty__',
62
- gutterType: 'dirty',
62
+ gutterName: 'dirty',
63
63
  width: 30,
64
64
  resizable: false,
65
65
  sortable: false,
@@ -3,16 +3,16 @@ import { html } from 'lit'
3
3
  import { DataCard } from '../data-card/data-card'
4
4
  import { DataGrid } from '../data-grid/data-grid'
5
5
  import { DataList } from '../data-list/data-list'
6
- import { FieldRenderer, HeaderRenderer } from '../types'
6
+ import { ColumnConfig, FieldRenderer, HeaderRenderer } from '../types'
7
7
 
8
8
  export class GutterRowSelector {
9
- static instance(config = {} as any) {
9
+ static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__selected__' }) {
10
10
  return Object.assign(
11
11
  {},
12
12
  {
13
13
  type: 'gutter',
14
14
  name: '__selected__',
15
- gutterType: 'row-selector',
15
+ gutterName: 'row-selector',
16
16
  width: 30,
17
17
  resizable: false,
18
18
  sortable: false,
@@ -23,7 +23,7 @@ export class GutterRowSelector {
23
23
  return html`
24
24
  <input
25
25
  type="checkbox"
26
- .checked=${checked}
26
+ .checked=${!!checked}
27
27
  @change=${(e: Event) => {
28
28
  let selected = column.multiple ? (e.target as HTMLInputElement).checked : false
29
29
 
@@ -1,10 +1,10 @@
1
1
  import { DataCard } from '../data-card/data-card'
2
2
  import { DataGrid } from '../data-grid/data-grid'
3
3
  import { DataList } from '../data-list/data-list'
4
- import { ColumnWidthCallback, FieldRenderer, GristEventHandler } from '../types'
4
+ import { ColumnConfig, ColumnWidthCallback, FieldRenderer, GristEventHandler } from '../types'
5
5
 
6
6
  export class GutterSequence {
7
- static instance(config = {} as any) {
7
+ static instance(config: Partial<ColumnConfig> = { type: 'gutter', name: '__seq__' }) {
8
8
  return {
9
9
  type: 'gutter',
10
10
  name: '__seq__',
package/src/types.ts CHANGED
@@ -344,7 +344,13 @@ export type ColumnConfig = {
344
344
  * 또한 Gutter 열은 행을 선택하거나 행의 상태를 나타내는 체크박스를 포함할 수도 있습니다.
345
345
  */
346
346
  gutterName?: 'button' | 'sequence' | 'row-selector' | 'dirty'
347
+ title?: string
347
348
  fixed?: boolean
349
+ /** [begin] only for button gutter column */
350
+ icon?: string
351
+ iconOnly?: boolean
352
+ danger?: boolean
353
+ /** [end] only for button gutter column */
348
354
  header: HeaderConfig
349
355
  record: RecordConfig
350
356
  handlers: GristEventHandlerSet
@@ -390,6 +390,7 @@ const Template: Story<ArgTypes> = ({
390
390
  <link href="/themes/light.css" rel="stylesheet" />
391
391
  <link href="/themes/dark.css" rel="stylesheet" />
392
392
  <link href="/themes/spacing.css" rel="stylesheet" />
393
+ <link href="/themes/material-theme.css" rel="stylesheet" />
393
394
  <link href="/themes/grist-theme.css" rel="stylesheet" />
394
395
 
395
396
  <link
@@ -416,7 +417,7 @@ const Template: Story<ArgTypes> = ({
416
417
 
417
418
  <style>
418
419
  ox-grist {
419
- height: 600px;
420
+ flex: 1;
420
421
  }
421
422
 
422
423
  ox-filters-form {
@@ -100,7 +100,9 @@ const config = {
100
100
  type: 'gutter',
101
101
  gutterName: 'button',
102
102
  icon: 'edit',
103
- title: 'edit',
103
+ iconOnly: false,
104
+ title: '수정편집',
105
+ width: 120,
104
106
  handlers: {
105
107
  click: function () {
106
108
  console.log('clicked')
@@ -111,7 +113,9 @@ const config = {
111
113
  type: 'gutter',
112
114
  gutterName: 'button',
113
115
  icon: 'add',
114
- title: 'add',
116
+ iconOnly: false,
117
+ title: '행추가',
118
+ width: 120,
115
119
  handlers: {
116
120
  click: 'record-copy'
117
121
  }
@@ -362,6 +366,7 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
362
366
  <link href="/themes/light.css" rel="stylesheet" />
363
367
  <link href="/themes/dark.css" rel="stylesheet" />
364
368
  <link href="/themes/spacing.css" rel="stylesheet" />
369
+ <link href="/themes/material-theme.css" rel="stylesheet" />
365
370
  <link href="/themes/grist-theme.css" rel="stylesheet" />
366
371
 
367
372
  <link
@@ -388,7 +393,7 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
388
393
 
389
394
  <style>
390
395
  ox-grist {
391
- height: 600px;
396
+ flex: 1;
392
397
  }
393
398
 
394
399
  ox-filters-form {