@operato/data-grist 0.3.4 → 0.3.13

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 (111) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/custom-elements.json +984 -2383
  3. package/demo/index.html +22 -12
  4. package/dist/src/data-card/data-card.js +1 -0
  5. package/dist/src/data-card/data-card.js.map +1 -1
  6. package/dist/src/data-grid/data-grid-field.d.ts +1 -1
  7. package/dist/src/data-grid/data-grid-field.js +3 -1
  8. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  9. package/dist/src/data-grid/data-grid-header.js +13 -7
  10. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  11. package/dist/src/data-grist.js +1 -1
  12. package/dist/src/data-grist.js.map +1 -1
  13. package/dist/src/data-list/data-list.js +1 -0
  14. package/dist/src/data-list/data-list.js.map +1 -1
  15. package/dist/src/filters/filter-checkbox.js +1 -0
  16. package/dist/src/filters/filter-checkbox.js.map +1 -1
  17. package/dist/src/filters/filter-input.js +1 -1
  18. package/dist/src/filters/filter-input.js.map +1 -1
  19. package/dist/src/filters/filter-range-date.js +1 -1
  20. package/dist/src/filters/filter-range-date.js.map +1 -1
  21. package/dist/src/filters/filter-range-number.js +2 -1
  22. package/dist/src/filters/filter-range-number.js.map +1 -1
  23. package/dist/src/filters/filters-form.d.ts +19 -0
  24. package/dist/src/filters/filters-form.js +99 -0
  25. package/dist/src/filters/filters-form.js.map +1 -0
  26. package/dist/src/filters/index.d.ts +1 -0
  27. package/dist/src/filters/index.js +1 -0
  28. package/dist/src/filters/index.js.map +1 -1
  29. package/dist/src/filters/registry.d.ts +5 -5
  30. package/dist/src/filters/registry.js +25 -25
  31. package/dist/src/filters/registry.js.map +1 -1
  32. package/dist/src/gutters/gutter-button.js +1 -0
  33. package/dist/src/gutters/gutter-button.js.map +1 -1
  34. package/dist/src/gutters/gutter-row-selector.js +1 -0
  35. package/dist/src/gutters/gutter-row-selector.js.map +1 -1
  36. package/dist/src/index.d.ts +1 -2
  37. package/dist/src/index.js +1 -2
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/record-view/record-view-body.d.ts +1 -1
  40. package/dist/src/record-view/record-view-body.js +5 -5
  41. package/dist/src/record-view/record-view-body.js.map +1 -1
  42. package/dist/src/record-view/record-view.d.ts +1 -1
  43. package/dist/src/record-view/record-view.js +1 -3
  44. package/dist/src/record-view/record-view.js.map +1 -1
  45. package/dist/src/types.d.ts +4 -3
  46. package/dist/src/types.js.map +1 -1
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +9 -8
  49. package/src/data-card/data-card.ts +2 -0
  50. package/src/data-grid/data-grid-field.ts +4 -2
  51. package/src/data-grid/data-grid-header.ts +12 -6
  52. package/src/data-grist.ts +1 -1
  53. package/src/data-list/data-list.ts +2 -0
  54. package/src/filters/filter-checkbox.ts +1 -0
  55. package/src/filters/filter-input.ts +1 -1
  56. package/src/filters/filter-range-date.ts +1 -1
  57. package/src/filters/filter-range-number.ts +2 -1
  58. package/src/filters/filters-form.ts +132 -0
  59. package/src/filters/index.ts +2 -0
  60. package/src/filters/registry.ts +26 -26
  61. package/src/gutters/gutter-button.ts +3 -2
  62. package/src/gutters/gutter-row-selector.ts +3 -2
  63. package/src/index.ts +1 -3
  64. package/src/record-view/record-view-body.ts +7 -7
  65. package/src/record-view/record-view.ts +2 -4
  66. package/src/types.ts +34 -4
  67. package/themes/grist-theme.css +2 -22
  68. package/dist/src/interfaces/index.d.ts +0 -2
  69. package/dist/src/interfaces/index.js +0 -3
  70. package/dist/src/interfaces/index.js.map +0 -1
  71. package/dist/src/interfaces/ox-grist-search-form.d.ts +0 -6
  72. package/dist/src/interfaces/ox-grist-search-form.js +0 -2
  73. package/dist/src/interfaces/ox-grist-search-form.js.map +0 -1
  74. package/dist/src/interfaces/ox-search-field.d.ts +0 -39
  75. package/dist/src/interfaces/ox-search-field.js +0 -2
  76. package/dist/src/interfaces/ox-search-field.js.map +0 -1
  77. package/dist/src/search-form/index.d.ts +0 -7
  78. package/dist/src/search-form/index.js +0 -8
  79. package/dist/src/search-form/index.js.map +0 -1
  80. package/dist/src/search-form/ox-basic-field.d.ts +0 -18
  81. package/dist/src/search-form/ox-basic-field.js +0 -75
  82. package/dist/src/search-form/ox-basic-field.js.map +0 -1
  83. package/dist/src/search-form/ox-checkbox-field.d.ts +0 -11
  84. package/dist/src/search-form/ox-checkbox-field.js +0 -60
  85. package/dist/src/search-form/ox-checkbox-field.js.map +0 -1
  86. package/dist/src/search-form/ox-grist-search-form.d.ts +0 -11
  87. package/dist/src/search-form/ox-grist-search-form.js +0 -177
  88. package/dist/src/search-form/ox-grist-search-form.js.map +0 -1
  89. package/dist/src/search-form/ox-number-field.d.ts +0 -14
  90. package/dist/src/search-form/ox-number-field.js +0 -112
  91. package/dist/src/search-form/ox-number-field.js.map +0 -1
  92. package/dist/src/search-form/ox-search-form.d.ts +0 -15
  93. package/dist/src/search-form/ox-search-form.js +0 -53
  94. package/dist/src/search-form/ox-search-form.js.map +0 -1
  95. package/dist/src/search-form/ox-select-field.d.ts +0 -21
  96. package/dist/src/search-form/ox-select-field.js +0 -181
  97. package/dist/src/search-form/ox-select-field.js.map +0 -1
  98. package/dist/src/search-form/ox-text-field.d.ts +0 -11
  99. package/dist/src/search-form/ox-text-field.js +0 -60
  100. package/dist/src/search-form/ox-text-field.js.map +0 -1
  101. package/src/interfaces/index.ts +0 -2
  102. package/src/interfaces/ox-grist-search-form.ts +0 -7
  103. package/src/interfaces/ox-search-field.ts +0 -52
  104. package/src/search-form/index.ts +0 -7
  105. package/src/search-form/ox-basic-field.ts +0 -86
  106. package/src/search-form/ox-checkbox-field.ts +0 -57
  107. package/src/search-form/ox-grist-search-form.ts +0 -200
  108. package/src/search-form/ox-number-field.ts +0 -113
  109. package/src/search-form/ox-search-form.ts +0 -71
  110. package/src/search-form/ox-select-field.ts +0 -189
  111. package/src/search-form/ox-text-field.ts +0 -55
@@ -5,6 +5,6 @@ export const FilterRangeDate = (column, owner) => {
5
5
  if (type === 'datetime') {
6
6
  type = 'datetime-local';
7
7
  }
8
- return html ` <input name="from" type=${type} /> ~ <input name="to" type=${type} /> `;
8
+ return html ` <input name="${column.name}" type=${type} /> ~ <input name="${column.name}" type=${type} /> `;
9
9
  };
10
10
  //# sourceMappingURL=filter-range-date.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-range-date.js","sourceRoot":"","sources":["../../../src/filters/filter-range-date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,eAAe,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,IAAI,IAAI,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IAClF,IAAI,IAAI,KAAK,UAAU,EAAE;QACvB,IAAI,GAAG,gBAAgB,CAAA;KACxB;IAED,OAAO,IAAI,CAAA,4BAA4B,IAAI,+BAA+B,IAAI,MAAM,CAAA;AACtF,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterRangeDate: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter\n var type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n if (type === 'datetime') {\n type = 'datetime-local'\n }\n\n return html` <input name=\"from\" type=${type} /> ~ <input name=\"to\" type=${type} /> `\n}\n"]}
1
+ {"version":3,"file":"filter-range-date.js","sourceRoot":"","sources":["../../../src/filters/filter-range-date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,eAAe,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,IAAI,IAAI,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IAClF,IAAI,IAAI,KAAK,UAAU,EAAE;QACvB,IAAI,GAAG,gBAAgB,CAAA;KACxB;IAED,OAAO,IAAI,CAAA,iBAAiB,MAAM,CAAC,IAAI,UAAU,IAAI,sBAAsB,MAAM,CAAC,IAAI,UAAU,IAAI,MAAM,CAAA;AAC5G,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterRangeDate: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter\n var type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n if (type === 'datetime') {\n type = 'datetime-local'\n }\n\n return html` <input name=\"${column.name}\" type=${type} /> ~ <input name=\"${column.name}\" type=${type} /> `\n}\n"]}
@@ -3,7 +3,8 @@ export const FilterRangeNumber = (column, owner) => {
3
3
  const filter = column.filter;
4
4
  const type = typeof filter === 'boolean' ? column.type : (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
5
5
  return html `
6
- <input name="from" type="number" placeholder="minimum" /> ~ <input name="to" type="number" placeholder="maximum" />
6
+ <input name="${column.name}" type="number" placeholder="minimum" /> ~
7
+ <input name="${column.name}" type="number" placeholder="maximum" />
7
8
  `;
8
9
  };
9
10
  //# sourceMappingURL=filter-range-number.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-range-number.js","sourceRoot":"","sources":["../../../src/filters/filter-range-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IAEpF,OAAO,IAAI,CAAA;;GAEV,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterRangeNumber: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter\n const type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n\n return html`\n <input name=\"from\" type=\"number\" placeholder=\"minimum\" /> ~ <input name=\"to\" type=\"number\" placeholder=\"maximum\" />\n `\n}\n"]}
1
+ {"version":3,"file":"filter-range-number.js","sourceRoot":"","sources":["../../../src/filters/filter-range-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IAEpF,OAAO,IAAI,CAAA;mBACM,MAAM,CAAC,IAAI;mBACX,MAAM,CAAC,IAAI;GAC3B,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterRangeNumber: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter\n const type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n\n return html`\n <input name=\"${column.name}\" type=\"number\" placeholder=\"minimum\" /> ~\n <input name=\"${column.name}\" type=\"number\" placeholder=\"maximum\" />\n `\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import '@operato/input/ox-checkbox.js';
2
+ import '@operato/input/ox-select.js';
3
+ import '@operato/popup/ox-popup-list.js';
4
+ import { LitElement, TemplateResult } from 'lit';
5
+ import { GristConfig } from '../types';
6
+ export declare type QueryFilterRangeValue = [from: number, to: number];
7
+ export declare type QueryFilter = {
8
+ name: string;
9
+ operator?: 'eq' | 'between' | 'gte' | 'lte' | 'is_not_true' | 'in' | 'like' | 'i_like' | 'noteq' | 'is_empty_num_id' | 'is_blank' | 'is_present' | 'is_not_false' | 'is_true' | 'is_false' | 'is_not_null' | 'is_null' | 'notin_with_null' | 'notin' | 'gt' | 'lt' | 'i_nlike' | 'nlike';
10
+ value: any;
11
+ };
12
+ export declare class FiltersForm extends LitElement {
13
+ static styles: import("lit").CSSResult[];
14
+ config: GristConfig;
15
+ defaultOperator: string;
16
+ form: HTMLFormElement;
17
+ render(): TemplateResult;
18
+ get queryFilters(): QueryFilter[];
19
+ }
@@ -0,0 +1,99 @@
1
+ import { __decorate } from "tslib";
2
+ import '@operato/input/ox-checkbox.js';
3
+ import '@operato/input/ox-select.js';
4
+ import '@operato/popup/ox-popup-list.js';
5
+ import { css, html, LitElement } from 'lit';
6
+ import { customElement, property, query } from 'lit/decorators.js';
7
+ import { FilterStyles } from './filter-styles';
8
+ import { getFilterRenderer } from './registry';
9
+ let FiltersForm = class FiltersForm extends LitElement {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.defaultOperator = 'eq';
13
+ }
14
+ render() {
15
+ const columns = this.config.columns.filter(columnConfig => columnConfig.filter);
16
+ return html `
17
+ <form>
18
+ ${columns.map((column) => {
19
+ const { name, label, filter } = column;
20
+ const placeholder = typeof label === 'string'
21
+ ? name
22
+ : typeof label !== 'object'
23
+ ? name
24
+ : label.renderer
25
+ ? label.renderer()
26
+ : name;
27
+ const type = typeof filter === 'boolean' ? column.type : (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
28
+ const idx = typeof filter === 'boolean' ? 0 : filter.operator === 'between' ? 1 : 0;
29
+ const renderer = getFilterRenderer(type)[idx];
30
+ if (!renderer) {
31
+ return html ``;
32
+ }
33
+ return column.type === 'select'
34
+ ? html `
35
+ <ox-select name="${name}" placeholder="${placeholder}">
36
+ <ox-popup-list multiple attr-selected="checked" with-search>
37
+ ${renderer(column, this)}
38
+ </ox-popup-list>
39
+ </ox-select>
40
+ `
41
+ : html ` <label filter-title>${column.name} ${renderer(column, this)} </label> `;
42
+ })}
43
+ </form>
44
+ `;
45
+ }
46
+ get queryFilters() {
47
+ var formData = new FormData(this.form);
48
+ return this.config.columns
49
+ .filter(columnConfig => columnConfig.filter)
50
+ .map((column) => {
51
+ const { name, filter } = column;
52
+ const operator = typeof filter === 'boolean' ? 'eq' : filter.operator || 'eq';
53
+ var value = formData.getAll(name);
54
+ if (value.length == 0) {
55
+ return;
56
+ }
57
+ if (-1 === value.findIndex(v => v !== '')) {
58
+ return;
59
+ }
60
+ return {
61
+ name,
62
+ operator,
63
+ value: value.length === 1 ? value[0] : value
64
+ };
65
+ })
66
+ .filter(result => result !== undefined);
67
+ }
68
+ };
69
+ FiltersForm.styles = [
70
+ FilterStyles,
71
+ css `
72
+ :host {
73
+ display: flex;
74
+ }
75
+
76
+ form {
77
+ flex: 1;
78
+
79
+ display: flex;
80
+ flex-direction: row;
81
+
82
+ justify-content: space-between;
83
+ }
84
+ `
85
+ ];
86
+ __decorate([
87
+ property({ type: Object })
88
+ ], FiltersForm.prototype, "config", void 0);
89
+ __decorate([
90
+ property({ type: String })
91
+ ], FiltersForm.prototype, "defaultOperator", void 0);
92
+ __decorate([
93
+ query('form')
94
+ ], FiltersForm.prototype, "form", void 0);
95
+ FiltersForm = __decorate([
96
+ customElement('ox-filters-form')
97
+ ], FiltersForm);
98
+ export { FiltersForm };
99
+ //# sourceMappingURL=filters-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters-form.js","sourceRoot":"","sources":["../../../src/filters/filters-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-checkbox.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { ColumnConfig } from '..'\nimport { GristConfig } from '../types'\nimport { FilterStyles } from './filter-styles'\nimport { getFilterRenderer } from './registry'\n\nexport type QueryFilterRangeValue = [from: number, to: number]\n\nexport type QueryFilter = {\n name: string\n operator?:\n | 'eq'\n | 'between'\n | 'gte'\n | 'lte'\n | 'is_not_true'\n | 'in'\n | 'like'\n | 'i_like'\n | 'noteq'\n | 'is_empty_num_id'\n | 'is_blank'\n | 'is_present'\n | 'is_not_false'\n | 'is_true'\n | 'is_false'\n | 'is_not_null'\n | 'is_null'\n | 'notin_with_null'\n | 'notin'\n | 'gt'\n | 'lt'\n | 'i_nlike'\n | 'nlike'\n value: any\n}\n\n@customElement('ox-filters-form')\nexport class FiltersForm extends LitElement {\n static styles = [\n FilterStyles,\n css`\n :host {\n display: flex;\n }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: row;\n\n justify-content: space-between;\n }\n `\n ]\n\n @property({ type: Object }) config!: GristConfig\n @property({ type: String }) defaultOperator: string = 'eq'\n @query('form') form!: HTMLFormElement\n\n render(): TemplateResult {\n const columns = this.config.columns.filter(columnConfig => columnConfig.filter)\n\n return html`\n <form>\n ${columns.map((column: ColumnConfig) => {\n const { name, label, filter } = column\n const placeholder =\n typeof label === 'string'\n ? name\n : typeof label !== 'object'\n ? name\n : label.renderer\n ? label.renderer()\n : name\n\n const type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n const idx = typeof filter === 'boolean' ? 0 : filter!.operator === 'between' ? 1 : 0\n const renderer = getFilterRenderer(type)[idx]\n\n if (!renderer) {\n return html``\n }\n\n return column.type === 'select'\n ? html`\n <ox-select name=\"${name}\" placeholder=\"${placeholder}\">\n <ox-popup-list multiple attr-selected=\"checked\" with-search>\n ${renderer(column, this)}\n </ox-popup-list>\n </ox-select>\n `\n : html` <label filter-title>${column.name} ${renderer(column, this)} </label> `\n })}\n </form>\n `\n }\n\n get queryFilters(): QueryFilter[] {\n var formData = new FormData(this.form)\n\n return this.config.columns\n .filter(columnConfig => columnConfig.filter)\n .map((column: ColumnConfig) => {\n const { name, filter } = column\n const operator = typeof filter === 'boolean' ? 'eq' : filter!.operator || 'eq'\n\n var value = formData.getAll(name)\n if (value.length == 0) {\n return\n }\n\n if (-1 === value.findIndex(v => v !== '')) {\n return\n }\n\n return {\n name,\n operator,\n value: value.length === 1 ? value[0] : value\n }\n })\n .filter(result => result !== undefined) as QueryFilter[]\n }\n}\n"]}
@@ -4,3 +4,4 @@ export * from './filter-input';
4
4
  export * from './filter-checkbox';
5
5
  export * from './filter-range-date';
6
6
  export * from './filter-range-number';
7
+ export * from './filters-form';
@@ -4,4 +4,5 @@ export * from './filter-input';
4
4
  export * from './filter-checkbox';
5
5
  export * from './filter-range-date';
6
6
  export * from './filter-range-number';
7
+ export * from './filters-form';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA","sourcesContent":["export * from './registry'\n\nexport * from './filter-select'\nexport * from './filter-input'\nexport * from './filter-checkbox'\nexport * from './filter-range-date'\nexport * from './filter-range-number'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AAErC,cAAc,gBAAgB,CAAA","sourcesContent":["export * from './registry'\n\nexport * from './filter-select'\nexport * from './filter-input'\nexport * from './filter-checkbox'\nexport * from './filter-range-date'\nexport * from './filter-range-number'\n\nexport * from './filters-form'\n"]}
@@ -1,7 +1,7 @@
1
1
  import { FilterSelectRenderer } from '../types';
2
- export declare function registerRenderer(type: string, renderer: FilterSelectRenderer): void;
3
- export declare function unregisterRenderer(type: string): void;
4
- export declare function getRenderers(): {
5
- [name: string]: FilterSelectRenderer;
2
+ export declare function registerFilterRenderer(type: string, renderer: FilterSelectRenderer[]): void;
3
+ export declare function unregisterFilterRenderer(type: string): void;
4
+ export declare function getFilterRenderers(): {
5
+ [name: string]: FilterSelectRenderer[];
6
6
  };
7
- export declare function getRenderer(type: string | FilterSelectRenderer): FilterSelectRenderer;
7
+ export declare function getFilterRenderer(type: string): FilterSelectRenderer[];
@@ -4,40 +4,40 @@ import { FilterRangeDate } from './filter-range-date';
4
4
  import { FilterRangeNumber } from './filter-range-number';
5
5
  import { FilterSelect } from './filter-select';
6
6
  var RENDERERS = {
7
- string: FilterInput,
8
- text: FilterInput,
9
- email: FilterInput,
10
- tel: FilterInput,
11
- integer: FilterRangeNumber,
12
- float: FilterRangeNumber,
13
- number: FilterRangeNumber,
14
- select: FilterSelect,
15
- boolean: FilterCheckbox,
16
- checkbox: FilterCheckbox,
17
- month: FilterRangeDate,
18
- week: FilterRangeDate,
19
- date: FilterRangeDate,
20
- time: FilterRangeDate,
21
- datetime: FilterRangeDate,
22
- color: FilterInput,
23
- progress: FilterRangeNumber,
24
- link: FilterInput,
25
- image: FilterInput,
26
- json5: FilterInput
7
+ string: [FilterInput],
8
+ text: [FilterInput],
9
+ email: [FilterInput],
10
+ tel: [FilterInput],
11
+ integer: [FilterInput, FilterRangeNumber],
12
+ float: [FilterInput, FilterRangeNumber],
13
+ number: [FilterInput, FilterRangeNumber],
14
+ select: [FilterSelect],
15
+ boolean: [FilterCheckbox],
16
+ checkbox: [FilterCheckbox],
17
+ month: [FilterInput, FilterRangeDate],
18
+ week: [FilterInput, FilterRangeDate],
19
+ date: [FilterInput, FilterRangeDate],
20
+ time: [FilterInput, FilterRangeDate],
21
+ datetime: [FilterInput, FilterRangeDate],
22
+ color: [FilterInput],
23
+ progress: [FilterInput, FilterRangeNumber],
24
+ link: [FilterInput],
25
+ image: [FilterInput],
26
+ json5: [FilterInput]
27
27
  };
28
- export function registerRenderer(type, renderer) {
28
+ export function registerFilterRenderer(type, renderer) {
29
29
  RENDERERS[type] = renderer;
30
30
  }
31
- export function unregisterRenderer(type) {
31
+ export function unregisterFilterRenderer(type) {
32
32
  delete RENDERERS[type];
33
33
  }
34
- export function getRenderers() {
34
+ export function getFilterRenderers() {
35
35
  return { ...RENDERERS };
36
36
  }
37
- export function getRenderer(type) {
37
+ export function getFilterRenderer(type) {
38
38
  if (typeof type == 'function') {
39
39
  return type;
40
40
  }
41
- return RENDERERS[type || 'text'] || FilterSelect;
41
+ return RENDERERS[type || 'text'] || [FilterInput];
42
42
  }
43
43
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/filters/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,IAAI,SAAS,GAET;IACF,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,WAAW;IAChB,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,cAAc;IACxB,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,iBAAiB;IAC3B,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;CACnB,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAA8B;IAC3E,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAmC;IAC7D,IAAI,OAAO,IAAI,IAAI,UAAU,EAAE;QAC7B,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,YAAY,CAAA;AAClD,CAAC","sourcesContent":["import { FilterSelectRenderer } from '../types'\nimport { FilterCheckbox } from './filter-checkbox'\nimport { FilterInput } from './filter-input'\nimport { FilterRangeDate } from './filter-range-date'\nimport { FilterRangeNumber } from './filter-range-number'\nimport { FilterSelect } from './filter-select'\n\nvar RENDERERS: {\n [name: string]: FilterSelectRenderer\n} = {\n string: FilterInput,\n text: FilterInput,\n email: FilterInput,\n tel: FilterInput,\n integer: FilterRangeNumber,\n float: FilterRangeNumber,\n number: FilterRangeNumber,\n select: FilterSelect,\n boolean: FilterCheckbox,\n checkbox: FilterCheckbox,\n month: FilterRangeDate,\n week: FilterRangeDate,\n date: FilterRangeDate,\n time: FilterRangeDate,\n datetime: FilterRangeDate,\n color: FilterInput,\n progress: FilterRangeNumber,\n link: FilterInput,\n image: FilterInput,\n json5: FilterInput\n}\n\nexport function registerRenderer(type: string, renderer: FilterSelectRenderer) {\n RENDERERS[type] = renderer\n}\n\nexport function unregisterRenderer(type: string): void {\n delete RENDERERS[type]\n}\n\nexport function getRenderers(): { [name: string]: FilterSelectRenderer } {\n return { ...RENDERERS }\n}\n\nexport function getRenderer(type: string | FilterSelectRenderer): FilterSelectRenderer {\n if (typeof type == 'function') {\n return type\n }\n\n return RENDERERS[type || 'text'] || FilterSelect\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/filters/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,IAAI,SAAS,GAET;IACF,MAAM,EAAE,CAAC,WAAW,CAAC;IACrB,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,GAAG,EAAE,CAAC,WAAW,CAAC;IAClB,OAAO,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACzC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACvC,MAAM,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,QAAQ,EAAE,CAAC,cAAc,CAAC;IAC1B,KAAK,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IACrC,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IACpC,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IACpC,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IACpC,QAAQ,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IACxC,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,QAAQ,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC1C,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,KAAK,EAAE,CAAC,WAAW,CAAC;CACrB,CAAA;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,QAAgC;IACnF,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,OAAO,IAAI,IAAI,UAAU,EAAE;QAC7B,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACnD,CAAC","sourcesContent":["import { FilterSelectRenderer } from '../types'\nimport { FilterCheckbox } from './filter-checkbox'\nimport { FilterInput } from './filter-input'\nimport { FilterRangeDate } from './filter-range-date'\nimport { FilterRangeNumber } from './filter-range-number'\nimport { FilterSelect } from './filter-select'\n\nvar RENDERERS: {\n [name: string]: FilterSelectRenderer[]\n} = {\n string: [FilterInput],\n text: [FilterInput],\n email: [FilterInput],\n tel: [FilterInput],\n integer: [FilterInput, FilterRangeNumber],\n float: [FilterInput, FilterRangeNumber],\n number: [FilterInput, FilterRangeNumber],\n select: [FilterSelect],\n boolean: [FilterCheckbox],\n checkbox: [FilterCheckbox],\n month: [FilterInput, FilterRangeDate],\n week: [FilterInput, FilterRangeDate],\n date: [FilterInput, FilterRangeDate],\n time: [FilterInput, FilterRangeDate],\n datetime: [FilterInput, FilterRangeDate],\n color: [FilterInput],\n progress: [FilterInput, FilterRangeNumber],\n link: [FilterInput],\n image: [FilterInput],\n json5: [FilterInput]\n}\n\nexport function registerFilterRenderer(type: string, renderer: FilterSelectRenderer[]) {\n RENDERERS[type] = renderer\n}\n\nexport function unregisterFilterRenderer(type: string): void {\n delete RENDERERS[type]\n}\n\nexport function getFilterRenderers(): { [name: string]: FilterSelectRenderer[] } {\n return { ...RENDERERS }\n}\n\nexport function getFilterRenderer(type: string): FilterSelectRenderer[] {\n if (typeof type == 'function') {\n return type\n }\n\n return RENDERERS[type || 'text'] || [FilterInput]\n}\n"]}
@@ -18,6 +18,7 @@ export class GutterButton {
18
18
  }
19
19
  },
20
20
  record: {
21
+ align: 'center',
21
22
  renderer: function (value, column, record, rowIndex, field) {
22
23
  return html ` <mwc-icon style=${inlineRecordStyle}>${iconFn(record)}</mwc-icon> `;
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gutter-button.js","sourceRoot":"","sources":["../../../src/gutters/gutter-button.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAI3B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,SAAc,EAAE;QAC9B,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,MAAM,CAAA;QAE9B,IAAI,MAAM,GAAG,OAAO,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;QAE1D,IAAI,iBAAiB,GAAG,wDAAwD,CAAA;QAChF,IAAI,iBAAiB,GAAG,wDAAwD,CAAA;QAEhF,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,EACF;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU,MAAM;oBACxB,OAAO,IAAI,CAAA,oBAAoB,iBAAiB,IAAI,MAAM,EAAE,cAAc,CAAA;gBAC5E,CAAmB;aACpB;YACD,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;oBACxD,OAAO,IAAI,CAAA,oBAAoB,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAA;gBAClF,CAAkB;aACnB;YACD,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,EACD,MAAM,CACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import '@material/mwc-icon'\n\nimport { FieldRenderer, HeaderRenderer } from '../types'\n\nimport { html } from 'lit'\n\nexport class GutterButton {\n static instance(config: any = {}) {\n var { icon = 'edit' } = config\n\n var iconFn = typeof icon == 'function' ? icon : () => icon\n\n var inlineHeaderStyle = 'font-size: var(--grid-record-fontsize);margin-top:1px;'\n var inlineRecordStyle = 'font-size: var(--grid-record-fontsize);margin-top:1px;'\n\n return Object.assign(\n {},\n {\n type: 'gutter',\n gutterType: 'button',\n width: 26,\n resizable: false,\n sortable: false,\n header: {\n renderer: function (column) {\n return html` <mwc-icon style=${inlineHeaderStyle}>${iconFn()}</mwc-icon> `\n } as HeaderRenderer\n },\n record: {\n renderer: function (value, column, record, rowIndex, field) {\n return html` <mwc-icon style=${inlineRecordStyle}>${iconFn(record)}</mwc-icon> `\n } as FieldRenderer\n },\n forGrid: true,\n forList: true\n },\n config\n )\n }\n}\n"]}
1
+ {"version":3,"file":"gutter-button.js","sourceRoot":"","sources":["../../../src/gutters/gutter-button.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAI1B,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,QAAQ,CAAC,SAAc,EAAE;QAC9B,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,MAAM,CAAA;QAE9B,IAAI,MAAM,GAAG,OAAO,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;QAE1D,IAAI,iBAAiB,GAAG,wDAAwD,CAAA;QAChF,IAAI,iBAAiB,GAAG,wDAAwD,CAAA;QAEhF,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,EACF;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU,MAAM;oBACxB,OAAO,IAAI,CAAA,oBAAoB,iBAAiB,IAAI,MAAM,EAAE,cAAc,CAAA;gBAC5E,CAAmB;aACpB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;oBACxD,OAAO,IAAI,CAAA,oBAAoB,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAA;gBAClF,CAAkB;aACnB;YACD,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,EACD,MAAM,CACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import '@material/mwc-icon'\n\nimport { html } from 'lit'\n\nimport { FieldRenderer, HeaderRenderer } from '../types'\n\nexport class GutterButton {\n static instance(config: any = {}) {\n var { icon = 'edit' } = config\n\n var iconFn = typeof icon == 'function' ? icon : () => icon\n\n var inlineHeaderStyle = 'font-size: var(--grid-record-fontsize);margin-top:1px;'\n var inlineRecordStyle = 'font-size: var(--grid-record-fontsize);margin-top:1px;'\n\n return Object.assign(\n {},\n {\n type: 'gutter',\n gutterType: 'button',\n width: 26,\n resizable: false,\n sortable: false,\n header: {\n renderer: function (column) {\n return html` <mwc-icon style=${inlineHeaderStyle}>${iconFn()}</mwc-icon> `\n } as HeaderRenderer\n },\n record: {\n align: 'center',\n renderer: function (value, column, record, rowIndex, field) {\n return html` <mwc-icon style=${inlineRecordStyle}>${iconFn(record)}</mwc-icon> `\n } as FieldRenderer\n },\n forGrid: true,\n forList: true\n },\n config\n )\n }\n}\n"]}
@@ -31,6 +31,7 @@ export class GutterRowSelector {
31
31
  }
32
32
  },
33
33
  record: {
34
+ align: 'center',
34
35
  renderer: function (value, column, record, rowIndex, field) {
35
36
  return html `
36
37
  <input
@@ -1 +1 @@
1
- {"version":3,"file":"gutter-row-selector.js","sourceRoot":"","sources":["../../../src/gutters/gutter-row-selector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAS;QAChC,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,EACF;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,cAAc;YACpB,UAAU,EAAE,cAAc;YAC1B,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAgD,MAAM;oBAC9D,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;oBAEtF,OAAO,IAAI,CAAA;;;2BAGI,OAAO;0BACR,CAAC,CAAQ,EAAE,EAAE;wBACrB,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;wBAE/E,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,mBAAmB,EAAE;4BACnC,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,IAAI;4BACd,MAAM,EAAE;gCACN,QAAQ;6BACT;yBACF,CAAC,CACH,CAAA;wBAED,CAAC,CAAC,eAAe,EAAE,CAAA;oBACrB,CAAC;;aAEJ,CAAA;gBACH,CAAmB;aACpB;YACD,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;oBACxD,OAAO,IAAI,CAAA;;uBAEA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;2BAClC,CAAC,CAAC,KAAK;0BACR,CAAC,CAAQ,EAAE,EAAE;wBACrB,IAAI,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAA;wBAErD,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ;4BAC1B,CAAC,CAAC;gCACE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gCAC/B,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;6BAClC;4BACH,CAAC,CAAC;gCACE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;6BAClC,CAAA;wBAEL,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,sBAAsB,EAAE;4BACtC,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,IAAI;4BACd,MAAM;yBACP,CAAC,CACH,CAAA;wBAED,CAAC,CAAC,eAAe,EAAE,CAAA;oBACrB,CAAC;;aAEJ,CAAA;gBACH,CAAkB;aACnB;YACD,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,EACD,MAAM,CACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import { FieldRenderer, HeaderRenderer } from '../types'\n\nimport { DataCard } from '../data-card/data-card'\nimport { DataGrid } from '../data-grid/data-grid'\nimport { DataList } from '../data-list/data-list'\nimport { html } from 'lit'\n\nexport class GutterRowSelector {\n static instance(config = {} as any) {\n return Object.assign(\n {},\n {\n type: 'gutter',\n name: '__selected__',\n gutterType: 'row-selector',\n width: 30,\n resizable: false,\n sortable: false,\n header: {\n renderer: function (this: DataGrid | DataList | DataCard, column) {\n var checked = ((this.data || {}).records || []).find(record => record['__selected__'])\n\n return html`\n <input\n type=\"checkbox\"\n .checked=${checked}\n @change=${(e: Event) => {\n let selected = column.multiple ? (e.target as HTMLInputElement).checked : false\n\n this.dispatchEvent(\n new CustomEvent('select-all-change', {\n bubbles: true,\n composed: true,\n detail: {\n selected\n }\n })\n )\n\n e.stopPropagation()\n }}\n />\n `\n } as HeaderRenderer\n },\n record: {\n renderer: function (value, column, record, rowIndex, field) {\n return html`\n <input\n type=${column.multiple ? 'checkbox' : 'radio'}\n .checked=${!!value}\n @change=${(e: Event) => {\n let selected = (e.target as HTMLInputElement).checked\n\n let detail = column.multiple\n ? {\n added: selected ? [record] : [],\n removed: selected ? [] : [record]\n }\n : {\n records: selected ? [record] : []\n }\n\n field.dispatchEvent(\n new CustomEvent('select-record-change', {\n bubbles: true,\n composed: true,\n detail\n })\n )\n\n e.stopPropagation()\n }}\n />\n `\n } as FieldRenderer\n },\n forGrid: true,\n forList: true\n },\n config\n )\n }\n}\n"]}
1
+ {"version":3,"file":"gutter-row-selector.js","sourceRoot":"","sources":["../../../src/gutters/gutter-row-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAO1B,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAS;QAChC,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,EACF;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,cAAc;YACpB,UAAU,EAAE,cAAc;YAC1B,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAgD,MAAM;oBAC9D,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;oBAEtF,OAAO,IAAI,CAAA;;;2BAGI,OAAO;0BACR,CAAC,CAAQ,EAAE,EAAE;wBACrB,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;wBAE/E,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,mBAAmB,EAAE;4BACnC,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,IAAI;4BACd,MAAM,EAAE;gCACN,QAAQ;6BACT;yBACF,CAAC,CACH,CAAA;wBAED,CAAC,CAAC,eAAe,EAAE,CAAA;oBACrB,CAAC;;aAEJ,CAAA;gBACH,CAAmB;aACpB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;oBACxD,OAAO,IAAI,CAAA;;uBAEA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;2BAClC,CAAC,CAAC,KAAK;0BACR,CAAC,CAAQ,EAAE,EAAE;wBACrB,IAAI,QAAQ,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAA;wBAErD,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ;4BAC1B,CAAC,CAAC;gCACE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gCAC/B,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;6BAClC;4BACH,CAAC,CAAC;gCACE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;6BAClC,CAAA;wBAEL,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,sBAAsB,EAAE;4BACtC,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,IAAI;4BACd,MAAM;yBACP,CAAC,CACH,CAAA;wBAED,CAAC,CAAC,eAAe,EAAE,CAAA;oBACrB,CAAC;;aAEJ,CAAA;gBACH,CAAkB;aACnB;YACD,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,EACD,MAAM,CACP,CAAA;IACH,CAAC;CACF","sourcesContent":["import { html } from 'lit'\n\nimport { DataCard } from '../data-card/data-card'\nimport { DataGrid } from '../data-grid/data-grid'\nimport { DataList } from '../data-list/data-list'\nimport { FieldRenderer, HeaderRenderer } from '../types'\n\nexport class GutterRowSelector {\n static instance(config = {} as any) {\n return Object.assign(\n {},\n {\n type: 'gutter',\n name: '__selected__',\n gutterType: 'row-selector',\n width: 30,\n resizable: false,\n sortable: false,\n header: {\n renderer: function (this: DataGrid | DataList | DataCard, column) {\n var checked = ((this.data || {}).records || []).find(record => record['__selected__'])\n\n return html`\n <input\n type=\"checkbox\"\n .checked=${checked}\n @change=${(e: Event) => {\n let selected = column.multiple ? (e.target as HTMLInputElement).checked : false\n\n this.dispatchEvent(\n new CustomEvent('select-all-change', {\n bubbles: true,\n composed: true,\n detail: {\n selected\n }\n })\n )\n\n e.stopPropagation()\n }}\n />\n `\n } as HeaderRenderer\n },\n record: {\n align: 'center',\n renderer: function (value, column, record, rowIndex, field) {\n return html`\n <input\n type=${column.multiple ? 'checkbox' : 'radio'}\n .checked=${!!value}\n @change=${(e: Event) => {\n let selected = (e.target as HTMLInputElement).checked\n\n let detail = column.multiple\n ? {\n added: selected ? [record] : [],\n removed: selected ? [] : [record]\n }\n : {\n records: selected ? [record] : []\n }\n\n field.dispatchEvent(\n new CustomEvent('select-record-change', {\n bubbles: true,\n composed: true,\n detail\n })\n )\n\n e.stopPropagation()\n }}\n />\n `\n } as FieldRenderer\n },\n forGrid: true,\n forList: true\n },\n config\n )\n }\n}\n"]}
@@ -7,5 +7,4 @@ export * from './renderers';
7
7
  export * from './handlers';
8
8
  export * from './formatters';
9
9
  export * from './gutters';
10
- export * from './interfaces';
11
- export * from './search-form';
10
+ export * from './filters';
package/dist/src/index.js CHANGED
@@ -7,6 +7,5 @@ export * from './renderers';
7
7
  export * from './handlers';
8
8
  export * from './formatters';
9
9
  export * from './gutters';
10
- export * from './interfaces';
11
- export * from './search-form';
10
+ export * from './filters';
12
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AAEvB,cAAc,yBAAyB,CAAA;AACvC,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAE7B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AAEzB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA","sourcesContent":["export * from './types'\n\nexport * from './configure/zero-config'\nexport * from './data-grist'\nexport * from './data-report'\n\nexport * from './editors'\nexport * from './renderers'\nexport * from './handlers'\nexport * from './formatters'\nexport * from './gutters'\n\nexport * from './interfaces'\nexport * from './search-form'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AAEvB,cAAc,yBAAyB,CAAA;AACvC,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAE7B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA","sourcesContent":["export * from './types'\n\nexport * from './configure/zero-config'\nexport * from './data-grist'\nexport * from './data-report'\n\nexport * from './editors'\nexport * from './renderers'\nexport * from './handlers'\nexport * from './formatters'\nexport * from './gutters'\nexport * from './filters'\n"]}
@@ -1,7 +1,7 @@
1
1
  import '@material/mwc-icon';
2
2
  import '../data-grid/data-grid-field';
3
- import { ColumnConfig, GristRecord } from '../types';
4
3
  import { LitElement } from 'lit';
4
+ import { ColumnConfig, GristRecord } from '../types';
5
5
  export declare class RecordViewBody extends LitElement {
6
6
  static styles: import("lit").CSSResult[];
7
7
  columns: ColumnConfig[];
@@ -1,7 +1,7 @@
1
1
  import { __decorate } from "tslib";
2
2
  import '@material/mwc-icon';
3
3
  import '../data-grid/data-grid-field';
4
- import { LitElement, css, html } from 'lit';
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
7
  const KEY_ENTER = 13;
@@ -22,7 +22,7 @@ let RecordViewBody = class RecordViewBody extends LitElement {
22
22
  let { editable } = column.record;
23
23
  let dirtyFields = record['__dirtyfields__'] || {};
24
24
  return html `
25
- <label ?editable=${editable}>${this._renderLabel(column)} <mwc-icon>edit</mwc-icon></label>
25
+ <label ?editable=${editable}><span>${this._renderLabel(column)}</span> <mwc-icon>edit</mwc-icon></label>
26
26
  <ox-grid-field
27
27
  .rowIndex=${rowIndex}
28
28
  .column=${column}
@@ -59,9 +59,8 @@ let RecordViewBody = class RecordViewBody extends LitElement {
59
59
  this.editTarget.removeAttribute('editing');
60
60
  this.editTarget = null;
61
61
  }
62
- return;
62
+ break;
63
63
  default:
64
- return;
65
64
  }
66
65
  };
67
66
  window.addEventListener('keydown', this._focusedListener);
@@ -90,6 +89,8 @@ RecordViewBody.styles = [
90
89
  }
91
90
 
92
91
  label {
92
+ display: flex;
93
+ align-items: center;
93
94
  position: relative;
94
95
  text-transform: capitalize;
95
96
 
@@ -110,7 +111,6 @@ RecordViewBody.styles = [
110
111
  }
111
112
 
112
113
  ox-grid-field {
113
- padding: 0 0 5px 0;
114
114
  border-bottom: var(--record-view-border-bottom);
115
115
  font: var(--record-view-font);
116
116
  color: var(--record-view-color);
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-body.js","sourceRoot":"","sources":["../../../src/record-view/record-view-body.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAC3B,OAAO,8BAA8B,CAAA;AAGrC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,OAAO,GAAG,EAAE,CAAA;AAGlB,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,UAAU;IAA9C;;QAsD6B,YAAO,GAAmB,EAAE,CAAA;QAC3B,WAAM,GAAgB,WAAW,CAAA;QACjC,aAAQ,GAAW,CAAC,CAAC,CAAA;IAgFnD,CAAC;IA3EC,MAAM;QACJ,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAA;QACtF,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACxB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE5B,OAAO,IAAI,CAAA;QACP,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrB,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,CAAA;YAChC,IAAI,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;YAEjD,OAAO,IAAI,CAAA;6BACU,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;;wBAE1C,QAAQ;sBACV,MAAM;sBACN,MAAM;qBACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;qBACnB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;SAEtC,CAAA;QACH,CAAC,CAAC;KACH,CAAA;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;YAC5C,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,sCAAsC;YACtC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAuB,CAAA;YAEtC,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;gBAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;aACvB;YAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACxE,OAAM;aACP;YAED,IAAI,CAAC,UAAU,GAAG,MAAM,CAAA;YACxB,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAgB,EAAE,EAAE;YAC3C,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;YACvB,QAAQ,OAAO,EAAE;gBACf,KAAK,OAAO,CAAC;gBACb,wBAAwB;gBACxB,KAAK,SAAS;oBACZ,IAAI,IAAI,CAAC,UAAU,EAAE;wBACnB,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;wBAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;qBACvB;oBACD,OAAM;gBAER;oBACE,OAAM;aACT;QACH,CAAC,CAAA;QACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC3D,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAE5B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC9D,CAAC;IAED,YAAY,CAAC,MAAoB;QAC/B,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,CAAA;QAChC,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAEvC,OAAO,IAAI,CAAA,IAAI,KAAK,GAAG,CAAA;IACzB,CAAC;CACF,CAAA;AAvIQ,qBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiDF;CACF,CAAA;AAE0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;+CAA6B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAsB;AAxDtC,cAAc;IAD1B,aAAa,CAAC,qBAAqB,CAAC;GACxB,cAAc,CAwI1B;SAxIY,cAAc","sourcesContent":["import '@material/mwc-icon'\nimport '../data-grid/data-grid-field'\n\nimport { ColumnConfig, GristRecord } from '../types'\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { ZERO_RECORD } from '../configure/zero-config'\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 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 padding: 0 0 5px 0;\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}>${this._renderLabel(column)} <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 return\n\n default:\n return\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 { 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,7 +1,7 @@
1
1
  import '@material/mwc-icon';
2
2
  import './record-view-body';
3
- import { ColumnConfig, GristRecord } from '../types';
4
3
  import { LitElement } from 'lit';
4
+ import { ColumnConfig, GristRecord } from '../types';
5
5
  export declare class RecordView extends LitElement {
6
6
  static styles: import("lit").CSSResult;
7
7
  columns: ColumnConfig[];
@@ -1,7 +1,7 @@
1
1
  import { __decorate } from "tslib";
2
2
  import '@material/mwc-icon';
3
3
  import './record-view-body';
4
- import { LitElement, css, html } from 'lit';
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
7
  let RecordView = class RecordView extends LitElement {
@@ -53,7 +53,6 @@ RecordView.styles = css `
53
53
  text-align: right;
54
54
  background-color: var(--record-view-footer-background);
55
55
  box-shadow: var(--context-toolbar-shadow-line);
56
- height: var(--record-view-footer-height);
57
56
  }
58
57
 
59
58
  [footer] button {
@@ -61,7 +60,6 @@ RecordView.styles = css `
61
60
  background-color: transparent;
62
61
  border: var(--record-view-footer-button-border);
63
62
  border-width: var(--record-view-footer-button-border-width);
64
- height: var(--record-view-footer-button-height);
65
63
  color: var(--record-view-footer-button-color);
66
64
  font-size: var(--record-view-footer-button-font);
67
65
  line-height: 3;
@@ -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;AAG3B,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGtD,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,UAAU;IAA1C;;QA6C6B,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;AAnFQ,iBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0ClB,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;AA/CtC,UAAU;IADtB,aAAa,CAAC,gBAAgB,CAAC;GACnB,UAAU,CAoFtB;SApFY,UAAU","sourcesContent":["import '@material/mwc-icon'\nimport './record-view-body'\n\nimport { ColumnConfig, GristRecord } from '../types'\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ZERO_RECORD } from '../configure/zero-config'\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 height: var(--record-view-footer-height);\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 height: var(--record-view-footer-button-height);\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;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,12 +1,12 @@
1
+ import { TemplateResult } from 'lit-html';
1
2
  import { DataCardField } from './data-card/data-card-field';
2
3
  import { DataCardGutter } from './data-card/data-card-gutter';
4
+ import { RecordCard } from './data-card/record-card';
3
5
  import { DataGridField } from './data-grid/data-grid-field';
4
6
  import { DataListField } from './data-list/data-list-field';
5
7
  import { DataListGutter } from './data-list/data-list-gutter';
6
- import { DataReportField } from './data-report/data-report-field';
7
- import { RecordCard } from './data-card/record-card';
8
8
  import { RecordPartial } from './data-list/record-partial';
9
- import { TemplateResult } from 'lit-html';
9
+ import { DataReportField } from './data-report/data-report-field';
10
10
  export declare type GristConfig = {
11
11
  columns: ColumnConfig[];
12
12
  rows: RowsConfig;
@@ -21,6 +21,7 @@ export declare type SorterConfig = {
21
21
  export declare type SortersConfig = SorterConfig[];
22
22
  export declare type FilterConfig = {
23
23
  type: string;
24
+ operator?: 'eq' | 'between' | 'gte' | 'lte' | 'is_not_true' | 'in' | 'like' | 'i_like' | 'noteq' | 'is_empty_num_id' | 'is_blank' | 'is_present' | 'is_not_false' | 'is_true' | 'is_false' | 'is_not_null' | 'is_null' | 'notin_with_null' | 'notin' | 'gt' | 'lt' | 'i_nlike' | 'nlike';
24
25
  options?: {
25
26
  [key: string]: any;
26
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import { DataCardField } from './data-card/data-card-field'\nimport { DataCardGutter } from './data-card/data-card-gutter'\nimport { DataGridField } from './data-grid/data-grid-field'\nimport { DataListField } from './data-list/data-list-field'\nimport { DataListGutter } from './data-list/data-list-gutter'\nimport { DataReportField } from './data-report/data-report-field'\nimport { RecordCard } from './data-card/record-card'\nimport { RecordPartial } from './data-list/record-partial'\nimport { TemplateResult } from 'lit-html'\n\nexport type GristConfig = {\n columns: ColumnConfig[]\n rows: RowsConfig\n list: ListConfig\n pagination?: PaginationConfig\n sorters?: SortersConfig\n}\n\nexport type SorterConfig = { name: string; desc?: boolean }\nexport type SortersConfig = SorterConfig[]\nexport type FilterConfig = { type: string; options?: { [key: string]: any } } | boolean\n\nexport type PaginationConfig = {\n page?: number\n limit?: number\n pages?: number[]\n infinite?: boolean\n}\n\nexport type FetchOption = { page?: number; limit?: number; sorters?: object[]; options?: object }\nexport type FetchHandler = (param: FetchOption) => {\n page?: number\n limit?: number\n total: number\n records: object[]\n}\n\nexport type GristEventHandler = (\n columns: ColumnConfig[],\n data?: GristData,\n column?: ColumnConfig,\n record?: GristRecord,\n rowIndex?: number,\n target?: any\n) => void\n\nexport type ColumnConfig = {\n type: string\n name: string\n gutterName?: string\n header: HeaderConfig\n record: RecordConfig\n handlers: GristEventHandlerSet\n label: LabelConfig\n hidden?: boolean\n sortable?: boolean\n resizable?: boolean\n width?: number | string | ColumnWidthCallback\n forList?: boolean\n validation?: ValidationCallback\n filter?: FilterConfig\n imex?: ImexConfig\n multiple?: boolean\n}\n\nexport type ValidationCallback = (after: any, before: any, record: GristRecord, column: ColumnConfig) => boolean\n\nexport type LabelConfig =\n | string\n | boolean\n | {\n renderer: LabelRenderer\n }\n\nexport type LabelRenderer = () => void\n\nexport type ColumnWidthCallback = (column: ColumnConfig) => string\n\nexport type HeaderConfig = {\n renderer: HeaderRenderer\n}\nexport type HeaderRenderer = (column: ColumnConfig) => any\n\nexport type RecordConfig = {\n renderer: FieldRenderer\n editor?: FieldEditor\n editable?: boolean\n classifier: GristClassifier\n align?: 'left' | 'right' | 'center'\n options: { [key: string]: any }\n rowOptionField?: string\n}\n\nexport type FieldRenderer = (\n value: any,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n owner: RecordCard | DataCardGutter | DataCardField | DataListGutter | DataListField | RecordPartial | DataReportField\n) => TemplateResult | string | void\nexport type FieldEditor = (\n value: any,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n) => Element\nexport type FieldThumbnailRenderer = (record: GristRecord, rowIndex: number) => TemplateResult | string | void\nexport type FilterSelectRenderer = (column: ColumnConfig, owner: Element) => TemplateResult | string | void\n\nexport type GristEventHandlerSet = {\n click?: GristEventHandler\n dblclick?: GristEventHandler\n}\n\nexport type ListConfig = {\n thumbnail: FieldThumbnailRenderer\n fields: string[]\n details: string[]\n}\n\nexport type ImexConfig = {\n header: string\n key: string\n width: number\n type: string\n}\n\nexport type RowsConfig = {\n appendable: boolean\n insertable: boolean\n selectable?: RowSelectableConfig\n groups: GroupConfig[]\n totals: string[]\n classifier: GristClassifier\n handlers: GristEventHandlerSet\n}\n\nexport type GristClassifier = (\n record: GristRecord,\n rowIndex: number\n) => { emphasized?: boolean | string | string[]; [key: string]: any } | void\n\nexport type GroupConfig = {\n align: string\n titleColumn?: ColumnConfig\n title: string\n value?: string\n groupName?: string\n row?: number\n column: string | number\n rowspan: number\n colspan?: number\n}\n\nexport type RowSelectableConfig = {\n multiple?: boolean\n}\n\nexport type GristRecord = {\n id?: string\n name?: string\n __seq__?: number\n __dirty__?: string\n __selected__?: boolean\n __changes__?: object[]\n __dirtyfields__?: { [key: string]: any }\n __origin__?: any\n [key: string]: any\n}\n\nexport type GristData = {\n page?: number\n total?: number\n limit?: number\n records: GristRecord[]\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import { TemplateResult } from 'lit-html'\n\nimport { DataCardField } from './data-card/data-card-field'\nimport { DataCardGutter } from './data-card/data-card-gutter'\nimport { RecordCard } from './data-card/record-card'\nimport { DataGridField } from './data-grid/data-grid-field'\nimport { DataListField } from './data-list/data-list-field'\nimport { DataListGutter } from './data-list/data-list-gutter'\nimport { RecordPartial } from './data-list/record-partial'\nimport { DataReportField } from './data-report/data-report-field'\n\nexport type GristConfig = {\n columns: ColumnConfig[]\n rows: RowsConfig\n list: ListConfig\n pagination?: PaginationConfig\n sorters?: SortersConfig\n}\n\nexport type SorterConfig = { name: string; desc?: boolean }\nexport type SortersConfig = SorterConfig[]\nexport type FilterConfig =\n | {\n type: string\n operator?:\n | 'eq'\n | 'between'\n | 'gte'\n | 'lte'\n | 'is_not_true'\n | 'in'\n | 'like'\n | 'i_like'\n | 'noteq'\n | 'is_empty_num_id'\n | 'is_blank'\n | 'is_present'\n | 'is_not_false'\n | 'is_true'\n | 'is_false'\n | 'is_not_null'\n | 'is_null'\n | 'notin_with_null'\n | 'notin'\n | 'gt'\n | 'lt'\n | 'i_nlike'\n | 'nlike'\n options?: { [key: string]: any }\n }\n | boolean\n\nexport type PaginationConfig = {\n page?: number\n limit?: number\n pages?: number[]\n infinite?: boolean\n}\n\nexport type FetchOption = { page?: number; limit?: number; sorters?: object[]; options?: object }\nexport type FetchHandler = (param: FetchOption) => {\n page?: number\n limit?: number\n total: number\n records: object[]\n}\n\nexport type GristEventHandler = (\n columns: ColumnConfig[],\n data?: GristData,\n column?: ColumnConfig,\n record?: GristRecord,\n rowIndex?: number,\n target?: any\n) => void\n\nexport type ColumnConfig = {\n type: string\n name: string\n gutterName?: string\n header: HeaderConfig\n record: RecordConfig\n handlers: GristEventHandlerSet\n label: LabelConfig\n hidden?: boolean\n sortable?: boolean\n resizable?: boolean\n width?: number | string | ColumnWidthCallback\n forList?: boolean\n validation?: ValidationCallback\n filter?: FilterConfig\n imex?: ImexConfig\n multiple?: boolean\n}\n\nexport type ValidationCallback = (after: any, before: any, record: GristRecord, column: ColumnConfig) => boolean\n\nexport type LabelConfig =\n | string\n | boolean\n | {\n renderer: LabelRenderer\n }\n\nexport type LabelRenderer = () => void\n\nexport type ColumnWidthCallback = (column: ColumnConfig) => string\n\nexport type HeaderConfig = {\n renderer: HeaderRenderer\n}\nexport type HeaderRenderer = (column: ColumnConfig) => any\n\nexport type RecordConfig = {\n renderer: FieldRenderer\n editor?: FieldEditor\n editable?: boolean\n classifier: GristClassifier\n align?: 'left' | 'right' | 'center'\n options: { [key: string]: any }\n rowOptionField?: string\n}\n\nexport type FieldRenderer = (\n value: any,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n owner: RecordCard | DataCardGutter | DataCardField | DataListGutter | DataListField | RecordPartial | DataReportField\n) => TemplateResult | string | void\nexport type FieldEditor = (\n value: any,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n) => Element\nexport type FieldThumbnailRenderer = (record: GristRecord, rowIndex: number) => TemplateResult | string | void\nexport type FilterSelectRenderer = (column: ColumnConfig, owner: Element) => TemplateResult | string | void\n\nexport type GristEventHandlerSet = {\n click?: GristEventHandler\n dblclick?: GristEventHandler\n}\n\nexport type ListConfig = {\n thumbnail: FieldThumbnailRenderer\n fields: string[]\n details: string[]\n}\n\nexport type ImexConfig = {\n header: string\n key: string\n width: number\n type: string\n}\n\nexport type RowsConfig = {\n appendable: boolean\n insertable: boolean\n selectable?: RowSelectableConfig\n groups: GroupConfig[]\n totals: string[]\n classifier: GristClassifier\n handlers: GristEventHandlerSet\n}\n\nexport type GristClassifier = (\n record: GristRecord,\n rowIndex: number\n) => { emphasized?: boolean | string | string[]; [key: string]: any } | void\n\nexport type GroupConfig = {\n align: string\n titleColumn?: ColumnConfig\n title: string\n value?: string\n groupName?: string\n row?: number\n column: string | number\n rowspan: number\n colspan?: number\n}\n\nexport type RowSelectableConfig = {\n multiple?: boolean\n}\n\nexport type GristRecord = {\n id?: string\n name?: string\n __seq__?: number\n __dirty__?: string\n __selected__?: boolean\n __changes__?: object[]\n __dirtyfields__?: { [key: string]: any }\n __origin__?: any\n [key: string]: any\n}\n\nexport type GristData = {\n page?: number\n total?: number\n limit?: number\n records: GristRecord[]\n}\n"]}