@operato/data-grist 2.0.0-alpha.0 → 2.0.0-alpha.3

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 (83) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/src/configure/column-builder.js +5 -5
  3. package/dist/src/configure/column-builder.js.map +1 -1
  4. package/dist/src/configure/zero-config.js +3 -1
  5. package/dist/src/configure/zero-config.js.map +1 -1
  6. package/dist/src/data-card/data-card-field.js +1 -1
  7. package/dist/src/data-card/data-card-field.js.map +1 -1
  8. package/dist/src/data-grid/data-grid-accum-field.d.ts +1 -0
  9. package/dist/src/data-grid/data-grid-accum-field.js +8 -0
  10. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  11. package/dist/src/data-grid/data-grid-body.js +24 -3
  12. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  13. package/dist/src/data-grid/data-grid-field.d.ts +1 -0
  14. package/dist/src/data-grid/data-grid-field.js +5 -0
  15. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  16. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js +2 -2
  17. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js.map +1 -1
  18. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.d.ts +7 -0
  19. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js +25 -0
  20. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js.map +1 -0
  21. package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js +2 -2
  22. package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js.map +1 -1
  23. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js +2 -2
  24. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js.map +1 -1
  25. package/dist/src/data-list/data-list-field.js +1 -1
  26. package/dist/src/data-list/data-list-field.js.map +1 -1
  27. package/dist/src/data-manipulator.d.ts +7 -3
  28. package/dist/src/data-manipulator.js +86 -18
  29. package/dist/src/data-manipulator.js.map +1 -1
  30. package/dist/src/editors/ox-grist-editor-tree.d.ts +6 -0
  31. package/dist/src/editors/ox-grist-editor-tree.js +27 -0
  32. package/dist/src/editors/ox-grist-editor-tree.js.map +1 -0
  33. package/dist/src/editors/ox-grist-editor.d.ts +1 -0
  34. package/dist/src/editors/ox-grist-editor.js +3 -0
  35. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  36. package/dist/src/editors/ox-input-tree.d.ts +20 -0
  37. package/dist/src/editors/ox-input-tree.js +221 -0
  38. package/dist/src/editors/ox-input-tree.js.map +1 -0
  39. package/dist/src/editors/registry.js +3 -1
  40. package/dist/src/editors/registry.js.map +1 -1
  41. package/dist/src/filters/filters-form.js +1 -1
  42. package/dist/src/filters/filters-form.js.map +1 -1
  43. package/dist/src/handlers/contextmenu-tree-mutation.d.ts +3 -0
  44. package/dist/src/handlers/contextmenu-tree-mutation.js +82 -0
  45. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -0
  46. package/dist/src/handlers/registry.js +3 -1
  47. package/dist/src/handlers/registry.js.map +1 -1
  48. package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -0
  49. package/dist/src/renderers/ox-grist-renderer-tree.js +6 -3
  50. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  51. package/dist/src/types.d.ts +437 -6
  52. package/dist/src/types.js +9 -0
  53. package/dist/src/types.js.map +1 -1
  54. package/dist/stories/tree-column-with-checkbox.stories.js +8 -3
  55. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  56. package/dist/stories/tree-column.stories.js +8 -3
  57. package/dist/stories/tree-column.stories.js.map +1 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/docs/gutter/gutter.md +7 -0
  60. package/package.json +4 -4
  61. package/src/configure/column-builder.ts +4 -4
  62. package/src/configure/zero-config.ts +3 -1
  63. package/src/data-card/data-card-field.ts +1 -1
  64. package/src/data-grid/data-grid-accum-field.ts +7 -0
  65. package/src/data-grid/data-grid-body.ts +30 -3
  66. package/src/data-grid/data-grid-field.ts +6 -0
  67. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +2 -2
  68. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +32 -0
  69. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +2 -2
  70. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +2 -2
  71. package/src/data-list/data-list-field.ts +1 -1
  72. package/src/data-manipulator.ts +109 -22
  73. package/src/editors/ox-grist-editor-tree.ts +27 -0
  74. package/src/editors/ox-grist-editor.ts +4 -0
  75. package/src/editors/ox-input-tree.ts +226 -0
  76. package/src/editors/registry.ts +3 -1
  77. package/src/filters/filters-form.ts +1 -1
  78. package/src/handlers/contextmenu-tree-mutation.ts +98 -0
  79. package/src/handlers/registry.ts +3 -1
  80. package/src/renderers/ox-grist-renderer-tree.ts +7 -3
  81. package/src/types.ts +446 -6
  82. package/stories/tree-column-with-checkbox.stories.ts +8 -3
  83. package/stories/tree-column.stories.ts +8 -3
package/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.0.0-alpha.3](https://github.com/hatiolab/operato/compare/v2.0.0-alpha.2...v2.0.0-alpha.3) (2024-01-14)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * add-sibling-node, add-child-node for data-manipulator in data-grist ([c3be974](https://github.com/hatiolab/operato/commit/c3be974748ce9ec4e3b22534660a4ef736877248))
12
+ * jsdoc for data-grist type ([d55c2d3](https://github.com/hatiolab/operato/commit/d55c2d34d7f817a768d8795669f82473d1b2b806))
13
+ * treetable selection switch logic ([98afb6c](https://github.com/hatiolab/operato/commit/98afb6c5e79ccaeab027e65b6943637035097840))
14
+
15
+
16
+
17
+ ## [2.0.0-alpha.2](https://github.com/hatiolab/operato/compare/v2.0.0-alpha.1...v2.0.0-alpha.2) (2024-01-09)
18
+
19
+
20
+ ### :bug: Bug Fix
21
+
22
+ * add 'expand-all' and 'collapse-all' event for data-manipulator in data-grist ([879859f](https://github.com/hatiolab/operato/commit/879859fc5d5fa3222a6e398b2754d7784383a44a))
23
+ * add contextmenu event handler for ox-data-grist column configuration ([fc39bb4](https://github.com/hatiolab/operato/commit/fc39bb433e17bdedf93144c7226c9f1e73c4f3af))
24
+ * apply HeaderRenderer for LabelRenderer in ox-filters-form ([9194076](https://github.com/hatiolab/operato/commit/919407644810ad0bbe6a31add6c035fcfbe0d2d5))
25
+ * contextmenu-tree-mutation handler for data-grist column configuration ([22b6c1b](https://github.com/hatiolab/operato/commit/22b6c1bfd1ff91f4cc55a6674a86b355df3f2592))
26
+ * ox-grist-editor-tree 기능 ([8604919](https://github.com/hatiolab/operato/commit/8604919477fbf1ec15bbb68e2b7e5c8c975ef0d5))
27
+
28
+
29
+
6
30
  ## [2.0.0-alpha.0](https://github.com/hatiolab/operato/compare/v1.13.1...v2.0.0-alpha.0) (2024-01-05)
7
31
 
8
32
  **Note:** Version bump only for package @operato/data-grist
@@ -4,7 +4,7 @@ import { generateGutterColumn } from '../gutters';
4
4
  import { getGristEventHandler } from '../handlers';
5
5
  import { getRenderer } from '../renderers';
6
6
  export const buildColumn = (column) => {
7
- var _a;
7
+ var _a, _b;
8
8
  var compiled = { ...column };
9
9
  if (column.type == 'gutter') {
10
10
  compiled = generateGutterColumn(column);
@@ -28,9 +28,8 @@ export const buildColumn = (column) => {
28
28
  let type = typeof label;
29
29
  switch (type) {
30
30
  case 'boolean':
31
- let title = typeof header == 'string' ? header : name;
32
31
  compiled.label = {
33
- renderer: () => title
32
+ renderer: ((_b = compiled.header) === null || _b === void 0 ? void 0 : _b.renderer) || (() => name)
34
33
  };
35
34
  break;
36
35
  case 'string':
@@ -88,11 +87,12 @@ export const buildColumn = (column) => {
88
87
  }
89
88
  }
90
89
  /* handler */
91
- var { click, dblclick, focus } = handlers || {};
90
+ var { click, dblclick, focus, contextmenu } = handlers || {};
92
91
  compiled.handlers = {
93
92
  click: click && getGristEventHandler(click),
94
93
  dblclick: dblclick && getGristEventHandler(dblclick),
95
- focus: focus && getGristEventHandler(focus)
94
+ focus: focus && getGristEventHandler(focus),
95
+ contextmenu: contextmenu && getGristEventHandler(contextmenu)
96
96
  };
97
97
  return compiled;
98
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"column-builder.js","sourceRoot":"","sources":["../../../src/configure/column-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { FilterConfigObject, FilterOperator } from '..'\nimport { NOOP } from '../const'\nimport { getEditor } from '../editors'\nimport { generateGutterColumn } from '../gutters'\nimport { getGristEventHandler } from '../handlers'\nimport { getRenderer } from '../renderers'\nimport { ColumnConfig } from '../types'\n\nexport const buildColumn = (column: any): ColumnConfig => {\n var compiled: ColumnConfig = { ...column }\n\n if (column.type == 'gutter') {\n compiled = generateGutterColumn(column)\n }\n\n var { name, header, record, handlers, label, filter } = compiled\n\n /* header */\n\n if (typeof header == 'string') {\n compiled.header = {\n renderer: () => header\n }\n }\n\n if (typeof compiled.header?.renderer == 'string') {\n const text = compiled.header.renderer\n compiled.header = {\n ...compiled.header,\n renderer: () => text\n }\n }\n\n /* label */\n if (label) {\n let type = typeof label\n switch (type) {\n case 'boolean':\n let title = typeof header == 'string' ? header : name\n compiled.label = {\n renderer: () => title\n }\n break\n case 'string':\n compiled.label = {\n renderer: () => label\n }\n break\n default:\n compiled.label = label\n }\n } else {\n compiled.label = false\n }\n\n /*\n * record\n */\n var { renderer: recordRenderer, editor, editable, classifier } = record || {}\n\n recordRenderer = getRenderer(recordRenderer || column.type)\n if (editable !== false && typeof editor !== 'function') {\n editor = getEditor(column.type)\n }\n\n if (typeof classifier !== 'function') {\n classifier = NOOP\n }\n\n compiled.record = {\n ...record,\n classifier,\n renderer: recordRenderer,\n editor\n }\n\n /* filter */\n if (filter) {\n let type = typeof filter\n switch (type) {\n case 'boolean':\n compiled.filter = {\n type: column.type,\n operator: 'eq'\n }\n break\n case 'string':\n compiled.filter = {\n type: column.type,\n operator: filter as FilterOperator\n }\n break\n default:\n compiled.filter = {\n //@ts-ignore\n type: column.type,\n operator: 'eq',\n ...(filter as FilterConfigObject)\n }\n }\n }\n\n /* handler */\n var { click, dblclick, focus } = handlers || {}\n\n compiled.handlers = {\n click: click && getGristEventHandler(click),\n dblclick: dblclick && getGristEventHandler(dblclick),\n focus: focus && getGristEventHandler(focus)\n }\n\n return compiled\n}\n"]}
1
+ {"version":3,"file":"column-builder.js","sourceRoot":"","sources":["../../../src/configure/column-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG1C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAW,EAAgB,EAAE;;IACvD,IAAI,QAAQ,GAAiB,EAAE,GAAG,MAAM,EAAE,CAAA;IAE1C,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;IAEhE,YAAY;IAEZ,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,QAAQ,CAAC,MAAM,GAAG;YAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;SACvB,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAA,MAAA,QAAQ,CAAC,MAAM,0CAAE,QAAQ,CAAA,IAAI,QAAQ,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrC,QAAQ,CAAC,MAAM,GAAG;YAChB,GAAG,QAAQ,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;SACrB,CAAA;IACH,CAAC;IAED,WAAW;IACX,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,IAAI,GAAG,OAAO,KAAK,CAAA;QACvB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,QAAQ,CAAC,KAAK,GAAG;oBACf,QAAQ,EAAE,CAAA,MAAA,QAAQ,CAAC,MAAM,0CAAE,QAAQ,KAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;iBACpD,CAAA;gBACD,MAAK;YACP,KAAK,QAAQ;gBACX,QAAQ,CAAC,KAAK,GAAG;oBACf,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;iBACtB,CAAA;gBACD,MAAK;YACP;gBACE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;QAC1B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAE7E,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3D,IAAI,QAAQ,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG;QAChB,GAAG,MAAM;QACT,UAAU;QACV,QAAQ,EAAE,cAAc;QACxB,MAAM;KACP,CAAA;IAED,YAAY;IACZ,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,IAAI,GAAG,OAAO,MAAM,CAAA;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,QAAQ,CAAC,MAAM,GAAG;oBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,IAAI;iBACf,CAAA;gBACD,MAAK;YACP,KAAK,QAAQ;gBACX,QAAQ,CAAC,MAAM,GAAG;oBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAwB;iBACnC,CAAA;gBACD,MAAK;YACP;gBACE,QAAQ,CAAC,MAAM,GAAG;oBAChB,YAAY;oBACZ,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,IAAI;oBACd,GAAI,MAA6B;iBAClC,CAAA;QACL,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAA;IAE5D,QAAQ,CAAC,QAAQ,GAAG;QAClB,KAAK,EAAE,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC;QAC3C,QAAQ,EAAE,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QACpD,KAAK,EAAE,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC;QAC3C,WAAW,EAAE,WAAW,IAAI,oBAAoB,CAAC,WAAW,CAAC;KAC9D,CAAA;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import { FilterConfigObject, FilterOperator } from '..'\nimport { NOOP } from '../const'\nimport { getEditor } from '../editors'\nimport { generateGutterColumn } from '../gutters'\nimport { getGristEventHandler } from '../handlers'\nimport { getRenderer } from '../renderers'\nimport { ColumnConfig } from '../types'\n\nexport const buildColumn = (column: any): ColumnConfig => {\n var compiled: ColumnConfig = { ...column }\n\n if (column.type == 'gutter') {\n compiled = generateGutterColumn(column)\n }\n\n var { name, header, record, handlers, label, filter } = compiled\n\n /* header */\n\n if (typeof header == 'string') {\n compiled.header = {\n renderer: () => header\n }\n }\n\n if (typeof compiled.header?.renderer == 'string') {\n const text = compiled.header.renderer\n compiled.header = {\n ...compiled.header,\n renderer: () => text\n }\n }\n\n /* label */\n if (label) {\n let type = typeof label\n switch (type) {\n case 'boolean':\n compiled.label = {\n renderer: compiled.header?.renderer || (() => name)\n }\n break\n case 'string':\n compiled.label = {\n renderer: () => label\n }\n break\n default:\n compiled.label = label\n }\n } else {\n compiled.label = false\n }\n\n /*\n * record\n */\n var { renderer: recordRenderer, editor, editable, classifier } = record || {}\n\n recordRenderer = getRenderer(recordRenderer || column.type)\n if (editable !== false && typeof editor !== 'function') {\n editor = getEditor(column.type)\n }\n\n if (typeof classifier !== 'function') {\n classifier = NOOP\n }\n\n compiled.record = {\n ...record,\n classifier,\n renderer: recordRenderer,\n editor\n }\n\n /* filter */\n if (filter) {\n let type = typeof filter\n switch (type) {\n case 'boolean':\n compiled.filter = {\n type: column.type,\n operator: 'eq'\n }\n break\n case 'string':\n compiled.filter = {\n type: column.type,\n operator: filter as FilterOperator\n }\n break\n default:\n compiled.filter = {\n //@ts-ignore\n type: column.type,\n operator: 'eq',\n ...(filter as FilterConfigObject)\n }\n }\n }\n\n /* handler */\n var { click, dblclick, focus, contextmenu } = handlers || {}\n\n compiled.handlers = {\n click: click && getGristEventHandler(click),\n dblclick: dblclick && getGristEventHandler(dblclick),\n focus: focus && getGristEventHandler(focus),\n contextmenu: contextmenu && getGristEventHandler(contextmenu)\n }\n\n return compiled\n}\n"]}
@@ -2,7 +2,9 @@ export const ZERO_CLASSIFIER = (record, rowIndex) => { };
2
2
  export const ZERO_FIELD_RENDERER = (value, column, record, rowIndex, owner) => { };
3
3
  export const ZERO_EVENTHANDLERSET = {
4
4
  click: undefined,
5
- dblclick: undefined
5
+ dblclick: undefined,
6
+ focus: undefined,
7
+ contextmenu: undefined
6
8
  };
7
9
  export const ZERO_COLUMNS = [];
8
10
  export const ZERO_GROUPS = [];
@@ -1 +1 @@
1
- {"version":3,"file":"zero-config.js","sourceRoot":"","sources":["../../../src/configure/zero-config.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAE,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;CACpB,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAmB,EAAE,CAAA;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAkB,EAAE,CAAA;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAO,EAAE,CAAA;AACjC,MAAM,CAAC,MAAM,UAAU,GAAgB,KAAK,CAAA;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAE,CAAC;KACvB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,mBAAmB;QAC7B,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,EAAE;KACZ;IACD,QAAQ,EAAE,oBAAoB;IAC9B,KAAK,EAAE,UAAU;CAClB,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,oBAAoB;CAC/B,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;IAC5C,OAAO,EAAE,EAAE;CACZ,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe,EAAE,CAAA;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAgB,EAAE,CAAA;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAkB,EAAE,CAAA;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,OAAO,EAAE,YAAY;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,UAAU;CAClB,CAAA","sourcesContent":["import {\n ColumnConfig,\n FieldRenderer,\n GristClassifier,\n GristConfig,\n GristData,\n GristEventHandlerSet,\n GristRecord,\n GroupConfig,\n LabelConfig,\n ListConfig,\n TreeConfig,\n RowsConfig\n} from '../types'\n\nexport const ZERO_CLASSIFIER: GristClassifier = (record, rowIndex) => {}\nexport const ZERO_FIELD_RENDERER: FieldRenderer = (value, column, record, rowIndex, owner) => {}\n\nexport const ZERO_EVENTHANDLERSET: GristEventHandlerSet = {\n click: undefined,\n dblclick: undefined\n}\nexport const ZERO_COLUMNS: ColumnConfig[] = []\nexport const ZERO_GROUPS: GroupConfig[] = []\nexport const ZERO_TOTALS: [] = []\nexport const ZERO_LABEL: LabelConfig = false\n\nexport const ZERO_COLUMN: ColumnConfig = {\n type: '',\n name: '',\n header: {\n renderer: column => {}\n },\n record: {\n renderer: ZERO_FIELD_RENDERER,\n classifier: ZERO_CLASSIFIER,\n options: {}\n },\n handlers: ZERO_EVENTHANDLERSET,\n label: ZERO_LABEL\n}\n\nexport const ZERO_ROWS: RowsConfig = {\n appendable: false,\n insertable: false,\n groups: ZERO_GROUPS,\n totals: ZERO_TOTALS,\n classifier: ZERO_CLASSIFIER,\n handlers: ZERO_EVENTHANDLERSET\n}\n\nexport const ZERO_LIST: ListConfig = {\n fields: ['name', 'description', 'updatedAt'],\n details: []\n}\n\nexport const ZERO_TREE: TreeConfig = {}\n\nexport const ZERO_CONFIG: GristConfig = {\n columns: ZERO_COLUMNS,\n rows: ZERO_ROWS,\n list: ZERO_LIST,\n tree: ZERO_TREE\n}\n\nexport const ZERO_RECORD: GristRecord = {}\nexport const ZERO_RECORDS: GristRecord[] = []\n\nexport const ZERO_DATA: GristData = {\n records: ZERO_RECORDS\n}\n\nexport const ZERO_PAGES = [20, 30, 50, 100]\n\nexport const ZERO_PAGINATION = {\n page: 1,\n limit: 20,\n total: 0,\n pages: ZERO_PAGES\n}\n"]}
1
+ {"version":3,"file":"zero-config.js","sourceRoot":"","sources":["../../../src/configure/zero-config.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAE,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;CACvB,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAmB,EAAE,CAAA;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAkB,EAAE,CAAA;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAO,EAAE,CAAA;AACjC,MAAM,CAAC,MAAM,UAAU,GAAgB,KAAK,CAAA;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAE,CAAC;KACvB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,mBAAmB;QAC7B,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,EAAE;KACZ;IACD,QAAQ,EAAE,oBAAoB;IAC9B,KAAK,EAAE,UAAU;CAClB,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,oBAAoB;CAC/B,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;IAC5C,OAAO,EAAE,EAAE;CACZ,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAe,EAAE,CAAA;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAgB,EAAE,CAAA;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAkB,EAAE,CAAA;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,OAAO,EAAE,YAAY;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,UAAU;CAClB,CAAA","sourcesContent":["import {\n ColumnConfig,\n FieldRenderer,\n GristClassifier,\n GristConfig,\n GristData,\n GristEventHandlerSet,\n GristRecord,\n GroupConfig,\n LabelConfig,\n ListConfig,\n TreeConfig,\n RowsConfig\n} from '../types'\n\nexport const ZERO_CLASSIFIER: GristClassifier = (record, rowIndex) => {}\nexport const ZERO_FIELD_RENDERER: FieldRenderer = (value, column, record, rowIndex, owner) => {}\n\nexport const ZERO_EVENTHANDLERSET: GristEventHandlerSet = {\n click: undefined,\n dblclick: undefined,\n focus: undefined,\n contextmenu: undefined\n}\nexport const ZERO_COLUMNS: ColumnConfig[] = []\nexport const ZERO_GROUPS: GroupConfig[] = []\nexport const ZERO_TOTALS: [] = []\nexport const ZERO_LABEL: LabelConfig = false\n\nexport const ZERO_COLUMN: ColumnConfig = {\n type: '',\n name: '',\n header: {\n renderer: column => {}\n },\n record: {\n renderer: ZERO_FIELD_RENDERER,\n classifier: ZERO_CLASSIFIER,\n options: {}\n },\n handlers: ZERO_EVENTHANDLERSET,\n label: ZERO_LABEL\n}\n\nexport const ZERO_ROWS: RowsConfig = {\n appendable: false,\n insertable: false,\n groups: ZERO_GROUPS,\n totals: ZERO_TOTALS,\n classifier: ZERO_CLASSIFIER,\n handlers: ZERO_EVENTHANDLERSET\n}\n\nexport const ZERO_LIST: ListConfig = {\n fields: ['name', 'description', 'updatedAt'],\n details: []\n}\n\nexport const ZERO_TREE: TreeConfig = {}\n\nexport const ZERO_CONFIG: GristConfig = {\n columns: ZERO_COLUMNS,\n rows: ZERO_ROWS,\n list: ZERO_LIST,\n tree: ZERO_TREE\n}\n\nexport const ZERO_RECORD: GristRecord = {}\nexport const ZERO_RECORDS: GristRecord[] = []\n\nexport const ZERO_DATA: GristData = {\n records: ZERO_RECORDS\n}\n\nexport const ZERO_PAGES = [20, 30, 50, 100]\n\nexport const ZERO_PAGINATION = {\n page: 1,\n limit: 20,\n total: 0,\n pages: ZERO_PAGES\n}\n"]}
@@ -15,7 +15,7 @@ let DataCardField = class DataCardField extends LitElement {
15
15
  var { label, record: { renderer: recordRenderer } } = column;
16
16
  if (typeof label == 'object') {
17
17
  let { renderer: labelRenderer } = label;
18
- return html `<label>${labelRenderer()}</label>${recordRenderer(value, column, record, rowIndex, this)}`;
18
+ return html `<label>${labelRenderer(column)}</label>${recordRenderer(value, column, record, rowIndex, this)}`;
19
19
  }
20
20
  else {
21
21
  return html `${recordRenderer(value, column, record, rowIndex, this)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"data-card-field.js","sourceRoot":"","sources":["../../../src/data-card/data-card-field.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAI5D,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAmEuB,WAAM,GAAgB,WAAW,CAAA;QACjC,WAAM,GAAiB,WAAW,CAAA;QAClC,aAAQ,GAAW,CAAC,CAAC,CAAA;IAkBnD,CAAC;IAfC,MAAM;QACJ,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAE9C,IAAI,EACF,KAAK,EACL,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACrC,GAAG,MAAM,CAAA;QAEV,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;YACvC,OAAO,IAAI,CAAA,UAAU,aAAa,EAAE,WAAW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;QACxG,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;QACvE,CAAC;IACH,CAAC;;AArFM,oBAAM,GAAG;IACd,aAAa;IACb,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4DF;CACF,AA/DY,CA+DZ;AAE8B;IAA9B,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;4CAAe;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAmC;AAClC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAsB;AACrB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAe;AAtE/B,aAAa;IADzB,aAAa,CAAC,eAAe,CAAC;GAClB,aAAa,CAuFzB","sourcesContent":["import { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { TooltipStyles } from '@operato/styles'\n\nimport { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'\nimport { ColumnConfig, GristRecord } from '../types'\n\n@customElement('ox-card-field')\nexport class DataCardField extends LitElement {\n static styles = [\n TooltipStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n position: relative;\n\n white-space: nowrap;\n\n font: inherit;\n }\n\n :host([thumbnail]) {\n flex-direction: column;\n justify-content: center;\n }\n\n :host([thumbnail]) > * {\n object-fit: contain;\n max-width: 100%;\n max-height: 100%;\n }\n\n :host > * {\n margin: 0;\n\n overflow: hidden;\n\n text-overflow: ellipsis;\n text-align: left;\n }\n\n :host > *[center] {\n flex: none;\n margin: 0 auto;\n }\n\n :host([name]) label {\n display: none;\n }\n\n label {\n flex: none;\n width: 33%;\n padding-bottom: 2px;\n font: var(--data-card-item-etc-label-font);\n text-transform: capitalize;\n }\n\n :host([name]) > span,\n label + a {\n display: block;\n min-width: 100%;\n }\n\n @media only screen and (max-width: 460px) {\n *[center] {\n margin: initial;\n }\n }\n `\n ]\n\n @property({ attribute: true }) align?: string\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Number }) rowIndex: number = -1\n @property({ type: Object }) value?: object\n\n render(): TemplateResult {\n var { value, column, record, rowIndex } = this\n\n var {\n label,\n record: { renderer: recordRenderer }\n } = column\n\n if (typeof label == 'object') {\n let { renderer: labelRenderer } = label\n return html`<label>${labelRenderer()}</label>${recordRenderer(value, column, record, rowIndex, this)}`\n } else {\n return html`${recordRenderer(value, column, record, rowIndex, this)}`\n }\n }\n}\n"]}
1
+ {"version":3,"file":"data-card-field.js","sourceRoot":"","sources":["../../../src/data-card/data-card-field.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAI5D,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAmEuB,WAAM,GAAgB,WAAW,CAAA;QACjC,WAAM,GAAiB,WAAW,CAAA;QAClC,aAAQ,GAAW,CAAC,CAAC,CAAA;IAkBnD,CAAC;IAfC,MAAM;QACJ,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAE9C,IAAI,EACF,KAAK,EACL,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACrC,GAAG,MAAM,CAAA;QAEV,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;YACvC,OAAO,IAAI,CAAA,UAAU,aAAa,CAAC,MAAM,CAAC,WAAW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;QAC9G,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;QACvE,CAAC;IACH,CAAC;;AArFM,oBAAM,GAAG;IACd,aAAa;IACb,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4DF;CACF,AA/DY,CA+DZ;AAE8B;IAA9B,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;4CAAe;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAkC;AACjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAmC;AAClC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAsB;AACrB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAe;AAtE/B,aAAa;IADzB,aAAa,CAAC,eAAe,CAAC;GAClB,aAAa,CAuFzB","sourcesContent":["import { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { TooltipStyles } from '@operato/styles'\n\nimport { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'\nimport { ColumnConfig, GristRecord } from '../types'\n\n@customElement('ox-card-field')\nexport class DataCardField extends LitElement {\n static styles = [\n TooltipStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n position: relative;\n\n white-space: nowrap;\n\n font: inherit;\n }\n\n :host([thumbnail]) {\n flex-direction: column;\n justify-content: center;\n }\n\n :host([thumbnail]) > * {\n object-fit: contain;\n max-width: 100%;\n max-height: 100%;\n }\n\n :host > * {\n margin: 0;\n\n overflow: hidden;\n\n text-overflow: ellipsis;\n text-align: left;\n }\n\n :host > *[center] {\n flex: none;\n margin: 0 auto;\n }\n\n :host([name]) label {\n display: none;\n }\n\n label {\n flex: none;\n width: 33%;\n padding-bottom: 2px;\n font: var(--data-card-item-etc-label-font);\n text-transform: capitalize;\n }\n\n :host([name]) > span,\n label + a {\n display: block;\n min-width: 100%;\n }\n\n @media only screen and (max-width: 460px) {\n *[center] {\n margin: initial;\n }\n }\n `\n ]\n\n @property({ attribute: true }) align?: string\n @property({ type: Object }) record: GristRecord = ZERO_RECORD\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Number }) rowIndex: number = -1\n @property({ type: Object }) value?: object\n\n render(): TemplateResult {\n var { value, column, record, rowIndex } = this\n\n var {\n label,\n record: { renderer: recordRenderer }\n } = column\n\n if (typeof label == 'object') {\n let { renderer: labelRenderer } = label\n return html`<label>${labelRenderer(column)}</label>${recordRenderer(value, column, record, rowIndex, this)}`\n } else {\n return html`${recordRenderer(value, column, record, rowIndex, this)}`\n }\n }\n}\n"]}
@@ -10,6 +10,7 @@ export declare class DataGridAccumField extends LitElement {
10
10
  editing: boolean;
11
11
  value: {};
12
12
  emphasized: any;
13
+ fixed?: string;
13
14
  render(): TemplateResult;
14
15
  updated(changes: PropertyValues<this>): void;
15
16
  }
@@ -44,6 +44,11 @@ let DataGridAccumField = class DataGridAccumField extends LitElement {
44
44
  this.style.setProperty('--data-grid-field-text-align', align);
45
45
  }
46
46
  }
47
+ if (changes.has('fixed')) {
48
+ if (this.fixed) {
49
+ this.style.left = this.fixed + 'px';
50
+ }
51
+ }
47
52
  }
48
53
  };
49
54
  DataGridAccumField.styles = [
@@ -108,6 +113,9 @@ __decorate([
108
113
  __decorate([
109
114
  property({ attribute: false })
110
115
  ], DataGridAccumField.prototype, "emphasized", void 0);
116
+ __decorate([
117
+ property({ type: String })
118
+ ], DataGridAccumField.prototype, "fixed", void 0);
111
119
  DataGridAccumField = __decorate([
112
120
  customElement('ox-grid-accum-field')
113
121
  ], DataGridAccumField);
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-accum-field.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-accum-field.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { TooltipStyles } from '@operato/styles'\n\nimport { ZERO_COLUMN } from '../configure/zero-config'\nimport { AccumulatorObject, ColumnConfig, GristRecord } from '../types'\nimport { i18next } from '@operato/i18n'\n\nconst DEFAULT_TEXT_ALIGN = 'left'\n\n@customElement('ox-grid-accum-field')\nexport class DataGridAccumField extends LitElement {\n static styles = [\n TooltipStyles,\n css`\n :host {\n display: flex;\n\n align-items: center;\n justify-content: var(--data-grid-field-justify-content, flex-start);\n position: relative;\n\n white-space: nowrap;\n background-color: var(--grid-accum-record-background-color, #ccc);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-bottom: var(--grid-record-border-bottom);\n\n font-size: var(--grid-record-wide-fontsize);\n min-height: 19px;\n }\n\n span,\n pre {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n * {\n margin: 0;\n text-align: var(--data-grid-field-text-align);\n }\n\n *[center] {\n flex: none;\n margin: 0 auto;\n }\n `\n ]\n\n @property({ type: String, attribute: true }) align = DEFAULT_TEXT_ALIGN\n @property({ type: Object }) record: GristRecord = {}\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Number }) rowIndex = -1\n @property({ type: Number }) columnIndex = 0\n @property({ type: Boolean }) editing = false\n @property({ type: Object }) value = {}\n @property({ attribute: false }) emphasized: any = false\n\n render(): TemplateResult {\n if (!this.column || !this.column.accumulator) {\n return this.columnIndex == 0 ? html`<mwc-icon>functions</mwc-icon>` : html`${nothing}`\n }\n\n var { value, column, record, rowIndex } = this\n var { renderer } = column.record\n\n // tag가 true이면 value 앞에 (sum) 같은 태그 생성\n var { accumulator } = column\n if (typeof accumulator === 'object' && typeof accumulator.type === 'string' && accumulator?.tag) {\n value = `(${i18next.t(`label.accumulator_${accumulator.type}`)}) ${value}`\n }\n\n return html`${renderer?.call(this, value, column, record, rowIndex, this)}`\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('column')) {\n var align = this.column.record.align || DEFAULT_TEXT_ALIGN\n if (align != DEFAULT_TEXT_ALIGN) {\n let justify = 'center'\n switch (align) {\n case 'right':\n justify = 'flex-end'\n break\n }\n this.style.setProperty('--data-grid-field-justify-content', justify)\n this.style.setProperty('--data-grid-field-text-align', align)\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"data-grid-accum-field.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-accum-field.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { TooltipStyles } from '@operato/styles'\n\nimport { ZERO_COLUMN } from '../configure/zero-config'\nimport { AccumulatorObject, ColumnConfig, GristRecord } from '../types'\nimport { i18next } from '@operato/i18n'\n\nconst DEFAULT_TEXT_ALIGN = 'left'\n\n@customElement('ox-grid-accum-field')\nexport class DataGridAccumField extends LitElement {\n static styles = [\n TooltipStyles,\n css`\n :host {\n display: flex;\n\n align-items: center;\n justify-content: var(--data-grid-field-justify-content, flex-start);\n position: relative;\n\n white-space: nowrap;\n background-color: var(--grid-accum-record-background-color, #ccc);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-bottom: var(--grid-record-border-bottom);\n\n font-size: var(--grid-record-wide-fontsize);\n min-height: 19px;\n }\n\n span,\n pre {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n * {\n margin: 0;\n text-align: var(--data-grid-field-text-align);\n }\n\n *[center] {\n flex: none;\n margin: 0 auto;\n }\n `\n ]\n\n @property({ type: String, attribute: true }) align = DEFAULT_TEXT_ALIGN\n @property({ type: Object }) record: GristRecord = {}\n @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN\n @property({ type: Number }) rowIndex = -1\n @property({ type: Number }) columnIndex = 0\n @property({ type: Boolean }) editing = false\n @property({ type: Object }) value = {}\n @property({ attribute: false }) emphasized: any = false\n @property({ type: String }) fixed?: string\n\n render(): TemplateResult {\n if (!this.column || !this.column.accumulator) {\n return this.columnIndex == 0 ? html`<mwc-icon>functions</mwc-icon>` : html`${nothing}`\n }\n\n var { value, column, record, rowIndex } = this\n var { renderer } = column.record\n\n // tag가 true이면 value 앞에 (sum) 같은 태그 생성\n var { accumulator } = column\n if (typeof accumulator === 'object' && typeof accumulator.type === 'string' && accumulator?.tag) {\n value = `(${i18next.t(`label.accumulator_${accumulator.type}`)}) ${value}`\n }\n\n return html`${renderer?.call(this, value, column, record, rowIndex, this)}`\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('column')) {\n var align = this.column.record.align || DEFAULT_TEXT_ALIGN\n if (align != DEFAULT_TEXT_ALIGN) {\n let justify = 'center'\n switch (align) {\n case 'right':\n justify = 'flex-end'\n break\n }\n this.style.setProperty('--data-grid-field-justify-content', justify)\n this.style.setProperty('--data-grid-field-text-align', align)\n }\n }\n\n if (changes.has('fixed')) {\n if (this.fixed) {\n this.style.left = this.fixed + 'px'\n }\n }\n }\n}\n"]}
@@ -13,6 +13,7 @@ import { dataGridBodyStyle } from './data-grid-body-style';
13
13
  import { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler';
14
14
  import { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler';
15
15
  import { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler';
16
+ import { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler';
16
17
  import { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler';
17
18
  import { accumulate } from '../accumulator/accumulator';
18
19
  const THRESHOLD = 300;
@@ -73,7 +74,6 @@ let DataGridBody = class DataGridBody extends LitElement {
73
74
  var columns = this.columns.filter(column => !column.hidden);
74
75
  var data = this.data;
75
76
  var { records } = data;
76
- records = records.filter(record => !record.__parent__ || !record.__parent__.collapsed);
77
77
  var { appendable, classifier, accumulator } = this.config.rows;
78
78
  const { start, end } = this._selectBlock || {};
79
79
  /*
@@ -139,6 +139,7 @@ let DataGridBody = class DataGridBody extends LitElement {
139
139
  .column=${column}
140
140
  .record=${accumRecord}
141
141
  .value=${accumRecord[column.name]}
142
+ fixed=${ifDefined(this.fixedLefts[idxColumn])}
142
143
  ></ox-grid-accum-field>
143
144
  `)}
144
145
  <ox-grid-accum-field
@@ -182,6 +183,21 @@ let DataGridBody = class DataGridBody extends LitElement {
182
183
  const end = this.getFieldByIndex(endRow, endColumn);
183
184
  this.setSelectBlock(start, end);
184
185
  });
186
+ this.renderRoot.addEventListener('contextmenu', (event) => {
187
+ const e = event;
188
+ this.setSelectBlock();
189
+ this._draggable = false;
190
+ var target = e.target.closest('ox-grid-field');
191
+ var { rowIndex, columnIndex } = target || {};
192
+ this.dispatchEvent(new CustomEvent('focus-change', {
193
+ bubbles: true,
194
+ composed: true,
195
+ detail: {
196
+ row: rowIndex,
197
+ column: columnIndex
198
+ }
199
+ }));
200
+ });
185
201
  this.renderRoot.addEventListener('mousedown', (event) => {
186
202
  const e = event;
187
203
  this.setSelectBlock();
@@ -199,7 +215,7 @@ let DataGridBody = class DataGridBody extends LitElement {
199
215
  column: columnIndex
200
216
  }
201
217
  }));
202
- if (!isNaN(rowIndex) && !isNaN(columnIndex)) {
218
+ if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {
203
219
  this.startEditTarget(rowIndex, columnIndex);
204
220
  }
205
221
  });
@@ -224,6 +240,7 @@ let DataGridBody = class DataGridBody extends LitElement {
224
240
  });
225
241
  this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this));
226
242
  this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this));
243
+ this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this));
227
244
  this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this));
228
245
  this.addEventListener('wheel', this._onWheelEvent.bind(this));
229
246
  const primaryColor = getComputedStyle(this).getPropertyValue('--primary-color');
@@ -570,7 +587,7 @@ DataGridBody.styles = [
570
587
  [fixed] {
571
588
  position: sticky;
572
589
  background-color: var(--grid-record-background-color);
573
- z-index: 1; /* 고정된 열을 다른 열 위에 표시. */
590
+ z-index: 2; /* 고정된 열을 다른 열 위에 표시. */
574
591
  }
575
592
 
576
593
  :host([raised]) [fixed] {
@@ -583,6 +600,10 @@ DataGridBody.styles = [
583
600
  bottom: 0;
584
601
  z-index: 1;
585
602
  }
603
+
604
+ ox-grid-accum-field[fixed] {
605
+ background-color: var(--grid-accum-record-background-color, #ccc);
606
+ }
586
607
  `
587
608
  ];
588
609
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field'\nimport './data-grid-accum-field'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce'\n\nimport { TooltipStyles } from '@operato/styles'\nimport { sleep, parseToNumberOrNull } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { RecordViewHandler } from '../record-view/record-view-handler'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types'\nimport { supportsPassive } from '../utils'\nimport { dataGridBodyStyle } from './data-grid-body-style'\nimport { DataGridField } from './data-grid-field'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler'\nimport { accumulate } from '../accumulator/accumulator'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n TooltipStyles,\n dataGridBodyStyle,\n css`\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-record-focused-cell-border);\n background-image: var(--focused-background-image);\n pointer-events: none;\n z-index: 2;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 1; /* 고정된 열을 다른 열 위에 표시. */\n }\n\n :host([raised]) [fixed] {\n /* 고정 컬럼이 살짝 올라와 있는 느낌을 표현 */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number; valueWithEdit: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block이 선택되어 있으면, focused row/column은 표현하지 않는다.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWithEdit = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n records = records.filter(record => !record.__parent__ || !record.__parent__.collapsed)\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWithEdit=${valueWithEdit}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('mousedown', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n if (e.buttons !== 1) {\n return\n }\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (!isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('mousemove', (event: Event) => {\n const e = event as MouseEvent\n if (e.buttons !== 1 || !this._draggable) {\n return\n }\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('mouseup', (event: Event) => {\n this._draggable = false\n })\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n this.addEventListener('wheel', this._onWheelEvent.bind(this))\n\n const primaryColor = getComputedStyle(this).getPropertyValue('--primary-color')\n this.style.setProperty(\n '--focused-background-image',\n `url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' x='0' y='0' width='100%' height='100%' style='opacity:.3'/></svg>\")`\n )\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n this.addEventListener('scroll', function () {\n this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')\n })\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\n }\n\n _onWheelEvent(e: WheelEvent) {\n if (this.scrollHeight <= this.clientHeight) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.scrollLeft = Math.max(0, this.scrollLeft - delta * 40)\n\n var maxScrollLeft = this.scrollWidth - this.clientWidth\n\n var atStart = this.scrollLeft === 0\n var atEnd = this.scrollLeft === maxScrollLeft\n\n // 스크롤이 맨 앞으로 와 있는 상태에서 휠을 올리는 경우 또는\n // 스크롤이 맨 끝으로 가 있는 상태에서 휠을 내리는 경우에만 디폴트 동작 허용\n if ((atStart && delta > 0) || (atEnd && delta < 0)) {\n return true\n }\n\n e.preventDefault()\n }\n }\n\n startEditTarget(row: number, column: number, valueWithEdit: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n this.editTarget = {\n row,\n column,\n valueWithEdit\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n super.focus()\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n getSelectedBlockValues(): Array<Array<any>> | any | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n return (\n '<table>' +\n new Array(endRowIndex - startRowIndex + 1)\n .fill(startRowIndex)\n .map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const tds = columnArray\n .map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n const text =\n value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : value\n\n return `<td type=${type}>${text}</td>`\n })\n .join('')\n return `<tr>${tds}</tr>`\n })\n .join('') +\n '</table>'\n )\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied], { type: 'text/html' }),\n 'text/plain': new Blob([copied], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n const { row, column } = this.focused\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // 포커스가 빠지기 전에 isWorking으로 focusout 이벤트에 대한 값 변경을 막음\n this.focusedField!.isWorking = true\n await this.updateComplete\n this.focusedField!.isWorking = false\n }\n const rows = table.querySelectorAll('tr')\n\n rows.forEach((record, rowIndex) => {\n if (!(record instanceof HTMLTableRowElement)) {\n return\n }\n\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = record.querySelectorAll('td')\n cells.forEach((item, columnIndex) => {\n const targetColumn = columns[column + columnIndex]\n var value = item.textContent as any\n let type = targetColumn.type || item.getAttribute('type') || 'string'\n type = type.includes('object') ? 'object' : type // 오브젝트 타입 예외처리\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n switch (type) {\n case 'object':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {}\n break\n case 'boolean':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n value = parseToNumberOrNull(value)\n break\n default:\n value = value\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n })\n })\n\n return\n } else if (!selection && type === 'text/plain') {\n const targetRecord = records[row] || { __dirty__: '+' }\n const targetColumn = columns[column]\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, content, targetColumn, targetRecord, row, this)\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: content,\n column: targetColumn,\n record: targetRecord,\n row: row\n }\n })\n )\n }\n }\n } catch (e) {}\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n}\n"]}
1
+ {"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field'\nimport './data-grid-accum-field'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce'\n\nimport { TooltipStyles } from '@operato/styles'\nimport { sleep, parseToNumberOrNull } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { RecordViewHandler } from '../record-view/record-view-handler'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types'\nimport { supportsPassive } from '../utils'\nimport { dataGridBodyStyle } from './data-grid-body-style'\nimport { DataGridField } from './data-grid-field'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler'\nimport { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler'\nimport { accumulate } from '../accumulator/accumulator'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n TooltipStyles,\n dataGridBodyStyle,\n css`\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-record-focused-cell-border);\n background-image: var(--focused-background-image);\n pointer-events: none;\n z-index: 2;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 2; /* 고정된 열을 다른 열 위에 표시. */\n }\n\n :host([raised]) [fixed] {\n /* 고정 컬럼이 살짝 올라와 있는 느낌을 표현 */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n\n ox-grid-accum-field[fixed] {\n background-color: var(--grid-accum-record-background-color, #ccc);\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number; valueWithEdit: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block이 선택되어 있으면, focused row/column은 표현하지 않는다.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWithEdit = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWithEdit=${valueWithEdit}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('contextmenu', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n this._draggable = false\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n })\n\n this.renderRoot.addEventListener('mousedown', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n if (e.buttons !== 1) {\n return\n }\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('mousemove', (event: Event) => {\n const e = event as MouseEvent\n if (e.buttons !== 1 || !this._draggable) {\n return\n }\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('mouseup', (event: Event) => {\n this._draggable = false\n })\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n this.addEventListener('wheel', this._onWheelEvent.bind(this))\n\n const primaryColor = getComputedStyle(this).getPropertyValue('--primary-color')\n this.style.setProperty(\n '--focused-background-image',\n `url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' x='0' y='0' width='100%' height='100%' style='opacity:.3'/></svg>\")`\n )\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n this.addEventListener('scroll', function () {\n this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')\n })\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\n }\n\n _onWheelEvent(e: WheelEvent) {\n if (this.scrollHeight <= this.clientHeight) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.scrollLeft = Math.max(0, this.scrollLeft - delta * 40)\n\n var maxScrollLeft = this.scrollWidth - this.clientWidth\n\n var atStart = this.scrollLeft === 0\n var atEnd = this.scrollLeft === maxScrollLeft\n\n // 스크롤이 맨 앞으로 와 있는 상태에서 휠을 올리는 경우 또는\n // 스크롤이 맨 끝으로 가 있는 상태에서 휠을 내리는 경우에만 디폴트 동작 허용\n if ((atStart && delta > 0) || (atEnd && delta < 0)) {\n return true\n }\n\n e.preventDefault()\n }\n }\n\n startEditTarget(row: number, column: number, valueWithEdit: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n this.editTarget = {\n row,\n column,\n valueWithEdit\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n super.focus()\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n getSelectedBlockValues(): Array<Array<any>> | any | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n return (\n '<table>' +\n new Array(endRowIndex - startRowIndex + 1)\n .fill(startRowIndex)\n .map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const tds = columnArray\n .map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n const text =\n value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : value\n\n return `<td type=${type}>${text}</td>`\n })\n .join('')\n return `<tr>${tds}</tr>`\n })\n .join('') +\n '</table>'\n )\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied], { type: 'text/html' }),\n 'text/plain': new Blob([copied], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n const { row, column } = this.focused\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // 포커스가 빠지기 전에 isWorking으로 focusout 이벤트에 대한 값 변경을 막음\n this.focusedField!.isWorking = true\n await this.updateComplete\n this.focusedField!.isWorking = false\n }\n const rows = table.querySelectorAll('tr')\n\n rows.forEach((record, rowIndex) => {\n if (!(record instanceof HTMLTableRowElement)) {\n return\n }\n\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = record.querySelectorAll('td')\n cells.forEach((item, columnIndex) => {\n const targetColumn = columns[column + columnIndex]\n var value = item.textContent as any\n let type = targetColumn.type || item.getAttribute('type') || 'string'\n type = type.includes('object') ? 'object' : type // 오브젝트 타입 예외처리\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n switch (type) {\n case 'object':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {}\n break\n case 'boolean':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n value = parseToNumberOrNull(value)\n break\n default:\n value = value\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n })\n })\n\n return\n } else if (!selection && type === 'text/plain') {\n const targetRecord = records[row] || { __dirty__: '+' }\n const targetColumn = columns[column]\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, content, targetColumn, targetRecord, row, this)\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: content,\n column: targetColumn,\n record: targetRecord,\n row: row\n }\n })\n )\n }\n }\n } catch (e) {}\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n}\n"]}
@@ -20,4 +20,5 @@ export declare class DataGridField extends LitElement {
20
20
  private _onKeydownInEditingMode;
21
21
  render(): TemplateResult;
22
22
  updated(changes: PropertyValues<this>): void;
23
+ get editableOnClick(): unknown;
23
24
  }
@@ -86,6 +86,11 @@ let DataGridField = class DataGridField extends LitElement {
86
86
  this.removeAttribute('emphasized-row');
87
87
  }
88
88
  }
89
+ get editableOnClick() {
90
+ const renderer = this.renderRoot.firstElementChild;
91
+ //@ts-ignore
92
+ return renderer && 'editableOnClick' in renderer ? renderer.editableOnClick : true;
93
+ }
89
94
  };
90
95
  DataGridField.styles = [
91
96
  TooltipStyles,