@operato/data-grist 7.0.24 → 7.0.26

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.
@@ -7,19 +7,34 @@ import { customElement, property } from 'lit/decorators.js'
7
7
  import { ZERO_RECORD } from '../configure/zero-config'
8
8
  import { ColumnConfig, GristRecord } from '../types'
9
9
  import { recordViewBodyClickHandler } from './event-handlers/record-view-body-click-handler'
10
- import { recordViewBodyKeydownHandler } from './event-handlers/record-view-body-keydown-handler'
11
10
 
12
11
  @customElement('ox-record-view-body')
13
12
  export class RecordViewBody extends LitElement {
14
13
  static styles = [
15
14
  css`
16
15
  :host {
16
+ display: block;
17
+ font-size: 16px; /* for ios safari */
18
+ place-content: center;
19
+ }
20
+
21
+ div[content] {
17
22
  display: grid;
18
- grid-template-columns: 2fr 3fr 2fr 3fr;
23
+ grid-template-columns: 1fr 2fr;
19
24
  grid-auto-rows: min-content;
20
- grid-gap: var(--record-view-gap);
21
- padding: var(--record-view-padding);
22
- font-size: 16px; /* for ios safari */
25
+ grid-gap: var(--record-view-gap, 16px);
26
+ padding: var(--record-view-padding, 16px);
27
+ box-sizing: border-box;
28
+ }
29
+
30
+ @media screen and (min-width: 601px) {
31
+ ox-grid-field {
32
+ max-width: 300px;
33
+ }
34
+
35
+ div[content] {
36
+ grid-template-columns: 1fr 1fr;
37
+ }
23
38
  }
24
39
 
25
40
  label {
@@ -31,6 +46,7 @@ export class RecordViewBody extends LitElement {
31
46
  font: var(--record-view-label-font);
32
47
  color: var(--record-view-label-color);
33
48
  text-align: right;
49
+ padding-right: var(--spacing-large);
34
50
  }
35
51
 
36
52
  label md-icon {
@@ -65,18 +81,6 @@ export class RecordViewBody extends LitElement {
65
81
  color: var(--record-view-focus-color);
66
82
  font-weight: bold;
67
83
  }
68
-
69
- @media only screen and (max-width: 800px) {
70
- :host {
71
- grid-template-columns: 2fr 3fr;
72
- }
73
- }
74
-
75
- @media (min-width: 1800px) {
76
- :host {
77
- grid-template-columns: 2fr 3fr 2fr 3fr 2fr 3fr;
78
- }
79
- }
80
84
  `
81
85
  ]
82
86
 
@@ -91,37 +95,62 @@ export class RecordViewBody extends LitElement {
91
95
 
92
96
  this.setAttribute('tabindex', '0')
93
97
 
94
- this.renderRoot.addEventListener('keydown', recordViewBodyKeydownHandler.bind(this))
98
+ this.addEventListener('keydown', this._onKeyDown)
95
99
  this.renderRoot.addEventListener('click', recordViewBodyClickHandler.bind(this))
96
100
  }
97
101
 
102
+ disconnectedCallback() {
103
+ super.disconnectedCallback()
104
+ this.removeEventListener('keydown', this._onKeyDown)
105
+ }
106
+
107
+ _onKeyDown(event: KeyboardEvent) {
108
+ if (event.key === 'Tab') {
109
+ const fields = Array.from(this.renderRoot.querySelectorAll('ox-grid-field[tabstop]'))
110
+ const focused = this.renderRoot.querySelector('ox-grid-field[editing]')
111
+ const focusedIndex = fields.findIndex(field => field === focused)
112
+
113
+ let nextIndex = focusedIndex + (event.shiftKey ? -1 : 1)
114
+
115
+ if (nextIndex >= fields.length || nextIndex < 0) {
116
+ return // Let the default behavior happen if it's the last or first element
117
+ }
118
+
119
+ event.preventDefault()
120
+ fields[nextIndex]?.dispatchEvent(new CustomEvent('click', { bubbles: true, composed: true }))
121
+ }
122
+ }
123
+
98
124
  render() {
99
125
  var columns = this.columns.filter(column => !column.hidden && column.type !== 'gutter')
100
126
  var record = this.record
101
127
  var rowIndex = this.rowIndex
102
128
 
103
129
  return html`
104
- ${columns.map(column => {
105
- let { editable, mandatory } = column.record
106
- if (typeof editable === 'function') {
107
- editable = editable.call(this, record[column.name], column, record, rowIndex, this)
108
- }
109
-
110
- let dirtyFields = record['__dirtyfields__'] || {}
111
-
112
- return html`
113
- <label ?editable=${editable}
114
- ><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <md-icon>edit</md-icon></label
115
- >
116
- <ox-grid-field
117
- .rowIndex=${rowIndex}
118
- .column=${column}
119
- .record=${record}
120
- .value=${record[column.name]}
121
- ?dirty=${!!dirtyFields[column.name]}
122
- ></ox-grid-field>
123
- `
124
- })}
130
+ <div content>
131
+ ${columns.map((column, index) => {
132
+ let { editable, mandatory } = column.record
133
+ if (typeof editable === 'function') {
134
+ editable = editable.call(this, record[column.name], column, record, rowIndex, this)
135
+ }
136
+
137
+ let dirtyFields = record['__dirtyfields__'] || {}
138
+
139
+ return html`
140
+ <label ?editable=${editable}
141
+ ><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <md-icon>edit</md-icon></label
142
+ >
143
+ <ox-grid-field
144
+ .rowIndex=${rowIndex}
145
+ .column=${column}
146
+ .record=${record}
147
+ .value=${record[column.name]}
148
+ ?dirty=${!!dirtyFields[column.name]}
149
+ ?tabstop=${!!editable}
150
+ ></ox-grid-field>
151
+ `
152
+ })}
153
+ </div>
125
154
  `
126
155
  }
127
156