@stonecrop/atable 0.4.21 → 0.4.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/stores/table.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,KAAK,CAAA;AAEvD,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,MAAM,UAAU,CAAA;AAGjB;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAC1C,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,UAAU,CAAA;CAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6L4B,UAAU;kBApHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA0F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BAzDP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAYpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBlB,UAAU;kBApHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA0F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BAzDP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAYpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBlB,UAAU;kBApHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA0F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BAzDP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAYpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;mQAwD9C,CAAA"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/stores/table.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,KAAK,CAAA;AAEvD,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,MAAM,UAAU,CAAA;AAGjB;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAC1C,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,UAAU,CAAA;CAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAiM4B,UAAU;kBAxHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA8F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BA7DP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAgBpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBlB,UAAU;kBAxHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA8F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BA7DP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAgBpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBlB,UAAU;kBAxHhB,CAAC,kBAAkB,MAAM,YAAY,MAAM,KAAG,CAAC;oCA8F7B,MAAM,YAAY,MAAM;kCAK1B,MAAM,YAAY,MAAM,SAAS,GAAG;iCAzErC,WAAW,KAAG,aAAa;6BAmB/B,MAAM,YAAY,MAAM;0BAqF3B,MAAM,gBAAgB,MAAM;mCAhEnB,MAAM;2BATd,MAAM;6BAKJ,MAAM;4BA7DP,MAAM,YAAY,MAAM,SAAS,GAAG;4BAgBpC,MAAM,YAAY,MAAM,SAAS,MAAM;gCA6DnC,MAAM;4BA4DV,cAAc;mQAwD9C,CAAA"}
@@ -76,7 +76,11 @@ export const createTableStore = (initData) => {
76
76
  display.value[rowIndex].rowModified = true;
77
77
  }
78
78
  table.value[index] = value;
79
- rows.value[rowIndex][col.name] = value;
79
+ // Create a new row object to ensure reactivity
80
+ rows.value[rowIndex] = {
81
+ ...rows.value[rowIndex],
82
+ [col.name]: value,
83
+ };
80
84
  };
81
85
  const setCellText = (colIndex, rowIndex, value) => {
82
86
  const index = `${colIndex}:${rowIndex}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stonecrop/atable",
3
- "version": "0.4.21",
3
+ "version": "0.4.23",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": {
@@ -38,8 +38,8 @@
38
38
  "@vueuse/core": "^13.4.0",
39
39
  "pinia": "^3.0.3",
40
40
  "vue": "^3.5.17",
41
- "@stonecrop/themes": "0.4.21",
42
- "@stonecrop/utilities": "0.4.21"
41
+ "@stonecrop/themes": "0.4.23",
42
+ "@stonecrop/utilities": "0.4.23"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@microsoft/api-documenter": "^7.26.29",
@@ -10,7 +10,7 @@
10
10
  :style="cellStyle"
11
11
  @focus="onFocus"
12
12
  @paste="updateCellData"
13
- @input="updateCellData"
13
+ @input="debouncedUpdateCellData"
14
14
  @click="showModal"
15
15
  class="atable-cell"
16
16
  :class="cellClasses">
@@ -26,7 +26,7 @@
26
26
 
27
27
  <script setup lang="ts">
28
28
  import { KeypressHandlers, defaultKeypressHandlers, useKeyboardNav } from '@stonecrop/utilities'
29
- import { useElementBounding } from '@vueuse/core'
29
+ import { useDebounceFn, useElementBounding } from '@vueuse/core'
30
30
  import { computed, type CSSProperties, ref, useTemplateRef } from 'vue'
31
31
 
32
32
  import { createTableStore } from '../stores/table'
@@ -39,6 +39,7 @@ const {
39
39
  addNavigation = true,
40
40
  tabIndex = 0,
41
41
  pinned = false,
42
+ debounce = 300,
42
43
  } = defineProps<{
43
44
  colIndex: number
44
45
  rowIndex: number
@@ -46,6 +47,7 @@ const {
46
47
  addNavigation?: boolean | KeypressHandlers
47
48
  tabIndex?: number
48
49
  pinned?: boolean
50
+ debounce?: number
49
51
  }>()
50
52
 
51
53
  const cellRef = useTemplateRef<HTMLTableCellElement>('cell')
@@ -176,6 +178,8 @@ const updateCellData = (payload: Event) => {
176
178
  }
177
179
  }
178
180
 
181
+ const debouncedUpdateCellData = useDebounceFn(updateCellData, debounce)
182
+
179
183
  defineExpose({
180
184
  currentData,
181
185
  })
@@ -68,7 +68,7 @@
68
68
  <script setup lang="ts">
69
69
  import { vOnClickOutside } from '@vueuse/components'
70
70
  import { useMutationObserver } from '@vueuse/core'
71
- import { nextTick, watch, onMounted, useTemplateRef, computed } from 'vue'
71
+ import { nextTick, onMounted, useTemplateRef, computed, watch } from 'vue'
72
72
 
73
73
  import ARow from './ARow.vue'
74
74
  import ATableHeader from './ATableHeader.vue'
@@ -76,28 +76,27 @@ import ATableModal from './ATableModal.vue'
76
76
  import { createTableStore } from '../stores/table'
77
77
  import type { GanttDragEvent, TableColumn, TableConfig, TableRow } from '../types'
78
78
 
79
+ const modelValue = defineModel<TableRow[]>({ required: true })
80
+
79
81
  const {
80
82
  id,
81
- modelValue,
82
83
  columns,
83
84
  rows = [],
84
85
  config = new Object(),
85
86
  } = defineProps<{
86
87
  id?: string
87
- modelValue: TableRow[]
88
88
  columns: TableColumn[]
89
89
  rows?: TableRow[]
90
90
  config?: TableConfig
91
91
  }>()
92
92
 
93
93
  const emit = defineEmits<{
94
- 'update:modelValue': [value: TableRow[]]
95
94
  cellUpdate: [{ colIndex: number; rowIndex: number; newValue: any; oldValue: any }]
96
95
  'gantt:drag': [event: GanttDragEvent]
97
96
  }>()
98
97
 
99
98
  const tableRef = useTemplateRef<HTMLTableElement>('table')
100
- const rowsValue = modelValue ? modelValue : rows
99
+ const rowsValue = modelValue.value.length > 0 ? modelValue.value : rows
101
100
  const store = createTableStore({ columns, rows: rowsValue, id, config })
102
101
 
103
102
  store.$onAction(({ name, store, args, after }) => {
@@ -105,6 +104,8 @@ store.$onAction(({ name, store, args, after }) => {
105
104
  const [colIndex, rowIndex, newValue] = args
106
105
  const oldValue = store.getCellData(colIndex, rowIndex)
107
106
  after(() => {
107
+ // Update modelValue to trigger update:modelValue event
108
+ modelValue.value = [...store.rows]
108
109
  emit('cellUpdate', { colIndex, rowIndex, newValue, oldValue })
109
110
  })
110
111
  } else if (name === 'updateGanttBar') {
@@ -124,10 +125,14 @@ store.$onAction(({ name, store, args, after }) => {
124
125
  }
125
126
  })
126
127
 
128
+ // Watch for external changes to modelValue and sync to store
127
129
  watch(
128
- () => store.rows,
129
- newValue => {
130
- emit('update:modelValue', newValue)
130
+ () => modelValue.value,
131
+ newRows => {
132
+ // Only update if the rows have actually changed (avoid infinite loops)
133
+ if (JSON.stringify(newRows) !== JSON.stringify(store.rows)) {
134
+ store.rows = [...newRows]
135
+ }
131
136
  },
132
137
  { deep: true }
133
138
  )
@@ -109,7 +109,11 @@ export const createTableStore = (initData: {
109
109
  }
110
110
 
111
111
  table.value[index] = value
112
- rows.value[rowIndex][col.name] = value
112
+ // Create a new row object to ensure reactivity
113
+ rows.value[rowIndex] = {
114
+ ...rows.value[rowIndex],
115
+ [col.name]: value,
116
+ }
113
117
  }
114
118
 
115
119
  const setCellText = (colIndex: number, rowIndex: number, value: string) => {