From 4ae0bbc27e22f8ddabf818ec2e9698c7f1c7bcc4 Mon Sep 17 00:00:00 2001 From: huanhuanwa <2323666215@qq.com> Date: Thu, 25 Jul 2024 10:44:21 +0800 Subject: [PATCH] fix: adjust record array --- packages/grid/src/core/utils/queries.ts | 17 +++++++++---- src/app/app.component.ts | 1 + src/app/share/apply-to-table/array-event.ts | 9 ++++--- src/app/share/apply-to-table/map-event.ts | 25 ------------------- src/app/share/apply-to-yjs/add-field.ts | 3 ++- .../share/apply-to-yjs/update-field-value.ts | 7 +++--- src/app/share/provider.ts | 2 +- src/app/share/shared.ts | 20 +++++++++------ src/app/share/utils/translate-to-table.ts | 7 +++--- 9 files changed, 42 insertions(+), 49 deletions(-) delete mode 100644 src/app/share/apply-to-table/map-event.ts diff --git a/packages/grid/src/core/utils/queries.ts b/packages/grid/src/core/utils/queries.ts index 0899feb7..ae96d4bc 100644 --- a/packages/grid/src/core/utils/queries.ts +++ b/packages/grid/src/core/utils/queries.ts @@ -14,15 +14,22 @@ export const AITableQueries = { if (!isUndefinedOrNull(fieldIndex) && fieldIndex > -1) { return [fieldIndex] as AIFieldPath; } - throw new Error(`Unable to find the path: ${JSON.stringify({ ...(field || {}), ...(record || {}) })}`); + throw new Error(`can not find the path: ${JSON.stringify({ ...(field || {}), ...(record || {}) })}`); }, getFieldValue(aiTable: AITable, path: [number, number]): any { - if (!aiTable || !aiTable.records() || !aiTable.fields()) { - throw new Error(`Cannot find a descendant at path [${path}]`); + if (!aiTable) { + throw new Error(`aiTable does not exist [${path}]`); } + if (!aiTable.records()) { + throw new Error(`aiTable has no records [${path}]`); + } + if (!aiTable.fields()) { + throw new Error(`aiTable has no fields [${path}]`); + } + const field = aiTable.fields()[path[1]]; - if(!field){ - throw new Error(`Cannot find a descendant at path [${path}]`); + if (!field) { + throw new Error(`can not find field at path [${path}]`); } return aiTable.records()[path[0]].value[field.id]; } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8aec146d..6cb876b1 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -186,6 +186,7 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy { if (!YjsAITable.isLocal(this.aiTable)) { if (!isInitialized) { const data = translateSharedTypeToTable(this.sharedType!); + console.log(123, data); this.records.set(data.records); this.fields.set(data.fields); isInitialized = true; diff --git a/src/app/share/apply-to-table/array-event.ts b/src/app/share/apply-to-table/array-event.ts index 273e1d3d..3263fc90 100644 --- a/src/app/share/apply-to-table/array-event.ts +++ b/src/app/share/apply-to-table/array-event.ts @@ -20,9 +20,9 @@ export default function translateArrayEvent(aiTable: AITable, event: Y.YEvent { - const path = [targetPath[0], offset - 1] as AIFieldValuePath; + const path = [targetPath[0], offset] as AIFieldValuePath; const fieldValue = AITableQueries.getFieldValue(aiTable, path); - // To exclude insert triggered by field inserts. + // To exclude insert triggered by field inserts. if (fieldValue !== item) { actions.push({ type: ActionName.UpdateFieldValue, @@ -36,12 +36,13 @@ export default function translateArrayEvent(aiTable: AITable, event: Y.YEvent, index) => { const data = item.toJSON(); + const [fixedField, customField] = data; actions.push({ type: ActionName.AddRecord, path: [offset + index], record: { - id: data[0], - value: translateRecord(data, aiTable.fields()) + id: fixedField[0], + value: translateRecord(customField, aiTable.fields()) } }); }); diff --git a/src/app/share/apply-to-table/map-event.ts b/src/app/share/apply-to-table/map-event.ts deleted file mode 100644 index be131685..00000000 --- a/src/app/share/apply-to-table/map-event.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ActionName, AIFieldValuePath, AITable, AITableAction, AITableQueries, Path } from '@ai-table/grid'; -import * as Y from 'yjs'; -import { toTablePath } from '../utils/translate-to-table'; - -export default function translateMapEvent(aiTable: AITable, event: Y.YEvent): AITableAction[] { - // const path = toTablePath(event.path) as AIFieldValuePath; - // if (path.length) { - // const targetSyncElement = event.target; - // const targetElement = AITableQueries.getFieldValue(aiTable, path); - // const fieldValue = targetElement; - // const keyChanges = Array.from(event.changes.keys.entries()); - // const newFieldValue = (Object).fromEntries( - // keyChanges.map(([key, info]) => [key, info.action === 'delete' ? null : targetSyncElement.get(key)]) - // ).fieldValue; - // return [ - // { - // type: ActionName.UpdateFieldValue, - // path, - // fieldValue, - // newFieldValue - // } - // ]; - // } - return [] -} diff --git a/src/app/share/apply-to-yjs/add-field.ts b/src/app/share/apply-to-yjs/add-field.ts index 811d1303..2072f839 100644 --- a/src/app/share/apply-to-yjs/add-field.ts +++ b/src/app/share/apply-to-yjs/add-field.ts @@ -11,7 +11,8 @@ export default function addField(sharedType: SharedType, action: AddFieldAction) if (records) { for (let value of records) { const newRecord = getDefaultFieldValue(action.field.type); - value.insert(path + 1, [newRecord]); + const customField = value.get(1); + customField.insert(path, [newRecord]); } } diff --git a/src/app/share/apply-to-yjs/update-field-value.ts b/src/app/share/apply-to-yjs/update-field-value.ts index 9e13a238..d7f78955 100644 --- a/src/app/share/apply-to-yjs/update-field-value.ts +++ b/src/app/share/apply-to-yjs/update-field-value.ts @@ -5,9 +5,10 @@ export default function updateFieldValue(sharedType: SharedType, action: UpdateF const records = sharedType.get('records'); if (records) { const record = records?.get(action.path[0]) as SyncArrayElement; - const index = action.path[1] + 1; - record.delete(index); - record.insert(index, [action.newFieldValue]); + const customField = record.get(1); + const index = action.path[1]; + customField.delete(index); + customField.insert(index, [action.newFieldValue]); } return sharedType; diff --git a/src/app/share/provider.ts b/src/app/share/provider.ts index 232327e8..3bd6caba 100644 --- a/src/app/share/provider.ts +++ b/src/app/share/provider.ts @@ -2,7 +2,7 @@ import { WebsocketProvider } from 'y-websocket'; import * as Y from 'yjs'; export const connectProvider = (doc: Y.Doc) => { - const provider = new WebsocketProvider('wss://demos.yjs.dev/ws', 'ai-table-demo-2024/7/24', doc); + const provider = new WebsocketProvider('wss://demos.yjs.dev/ws', 'ai-table-demo-2024/7/25', doc); provider.connect(); return provider; }; diff --git a/src/app/share/shared.ts b/src/app/share/shared.ts index 4592fdc4..800cdf46 100644 --- a/src/app/share/shared.ts +++ b/src/app/share/shared.ts @@ -33,7 +33,7 @@ export function toSharedType( sharedType.set('fields', fieldSharedType); fieldSharedType.insert(0, data.fields.map(toSyncElement)); - const recordSharedType = new Y.Array(); + const recordSharedType = new Y.Array>(); sharedType.set('records', recordSharedType); recordSharedType.insert(0, data.records.map(toRecordSyncElement)); } @@ -57,13 +57,19 @@ export function toSyncElement(node: any): SyncMapElement { return element; } -export function toRecordSyncElement(record: AITableRecord): Y.Array { - // To save memory, convert map to array. - const element = new Y.Array(); - const recordArray = [record['id']]; +export function toRecordSyncElement(record: AITableRecord): Y.Array> { + const fixedFieldArray = new Y.Array(); + fixedFieldArray.insert(0, [record['id']]); + + const customFieldArray = new Y.Array(); + const customFields = []; for (const fieldId in record['value']) { - recordArray.push(record['value'][fieldId]); + customFields.push(record['value'][fieldId]); } - element.insert(0, recordArray); + customFieldArray.insert(0, customFields); + + // To save memory, convert map to array. + const element = new Y.Array>(); + element.insert(0, [fixedFieldArray, customFieldArray]); return element; } diff --git a/src/app/share/utils/translate-to-table.ts b/src/app/share/utils/translate-to-table.ts index 881b0014..27954481 100644 --- a/src/app/share/utils/translate-to-table.ts +++ b/src/app/share/utils/translate-to-table.ts @@ -5,7 +5,7 @@ export const translateRecord = (arrayRecord: any[], fields: AITableFields) => { const fieldIds = fields.map((item) => item.id); const recordValue: Record = {}; fieldIds.forEach((item, index) => { - recordValue[item] = arrayRecord[index + 1] || ''; + recordValue[item] = arrayRecord[index] || ''; }); return recordValue; }; @@ -14,9 +14,10 @@ export const translateSharedTypeToTable = (sharedType: SharedType) => { const data = sharedType.toJSON(); const fields: AITableFields = data['fields']; const records: AITableRecords = data['records'].map((record: any) => { + const [fixedField, customField] = record; return { - id: record[0], - value: translateRecord(record, fields) + id: fixedField[0], + value: translateRecord(customField, fields) }; }); return {