From 54d732119586497cece48469a5463a8103f572c1 Mon Sep 17 00:00:00 2001 From: liubihao Date: Sat, 13 Sep 2025 17:46:50 +0800 Subject: [PATCH] restore foreach with onMove. Signed-off-by: liubihao --- .gitee/CODEOWNERS | 17 ++-- .../arkui-ohos/src/component/forEach.ets | 92 ++++++++++++++----- 2 files changed, 79 insertions(+), 30 deletions(-) diff --git a/.gitee/CODEOWNERS b/.gitee/CODEOWNERS index 72ca4ce1380..9b22e81ec39 100644 --- a/.gitee/CODEOWNERS +++ b/.gitee/CODEOWNERS @@ -3140,14 +3140,6 @@ interfaces/napi/kits/text_menu_controller/ @huawei_g_five interfaces/napi/kits/utils/ @arkuiframework [Arkoala] -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/lazyForEach.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/repeat.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/LazyForEachImpl.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/LazyItemNode.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/RepeatImpl.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/DataChangeListener.ts @arkuieco3 -frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ReusablePool.ts @arkuieco3 frameworks/bridge/arkts_frontend/koala_projects/incremental/ @arkuistatemgmt frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/web.ts @arkwebinarkuireview frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/customDialogController.ts @arkuipopupwindow @@ -3466,5 +3458,14 @@ frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/ @arkui frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/framework/native/src/generated/ @arkui-idlize frameworks/core/interfaces/native/generated/ @arkui-idlize +[render-control] +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/lazyForEach.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/repeat.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/LazyForEachImpl.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/LazyItemNode.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/RepeatImpl.ets @arkuieco3 +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/base/DataChangeListener.ets @arkuieco3 + [Koala mirror] test/unittest/capi/ @huaweimaxuchu diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ets b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ets index 80e9cf013a3..034c5d10300 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ets +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/forEach.ets @@ -17,44 +17,91 @@ // HANDWRITTEN, DO NOT REGENERATE import { int32, hashCodeFromString } from '@koalaui/common' -import { memoEntry2, __context, NodeAttach } from '@koalaui/runtime' -import { InteropNativeModule } from '@koalaui/interop' +import { memoEntry2, __context, NodeAttach, remember } from '@koalaui/runtime' import { SyntaxItemPeer, ForEachNodePeer } from '../base/RepeatImpl' +import { DynamicNode, ArkCommonMethodComponent, CommonMethod, OnMoveHandler, ItemDragEventHandler } from '#generated' +import { NodeHolder } from '../base/LazyForEachImpl' + +export interface ForEachAttribute extends CommonMethod, DynamicNode { + arr: () => Array; + setForEachOptions(arr: () => Array, + /** @memo */ + itemGenerator: (item: T, index: number) => void, + keyGenerator?: (item: T, index: number) => string): this { + return this; + } + onMove(handler?: OnMoveHandler): this { + return this; + } + onMove(handler?: OnMoveHandler, eventHandler?: ItemDragEventHandler): this { + return this; + } +} + +export class ArkForEachComponent extends ArkCommonMethodComponent implements ForEachAttribute { + arr: () => Array = () => new Array(); + /** @memo */ + itemGenerator: (item: T, index: number) => void = (item: T, index: number) => {}; + keyGenerator?: (item: T, index: number) => string = undefined; + onMoveEvent?: OnMoveHandler = undefined; + itemDragEvent?: ItemDragEventHandler = undefined; + + public onMove(handler?: OnMoveHandler): this { + this.onMoveEvent = handler; + return this; + } + + public onMove(handler?: OnMoveHandler, eventHandler?: ItemDragEventHandler): this { + this.onMoveEvent = handler; + this.itemDragEvent = eventHandler; + return this; + } + + public setForEachOptions(arr: () => Array, + /** @memo */ + itemGenerator: (item: T, index: number) => void, + keyGenerator?: (item: T, index: number) => string): this { + this.arr = arr; + this.itemGenerator = itemGenerator; + this.keyGenerator = keyGenerator; + return this; + } +} + +function onMoveFromTo(moveFrom: int32, moveTo: int32): void {} /** @memo */ -export function ForEach( - arr: () => Array, +export function ForEachImpl( /** @memo */ - itemGenerator: (item: T, index: number) => void, - keyGenerator?: (item: T, index: number) => string, + style: ((attributes: ForEachAttribute) => void) | undefined ) { - if (arr === null || arr === undefined) { - InteropNativeModule._NativeLog('input array function is null or undefined error. Application error!'); - return; + const receiver = remember(() => { + return new ArkForEachComponent() + }) + style?.(receiver) + if (receiver.arr === null || receiver.arr === undefined) { + throw new Error('input array function is null or undefined error. Application error!'); } - if (typeof itemGenerator !== 'function') { - InteropNativeModule._NativeLog('item generator function missing. Application error!'); - return; + if (typeof receiver.itemGenerator !== 'function') { + throw new Error('item generator function missing. Application error!'); } - if (keyGenerator !== undefined && typeof keyGenerator !== 'function') { - InteropNativeModule._NativeLog('key generator is not a function. Application error!'); - return; + if (receiver.keyGenerator !== undefined && typeof receiver.keyGenerator !== 'function') { + throw new Error('key generator is not a function. Application error!'); } + let nodeHolder = remember(() => new NodeHolder()) /** @memo */ const createAndUpdate = (): void => { - const array: Array = arr(); + const array: Array = receiver.arr(); if (array === null || array === undefined) { - InteropNativeModule._NativeLog('input array is null or undefined error. Application error!'); - return; + throw new Error('input array is null or undefined error. Application error!'); } const length: number = array.length; - const key = (element: T, index: int32): int32 => keyGenerator - ? hashCodeFromString(keyGenerator!(element, (index as number))) - : index; + const key = (element: T, index: int32): int32 => + receiver.keyGenerator ? hashCodeFromString(receiver.keyGenerator!(element, (index as number))) : index; /** @memo */ const action = (element: T, index: int32): void => { NodeAttach(() => SyntaxItemPeer.create(), (node: SyntaxItemPeer) => { - itemGenerator(element, (index as number)); + receiver.itemGenerator(element, (index as number)); }); }; for (let i = 0; i < length; i++) { @@ -64,5 +111,6 @@ export function ForEach( } NodeAttach(() => ForEachNodePeer.create(), (node: ForEachNodePeer) => { createAndUpdate(); + nodeHolder.node = node; }); } -- Gitee