@operato/data-grist 0.3.14 → 0.3.18

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 (127) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/assets/images/no-image.png +0 -0
  3. package/custom-elements.json +2063 -1488
  4. package/demo/index.html +37 -79
  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/data-card.d.ts +3 -6
  8. package/dist/src/data-card/data-card.js +3 -131
  9. package/dist/src/data-card/data-card.js.map +1 -1
  10. package/dist/src/data-card/record-card.d.ts +0 -3
  11. package/dist/src/data-card/record-card.js +7 -62
  12. package/dist/src/data-card/record-card.js.map +1 -1
  13. package/dist/src/data-grid/data-grid-body.d.ts +7 -1
  14. package/dist/src/data-grid/data-grid-body.js +26 -5
  15. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  16. package/dist/src/data-grid/data-grid-field.js +1 -1
  17. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  18. package/dist/src/data-grid/data-grid-header.d.ts +1 -0
  19. package/dist/src/data-grid/data-grid-header.js +11 -3
  20. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  21. package/dist/src/data-grid/data-grid.d.ts +8 -4
  22. package/dist/src/data-grid/data-grid.js +12 -132
  23. package/dist/src/data-grid/data-grid.js.map +1 -1
  24. package/dist/src/data-grist.d.ts +1 -0
  25. package/dist/src/data-grist.js +8 -0
  26. package/dist/src/data-grist.js.map +1 -1
  27. package/dist/src/data-list/data-list.d.ts +3 -6
  28. package/dist/src/data-list/data-list.js +3 -131
  29. package/dist/src/data-list/data-list.js.map +1 -1
  30. package/dist/src/data-list/record-partial.d.ts +0 -2
  31. package/dist/src/data-list/record-partial.js +7 -58
  32. package/dist/src/data-list/record-partial.js.map +1 -1
  33. package/dist/src/data-manipulator.d.ts +20 -0
  34. package/dist/src/data-manipulator.js +148 -0
  35. package/dist/src/data-manipulator.js.map +1 -0
  36. package/dist/src/editors/image-input.d.ts +7 -0
  37. package/dist/src/editors/image-input.js +31 -0
  38. package/dist/src/editors/image-input.js.map +1 -0
  39. package/dist/src/editors/index.d.ts +1 -0
  40. package/dist/src/editors/index.js +1 -0
  41. package/dist/src/editors/index.js.map +1 -1
  42. package/dist/src/editors/input-editors.d.ts +1 -8
  43. package/dist/src/editors/input-editors.js +3 -47
  44. package/dist/src/editors/input-editors.js.map +1 -1
  45. package/dist/src/editors/registry.js +2 -1
  46. package/dist/src/editors/registry.js.map +1 -1
  47. package/dist/src/filters/filter-checkbox.js +2 -2
  48. package/dist/src/filters/filter-checkbox.js.map +1 -1
  49. package/dist/src/filters/filter-input.js +1 -1
  50. package/dist/src/filters/filter-input.js.map +1 -1
  51. package/dist/src/filters/filter-range-date.js +1 -1
  52. package/dist/src/filters/filter-range-date.js.map +1 -1
  53. package/dist/src/filters/filter-range-number.js +1 -1
  54. package/dist/src/filters/filter-range-number.js.map +1 -1
  55. package/dist/src/filters/filter-select.js +2 -2
  56. package/dist/src/filters/filter-select.js.map +1 -1
  57. package/dist/src/filters/filters-form.d.ts +9 -5
  58. package/dist/src/filters/filters-form.js +63 -15
  59. package/dist/src/filters/filters-form.js.map +1 -1
  60. package/dist/src/handlers/record-view-handler.d.ts +1 -2
  61. package/dist/src/handlers/record-view-handler.js +5 -35
  62. package/dist/src/handlers/record-view-handler.js.map +1 -1
  63. package/dist/src/handlers/select-row-toggle.d.ts +1 -1
  64. package/dist/src/handlers/select-row-toggle.js.map +1 -1
  65. package/dist/src/record-view/event-handlers/record-view-body-click-handler.d.ts +7 -0
  66. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js +24 -0
  67. package/dist/src/record-view/event-handlers/record-view-body-click-handler.js.map +1 -0
  68. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.d.ts +7 -0
  69. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js +22 -0
  70. package/dist/src/record-view/event-handlers/record-view-body-keydown-handler.js.map +1 -0
  71. package/dist/src/record-view/index.d.ts +1 -0
  72. package/dist/src/record-view/index.js +1 -0
  73. package/dist/src/record-view/index.js.map +1 -1
  74. package/dist/src/record-view/record-creator.d.ts +16 -0
  75. package/dist/src/record-view/record-creator.js +145 -0
  76. package/dist/src/record-view/record-creator.js.map +1 -0
  77. package/dist/src/record-view/record-view-body.d.ts +3 -4
  78. package/dist/src/record-view/record-view-body.js +15 -39
  79. package/dist/src/record-view/record-view-body.js.map +1 -1
  80. package/dist/src/record-view/record-view-handler.d.ts +9 -0
  81. package/dist/src/record-view/record-view-handler.js +57 -0
  82. package/dist/src/record-view/record-view-handler.js.map +1 -0
  83. package/dist/src/record-view/record-view.d.ts +4 -3
  84. package/dist/src/record-view/record-view.js +20 -55
  85. package/dist/src/record-view/record-view.js.map +1 -1
  86. package/dist/src/renderers/image-renderer.js +12 -4
  87. package/dist/src/renderers/image-renderer.js.map +1 -1
  88. package/dist/src/sorters/sorters-control.d.ts +12 -0
  89. package/dist/src/sorters/sorters-control.js +106 -0
  90. package/dist/src/sorters/sorters-control.js.map +1 -0
  91. package/dist/src/types.d.ts +6 -4
  92. package/dist/src/types.js.map +1 -1
  93. package/dist/tsconfig.tsbuildinfo +1 -1
  94. package/package.json +10 -8
  95. package/src/configure/column-builder.ts +29 -3
  96. package/src/data-card/data-card.ts +4 -158
  97. package/src/data-card/record-card.ts +14 -78
  98. package/src/data-grid/data-grid-body.ts +43 -6
  99. package/src/data-grid/data-grid-field.ts +1 -1
  100. package/src/data-grid/data-grid-header.ts +15 -5
  101. package/src/data-grid/data-grid.ts +25 -143
  102. package/src/data-grist.ts +12 -0
  103. package/src/data-list/data-list.ts +4 -158
  104. package/src/data-list/record-partial.ts +14 -73
  105. package/src/data-manipulator.ts +201 -0
  106. package/src/editors/image-input.ts +29 -0
  107. package/src/editors/index.ts +1 -0
  108. package/src/editors/input-editors.ts +5 -48
  109. package/src/editors/registry.ts +1 -1
  110. package/src/filters/filter-checkbox.ts +3 -2
  111. package/src/filters/filter-input.ts +3 -3
  112. package/src/filters/filter-range-date.ts +3 -3
  113. package/src/filters/filter-range-number.ts +3 -3
  114. package/src/filters/filter-select.ts +3 -2
  115. package/src/filters/filters-form.ts +77 -41
  116. package/src/handlers/record-view-handler.ts +8 -44
  117. package/src/handlers/select-row-toggle.ts +1 -2
  118. package/src/record-view/event-handlers/record-view-body-click-handler.ts +30 -0
  119. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +26 -0
  120. package/src/record-view/index.ts +1 -0
  121. package/src/record-view/record-creator.ts +180 -0
  122. package/src/record-view/record-view-body.ts +16 -52
  123. package/src/record-view/record-view-handler.ts +86 -0
  124. package/src/record-view/record-view.ts +21 -55
  125. package/src/renderers/image-renderer.ts +14 -5
  126. package/src/sorters/sorters-control.ts +111 -0
  127. package/src/types.ts +41 -31
@@ -1,7 +1,7 @@
1
1
  import { html } from 'lit-html';
2
2
  export const FilterInput = (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 ` <input type=${type} name="${column.name}" /> `;
6
6
  };
7
7
  //# sourceMappingURL=filter-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-input.js","sourceRoot":"","sources":["../../../src/filters/filter-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACjE,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,gBAAgB,IAAI,UAAU,MAAM,CAAC,IAAI,OAAO,CAAA;AAC7D,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterSelectRenderer } from '../types'\n\nexport const FilterInput: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter\n const type = typeof filter === 'boolean' ? column.type : filter?.type || column.type\n\n return html` <input type=${type} name=\"${column.name}\" /> `\n}\n"]}
1
+ {"version":3,"file":"filter-input.js","sourceRoot":"","sources":["../../../src/filters/filter-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACjE,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,gBAAgB,IAAI,UAAU,MAAM,CAAC,IAAI,OAAO,CAAA;AAC7D,CAAC,CAAA","sourcesContent":["import { html } from 'lit-html'\n\nimport { FilterConfigObject, FilterSelectRenderer } from '../types'\n\nexport const FilterInput: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter as FilterConfigObject\n const type = filter?.type || column.type\n\n return html` <input type=${type} name=\"${column.name}\" /> `\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { html } from 'lit-html';
2
2
  export const FilterRangeDate = (column, owner) => {
3
3
  const filter = column.filter;
4
- var type = typeof filter === 'boolean' ? column.type : (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
4
+ var type = (filter === null || filter === void 0 ? void 0 : filter.type) || column.type;
5
5
  if (type === 'datetime') {
6
6
  type = 'datetime-local';
7
7
  }
@@ -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,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"]}
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,MAA4B,CAAA;IAClD,IAAI,IAAI,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,MAAM,CAAC,IAAI,CAAA;IACtC,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 { FilterConfigObject, FilterSelectRenderer } from '../types'\n\nexport const FilterRangeDate: FilterSelectRenderer = (column, owner) => {\n const filter = column.filter as FilterConfigObject\n var 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"]}
@@ -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":";AAAA,OAAO,+BAA+B,CAAA;AACtC,OAAO,6BAA6B,CAAA;AACpC,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAIlE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAkC9C,IAAa,WAAW,GAAxB,MAAa,WAAY,SAAQ,UAAU;IAA3C;;QAoB8B,oBAAe,GAAW,IAAI,CAAA;IAmE5D,CAAC;IAhEC,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAE/E,OAAO,IAAI,CAAA;;UAEL,OAAO,CAAC,GAAG,CAAC,CAAC,MAAoB,EAAE,EAAE;YACrC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;YACtC,MAAM,WAAW,GACf,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;oBAC3B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,KAAK,CAAC,QAAQ;wBAChB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;wBAClB,CAAC,CAAC,IAAI,CAAA;YAEV,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;YACpF,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACpF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YAE7C,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO,IAAI,CAAA,EAAE,CAAA;aACd;YAED,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAC7B,CAAC,CAAC,IAAI,CAAA;mCACiB,IAAI,kBAAkB,WAAW;;sBAE9C,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;;;eAG7B;gBACH,CAAC,CAAC,IAAI,CAAA,wBAAwB,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAA;QACnF,CAAC,CAAC;;KAEL,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;aACvB,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;aAC3C,GAAG,CAAC,CAAC,MAAoB,EAAE,EAAE;YAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;YAC/B,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAO,CAAC,QAAQ,IAAI,IAAI,CAAA;YAE9E,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;gBACrB,OAAM;aACP;YAED,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE;gBACzC,OAAM;aACP;YAED,OAAO;gBACL,IAAI;gBACJ,QAAQ;gBACR,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;aAC7C,CAAA;QACH,CAAC,CAAC;aACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,CAAkB,CAAA;IAC5D,CAAC;CACF,CAAA;AAtFQ,kBAAM,GAAG;IACd,YAAY;IACZ,GAAG,CAAA;;;;;;;;;;;;;KAaF;CACF,CAAA;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAqB;AACpB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAA+B;AAC3C;IAAd,KAAK,CAAC,MAAM,CAAC;yCAAuB;AArB1B,WAAW;IADvB,aAAa,CAAC,iBAAiB,CAAC;GACpB,WAAW,CAuFvB;SAvFY,WAAW","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"]}
@@ -0,0 +1,7 @@
1
+ import { RecordViewBody } from '../record-view-body';
2
+ /**
3
+ * ox-record-view-body 의 click handler
4
+ *
5
+ * - handler의 this 는 ox-record-view-body임.
6
+ */
7
+ export declare function recordViewBodyClickHandler(this: RecordViewBody, e: Event): void;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ox-record-view-body 의 click handler
3
+ *
4
+ * - handler의 this 는 ox-record-view-body임.
5
+ */
6
+ export function recordViewBodyClickHandler(e) {
7
+ e.stopPropagation();
8
+ /* target should be 'ox-grid-field' */
9
+ var target = e.target;
10
+ if (!this.onlyForEdit && this.currentTarget) {
11
+ this.focus();
12
+ this.currentTarget.removeAttribute('editing');
13
+ }
14
+ if (target.tagName !== 'OX-GRID-FIELD' || !target.column.record.editable) {
15
+ this.focus();
16
+ this.currentTarget = null;
17
+ return;
18
+ }
19
+ this.currentTarget = target;
20
+ if (!this.onlyForEdit) {
21
+ target.setAttribute('editing', 'true');
22
+ }
23
+ }
24
+ //# sourceMappingURL=record-view-body-click-handler.js.map
@@ -0,0 +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,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"]}
@@ -0,0 +1,7 @@
1
+ import { RecordViewBody } from '../record-view-body';
2
+ /**
3
+ * ox-record-view-body 의 keydown handler
4
+ *
5
+ * - handler의 this 는 ox-record-view-body임.
6
+ */
7
+ export declare function recordViewBodyKeydownHandler(this: RecordViewBody, e: Event): Promise<void>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ox-record-view-body 의 keydown handler
3
+ *
4
+ * - handler의 this 는 ox-record-view-body임.
5
+ */
6
+ export async function recordViewBodyKeydownHandler(e) {
7
+ switch (e.key) {
8
+ case 'Esc':
9
+ case 'Escape':
10
+ /* TODO 편집이 취소되어야 한다. */
11
+ case 'Enter':
12
+ /* 먼저, focus를 옮겨놓아야, focusout 으로 인해서 popup이 닫히는 것을 방지할 수 있다. */
13
+ !this.onlyForEdit && this.focus();
14
+ if (!this.onlyForEdit && this.currentTarget) {
15
+ this.currentTarget.removeAttribute('editing');
16
+ }
17
+ this.currentTarget = null;
18
+ break;
19
+ default:
20
+ }
21
+ }
22
+ //# sourceMappingURL=record-view-body-keydown-handler.js.map
@@ -0,0 +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,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"]}
@@ -0,0 +1,16 @@
1
+ import '@material/mwc-icon';
2
+ import './record-view';
3
+ import { LitElement } from 'lit';
4
+ import { DataGrist } from '../data-grist';
5
+ export declare class RecordCreator extends LitElement {
6
+ grist?: DataGrist;
7
+ callback?: (operation: {
8
+ [key: string]: any;
9
+ }) => boolean;
10
+ lightPopup: boolean;
11
+ constructor();
12
+ connectedCallback(): void;
13
+ render(): import("lit-html").TemplateResult<1>;
14
+ lightPopupRecordView(): void;
15
+ popupRecordView(): void;
16
+ }
@@ -0,0 +1,145 @@
1
+ import { __decorate } from "tslib";
2
+ import '@material/mwc-icon';
3
+ import './record-view';
4
+ import { html, LitElement } from 'lit';
5
+ import { customElement, property, state } from 'lit/decorators.js';
6
+ import { OxPopup } from '@operato/popup';
7
+ let RecordCreator = class RecordCreator extends LitElement {
8
+ constructor() {
9
+ super();
10
+ this.lightPopup = false;
11
+ this.addEventListener('click', (e) => {
12
+ e.preventDefault();
13
+ e.stopPropagation();
14
+ if (this.lightPopup) {
15
+ this.lightPopupRecordView();
16
+ }
17
+ else {
18
+ this.popupRecordView();
19
+ }
20
+ });
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this.grist = this.closest('ox-grist');
25
+ }
26
+ render() {
27
+ return html `<slot></slot>`;
28
+ }
29
+ lightPopupRecordView() {
30
+ const config = this.grist.compiledConfig;
31
+ var title = 'create';
32
+ const rowIndex = -1;
33
+ var record = {};
34
+ const columns = config.columns;
35
+ var popup = OxPopup.open({
36
+ template: html `
37
+ <div title>${title}</div>
38
+ <ox-record-view
39
+ only-for-edit
40
+ @field-change=${(e) => {
41
+ const view = e.currentTarget;
42
+ var { after, before, column, record, row } = e.detail;
43
+ var validation = column.validation;
44
+ if (validation && typeof validation == 'function') {
45
+ if (!validation.call(this, after, before, record, column)) {
46
+ return;
47
+ }
48
+ }
49
+ view.record = {
50
+ ...record,
51
+ [column.name]: after
52
+ };
53
+ }}
54
+ .columns=${columns}
55
+ .record=${record}
56
+ .rowIndex=${rowIndex}
57
+ @reset=${(e) => {
58
+ const view = e.currentTarget;
59
+ view.record = {};
60
+ }}
61
+ @cancel=${(e) => {
62
+ popup.close();
63
+ }}
64
+ @ok=${(e) => {
65
+ popup.close();
66
+ const view = e.currentTarget;
67
+ this.dispatchEvent(new CustomEvent('ok', {
68
+ bubbles: true,
69
+ composed: true,
70
+ detail: view.record
71
+ }));
72
+ }}
73
+ ></ox-record-view>
74
+ `,
75
+ parent: document.body
76
+ });
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
+ }
131
+ };
132
+ __decorate([
133
+ state()
134
+ ], RecordCreator.prototype, "grist", void 0);
135
+ __decorate([
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);
141
+ RecordCreator = __decorate([
142
+ customElement('ox-record-creator')
143
+ ], RecordCreator);
144
+ export { RecordCreator };
145
+ //# sourceMappingURL=record-creator.js.map