@operato/data-grist 0.3.16 → 0.3.20

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 (103) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/custom-elements.json +693 -674
  3. package/demo/data-grist-test.html +142 -85
  4. package/demo/index.html +65 -97
  5. package/dist/src/configure/column-builder.js +26 -2
  6. package/dist/src/configure/column-builder.js.map +1 -1
  7. package/dist/src/data-card/record-card.d.ts +0 -2
  8. package/dist/src/data-card/record-card.js +7 -59
  9. package/dist/src/data-card/record-card.js.map +1 -1
  10. package/dist/src/data-grid/data-grid-body.d.ts +7 -1
  11. package/dist/src/data-grid/data-grid-body.js +21 -0
  12. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  13. package/dist/src/data-grid/data-grid-header.js +5 -3
  14. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  15. package/dist/src/data-grid/data-grid.d.ts +1 -0
  16. package/dist/src/data-grid/data-grid.js +6 -0
  17. package/dist/src/data-grid/data-grid.js.map +1 -1
  18. package/dist/src/data-grist.js +5 -0
  19. package/dist/src/data-grist.js.map +1 -1
  20. package/dist/src/data-list/record-partial.d.ts +0 -2
  21. package/dist/src/data-list/record-partial.js +7 -58
  22. package/dist/src/data-list/record-partial.js.map +1 -1
  23. package/dist/src/editors/image-input.d.ts +7 -0
  24. package/dist/src/editors/image-input.js +31 -0
  25. package/dist/src/editors/image-input.js.map +1 -0
  26. package/dist/src/editors/index.d.ts +1 -0
  27. package/dist/src/editors/index.js +1 -0
  28. package/dist/src/editors/index.js.map +1 -1
  29. package/dist/src/editors/input-editors.d.ts +1 -8
  30. package/dist/src/editors/input-editors.js +3 -47
  31. package/dist/src/editors/input-editors.js.map +1 -1
  32. package/dist/src/editors/registry.js +2 -1
  33. package/dist/src/editors/registry.js.map +1 -1
  34. package/dist/src/filters/filter-checkbox.js +2 -2
  35. package/dist/src/filters/filter-checkbox.js.map +1 -1
  36. package/dist/src/filters/filter-input.js +1 -1
  37. package/dist/src/filters/filter-input.js.map +1 -1
  38. package/dist/src/filters/filter-range-date.js +1 -1
  39. package/dist/src/filters/filter-range-date.js.map +1 -1
  40. package/dist/src/filters/filter-range-number.js +1 -1
  41. package/dist/src/filters/filter-range-number.js.map +1 -1
  42. package/dist/src/filters/filter-select.js +2 -2
  43. package/dist/src/filters/filter-select.js.map +1 -1
  44. package/dist/src/filters/filters-form.d.ts +9 -5
  45. package/dist/src/filters/filters-form.js +63 -15
  46. package/dist/src/filters/filters-form.js.map +1 -1
  47. package/dist/src/handlers/record-view-handler.d.ts +1 -2
  48. package/dist/src/handlers/record-view-handler.js +5 -35
  49. package/dist/src/handlers/record-view-handler.js.map +1 -1
  50. package/dist/src/handlers/select-row-toggle.d.ts +1 -1
  51. package/dist/src/handlers/select-row-toggle.js.map +1 -1
  52. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js +3 -1
  53. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js.map +1 -1
  54. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js +0 -74
  55. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js.map +1 -1
  56. package/dist/src/record-view/index.d.ts +1 -0
  57. package/dist/src/record-view/index.js +1 -0
  58. package/dist/src/record-view/index.js.map +1 -1
  59. package/dist/src/record-view/record-creator.d.ts +5 -2
  60. package/dist/src/record-view/record-creator.js +69 -14
  61. package/dist/src/record-view/record-creator.js.map +1 -1
  62. package/dist/src/record-view/record-view-body.js +6 -6
  63. package/dist/src/record-view/record-view-body.js.map +1 -1
  64. package/dist/src/record-view/record-view-handler.d.ts +9 -0
  65. package/dist/src/record-view/record-view-handler.js +57 -0
  66. package/dist/src/record-view/record-view-handler.js.map +1 -0
  67. package/dist/src/record-view/record-view.d.ts +2 -3
  68. package/dist/src/record-view/record-view.js +11 -61
  69. package/dist/src/record-view/record-view.js.map +1 -1
  70. package/dist/src/sorters/sorters-control.js +22 -8
  71. package/dist/src/sorters/sorters-control.js.map +1 -1
  72. package/dist/src/types.d.ts +6 -3
  73. package/dist/src/types.js.map +1 -1
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/package.json +7 -7
  76. package/src/configure/column-builder.ts +29 -3
  77. package/src/data-card/record-card.ts +14 -74
  78. package/src/data-grid/data-grid-body.ts +38 -1
  79. package/src/data-grid/data-grid-header.ts +7 -5
  80. package/src/data-grid/data-grid.ts +12 -0
  81. package/src/data-grist.ts +8 -0
  82. package/src/data-list/record-partial.ts +14 -73
  83. package/src/editors/image-input.ts +29 -0
  84. package/src/editors/index.ts +1 -0
  85. package/src/editors/input-editors.ts +5 -48
  86. package/src/editors/registry.ts +1 -1
  87. package/src/filters/filter-checkbox.ts +3 -2
  88. package/src/filters/filter-input.ts +3 -3
  89. package/src/filters/filter-range-date.ts +3 -3
  90. package/src/filters/filter-range-number.ts +3 -3
  91. package/src/filters/filter-select.ts +3 -2
  92. package/src/filters/filters-form.ts +77 -41
  93. package/src/handlers/record-view-handler.ts +8 -44
  94. package/src/handlers/select-row-toggle.ts +1 -2
  95. package/src/record-view/event-handlers/record-view-body-click-handler.ts +3 -1
  96. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -89
  97. package/src/record-view/index.ts +1 -0
  98. package/src/record-view/record-creator.ts +85 -16
  99. package/src/record-view/record-view-body.ts +6 -6
  100. package/src/record-view/record-view-handler.ts +86 -0
  101. package/src/record-view/record-view.ts +12 -62
  102. package/src/sorters/sorters-control.ts +22 -8
  103. package/src/types.ts +33 -30
@@ -1,7 +1,7 @@
1
1
  import { html } from 'lit-html';
2
2
  export const FilterRangeNumber = (column, owner) => {
3
3
  const filter = column.filter;
4
- const type = typeof filter === 'boolean' ? column.type : (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
4
+ const type = (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
5
5
  return html `
6
6
  <input name="${column.name}" type="number" placeholder="minimum" /> ~
7
7
  <input name="${column.name}" type="number" placeholder="maximum" />
@@ -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;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"]}
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,MAA4B,CAAA;IAClD,MAAM,IAAI,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IAExC,OAAO,IAAI,CAAA;mBACM,MAAM,CAAC,IAAI;mBACX,MAAM,CAAC,IAAI;GAC3B,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterConfigObject, FilterSelectRenderer } from '../types'\n\nexport const FilterRangeNumber: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter as FilterConfigObject\n const 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"]}
@@ -1,8 +1,8 @@
1
1
  import '@operato/input/ox-checkbox.js';
2
2
  import { html } from 'lit-html';
3
3
  export const FilterSelect = (column, owner) => {
4
- var _a;
5
- const options = (typeof column.filter !== 'boolean' && ((_a = column.filter) === null || _a === void 0 ? void 0 : _a.options)) || [];
4
+ const filter = column.filter;
5
+ const options = (filter === null || filter === void 0 ? void 0 : filter.options) || [];
6
6
  return html `
7
7
  ${options === null || options === void 0 ? void 0 : options.map((option) => html ` <ox-checkbox option value=${option}>${option}</ox-checkbox> `)}
8
8
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"filter-select.js","sourceRoot":"","sources":["../../../src/filters/filter-select.ts"],"names":[],"mappings":"AAAA,OAAO,+BAA+B,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,YAAY,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;IAClE,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,KAAI,MAAA,MAAM,CAAC,MAAM,0CAAE,OAAO,CAAA,CAAC,IAAI,EAAE,CAAA;IAEpF,OAAO,IAAI,CAAA;MACP,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAA,8BAA8B,MAAM,IAAI,MAAM,iBAAiB,CAAC;GACxG,CAAA;AACH,CAAC,CAAA","sourcesContent":["import '@operato/input/ox-checkbox.js'\n\nimport { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterSelect: FilterSelectRenderer = (column, owner) => {\n const options = (typeof column.filter !== 'boolean' && column.filter?.options) || []\n\n return html`\n ${options?.map((option: string) => html` <ox-checkbox option value=${option}>${option}</ox-checkbox> `)}\n `\n}\n"]}
1
+ {"version":3,"file":"filter-select.js","sourceRoot":"","sources":["../../../src/filters/filter-select.ts"],"names":[],"mappings":"AAAA,OAAO,+BAA+B,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,YAAY,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAA4B,CAAA;IAClD,MAAM,OAAO,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,KAAI,EAAE,CAAA;IAErC,OAAO,IAAI,CAAA;MACP,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAA,8BAA8B,MAAM,IAAI,MAAM,iBAAiB,CAAC;GACxG,CAAA;AACH,CAAC,CAAA","sourcesContent":["import '@operato/input/ox-checkbox.js'\n\nimport { html } from 'lit-html'\n\nimport { FilterConfigObject, FilterSelectRenderer } from '../types'\n\nexport const FilterSelect: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter as FilterConfigObject\n const options = filter?.options || []\n\n return html`\n ${options?.map((option: string) => html` <ox-checkbox option value=${option}>${option}</ox-checkbox> `)}\n `\n}\n"]}
@@ -1,19 +1,23 @@
1
1
  import '@operato/input/ox-checkbox.js';
2
2
  import '@operato/input/ox-select.js';
3
3
  import '@operato/popup/ox-popup-list.js';
4
- import { LitElement, TemplateResult } from 'lit';
5
- import { GristConfig } from '../types';
4
+ import '@operato/input/ox-input-search.js';
5
+ import { LitElement, PropertyValues, TemplateResult } from 'lit';
6
+ import { ColumnConfig, FilterOperator, GristConfig } from '../types';
6
7
  export declare type QueryFilterRangeValue = [from: number, to: number];
7
8
  export declare type QueryFilter = {
8
9
  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
+ operator: FilterOperator;
10
11
  value: any;
11
12
  };
12
13
  export declare class FiltersForm extends LitElement {
13
14
  static styles: import("lit").CSSResult[];
14
15
  config: GristConfig;
15
- defaultOperator: string;
16
+ filterColumns: ColumnConfig[];
17
+ searchColumns: ColumnConfig[];
16
18
  form: HTMLFormElement;
19
+ connectedCallback(): void;
20
+ updated(changes: PropertyValues<this>): void;
17
21
  render(): TemplateResult;
18
- get queryFilters(): QueryFilter[];
22
+ getQueryFilters(): Promise<QueryFilter[]>;
19
23
  }
@@ -2,20 +2,53 @@ import { __decorate } from "tslib";
2
2
  import '@operato/input/ox-checkbox.js';
3
3
  import '@operato/input/ox-select.js';
4
4
  import '@operato/popup/ox-popup-list.js';
5
+ import '@operato/input/ox-input-search.js';
5
6
  import { css, html, LitElement } from 'lit';
6
- import { customElement, property, query } from 'lit/decorators.js';
7
+ import { customElement, queryAsync, state } from 'lit/decorators.js';
7
8
  import { FilterStyles } from './filter-styles';
8
9
  import { getFilterRenderer } from './registry';
9
10
  let FiltersForm = class FiltersForm extends LitElement {
10
11
  constructor() {
11
12
  super(...arguments);
12
- this.defaultOperator = 'eq';
13
+ this.filterColumns = [];
14
+ this.searchColumns = [];
15
+ }
16
+ connectedCallback() {
17
+ super.connectedCallback();
18
+ const grist = this.closest('ox-grist');
19
+ if (grist) {
20
+ this.config = grist.compiledConfig;
21
+ grist.addEventListener('config-change', (e) => {
22
+ this.config = e.detail;
23
+ });
24
+ this.renderRoot.addEventListener('change', async (e) => {
25
+ e.stopPropagation();
26
+ this.dispatchEvent(new CustomEvent('change', {
27
+ bubbles: true,
28
+ composed: true,
29
+ detail: await this.getQueryFilters()
30
+ }));
31
+ });
32
+ }
33
+ }
34
+ updated(changes) {
35
+ if (changes.has('config')) {
36
+ const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter);
37
+ this.filterColumns = filters.filter((columnConfig) => {
38
+ const filter = columnConfig.filter;
39
+ return filter.operator !== 'search';
40
+ });
41
+ this.searchColumns = filters.filter(columnConfig => {
42
+ const filter = columnConfig.filter;
43
+ return filter.operator === 'search';
44
+ });
45
+ }
13
46
  }
14
47
  render() {
15
- const columns = this.config.columns.filter(columnConfig => columnConfig.filter);
16
48
  return html `
17
49
  <form>
18
- ${columns.map((column) => {
50
+ ${this.searchColumns.length === 0 ? html `` : html ` <ox-input-search name="search"></ox-input-search> `}
51
+ ${this.filterColumns.map((column) => {
19
52
  const { name, label, filter } = column;
20
53
  const placeholder = typeof label === 'string'
21
54
  ? name
@@ -24,8 +57,8 @@ let FiltersForm = class FiltersForm extends LitElement {
24
57
  : label.renderer
25
58
  ? label.renderer()
26
59
  : 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;
60
+ const type = filter.type;
61
+ const idx = filter.operator === 'between' ? 1 : 0;
29
62
  const renderer = getFilterRenderer(type)[idx];
30
63
  if (!renderer) {
31
64
  return html ``;
@@ -43,13 +76,14 @@ let FiltersForm = class FiltersForm extends LitElement {
43
76
  </form>
44
77
  `;
45
78
  }
46
- get queryFilters() {
47
- var formData = new FormData(this.form);
48
- return this.config.columns
49
- .filter(columnConfig => columnConfig.filter)
79
+ async getQueryFilters() {
80
+ var _a;
81
+ const formData = new FormData(await this.form);
82
+ const search = (_a = formData.get('search')) === null || _a === void 0 ? void 0 : _a.toString();
83
+ var filters = this.filterColumns
50
84
  .map((column) => {
51
85
  const { name, filter } = column;
52
- const operator = typeof filter === 'boolean' ? 'eq' : filter.operator || 'eq';
86
+ const operator = filter.operator;
53
87
  var value = formData.getAll(name);
54
88
  if (value.length == 0) {
55
89
  return;
@@ -64,6 +98,17 @@ let FiltersForm = class FiltersForm extends LitElement {
64
98
  };
65
99
  })
66
100
  .filter(result => result !== undefined);
101
+ if (search) {
102
+ filters = filters.concat(this.searchColumns.map((column) => {
103
+ const { name } = column;
104
+ return {
105
+ name,
106
+ operator: 'search',
107
+ value: `%${search}%`
108
+ };
109
+ }));
110
+ }
111
+ return filters;
67
112
  }
68
113
  };
69
114
  FiltersForm.styles = [
@@ -84,13 +129,16 @@ FiltersForm.styles = [
84
129
  `
85
130
  ];
86
131
  __decorate([
87
- property({ type: Object })
132
+ state()
88
133
  ], FiltersForm.prototype, "config", void 0);
89
134
  __decorate([
90
- property({ type: String })
91
- ], FiltersForm.prototype, "defaultOperator", void 0);
135
+ state()
136
+ ], FiltersForm.prototype, "filterColumns", void 0);
137
+ __decorate([
138
+ state()
139
+ ], FiltersForm.prototype, "searchColumns", void 0);
92
140
  __decorate([
93
- query('form')
141
+ queryAsync('form')
94
142
  ], FiltersForm.prototype, "form", void 0);
95
143
  FiltersForm = __decorate([
96
144
  customElement('ox-filters-form')
@@ -1 +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"]}
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'\nimport '@operato/input/ox-input-search.js'\n\nimport { css, html, LitElement, PropertyValues, TemplateResult } from 'lit'\nimport { customElement, queryAsync, state } from 'lit/decorators.js'\n\nimport { FilterConfigObject } from '..'\nimport { DataGrist } from '../data-grist'\nimport { ColumnConfig, FilterOperator, 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: FilterOperator\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 @state() config!: GristConfig\n\n @state() filterColumns: ColumnConfig[] = []\n @state() searchColumns: ColumnConfig[] = []\n\n @queryAsync('form') form!: HTMLFormElement\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.compiledConfig\n grist.addEventListener('config-change', (e: Event) => {\n this.config = (e as CustomEvent).detail\n })\n\n this.renderRoot.addEventListener('change', async (e: Event) => {\n e.stopPropagation()\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: await this.getQueryFilters()\n })\n )\n })\n }\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter)\n this.filterColumns = filters.filter((columnConfig: ColumnConfig) => {\n const filter = columnConfig.filter as FilterConfigObject\n return filter!.operator !== 'search'\n })\n this.searchColumns = filters.filter(columnConfig => {\n const filter = columnConfig.filter as FilterConfigObject\n return filter!.operator === 'search'\n })\n }\n }\n\n render(): TemplateResult {\n return html`\n <form>\n ${this.searchColumns.length === 0 ? html`` : html` <ox-input-search name=\"search\"></ox-input-search> `}\n ${this.filterColumns.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 = (filter as FilterConfigObject).type\n const idx = (filter as FilterConfigObject).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 async getQueryFilters(): Promise<QueryFilter[]> {\n const formData = new FormData(await this.form)\n const search: string | undefined = formData.get('search')?.toString()\n\n var filters = this.filterColumns\n .map((column: ColumnConfig) => {\n const { name, filter } = column\n const operator = (filter as FilterConfigObject).operator\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 if (search) {\n filters = filters.concat(\n this.searchColumns.map((column: ColumnConfig) => {\n const { name } = column\n\n return {\n name,\n operator: 'search',\n value: `%${search}%`\n }\n })\n )\n }\n\n return filters\n }\n}\n"]}
@@ -1,4 +1,3 @@
1
- import '../record-view/record-view';
2
- import { ColumnConfig, GristData, GristRecord } from '../types';
3
1
  import { DataGridField } from '../data-grid/data-grid-field';
2
+ import { ColumnConfig, GristData, GristRecord } from '../types';
4
3
  export declare const RecordViewHandler: (columns: ColumnConfig[], data: GristData, column: ColumnConfig, record: GristRecord, rowIndex: number, field: DataGridField) => void;
@@ -1,44 +1,14 @@
1
- import '../record-view/record-view';
2
- import { html } from 'lit';
3
1
  /*
4
2
  * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
5
3
  * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
6
4
  */
7
5
  export const RecordViewHandler = function (columns, data, column, record, rowIndex, field) {
8
- document.dispatchEvent(new CustomEvent('open-popup', {
6
+ field.dispatchEvent(new CustomEvent('show-record-view', {
7
+ bubbles: true,
8
+ composed: true,
9
9
  detail: {
10
- template: html `
11
- <record-view
12
- .field=${field}
13
- .columns=${columns}
14
- .column=${column}
15
- .record=${record}
16
- .rowIndex=${rowIndex}
17
- @reset=${(e) => {
18
- field.dispatchEvent(new CustomEvent('record-reset', {
19
- bubbles: true,
20
- composed: true,
21
- detail: record
22
- }));
23
- }}
24
- @cancel=${(e) => {
25
- field.dispatchEvent(new CustomEvent('record-reset', {
26
- bubbles: true,
27
- composed: true,
28
- detail: record
29
- }));
30
- // popup.close()
31
- }}
32
- @ok=${(e) => {
33
- // popup.close()
34
- }}
35
- ></record-view>
36
- `
37
- },
38
- options: {
39
- backdrop: true,
40
- size: 'large',
41
- title: record['name']
10
+ record,
11
+ row: rowIndex
42
12
  }
43
13
  }));
44
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-handler.js","sourceRoot":"","sources":["../../../src/handlers/record-view-handler.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAA;AAKnC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B;;;GAGG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAC/B,OAAuB,EACvB,IAAe,EACf,MAAoB,EACpB,MAAmB,EACnB,QAAgB,EAChB,KAAoB;IAEpB,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,YAAY,EAAE;QAC5B,MAAM,EAAE;YACN,QAAQ,EAAE,IAAI,CAAA;;qBAED,KAAK;uBACH,OAAO;sBACR,MAAM;sBACN,MAAM;wBACJ,QAAQ;qBACX,CAAC,CAAQ,EAAE,EAAE;gBACpB,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;oBAC9B,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,MAAM;iBACf,CAAC,CACH,CAAA;YACH,CAAC;sBACS,CAAC,CAAQ,EAAE,EAAE;gBACrB,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;oBAC9B,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,MAAM;iBACf,CAAC,CACH,CAAA;gBACD,gBAAgB;YAClB,CAAC;kBACK,CAAC,CAAQ,EAAE,EAAE;gBACjB,gBAAgB;YAClB,CAAC;;SAEJ;SACF;QACD,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;SACtB;KACK,CAAC,CACV,CAAA;AACH,CAAC,CAAA","sourcesContent":["import '../record-view/record-view'\n\nimport { ColumnConfig, GristData, GristRecord } from '../types'\n\nimport { DataGridField } from '../data-grid/data-grid-field'\nimport { html } from 'lit'\n\n/*\n * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,\n * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.\n */\n\nexport const RecordViewHandler = function (\n columns: ColumnConfig[],\n data: GristData,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n): void {\n document.dispatchEvent(\n new CustomEvent('open-popup', {\n detail: {\n template: html`\n <record-view\n .field=${field}\n .columns=${columns}\n .column=${column}\n .record=${record}\n .rowIndex=${rowIndex}\n @reset=${(e: Event) => {\n field.dispatchEvent(\n new CustomEvent('record-reset', {\n bubbles: true,\n composed: true,\n detail: record\n })\n )\n }}\n @cancel=${(e: Event) => {\n field.dispatchEvent(\n new CustomEvent('record-reset', {\n bubbles: true,\n composed: true,\n detail: record\n })\n )\n // popup.close()\n }}\n @ok=${(e: Event) => {\n // popup.close()\n }}\n ></record-view>\n `\n },\n options: {\n backdrop: true,\n size: 'large',\n title: record['name']\n }\n } as any)\n )\n}\n"]}
1
+ {"version":3,"file":"record-view-handler.js","sourceRoot":"","sources":["../../../src/handlers/record-view-handler.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAC/B,OAAuB,EACvB,IAAe,EACf,MAAoB,EACpB,MAAmB,EACnB,QAAgB,EAChB,KAAoB;IAEpB,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,kBAAkB,EAAE;QAClC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE;YACN,MAAM;YACN,GAAG,EAAE,QAAQ;SACd;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { DataGridField } from '../data-grid/data-grid-field'\nimport { ColumnConfig, GristData, GristRecord } from '../types'\n\n/*\n * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,\n * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.\n */\n\nexport const RecordViewHandler = function (\n columns: ColumnConfig[],\n data: GristData,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n): void {\n field.dispatchEvent(\n new CustomEvent('show-record-view', {\n bubbles: true,\n composed: true,\n detail: {\n record,\n row: rowIndex\n }\n })\n )\n}\n"]}
@@ -1,3 +1,3 @@
1
- import { ColumnConfig, GristData, GristRecord } from '../types';
2
1
  import { DataGridField } from '../data-grid/data-grid-field';
2
+ import { ColumnConfig, GristData, GristRecord } from '../types';
3
3
  export declare const SelectRowToggle: (columns: ColumnConfig[], data: GristData, column: ColumnConfig, record: GristRecord, rowIndex: number, field: DataGridField) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"select-row-toggle.js","sourceRoot":"","sources":["../../../src/handlers/select-row-toggle.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,UAC7B,OAAuB,EACvB,IAAe,EACf,MAAoB,EACpB,MAAmB,EACnB,QAAgB,EAChB,KAAoB;IAEpB,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,sBAAsB,EAAE;QACtC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;YAC5B,CAAC,CAAC;gBACE,OAAO,EAAE,CAAC,MAAM,CAAC;aAClB;YACH,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,MAAM,CAAC;aAChB;KACN,CAAC,CACH,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { ColumnConfig, GristData, GristRecord } from '../types'\n\nimport { DataGridField } from '../data-grid/data-grid-field'\n\n/*\n * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,\n * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.\n */\n\nexport const SelectRowToggle = function (\n columns: ColumnConfig[],\n data: GristData,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n): void {\n field.dispatchEvent(\n new CustomEvent('select-record-change', {\n bubbles: true,\n composed: true,\n detail: record['__selected__']\n ? {\n removed: [record]\n }\n : {\n added: [record]\n }\n })\n )\n}\n"]}
1
+ {"version":3,"file":"select-row-toggle.js","sourceRoot":"","sources":["../../../src/handlers/select-row-toggle.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,UAC7B,OAAuB,EACvB,IAAe,EACf,MAAoB,EACpB,MAAmB,EACnB,QAAgB,EAChB,KAAoB;IAEpB,KAAK,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,sBAAsB,EAAE;QACtC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;YAC5B,CAAC,CAAC;gBACE,OAAO,EAAE,CAAC,MAAM,CAAC;aAClB;YACH,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,MAAM,CAAC;aAChB;KACN,CAAC,CACH,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { DataGridField } from '../data-grid/data-grid-field'\nimport { ColumnConfig, GristData, GristRecord } from '../types'\n\n/*\n * handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,\n * 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.\n */\n\nexport const SelectRowToggle = function (\n columns: ColumnConfig[],\n data: GristData,\n column: ColumnConfig,\n record: GristRecord,\n rowIndex: number,\n field: DataGridField\n): void {\n field.dispatchEvent(\n new CustomEvent('select-record-change', {\n bubbles: true,\n composed: true,\n detail: record['__selected__']\n ? {\n removed: [record]\n }\n : {\n added: [record]\n }\n })\n )\n}\n"]}
@@ -17,6 +17,8 @@ export function recordViewBodyClickHandler(e) {
17
17
  return;
18
18
  }
19
19
  this.currentTarget = target;
20
- target.setAttribute('editing', 'true');
20
+ if (!this.onlyForEdit) {
21
+ target.setAttribute('editing', 'true');
22
+ }
21
23
  }
22
24
  //# sourceMappingURL=record-view-body-click-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-body-click-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-click-handler.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAuB,CAAQ;IACvE,CAAC,CAAC,eAAe,EAAE,CAAA;IAEnB,sCAAsC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAuB,CAAA;IAEtC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;KAC9C;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxE,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,OAAM;KACP;IAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACxC,CAAC","sourcesContent":["import { DataGridField } from '../../data-grid/data-grid-field'\nimport { RecordViewBody } from '../record-view-body'\n\n/**\n * ox-record-view-body 의 click handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport function recordViewBodyClickHandler(this: RecordViewBody, e: Event): void {\n e.stopPropagation()\n\n /* target should be 'ox-grid-field' */\n var target = e.target as DataGridField\n\n if (!this.onlyForEdit && this.currentTarget) {\n this.focus()\n this.currentTarget.removeAttribute('editing')\n }\n\n if (target.tagName !== 'OX-GRID-FIELD' || !target.column.record.editable) {\n this.focus()\n this.currentTarget = null\n return\n }\n\n this.currentTarget = target\n target.setAttribute('editing', 'true')\n}\n"]}
1
+ {"version":3,"file":"record-view-body-click-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-click-handler.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAuB,CAAQ;IACvE,CAAC,CAAC,eAAe,EAAE,CAAA;IAEnB,sCAAsC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAuB,CAAA;IAEtC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;KAC9C;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxE,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,OAAM;KACP;IAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACrB,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;KACvC;AACH,CAAC","sourcesContent":["import { DataGridField } from '../../data-grid/data-grid-field'\nimport { RecordViewBody } from '../record-view-body'\n\n/**\n * ox-record-view-body 의 click handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport function recordViewBodyClickHandler(this: RecordViewBody, e: Event): void {\n e.stopPropagation()\n\n /* target should be 'ox-grid-field' */\n var target = e.target as DataGridField\n\n if (!this.onlyForEdit && this.currentTarget) {\n this.focus()\n this.currentTarget.removeAttribute('editing')\n }\n\n if (target.tagName !== 'OX-GRID-FIELD' || !target.column.record.editable) {\n this.focus()\n this.currentTarget = null\n return\n }\n\n this.currentTarget = target\n if (!this.onlyForEdit) {\n target.setAttribute('editing', 'true')\n }\n}\n"]}
@@ -4,7 +4,6 @@
4
4
  * - handler의 this 는 ox-record-view-body임.
5
5
  */
6
6
  export async function recordViewBodyKeydownHandler(e) {
7
- // e.preventDefault()
8
7
  switch (e.key) {
9
8
  case 'Esc':
10
9
  case 'Escape':
@@ -19,78 +18,5 @@ export async function recordViewBodyKeydownHandler(e) {
19
18
  break;
20
19
  default:
21
20
  }
22
- // arrow-key
23
- // var keyCode = e.keyCode
24
- // var { row = 0, column = 0 } = this.focused || {}
25
- // var { records = [] } = this.data || {}
26
- // var maxrow = this.config.rows.appendable ? records.length : records.length - 1
27
- // var maxcolumn = (this.columns || []).filter(column => !column.hidden).length - 1
28
- // if (this.currentTarget) {
29
- // switch (keyCode) {
30
- // case KEYCODE.KEY_ESC:
31
- // /* TODO 편집이 취소되어야 한다. */
32
- // case KEYCODE.KEY_ENTER:
33
- // this.currentTarget = null
34
- // this.focus()
35
- // return
36
- // // case KEYCODE.KEY_TAP:
37
- // // this.currentTarget = null
38
- // // column = Math.min(maxcolumn, column + 1)
39
- // // this.focus()
40
- // // break
41
- // // case KEYCODE.KEY_DOWN:
42
- // // this.currentTarget = null
43
- // // row = Math.min(maxrow, row + 1)
44
- // // this.focus()
45
- // // break
46
- // default:
47
- // return
48
- // }
49
- // } else {
50
- // switch (keyCode) {
51
- // case KEYCODE.KEY_UP:
52
- // row = Math.max(0, row - 1)
53
- // break
54
- // case KEYCODE.KEY_DOWN:
55
- // row = Math.min(maxrow, row + 1)
56
- // break
57
- // case KEYCODE.KEY_ENTER:
58
- // this.startEditTarget(row, column)
59
- // return
60
- // case KEYCODE.KEY_LEFT:
61
- // case KEYCODE.KEY_BACKSPACE:
62
- // column = Math.max(0, column - 1)
63
- // break
64
- // case KEYCODE.KEY_RIGHT:
65
- // case KEYCODE.KEY_TAP:
66
- // column = Math.min(maxcolumn, column + 1)
67
- // break
68
- // case KEYCODE.KEY_PAGEUP:
69
- // /* TODO 페이지당 레코드의 수를 계산해서 증감시켜야 한다. */
70
- // row = Math.max(0, row - 10)
71
- // break
72
- // case KEYCODE.KEY_PAGEDOWN:
73
- // row = Math.min(maxrow, row + 10)
74
- // break
75
- // case KEYCODE.KEY_ESC:
76
- // return
77
- // default:
78
- // if (
79
- // (keyCode > 47 && keyCode < 58) || // number keys
80
- // keyCode == 32 ||
81
- // keyCode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)
82
- // (keyCode > 64 && keyCode < 91) || // letter keys
83
- // (keyCode > 95 && keyCode < 112) || // numpad keys
84
- // (keyCode > 185 && keyCode < 193) || // ;=,-./` (in order)
85
- // (keyCode > 218 && keyCode < 223) // [\]' (in order)
86
- // ) {
87
- // this.startEditTarget(row, column)
88
- // }
89
- // return
90
- // }
91
- // }
92
- // if (!this.focused || this.focused.row !== row || this.focused.column !== column) {
93
- // this.dispatchEvent(new CustomEvent('focus-change', { bubbles: true, composed: true, detail: { row, column } }))
94
- // }
95
21
  }
96
22
  //# sourceMappingURL=record-view-body-keydown-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"record-view-body-keydown-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-keydown-handler.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAuB,CAAQ;IAC/E,qBAAqB;IAErB,QAAS,CAAmB,CAAC,GAAG,EAAE;QAChC,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,wBAAwB;QACxB,KAAK,OAAO;YACV,+DAA+D;YAC/D,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,CAAA;YAEjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE;gBAC3C,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;aAC9C;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAEzB,MAAK;QACP,QAAQ;KACT;IAED,YAAY;IACZ,0BAA0B;IAC1B,mDAAmD;IACnD,yCAAyC;IACzC,iFAAiF;IACjF,mFAAmF;IAEnF,4BAA4B;IAC5B,uBAAuB;IACvB,4BAA4B;IAC5B,+BAA+B;IAC/B,8BAA8B;IAC9B,kCAAkC;IAClC,qBAAqB;IACrB,eAAe;IAEf,+BAA+B;IAC/B,qCAAqC;IACrC,oDAAoD;IACpD,wBAAwB;IACxB,iBAAiB;IAEjB,gCAAgC;IAChC,qCAAqC;IACrC,2CAA2C;IAC3C,wBAAwB;IACxB,iBAAiB;IAEjB,eAAe;IACf,eAAe;IACf,MAAM;IACN,WAAW;IACX,uBAAuB;IACvB,2BAA2B;IAC3B,mCAAmC;IACnC,cAAc;IAEd,6BAA6B;IAC7B,wCAAwC;IACxC,cAAc;IAEd,8BAA8B;IAC9B,0CAA0C;IAC1C,eAAe;IAEf,6BAA6B;IAC7B,kCAAkC;IAClC,yCAAyC;IACzC,cAAc;IAEd,8BAA8B;IAC9B,4BAA4B;IAC5B,iDAAiD;IACjD,cAAc;IAEd,+BAA+B;IAC/B,+CAA+C;IAC/C,oCAAoC;IACpC,cAAc;IAEd,iCAAiC;IACjC,yCAAyC;IACzC,cAAc;IAEd,4BAA4B;IAC5B,eAAe;IAEf,eAAe;IACf,aAAa;IACb,2DAA2D;IAC3D,2BAA2B;IAC3B,+FAA+F;IAC/F,2DAA2D;IAC3D,4DAA4D;IAC5D,oEAAoE;IACpE,8DAA8D;IAC9D,YAAY;IACZ,4CAA4C;IAC5C,UAAU;IACV,eAAe;IACf,MAAM;IACN,IAAI;IAEJ,qFAAqF;IACrF,oHAAoH;IACpH,IAAI;AACN,CAAC","sourcesContent":["import { RecordViewBody } from '../record-view-body'\n\n/**\n * ox-record-view-body 의 keydown handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport async function recordViewBodyKeydownHandler(this: RecordViewBody, e: Event): Promise<void> {\n // e.preventDefault()\n\n switch ((e as KeyboardEvent).key) {\n case 'Esc':\n case 'Escape':\n /* TODO 편집이 취소되어야 한다. */\n case 'Enter':\n /* 먼저, focus를 옮겨놓아야, focusout 으로 인해서 popup이 닫히는 것을 방지할 수 있다. */\n !this.onlyForEdit && this.focus()\n\n if (!this.onlyForEdit && this.currentTarget) {\n this.currentTarget.removeAttribute('editing')\n }\n\n this.currentTarget = null\n\n break\n default:\n }\n\n // arrow-key\n // var keyCode = e.keyCode\n // var { row = 0, column = 0 } = this.focused || {}\n // var { records = [] } = this.data || {}\n // var maxrow = this.config.rows.appendable ? records.length : records.length - 1\n // var maxcolumn = (this.columns || []).filter(column => !column.hidden).length - 1\n\n // if (this.currentTarget) {\n // switch (keyCode) {\n // case KEYCODE.KEY_ESC:\n // /* TODO 편집이 취소되어야 한다. */\n // case KEYCODE.KEY_ENTER:\n // this.currentTarget = null\n // this.focus()\n // return\n\n // // case KEYCODE.KEY_TAP:\n // // this.currentTarget = null\n // // column = Math.min(maxcolumn, column + 1)\n // // this.focus()\n // // break\n\n // // case KEYCODE.KEY_DOWN:\n // // this.currentTarget = null\n // // row = Math.min(maxrow, row + 1)\n // // this.focus()\n // // break\n\n // default:\n // return\n // }\n // } else {\n // switch (keyCode) {\n // case KEYCODE.KEY_UP:\n // row = Math.max(0, row - 1)\n // break\n\n // case KEYCODE.KEY_DOWN:\n // row = Math.min(maxrow, row + 1)\n // break\n\n // case KEYCODE.KEY_ENTER:\n // this.startEditTarget(row, column)\n // return\n\n // case KEYCODE.KEY_LEFT:\n // case KEYCODE.KEY_BACKSPACE:\n // column = Math.max(0, column - 1)\n // break\n\n // case KEYCODE.KEY_RIGHT:\n // case KEYCODE.KEY_TAP:\n // column = Math.min(maxcolumn, column + 1)\n // break\n\n // case KEYCODE.KEY_PAGEUP:\n // /* TODO 페이지당 레코드의 수를 계산해서 증감시켜야 한다. */\n // row = Math.max(0, row - 10)\n // break\n\n // case KEYCODE.KEY_PAGEDOWN:\n // row = Math.min(maxrow, row + 10)\n // break\n\n // case KEYCODE.KEY_ESC:\n // return\n\n // default:\n // if (\n // (keyCode > 47 && keyCode < 58) || // number keys\n // keyCode == 32 ||\n // keyCode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)\n // (keyCode > 64 && keyCode < 91) || // letter keys\n // (keyCode > 95 && keyCode < 112) || // numpad keys\n // (keyCode > 185 && keyCode < 193) || // ;=,-./` (in order)\n // (keyCode > 218 && keyCode < 223) // [\\]' (in order)\n // ) {\n // this.startEditTarget(row, column)\n // }\n // return\n // }\n // }\n\n // if (!this.focused || this.focused.row !== row || this.focused.column !== column) {\n // this.dispatchEvent(new CustomEvent('focus-change', { bubbles: true, composed: true, detail: { row, column } }))\n // }\n}\n"]}
1
+ {"version":3,"file":"record-view-body-keydown-handler.js","sourceRoot":"","sources":["../../../../src/record-view/event-handlers/record-view-body-keydown-handler.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAuB,CAAQ;IAC/E,QAAS,CAAmB,CAAC,GAAG,EAAE;QAChC,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,wBAAwB;QACxB,KAAK,OAAO;YACV,+DAA+D;YAC/D,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,CAAA;YAEjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE;gBAC3C,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;aAC9C;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAEzB,MAAK;QACP,QAAQ;KACT;AACH,CAAC","sourcesContent":["import { RecordViewBody } from '../record-view-body'\n\n/**\n * ox-record-view-body 의 keydown handler\n *\n * - handler의 this 는 ox-record-view-body임.\n */\nexport async function recordViewBodyKeydownHandler(this: RecordViewBody, e: Event): Promise<void> {\n switch ((e as KeyboardEvent).key) {\n case 'Esc':\n case 'Escape':\n /* TODO 편집이 취소되어야 한다. */\n case 'Enter':\n /* 먼저, focus를 옮겨놓아야, focusout 으로 인해서 popup이 닫히는 것을 방지할 수 있다. */\n !this.onlyForEdit && this.focus()\n\n if (!this.onlyForEdit && this.currentTarget) {\n this.currentTarget.removeAttribute('editing')\n }\n\n this.currentTarget = null\n\n break\n default:\n }\n}\n"]}
@@ -1 +1,2 @@
1
1
  export * from './record-view';
2
+ export * from './record-creator';
@@ -1,2 +1,3 @@
1
1
  export * from './record-view';
2
+ export * from './record-creator';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/record-view/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA","sourcesContent":["export * from './record-view'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/record-view/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA","sourcesContent":["export * from './record-view'\nexport * from './record-creator'\n"]}
@@ -2,12 +2,15 @@ import '@material/mwc-icon';
2
2
  import './record-view';
3
3
  import { LitElement } from 'lit';
4
4
  import { DataGrist } from '../data-grist';
5
- import { GristRecord } from '../types';
6
5
  export declare class RecordCreator extends LitElement {
7
6
  grist?: DataGrist;
8
- record: GristRecord;
7
+ callback?: (operation: {
8
+ [key: string]: any;
9
+ }) => boolean;
10
+ lightPopup: boolean;
9
11
  constructor();
10
12
  connectedCallback(): void;
11
13
  render(): import("lit-html").TemplateResult<1>;
14
+ lightPopupRecordView(): void;
12
15
  popupRecordView(): void;
13
16
  }
@@ -2,16 +2,21 @@ import { __decorate } from "tslib";
2
2
  import '@material/mwc-icon';
3
3
  import './record-view';
4
4
  import { html, LitElement } from 'lit';
5
- import { customElement, state } from 'lit/decorators.js';
5
+ import { customElement, property, state } from 'lit/decorators.js';
6
6
  import { OxPopup } from '@operato/popup';
7
7
  let RecordCreator = class RecordCreator extends LitElement {
8
8
  constructor() {
9
9
  super();
10
- this.record = { __dirty__: '+' };
10
+ this.lightPopup = false;
11
11
  this.addEventListener('click', (e) => {
12
12
  e.preventDefault();
13
13
  e.stopPropagation();
14
- this.popupRecordView();
14
+ if (this.lightPopup) {
15
+ this.lightPopupRecordView();
16
+ }
17
+ else {
18
+ this.popupRecordView();
19
+ }
15
20
  });
16
21
  }
17
22
  connectedCallback() {
@@ -21,20 +26,15 @@ let RecordCreator = class RecordCreator extends LitElement {
21
26
  render() {
22
27
  return html `<slot></slot>`;
23
28
  }
24
- popupRecordView() {
29
+ lightPopupRecordView() {
25
30
  const config = this.grist.compiledConfig;
26
- var titleField = config.list.fields[0] || 'name';
27
- var title = this.record[titleField];
31
+ var title = 'create';
28
32
  const rowIndex = -1;
29
33
  var record = {};
30
34
  const columns = config.columns;
31
- /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */
32
- if (typeof title == 'object') {
33
- var column = config.columns.find(column => column.name == titleField);
34
- title = column === null || column === void 0 ? void 0 : column.record.renderer(title, column, record, rowIndex, this);
35
- }
36
35
  var popup = OxPopup.open({
37
36
  template: html `
37
+ <div title>${title}</div>
38
38
  <ox-record-view
39
39
  only-for-edit
40
40
  @field-change=${(e) => {
@@ -51,7 +51,6 @@ let RecordCreator = class RecordCreator extends LitElement {
51
51
  [column.name]: after
52
52
  };
53
53
  }}
54
- .config=${config}
55
54
  .columns=${columns}
56
55
  .record=${record}
57
56
  .rowIndex=${rowIndex}
@@ -76,13 +75,69 @@ let RecordCreator = class RecordCreator extends LitElement {
76
75
  parent: document.body
77
76
  });
78
77
  }
78
+ popupRecordView() {
79
+ const config = this.grist.compiledConfig;
80
+ const rowIndex = -1;
81
+ var record = {};
82
+ const columns = config.columns;
83
+ var title = 'create';
84
+ var recordView = document.createElement('ox-record-view');
85
+ recordView.setAttribute('only-for-edit', '');
86
+ recordView.columns = columns;
87
+ recordView.record = record;
88
+ recordView.rowIndex = rowIndex;
89
+ document.dispatchEvent(new CustomEvent('open-popup', {
90
+ detail: {
91
+ template: recordView,
92
+ options: {
93
+ backdrop: true,
94
+ size: 'large',
95
+ title
96
+ },
97
+ callback: (popup) => {
98
+ recordView.addEventListener('reset', (e) => {
99
+ const view = e.currentTarget;
100
+ view.record = {};
101
+ });
102
+ recordView.addEventListener('cancel', (e) => {
103
+ popup.close();
104
+ });
105
+ recordView.addEventListener('ok', async (e) => {
106
+ var _a;
107
+ const view = e.currentTarget;
108
+ if (await ((_a = this.callback) === null || _a === void 0 ? void 0 : _a.call(this, view.record))) {
109
+ popup.close();
110
+ }
111
+ });
112
+ recordView.addEventListener('field-change', (e) => {
113
+ const view = e.currentTarget;
114
+ var { after, before, column, record, row } = e.detail;
115
+ var validation = column.validation;
116
+ if (validation && typeof validation == 'function') {
117
+ if (!validation.call(this, after, before, record, column)) {
118
+ return;
119
+ }
120
+ }
121
+ view.record = {
122
+ ...record,
123
+ [column.name]: after
124
+ };
125
+ });
126
+ popup.onclosed = () => { };
127
+ }
128
+ }
129
+ }));
130
+ }
79
131
  };
80
132
  __decorate([
81
133
  state()
82
134
  ], RecordCreator.prototype, "grist", void 0);
83
135
  __decorate([
84
- state()
85
- ], RecordCreator.prototype, "record", void 0);
136
+ property({ type: Object })
137
+ ], RecordCreator.prototype, "callback", void 0);
138
+ __decorate([
139
+ property({ type: Boolean, attribute: 'light-popup' })
140
+ ], RecordCreator.prototype, "lightPopup", void 0);
86
141
  RecordCreator = __decorate([
87
142
  customElement('ox-record-creator')
88
143
  ], RecordCreator);