@operato/data-grist 0.3.8 → 0.3.15

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 (99) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/assets/images/no-image.png +0 -0
  3. package/custom-elements.json +25 -14
  4. package/demo/index.html +19 -8
  5. package/dist/src/configure/list-option-builder.js +0 -2
  6. package/dist/src/configure/list-option-builder.js.map +1 -1
  7. package/dist/src/configure/zero-config.d.ts +0 -1
  8. package/dist/src/configure/zero-config.js +0 -2
  9. package/dist/src/configure/zero-config.js.map +1 -1
  10. package/dist/src/data-card/data-card.js +1 -0
  11. package/dist/src/data-card/data-card.js.map +1 -1
  12. package/dist/src/data-card/event-handlers/data-card-click-handler.d.ts +6 -0
  13. package/dist/src/data-card/event-handlers/data-card-click-handler.js +16 -0
  14. package/dist/src/data-card/event-handlers/data-card-click-handler.js.map +1 -0
  15. package/dist/src/data-card/event-handlers/data-card-dblclick-handler.d.ts +6 -0
  16. package/dist/src/data-card/event-handlers/data-card-dblclick-handler.js +16 -0
  17. package/dist/src/data-card/event-handlers/data-card-dblclick-handler.js.map +1 -0
  18. package/dist/src/data-card/record-card.js +16 -10
  19. package/dist/src/data-card/record-card.js.map +1 -1
  20. package/dist/src/data-grid/data-grid-field.d.ts +1 -1
  21. package/dist/src/data-grid/data-grid-field.js +3 -1
  22. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  23. package/dist/src/data-grist.js +1 -1
  24. package/dist/src/data-grist.js.map +1 -1
  25. package/dist/src/data-list/data-list.js +1 -0
  26. package/dist/src/data-list/data-list.js.map +1 -1
  27. package/dist/src/data-list/event-handlers/data-list-click-handler.d.ts +6 -0
  28. package/dist/src/data-list/event-handlers/data-list-click-handler.js +16 -0
  29. package/dist/src/data-list/event-handlers/data-list-click-handler.js.map +1 -0
  30. package/dist/src/data-list/event-handlers/data-list-dblclick-handler.d.ts +6 -0
  31. package/dist/src/data-list/event-handlers/data-list-dblclick-handler.js +16 -0
  32. package/dist/src/data-list/event-handlers/data-list-dblclick-handler.js.map +1 -0
  33. package/dist/src/editors/registry.d.ts +1 -1
  34. package/dist/src/editors/registry.js.map +1 -1
  35. package/dist/src/gutters/gutter-button.js +1 -0
  36. package/dist/src/gutters/gutter-button.js.map +1 -1
  37. package/dist/src/gutters/gutter-row-selector.js +1 -0
  38. package/dist/src/gutters/gutter-row-selector.js.map +1 -1
  39. package/dist/src/interfaces/index.d.ts +2 -0
  40. package/dist/src/interfaces/index.js +3 -0
  41. package/dist/src/interfaces/index.js.map +1 -0
  42. package/dist/src/interfaces/ox-grist-search-form.d.ts +6 -0
  43. package/dist/src/interfaces/ox-grist-search-form.js +2 -0
  44. package/dist/src/interfaces/ox-grist-search-form.js.map +1 -0
  45. package/dist/src/interfaces/ox-search-field.d.ts +39 -0
  46. package/dist/src/interfaces/ox-search-field.js +2 -0
  47. package/dist/src/interfaces/ox-search-field.js.map +1 -0
  48. package/dist/src/record-view/record-view-body.d.ts +1 -1
  49. package/dist/src/record-view/record-view-body.js +5 -8
  50. package/dist/src/record-view/record-view-body.js.map +1 -1
  51. package/dist/src/record-view/record-view.d.ts +5 -2
  52. package/dist/src/record-view/record-view.js +99 -41
  53. package/dist/src/record-view/record-view.js.map +1 -1
  54. package/dist/src/renderers/image-renderer.js +12 -4
  55. package/dist/src/renderers/image-renderer.js.map +1 -1
  56. package/dist/src/search-form/index.d.ts +7 -0
  57. package/dist/src/search-form/index.js +8 -0
  58. package/dist/src/search-form/index.js.map +1 -0
  59. package/dist/src/search-form/ox-basic-field.d.ts +18 -0
  60. package/dist/src/search-form/ox-basic-field.js +75 -0
  61. package/dist/src/search-form/ox-basic-field.js.map +1 -0
  62. package/dist/src/search-form/ox-checkbox-field.d.ts +11 -0
  63. package/dist/src/search-form/ox-checkbox-field.js +60 -0
  64. package/dist/src/search-form/ox-checkbox-field.js.map +1 -0
  65. package/dist/src/search-form/ox-grist-search-form.d.ts +11 -0
  66. package/dist/src/search-form/ox-grist-search-form.js +177 -0
  67. package/dist/src/search-form/ox-grist-search-form.js.map +1 -0
  68. package/dist/src/search-form/ox-number-field.d.ts +14 -0
  69. package/dist/src/search-form/ox-number-field.js +112 -0
  70. package/dist/src/search-form/ox-number-field.js.map +1 -0
  71. package/dist/src/search-form/ox-search-form.d.ts +15 -0
  72. package/dist/src/search-form/ox-search-form.js +53 -0
  73. package/dist/src/search-form/ox-search-form.js.map +1 -0
  74. package/dist/src/search-form/ox-select-field.d.ts +21 -0
  75. package/dist/src/search-form/ox-select-field.js +181 -0
  76. package/dist/src/search-form/ox-select-field.js.map +1 -0
  77. package/dist/src/search-form/ox-text-field.d.ts +11 -0
  78. package/dist/src/search-form/ox-text-field.js +60 -0
  79. package/dist/src/search-form/ox-text-field.js.map +1 -0
  80. package/dist/src/types.d.ts +1 -2
  81. package/dist/src/types.js.map +1 -1
  82. package/dist/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +7 -7
  84. package/src/configure/list-option-builder.ts +0 -2
  85. package/src/configure/zero-config.ts +0 -2
  86. package/src/data-card/data-card.ts +2 -0
  87. package/src/data-card/record-card.ts +17 -10
  88. package/src/data-grid/data-grid-field.ts +4 -2
  89. package/src/data-grist.ts +1 -1
  90. package/src/data-list/data-list.ts +2 -0
  91. package/src/editors/registry.ts +2 -3
  92. package/src/gutters/gutter-button.ts +3 -2
  93. package/src/gutters/gutter-row-selector.ts +3 -2
  94. package/src/record-view/record-view-body.ts +7 -10
  95. package/src/record-view/record-view.ts +107 -48
  96. package/src/renderers/image-renderer.ts +14 -5
  97. package/src/types.ts +1 -2
  98. package/themes/grist-theme.css +2 -22
  99. package/yarn-error.log +16718 -0
@@ -1,66 +1,95 @@
1
1
  import '@material/mwc-icon'
2
2
  import './record-view-body'
3
+ import '@operato/input/ox-input-file.js'
3
4
 
4
- import { ColumnConfig, GristRecord } from '../types'
5
- import { LitElement, css, html } from 'lit'
5
+ import { css, html, LitElement } from 'lit'
6
6
  import { customElement, property } from 'lit/decorators.js'
7
7
 
8
- import { ZERO_RECORD } from '../configure/zero-config'
8
+ import { ScrollbarStyles } from '@operato/styles'
9
+
10
+ import { ZERO_CONFIG, ZERO_RECORD } from '../configure/zero-config'
11
+ import { ColumnConfig, GristConfig, GristRecord } from '../types'
9
12
 
10
13
  @customElement('ox-record-view')
11
14
  export class RecordView extends LitElement {
12
- static styles = css`
13
- :host {
14
- display: flex;
15
- flex-direction: column;
16
- }
17
-
18
- ox-record-view-body {
19
- flex: 1;
20
- }
21
-
22
- [footer] {
23
- display: flex;
24
- text-align: right;
25
- background-color: var(--record-view-footer-background);
26
- box-shadow: var(--context-toolbar-shadow-line);
27
- height: var(--record-view-footer-height);
28
- }
29
-
30
- [footer] button {
31
- flex: 1;
32
- background-color: transparent;
33
- border: var(--record-view-footer-button-border);
34
- border-width: var(--record-view-footer-button-border-width);
35
- height: var(--record-view-footer-button-height);
36
- color: var(--record-view-footer-button-color);
37
- font-size: var(--record-view-footer-button-font);
38
- line-height: 3;
39
- }
40
-
41
- [footer] button * {
42
- vertical-align: middle;
43
- }
44
-
45
- [footer] button mwc-icon {
46
- margin-top: -3px;
47
- margin-right: 5px;
48
- font-size: var(--record-view-footer-iconbutton-size);
49
- }
50
-
51
- [footer] button[ok] {
52
- background-color: var(--record-view-footer-focus-background);
53
- }
54
- `
15
+ static styles = [
16
+ ScrollbarStyles,
17
+ css`
18
+ :host {
19
+ display: flex;
20
+ flex-direction: column;
21
+ background-color: var(--record-view-background-color);
22
+ }
23
+
24
+ ox-record-view-body {
25
+ flex: 1;
26
+ }
27
+
28
+ [content] {
29
+ flex: 1;
30
+
31
+ display: block;
32
+ overflow-y: auto;
33
+ }
34
+
35
+ [thumbnail] {
36
+ max-height: 50%;
37
+ overflow: hidden;
38
+
39
+ display: flex;
40
+ align-content: center;
41
+ justify-content: center;
42
+ }
43
+
44
+ ox-input-file {
45
+ width: 100%;
46
+ }
47
+
48
+ [footer] {
49
+ display: flex;
50
+ text-align: right;
51
+ background-color: var(--record-view-footer-background);
52
+ box-shadow: var(--context-toolbar-shadow-line);
53
+ }
54
+
55
+ [footer] button {
56
+ flex: 1;
57
+ background-color: transparent;
58
+ border: var(--record-view-footer-button-border);
59
+ border-width: var(--record-view-footer-button-border-width);
60
+ color: var(--record-view-footer-button-color);
61
+ font-size: var(--record-view-footer-button-font);
62
+ line-height: 3;
63
+ }
55
64
 
65
+ [footer] button * {
66
+ vertical-align: middle;
67
+ }
68
+
69
+ [footer] button mwc-icon {
70
+ margin-top: -3px;
71
+ margin-right: 5px;
72
+ font-size: var(--record-view-footer-iconbutton-size);
73
+ }
74
+
75
+ [footer] button[ok] {
76
+ background-color: var(--record-view-footer-focus-background);
77
+ }
78
+ `
79
+ ]
80
+
81
+ @property({ type: Object }) config: GristConfig = ZERO_CONFIG
56
82
  @property({ type: Array }) columns: ColumnConfig[] = []
57
83
  @property({ type: Object }) record: GristRecord = ZERO_RECORD
58
84
  @property({ type: Number }) rowIndex: number = -1
59
85
 
60
86
  render() {
61
87
  return html`
62
- <ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>
63
- </ox-record-view-body>
88
+ <div content>
89
+ <div thumbnail>${this.renderThumbnail()}</div>
90
+ <ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>
91
+ </ox-record-view-body>
92
+ </div>
64
93
  <div footer>
65
94
  <button @click=${this.onReset.bind(this)}><mwc-icon>refresh</mwc-icon>Reset</button>
66
95
  <button @click=${this.onCancel.bind(this)}><mwc-icon>clear</mwc-icon>Cancel</button>
@@ -69,6 +98,36 @@ export class RecordView extends LitElement {
69
98
  `
70
99
  }
71
100
 
101
+ renderThumbnail() {
102
+ return html``
103
+
104
+ // const { thumbnail } = this.config.list
105
+ // const thumbnailColumn = thumbnail ? this.columns.find(column => column.name == thumbnail) : undefined
106
+ // const dirtyFields = this.record['__dirtyfields__'] || {}
107
+
108
+ // if (thumbnailColumn?.record.editable) {
109
+ // return html`
110
+ // <ox-input-file
111
+ // name="image"
112
+ // accept="*/*"
113
+ // hide-filelist
114
+ // @change=${async (e: CustomEvent) => {
115
+ // // await uploader(e.detail, this.record, this.rowIndex)
116
+ // }}
117
+ // ></ox-input-file>
118
+ // <ox-grid-field
119
+ // .rowIndex=${this.rowIndex}
120
+ // .column=${thumbnailColumn}
121
+ // .record=${this.record}
122
+ // .value=${this.record[thumbnail!]}
123
+ // ?dirty=${!!dirtyFields[thumbnail!]}
124
+ // ></ox-grid-field>
125
+ // `
126
+ // } else {
127
+ // return html``
128
+ // }
129
+ }
130
+
72
131
  onReset() {
73
132
  this.dispatchEvent(
74
133
  new CustomEvent('reset', {
@@ -1,12 +1,15 @@
1
- import { FieldRenderer } from '../types'
2
1
  import { html } from 'lit'
3
2
 
4
- export const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {
5
- if (!value) return html``
3
+ import { FieldRenderer } from '../types'
6
4
 
5
+ const IMAGE_FALLBACK = new URL('../../../assets/images/no-image.png', import.meta.url).href
6
+
7
+ export const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {
7
8
  let src: string
8
9
 
9
- if (typeof value === 'string') {
10
+ if (!value) {
11
+ src = IMAGE_FALLBACK
12
+ } else if (typeof value === 'string') {
10
13
  src = value
11
14
  } else {
12
15
  src = URL.createObjectURL(value)
@@ -15,5 +18,11 @@ export const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, fi
15
18
 
16
19
  const { width, height } = column.record.options || {}
17
20
 
18
- return html` <img src=${src} alt="upload image" width=${width} height=${height} />`
21
+ return html` <img
22
+ src=${src}
23
+ width=${width}
24
+ height=${height}
25
+ style="max-width: 100%;"
26
+ onerror="this.src !== '${IMAGE_FALLBACK}' && (this.src = '${IMAGE_FALLBACK}')"
27
+ />`
19
28
  }
package/src/types.ts CHANGED
@@ -135,7 +135,6 @@ export type FieldEditor = (
135
135
  rowIndex: number,
136
136
  field: DataGridField
137
137
  ) => Element
138
- export type FieldThumbnailRenderer = (record: GristRecord, rowIndex: number) => TemplateResult | string | void
139
138
  export type FilterSelectRenderer = (column: ColumnConfig, owner: Element) => TemplateResult | string | void
140
139
 
141
140
  export type GristEventHandlerSet = {
@@ -144,7 +143,7 @@ export type GristEventHandlerSet = {
144
143
  }
145
144
 
146
145
  export type ListConfig = {
147
- thumbnail: FieldThumbnailRenderer
146
+ thumbnail?: string
148
147
  fields: string[]
149
148
  details: string[]
150
149
  }
@@ -3,7 +3,6 @@ body {
3
3
  --grid-container-border-width: 1px 0;
4
4
 
5
5
  --grist-background-color: var(--main-section-background-color);
6
- --grist-padding: var(--padding-wide);
7
6
  --grist-title-margin: 0 0 0 10px;
8
7
  --grist-title-border: none;
9
8
  --grist-title-font: bold 16px var(--theme-font);
@@ -137,38 +136,19 @@ body {
137
136
  --record-view-edit-border-bottom: 2px solid var(--primary-color);
138
137
  --record-view-item-padding: var(--padding-default);
139
138
 
140
- --record-view-footer-height: 36px;
141
139
  --record-view-footer-background: #586272;
142
140
  --record-view-footer-button-border: 1px solid rgba(0, 0, 0, 0.3);
143
141
  --record-view-footer-button-border-width: 0 0 0 1px;
144
- --record-view-footer-button-height: 36px;
145
142
  --record-view-footer-button-font: 17px;
146
143
  --record-view-footer-button-color: var(--theme-white-color);
147
- --record-view-footer-iconbutton-size: var(--fontsize-large);
144
+ --record-view-footer-iconbutton-size: 35px;
148
145
  --record-view-footer-focus-background: var(--primary-color);
149
146
  }
150
147
 
151
148
  @media only screen and (max-width: 460px) {
152
149
  body {
153
- --grist-padding: 0;
150
+ --record-view-label-font: bold 15px/32px var(--theme-font);
154
151
  --record-view-font: normal 15px/32px var(--theme-font);
155
- --record-view-footer-height: 50px;
156
- --record-view-footer-button-height: var(--record-view-footer-height);
157
- --record-view-footer-iconbutton-size: 35px;
158
- --record-view-footer-iconbutton-margin: -2px;
159
- --record-view-footer-iconbutton-display: block;
160
- }
161
- }
162
-
163
- @media (min-width: 461px) and (max-width: 1024px) {
164
- body {
165
- --grist-padding: 0;
166
-
167
- --record-view-footer-height: 50px;
168
- --record-view-footer-button-height: var(--record-view-footer-height);
169
- --record-view-footer-iconbutton-size: 35px;
170
- --record-view-footer-iconbutton-margin: -2px;
171
- --record-view-footer-iconbutton-display: block;
172
152
  }
173
153
  }
174
154