@stonecrop/atable 0.2.52 → 0.2.53

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.
@@ -26,7 +26,7 @@ export default class TableDataStore {
26
26
  return table;
27
27
  }
28
28
  createDisplayObject(display) {
29
- const defaultDisplay = [Object.assign({}, { modified: false })];
29
+ const defaultDisplay = [Object.assign({}, { rowModified: false })];
30
30
  // TODO: (typing) what is the type of `display` here?
31
31
  if (display) {
32
32
  if ('0:0' in display) {
@@ -50,7 +50,7 @@ export default class TableDataStore {
50
50
  indent: row.indent || null,
51
51
  isParent: parents.has(rowIndex),
52
52
  isRoot: row.parent === null || row.parent === undefined,
53
- modified: false,
53
+ rowModified: false,
54
54
  open: row.parent === null || row.parent === undefined,
55
55
  parent: row.parent,
56
56
  };
@@ -69,13 +69,14 @@ export default class TableDataStore {
69
69
  return this.table[`${colIndex}:${rowIndex}`];
70
70
  }
71
71
  setCellData(rowIndex, colIndex, value) {
72
- if (this.table[`${colIndex}:${rowIndex}`] !== value) {
73
- this.display[rowIndex].modified = true;
74
- }
75
- this.table[`${colIndex}:${rowIndex}`] = value;
72
+ const index = `${colIndex}:${rowIndex}`;
76
73
  const col = this.columns[colIndex];
74
+ if (this.table[index] !== value) {
75
+ this.display[rowIndex].rowModified = true;
76
+ }
77
+ this.table[index] = value;
77
78
  this.rows[rowIndex][col.name] = value;
78
- return this.table[`${colIndex}:${rowIndex}`];
79
+ return this.table[index];
79
80
  }
80
81
  toggleRowExpand(rowIndex) {
81
82
  if (this.config.view === 'tree') {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE3F,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;gBAGhB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,EAAE,EACvB,IAAI,CAAC,EAAE,QAAQ,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAC9B,OAAO,CAAC,EAAE,YAAY,EAAE;IAWzB,iBAAiB;IAUjB,mBAAmB,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE;IAqC5C,IAAI,UAAU,YAEb;IAED,IAAI,gBAAgB,sCAInB;IAED,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAIlD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAU1D,eAAe,CAAC,QAAQ,EAAE,MAAM;CAehC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE3F,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;gBAGhB,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,EAAE,EACvB,IAAI,CAAC,EAAE,QAAQ,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAC9B,OAAO,CAAC,EAAE,YAAY,EAAE;IAWzB,iBAAiB;IAUjB,mBAAmB,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE;IAqC5C,IAAI,UAAU,YAEb;IAED,IAAI,gBAAgB,sCAInB;IAED,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAIlD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAa1D,eAAe,CAAC,QAAQ,EAAE,MAAM;CAehC"}
@@ -29,9 +29,9 @@ export type TableDisplay = {
29
29
  indent?: number;
30
30
  isParent?: boolean;
31
31
  isRoot?: boolean;
32
- modified?: boolean;
33
32
  open?: boolean;
34
33
  parent?: number;
34
+ rowModified?: boolean;
35
35
  };
36
36
  export type TableRow = {
37
37
  [key: string]: any;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,cAAc,CAAA;AAEzC,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAA;IAC7D,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE9C,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAA;IACjE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,QAAQ,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAA;IACzC,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACpC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,cAAc,CAAA;AAEzC,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAA;IAC7D,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE9C,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAA;IACjE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,QAAQ,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAA;IACzC,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACpC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stonecrop/atable",
3
- "version": "0.2.52",
3
+ "version": "0.2.53",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": {
@@ -37,8 +37,8 @@
37
37
  "@vueuse/components": "^10.11.0",
38
38
  "@vueuse/core": "^11.1.0",
39
39
  "vue": "^3.5.6",
40
- "@stonecrop/utilities": "0.2.52",
41
- "@stonecrop/themes": "0.2.52"
40
+ "@stonecrop/themes": "0.2.53",
41
+ "@stonecrop/utilities": "0.2.53"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@microsoft/api-documenter": "^7.25.3",
@@ -9,11 +9,11 @@
9
9
  :spellcheck="false"
10
10
  :style="cellStyle"
11
11
  @focus="onFocus"
12
- @paste="onChange"
13
- @blur="onChange"
14
- @input="onChange"
15
- @click="handleInput"
16
- @mousedown="handleInput"
12
+ @paste="updateCellData"
13
+ @blur="updateCellData"
14
+ @input="updateCellData"
15
+ @click="showModal"
16
+ @mousedown="showModal"
17
17
  class="atable__cell"
18
18
  :class="pinned ? 'sticky-column' : ''">
19
19
  <component
@@ -52,20 +52,33 @@ const {
52
52
 
53
53
  const tableData = inject<TableDataStore>(tableid)
54
54
  const cellRef = useTemplateRef<HTMLTableCellElement>('cell')
55
+ const { bottom, left } = useElementBounding(cellRef)
56
+
57
+ // keep a shallow copy of the original cell value for comparison
58
+ const originalData = tableData.cellData<any>(colIndex, rowIndex)
55
59
  const currentData = ref('')
56
60
  const cellModified = ref(false)
57
- const { bottom, left } = useElementBounding(cellRef)
58
61
 
59
62
  const table = tableData.table
60
63
  const column = tableData.columns[colIndex]
61
64
  const row = tableData.rows[rowIndex]
62
65
 
63
- const textAlign = computed(() => {
64
- return column.align || 'center'
66
+ const textAlign = column.align || 'center'
67
+ const cellWidth = column.width || '40ch'
68
+
69
+ const isHtmlValue = computed(() => {
70
+ // TODO: check if display value is a native DOM element
71
+ return typeof displayValue.value === 'string' ? isHtmlString(displayValue.value) : false
65
72
  })
66
73
 
67
- const cellWidth = computed(() => {
68
- return column.width || '40ch'
74
+ const cellStyle = computed((): CSSProperties => {
75
+ return {
76
+ textAlign,
77
+ width: cellWidth,
78
+ backgroundColor: !cellModified.value ? 'inherit' : 'var(--cell-modified-color)',
79
+ fontWeight: !cellModified.value ? 'inherit' : 'bold',
80
+ paddingLeft: getIndent(colIndex, tableData.display[rowIndex]?.indent),
81
+ }
69
82
  })
70
83
 
71
84
  const displayValue = computed(() => {
@@ -88,12 +101,7 @@ const displayValue = computed(() => {
88
101
  return cellData
89
102
  })
90
103
 
91
- const isHtmlValue = computed(() => {
92
- // TODO: check if display value is a native DOM element
93
- return typeof displayValue.value === 'string' ? isHtmlString(displayValue.value) : false
94
- })
95
-
96
- const handleInput = () => {
104
+ const showModal = () => {
97
105
  if (column.mask) {
98
106
  // TODO: add masking to cell values
99
107
  // column.mask(event)
@@ -106,7 +114,7 @@ const handleInput = () => {
106
114
  tableData.modal.parent = cellRef.value
107
115
  tableData.modal.top = bottom.value
108
116
  tableData.modal.left = left.value
109
- tableData.modal.width = cellWidth.value
117
+ tableData.modal.width = cellWidth
110
118
 
111
119
  if (typeof column.modalComponent === 'function') {
112
120
  tableData.modal.component = column.modalComponent({ table, row, column })
@@ -122,11 +130,11 @@ if (addNavigation) {
122
130
  let handlers = {
123
131
  ...defaultKeypressHandlers,
124
132
  ...{
125
- 'keydown.f2': handleInput,
126
- 'keydown.alt.up': handleInput,
127
- 'keydown.alt.down': handleInput,
128
- 'keydown.alt.left': handleInput,
129
- 'keydown.alt.right': handleInput,
133
+ 'keydown.f2': showModal,
134
+ 'keydown.alt.up': showModal,
135
+ 'keydown.alt.down': showModal,
136
+ 'keydown.alt.left': showModal,
137
+ 'keydown.alt.right': showModal,
130
138
  },
131
139
  }
132
140
 
@@ -161,12 +169,14 @@ const onFocus = () => {
161
169
  }
162
170
  }
163
171
 
164
- const onChange = () => {
172
+ const updateCellData = () => {
165
173
  if (cellRef.value) {
174
+ // only apply changes if the cell value has changed after being mounted
175
+ cellModified.value = cellRef.value.textContent !== originalData
176
+
166
177
  if (cellRef.value.textContent !== currentData.value) {
167
178
  currentData.value = cellRef.value.textContent
168
179
  cellRef.value.dispatchEvent(new Event('change'))
169
- cellModified.value = true // set display instead
170
180
  if (!column.format) {
171
181
  // TODO: need to setup reverse format function
172
182
  tableData.setCellData(rowIndex, colIndex, currentData.value)
@@ -175,21 +185,13 @@ const onChange = () => {
175
185
  }
176
186
  }
177
187
 
178
- const getIndent = (colKey: number, indent: number) => {
179
- if (indent && colKey === 0 && indent > 0) {
180
- return `${indent}ch`
188
+ const getIndent = (colIndex: number, indentLevel?: number) => {
189
+ if (indentLevel && colIndex === 0 && indentLevel > 0) {
190
+ return `${indentLevel}ch`
181
191
  } else {
182
192
  return 'inherit'
183
193
  }
184
194
  }
185
-
186
- const cellStyle: CSSProperties = {
187
- textAlign: textAlign.value,
188
- width: cellWidth.value,
189
- backgroundColor: !cellModified.value ? 'inherit' : 'var(--cell-modified-color)',
190
- fontWeight: !cellModified.value ? 'inherit' : 'bold',
191
- paddingLeft: getIndent(colIndex, tableData.display[rowIndex]?.indent),
192
- }
193
195
  </script>
194
196
 
195
197
  <style>
@@ -39,7 +39,7 @@ export default class TableDataStore {
39
39
  }
40
40
 
41
41
  createDisplayObject(display?: TableDisplay[]) {
42
- const defaultDisplay: TableDisplay[] = [Object.assign({}, { modified: false })]
42
+ const defaultDisplay: TableDisplay[] = [Object.assign({}, { rowModified: false })]
43
43
 
44
44
  // TODO: (typing) what is the type of `display` here?
45
45
  if (display) {
@@ -66,7 +66,7 @@ export default class TableDataStore {
66
66
  indent: row.indent || null,
67
67
  isParent: parents.has(rowIndex),
68
68
  isRoot: row.parent === null || row.parent === undefined,
69
- modified: false,
69
+ rowModified: false,
70
70
  open: row.parent === null || row.parent === undefined,
71
71
  parent: row.parent,
72
72
  }
@@ -90,13 +90,16 @@ export default class TableDataStore {
90
90
  }
91
91
 
92
92
  setCellData(rowIndex: number, colIndex: number, value: any) {
93
- if (this.table[`${colIndex}:${rowIndex}`] !== value) {
94
- this.display[rowIndex].modified = true
95
- }
96
- this.table[`${colIndex}:${rowIndex}`] = value
93
+ const index = `${colIndex}:${rowIndex}`
97
94
  const col = this.columns[colIndex]
95
+
96
+ if (this.table[index] !== value) {
97
+ this.display[rowIndex].rowModified = true
98
+ }
99
+
100
+ this.table[index] = value
98
101
  this.rows[rowIndex][col.name] = value
99
- return this.table[`${colIndex}:${rowIndex}`]
102
+ return this.table[index]
100
103
  }
101
104
 
102
105
  toggleRowExpand(rowIndex: number) {
@@ -36,9 +36,9 @@ export type TableDisplay = {
36
36
  indent?: number
37
37
  isParent?: boolean
38
38
  isRoot?: boolean
39
- modified?: boolean
40
39
  open?: boolean
41
40
  parent?: number
41
+ rowModified?: boolean
42
42
  }
43
43
 
44
44
  export type TableRow = {