@vuu-ui/vuu-utils 2.1.19-beta.3 → 2.1.19

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 (24) hide show
  1. package/cjs/packages/vuu-utils/src/data-editing/EditSession.js +4 -2
  2. package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
  3. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js +0 -14
  4. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
  5. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +11 -4
  6. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  7. package/cjs/packages/vuu-utils/src/index.js +2 -2
  8. package/cjs/packages/vuu-utils/src/protocol-message-utils.js +2 -0
  9. package/cjs/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
  10. package/esm/packages/vuu-utils/src/data-editing/EditSession.js +4 -3
  11. package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
  12. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js +1 -13
  13. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
  14. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +12 -5
  15. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  16. package/esm/packages/vuu-utils/src/index.js +3 -3
  17. package/esm/packages/vuu-utils/src/protocol-message-utils.js +2 -1
  18. package/esm/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
  19. package/package.json +6 -6
  20. package/types/data-editing/EditSession.d.ts +5 -2
  21. package/types/data-editing/edit-utils.d.ts +1 -3
  22. package/types/data-editing/useEditableTable.d.ts +2 -2
  23. package/types/index.d.ts +2 -2
  24. package/types/protocol-message-utils.d.ts +2 -1
@@ -11,6 +11,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
11
11
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
12
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
13
  var _rowEdits, _deletedRows, _editCount, _deleteCount, _addCount, _invalidCount, _deleteMode, _sourceTableDataSource, _sessionDataSource, _inEditMode, _endEditModePending;
14
+ const isCopyOption = (mode) => mode === "All" || mode === "Empty" || mode === "Selected";
14
15
  class StaleUpdateError extends Error {
15
16
  }
16
17
  class EditSession extends eventEmitter.EventEmitter {
@@ -161,10 +162,10 @@ class EditSession extends eventEmitter.EventEmitter {
161
162
  __privateSet(this, _inEditMode, false);
162
163
  __privateSet(this, _endEditModePending, false);
163
164
  }
164
- async begin(editSessionMode) {
165
+ async begin(mode) {
165
166
  try {
166
167
  __privateSet(this, _inEditMode, true);
167
- const sessionDataSource = await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(editSessionMode);
168
+ const sessionDataSource = isCopyOption(mode) ? await __privateGet(this, _sourceTableDataSource)?.createSessionDataSource?.(mode) : await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(mode);
168
169
  __privateSet(this, _sessionDataSource, sessionDataSource);
169
170
  return sessionDataSource;
170
171
  } catch (e) {
@@ -309,4 +310,5 @@ _endEditModePending = new WeakMap();
309
310
 
310
311
  exports.EditSession = EditSession;
311
312
  exports.StaleUpdateError = StaleUpdateError;
313
+ exports.isCopyOption = isCopyOption;
312
314
  //# sourceMappingURL=EditSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { DeleteRowMode, DeleteSelectedRowsResult, EditApi, EditSessionMode, UndoRowChangeResult } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\nexport class EditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n isDeleted?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #deleteMode: DeleteRowMode;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: EditApi;\n #inEditMode = false;\n #endEditModePending = false;\n\n constructor(dataSource: EditApi, deleteMode: DeleteRowMode = \"soft\") {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0 && this.#deleteCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n if (val === 0 && this.#editCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldCount = this.#addCount;\n this.#addCount = val;\n if (val === 0 && this.#editCount === 0 && this.#deleteCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(this.#deleteMode);\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n for (const key of deletedKeys) {\n this.#deletedRows.add(key);\n }\n this.deleteCount = this.#deleteCount + deletedKeys.length;\n }\n }\n\n addRows(\n count = 15,\n rowData: Record<string, VuuRowDataItemType> = {},\n ) {\n for (let i = 0; i < count; i++) {\n this.#sourceTableDataSource?.addRow?.(rowData);\n }\n this.addCount = this.#addCount + count;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.#inEditMode) return;\n\n const rowEdits = this.#rowEdits.get(key);\n const wasDeleted = this.#deletedRows.has(key);\n\n if (!rowEdits?.cellEdits.size && !wasDeleted) return;\n\n this.#rowEdits.delete(key);\n if (wasDeleted) this.#deletedRows.delete(key);\n\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n // Restore on failure\n if (rowEdits) this.#rowEdits.set(key, rowEdits);\n if (wasDeleted) this.#deletedRows.add(key);\n return;\n }\n\n // Update counters after confirmed success\n if (rowEdits) {\n let validCount = 0;\n let invalidCount = 0;\n for (const [, cellEdit] of rowEdits.cellEdits) {\n if (cellEdit.isValid === false) {\n invalidCount++;\n } else {\n validCount++;\n }\n }\n this.editCount = this.#editCount - validCount;\n this.invalidCount = this.#invalidCount - invalidCount;\n }\n if (wasDeleted) {\n this.deleteCount = this.#deleteCount - 1;\n }\n \n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow === true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#inEditMode = false;\n this.#endEditModePending = false;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n try {\n this.#inEditMode = true;\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n this.#endEditModePending = true;\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n this.#endEditModePending = false;\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode === true && this.#endEditModePending === false;\n }\n\n get editState(): EditState {\n return this.editCount === 0 && this.#deleteCount === 0 && this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n cellEdit.isDeleted = true;\n if (cellEdit.isValid) {\n this.editCount -= 1;\n } else {\n this.invalidCount -= 1;\n }\n } else {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n cellEdit.editedValue = editedValue;\n // do not trigger the event, save it for the editCount\n this.#invalidCount -= 1;\n this.editCount += 1;\n }\n }\n return cellEdit;\n } else {\n const cellEdit: CellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n if (isValid) {\n this.editCount += 1;\n }\n return cellEdit;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n if (!this.#inEditMode) {\n throw new Error(\"No edit session in progress\");\n }\n const rowEditDetails = this.getOrCreateRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (cellEdit.isDeleted) {\n if (rowEditDetails.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n }\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return {\n editedDuringCurrentSession: cellEdit.originalValue !== typedValue,\n ...response,\n };\n }\n } else {\n const { cellEdits } = rowEditDetails;\n let cellEdit = cellEdits.get(columnName);\n if (cellEdit && cellEdit.isValid !== false) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n } else if (cellEdit === undefined) {\n cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n this.invalidCount += 1;\n }\n return { editedDuringCurrentSession: false };\n }\n }\n}\n"],"names":["EventEmitter","isRpcError","rowEditDetails","cellEdit"],"mappings":"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"}
1
+ {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, DeleteSelectedRowsResult, EditApi, EditSessionMode, UndoRowChangeResult } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../protocol-message-utils\";\n\nexport const isCopyOption = (mode?: EditSessionMode | CopyOption): mode is CopyOption =>\n mode === \"All\" || mode === \"Empty\" || mode === \"Selected\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\nexport class EditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n isDeleted?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #deleteMode: DeleteRowMode;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: EditApi;\n #inEditMode = false;\n #endEditModePending = false;\n\n constructor(dataSource: EditApi, deleteMode: DeleteRowMode = \"soft\") {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0 && this.#deleteCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n if (val === 0 && this.#editCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldCount = this.#addCount;\n this.#addCount = val;\n if (val === 0 && this.#editCount === 0 && this.#deleteCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(this.#deleteMode);\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n for (const key of deletedKeys) {\n this.#deletedRows.add(key);\n }\n this.deleteCount = this.#deleteCount + deletedKeys.length;\n }\n }\n\n addRows(\n count = 15,\n rowData: Record<string, VuuRowDataItemType> = {},\n ) {\n for (let i = 0; i < count; i++) {\n this.#sourceTableDataSource?.addRow?.(rowData);\n }\n this.addCount = this.#addCount + count;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.#inEditMode) return;\n\n const rowEdits = this.#rowEdits.get(key);\n const wasDeleted = this.#deletedRows.has(key);\n\n if (!rowEdits?.cellEdits.size && !wasDeleted) return;\n\n this.#rowEdits.delete(key);\n if (wasDeleted) this.#deletedRows.delete(key);\n\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n // Restore on failure\n if (rowEdits) this.#rowEdits.set(key, rowEdits);\n if (wasDeleted) this.#deletedRows.add(key);\n return;\n }\n\n // Update counters after confirmed success\n if (rowEdits) {\n let validCount = 0;\n let invalidCount = 0;\n for (const [, cellEdit] of rowEdits.cellEdits) {\n if (cellEdit.isValid === false) {\n invalidCount++;\n } else {\n validCount++;\n }\n }\n this.editCount = this.#editCount - validCount;\n this.invalidCount = this.#invalidCount - invalidCount;\n }\n if (wasDeleted) {\n this.deleteCount = this.#deleteCount - 1;\n }\n \n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow === true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#inEditMode = false;\n this.#endEditModePending = false;\n }\n\n /** @deprecated Pass a `CopyOption` (\"All\" | \"Empty\" | \"Selected\") to use `createSessionDataSource` instead. Long-form `EditSessionMode` values will be removed in a future release. */\n async begin(mode: EditSessionMode): Promise<DataSource | undefined>;\n async begin(mode?: CopyOption): Promise<DataSource | undefined>;\n async begin(mode?: EditSessionMode | CopyOption): Promise<DataSource | undefined> {\n try {\n this.#inEditMode = true;\n const sessionDataSource = isCopyOption(mode)\n ? await this.#sourceTableDataSource?.createSessionDataSource?.(mode)\n : await this.#sourceTableDataSource?.beginEditSession?.(mode);\n\n this.#sessionDataSource = sessionDataSource;\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n this.#endEditModePending = true;\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n this.#endEditModePending = false;\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode === true && this.#endEditModePending === false;\n }\n\n get editState(): EditState {\n return this.editCount === 0 && this.#deleteCount === 0 && this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n cellEdit.isDeleted = true;\n if (cellEdit.isValid) {\n this.editCount -= 1;\n } else {\n this.invalidCount -= 1;\n }\n } else {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n cellEdit.editedValue = editedValue;\n // do not trigger the event, save it for the editCount\n this.#invalidCount -= 1;\n this.editCount += 1;\n }\n }\n return cellEdit;\n } else {\n const cellEdit: CellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n if (isValid) {\n this.editCount += 1;\n }\n return cellEdit;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n if (!this.#inEditMode) {\n throw new Error(\"No edit session in progress\");\n }\n const rowEditDetails = this.getOrCreateRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (cellEdit.isDeleted) {\n if (rowEditDetails.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n }\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return {\n editedDuringCurrentSession: cellEdit.originalValue !== typedValue,\n ...response,\n };\n }\n } else {\n const { cellEdits } = rowEditDetails;\n let cellEdit = cellEdits.get(columnName);\n if (cellEdit && cellEdit.isValid !== false) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n } else if (cellEdit === undefined) {\n cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n this.invalidCount += 1;\n }\n return { editedDuringCurrentSession: false };\n }\n }\n}\n"],"names":["EventEmitter","isRpcError","rowEditDetails","cellEdit"],"mappings":"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"}
@@ -5,18 +5,6 @@ require('../date/date-utils.js');
5
5
  require('../date/dateTimePattern.js');
6
6
  var formatter = require('../date/formatter.js');
7
7
 
8
- const TO_RPC_MODE = {
9
- "all-rows": "All",
10
- "empty-session-table": "Empty",
11
- "selected-rows": "Selected"
12
- };
13
- const toRpcEditSessionMode = (mode) => TO_RPC_MODE[mode] ?? mode;
14
- const FROM_RPC_MODE = {
15
- All: "all-rows",
16
- Empty: "empty-session-table",
17
- Selected: "selected-rows"
18
- };
19
- const fromRpcEditSessionMode = (alias) => FROM_RPC_MODE[alias] ?? alias;
20
8
  const isInlineEditingSession = (editSessionMode) => editSessionMode.startsWith("inline");
21
9
  const timeFormatter = formatter.formatDate({ time: "hh:mm:ss" });
22
10
  const getVuuEditMessage = (dataRow, column, originalValue) => {
@@ -44,8 +32,6 @@ const getVuuEditMessage = (dataRow, column, originalValue) => {
44
32
  }
45
33
  };
46
34
 
47
- exports.fromRpcEditSessionMode = fromRpcEditSessionMode;
48
35
  exports.getVuuEditMessage = getVuuEditMessage;
49
36
  exports.isInlineEditingSession = isInlineEditingSession;
50
- exports.toRpcEditSessionMode = toRpcEditSessionMode;
51
37
  //# sourceMappingURL=edit-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.tsx"],"sourcesContent":["import { EditSessionMode, EditSessionModeAlias, InlineEditSessionMode, StandaloneEditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport { DataRow, RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { formatDate } from \"../date\";\n\n/**\n * Converts a StandaloneEditSessionMode long-form value to the short-form alias\n * accepted by the beginEditSession RPC.\n * `\"inline-all-rows\"` is NOT converted here — it is a client-only flag that\n * passes through to the RPC unchanged.\n */\nconst TO_RPC_MODE: Partial<Record<string, EditSessionModeAlias>> = {\n \"all-rows\": \"All\",\n \"empty-session-table\": \"Empty\",\n \"selected-rows\": \"Selected\",\n};\n\nexport const toRpcEditSessionMode = (\n mode: EditSessionMode,\n): EditSessionModeAlias =>\n TO_RPC_MODE[mode] ?? (mode as EditSessionModeAlias);\n\n/**\n * Converts an RPC alias back to the long-form mode needed by VuuModule\n * internals (e.g. `createSessionTable`). Always returns a long-form value.\n */\nconst FROM_RPC_MODE: Record<EditSessionModeAlias, InlineEditSessionMode | StandaloneEditSessionMode> = {\n All: \"all-rows\",\n Empty: \"empty-session-table\",\n Selected: \"selected-rows\",\n};\n\nexport const fromRpcEditSessionMode = (\n alias: EditSessionModeAlias,\n): InlineEditSessionMode | StandaloneEditSessionMode =>\n FROM_RPC_MODE[alias] ?? (alias as StandaloneEditSessionMode);\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode.startsWith(\"inline\");\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nexport const getVuuEditMessage = (\n dataRow: DataRow,\n column: RuntimeColumnDescriptor,\n originalValue: string,\n) => {\n const vuuMsg = dataRow.vuuMsg as string;\n if (typeof vuuMsg === \"string\" && vuuMsg !== \"\") {\n const columnMessages = vuuMsg.split(\",\");\n const msgForCol = columnMessages.find((msg) =>\n msg.startsWith(`${column.name}:`),\n );\n if (msgForCol) {\n const [, value, updatedValue, ts] = msgForCol.split(\":\");\n const updateTime = timeFormatter(new Date(parseInt(ts as string)));\n return (\n <span>\n {\"Update rejected. Original value \"}\n <b>{originalValue}</b>\n {\" could not be updated to \"}\n <b>{value}</b>\n {\". It was updated to \"}\n <b>{updatedValue}</b>\n {\" at \"}\n {updateTime}\n {\".\"}\n </span>\n );\n }\n }\n};\n"],"names":["formatDate","jsx"],"mappings":";;;;;;;AAUA,MAAM,WAA6D,GAAA;AAAA,EACjE,UAAY,EAAA,KAAA;AAAA,EACZ,qBAAuB,EAAA,OAAA;AAAA,EACvB,eAAiB,EAAA;AACnB,CAAA;AAEO,MAAM,oBAAuB,GAAA,CAClC,IAEA,KAAA,WAAA,CAAY,IAAI,CAAM,IAAA;AAMxB,MAAM,aAAiG,GAAA;AAAA,EACrG,GAAK,EAAA,UAAA;AAAA,EACL,KAAO,EAAA,qBAAA;AAAA,EACP,QAAU,EAAA;AACZ,CAAA;AAEO,MAAM,sBAAyB,GAAA,CACpC,KAEA,KAAA,aAAA,CAAc,KAAK,CAAM,IAAA;AAEpB,MAAM,sBAAyB,GAAA,CACpC,eAEA,KAAA,eAAA,CAAgB,WAAW,QAAQ;AAErC,MAAM,aAAgB,GAAAA,oBAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAE9C,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,EAAI,EAAA;AAC/C,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,YAAY,cAAe,CAAA,IAAA;AAAA,MAAK,CAAC,GACrC,KAAA,GAAA,CAAI,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAG,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,GAAG,KAAO,EAAA,YAAA,EAAc,EAAE,CAAI,GAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACvD,MAAA,MAAM,aAAa,aAAc,CAAA,IAAI,KAAK,QAAS,CAAA,EAAY,CAAC,CAAC,CAAA;AACjE,MAAA,uCACG,MACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACDC,cAAA,CAAC,OAAG,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,QACjB,2BAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,QACT,sBAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACH,EAAA,CAAA;AAAA;AAEJ;AAEJ;;;;;;;"}
1
+ {"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.tsx"],"sourcesContent":["import { EditSessionMode, InlineEditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport { DataRow, RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { formatDate } from \"../date\";\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode.startsWith(\"inline\");\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nexport const getVuuEditMessage = (\n dataRow: DataRow,\n column: RuntimeColumnDescriptor,\n originalValue: string,\n) => {\n const vuuMsg = dataRow.vuuMsg as string;\n if (typeof vuuMsg === \"string\" && vuuMsg !== \"\") {\n const columnMessages = vuuMsg.split(\",\");\n const msgForCol = columnMessages.find((msg) =>\n msg.startsWith(`${column.name}:`),\n );\n if (msgForCol) {\n const [, value, updatedValue, ts] = msgForCol.split(\":\");\n const updateTime = timeFormatter(new Date(parseInt(ts as string)));\n return (\n <span>\n {\"Update rejected. Original value \"}\n <b>{originalValue}</b>\n {\" could not be updated to \"}\n <b>{value}</b>\n {\". It was updated to \"}\n <b>{updatedValue}</b>\n {\" at \"}\n {updateTime}\n {\".\"}\n </span>\n );\n }\n }\n};\n"],"names":["formatDate","jsx"],"mappings":";;;;;;;AAIO,MAAM,sBAAyB,GAAA,CACpC,eAEA,KAAA,eAAA,CAAgB,WAAW,QAAQ;AAErC,MAAM,aAAgB,GAAAA,oBAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAE9C,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,EAAI,EAAA;AAC/C,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,YAAY,cAAe,CAAA,IAAA;AAAA,MAAK,CAAC,GACrC,KAAA,GAAA,CAAI,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAG,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,GAAG,KAAO,EAAA,YAAA,EAAc,EAAE,CAAI,GAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACvD,MAAA,MAAM,aAAa,aAAc,CAAA,IAAI,KAAK,QAAS,CAAA,EAAY,CAAC,CAAC,CAAA;AACjE,MAAA,uCACG,MACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACDC,cAAA,CAAC,OAAG,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,QACjB,2BAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,QACT,sBAAA;AAAA,wBACDA,cAAA,CAAC,OAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACH,EAAA,CAAA;AAAA;AAEJ;AAEJ;;;;;"}
@@ -42,6 +42,8 @@ const useEditableTable = ({
42
42
  const handleCancel = React.useCallback(async () => {
43
43
  try {
44
44
  await editSession.end();
45
+ setSessionDataSource(void 0);
46
+ setSelectionCount(0);
45
47
  onCancel();
46
48
  } catch (e) {
47
49
  }
@@ -52,6 +54,8 @@ const useEditableTable = ({
52
54
  try {
53
55
  await editSession.end(true, force);
54
56
  if (editSession.inEditMode === false) {
57
+ setSessionDataSource(void 0);
58
+ setSelectionCount(0);
55
59
  onSave();
56
60
  }
57
61
  } catch (e) {
@@ -72,13 +76,14 @@ const useEditableTable = ({
72
76
  [editSession]
73
77
  );
74
78
  React.useEffect(() => {
75
- dataSource.on("row-selection", setSelectionCount);
76
- return () => dataSource.removeListener("row-selection", setSelectionCount);
77
- }, [dataSource]);
79
+ const activeDataSource = sessionDataSource ?? dataSource;
80
+ activeDataSource.on("row-selection", setSelectionCount);
81
+ return () => activeDataSource.removeListener("row-selection", setSelectionCount);
82
+ }, [dataSource, sessionDataSource]);
78
83
  React.useMemo(async () => {
79
84
  if (isEditMode) {
80
85
  try {
81
- const sessionDataSource2 = await editSession.begin(editSessionMode);
86
+ const sessionDataSource2 = EditSession.isCopyOption(editSessionMode) ? await editSession.begin(editSessionMode) : await editSession.begin(editSessionMode);
82
87
  if (sessionDataSource2) {
83
88
  setSessionDataSource(sessionDataSource2);
84
89
  }
@@ -88,6 +93,8 @@ const useEditableTable = ({
88
93
  }
89
94
  } else if (editSession.inEditMode) {
90
95
  await editSession.end();
96
+ setSessionDataSource(void 0);
97
+ setSelectionCount(0);
91
98
  }
92
99
  }, [editSession, editSessionMode, isEditMode, onCancel]);
93
100
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { DataSource, DeleteRowMode, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\",\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n dataSource.on(\"row-selection\", setSelectionCount);\n return () => dataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const sessionDataSource = await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(`[useEditableTable] begin edit session failed`, e);\n onCancel();\n }\n } else if (editSession.inEditMode) {\n await editSession.end();\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n hasSelection: selectionCount > 0,\n onAddRows: handleAddRows,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n sessionDataSource,\n };\n};\n"],"names":["useData","useState","useLayoutEffectSkipFirst","useMemo","EditSession","useCallback","useEffect","sessionDataSource"],"mappings":"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"}
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, EditApi, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession, isCopyOption } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode | CopyOption;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\" as EditSessionMode | CopyOption,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource as EditApi, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n const activeDataSource = sessionDataSource ?? dataSource;\n activeDataSource.on(\"row-selection\", setSelectionCount);\n return () => activeDataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource, sessionDataSource]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const sessionDataSource = isCopyOption(editSessionMode)\n ? await editSession.begin(editSessionMode)\n : await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(`[useEditableTable] begin edit session failed`, e);\n onCancel();\n }\n } else if (editSession.inEditMode) {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n hasSelection: selectionCount > 0,\n onAddRows: handleAddRows,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n sessionDataSource,\n };\n};\n"],"names":["useData","useState","useLayoutEffectSkipFirst","useMemo","EditSession","useCallback","useEffect","sessionDataSource","isCopyOption"],"mappings":"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"}
@@ -207,13 +207,12 @@ exports.setCookieValue = cookieUtils.setCookieValue;
207
207
  exports.importCSS = cssUtils.importCSS;
208
208
  exports.DataEditingProvider = DataEditingProvider.DataEditingProvider;
209
209
  exports.useEditSession = DataEditingProvider.useEditSession;
210
- exports.fromRpcEditSessionMode = editUtils.fromRpcEditSessionMode;
211
210
  exports.getVuuEditMessage = editUtils.getVuuEditMessage;
212
211
  exports.isInlineEditingSession = editUtils.isInlineEditingSession;
213
- exports.toRpcEditSessionMode = editUtils.toRpcEditSessionMode;
214
212
  exports.EditButtons = EditButtons.EditButtons;
215
213
  exports.EditSession = EditSession.EditSession;
216
214
  exports.StaleUpdateError = EditSession.StaleUpdateError;
215
+ exports.isCopyOption = EditSession.isCopyOption;
217
216
  exports.useEditableTable = useEditableTable.useEditableTable;
218
217
  exports.DOWN1 = dataUtils.DOWN1;
219
218
  exports.DOWN2 = dataUtils.DOWN2;
@@ -389,6 +388,7 @@ exports.hasViewPortContext = protocolMessageUtils.hasViewPortContext;
389
388
  exports.isActionMessage = protocolMessageUtils.isActionMessage;
390
389
  exports.isAddRowRpcRequest = protocolMessageUtils.isAddRowRpcRequest;
391
390
  exports.isBeginEditSessionRpcRequest = protocolMessageUtils.isBeginEditSessionRpcRequest;
391
+ exports.isCreateSessionTableRpcRequest = protocolMessageUtils.isCreateSessionTableRpcRequest;
392
392
  exports.isCreateVpSuccess = protocolMessageUtils.isCreateVpSuccess;
393
393
  exports.isCustomComponentActionMessage = protocolMessageUtils.isCustomComponentActionMessage;
394
394
  exports.isDeleteSelectedRowsRpcRequest = protocolMessageUtils.isDeleteSelectedRowsRpcRequest;
@@ -74,6 +74,7 @@ const isBeginEditSessionRpcRequest = (rpcRequest) => rpcRequest.rpcName === "beg
74
74
  const isEndEditSessionRpcRequest = (rpcRequest) => rpcRequest.rpcName === "endEditSession";
75
75
  const isUndoRowChangeRpcRequest = (rpcRequest) => rpcRequest.rpcName === "undoRowChange";
76
76
  const isDeleteSelectedRowsRpcRequest = (rpcRequest) => rpcRequest.rpcName === "deleteSelectedRows";
77
+ const isCreateSessionTableRpcRequest = (rpcRequest) => rpcRequest.rpcName === "createSessionTable";
77
78
 
78
79
  exports.INVALID_SESSION = INVALID_SESSION;
79
80
  exports.INVALID_TOKEN = INVALID_TOKEN;
@@ -83,6 +84,7 @@ exports.hasViewPortContext = hasViewPortContext;
83
84
  exports.isActionMessage = isActionMessage;
84
85
  exports.isAddRowRpcRequest = isAddRowRpcRequest;
85
86
  exports.isBeginEditSessionRpcRequest = isBeginEditSessionRpcRequest;
87
+ exports.isCreateSessionTableRpcRequest = isCreateSessionTableRpcRequest;
86
88
  exports.isCreateVpSuccess = isCreateVpSuccess;
87
89
  exports.isCustomComponentActionMessage = isCustomComponentActionMessage;
88
90
  exports.isDeleteSelectedRowsRpcRequest = isDeleteSelectedRowsRpcRequest;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n AddRowRpcServiceRequest,\n EndEditSessionRpcServiceRequest,\n EditCellRpcServiceRequest,\n BeginEditSessionRpcServiceRequest,\n UndoRowChangeRpcServiceRequest,\n DeleteSelectedRowsRpcServiceRequest,\n ServerToClientError,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isErrorMessage = (\n message: unknown,\n): message is ServerToClientError =>\n typeof message == \"object\" &&\n (message as ServerToClientError)?.type === \"ERROR\";\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n (rpcResponse.action?.renderComponent === \"inline-form\" ||\n rpcResponse.action?.renderComponent === \"grid\")\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n\nexport const isAddRowRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is AddRowRpcServiceRequest => rpcRequest.rpcName === \"addRow\";\nexport const isEditCellRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EditCellRpcServiceRequest => rpcRequest.rpcName === \"editCell\";\nexport const isBeginEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is BeginEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"beginEditSession\";\nexport const isEndEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EndEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"endEditSession\";\nexport const isUndoRowChangeRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is UndoRowChangeRpcServiceRequest =>\n rpcRequest.rpcName === \"undoRowChange\";\nexport const isDeleteSelectedRowsRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is DeleteSelectedRowsRpcServiceRequest =>\n rpcRequest.rpcName === \"deleteSelectedRows\";\n"],"names":["componentInRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n AddRowRpcServiceRequest,\n EndEditSessionRpcServiceRequest,\n EditCellRpcServiceRequest,\n BeginEditSessionRpcServiceRequest,\n UndoRowChangeRpcServiceRequest,\n DeleteSelectedRowsRpcServiceRequest,\n CreateSessionTableRpcServiceRequest,\n ServerToClientError,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isErrorMessage = (\n message: unknown,\n): message is ServerToClientError =>\n typeof message == \"object\" &&\n (message as ServerToClientError)?.type === \"ERROR\";\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n (rpcResponse.action?.renderComponent === \"inline-form\" ||\n rpcResponse.action?.renderComponent === \"grid\")\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n\nexport const isAddRowRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is AddRowRpcServiceRequest => rpcRequest.rpcName === \"addRow\";\nexport const isEditCellRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EditCellRpcServiceRequest => rpcRequest.rpcName === \"editCell\";\nexport const isBeginEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is BeginEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"beginEditSession\";\nexport const isEndEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EndEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"endEditSession\";\nexport const isUndoRowChangeRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is UndoRowChangeRpcServiceRequest =>\n rpcRequest.rpcName === \"undoRowChange\";\nexport const isDeleteSelectedRowsRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is DeleteSelectedRowsRpcServiceRequest =>\n rpcRequest.rpcName === \"deleteSelectedRows\";\nexport const isCreateSessionTableRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is CreateSessionTableRpcServiceRequest =>\n rpcRequest.rpcName === \"createSessionTable\";\n"],"names":["componentInRegistry"],"mappings":"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"}
@@ -9,6 +9,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
9
9
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
10
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
11
11
  var _rowEdits, _deletedRows, _editCount, _deleteCount, _addCount, _invalidCount, _deleteMode, _sourceTableDataSource, _sessionDataSource, _inEditMode, _endEditModePending;
12
+ const isCopyOption = (mode) => mode === "All" || mode === "Empty" || mode === "Selected";
12
13
  class StaleUpdateError extends Error {
13
14
  }
14
15
  class EditSession extends EventEmitter {
@@ -159,10 +160,10 @@ class EditSession extends EventEmitter {
159
160
  __privateSet(this, _inEditMode, false);
160
161
  __privateSet(this, _endEditModePending, false);
161
162
  }
162
- async begin(editSessionMode) {
163
+ async begin(mode) {
163
164
  try {
164
165
  __privateSet(this, _inEditMode, true);
165
- const sessionDataSource = await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(editSessionMode);
166
+ const sessionDataSource = isCopyOption(mode) ? await __privateGet(this, _sourceTableDataSource)?.createSessionDataSource?.(mode) : await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(mode);
166
167
  __privateSet(this, _sessionDataSource, sessionDataSource);
167
168
  return sessionDataSource;
168
169
  } catch (e) {
@@ -305,5 +306,5 @@ _sessionDataSource = new WeakMap();
305
306
  _inEditMode = new WeakMap();
306
307
  _endEditModePending = new WeakMap();
307
308
 
308
- export { EditSession, StaleUpdateError };
309
+ export { EditSession, StaleUpdateError, isCopyOption };
309
310
  //# sourceMappingURL=EditSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { DeleteRowMode, DeleteSelectedRowsResult, EditApi, EditSessionMode, UndoRowChangeResult } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\nexport class EditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n isDeleted?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #deleteMode: DeleteRowMode;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: EditApi;\n #inEditMode = false;\n #endEditModePending = false;\n\n constructor(dataSource: EditApi, deleteMode: DeleteRowMode = \"soft\") {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0 && this.#deleteCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n if (val === 0 && this.#editCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldCount = this.#addCount;\n this.#addCount = val;\n if (val === 0 && this.#editCount === 0 && this.#deleteCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(this.#deleteMode);\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n for (const key of deletedKeys) {\n this.#deletedRows.add(key);\n }\n this.deleteCount = this.#deleteCount + deletedKeys.length;\n }\n }\n\n addRows(\n count = 15,\n rowData: Record<string, VuuRowDataItemType> = {},\n ) {\n for (let i = 0; i < count; i++) {\n this.#sourceTableDataSource?.addRow?.(rowData);\n }\n this.addCount = this.#addCount + count;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.#inEditMode) return;\n\n const rowEdits = this.#rowEdits.get(key);\n const wasDeleted = this.#deletedRows.has(key);\n\n if (!rowEdits?.cellEdits.size && !wasDeleted) return;\n\n this.#rowEdits.delete(key);\n if (wasDeleted) this.#deletedRows.delete(key);\n\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n // Restore on failure\n if (rowEdits) this.#rowEdits.set(key, rowEdits);\n if (wasDeleted) this.#deletedRows.add(key);\n return;\n }\n\n // Update counters after confirmed success\n if (rowEdits) {\n let validCount = 0;\n let invalidCount = 0;\n for (const [, cellEdit] of rowEdits.cellEdits) {\n if (cellEdit.isValid === false) {\n invalidCount++;\n } else {\n validCount++;\n }\n }\n this.editCount = this.#editCount - validCount;\n this.invalidCount = this.#invalidCount - invalidCount;\n }\n if (wasDeleted) {\n this.deleteCount = this.#deleteCount - 1;\n }\n \n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow === true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#inEditMode = false;\n this.#endEditModePending = false;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n try {\n this.#inEditMode = true;\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n this.#endEditModePending = true;\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n this.#endEditModePending = false;\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode === true && this.#endEditModePending === false;\n }\n\n get editState(): EditState {\n return this.editCount === 0 && this.#deleteCount === 0 && this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n cellEdit.isDeleted = true;\n if (cellEdit.isValid) {\n this.editCount -= 1;\n } else {\n this.invalidCount -= 1;\n }\n } else {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n cellEdit.editedValue = editedValue;\n // do not trigger the event, save it for the editCount\n this.#invalidCount -= 1;\n this.editCount += 1;\n }\n }\n return cellEdit;\n } else {\n const cellEdit: CellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n if (isValid) {\n this.editCount += 1;\n }\n return cellEdit;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n if (!this.#inEditMode) {\n throw new Error(\"No edit session in progress\");\n }\n const rowEditDetails = this.getOrCreateRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (cellEdit.isDeleted) {\n if (rowEditDetails.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n }\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return {\n editedDuringCurrentSession: cellEdit.originalValue !== typedValue,\n ...response,\n };\n }\n } else {\n const { cellEdits } = rowEditDetails;\n let cellEdit = cellEdits.get(columnName);\n if (cellEdit && cellEdit.isValid !== false) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n } else if (cellEdit === undefined) {\n cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n this.invalidCount += 1;\n }\n return { editedDuringCurrentSession: false };\n }\n }\n}\n"],"names":["rowEditDetails","cellEdit"],"mappings":"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"}
1
+ {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, DeleteSelectedRowsResult, EditApi, EditSessionMode, UndoRowChangeResult } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../protocol-message-utils\";\n\nexport const isCopyOption = (mode?: EditSessionMode | CopyOption): mode is CopyOption =>\n mode === \"All\" || mode === \"Empty\" || mode === \"Selected\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\nexport class EditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n isDeleted?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #deleteMode: DeleteRowMode;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: EditApi;\n #inEditMode = false;\n #endEditModePending = false;\n\n constructor(dataSource: EditApi, deleteMode: DeleteRowMode = \"soft\") {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0 && this.#deleteCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n if (val === 0 && this.#editCount === 0 && this.#addCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldCount = this.#addCount;\n this.#addCount = val;\n if (val === 0 && this.#editCount === 0 && this.#deleteCount === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(this.#deleteMode);\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n for (const key of deletedKeys) {\n this.#deletedRows.add(key);\n }\n this.deleteCount = this.#deleteCount + deletedKeys.length;\n }\n }\n\n addRows(\n count = 15,\n rowData: Record<string, VuuRowDataItemType> = {},\n ) {\n for (let i = 0; i < count; i++) {\n this.#sourceTableDataSource?.addRow?.(rowData);\n }\n this.addCount = this.#addCount + count;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.#inEditMode) return;\n\n const rowEdits = this.#rowEdits.get(key);\n const wasDeleted = this.#deletedRows.has(key);\n\n if (!rowEdits?.cellEdits.size && !wasDeleted) return;\n\n this.#rowEdits.delete(key);\n if (wasDeleted) this.#deletedRows.delete(key);\n\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n // Restore on failure\n if (rowEdits) this.#rowEdits.set(key, rowEdits);\n if (wasDeleted) this.#deletedRows.add(key);\n return;\n }\n\n // Update counters after confirmed success\n if (rowEdits) {\n let validCount = 0;\n let invalidCount = 0;\n for (const [, cellEdit] of rowEdits.cellEdits) {\n if (cellEdit.isValid === false) {\n invalidCount++;\n } else {\n validCount++;\n }\n }\n this.editCount = this.#editCount - validCount;\n this.invalidCount = this.#invalidCount - invalidCount;\n }\n if (wasDeleted) {\n this.deleteCount = this.#deleteCount - 1;\n }\n \n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow === true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#inEditMode = false;\n this.#endEditModePending = false;\n }\n\n /** @deprecated Pass a `CopyOption` (\"All\" | \"Empty\" | \"Selected\") to use `createSessionDataSource` instead. Long-form `EditSessionMode` values will be removed in a future release. */\n async begin(mode: EditSessionMode): Promise<DataSource | undefined>;\n async begin(mode?: CopyOption): Promise<DataSource | undefined>;\n async begin(mode?: EditSessionMode | CopyOption): Promise<DataSource | undefined> {\n try {\n this.#inEditMode = true;\n const sessionDataSource = isCopyOption(mode)\n ? await this.#sourceTableDataSource?.createSessionDataSource?.(mode)\n : await this.#sourceTableDataSource?.beginEditSession?.(mode);\n\n this.#sessionDataSource = sessionDataSource;\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n this.#endEditModePending = true;\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n this.#endEditModePending = false;\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode === true && this.#endEditModePending === false;\n }\n\n get editState(): EditState {\n return this.editCount === 0 && this.#deleteCount === 0 && this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n cellEdit.isDeleted = true;\n if (cellEdit.isValid) {\n this.editCount -= 1;\n } else {\n this.invalidCount -= 1;\n }\n } else {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n cellEdit.editedValue = editedValue;\n // do not trigger the event, save it for the editCount\n this.#invalidCount -= 1;\n this.editCount += 1;\n }\n }\n return cellEdit;\n } else {\n const cellEdit: CellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n if (isValid) {\n this.editCount += 1;\n }\n return cellEdit;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n if (!this.#inEditMode) {\n throw new Error(\"No edit session in progress\");\n }\n const rowEditDetails = this.getOrCreateRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (cellEdit.isDeleted) {\n if (rowEditDetails.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n }\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return {\n editedDuringCurrentSession: cellEdit.originalValue !== typedValue,\n ...response,\n };\n }\n } else {\n const { cellEdits } = rowEditDetails;\n let cellEdit = cellEdits.get(columnName);\n if (cellEdit && cellEdit.isValid !== false) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n } else if (cellEdit === undefined) {\n cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n this.invalidCount += 1;\n }\n return { editedDuringCurrentSession: false };\n }\n }\n}\n"],"names":["rowEditDetails","cellEdit"],"mappings":"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"}
@@ -3,18 +3,6 @@ import '../date/date-utils.js';
3
3
  import '../date/dateTimePattern.js';
4
4
  import { formatDate } from '../date/formatter.js';
5
5
 
6
- const TO_RPC_MODE = {
7
- "all-rows": "All",
8
- "empty-session-table": "Empty",
9
- "selected-rows": "Selected"
10
- };
11
- const toRpcEditSessionMode = (mode) => TO_RPC_MODE[mode] ?? mode;
12
- const FROM_RPC_MODE = {
13
- All: "all-rows",
14
- Empty: "empty-session-table",
15
- Selected: "selected-rows"
16
- };
17
- const fromRpcEditSessionMode = (alias) => FROM_RPC_MODE[alias] ?? alias;
18
6
  const isInlineEditingSession = (editSessionMode) => editSessionMode.startsWith("inline");
19
7
  const timeFormatter = formatDate({ time: "hh:mm:ss" });
20
8
  const getVuuEditMessage = (dataRow, column, originalValue) => {
@@ -42,5 +30,5 @@ const getVuuEditMessage = (dataRow, column, originalValue) => {
42
30
  }
43
31
  };
44
32
 
45
- export { fromRpcEditSessionMode, getVuuEditMessage, isInlineEditingSession, toRpcEditSessionMode };
33
+ export { getVuuEditMessage, isInlineEditingSession };
46
34
  //# sourceMappingURL=edit-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.tsx"],"sourcesContent":["import { EditSessionMode, EditSessionModeAlias, InlineEditSessionMode, StandaloneEditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport { DataRow, RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { formatDate } from \"../date\";\n\n/**\n * Converts a StandaloneEditSessionMode long-form value to the short-form alias\n * accepted by the beginEditSession RPC.\n * `\"inline-all-rows\"` is NOT converted here — it is a client-only flag that\n * passes through to the RPC unchanged.\n */\nconst TO_RPC_MODE: Partial<Record<string, EditSessionModeAlias>> = {\n \"all-rows\": \"All\",\n \"empty-session-table\": \"Empty\",\n \"selected-rows\": \"Selected\",\n};\n\nexport const toRpcEditSessionMode = (\n mode: EditSessionMode,\n): EditSessionModeAlias =>\n TO_RPC_MODE[mode] ?? (mode as EditSessionModeAlias);\n\n/**\n * Converts an RPC alias back to the long-form mode needed by VuuModule\n * internals (e.g. `createSessionTable`). Always returns a long-form value.\n */\nconst FROM_RPC_MODE: Record<EditSessionModeAlias, InlineEditSessionMode | StandaloneEditSessionMode> = {\n All: \"all-rows\",\n Empty: \"empty-session-table\",\n Selected: \"selected-rows\",\n};\n\nexport const fromRpcEditSessionMode = (\n alias: EditSessionModeAlias,\n): InlineEditSessionMode | StandaloneEditSessionMode =>\n FROM_RPC_MODE[alias] ?? (alias as StandaloneEditSessionMode);\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode.startsWith(\"inline\");\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nexport const getVuuEditMessage = (\n dataRow: DataRow,\n column: RuntimeColumnDescriptor,\n originalValue: string,\n) => {\n const vuuMsg = dataRow.vuuMsg as string;\n if (typeof vuuMsg === \"string\" && vuuMsg !== \"\") {\n const columnMessages = vuuMsg.split(\",\");\n const msgForCol = columnMessages.find((msg) =>\n msg.startsWith(`${column.name}:`),\n );\n if (msgForCol) {\n const [, value, updatedValue, ts] = msgForCol.split(\":\");\n const updateTime = timeFormatter(new Date(parseInt(ts as string)));\n return (\n <span>\n {\"Update rejected. Original value \"}\n <b>{originalValue}</b>\n {\" could not be updated to \"}\n <b>{value}</b>\n {\". It was updated to \"}\n <b>{updatedValue}</b>\n {\" at \"}\n {updateTime}\n {\".\"}\n </span>\n );\n }\n }\n};\n"],"names":[],"mappings":";;;;;AAUA,MAAM,WAA6D,GAAA;AAAA,EACjE,UAAY,EAAA,KAAA;AAAA,EACZ,qBAAuB,EAAA,OAAA;AAAA,EACvB,eAAiB,EAAA;AACnB,CAAA;AAEO,MAAM,oBAAuB,GAAA,CAClC,IAEA,KAAA,WAAA,CAAY,IAAI,CAAM,IAAA;AAMxB,MAAM,aAAiG,GAAA;AAAA,EACrG,GAAK,EAAA,UAAA;AAAA,EACL,KAAO,EAAA,qBAAA;AAAA,EACP,QAAU,EAAA;AACZ,CAAA;AAEO,MAAM,sBAAyB,GAAA,CACpC,KAEA,KAAA,aAAA,CAAc,KAAK,CAAM,IAAA;AAEpB,MAAM,sBAAyB,GAAA,CACpC,eAEA,KAAA,eAAA,CAAgB,WAAW,QAAQ;AAErC,MAAM,aAAgB,GAAA,UAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAE9C,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,EAAI,EAAA;AAC/C,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,YAAY,cAAe,CAAA,IAAA;AAAA,MAAK,CAAC,GACrC,KAAA,GAAA,CAAI,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAG,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,GAAG,KAAO,EAAA,YAAA,EAAc,EAAE,CAAI,GAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACvD,MAAA,MAAM,aAAa,aAAc,CAAA,IAAI,KAAK,QAAS,CAAA,EAAY,CAAC,CAAC,CAAA;AACjE,MAAA,4BACG,MACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,QACjB,2BAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,QACT,sBAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACH,EAAA,CAAA;AAAA;AAEJ;AAEJ;;;;"}
1
+ {"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.tsx"],"sourcesContent":["import { EditSessionMode, InlineEditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport { DataRow, RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { formatDate } from \"../date\";\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode.startsWith(\"inline\");\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nexport const getVuuEditMessage = (\n dataRow: DataRow,\n column: RuntimeColumnDescriptor,\n originalValue: string,\n) => {\n const vuuMsg = dataRow.vuuMsg as string;\n if (typeof vuuMsg === \"string\" && vuuMsg !== \"\") {\n const columnMessages = vuuMsg.split(\",\");\n const msgForCol = columnMessages.find((msg) =>\n msg.startsWith(`${column.name}:`),\n );\n if (msgForCol) {\n const [, value, updatedValue, ts] = msgForCol.split(\":\");\n const updateTime = timeFormatter(new Date(parseInt(ts as string)));\n return (\n <span>\n {\"Update rejected. Original value \"}\n <b>{originalValue}</b>\n {\" could not be updated to \"}\n <b>{value}</b>\n {\". It was updated to \"}\n <b>{updatedValue}</b>\n {\" at \"}\n {updateTime}\n {\".\"}\n </span>\n );\n }\n }\n};\n"],"names":[],"mappings":";;;;;AAIO,MAAM,sBAAyB,GAAA,CACpC,eAEA,KAAA,eAAA,CAAgB,WAAW,QAAQ;AAErC,MAAM,aAAgB,GAAA,UAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAE9C,MAAM,iBAAoB,GAAA,CAC/B,OACA,EAAA,MAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,EAAI,EAAA;AAC/C,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AACvC,IAAA,MAAM,YAAY,cAAe,CAAA,IAAA;AAAA,MAAK,CAAC,GACrC,KAAA,GAAA,CAAI,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAG,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,GAAG,KAAO,EAAA,YAAA,EAAc,EAAE,CAAI,GAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACvD,MAAA,MAAM,aAAa,aAAc,CAAA,IAAI,KAAK,QAAS,CAAA,EAAY,CAAC,CAAC,CAAA;AACjE,MAAA,4BACG,MACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAc,EAAA,aAAA,EAAA,CAAA;AAAA,QACjB,2BAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,QACT,sBAAA;AAAA,wBACD,GAAA,CAAC,OAAG,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACH,EAAA,CAAA;AAAA;AAEJ;AAEJ;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { useState, useMemo, useCallback, useEffect } from 'react';
2
2
  import { useData } from '../context-definitions/DataProvider.js';
3
3
  import { useLayoutEffectSkipFirst } from '../useLayoutEffectSkipFirst.js';
4
- import { EditSession } from './EditSession.js';
4
+ import { EditSession, isCopyOption } from './EditSession.js';
5
5
 
6
6
  const useEditableTable = ({
7
7
  addRowsCount = 15,
@@ -40,6 +40,8 @@ const useEditableTable = ({
40
40
  const handleCancel = useCallback(async () => {
41
41
  try {
42
42
  await editSession.end();
43
+ setSessionDataSource(void 0);
44
+ setSelectionCount(0);
43
45
  onCancel();
44
46
  } catch (e) {
45
47
  }
@@ -50,6 +52,8 @@ const useEditableTable = ({
50
52
  try {
51
53
  await editSession.end(true, force);
52
54
  if (editSession.inEditMode === false) {
55
+ setSessionDataSource(void 0);
56
+ setSelectionCount(0);
53
57
  onSave();
54
58
  }
55
59
  } catch (e) {
@@ -70,13 +74,14 @@ const useEditableTable = ({
70
74
  [editSession]
71
75
  );
72
76
  useEffect(() => {
73
- dataSource.on("row-selection", setSelectionCount);
74
- return () => dataSource.removeListener("row-selection", setSelectionCount);
75
- }, [dataSource]);
77
+ const activeDataSource = sessionDataSource ?? dataSource;
78
+ activeDataSource.on("row-selection", setSelectionCount);
79
+ return () => activeDataSource.removeListener("row-selection", setSelectionCount);
80
+ }, [dataSource, sessionDataSource]);
76
81
  useMemo(async () => {
77
82
  if (isEditMode) {
78
83
  try {
79
- const sessionDataSource2 = await editSession.begin(editSessionMode);
84
+ const sessionDataSource2 = isCopyOption(editSessionMode) ? await editSession.begin(editSessionMode) : await editSession.begin(editSessionMode);
80
85
  if (sessionDataSource2) {
81
86
  setSessionDataSource(sessionDataSource2);
82
87
  }
@@ -86,6 +91,8 @@ const useEditableTable = ({
86
91
  }
87
92
  } else if (editSession.inEditMode) {
88
93
  await editSession.end();
94
+ setSessionDataSource(void 0);
95
+ setSelectionCount(0);
89
96
  }
90
97
  }, [editSession, editSessionMode, isEditMode, onCancel]);
91
98
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { DataSource, DeleteRowMode, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\",\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n dataSource.on(\"row-selection\", setSelectionCount);\n return () => dataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const sessionDataSource = await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(`[useEditableTable] begin edit session failed`, e);\n onCancel();\n }\n } else if (editSession.inEditMode) {\n await editSession.end();\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n hasSelection: selectionCount > 0,\n onAddRows: handleAddRows,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n sessionDataSource,\n };\n};\n"],"names":["sessionDataSource"],"mappings":"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"}
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { CopyOption, DataSource, DeleteRowMode, EditApi, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession, isCopyOption } from \"./EditSession\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n addRowsCount?: number;\n deleteMode?: DeleteRowMode;\n editSessionMode?: EditSessionMode | CopyOption;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n addRowsCount = 15,\n columns,\n dataSource: dataSourceProp,\n deleteMode = \"soft\",\n editSessionMode = \"inline-all-rows\" as EditSessionMode | CopyOption,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n const [selectionCount, setSelectionCount] = useState(0);\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope\n // by wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(\n () => new EditSession(dataSource as EditApi, deleteMode),\n // deleteMode is intentionally excluded — changing it mid-session is not supported\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataSource],\n );\n\n const handleCancel = useCallback(async () => {\n try {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(\n async (force = false) => {\n dataSource.resume?.();\n try {\n await editSession.end(true, force);\n if (editSession.inEditMode === false) {\n setSessionDataSource(undefined);\n setSelectionCount(0);\n onSave();\n }\n } catch (e) {\n console.log(`[useEditableTable] handleSave ${(e as Error).message}`);\n }\n },\n [dataSource, editSession, onSave],\n );\n\n const handleDelete = useCallback(async () => {\n await editSession.deleteSelectedRows();\n setSelectionCount(0);\n }, [editSession]);\n\n const handleAddRows = useCallback(() => {\n editSession.addRows(addRowsCount);\n }, [addRowsCount, editSession]);\n\n const handleUndoRowChange = useCallback(\n (key: string) => void editSession.undoRowChange(key),\n [editSession],\n );\n\n useEffect(() => {\n const activeDataSource = sessionDataSource ?? dataSource;\n activeDataSource.on(\"row-selection\", setSelectionCount);\n return () => activeDataSource.removeListener(\"row-selection\", setSelectionCount);\n }, [dataSource, sessionDataSource]);\n\n useMemo(async () => {\n if (isEditMode) {\n try {\n const sessionDataSource = isCopyOption(editSessionMode)\n ? await editSession.begin(editSessionMode)\n : await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(`[useEditableTable] begin edit session failed`, e);\n onCancel();\n }\n } else if (editSession.inEditMode) {\n await editSession.end();\n setSessionDataSource(undefined);\n setSelectionCount(0);\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n hasSelection: selectionCount > 0,\n onAddRows: handleAddRows,\n onCancel: handleCancel,\n onDelete: handleDelete,\n onSave: handleSave,\n onUndoRowChange: handleUndoRowChange,\n sessionDataSource,\n };\n};\n"],"names":["sessionDataSource"],"mappings":"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"}
@@ -11,9 +11,9 @@ export { getCellConfigPanelRenderer, getCellRenderer, getCellRendererOptions, ge
11
11
  export { getCookieValue, setCookieValue } from './cookie-utils.js';
12
12
  export { importCSS } from './css-utils.js';
13
13
  export { DataEditingProvider, useEditSession } from './data-editing/DataEditingProvider.js';
14
- export { fromRpcEditSessionMode, getVuuEditMessage, isInlineEditingSession, toRpcEditSessionMode } from './data-editing/edit-utils.js';
14
+ export { getVuuEditMessage, isInlineEditingSession } from './data-editing/edit-utils.js';
15
15
  export { EditButtons } from './data-editing/EditButtons.js';
16
- export { EditSession, StaleUpdateError } from './data-editing/EditSession.js';
16
+ export { EditSession, StaleUpdateError, isCopyOption } from './data-editing/EditSession.js';
17
17
  export { useEditableTable } from './data-editing/useEditableTable.js';
18
18
  export { DOWN1, DOWN2, UP1, UP2, asInteger, dataDescriptorTypeToVuuRowDataItemType, getMovingValueDirection, isValidNumber, numericTypeOfStringValue, shallowEquals, stringIsValidDecimal, stringIsValidInt, stringIsValidLong, stringIsValidNumber } from './data-utils.js';
19
19
  export { BaseDataSource, defaultSuspenseProps } from './datasource/BaseDataSource.js';
@@ -47,7 +47,7 @@ export { isModule } from './module-utils.js';
47
47
  export { uuid } from './nanoid/index.js';
48
48
  export { debounce, throttle } from './perf-utils.js';
49
49
  export { DeferredPromise } from './promise-utils.js';
50
- export { INVALID_SESSION, INVALID_TOKEN, SESSION_LIMIT_EXCEEDED, TOKEN_EXPIRED, hasViewPortContext, isActionMessage, isAddRowRpcRequest, isBeginEditSessionRpcRequest, isCreateVpSuccess, isCustomComponentActionMessage, isDeleteSelectedRowsRpcRequest, isEditCellRpcRequest, isEndEditSessionRpcRequest, isErrorMessage, isLoginErrorMessage, isLoginResponse, isNumericType, isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse, isRpcError, isRpcServiceRequest, isRpcSuccess, isSelectRequest, isSelectSuccessWithRowCount, isSessionTable, isSessionTableActionMessage, isTypeaheadRequest, isUndoRowChangeRpcRequest, isVuuMenuRpcRequest } from './protocol-message-utils.js';
50
+ export { INVALID_SESSION, INVALID_TOKEN, SESSION_LIMIT_EXCEEDED, TOKEN_EXPIRED, hasViewPortContext, isActionMessage, isAddRowRpcRequest, isBeginEditSessionRpcRequest, isCreateSessionTableRpcRequest, isCreateVpSuccess, isCustomComponentActionMessage, isDeleteSelectedRowsRpcRequest, isEditCellRpcRequest, isEndEditSessionRpcRequest, isErrorMessage, isLoginErrorMessage, isLoginResponse, isNumericType, isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse, isRpcError, isRpcServiceRequest, isRpcSuccess, isSelectRequest, isSelectSuccessWithRowCount, isSessionTable, isSessionTableActionMessage, isTypeaheadRequest, isUndoRowChangeRpcRequest, isVuuMenuRpcRequest } from './protocol-message-utils.js';
51
51
  export { NULL_RANGE, Range, WindowRange, getFullRange, rangeNewItems, withinRange } from './range-utils.js';
52
52
  export { asReactElements, createSyntheticEvent, isSimpleStateValue, useIsMounted, useStableReference } from './react-utils.js';
53
53
  export { exceedsMaxSafeInteger, roundDecimal, roundScaledDecimal } from './round-decimal.js';
@@ -72,6 +72,7 @@ const isBeginEditSessionRpcRequest = (rpcRequest) => rpcRequest.rpcName === "beg
72
72
  const isEndEditSessionRpcRequest = (rpcRequest) => rpcRequest.rpcName === "endEditSession";
73
73
  const isUndoRowChangeRpcRequest = (rpcRequest) => rpcRequest.rpcName === "undoRowChange";
74
74
  const isDeleteSelectedRowsRpcRequest = (rpcRequest) => rpcRequest.rpcName === "deleteSelectedRows";
75
+ const isCreateSessionTableRpcRequest = (rpcRequest) => rpcRequest.rpcName === "createSessionTable";
75
76
 
76
- export { INVALID_SESSION, INVALID_TOKEN, SESSION_LIMIT_EXCEEDED, TOKEN_EXPIRED, hasViewPortContext, isActionMessage, isAddRowRpcRequest, isBeginEditSessionRpcRequest, isCreateVpSuccess, isCustomComponentActionMessage, isDeleteSelectedRowsRpcRequest, isEditCellRpcRequest, isEndEditSessionRpcRequest, isErrorMessage, isLoginErrorMessage, isLoginResponse, isNumericType, isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse, isRpcError, isRpcServiceRequest, isRpcSuccess, isSelectRequest, isSelectSuccessWithRowCount, isSessionTable, isSessionTableActionMessage, isTypeaheadRequest, isUndoRowChangeRpcRequest, isVuuMenuRpcRequest };
77
+ export { INVALID_SESSION, INVALID_TOKEN, SESSION_LIMIT_EXCEEDED, TOKEN_EXPIRED, hasViewPortContext, isActionMessage, isAddRowRpcRequest, isBeginEditSessionRpcRequest, isCreateSessionTableRpcRequest, isCreateVpSuccess, isCustomComponentActionMessage, isDeleteSelectedRowsRpcRequest, isEditCellRpcRequest, isEndEditSessionRpcRequest, isErrorMessage, isLoginErrorMessage, isLoginResponse, isNumericType, isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse, isRpcError, isRpcServiceRequest, isRpcSuccess, isSelectRequest, isSelectSuccessWithRowCount, isSessionTable, isSessionTableActionMessage, isTypeaheadRequest, isUndoRowChangeRpcRequest, isVuuMenuRpcRequest };
77
78
  //# sourceMappingURL=protocol-message-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n AddRowRpcServiceRequest,\n EndEditSessionRpcServiceRequest,\n EditCellRpcServiceRequest,\n BeginEditSessionRpcServiceRequest,\n UndoRowChangeRpcServiceRequest,\n DeleteSelectedRowsRpcServiceRequest,\n ServerToClientError,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isErrorMessage = (\n message: unknown,\n): message is ServerToClientError =>\n typeof message == \"object\" &&\n (message as ServerToClientError)?.type === \"ERROR\";\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n (rpcResponse.action?.renderComponent === \"inline-form\" ||\n rpcResponse.action?.renderComponent === \"grid\")\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n\nexport const isAddRowRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is AddRowRpcServiceRequest => rpcRequest.rpcName === \"addRow\";\nexport const isEditCellRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EditCellRpcServiceRequest => rpcRequest.rpcName === \"editCell\";\nexport const isBeginEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is BeginEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"beginEditSession\";\nexport const isEndEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EndEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"endEditSession\";\nexport const isUndoRowChangeRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is UndoRowChangeRpcServiceRequest =>\n rpcRequest.rpcName === \"undoRowChange\";\nexport const isDeleteSelectedRowsRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is DeleteSelectedRowsRpcServiceRequest =>\n rpcRequest.rpcName === \"deleteSelectedRows\";\n"],"names":["componentInRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n AddRowRpcServiceRequest,\n EndEditSessionRpcServiceRequest,\n EditCellRpcServiceRequest,\n BeginEditSessionRpcServiceRequest,\n UndoRowChangeRpcServiceRequest,\n DeleteSelectedRowsRpcServiceRequest,\n CreateSessionTableRpcServiceRequest,\n ServerToClientError,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isErrorMessage = (\n message: unknown,\n): message is ServerToClientError =>\n typeof message == \"object\" &&\n (message as ServerToClientError)?.type === \"ERROR\";\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n (rpcResponse.action?.renderComponent === \"inline-form\" ||\n rpcResponse.action?.renderComponent === \"grid\")\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n\nexport const isAddRowRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is AddRowRpcServiceRequest => rpcRequest.rpcName === \"addRow\";\nexport const isEditCellRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EditCellRpcServiceRequest => rpcRequest.rpcName === \"editCell\";\nexport const isBeginEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is BeginEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"beginEditSession\";\nexport const isEndEditSessionRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is EndEditSessionRpcServiceRequest =>\n rpcRequest.rpcName === \"endEditSession\";\nexport const isUndoRowChangeRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is UndoRowChangeRpcServiceRequest =>\n rpcRequest.rpcName === \"undoRowChange\";\nexport const isDeleteSelectedRowsRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is DeleteSelectedRowsRpcServiceRequest =>\n rpcRequest.rpcName === \"deleteSelectedRows\";\nexport const isCreateSessionTableRpcRequest = (\n rpcRequest: VuuRpcServiceRequest,\n): rpcRequest is CreateSessionTableRpcServiceRequest =>\n rpcRequest.rpcName === \"createSessionTable\";\n"],"names":["componentInRegistry"],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.1.19-beta.3",
2
+ "version": "2.1.19",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "types": "types/index.d.ts",
@@ -7,14 +7,14 @@
7
7
  "@salt-ds/core": "1.54.1"
8
8
  },
9
9
  "devDependencies": {
10
- "@vuu-ui/vuu-data-types": "2.1.19-beta.3",
11
- "@vuu-ui/vuu-table-types": "2.1.19-beta.3",
12
- "@vuu-ui/vuu-filter-types": "2.1.19-beta.3",
13
- "@vuu-ui/vuu-protocol-types": "2.1.19-beta.3"
10
+ "@vuu-ui/vuu-data-types": "2.1.19",
11
+ "@vuu-ui/vuu-table-types": "2.1.19",
12
+ "@vuu-ui/vuu-filter-types": "2.1.19",
13
+ "@vuu-ui/vuu-protocol-types": "2.1.19"
14
14
  },
15
15
  "peerDependencies": {
16
16
  "@internationalized/date": "^3.0.0",
17
- "@vuu-ui/vuu-filter-parser": "2.1.19-beta.3",
17
+ "@vuu-ui/vuu-filter-parser": "2.1.19",
18
18
  "clsx": "^2.0.0",
19
19
  "react": "^19.2.3",
20
20
  "react-dom": "^19.2.3"
@@ -1,6 +1,7 @@
1
- import { DeleteRowMode, EditApi, EditSessionMode } from "@vuu-ui/vuu-data-types";
1
+ import { CopyOption, DataSource, DeleteRowMode, EditApi, EditSessionMode } from "@vuu-ui/vuu-data-types";
2
2
  import type { VuuRowDataItemType } from "@vuu-ui/vuu-protocol-types";
3
3
  import { EventEmitter } from "../event-emitter";
4
+ export declare const isCopyOption: (mode?: EditSessionMode | CopyOption) => mode is CopyOption;
4
5
  export type EditState = "clean" | "dirty" | "invalid" | "stale";
5
6
  export declare class EditError extends Error {
6
7
  }
@@ -38,7 +39,9 @@ export declare class EditSession extends EventEmitter<EditSessionEvents> {
38
39
  hasRowChanges(key: string): boolean;
39
40
  undoRowChange(key: string): Promise<void>;
40
41
  clear(): void;
41
- begin(editSessionMode?: EditSessionMode): Promise<any>;
42
+ /** @deprecated Pass a `CopyOption` ("All" | "Empty" | "Selected") to use `createSessionDataSource` instead. Long-form `EditSessionMode` values will be removed in a future release. */
43
+ begin(mode: EditSessionMode): Promise<DataSource | undefined>;
44
+ begin(mode?: CopyOption): Promise<DataSource | undefined>;
42
45
  get dataSource(): EditApi<import("@vuu-ui/vuu-data-types").DataSourceRow<VuuRowDataItemType>> | undefined;
43
46
  end(saveChanges?: boolean, force?: boolean): Promise<void>;
44
47
  get inEditMode(): boolean;
@@ -1,6 +1,4 @@
1
- import { EditSessionMode, EditSessionModeAlias, InlineEditSessionMode, StandaloneEditSessionMode } from "@vuu-ui/vuu-data-types";
1
+ import { EditSessionMode, InlineEditSessionMode } from "@vuu-ui/vuu-data-types";
2
2
  import { DataRow, RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
- export declare const toRpcEditSessionMode: (mode: EditSessionMode) => EditSessionModeAlias;
4
- export declare const fromRpcEditSessionMode: (alias: EditSessionModeAlias) => InlineEditSessionMode | StandaloneEditSessionMode;
5
3
  export declare const isInlineEditingSession: (editSessionMode: EditSessionMode) => editSessionMode is InlineEditSessionMode;
6
4
  export declare const getVuuEditMessage: (dataRow: DataRow, column: RuntimeColumnDescriptor, originalValue: string) => import("react/jsx-runtime").JSX.Element | undefined;
@@ -1,4 +1,4 @@
1
- import { DataSource, DeleteRowMode, EditSessionMode } from "@vuu-ui/vuu-data-types";
1
+ import { CopyOption, DataSource, DeleteRowMode, EditSessionMode } from "@vuu-ui/vuu-data-types";
2
2
  import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
3
  import { EditSession } from "./EditSession";
4
4
  export type EditMode = "edit" | "view";
@@ -11,7 +11,7 @@ export interface EditableTableHookProps {
11
11
  dataSource?: DataSource;
12
12
  addRowsCount?: number;
13
13
  deleteMode?: DeleteRowMode;
14
- editSessionMode?: EditSessionMode;
14
+ editSessionMode?: EditSessionMode | CopyOption;
15
15
  isEditMode: boolean;
16
16
  onCancel: () => void;
17
17
  onSave: () => void;
package/types/index.d.ts CHANGED
@@ -14,7 +14,7 @@ export * from "./css-utils";
14
14
  export { DataEditingProvider, useEditSession, } from "./data-editing/DataEditingProvider";
15
15
  export { getVuuEditMessage } from "./data-editing/edit-utils";
16
16
  export { EditButtons, type EditButtonProps } from "./data-editing/EditButtons";
17
- export { EditSession, StaleUpdateError, type EditState, } from "./data-editing/EditSession";
17
+ export { EditSession, isCopyOption, StaleUpdateError, type EditState, } from "./data-editing/EditSession";
18
18
  export { useEditableTable } from "./data-editing/useEditableTable";
19
19
  export * from "./data-utils";
20
20
  export * from "./datasource/BaseDataSource";
@@ -74,7 +74,7 @@ export { DataContext } from "./context-definitions/DataContext";
74
74
  export * from "./context-definitions/DataProvider";
75
75
  export { DataSourceProvider, useDataSource, } from "./context-definitions/DataSourceProvider";
76
76
  export * from "./context-definitions/WorkspaceContext";
77
- export { fromRpcEditSessionMode, isInlineEditingSession, toRpcEditSessionMode } from "./data-editing/edit-utils";
77
+ export { isInlineEditingSession } from "./data-editing/edit-utils";
78
78
  export { PageVisibilityObserver } from "./PageVisibilityObserver";
79
79
  export * from "./ShellContext";
80
80
  export { ThemeLoadChecker } from "./theme-utils";
@@ -1,5 +1,5 @@
1
1
  import type { MenuRpcAction, MenuRpcResponse, OpenDialogActionWithSchema, RpcResponse, TableSchema, VuuUiMessageInRequestResponse } from "@vuu-ui/vuu-data-types";
2
- import { VuuRpcMenuRequest, OpenDialogAction, VuuRpcRequest, VuuRpcResponse, VuuRpcMenuSuccess, VuuViewportRpcTypeaheadRequest, VuuRpcServiceRequest, ViewportRpcContext, OpenComponentInDialogAction, VuuLoginSuccessResponse, SelectRequest, SelectResponse, SelectSuccessWithRowCount, VuuViewportCreateSuccessResponse, VuuViewportCreateResponse, InvalidTokenReason, InvalidSessionReason, LoginErrorMessage, RpcResult, RpcResultSuccess, RpcResultError, VuuColumnDataType, VuuNumericType, AddRowRpcServiceRequest, EndEditSessionRpcServiceRequest, EditCellRpcServiceRequest, BeginEditSessionRpcServiceRequest, UndoRowChangeRpcServiceRequest, DeleteSelectedRowsRpcServiceRequest, ServerToClientError } from "@vuu-ui/vuu-protocol-types";
2
+ import { VuuRpcMenuRequest, OpenDialogAction, VuuRpcRequest, VuuRpcResponse, VuuRpcMenuSuccess, VuuViewportRpcTypeaheadRequest, VuuRpcServiceRequest, ViewportRpcContext, OpenComponentInDialogAction, VuuLoginSuccessResponse, SelectRequest, SelectResponse, SelectSuccessWithRowCount, VuuViewportCreateSuccessResponse, VuuViewportCreateResponse, InvalidTokenReason, InvalidSessionReason, LoginErrorMessage, RpcResult, RpcResultSuccess, RpcResultError, VuuColumnDataType, VuuNumericType, AddRowRpcServiceRequest, EndEditSessionRpcServiceRequest, EditCellRpcServiceRequest, BeginEditSessionRpcServiceRequest, UndoRowChangeRpcServiceRequest, DeleteSelectedRowsRpcServiceRequest, CreateSessionTableRpcServiceRequest, ServerToClientError } from "@vuu-ui/vuu-protocol-types";
3
3
  export declare const INVALID_SESSION: InvalidSessionReason;
4
4
  export declare const SESSION_LIMIT_EXCEEDED: InvalidSessionReason;
5
5
  export declare const INVALID_TOKEN: InvalidTokenReason;
@@ -40,3 +40,4 @@ export declare const isBeginEditSessionRpcRequest: (rpcRequest: VuuRpcServiceReq
40
40
  export declare const isEndEditSessionRpcRequest: (rpcRequest: VuuRpcServiceRequest) => rpcRequest is EndEditSessionRpcServiceRequest;
41
41
  export declare const isUndoRowChangeRpcRequest: (rpcRequest: VuuRpcServiceRequest) => rpcRequest is UndoRowChangeRpcServiceRequest;
42
42
  export declare const isDeleteSelectedRowsRpcRequest: (rpcRequest: VuuRpcServiceRequest) => rpcRequest is DeleteSelectedRowsRpcServiceRequest;
43
+ export declare const isCreateSessionTableRpcRequest: (rpcRequest: VuuRpcServiceRequest) => rpcRequest is CreateSessionTableRpcServiceRequest;