@operato/data-grist 0.3.13 → 0.3.17

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 (126) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/assets/images/no-image.png +0 -0
  3. package/custom-elements.json +2382 -1803
  4. package/demo/index.html +41 -62
  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.d.ts +3 -6
  11. package/dist/src/data-card/data-card.js +3 -131
  12. package/dist/src/data-card/data-card.js.map +1 -1
  13. package/dist/src/data-card/record-card.d.ts +0 -3
  14. package/dist/src/data-card/record-card.js +22 -71
  15. package/dist/src/data-card/record-card.js.map +1 -1
  16. package/dist/src/data-grid/data-grid-body.d.ts +7 -1
  17. package/dist/src/data-grid/data-grid-body.js +26 -5
  18. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  19. package/dist/src/data-grid/data-grid-field.js +1 -1
  20. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  21. package/dist/src/data-grid/data-grid-header.d.ts +1 -0
  22. package/dist/src/data-grid/data-grid-header.js +9 -1
  23. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  24. package/dist/src/data-grid/data-grid.d.ts +8 -4
  25. package/dist/src/data-grid/data-grid.js +12 -132
  26. package/dist/src/data-grid/data-grid.js.map +1 -1
  27. package/dist/src/data-grist.d.ts +1 -0
  28. package/dist/src/data-grist.js +3 -0
  29. package/dist/src/data-grist.js.map +1 -1
  30. package/dist/src/data-list/data-list.d.ts +3 -6
  31. package/dist/src/data-list/data-list.js +3 -131
  32. package/dist/src/data-list/data-list.js.map +1 -1
  33. package/dist/src/data-list/record-partial.d.ts +0 -2
  34. package/dist/src/data-list/record-partial.js +7 -58
  35. package/dist/src/data-list/record-partial.js.map +1 -1
  36. package/dist/src/data-manipulator.d.ts +20 -0
  37. package/dist/src/data-manipulator.js +148 -0
  38. package/dist/src/data-manipulator.js.map +1 -0
  39. package/dist/src/editors/image-editor.d.ts +9 -0
  40. package/dist/src/editors/image-editor.js +53 -0
  41. package/dist/src/editors/image-editor.js.map +1 -0
  42. package/dist/src/editors/image-input.d.ts +7 -0
  43. package/dist/src/editors/image-input.js +31 -0
  44. package/dist/src/editors/image-input.js.map +1 -0
  45. package/dist/src/editors/index.d.ts +1 -0
  46. package/dist/src/editors/index.js +1 -0
  47. package/dist/src/editors/index.js.map +1 -1
  48. package/dist/src/editors/input-editors copy.d.ts +75 -0
  49. package/dist/src/editors/input-editors copy.js +373 -0
  50. package/dist/src/editors/input-editors copy.js.map +1 -0
  51. package/dist/src/editors/input-editors.d.ts +1 -8
  52. package/dist/src/editors/input-editors.js +3 -47
  53. package/dist/src/editors/input-editors.js.map +1 -1
  54. package/dist/src/editors/registry.d.ts +1 -1
  55. package/dist/src/editors/registry.js +2 -1
  56. package/dist/src/editors/registry.js.map +1 -1
  57. package/dist/src/handlers/record-view-handler.d.ts +1 -2
  58. package/dist/src/handlers/record-view-handler.js +5 -35
  59. package/dist/src/handlers/record-view-handler.js.map +1 -1
  60. package/dist/src/handlers/select-row-toggle.d.ts +1 -1
  61. package/dist/src/handlers/select-row-toggle.js.map +1 -1
  62. package/dist/src/record-view/event-handlers/record-view-body-click-handler.d.ts +7 -0
  63. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js +24 -0
  64. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js.map +1 -0
  65. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.d.ts +7 -0
  66. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js +22 -0
  67. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js.map +1 -0
  68. package/dist/src/record-view/index.d.ts +1 -0
  69. package/dist/src/record-view/index.js +1 -0
  70. package/dist/src/record-view/index.js.map +1 -1
  71. package/dist/src/record-view/record-creator copy.d.ts +13 -0
  72. package/dist/src/record-view/record-creator copy.js +90 -0
  73. package/dist/src/record-view/record-creator copy.js.map +1 -0
  74. package/dist/src/record-view/record-creator-backup.d.ts +13 -0
  75. package/dist/src/record-view/record-creator-backup.js +90 -0
  76. package/dist/src/record-view/record-creator-backup.js.map +1 -0
  77. package/dist/src/record-view/record-creator.d.ts +16 -0
  78. package/dist/src/record-view/record-creator.js +145 -0
  79. package/dist/src/record-view/record-creator.js.map +1 -0
  80. package/dist/src/record-view/record-view-body.d.ts +3 -4
  81. package/dist/src/record-view/record-view-body.js +15 -42
  82. package/dist/src/record-view/record-view-body.js.map +1 -1
  83. package/dist/src/record-view/record-view-handler.d.ts +9 -0
  84. package/dist/src/record-view/record-view-handler.js +57 -0
  85. package/dist/src/record-view/record-view-handler.js.map +1 -0
  86. package/dist/src/record-view/record-view.d.ts +5 -1
  87. package/dist/src/record-view/record-view.js +61 -36
  88. package/dist/src/record-view/record-view.js.map +1 -1
  89. package/dist/src/renderers/image-renderer.js +12 -4
  90. package/dist/src/renderers/image-renderer.js.map +1 -1
  91. package/dist/src/sorters/sorters-control.d.ts +12 -0
  92. package/dist/src/sorters/sorters-control.js +106 -0
  93. package/dist/src/sorters/sorters-control.js.map +1 -0
  94. package/dist/src/types.d.ts +2 -3
  95. package/dist/src/types.js.map +1 -1
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +10 -8
  98. package/src/configure/list-option-builder.ts +0 -2
  99. package/src/configure/zero-config.ts +0 -2
  100. package/src/data-card/data-card.ts +4 -158
  101. package/src/data-card/record-card.ts +30 -87
  102. package/src/data-grid/data-grid-body.ts +43 -6
  103. package/src/data-grid/data-grid-field.ts +1 -1
  104. package/src/data-grid/data-grid-header.ts +11 -1
  105. package/src/data-grid/data-grid.ts +25 -143
  106. package/src/data-grist.ts +4 -0
  107. package/src/data-list/data-list.ts +4 -158
  108. package/src/data-list/record-partial.ts +14 -73
  109. package/src/data-manipulator.ts +201 -0
  110. package/src/editors/image-input.ts +29 -0
  111. package/src/editors/index.ts +1 -0
  112. package/src/editors/input-editors.ts +5 -48
  113. package/src/editors/registry.ts +3 -4
  114. package/src/handlers/record-view-handler.ts +8 -44
  115. package/src/handlers/select-row-toggle.ts +1 -2
  116. package/src/record-view/event-handlers/record-view-body-click-handler.ts +30 -0
  117. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +26 -0
  118. package/src/record-view/index.ts +1 -0
  119. package/src/record-view/record-creator.ts +180 -0
  120. package/src/record-view/record-view-body.ts +16 -55
  121. package/src/record-view/record-view-handler.ts +86 -0
  122. package/src/record-view/record-view.ts +69 -42
  123. package/src/renderers/image-renderer.ts +14 -5
  124. package/src/sorters/sorters-control.ts +111 -0
  125. package/src/types.ts +10 -3
  126. package/yarn-error.log +16718 -0
@@ -4,17 +4,24 @@ import '../data-grid/data-grid-field';
4
4
  import { css, html, LitElement } from 'lit';
5
5
  import { customElement, property } from 'lit/decorators.js';
6
6
  import { ZERO_RECORD } from '../configure/zero-config';
7
- const KEY_ENTER = 13;
8
- const KEY_ESC = 27;
7
+ import { recordViewBodyClickHandler } from './event-handlers/record-view-body-click-handler';
8
+ import { recordViewBodyKeydownHandler } from './event-handlers/record-view-body-keydown-handler';
9
9
  let RecordViewBody = class RecordViewBody extends LitElement {
10
10
  constructor() {
11
11
  super(...arguments);
12
12
  this.columns = [];
13
13
  this.record = ZERO_RECORD;
14
14
  this.rowIndex = -1;
15
+ this.onlyForEdit = false;
16
+ }
17
+ connectedCallback() {
18
+ super.connectedCallback();
19
+ this.setAttribute('tabindex', '0');
20
+ this.renderRoot.addEventListener('keydown', recordViewBodyKeydownHandler.bind(this));
21
+ this.renderRoot.addEventListener('click', recordViewBodyClickHandler.bind(this));
15
22
  }
16
23
  render() {
17
- var columns = this.columns.filter(column => !column.hidden && column.type != 'gutter');
24
+ var columns = this.columns.filter(column => !column.hidden && column.type !== 'gutter');
18
25
  var record = this.record;
19
26
  var rowIndex = this.rowIndex;
20
27
  return html `
@@ -29,46 +36,12 @@ let RecordViewBody = class RecordViewBody extends LitElement {
29
36
  .record=${record}
30
37
  .value=${record[column.name]}
31
38
  ?dirty=${!!dirtyFields[column.name]}
39
+ ?editing=${this.onlyForEdit}
32
40
  ></ox-grid-field>
33
41
  `;
34
42
  })}
35
43
  `;
36
44
  }
37
- firstUpdated() {
38
- this.renderRoot.addEventListener('click', e => {
39
- e.stopPropagation();
40
- /* target should be 'ox-grid-field' */
41
- var target = e.target;
42
- if (this.editTarget) {
43
- this.editTarget.removeAttribute('editing');
44
- this.editTarget = null;
45
- }
46
- if (target.tagName !== 'OX-GRID-FIELD' || !target.column.record.editable) {
47
- return;
48
- }
49
- this.editTarget = target;
50
- target.setAttribute('editing', 'true');
51
- });
52
- this._focusedListener = (e) => {
53
- var keyCode = e.keyCode;
54
- switch (keyCode) {
55
- case KEY_ESC:
56
- /* TODO 편집이 취소되어야 한다. */
57
- case KEY_ENTER:
58
- if (this.editTarget) {
59
- this.editTarget.removeAttribute('editing');
60
- this.editTarget = null;
61
- }
62
- break;
63
- default:
64
- }
65
- };
66
- window.addEventListener('keydown', this._focusedListener);
67
- }
68
- disconnectedCallback() {
69
- super.disconnectedCallback();
70
- window.removeEventListener('keydown', this._focusedListener);
71
- }
72
45
  _renderLabel(column) {
73
46
  var { renderer } = column.header;
74
47
  var title = renderer.call(this, column);
@@ -82,10 +55,7 @@ RecordViewBody.styles = [
82
55
  grid-template-columns: 1fr 2fr;
83
56
  grid-auto-rows: min-content;
84
57
  grid-gap: var(--record-view-gap);
85
- background-color: var(--record-view-background-color);
86
58
  padding: var(--record-view-padding);
87
-
88
- overflow-y: auto;
89
59
  }
90
60
 
91
61
  label {
@@ -111,6 +81,7 @@ RecordViewBody.styles = [
111
81
  }
112
82
 
113
83
  ox-grid-field {
84
+ border-top: none;
114
85
  border-bottom: var(--record-view-border-bottom);
115
86
  font: var(--record-view-font);
116
87
  color: var(--record-view-color);
@@ -118,7 +89,6 @@ RecordViewBody.styles = [
118
89
  }
119
90
 
120
91
  ox-grid-field[editing='true'] {
121
- border-top: none;
122
92
  border-bottom: var(--record-view-edit-border-bottom);
123
93
  }
124
94
 
@@ -137,6 +107,9 @@ __decorate([
137
107
  __decorate([
138
108
  property({ type: Number })
139
109
  ], RecordViewBody.prototype, "rowIndex", void 0);
110
+ __decorate([
111
+ property({ type: Boolean, attribute: 'only-for-edit' })
112
+ ], RecordViewBody.prototype, "onlyForEdit", void 0);
140
113
  RecordViewBody = __decorate([
141
114
  customElement('ox-record-view-body')
142
115
  ], RecordViewBody);
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-body.js","sourceRoot":"","sources":["../../../src/record-view/record-view-body.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-icon'\nimport '../data-grid/data-grid-field'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_RECORD } from '../configure/zero-config'\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { ColumnConfig, GristRecord } from '../types'\n\nconst KEY_ENTER = 13\nconst KEY_ESC = 27\n\n@customElement('ox-record-view-body')\nexport class RecordViewBody extends LitElement {\n static styles = [\n css`\n :host {\n display: grid;\n grid-template-columns: 1fr 2fr;\n grid-auto-rows: min-content;\n grid-gap: var(--record-view-gap);\n background-color: var(--record-view-background-color);\n padding: var(--record-view-padding);\n\n overflow-y: auto;\n }\n\n label {\n display: flex;\n align-items: center;\n position: relative;\n text-transform: capitalize;\n\n padding: var(--record-view-item-padding);\n border-bottom: var(--record-view-border-bottom);\n font: var(--record-view-label-font);\n color: var(--record-view-label-color);\n }\n\n label mwc-icon {\n display: none;\n }\n\n label[editable] mwc-icon {\n display: inline-block;\n font-size: var(--record-view-label-icon-size);\n opacity: 0.5;\n }\n\n ox-grid-field {\n border-bottom: var(--record-view-border-bottom);\n font: var(--record-view-font);\n color: var(--record-view-color);\n background-color: transparent;\n }\n\n ox-grid-field[editing='true'] {\n border-top: none;\n border-bottom: var(--record-view-edit-border-bottom);\n }\n\n :first-child + ox-grid-field {\n color: var(--record-view-focus-color);\n font-weight: bold;\n }\n `\n ]\n\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex: number = -1\n\n private editTarget: any\n private _focusedListener: any\n\n render() {\n var columns = this.columns.filter(column => !column.hidden && column.type != 'gutter')\n var record = this.record\n var rowIndex = this.rowIndex\n\n return html`\n ${columns.map(column => {\n let { editable } = column.record\n let dirtyFields = record['__dirtyfields__'] || {}\n\n return html`\n <label ?editable=${editable}><span>${this._renderLabel(column)}</span> <mwc-icon>edit</mwc-icon></label>\n <ox-grid-field\n .rowIndex=${rowIndex}\n .column=${column}\n .record=${record}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n ></ox-grid-field>\n `\n })}\n `\n }\n\n firstUpdated() {\n this.renderRoot.addEventListener('click', e => {\n e.stopPropagation()\n\n /* target should be 'ox-grid-field' */\n var target = e.target as DataGridField\n\n if (this.editTarget) {\n this.editTarget.removeAttribute('editing')\n this.editTarget = null\n }\n\n if (target.tagName !== 'OX-GRID-FIELD' || !target.column.record.editable) {\n return\n }\n\n this.editTarget = target\n target.setAttribute('editing', 'true')\n })\n\n this._focusedListener = (e: KeyboardEvent) => {\n var keyCode = e.keyCode\n switch (keyCode) {\n case KEY_ESC:\n /* TODO 편집이 취소되어야 한다. */\n case KEY_ENTER:\n if (this.editTarget) {\n this.editTarget.removeAttribute('editing')\n this.editTarget = null\n }\n break\n\n default:\n }\n }\n window.addEventListener('keydown', this._focusedListener)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n window.removeEventListener('keydown', this._focusedListener)\n }\n\n _renderLabel(column: ColumnConfig) {\n var { renderer } = column.header\n var title = renderer.call(this, column)\n\n return html` ${title} `\n }\n}\n"]}
1
+ {"version":3,"file":"record-view-body.js","sourceRoot":"","sources":["../../../src/record-view/record-view-body.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/mwc-icon'\nimport '../data-grid/data-grid-field'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_RECORD } from '../configure/zero-config'\nimport { ColumnConfig, GristRecord } from '../types'\nimport { recordViewBodyClickHandler } from './event-handlers/record-view-body-click-handler'\nimport { recordViewBodyKeydownHandler } from './event-handlers/record-view-body-keydown-handler'\n\n@customElement('ox-record-view-body')\nexport class RecordViewBody extends LitElement {\n static styles = [\n css`\n :host {\n display: grid;\n grid-template-columns: 1fr 2fr;\n grid-auto-rows: min-content;\n grid-gap: var(--record-view-gap);\n padding: var(--record-view-padding);\n }\n\n label {\n display: flex;\n align-items: center;\n position: relative;\n text-transform: capitalize;\n\n padding: var(--record-view-item-padding);\n border-bottom: var(--record-view-border-bottom);\n font: var(--record-view-label-font);\n color: var(--record-view-label-color);\n }\n\n label mwc-icon {\n display: none;\n }\n\n label[editable] mwc-icon {\n display: inline-block;\n font-size: var(--record-view-label-icon-size);\n opacity: 0.5;\n }\n\n ox-grid-field {\n border-top: none;\n border-bottom: var(--record-view-border-bottom);\n font: var(--record-view-font);\n color: var(--record-view-color);\n background-color: transparent;\n }\n\n ox-grid-field[editing='true'] {\n border-bottom: var(--record-view-edit-border-bottom);\n }\n\n :first-child + ox-grid-field {\n color: var(--record-view-focus-color);\n font-weight: bold;\n }\n `\n ]\n\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex: number = -1\n @property({ type: Boolean, attribute: 'only-for-edit' }) onlyForEdit: boolean = false\n\n public currentTarget: any\n\n connectedCallback() {\n super.connectedCallback()\n\n this.setAttribute('tabindex', '0')\n\n this.renderRoot.addEventListener('keydown', recordViewBodyKeydownHandler.bind(this))\n this.renderRoot.addEventListener('click', recordViewBodyClickHandler.bind(this))\n }\n\n render() {\n var columns = this.columns.filter(column => !column.hidden && column.type !== 'gutter')\n var record = this.record\n var rowIndex = this.rowIndex\n\n return html`\n ${columns.map(column => {\n let { editable } = column.record\n let dirtyFields = record['__dirtyfields__'] || {}\n\n return html`\n <label ?editable=${editable}><span>${this._renderLabel(column)}</span> <mwc-icon>edit</mwc-icon></label>\n <ox-grid-field\n .rowIndex=${rowIndex}\n .column=${column}\n .record=${record}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n ?editing=${this.onlyForEdit}\n ></ox-grid-field>\n `\n })}\n `\n }\n\n _renderLabel(column: ColumnConfig) {\n var { renderer } = column.header\n var title = renderer.call(this, column)\n\n return html` ${title} `\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { RecordCard } from '../data-card/record-card';
2
+ import { DataGridBody } from '../data-grid/data-grid-body';
3
+ import { DataGridField } from '../data-grid/data-grid-field';
4
+ import { RecordPartial } from '../data-list/record-partial';
5
+ import { RecordView } from '../record-view/record-view';
6
+ import { ColumnConfig, GristRecord } from '../types';
7
+ export declare const RecordViewHandler: (columns: ColumnConfig[], record: GristRecord, rowIndex: number, field: DataGridField | RecordCard | RecordPartial | DataGridBody, popupOptions: {
8
+ [key: string]: any;
9
+ }, closeCallback?: (() => void) | undefined) => RecordView;
@@ -0,0 +1,57 @@
1
+ /*
2
+ * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
3
+ * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
4
+ */
5
+ export const RecordViewHandler = function (columns, record, rowIndex, field, popupOptions, closeCallback) {
6
+ var recordView = document.createElement('ox-record-view');
7
+ recordView.columns = columns;
8
+ recordView.record = record;
9
+ recordView.rowIndex = rowIndex;
10
+ document.dispatchEvent(new CustomEvent('open-popup', {
11
+ detail: {
12
+ template: recordView,
13
+ options: {
14
+ backdrop: true,
15
+ size: 'large',
16
+ title: record['name'],
17
+ ...popupOptions
18
+ },
19
+ callback: (popup) => {
20
+ recordView.addEventListener('field-change', (e) => {
21
+ field.dispatchEvent(new CustomEvent('field-change', {
22
+ bubbles: true,
23
+ composed: true,
24
+ detail: e.detail
25
+ }));
26
+ });
27
+ recordView.addEventListener('reset', (e) => {
28
+ field.dispatchEvent(new CustomEvent('record-reset', {
29
+ bubbles: true,
30
+ composed: true,
31
+ detail: {
32
+ record: record,
33
+ row: rowIndex
34
+ }
35
+ }));
36
+ });
37
+ recordView.addEventListener('cancel', (e) => {
38
+ field.dispatchEvent(new CustomEvent('record-reset', {
39
+ bubbles: true,
40
+ composed: true,
41
+ detail: {
42
+ record: record,
43
+ row: rowIndex
44
+ }
45
+ }));
46
+ popup.close();
47
+ });
48
+ recordView.addEventListener('ok', (e) => {
49
+ popup.close();
50
+ });
51
+ popup.onclosed = closeCallback;
52
+ }
53
+ }
54
+ }));
55
+ return recordView;
56
+ };
57
+ //# sourceMappingURL=record-view-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-view-handler.js","sourceRoot":"","sources":["../../../src/record-view/record-view-handler.ts"],"names":[],"mappings":"AAOA;;;GAGG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAC/B,OAAuB,EACvB,MAAmB,EACnB,QAAgB,EAChB,KAAgE,EAChE,YAAoC,EACpC,aAA0B;IAE1B,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAe,CAAA;IAEvE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAC5B,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAE9B,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,YAAY,EAAE;QAC5B,MAAM,EAAE;YACN,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;gBACrB,GAAG,YAAY;aAChB;YACD,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;gBACvB,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAQ,EAAE,EAAE;oBACvD,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;wBAC9B,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAG,CAAS,CAAC,MAAM;qBAC1B,CAAC,CACH,CAAA;gBACH,CAAC,CAAC,CAAA;gBAEF,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;oBAChD,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;wBAC9B,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE;4BACN,MAAM,EAAE,MAAM;4BACd,GAAG,EAAE,QAAQ;yBACd;qBACF,CAAC,CACH,CAAA;gBACH,CAAC,CAAC,CAAA;gBAEF,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAQ,EAAE,EAAE;oBACjD,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;wBAC9B,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE;4BACN,MAAM,EAAE,MAAM;4BACd,GAAG,EAAE,QAAQ;yBACd;qBACF,CAAC,CACH,CAAA;oBACD,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC,CAAC,CAAA;gBAEF,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAQ,EAAE,EAAE;oBAC7C,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC,CAAC,CAAA;gBAEF,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAA;YAChC,CAAC;SACF;KACK,CAAC,CACV,CAAA;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA","sourcesContent":["import { RecordCard } from '../data-card/record-card'\nimport { DataGridBody } from '../data-grid/data-grid-body'\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { RecordPartial } from '../data-list/record-partial'\nimport { RecordView } from '../record-view/record-view'\nimport { ColumnConfig, GristRecord } from '../types'\n\n/*\n * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,\n * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.\n */\n\nexport const RecordViewHandler = function (\n columns: ColumnConfig[],\n record: GristRecord,\n rowIndex: number,\n field: DataGridField | RecordCard | RecordPartial | DataGridBody,\n popupOptions: { [key: string]: any },\n closeCallback?: () => void\n): RecordView {\n var recordView = document.createElement('ox-record-view') as RecordView\n\n recordView.columns = columns\n recordView.record = record\n recordView.rowIndex = rowIndex\n\n document.dispatchEvent(\n new CustomEvent('open-popup', {\n detail: {\n template: recordView,\n options: {\n backdrop: true,\n size: 'large',\n title: record['name'],\n ...popupOptions\n },\n callback: (popup: any) => {\n recordView.addEventListener('field-change', (e: Event) => {\n field.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: (e as any).detail\n })\n )\n })\n\n recordView.addEventListener('reset', (e: Event) => {\n field.dispatchEvent(\n new CustomEvent('record-reset', {\n bubbles: true,\n composed: true,\n detail: {\n record: record,\n row: rowIndex\n }\n })\n )\n })\n\n recordView.addEventListener('cancel', (e: Event) => {\n field.dispatchEvent(\n new CustomEvent('record-reset', {\n bubbles: true,\n composed: true,\n detail: {\n record: record,\n row: rowIndex\n }\n })\n )\n popup.close()\n })\n\n recordView.addEventListener('ok', (e: Event) => {\n popup.close()\n })\n\n popup.onclosed = closeCallback\n }\n }\n } as any)\n )\n\n return recordView\n}\n"]}
@@ -1,13 +1,17 @@
1
1
  import '@material/mwc-icon';
2
2
  import './record-view-body';
3
+ import '@operato/input/ox-input-file.js';
4
+ import '../data-grid/data-grid-field';
3
5
  import { LitElement } from 'lit';
4
6
  import { ColumnConfig, GristRecord } from '../types';
5
7
  export declare class RecordView extends LitElement {
6
- static styles: import("lit").CSSResult;
8
+ static styles: import("lit").CSSResult[];
7
9
  columns: ColumnConfig[];
8
10
  record: GristRecord;
9
11
  rowIndex: number;
12
+ onlyForEdit: boolean;
10
13
  render(): import("lit-html").TemplateResult<1>;
14
+ firstUpdated(): void;
11
15
  onReset(): void;
12
16
  onCancel(): void;
13
17
  onOK(): void;
@@ -1,8 +1,11 @@
1
1
  import { __decorate } from "tslib";
2
2
  import '@material/mwc-icon';
3
3
  import './record-view-body';
4
+ import '@operato/input/ox-input-file.js';
5
+ import '../data-grid/data-grid-field';
4
6
  import { css, html, LitElement } from 'lit';
5
7
  import { customElement, property } from 'lit/decorators.js';
8
+ import { ScrollbarStyles } from '@operato/styles';
6
9
  import { ZERO_RECORD } from '../configure/zero-config';
7
10
  let RecordView = class RecordView extends LitElement {
8
11
  constructor() {
@@ -10,10 +13,16 @@ let RecordView = class RecordView extends LitElement {
10
13
  this.columns = [];
11
14
  this.record = ZERO_RECORD;
12
15
  this.rowIndex = -1;
16
+ this.onlyForEdit = false;
13
17
  }
14
18
  render() {
15
19
  return html `
16
- <ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>
20
+ <ox-record-view-body
21
+ .columns=${this.columns}
22
+ .record=${this.record}
23
+ .rowIndex=${this.rowIndex}
24
+ ?only-for-edit=${this.onlyForEdit}
25
+ >
17
26
  </ox-record-view-body>
18
27
  <div footer>
19
28
  <button @click=${this.onReset.bind(this)}><mwc-icon>refresh</mwc-icon>Reset</button>
@@ -22,63 +31,76 @@ let RecordView = class RecordView extends LitElement {
22
31
  </div>
23
32
  `;
24
33
  }
34
+ firstUpdated() {
35
+ this.setAttribute('tabindex', '0');
36
+ }
25
37
  onReset() {
38
+ this.focus();
26
39
  this.dispatchEvent(new CustomEvent('reset', {
27
40
  detail: this.record
28
41
  }));
29
42
  }
30
43
  onCancel() {
44
+ this.focus();
31
45
  this.dispatchEvent(new CustomEvent('cancel', {
32
46
  detail: this.record
33
47
  }));
34
48
  }
35
49
  onOK() {
50
+ this.focus();
36
51
  this.dispatchEvent(new CustomEvent('ok', {
37
52
  detail: this.record
38
53
  }));
39
54
  }
40
55
  };
41
- RecordView.styles = css `
42
- :host {
43
- display: flex;
44
- flex-direction: column;
45
- }
56
+ RecordView.styles = [
57
+ ScrollbarStyles,
58
+ css `
59
+ :host {
60
+ display: flex;
61
+ flex-direction: column;
62
+ background-color: var(--record-view-background-color);
46
63
 
47
- ox-record-view-body {
48
- flex: 1;
49
- }
64
+ max-height: 80vh;
65
+ }
50
66
 
51
- [footer] {
52
- display: flex;
53
- text-align: right;
54
- background-color: var(--record-view-footer-background);
55
- box-shadow: var(--context-toolbar-shadow-line);
56
- }
67
+ ox-record-view-body {
68
+ flex: 1;
69
+ overflow-y: auto;
70
+ }
57
71
 
58
- [footer] button {
59
- flex: 1;
60
- background-color: transparent;
61
- border: var(--record-view-footer-button-border);
62
- border-width: var(--record-view-footer-button-border-width);
63
- color: var(--record-view-footer-button-color);
64
- font-size: var(--record-view-footer-button-font);
65
- line-height: 3;
66
- }
72
+ [footer] {
73
+ display: flex;
74
+ text-align: right;
75
+ background-color: var(--record-view-footer-background);
76
+ box-shadow: var(--context-toolbar-shadow-line);
77
+ }
67
78
 
68
- [footer] button * {
69
- vertical-align: middle;
70
- }
79
+ [footer] button {
80
+ flex: 1;
81
+ background-color: transparent;
82
+ border: var(--record-view-footer-button-border);
83
+ border-width: var(--record-view-footer-button-border-width);
84
+ color: var(--record-view-footer-button-color);
85
+ font-size: var(--record-view-footer-button-font);
86
+ line-height: 3;
87
+ }
71
88
 
72
- [footer] button mwc-icon {
73
- margin-top: -3px;
74
- margin-right: 5px;
75
- font-size: var(--record-view-footer-iconbutton-size);
76
- }
89
+ [footer] button * {
90
+ vertical-align: middle;
91
+ }
77
92
 
78
- [footer] button[ok] {
79
- background-color: var(--record-view-footer-focus-background);
80
- }
81
- `;
93
+ [footer] button mwc-icon {
94
+ margin-top: -3px;
95
+ margin-right: 5px;
96
+ font-size: var(--record-view-footer-iconbutton-size);
97
+ }
98
+
99
+ [footer] button[ok] {
100
+ background-color: var(--record-view-footer-focus-background);
101
+ }
102
+ `
103
+ ];
82
104
  __decorate([
83
105
  property({ type: Array })
84
106
  ], RecordView.prototype, "columns", void 0);
@@ -88,6 +110,9 @@ __decorate([
88
110
  __decorate([
89
111
  property({ type: Number })
90
112
  ], RecordView.prototype, "rowIndex", void 0);
113
+ __decorate([
114
+ property({ type: Boolean, attribute: 'only-for-edit' })
115
+ ], RecordView.prototype, "onlyForEdit", void 0);
91
116
  RecordView = __decorate([
92
117
  customElement('ox-record-view')
93
118
  ], RecordView);
@@ -1 +1 @@
1
- {"version":3,"file":"record-view.js","sourceRoot":"","sources":["../../../src/record-view/record-view.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,oBAAoB,CAAA;AAE3B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAItD,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,UAAU;IAA1C;;QA2C6B,YAAO,GAAmB,EAAE,CAAA;QAC3B,WAAM,GAAgB,WAAW,CAAA;QACjC,aAAQ,GAAW,CAAC,CAAC,CAAA;IAqCnD,CAAC;IAnCC,MAAM;QACJ,OAAO,IAAI,CAAA;sCACuB,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,MAAM,cAAc,IAAI,CAAC,QAAQ;;;yBAG3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;yBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;KAExC,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,OAAO,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAA;AAjFQ,iBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwClB,CAAA;AAE0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;2CAA6B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAsB;AA7CtC,UAAU;IADtB,aAAa,CAAC,gBAAgB,CAAC;GACnB,UAAU,CAkFtB;SAlFY,UAAU","sourcesContent":["import '@material/mwc-icon'\nimport './record-view-body'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_RECORD } from '../configure/zero-config'\nimport { ColumnConfig, GristRecord } from '../types'\n\n@customElement('ox-record-view')\nexport class RecordView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n }\n\n ox-record-view-body {\n flex: 1;\n }\n\n [footer] {\n display: flex;\n text-align: right;\n background-color: var(--record-view-footer-background);\n box-shadow: var(--context-toolbar-shadow-line);\n }\n\n [footer] button {\n flex: 1;\n background-color: transparent;\n border: var(--record-view-footer-button-border);\n border-width: var(--record-view-footer-button-border-width);\n color: var(--record-view-footer-button-color);\n font-size: var(--record-view-footer-button-font);\n line-height: 3;\n }\n\n [footer] button * {\n vertical-align: middle;\n }\n\n [footer] button mwc-icon {\n margin-top: -3px;\n margin-right: 5px;\n font-size: var(--record-view-footer-iconbutton-size);\n }\n\n [footer] button[ok] {\n background-color: var(--record-view-footer-focus-background);\n }\n `\n\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex: number = -1\n\n render() {\n return html`\n <ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>\n </ox-record-view-body>\n <div footer>\n <button @click=${this.onReset.bind(this)}><mwc-icon>refresh</mwc-icon>Reset</button>\n <button @click=${this.onCancel.bind(this)}><mwc-icon>clear</mwc-icon>Cancel</button>\n <button @click=${this.onOK.bind(this)} ok><mwc-icon>radio_button_unchecked</mwc-icon>OK</button>\n </div>\n `\n }\n\n onReset() {\n this.dispatchEvent(\n new CustomEvent('reset', {\n detail: this.record\n })\n )\n }\n\n onCancel() {\n this.dispatchEvent(\n new CustomEvent('cancel', {\n detail: this.record\n })\n )\n }\n\n onOK() {\n this.dispatchEvent(\n new CustomEvent('ok', {\n detail: this.record\n })\n )\n }\n}\n"]}
1
+ {"version":3,"file":"record-view.js","sourceRoot":"","sources":["../../../src/record-view/record-view.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,oBAAoB,CAAA;AAC3B,OAAO,iCAAiC,CAAA;AACxC,OAAO,8BAA8B,CAAA;AAErC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAItD,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,UAAU;IAA1C;;QAkD6B,YAAO,GAAmB,EAAE,CAAA;QAC3B,WAAM,GAAgB,WAAW,CAAA;QACjC,aAAQ,GAAW,CAAC,CAAC,CAAA;QACQ,gBAAW,GAAY,KAAK,CAAA;IAoDvF,CAAC;IAlDC,MAAM;QACJ,OAAO,IAAI,CAAA;;mBAEI,IAAI,CAAC,OAAO;kBACb,IAAI,CAAC,MAAM;oBACT,IAAI,CAAC,QAAQ;yBACR,IAAI,CAAC,WAAW;;;;yBAIhB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;yBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;KAExC,CAAA;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAA;QAEZ,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,OAAO,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,KAAK,EAAE,CAAA;QAEZ,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,KAAK,EAAE,CAAA;QAEZ,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAA;AAxGQ,iBAAM,GAAG;IACd,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4CF;CACF,CAAA;AAE0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;2CAA6B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAsB;AACQ;IAAxD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;+CAA6B;AArD1E,UAAU;IADtB,aAAa,CAAC,gBAAgB,CAAC;GACnB,UAAU,CAyGtB;SAzGY,UAAU","sourcesContent":["import '@material/mwc-icon'\nimport './record-view-body'\nimport '@operato/input/ox-input-file.js'\nimport '../data-grid/data-grid-field'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { ZERO_RECORD } from '../configure/zero-config'\nimport { ColumnConfig, GristRecord } from '../types'\n\n@customElement('ox-record-view')\nexport class RecordView extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: var(--record-view-background-color);\n\n max-height: 80vh;\n }\n\n ox-record-view-body {\n flex: 1;\n overflow-y: auto;\n }\n\n [footer] {\n display: flex;\n text-align: right;\n background-color: var(--record-view-footer-background);\n box-shadow: var(--context-toolbar-shadow-line);\n }\n\n [footer] button {\n flex: 1;\n background-color: transparent;\n border: var(--record-view-footer-button-border);\n border-width: var(--record-view-footer-button-border-width);\n color: var(--record-view-footer-button-color);\n font-size: var(--record-view-footer-button-font);\n line-height: 3;\n }\n\n [footer] button * {\n vertical-align: middle;\n }\n\n [footer] button mwc-icon {\n margin-top: -3px;\n margin-right: 5px;\n font-size: var(--record-view-footer-iconbutton-size);\n }\n\n [footer] button[ok] {\n background-color: var(--record-view-footer-focus-background);\n }\n `\n ]\n\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Number }) rowIndex: number = -1\n @property({ type: Boolean, attribute: 'only-for-edit' }) onlyForEdit: boolean = false\n\n render() {\n return html`\n <ox-record-view-body\n .columns=${this.columns}\n .record=${this.record}\n .rowIndex=${this.rowIndex}\n ?only-for-edit=${this.onlyForEdit}\n >\n </ox-record-view-body>\n <div footer>\n <button @click=${this.onReset.bind(this)}><mwc-icon>refresh</mwc-icon>Reset</button>\n <button @click=${this.onCancel.bind(this)}><mwc-icon>clear</mwc-icon>Cancel</button>\n <button @click=${this.onOK.bind(this)} ok><mwc-icon>radio_button_unchecked</mwc-icon>OK</button>\n </div>\n `\n }\n\n firstUpdated() {\n this.setAttribute('tabindex', '0')\n }\n\n onReset() {\n this.focus()\n\n this.dispatchEvent(\n new CustomEvent('reset', {\n detail: this.record\n })\n )\n }\n\n onCancel() {\n this.focus()\n\n this.dispatchEvent(\n new CustomEvent('cancel', {\n detail: this.record\n })\n )\n }\n\n onOK() {\n this.focus()\n\n this.dispatchEvent(\n new CustomEvent('ok', {\n detail: this.record\n })\n )\n }\n}\n"]}
@@ -1,9 +1,11 @@
1
1
  import { html } from 'lit';
2
+ const IMAGE_FALLBACK = new URL('../../../assets/images/no-image.png', import.meta.url).href;
2
3
  export const ImageRenderer = (value, column, record, rowIndex, field) => {
3
- if (!value)
4
- return html ``;
5
4
  let src;
6
- if (typeof value === 'string') {
5
+ if (!value) {
6
+ src = IMAGE_FALLBACK;
7
+ }
8
+ else if (typeof value === 'string') {
7
9
  src = value;
8
10
  }
9
11
  else {
@@ -11,6 +13,12 @@ export const ImageRenderer = (value, column, record, rowIndex, field) => {
11
13
  requestAnimationFrame(() => URL.revokeObjectURL(src));
12
14
  }
13
15
  const { width, height } = column.record.options || {};
14
- return html ` <img src=${src} alt="upload image" width=${width} height=${height} />`;
16
+ return html ` <img
17
+ src=${src}
18
+ width=${width}
19
+ height=${height}
20
+ style="max-width: 100%;"
21
+ onerror="this.src !== '${IMAGE_FALLBACK}' && (this.src = '${IMAGE_FALLBACK}')"
22
+ />`;
15
23
  };
16
24
  //# sourceMappingURL=image-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-renderer.js","sourceRoot":"","sources":["../../../src/renderers/image-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACrF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA,EAAE,CAAA;IAEzB,IAAI,GAAW,CAAA;IAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,GAAG,GAAG,KAAK,CAAA;KACZ;SAAM;QACL,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAChC,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;KACtD;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IAErD,OAAO,IAAI,CAAA,aAAa,GAAG,6BAA6B,KAAK,WAAW,MAAM,KAAK,CAAA;AACrF,CAAC,CAAA","sourcesContent":["import { FieldRenderer } from '../types'\nimport { html } from 'lit'\n\nexport const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n if (!value) return html``\n\n let src: string\n\n if (typeof value === 'string') {\n src = value\n } else {\n src = URL.createObjectURL(value)\n requestAnimationFrame(() => URL.revokeObjectURL(src))\n }\n\n const { width, height } = column.record.options || {}\n\n return html` <img src=${src} alt=\"upload image\" width=${width} height=${height} />`\n}\n"]}
1
+ {"version":3,"file":"image-renderer.js","sourceRoot":"","sources":["../../../src/renderers/image-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAI1B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAE3F,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IACrF,IAAI,GAAW,CAAA;IAEf,IAAI,CAAC,KAAK,EAAE;QACV,GAAG,GAAG,cAAc,CAAA;KACrB;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,GAAG,GAAG,KAAK,CAAA;KACZ;SAAM;QACL,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAChC,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;KACtD;IAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IAErD,OAAO,IAAI,CAAA;UACH,GAAG;YACD,KAAK;aACJ,MAAM;;6BAEU,cAAc,qBAAqB,cAAc;KACzE,CAAA;AACL,CAAC,CAAA","sourcesContent":["import { html } from 'lit'\n\nimport { FieldRenderer } from '../types'\n\nconst IMAGE_FALLBACK = new URL('../../../assets/images/no-image.png', import.meta.url).href\n\nexport const ImageRenderer: FieldRenderer = (value, column, record, rowIndex, field) => {\n let src: string\n\n if (!value) {\n src = IMAGE_FALLBACK\n } else if (typeof value === 'string') {\n src = value\n } else {\n src = URL.createObjectURL(value)\n requestAnimationFrame(() => URL.revokeObjectURL(src))\n }\n\n const { width, height } = column.record.options || {}\n\n return html` <img\n src=${src}\n width=${width}\n height=${height}\n style=\"max-width: 100%;\"\n onerror=\"this.src !== '${IMAGE_FALLBACK}' && (this.src = '${IMAGE_FALLBACK}')\"\n />`\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { LitElement, PropertyValues, TemplateResult } from 'lit';
2
+ import { ColumnConfig, GristConfig, SorterConfig } from '../types';
3
+ export declare class SortersControl extends LitElement {
4
+ static styles: import("lit").CSSResult[];
5
+ config: GristConfig;
6
+ columns: ColumnConfig[];
7
+ sorters: SorterConfig[];
8
+ connectedCallback(): void;
9
+ updated(changes: PropertyValues<this>): void;
10
+ render(): TemplateResult;
11
+ onChangeSort(name: string): void;
12
+ }
@@ -0,0 +1,106 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, state } from 'lit/decorators.js';
4
+ let SortersControl = class SortersControl extends LitElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.columns = [];
8
+ this.sorters = [];
9
+ }
10
+ connectedCallback() {
11
+ var _a;
12
+ super.connectedCallback();
13
+ const grist = this.closest('ox-grist');
14
+ if (grist) {
15
+ this.config = grist.config;
16
+ (_a = this.closest('ox-grist')) === null || _a === void 0 ? void 0 : _a.addEventListener('sorters-change', e => {
17
+ this.sorters = e.detail;
18
+ });
19
+ }
20
+ }
21
+ updated(changes) {
22
+ if (changes.has('config')) {
23
+ const sorters = this.config.sorters || [];
24
+ this.columns = sorters
25
+ .map(({ name }) => this.config.columns.find(column => column.name === name))
26
+ .filter(column => !!column);
27
+ this.sorters = this.config.sorters || [];
28
+ }
29
+ }
30
+ render() {
31
+ const columns = this.columns;
32
+ const current = this.sorters || [];
33
+ return html `
34
+ ${columns.map(column => {
35
+ const { name } = column;
36
+ var rank = current.findIndex(sorter => sorter.name === name) + 1;
37
+ var desc = rank !== 0 ? current[rank - 1].desc : null;
38
+ if (current.length <= 1) {
39
+ rank = 0;
40
+ }
41
+ return html `
42
+ <div
43
+ option
44
+ @click=${(e) => {
45
+ this.onChangeSort(name);
46
+ }}
47
+ >
48
+ ${column.header /*.renderer.call(this, column) */}
49
+ ${desc === null
50
+ ? html ``
51
+ : html `
52
+ <mwc-icon>${desc ? 'keyboard_arrow_up' : 'keyboard_arrow_down'}</mwc-icon>
53
+ ${rank === 0 ? html `` : html `<sub>${rank}</sub>`}
54
+ `}
55
+ </div>
56
+ `;
57
+ })}
58
+ `;
59
+ }
60
+ onChangeSort(name) {
61
+ var sorters = [...this.sorters];
62
+ var idx = sorters.findIndex(sorter => sorter.name == name);
63
+ if (idx !== -1) {
64
+ let sorter = sorters[idx];
65
+ if (sorter.desc) {
66
+ sorters.splice(idx, 1);
67
+ }
68
+ else {
69
+ sorter.desc = true;
70
+ }
71
+ }
72
+ else {
73
+ var sorter = {
74
+ name
75
+ };
76
+ sorters.push(sorter);
77
+ }
78
+ this.sorters = sorters;
79
+ this.dispatchEvent(new CustomEvent('sorters-change', {
80
+ bubbles: true,
81
+ composed: true,
82
+ detail: this.sorters
83
+ }));
84
+ }
85
+ };
86
+ SortersControl.styles = [
87
+ css `
88
+ :host {
89
+ display: block;
90
+ }
91
+ `
92
+ ];
93
+ __decorate([
94
+ state()
95
+ ], SortersControl.prototype, "config", void 0);
96
+ __decorate([
97
+ state()
98
+ ], SortersControl.prototype, "columns", void 0);
99
+ __decorate([
100
+ state()
101
+ ], SortersControl.prototype, "sorters", void 0);
102
+ SortersControl = __decorate([
103
+ customElement('ox-sorters-control')
104
+ ], SortersControl);
105
+ export { SortersControl };
106
+ //# sourceMappingURL=sorters-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorters-control.js","sourceRoot":"","sources":["../../../src/sorters/sorters-control.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, PropertyValues, TemplateResult } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { DataGrist } from '../data-grist'\nimport { ColumnConfig, GristConfig, SorterConfig } from '../types'\n\n@customElement('ox-sorters-control')\nexport class SortersControl extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n }\n `\n ]\n\n @state() config!: GristConfig\n @state() columns: ColumnConfig[] = []\n @state() sorters: SorterConfig[] = []\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const grist = this.closest('ox-grist') as DataGrist\n\n if (grist) {\n this.config = grist.config\n\n this.closest('ox-grist')?.addEventListener('sorters-change', e => {\n this.sorters = (e as CustomEvent).detail as SorterConfig[]\n })\n }\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n const sorters = this.config.sorters || []\n\n this.columns = sorters\n .map(({ name }) => this.config.columns.find(column => column.name === name))\n .filter(column => !!column) as ColumnConfig[]\n\n this.sorters = this.config.sorters || []\n }\n }\n\n render(): TemplateResult {\n const columns = this.columns\n\n const current = this.sorters || []\n\n return html`\n ${columns.map(column => {\n const { name } = column\n var rank = current.findIndex(sorter => sorter.name === name) + 1\n var desc = rank !== 0 ? current[rank - 1].desc : null\n\n if (current.length <= 1) {\n rank = 0\n }\n\n return html`\n <div\n option\n @click=${(e: MouseEvent) => {\n this.onChangeSort(name)\n }}\n >\n ${column.header /*.renderer.call(this, column) */}\n ${desc === null\n ? html``\n : html`\n <mwc-icon>${desc ? 'keyboard_arrow_up' : 'keyboard_arrow_down'}</mwc-icon>\n ${rank === 0 ? html`` : html`<sub>${rank}</sub>`}\n `}\n </div>\n `\n })}\n `\n }\n\n onChangeSort(name: string) {\n var sorters = [...this.sorters]\n\n var idx = sorters.findIndex(sorter => sorter.name == name)\n if (idx !== -1) {\n let sorter = sorters[idx]\n if (sorter.desc) {\n sorters.splice(idx, 1)\n } else {\n sorter.desc = true\n }\n } else {\n var sorter = {\n name\n }\n\n sorters.push(sorter)\n }\n\n this.sorters = sorters\n\n this.dispatchEvent(\n new CustomEvent('sorters-change', {\n bubbles: true,\n composed: true,\n detail: this.sorters\n })\n )\n }\n}\n"]}
@@ -84,16 +84,15 @@ export declare type RecordConfig = {
84
84
  };
85
85
  rowOptionField?: string;
86
86
  };
87
- export declare type FieldRenderer = (value: any, column: ColumnConfig, record: GristRecord, rowIndex: number, owner: RecordCard | DataCardGutter | DataCardField | DataListGutter | DataListField | RecordPartial | DataReportField) => TemplateResult | string | void;
87
+ export declare type FieldRenderer = (value: any, column: ColumnConfig, record: GristRecord, rowIndex: number, owner: RecordCard | DataCardGutter | DataCardField | DataListGutter | DataListField | RecordPartial | DataReportField | Element) => TemplateResult | string | void;
88
88
  export declare type FieldEditor = (value: any, column: ColumnConfig, record: GristRecord, rowIndex: number, field: DataGridField) => Element;
89
- export declare type FieldThumbnailRenderer = (record: GristRecord, rowIndex: number) => TemplateResult | string | void;
90
89
  export declare type FilterSelectRenderer = (column: ColumnConfig, owner: Element) => TemplateResult | string | void;
91
90
  export declare type GristEventHandlerSet = {
92
91
  click?: GristEventHandler;
93
92
  dblclick?: GristEventHandler;
94
93
  };
95
94
  export declare type ListConfig = {
96
- thumbnail: FieldThumbnailRenderer;
95
+ thumbnail?: string;
97
96
  fields: string[];
98
97
  details: string[];
99
98
  };