@anzusystems/common-admin 1.47.0-beta.dev-1778754008 → 1.47.0-beta.dev-1782072279
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.
- package/dist/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang-CfOzQkN3.mjs +9377 -0
- package/dist/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang-CfOzQkN3.mjs.map +1 -0
- package/dist/common-admin.css +1 -1
- package/dist/common-admin.d.ts +2 -0
- package/dist/common-admin.js +1834 -1823
- package/dist/common-admin.js.map +1 -1
- package/dist/{index-CnmSBs3P.mjs → index-BvpuJJFr.mjs} +5582 -5560
- package/dist/index-BvpuJJFr.mjs.map +1 -0
- package/dist/labs.d.ts +339 -161
- package/dist/labs.js +2329 -2115
- package/dist/labs.js.map +1 -1
- package/dist/{webfontloader-BAw7I9Gb.mjs → webfontloader-DqfwVp99.mjs} +2 -2
- package/dist/{webfontloader-BAw7I9Gb.mjs.map → webfontloader-DqfwVp99.mjs.map} +1 -1
- package/package.json +11 -11
- package/dist/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang-Bkvi5ifJ.mjs +0 -9517
- package/dist/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang-Bkvi5ifJ.mjs.map +0 -1
- package/dist/index-CnmSBs3P.mjs.map +0 -1
package/dist/labs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labs.js","sources":["../src/labs/filters/AFilterWrapperSidebar.vue","../src/labs/filters/ADatatableOrdering.vue","../src/labs/filters/ADatatablePagination.vue","../src/labs/api/useApiFetchByIds.ts","../src/labs/api/useApiFetchListBatch.ts","../src/labs/job/jobApi.ts","../src/labs/filters/datatableColumns.ts","../src/labs/subjectSelect/useSubjectSelect.ts","../src/labs/subjectSelect/ASubjectSelect.vue","../src/labs/listEditor/AListEditor.vue","../src/labs/listEditor/composables/useNestedListEditor.ts","../src/labs/listEditor/composables/useDragInstruction.ts","../src/labs/listEditor/internal/LeNestedRow.vue","../src/labs/listEditor/internal/LeChangeParentDialog.vue","../src/labs/listEditor/ANestedSortableListEditor.vue","../src/labs/unsavedGuard/AUnsavedConfirmDialog.vue","../src/labs/unsavedGuard/useUnsavedChangesGuard.ts","../src/labs/listEditor/composables/useListEditorVuelidateSentinel.ts","../src/labs/listEditor/utils/tempId.ts","../src/labs/listEditor/composables/useNestedUnsavedKeys.ts"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { inject, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isUndefined } from '@/utils/common'\n\nwithDefaults(\n defineProps<{\n formName?: string\n }>(),\n {\n formName: 'search',\n },\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nprovide(FilterSubmitResetCounterKey, ref(0))\nprovide(FilterSelectedKey, ref<Map<string, ValueObjectOption<string | number>[]>>(new Map()))\n\nconst submitFilter = () => {\n emit('submit')\n}\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <slot />\n </VForm>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n SortOrder,\n} from '@/composables/system/datatableColumns'\nimport { isUndefined } from '@/utils/common'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\n\nimport type { Pagination } from '@/labs/filters/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?:\n | ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void)\n | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n },\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\nwatch(\n pagination,\n (newValue, oldValue) => {\n if (\n newValue.sortBy?.key === oldValue?.sortBy?.key &&\n newValue.sortBy?.order === oldValue?.sortBy?.order\n ) {\n return\n }\n const found = options.value.find((option) => {\n return (\n newValue.sortBy?.key === option.sortBy?.key &&\n newValue.sortBy?.order === option.sortBy?.order\n )\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-body-small mr-1\">\n {{ t('common.system.datatable.ordering.title') }}:\n </div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n class=\"text-medium-emphasis\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { useDatatablePageStore } from '@/composables/system/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n },\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page === lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page === lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\nwatch(\n () => pagination.value.rowsPerPage,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n pagination.value.page = 1\n emit('change')\n }\n },\n)\n\nwatch(\n () => pagination.value.page,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n setStoredPage(newValue)\n emit('change')\n }\n },\n)\n\nconst onClickFirst = useThrottleFn(() => {\n pagination.value.page = 1\n}, 300)\n\nconst onClickLast = useThrottleFn(() => {\n pagination.value.page = lastPage.value\n}, 300)\n\nconst onClickPrev = useThrottleFn(() => {\n pagination.value.page = pagination.value.page - 1\n}, 300)\n\nconst onClickNext = useThrottleFn(() => {\n pagination.value.page = pagination.value.page + 1\n}, 300)\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }}\n {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n","import {\n AnzuApiResponseCodeError,\n isAnzuApiResponseCodeError,\n} from '@/model/error/AnzuApiResponseCodeError'\nimport {\n AnzuApiValidationError,\n axiosErrorResponseHasValidationData,\n} from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosRequestConfig } from 'axios'\nimport {\n AnzuApiForbiddenError,\n axiosErrorResponseIsForbidden,\n} from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport type { AxiosClientFn } from '@/labs/api/client'\nimport { useApiQueryBuilder } from '@/labs/api/useApiQueryBuilder'\n\nexport type UseApiFetchByIdsParams = {\n client: AxiosClientFn\n system: string\n entity: string\n urlTemplate?: string\n urlParams?: UrlParams\n options?: AxiosRequestConfig\n isSearchApi?: boolean\n field?: string\n silentConsoleError?: boolean\n}\n\nexport type FetchByIdsParams = {\n urlTemplate?: string\n urlParams?: UrlParams\n}\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nconst generateByIdsApiQuery = (\n ids: IntegerId[] | DocId[],\n isSearchApi: boolean,\n field = 'id',\n): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, queryAddFilter, queryAdd } =\n useApiQueryBuilder()\n const limit = ids.length // todo add batch fetch\n querySetLimit(limit)\n querySetOffset(1, limit)\n querySetOrder(field, false)\n if (isSearchApi) queryAdd(field, ids.join(','))\n else queryAddFilter('in', field, ids.join(','))\n\n return queryBuild()\n}\n\nexport const useApiFetchByIds = <R>(\n params: UseApiFetchByIdsParams,\n): UseApiFetchByIdsReturnType<R> => {\n const {\n client,\n system,\n entity,\n urlTemplate,\n urlParams,\n options = {},\n isSearchApi = false,\n field = 'id',\n silentConsoleError = false,\n } = params\n\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n ids: DocId[] | IntegerId[],\n fetchParams: FetchByIdsParams = {},\n ): Promise<R> => {\n abortController = new AbortController()\n\n const { urlTemplate: urlTemplateOverride, urlParams: urlParamsOverride } = fetchParams\n\n try {\n const resolvedParams = isDefined(urlParamsOverride) ? urlParamsOverride : urlParams\n const template = isDefined(urlTemplateOverride) ? urlTemplateOverride : urlTemplate\n if (isUndefined(template)) throw new Error('Url template is undefined')\n const url =\n (isUndefined(resolvedParams) ? template : replaceUrlParameters(template, resolvedParams)) +\n generateByIdsApiQuery(ids, isSearchApi, field)\n\n const res = await client().get(url, {\n ...options,\n signal: abortController.signal,\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data?.data) {\n return res.data.data as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err, err.config?.url)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n if (!silentConsoleError)\n console.error('Axios error: ' + urlTemplate, ...(err.cause ? [err.cause] : []))\n throw new AnzuApiAxiosError(err)\n }\n\n if (!silentConsoleError) console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchByIdsReturnType<R> = {\n executeFetch: (ids: DocId[] | IntegerId[], params?: FetchByIdsParams) => Promise<R>\n abortFetch: () => void\n}\n","import {\n AnzuApiResponseCodeError,\n isAnzuApiResponseCodeError,\n} from '@/model/error/AnzuApiResponseCodeError'\nimport {\n AnzuApiValidationError,\n axiosErrorResponseHasValidationData,\n} from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosRequestConfig } from 'axios'\nimport {\n AnzuApiForbiddenError,\n axiosErrorResponseIsForbidden,\n} from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport type { ApiInfiniteResponseList, ApiResponseList } from '@/types/ApiResponse'\nimport { isApiInfiniteResponseList, isApiResponseList } from '@/types/ApiResponse'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport { generateListQuery } from '@/labs/api/useApiFetchList'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport type { FilterConfig, FilterData } from '@/labs/filters/filterFactory'\nimport { ref } from 'vue'\nimport { usePagination } from '@/labs/filters/pagination'\nimport { SortOrder } from '@/composables/system/datatableColumns'\nimport type { AxiosClientFn } from '@/labs/api/client'\n\nexport type UseApiFetchListBatchParams = {\n client: AxiosClientFn\n system: string\n entity: string\n urlTemplate?: string\n urlParams?: UrlParams\n options?: AxiosRequestConfig\n silentConsoleError?: boolean\n}\n\nexport type FetchListBatchParams = {\n urlTemplate?: string\n urlParams?: UrlParams\n sortBy?: string\n sortDesc?: boolean\n batchSize?: number\n forceElastic?: boolean\n}\n\nexport const useApiFetchListBatch = <R>(\n params: UseApiFetchListBatchParams,\n): UseApiFetchListBatchReturnType<R> => {\n const {\n client,\n system,\n entity,\n urlTemplate,\n urlParams,\n options = {},\n silentConsoleError = false,\n } = params\n\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n fetchParams: FetchListBatchParams = {},\n ): Promise<R> => {\n abortController = new AbortController()\n\n const {\n urlTemplate: urlTemplateOverride,\n urlParams: urlParamsOverride,\n sortBy = 'id',\n sortDesc = true,\n batchSize = 100,\n forceElastic = false,\n } = fetchParams\n\n try {\n const searchApi = filterConfig.general.elastic || forceElastic ? '/search' : ''\n const resolvedParams = isDefined(urlParamsOverride) ? urlParamsOverride : urlParams\n const template = isDefined(urlTemplateOverride) ? urlTemplateOverride : urlTemplate\n if (isUndefined(template)) throw new Error('Url template is undefined')\n const { pagination } = usePagination(sortBy, sortDesc ? SortOrder.Desc : SortOrder.Asc, {\n rowsPerPage: batchSize,\n })\n const url =\n (isUndefined(resolvedParams) ? template : replaceUrlParameters(template, resolvedParams)) +\n searchApi\n const results = [] as unknown as R\n\n // First page request\n const res = await client().get(\n url + generateListQuery(pagination, filterData, filterConfig),\n {\n ...options,\n signal: abortController.signal,\n },\n )\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n // @ts-ignore\n results.push(...resData.data)\n\n if (isApiInfiniteResponseList(resData)) {\n pagination.value.hasNextPage = resData.hasNextPage\n\n // Handle pagination for infinite lists\n while (pagination.value.hasNextPage) {\n pagination.value.page++\n const nextPageResponse = await client().get(\n url + generateListQuery(pagination, filterData, filterConfig),\n {\n ...options,\n signal: abortController.signal,\n },\n )\n const nextPageData = nextPageResponse.data\n // @ts-ignore\n results.push(...nextPageData.data)\n pagination.value.hasNextPage = nextPageData.hasNextPage\n }\n } else if (isApiResponseList(resData)) {\n pagination.value.totalCount = resData.totalCount\n\n if (pagination.value.totalCount <= pagination.value.rowsPerPage) {\n return results as R\n }\n\n // Handle pagination for regular lists - fetch all remaining pages in parallel\n const promises: Promise<any>[] = []\n const numPages = Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n\n for (let i = 1; i < numPages; i++) {\n // Start from 1 since we already fetched page 0\n const pageCopy = { ...pagination.value, page: i + 1 }\n const paginationRef = ref(pageCopy)\n promises.push(\n client().get(url + generateListQuery(paginationRef, filterData, filterConfig), {\n ...options,\n signal: abortController.signal,\n }),\n )\n }\n\n const allResponses = await Promise.all(promises)\n allResponses.forEach((pageResponse) => {\n // @ts-ignore\n results.push(...pageResponse.data.data)\n })\n }\n\n return results as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err, err.config?.url)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n if (!silentConsoleError)\n console.error('Axios error: ' + urlTemplate, ...(err.cause ? [err.cause] : []))\n throw new AnzuApiAxiosError(err)\n }\n\n if (!silentConsoleError) console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchListBatchReturnType<R> = {\n executeFetch: (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n params?: FetchListBatchParams,\n ) => Promise<R>\n abortFetch: () => void\n}\n","import type { AxiosInstance } from 'axios'\nimport type { JobBase } from '@/types/Job'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiDeleteOne } from '@/services/api/apiDeleteOne'\nimport { stringToKebabCase } from '@/utils/string'\nimport { useApiFetchList } from '@/labs/api/useApiFetchList'\n\nconst END_POINT = '/adm/v1/job'\nexport const ENTITY = 'job'\n\nexport function useJobApi<JobType extends JobBase = JobBase>(\n client: () => AxiosInstance,\n system: string,\n) {\n const useFetchJobList = () =>\n useApiFetchList<JobType[]>({ client, system, entity: ENTITY, urlTemplate: END_POINT })\n\n const fetchJob = (id: number) =>\n apiFetchOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n const createJob = (data: JobType) => {\n const type = stringToKebabCase(data._resourceName)\n .slice(4) // remove \"job-\" prefix\n .replace('-kind-', '-kind/') // replace \"-kind-\" with \"-kind/\" if the needle is found\n\n return apiCreateOne<JobType>(client, data, END_POINT + '/:type', { type }, system, ENTITY)\n }\n\n const deleteJob = (id: number) =>\n apiDeleteOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n return {\n useFetchJobList,\n fetchJob,\n createJob,\n deleteJob,\n }\n}\n","import {\n type ColumnConfig,\n type ColumnInternalValues,\n DATETIME_AUTO_LABEL_TRACKING,\n type StoredData,\n} from '@/composables/system/datatableColumns'\nimport { computed, onMounted, type Ref, watch } from 'vue'\nimport { i18n } from '@/plugins/i18n'\nimport { isArray, isBoolean, isObject, isString, isUndefined } from '@/utils/common'\n\nconst defaultColumn: ColumnInternalValues = {\n key: '',\n title: undefined,\n sortable: false,\n fixed: false,\n}\n\ninterface DatatableColumnsConfigMoreOptions {\n storeColumnsLocalStorage: string | boolean // false to disable, string to override store key\n disableActions: boolean\n customI18n: any\n showExpand: boolean\n}\n\nconst DatatableColumnsConfigMoreOptionsDefault = {\n storeColumnsLocalStorage: true,\n disableActions: false,\n customI18n: undefined,\n showExpand: false,\n}\n\nexport function createDatatableColumnsConfig(\n config: ColumnConfig[],\n columnsHidden: Ref<Array<string>>,\n system: string,\n subject: string,\n moreOptions: Partial<DatatableColumnsConfigMoreOptions> = {},\n) {\n const options = { ...DatatableColumnsConfigMoreOptionsDefault, ...moreOptions }\n const localI18n = options.customI18n ?? i18n\n const { t } = localI18n.global || localI18n\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeColumnsLocalStorage)) {\n storeKey = options.storeColumnsLocalStorage\n } else if (\n isBoolean(options.storeColumnsLocalStorage) &&\n true === options.storeColumnsLocalStorage\n ) {\n storeKey = 'table_' + system + '_' + subject\n }\n\n const columnsAll = config.map((item) => {\n const obj = { ...defaultColumn, ...item }\n if (!isUndefined(obj.title)) {\n // do not modify\n } else if (isUndefined(obj.title) && DATETIME_AUTO_LABEL_TRACKING.includes(obj.key)) {\n obj.title = t('common.model.tracking.' + obj.key)\n } else if (isUndefined(obj.title) && system && subject) {\n obj.title = t(system + '.' + subject + '.model.' + obj.key)\n } else {\n obj.title = ''\n }\n return obj\n })\n\n const columnsVisible = computed(() => {\n const columns: any = []\n if (options.showExpand) columns.push({ key: 'data-table-expand', sortable: false })\n columnsAll.forEach((column) => {\n if (!columnsHidden.value.includes(column.key)) {\n columns.push(column)\n }\n })\n if (!options.disableActions) columns.push({ key: 'actions', sortable: false, fixed: 'end' })\n return columns\n })\n\n const loadStoredColumns = () => {\n if (!storeKey || !localStorage) return\n const stored = localStorage.getItem(storeKey)\n if (!stored) return\n const storedData = JSON.parse(stored) as StoredData\n if (!isObject(storedData)) return\n if (!isArray(storedData.hidden)) return\n columnsHidden.value = storedData.hidden as string[]\n }\n\n const storeColumns = (columns: string[]) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, JSON.stringify({ hidden: columns }))\n }\n\n onMounted(() => {\n loadStoredColumns()\n })\n\n watch(columnsHidden, (newValue) => {\n storeColumns(newValue)\n })\n\n return {\n columnsAll,\n columnsVisible,\n columnsHidden,\n }\n}\n","import {\n type DatatableOrderingOption,\n type DatatableSortBy,\n} from '@/composables/system/datatableColumns'\nimport type { Ref } from 'vue'\nimport { ref } from 'vue'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { type FilterConfig, type FilterData, useFilterHelpers } from '@/labs/filters/filterFactory'\nimport { createDatatableColumnsConfig } from '@/labs/filters/datatableColumns'\nimport { type Pagination, usePagination } from '@/labs/filters/pagination'\nimport type { FetchListParams } from '@/labs/api/useApiFetchList'\nimport { useDebounceFn } from '@vueuse/core'\nimport { isNull } from '@/utils/common'\n\nexport function useSubjectSelect<TItem>(\n datatableConfig: any,\n datatableHiddenColumns: any,\n system: string,\n subject: string,\n executeFetch: (\n pagination: Ref<Pagination>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n params?: FetchListParams,\n ) => Promise<TItem[]>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n filterSortBy: DatatableSortBy | null = null,\n fetchParams: FetchListParams | undefined = undefined,\n enableActions: boolean = false,\n) {\n const filterTouched: Ref<boolean> = ref(false)\n const items: Ref<Array<TItem>> = ref([])\n const selected: Ref<Array<TItem>> = ref([])\n const loading = ref(false)\n const { pagination, setSortBy, incrementPage } = usePagination(\n isNull(filterSortBy) ? null : filterSortBy.key,\n filterSortBy?.order,\n )\n\n const { resetFilter, submitFilter } = useFilterHelpers(filterData, filterConfig, {\n storeFiltersLocalStorage: false,\n populateUrlParams: false,\n })\n const { showErrorsDefault } = useAlerts()\n\n const { columnsVisible, columnsAll, columnsHidden } = createDatatableColumnsConfig(\n datatableConfig,\n datatableHiddenColumns,\n system,\n subject,\n { storeColumnsLocalStorage: false, disableActions: !enableActions },\n )\n\n const onOpen = () => {\n resetState()\n getListDebounced()\n }\n\n const sortByChange = (option: DatatableOrderingOption) => {\n setSortBy(option.sortBy)\n getListDebounced()\n }\n\n const onFetchNextPage = async () => {\n loading.value = true\n incrementPage()\n try {\n const res = (await executeFetch(pagination, filterData, filterConfig, fetchParams)) as TItem[]\n items.value.push(...res)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const resetState = () => {\n items.value = []\n selected.value = []\n }\n\n const getList = async () => {\n loading.value = true\n try {\n items.value = (await executeFetch(\n pagination,\n filterData,\n filterConfig,\n fetchParams,\n )) as TItem[]\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const getListDebounced = useDebounceFn(async () => {\n await getList()\n })\n\n const onRowClick = (event: Event) => {\n const eventTarget = event.target as HTMLElement | null\n if (\n !eventTarget ||\n (eventTarget.tagName === 'INPUT' && (eventTarget as HTMLInputElement).type === 'checkbox')\n ) {\n return\n }\n const parent = eventTarget.closest('.v-data-table__tr')\n if (!parent || !parent.classList.contains('v-data-table__tr')) return\n const firstTd = parent.firstElementChild\n if (!firstTd || !firstTd.classList.contains('v-data-table__td')) return\n const input = firstTd.querySelector('input')\n if (!input) return\n input.click()\n }\n\n return {\n items,\n selected,\n pagination,\n columnsVisible,\n columnsHidden,\n columnsAll,\n filterTouched,\n loading,\n onRowClick,\n onFetchNextPage,\n onOpen,\n sortByChange,\n getList: getListDebounced,\n resetFilter: () => resetFilter(pagination, getListDebounced),\n submitFilter: () => submitFilter(pagination, getListDebounced),\n }\n}\n","<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/labs/filters/pagination'\nimport ADatatablePagination from '@/labs/filters/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/labs/filters/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n },\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'onOpen'): void\n (e: 'onPageChange'): void\n (e: 'onConfirm', data: Array<TItem>): void\n (e: 'onFetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('onOpen')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'onConfirm',\n props.selectedItems.map((item) => toRaw(item)),\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('onFetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('onPageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) &&\n paginationComputed.value.page === lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\nonMounted(() => {\n if (props.autoOpen) {\n onOpen()\n }\n})\n\ndefineExpose({\n open: onOpen,\n closeSidebarOnMobile,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar system-border-b\"\n @on-cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"system-border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar system-border-r\">\n <div class=\"subject-select-filter\">\n <slot name=\"filter\" />\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions system-border-t\">\n <div v-if=\"minCount === maxCount\">\n {{\n t('common.subjectSelect.texts.pickExactCount', {\n count: minCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: minCount,\n maxCount: maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, provide, ref, useSlots, useTemplateRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport { useValidationRegistry } from '@/labs/listEditor/composables/useValidationRegistry'\nimport { ListEditorUnsavedKeysKey } from '@/labs/listEditor/composables/useListEditorItemValidation'\nimport { useListEditor } from '@/labs/listEditor/composables/useListEditor'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedKeysSync } from '@/labs/listEditor/composables/useUnsavedKeysSync'\nimport { useUnsavedSection } from '@/labs/unsavedGuard/useUnsavedSection'\nimport { useDirtyBaseline } from '@/labs/listEditor/composables/useDirtyBaseline'\nimport { useDeleteDialog } from '@/labs/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/labs/listEditor/composables/useInlineEditing'\nimport LeDeleteDialog from '@/labs/listEditor/internal/LeDeleteDialog.vue'\nimport LeEmptyState from '@/labs/listEditor/internal/LeEmptyState.vue'\nimport LeUnsavedLabel from '@/labs/listEditor/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n ListViewItem,\n PositionHint,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface DecoratedViewItem<T> extends ListViewItem<T> {\n editing: boolean\n expanded: boolean\n loading: boolean\n dirty: boolean\n}\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (data: TItem) => TItem[]\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedViewItem<TItem> & { validationState: ListEditorValidationState }\n raw: TItem\n index: number\n key: ListEditorKey\n readonly: boolean\n disabled: boolean\n expanded: boolean\n editing: boolean\n dirty: boolean\n /** Aliases `dirty` here (no reorder mode → no `moved` to OR). Same field name as on sortable/nested variants. */\n unsaved: boolean\n touch: boolean\n actions: RowActions<TItem>\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\nexport interface HeaderSlotProps {\n title: string | null\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n keyField?: string\n positionField?: string\n positionMultiplier?: number\n updatePosition?: boolean\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n title?: string | null\n\n compactField?: string | null\n statusField?: string | null\n twoRows?: 'never' | 'mobile' | 'always'\n chips?: boolean\n\n showAddButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n\n addLabel?: string | null\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /** Disable unsaved-state tracking — no dirty markers, never feeds `unsaved-keys`. */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n /**\n * Render every row's `#item` slot expanded by default — no edit pencil, no\n * inline Save/Cancel footer, no row-click toggle. Use when the editor has\n * no reorder affordance and the consumer wants all forms visible at once\n * (e.g. ThirdPartyTracker, bookmarks dialog).\n */\n defaultExpanded?: boolean\n\n loadingKeys?: Set<ListEditorKey> | null\n\n getValidationState?: (item: TItem, key: ListEditorKey, index: number) => ListEditorValidationState\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n\n /**\n * Editor-managed add: the add button and \"add after this item\" insert\n * `itemFactory()` into the model directly (positions renumbered when\n * `update-position` is on) and emit `added` — the `add` event does NOT fire,\n * so no consumer push handler is needed.\n */\n itemFactory?: () => TItem\n /**\n * Editor-managed delete: a confirmed delete removes the row from the model\n * itself. `deleted` still fires as a notification — consumers keep side\n * effects but must not splice the model themselves.\n */\n manageDelete?: boolean\n /**\n * Registers this editor as a named unsaved-changes section under the given\n * (already translated) label — replaces the per-consumer `useUnsavedSection`\n * call for the common one-editor case.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n keyField: 'id',\n positionField: 'position',\n positionMultiplier: 1,\n updatePosition: false,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n twoRows: 'never',\n chips: false,\n showAddButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n closeVariant: 'auto',\n defaultExpanded: false,\n loadingKeys: null,\n getValidationState: undefined,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n itemFactory: undefined,\n manageDelete: false,\n unsavedSectionLabel: undefined,\n})\n\nconst emit = defineEmits<{\n add: [positionHint: PositionHint | undefined]\n added: [payload: { item: TItem; index: number }]\n edit: [item: ListViewItem<TItem>]\n deleted: [item: ListViewItem<TItem>]\n close: [item: ListViewItem<TItem>]\n 'item-saved': [item: ListViewItem<TItem>]\n 'item-expand': [item: ListViewItem<TItem>, expanded: boolean]\n}>()\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst modelValue = defineModel<TItem[]>({ required: true })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst editor = useListEditor<TItem>(modelValue, {\n keyField: props.keyField,\n positionField: props.positionField,\n positionMultiplier: props.positionMultiplier,\n updatePosition: props.updatePosition,\n})\n\nconst expandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst isInlineEdit = computed(() => !props.chips && !!slots.item)\nconst hasReadonlyDetail = computed(() => !props.chips && !!slots['item-readonly'])\n\n// Initial snapshot of each item, keyed by row key. Compared against current data to\n// detect \"dirty\" (unsaved) rows. Reset externally after a successful parent-form save.\nconst { captureDirtyBaseline, rebaselineKey, isItemDirty, ignoreNextSourceChange } =\n useDirtyBaseline<TItem>(\n () =>\n modelValue.value.map((item) => ({\n key: item[props.keyField] as ListEditorKey,\n data: item,\n })),\n { source: modelValue },\n )\n\nconst {\n editingKeys,\n editingSnapshots,\n beginEdit,\n cancelEdit,\n commitEdit,\n closeEdit,\n requestAutoOpen,\n clearEditing,\n} = useInlineEditing<TItem, ListViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row',\n isInlineEdit,\n restoreSnapshot: (key, data) => editor.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => it[props.keyField] as ListEditorKey),\n findEntry: (key) => {\n const hit = modelValue.value.find((it) => (it[props.keyField] as ListEditorKey) === key)\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n})\n\nconst addLabelResolved = computed(() =>\n props.addLabel ? t(props.addLabel) : t('common.sortable.add'),\n)\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(\n () => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'),\n)\nconst deleteConfirmTextResolved = computed(\n () => props.deleteConfirmText ?? t('common.sortable.deleteConfirmText'),\n)\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canAdd = computed(() => canInteract.value && props.showAddButton)\n\nconst headerVisible = computed(() => !!(props.title || slots.header))\n\n// Per-row edit footer (Save + Cancel) is only meaningful if the consumer wants a\n// per-item persist callback. Without it the expectation is that the parent form's\n// global save flushes everything, so we hide the per-row buttons by default.\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\n// Decoupled dirty pass: depends only on modelValue (via stringifyContent\n// reading nested fields) and dirtyBaseline. Editing/expanded/loading flag\n// changes do NOT re-trigger this — viewItemsDecorated reads dirtyKeys.has()\n// instead of calling isItemDirty inline, so we avoid stringifying every\n// row whenever the user clicks edit on one row.\nconst dirtyKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const item of modelValue.value) {\n const key = item[props.keyField] as ListEditorKey\n if (isItemDirty(key, item)) out.add(key)\n }\n return out\n})\n\n// Per-key decorator cache: we reuse the cached object when its base view item\n// AND every flag matches, giving slot consumers a stable reference for rows\n// whose state didn't change. Saves allocation on every render where only one\n// row's flag flipped.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const next: DecoratedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of editor.viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = expandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n const dirty = props.disableUnsaved ? false : dirtyKeys.value.has(vi.key)\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.loading === loading &&\n cached.dirty === dirty\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => viewItemsDecorated.value.length === 0)\n\nconst findVi = (key: ListEditorKey): DecoratedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() => viewItemsDecorated.value.map((vi) => ({ key: vi.key }))),\n variant: 'flat',\n isReorderMode: ref(false),\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n})\n\nconst resolveCompactText = (raw: TItem): string =>\n resolveCompactTextUtil(raw, { compactField: props.compactField })\n\nconst { resolveValidation } = useValidationRegistry<TItem>({\n getValidationState: (item, key, index) => props.getValidationState?.(item, key, index) ?? null,\n})\n\n// Managed add (itemFactory): the editor inserts the item itself; finalize\n// renumbers positions when update-position is on, possibly replacing the\n// inserted object — locate it by key and emit the finalized one.\nconst addViaFactory = (positionHint?: PositionHint): void => {\n const item = props.itemFactory!()\n // The editor writes the model by reassignment; without this, the dirty\n // baseline's initial-fill watch would treat the FIRST add into an\n // empty-at-mount list as async data landing and baseline it (the new row\n // would never read as unsaved/invalid).\n ignoreNextSourceChange()\n const result = editor.addItem(item, positionHint)\n const index = result.findIndex(\n (x) => (x[props.keyField] as ListEditorKey) === (item[props.keyField] as ListEditorKey),\n )\n emit('added', { item: (index === -1 ? item : result[index]) as TItem, index })\n}\n\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n if (props.itemFactory) {\n addViaFactory()\n return\n }\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n if (props.itemFactory) {\n addViaFactory({ afterId: vi.key })\n return\n }\n emit('add', { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n // Toggle: clicking edit while already editing closes the form, matching the\n // row-header click behaviour.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n expandedKeys.value.delete(vi.key)\n }\n emit('edit', vi)\n}\n\nconst onExpandClick = (vi: ListViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currentlyExpanded = expandedKeys.value.has(key)\n if (currentlyExpanded) {\n expandedKeys.value.delete(key)\n } else {\n for (const k of expandedKeys.value) expandedKeys.value.delete(k)\n expandedKeys.value.add(key)\n }\n emit('item-expand', vi, !currentlyExpanded)\n}\n\nconst isRowClickable = (vi: DecoratedViewItem<TItem>): boolean => {\n if (props.chips) return false\n if (props.disableRowClick) return false\n if (props.defaultExpanded) return false\n if (props.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) {\n onExpandClick(vi)\n } else {\n onEditClick(vi)\n }\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, ListViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(vi.key)\n if (props.manageDelete) {\n ignoreNextSourceChange()\n editor.deleteItem(vi.key)\n }\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm || props.chips,\n})\n\nconst onDeleteClick = async (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\nconst onSaveClick = async (vi: ListViewItem<TItem>) => {\n if (props.onItemSave) {\n await props.onItemSave(vi.raw)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: ListViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: ListViewItem<TItem>) => {\n closeEdit(vi)\n expandedKeys.value.delete(vi.key)\n emit('close', vi)\n}\n\n// Per-key actions cache: each row's `actions` bundle is allocated once and\n// reused on every render. Slot consumers receive a stable identity for\n// `actions.update` etc., so they don't see prop-ref churn that would\n// trigger spurious re-renders. Closures capture the row key (stable) and\n// look up the current decorator via `findVi(key)` on call.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (data: TItem) => TItem[]\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n if (vi) return onSaveClick(vi)\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onExpandClick(vi)\n },\n update: (data: TItem) => editor.updateItem(key, data),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\n// Garbage-collect cache entries for keys that have left the model.\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n },\n)\n\nconst buildSlotProps = (vi: DecoratedViewItem<TItem>) => ({\n item: { ...vi, validationState: resolveValidation(vi.raw as TItem, vi.key, vi.index) },\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n editing: vi.editing || props.defaultExpanded,\n dirty: vi.dirty,\n unsaved: vi.dirty,\n touch: isTouch.value,\n actions: getActions(vi.key),\n})\n\nconst unsavedKeysModel = defineModel<Set<ListEditorKey>>('unsavedKeys', {\n default: () => new Set<ListEditorKey>(),\n})\n\nconst internalUnsavedKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const vi of viewItemsDecorated.value) {\n if (vi.dirty) out.add(vi.key)\n }\n return out\n})\n// Let row validity sentinels surface 'invalid' as soon as their row is unsaved.\n// Includes each unsaved row's id/position too, so the lookup matches whatever\n// key the sentinel registers under (which may differ from the editor's key-field).\nconst unsavedValidationKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const vi of viewItemsDecorated.value) {\n if (!vi.dirty) continue\n out.add(vi.key)\n const raw = vi.raw as Record<string, any>\n if (raw.id !== undefined && raw.id !== null) out.add(raw.id)\n if (raw.position !== undefined && raw.position !== null) out.add(raw.position)\n }\n return out\n})\nprovide(ListEditorUnsavedKeysKey, unsavedValidationKeys)\n\nconst { hasUnsavedChanges, unsavedCount, clearUnsavedState } = useUnsavedKeysSync({\n unsavedKeysModel,\n internalUnsavedKeys,\n onClearAll: () => {\n captureDirtyBaseline()\n // Collapse open inline-edit forms once the parent persisted — the rows are\n // saved, so leaving them in edit mode would be stale.\n clearEditing()\n },\n onClearKey: (key) => rebaselineKey(key),\n})\n\n// Registers this editor as a named unsaved-changes section when the consumer\n// passes a label — replaces the per-consumer useUnsavedSection boilerplate.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel\n ? { label: props.unsavedSectionLabel, dirty: unsavedCount.value > 0 }\n : [],\n)\n\ndefineExpose({\n addItem: editor.addItem,\n deleteItem: editor.deleteItem,\n updateItem: editor.updateItem,\n moveItem: editor.moveItem,\n recalculatePositions: editor.recalculatePositions,\n viewItems: editor.viewItems,\n resetDirtyBaseline: captureDirtyBaseline,\n hasUnsavedChanges,\n unsavedCount,\n clearUnsavedState,\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-list-editor\"\n :class=\"[\n `a-list-editor--two-rows-${twoRows}`,\n {\n 'a-list-editor--readonly': readonly,\n 'a-list-editor--disabled': disabled,\n 'a-list-editor--touch': isTouch,\n 'a-list-editor--chips': chips,\n },\n ]\"\n >\n <div\n ref=\"rowsContainer\"\n class=\"a-le-card\"\n >\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <template v-else>\n <div\n v-for=\"vi in viewItemsDecorated\"\n :key=\"String(vi.key)\"\n :data-id=\"String(vi.key)\"\n role=\"listitem\"\n :tabindex=\"keyboardNav.rowTabindex(vi.key)\"\n class=\"a-le-row\"\n :class=\"{\n 'a-le-row--two-rows': twoRows === 'always',\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.dirty,\n 'a-le-row--clickable': isRowClickable(vi),\n [`a-le-row--validation-${resolveValidation(vi.raw, vi.key, vi.index)}`]:\n resolveValidation(vi.raw, vi.key, vi.index) !== null,\n }\"\n @keydown=\"keyboardNav.handleKeydown(vi.key, $event)\"\n >\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n\n <div\n class=\"a-le-row-header\"\n @click=\"onRowClick(vi)\"\n >\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span class=\"a-le-title\">\n {{ resolveCompactText(vi.raw) }}\n </span>\n </slot>\n <LeUnsavedLabel\n v-if=\"vi.dirty\"\n :dot-only=\"chips\"\n />\n </div>\n\n <div\n v-if=\"!chips\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span\n v-if=\"statusField && vi.raw[statusField] != null && vi.raw[statusField] !== ''\"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <VBtn\n v-if=\"chips && showDeleteButton && canInteract\"\n icon\n size=\"x-small\"\n variant=\"text\"\n density=\"compact\"\n :active=\"false\"\n class=\"a-le-action a-le-action--chip-close\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-close\"\n size=\"14\"\n />\n </VBtn>\n <template v-else>\n <VBtn\n v-if=\"showEditButton && canInteract && !defaultExpanded\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showAddAfterAction && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem @click=\"onRowAddAfterClick(vi)\">\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <template v-if=\"(vi.editing || defaultExpanded) && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <div\n v-if=\"showInlineSaveFooter && !defaultExpanded\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"$slots['item-readonly'] && (readonly || vi.expanded)\"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </template>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use './styles/tokens';\n@use './styles/shared';\n\n// Variant-specific rules, scoped under the AListEditor root.\n.a-list-editor {\n // Chips — row-header padding (12 px left for the flat variant vs 8 px in\n // sortable, which reserves room for the drag handle).\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 12px;\n gap: 4px;\n min-height: 28px;\n }\n}\n\n// Narrow-container / mobile layout — taller rows, always-visible actions,\n// status badge dropped to make room.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-list-editor {\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n","import { computed, type ComputedRef, type Ref } from 'vue'\nimport { cloneDeep, isUndefined } from '@/utils/common'\nimport type {\n ListEditorKey,\n ListViewItem,\n NestedTree,\n NestedTreeNode,\n PositionHint,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface NestedViewItem<TItem> extends ListViewItem<TItem> {\n node: NestedTreeNode<TItem>\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n siblingIndex: number\n siblingCount: number\n firstInParent: boolean\n lastInParent: boolean\n canAddChild: boolean\n canIndent: boolean\n canOutdent: boolean\n}\n\nexport interface UseNestedListEditorOptions {\n keyField?: string\n positionField?: string\n parentField?: string\n positionMultiplier?: number\n maxDepth: number\n expandedKeys?: Ref<Set<ListEditorKey>>\n}\n\nexport interface NestedListEditorApi<TItem extends Record<string, any>> {\n viewItems: ComputedRef<NestedViewItem<TItem>[]>\n findNode: (id: ListEditorKey) => {\n node: NestedTreeNode<TItem> | null\n parent: NestedTreeNode<TItem> | null\n }\n addItem: (\n data: TItem,\n hint?: PositionHint & {\n parentId?: ListEditorKey | null\n asFirstChild?: boolean\n childrenAllowed?: boolean\n },\n ) => NestedTree<TItem>\n deleteItem: (id: ListEditorKey) => NestedTree<TItem>\n updateItem: (id: ListEditorKey, data: TItem, markDirty?: boolean) => NestedTree<TItem>\n moveUp: (id: ListEditorKey) => NestedTree<TItem> | null\n moveDown: (id: ListEditorKey) => NestedTree<TItem> | null\n moveTop: (id: ListEditorKey) => NestedTree<TItem> | null\n moveBottom: (id: ListEditorKey) => NestedTree<TItem> | null\n indent: (id: ListEditorKey) => NestedTree<TItem> | null\n outdent: (id: ListEditorKey) => NestedTree<TItem> | null\n moveTo: (\n id: ListEditorKey,\n targetParentId: ListEditorKey | null,\n targetIndex: number,\n ) => NestedTree<TItem> | null\n recalculatePositions: (model: NestedTree<TItem>) => NestedTree<TItem>\n calculateSubtreeDepth: (node: NestedTreeNode<TItem>) => number\n}\n\nconst DEFAULT_KEY_FIELD = 'id'\nconst DEFAULT_POSITION_FIELD = 'position'\nconst DEFAULT_PARENT_FIELD = 'parent'\n\n/**\n * Nested list editor core. Pure data behavior shared by ANestedSortableListEditor.\n * Works on a tree of `{ data, children, meta }` nodes — shape-compatible with the\n * legacy `SortableNested` wrapper so migration can pass existing data through\n * unchanged. Mutators return a cloned tree and also assign it to `model.value`.\n */\nexport function useNestedListEditor<TItem extends Record<string, any>>(\n model: Ref<NestedTree<TItem>>,\n options: UseNestedListEditorOptions,\n): NestedListEditorApi<TItem> {\n const keyField = options.keyField ?? DEFAULT_KEY_FIELD\n const positionField = options.positionField ?? DEFAULT_POSITION_FIELD\n const parentField = options.parentField ?? DEFAULT_PARENT_FIELD\n const positionMultiplier = options.positionMultiplier ?? 1\n const maxDepth = options.maxDepth\n\n const getKey = (data: TItem): ListEditorKey => data[keyField] as ListEditorKey\n\n const calculateSubtreeDepth = (node: NestedTreeNode<TItem>): number => {\n if (!node.children || node.children.length === 0) return 1\n let max = 0\n for (const child of node.children) {\n const d = calculateSubtreeDepth(child)\n if (d > max) max = d\n }\n return max + 1\n }\n\n const findNode = (\n id: ListEditorKey,\n arr: NestedTreeNode<TItem>[] = model.value.children,\n parent: NestedTreeNode<TItem> | null = null,\n ): { node: NestedTreeNode<TItem> | null; parent: NestedTreeNode<TItem> | null } => {\n for (const item of arr) {\n if (getKey(item.data) === id) return { node: item, parent }\n if (item.children && item.children.length > 0) {\n const found = findNode(id, item.children, item)\n if (found.node) return found\n }\n }\n return { node: null, parent: null }\n }\n\n const recalculateSiblings = (siblings: NestedTreeNode<TItem>[]) => {\n let pos = 1 * positionMultiplier\n for (const sibling of siblings) {\n if (sibling.data[positionField] !== pos) {\n ;(sibling.data as any)[positionField] = pos\n // A renumbered sibling must be flagged dirty so consumers that persist\n // only changed nodes (e.g. the linked-list partial-multi save) actually\n // store the new position — otherwise add/move/delete reorders are lost on\n // reload and rows collide on their old positions.\n sibling.meta.dirty = true\n }\n pos += positionMultiplier\n }\n }\n\n const recalculateAll = (tree: NestedTree<TItem>) => {\n const walk = (arr: NestedTreeNode<TItem>[]) => {\n recalculateSiblings(arr)\n for (const item of arr) if (item.children && item.children.length) walk(item.children)\n }\n walk(tree.children)\n }\n\n const recalculatePositions = (tree: NestedTree<TItem>): NestedTree<TItem> => {\n const cloned = cloneDeep(tree) as NestedTree<TItem>\n recalculateAll(cloned)\n return cloned\n }\n\n const buildViewItems = (tree: NestedTree<TItem>): NestedViewItem<TItem>[] => {\n const flat: NestedViewItem<TItem>[] = []\n const expandedKeys = options.expandedKeys?.value\n let flatIndex = 0\n const walk = (\n nodes: NestedTreeNode<TItem>[],\n depth: number,\n parentNode: NestedTreeNode<TItem> | null,\n ) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n const key = getKey(node.data)\n const childrenAllowed = !isUndefined(node.children)\n const hasChildren = childrenAllowed && (node.children?.length ?? 0) > 0\n const childrenCount = node.children?.length ?? 0\n const isExpanded = expandedKeys ? expandedKeys.has(key) : true\n const remainingDepth = maxDepth - (depth + 1)\n const canAddChild = childrenAllowed && remainingDepth > 0\n const canOutdent = depth > 0\n const canIndent = i > 0\n flat.push({\n key,\n index: flatIndex++,\n raw: node.data,\n position: node.data[positionField] as number | undefined,\n node,\n depth,\n parent: parentNode?.data ?? null,\n parentKey: parentNode ? getKey(parentNode.data) : null,\n childrenCount,\n hasChildren,\n childrenAllowed,\n siblingIndex: i,\n siblingCount: nodes.length,\n firstInParent: i === 0,\n lastInParent: i === nodes.length - 1,\n canAddChild,\n canIndent,\n canOutdent,\n })\n if (hasChildren && isExpanded) {\n walk(node.children as NestedTreeNode<TItem>[], depth + 1, node)\n }\n }\n }\n walk(tree.children, 0, null)\n return flat\n }\n\n const viewItems = computed<NestedViewItem<TItem>[]>(() => buildViewItems(model.value))\n\n const insertAfter = (\n siblings: NestedTreeNode<TItem>[],\n afterIdx: number,\n newNode: NestedTreeNode<TItem>,\n ) => {\n siblings.splice(afterIdx + 1, 0, newNode)\n }\n\n const resolveInsertIndex = (siblings: NestedTreeNode<TItem>[], hint?: PositionHint): number => {\n if (!hint) return siblings.length\n if (hint.afterId !== undefined) {\n const idx = siblings.findIndex((s) => getKey(s.data) === hint.afterId)\n return idx === -1 ? siblings.length : idx + 1\n }\n if (hint.afterIndex !== undefined) {\n if (hint.afterIndex < 0) return siblings.length\n return Math.min(hint.afterIndex + 1, siblings.length)\n }\n if (hint.index !== undefined) {\n return Math.max(0, Math.min(hint.index, siblings.length))\n }\n return siblings.length\n }\n\n const addItem = (\n data: TItem,\n hint?: PositionHint & {\n parentId?: ListEditorKey | null\n asFirstChild?: boolean\n childrenAllowed?: boolean\n },\n ): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const childrenAllowed = hint?.childrenAllowed ?? true\n const newNode: NestedTreeNode<TItem> = {\n data: cloneDeep(data) as TItem,\n children: childrenAllowed ? [] : undefined,\n meta: { dirty: false },\n }\n\n let targetSiblings: NestedTreeNode<TItem>[] = cloned.children\n let parentNode: NestedTreeNode<TItem> | null = null\n\n if (hint?.parentId !== undefined && hint.parentId !== null) {\n const { node } = findNode(hint.parentId, cloned.children)\n if (node && node.children) {\n targetSiblings = node.children\n parentNode = node\n }\n }\n\n if (hint?.afterId !== undefined) {\n const { node: afterNode, parent: afterParent } = findNode(hint.afterId, cloned.children)\n if (afterNode) {\n const siblings = afterParent\n ? (afterParent.children as NestedTreeNode<TItem>[])\n : cloned.children\n const idx = siblings.indexOf(afterNode)\n if (idx !== -1) {\n insertAfter(siblings, idx, newNode)\n ;(newNode.data as any)[parentField] = afterParent ? getKey(afterParent.data) : null\n recalculateSiblings(siblings)\n model.value = cloned\n return cloned\n }\n }\n }\n\n const insertIdx = hint?.asFirstChild ? 0 : resolveInsertIndex(targetSiblings, hint)\n targetSiblings.splice(insertIdx, 0, newNode)\n ;(newNode.data as any)[parentField] = parentNode ? getKey(parentNode.data) : null\n recalculateSiblings(targetSiblings)\n model.value = cloned\n return cloned\n }\n\n const deleteItem = (id: ListEditorKey): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return cloned\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx === -1) return cloned\n siblings.splice(idx, 1)\n recalculateSiblings(siblings)\n model.value = cloned\n return cloned\n }\n\n const updateItem = (id: ListEditorKey, data: TItem, markDirty = true): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node } = findNode(id, cloned.children)\n if (!node) return cloned\n node.data = cloneDeep(data) as TItem\n // An edit IS a change that must be persisted. Consumers that save only the\n // dirty subset (e.g. linked-list partial-multi update) drop the edited node\n // otherwise, so the change is lost on reload. Mirrors add/move, which flag\n // dirty via recalculateSiblings. `markDirty=false` is for snapshot restore\n // on edit-cancel — restoring the original data must NOT flag it dirty.\n if (markDirty) node.meta.dirty = true\n model.value = cloned\n return cloned\n }\n\n const swapSiblings = (\n cloned: NestedTree<TItem>,\n id: ListEditorKey,\n getTargetIndex: (siblings: NestedTreeNode<TItem>[], currentIdx: number) => number | null,\n ): NestedTree<TItem> | null => {\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx === -1) return null\n const target = getTargetIndex(siblings, idx)\n if (target === null || target === idx) return null\n const [removed] = siblings.splice(idx, 1)\n siblings.splice(target, 0, removed)\n recalculateSiblings(siblings)\n return cloned\n }\n\n const moveUp = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (_s, idx) => (idx > 0 ? idx - 1 : null))\n if (res) model.value = res\n return res\n }\n\n const moveDown = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (s, idx) => (idx < s.length - 1 ? idx + 1 : null))\n if (res) model.value = res\n return res\n }\n\n const moveTop = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (_s, idx) => (idx > 0 ? 0 : null))\n if (res) model.value = res\n return res\n }\n\n const moveBottom = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (s, idx) => (idx < s.length - 1 ? s.length - 1 : null))\n if (res) model.value = res\n return res\n }\n\n /**\n * Indent: move the item under its previous sibling as its last child.\n * Fails if: no previous sibling, previous sibling doesn't allow children,\n * or the resulting depth would exceed maxDepth.\n */\n const indent = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx <= 0) return null\n const prev = siblings[idx - 1]\n if (isUndefined(prev.children)) return null\n const subtreeDepth = calculateSubtreeDepth(node)\n const prevDepth = calculateParentDepth(cloned, getKey(prev.data))\n if (prevDepth + 1 + subtreeDepth > maxDepth) return null\n\n siblings.splice(idx, 1)\n prev.children!.push(node)\n ;(node.data as any)[parentField] = getKey(prev.data)\n recalculateSiblings(siblings)\n recalculateSiblings(prev.children!)\n model.value = cloned\n return cloned\n }\n\n /**\n * Outdent: move the item up one level — it becomes the next sibling of its current parent.\n * Fails if the item is already at root.\n */\n const outdent = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node || !parent) return null\n\n const { parent: grandParent } = findNode(getKey(parent.data), cloned.children)\n const grandSiblings = grandParent\n ? (grandParent.children as NestedTreeNode<TItem>[])\n : cloned.children\n const parentIdx = grandSiblings.indexOf(parent)\n if (parentIdx === -1) return null\n\n const currentSiblings = parent.children as NestedTreeNode<TItem>[]\n const idx = currentSiblings.indexOf(node)\n if (idx === -1) return null\n currentSiblings.splice(idx, 1)\n grandSiblings.splice(parentIdx + 1, 0, node)\n ;(node.data as any)[parentField] = grandParent ? getKey(grandParent.data) : null\n\n recalculateSiblings(currentSiblings)\n recalculateSiblings(grandSiblings)\n model.value = cloned\n return cloned\n }\n\n const calculateParentDepth = (tree: NestedTree<TItem>, id: ListEditorKey): number => {\n const walk = (arr: NestedTreeNode<TItem>[], depth: number): number | null => {\n for (const item of arr) {\n if (getKey(item.data) === id) return depth\n if (item.children && item.children.length) {\n const d = walk(item.children, depth + 1)\n if (d !== null) return d\n }\n }\n return null\n }\n return walk(tree.children, 0) ?? 0\n }\n\n /**\n * Move a node to a specific parent at a specific index. Used by drag/drop.\n * Respects maxDepth — returns null if the move would exceed it.\n */\n const moveTo = (\n id: ListEditorKey,\n targetParentId: ListEditorKey | null,\n targetIndex: number,\n ): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n\n if (targetParentId !== null) {\n const isDescendant = (n: NestedTreeNode<TItem>): boolean => {\n if (!n.children) return false\n for (const c of n.children) {\n if (getKey(c.data) === targetParentId) return true\n if (isDescendant(c)) return true\n }\n return false\n }\n if (getKey(node.data) === targetParentId || isDescendant(node)) return null\n }\n\n let targetSiblings: NestedTreeNode<TItem>[]\n let newParentNode: NestedTreeNode<TItem> | null = null\n let newParentDepth = 0\n if (targetParentId === null) {\n targetSiblings = cloned.children\n newParentDepth = 0\n } else {\n const { node: targetParent } = findNode(targetParentId, cloned.children)\n if (!targetParent || isUndefined(targetParent.children)) return null\n targetSiblings = targetParent.children\n newParentNode = targetParent\n newParentDepth = calculateParentDepth(cloned, targetParentId) + 1\n }\n\n const subtreeDepth = calculateSubtreeDepth(node)\n if (newParentDepth + subtreeDepth > maxDepth) return null\n\n const sourceSiblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const sourceIdx = sourceSiblings.indexOf(node)\n if (sourceIdx === -1) return null\n\n const samelist = sourceSiblings === targetSiblings\n const [removed] = sourceSiblings.splice(sourceIdx, 1)\n let insertAt = targetIndex\n if (samelist && sourceIdx < targetIndex) insertAt = targetIndex - 1\n insertAt = Math.max(0, Math.min(insertAt, targetSiblings.length))\n targetSiblings.splice(insertAt, 0, removed)\n ;(removed.data as any)[parentField] = newParentNode ? getKey(newParentNode.data) : null\n\n if (!samelist) recalculateSiblings(sourceSiblings)\n recalculateSiblings(targetSiblings)\n model.value = cloned\n return cloned\n }\n\n return {\n viewItems,\n findNode,\n addItem,\n deleteItem,\n updateItem,\n moveUp,\n moveDown,\n moveTop,\n moveBottom,\n indent,\n outdent,\n moveTo,\n recalculatePositions,\n calculateSubtreeDepth,\n }\n}\n","import type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\nimport type { NestedViewItem } from '@/labs/listEditor/composables/useNestedListEditor'\n\n/**\n * Drop instruction — where the dragged item will land + how to paint the line.\n *\n * Outliner model (dnd-kit / Workflowy style):\n * - Pointer Y picks which gap the drop lands in: the upper 50% of the\n * hovered row = the gap above it, the lower 50% = the gap below.\n * - Pointer X picks the depth within that gap. Depth is measured in indent\n * columns of `indentPx` each, rounded to the nearest column, and clamped\n * to `[0, anchor.depth + 1]` where `anchor` is the visible row immediately\n * above the target gap. You can never skip more than one level deeper\n * than what's already on the row above — same rule as dnd-kit's\n * SortableTree — which keeps the tree structure coherent.\n *\n * `makeChild: true` when the chosen depth is one level deeper than the\n * anchor. The target becomes a new parent and the consumer should\n * auto-expand `parentKey` so the inserted row stays visible.\n *\n * `blocked` wraps the would-be instruction when the move would breach\n * `maxDepth` — the overlay keeps rendering the line in a warning colour\n * so the intent stays legible but the mutation is refused.\n */\n\nexport type ExecutableInstruction = {\n type: 'insert'\n refKey: ListEditorKey\n refEdge: 'top' | 'bottom'\n parentKey: ListEditorKey | null\n index: number\n depth: number\n makeChild: boolean\n // Row whose level the inserted item will match — the sibling we're\n // inserting after (sibling case) or the ancestor we're joining as sibling\n // of (reparent case). `null` for make-child (creating a brand new deeper\n // level, no existing peer to anchor against) and the root-top fallback.\n // Consumers render a thin connector from the drop line up to this row so\n // the user can see which row dictates the new level.\n levelRowKey: ListEditorKey | null\n}\n\nexport type Instruction =\n | ExecutableInstruction\n | {\n type: 'blocked'\n desired: ExecutableInstruction\n reason: 'maxDepth'\n }\n\nexport interface HoveredRow {\n key: ListEditorKey\n rect: DOMRect\n depth: number\n parentKey: ListEditorKey | null\n siblingIndex: number\n siblingCount: number\n}\n\nexport interface ComputeInstructionArgs {\n pointer: { x: number; y: number }\n hoveredRow: HoveredRow\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n viewItems: NestedViewItem<any>[]\n maxDepth: number\n indentPx: number\n containerLeft: number\n containerPaddingLeft: number\n}\n\nconst findByKey = (\n viewItems: NestedViewItem<any>[],\n key: ListEditorKey,\n): NestedViewItem<any> | null => viewItems.find((v) => v.key === key) ?? null\n\nconst isDescendantOf = (\n viewItems: NestedViewItem<any>[],\n ancestorKey: ListEditorKey,\n candidateKey: ListEditorKey,\n): boolean => {\n let current = findByKey(viewItems, candidateKey)\n while (current && current.parentKey !== null) {\n if (current.parentKey === ancestorKey) return true\n current = findByKey(viewItems, current.parentKey)\n }\n return false\n}\n\nconst findAncestorAtDepth = (\n viewItems: NestedViewItem<any>[],\n startKey: ListEditorKey,\n targetDepth: number,\n): NestedViewItem<any> | null => {\n let current = findByKey(viewItems, startKey)\n while (current && current.depth > targetDepth) {\n if (current.parentKey === null) return null\n current = findByKey(viewItems, current.parentKey)\n }\n return current && current.depth === targetDepth ? current : null\n}\n\nconst isInSourceSubtree = (\n viewItems: NestedViewItem<any>[],\n sourceKey: ListEditorKey,\n candidateKey: ListEditorKey,\n): boolean => candidateKey === sourceKey || isDescendantOf(viewItems, sourceKey, candidateKey)\n\n// Walk the flat view-items list in `dir` (±1) starting at `startIdx`, skipping\n// any row that belongs to the dragged subtree — those rows aren't visible drop\n// targets so they shouldn't define the gap boundaries for depth clamping.\nconst findSiblingNotInSource = (\n viewItems: NestedViewItem<any>[],\n startIdx: number,\n dir: 1 | -1,\n sourceKey: ListEditorKey,\n): NestedViewItem<any> | null => {\n for (let i = startIdx; i >= 0 && i < viewItems.length; i += dir) {\n const vi = viewItems[i]\n if (!isInSourceSubtree(viewItems, sourceKey, vi.key)) return vi\n }\n return null\n}\n\nexport const computeInstruction = (args: ComputeInstructionArgs): Instruction | null => {\n const {\n pointer,\n hoveredRow,\n sourceKey,\n sourceSubtreeDepth,\n viewItems,\n maxDepth,\n indentPx,\n containerLeft,\n containerPaddingLeft,\n } = args\n\n if (hoveredRow.key === sourceKey) return null\n if (isDescendantOf(viewItems, sourceKey, hoveredRow.key)) return null\n\n const y = pointer.y - hoveredRow.rect.top\n const h = hoveredRow.rect.height\n const inTopHalf = y < h / 2\n const refEdge: 'top' | 'bottom' = inTopHalf ? 'top' : 'bottom'\n\n // The gap between two flat-adjacent rows frames the drop. `prev` is the\n // row immediately above the gap, `next` is the row immediately below it.\n // Rows belonging to the dragged subtree don't exist for clamping purposes —\n // they'll disappear from the flat list once the move completes, so they\n // can't define the depth bounds of the drop.\n const flatIdx = viewItems.findIndex((v) => v.key === hoveredRow.key)\n const prev: NestedViewItem<any> | null = inTopHalf\n ? findSiblingNotInSource(viewItems, flatIdx - 1, -1, sourceKey)\n : findSiblingNotInSource(viewItems, flatIdx, -1, sourceKey)\n const next: NestedViewItem<any> | null = inTopHalf\n ? findSiblingNotInSource(viewItems, flatIdx, 1, sourceKey)\n : findSiblingNotInSource(viewItems, flatIdx + 1, 1, sourceKey)\n\n // Depth bounds for this gap:\n // maxDepth = prev.depth + 1 (you can nest one level deeper than prev).\n // minDepth = next.depth (shallower would insert AFTER next's parent\n // subtree, i.e., at a different Y than the\n // user is pointing at — so that's not a valid\n // option for THIS gap).\n // If prev is missing (gap at top of tree) or next is missing (bottom of\n // tree), the missing side defaults to 0.\n const pointerRelX = pointer.x - containerLeft - containerPaddingLeft\n const rawDepth = Math.round(pointerRelX / indentPx)\n const depthCeiling = prev ? prev.depth + 1 : 0\n const depthFloor = next ? next.depth : 0\n const clampedDepth = Math.max(depthFloor, Math.min(rawDepth, depthCeiling))\n\n let desired: ExecutableInstruction\n\n if (!prev) {\n // Gap at the very top of the tree — only landing is root index 0.\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge: 'top',\n parentKey: null,\n index: 0,\n depth: 0,\n makeChild: false,\n levelRowKey: null,\n }\n } else if (clampedDepth === prev.depth + 1) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.key,\n index: 0,\n depth: clampedDepth,\n makeChild: true,\n levelRowKey: null,\n }\n } else if (clampedDepth === prev.depth) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.parentKey,\n index: prev.siblingIndex + 1,\n depth: clampedDepth,\n makeChild: false,\n levelRowKey: prev.key,\n }\n } else {\n // clampedDepth < prev.depth → reparent to ancestor at clampedDepth.\n const ancestor = findAncestorAtDepth(viewItems, prev.key, clampedDepth)\n if (ancestor) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: ancestor.parentKey,\n index: ancestor.siblingIndex + 1,\n depth: clampedDepth,\n makeChild: false,\n levelRowKey: ancestor.key,\n }\n } else {\n // Shouldn't hit with clampedDepth ≥ 0 but keep a safe fallback.\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.parentKey,\n index: prev.siblingIndex + 1,\n depth: prev.depth,\n makeChild: false,\n levelRowKey: prev.key,\n }\n }\n }\n\n if (desired.depth + sourceSubtreeDepth - 1 >= maxDepth) {\n return { type: 'blocked', desired, reason: 'maxDepth' }\n }\n\n return desired\n}\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { useI18n } from 'vue-i18n'\nimport LeNestedRowSelf from './LeNestedRow.vue'\nimport LeDragHandle from '@/labs/listEditor/internal/LeDragHandle.vue'\nimport LeUnsavedLabel from '@/labs/listEditor/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n} from '@/labs/listEditor/types/listEditorTypes'\n\n// Self-recursive row. Interior uses `any` — strong typing lives on the public ANestedSortableListEditor wrapper.\n\nexport type Props = {\n vi: any\n viewItems: any[]\n dragState: any\n context: any\n callbacks: any\n}\nconst props = defineProps<Props>()\n\n// `as any` breaks Vue's circular type inference on self-import.\nconst LeNestedRow = LeNestedRowSelf as any\n\nconst { t } = useI18n()\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\nconst anchorName = (key: ListEditorKey): string => `--row-${String(key).replace(/\\W/g, '_')}`\n\n// Delegate to the parent editor's resolver so the registry + getValidationState\n// prop apply consistently. Falls back to reading raw.validationState if context\n// doesn't supply one.\nconst resolveValidation = (raw: TItem): ListEditorValidationState => {\n if (typeof props.context.resolveValidation === 'function') {\n return props.context.resolveValidation(raw, props.vi.key, props.vi.index)\n }\n const v = raw.validationState\n if (v === 'valid' || v === 'invalid' || v === 'warning') return v\n return null\n}\n\nconst buildSlotProps = () => props.context.buildSlotProps(props.vi)\n\nconst directChildren = (): any[] => props.viewItems.filter((v) => v.parentKey === props.vi.key)\n</script>\n\n<template>\n <div\n :class=\"[\n 'a-le-row-wrapper',\n {\n 'a-le-row-wrapper--drop-disabled': dragState !== null && dragState.sourceKey === vi.key,\n },\n ]\"\n :data-id=\"String(vi.key)\"\n role=\"treeitem\"\n :aria-level=\"vi.depth + 1\"\n :tabindex=\"context.keyboardNav ? context.keyboardNav.rowTabindex(vi.key) : undefined\"\n @keydown=\"context.keyboardNav ? context.keyboardNav.handleKeydown(vi.key, $event) : undefined\"\n >\n <div\n :class=\"[\n 'a-le-row',\n vi.depth > 0 ? 'a-le-row--child' : null,\n {\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--reorder': context.reorderMode,\n 'a-le-row--grabbed': context.keyboardNav && context.keyboardNav.isGrabbed(vi.key),\n 'a-le-row--clickable': context.isRowClickable(vi),\n 'a-le-row--drop-source': dragState !== null && dragState.sourceKey === vi.key,\n [`a-le-row--validation-${resolveValidation(vi.raw)}`]: resolveValidation(vi.raw) !== null,\n },\n ]\"\n :style=\"{\n '--nested-depth': vi.depth,\n 'anchor-name': anchorName(vi.key),\n '--parent-anchor': vi.parentKey !== null ? anchorName(vi.parentKey) : 'none',\n }\"\n >\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps()\"\n />\n\n <div\n class=\"a-le-row-header\"\n @click=\"callbacks.onRowClick(vi)\"\n >\n <LeDragHandle\n v-if=\"context.dragEnabled\"\n :class=\"HANDLE_CLASS\"\n />\n\n <!-- Expand toggle — a small triangular caret rendered uniformly for both\n root and nested rows. For leaf rows (no children) the toggle is\n hidden via `visibility: hidden` so the column stays aligned. -->\n <button\n v-if=\"context.showExpandToggle && vi.childrenAllowed\"\n type=\"button\"\n :class=\"[\n 'a-nested-list-editor__tree-toggle',\n {\n 'a-nested-list-editor__tree-toggle--empty': !vi.hasChildren,\n 'a-nested-list-editor__tree-toggle--open': vi.childrenExpanded,\n },\n ]\"\n :aria-label=\"vi.childrenExpanded ? t('common.sortable.close') : t('common.sortable.edit')\"\n @click.stop=\"vi.hasChildren && callbacks.onChevronClick(vi)\"\n >\n <span class=\"a-nested-list-editor__tree-toggle-caret\" />\n </button>\n <!-- Spacer for leaf rows that have no caret, so titles align with\n parents having one. -->\n <span\n v-else-if=\"context.showExpandToggle\"\n class=\"a-nested-list-editor__tree-toggle a-nested-list-editor__tree-toggle--spacer\"\n aria-hidden=\"true\"\n />\n\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps()\"\n >\n <span class=\"a-le-title\">\n {{ context.resolveCompactText(vi.raw, vi.key) }}\n </span>\n </slot>\n <!-- Visible only inside the SortableJS drag clone — signals that the\n item being moved carries a subtree so the user realises the whole\n branch will follow. Sits right after the title. Hidden in the\n normal DOM via CSS. -->\n <span\n v-if=\"vi.hasChildren\"\n class=\"a-nested-list-editor__drag-count\"\n aria-hidden=\"true\"\n >\n <VIcon\n icon=\"mdi-file-tree\"\n size=\"14\"\n />\n +{{ vi.childrenCount }}\n </span>\n <LeUnsavedLabel v-if=\"vi.unsaved\" />\n </div>\n\n <div\n v-if=\"!context.reorderMode\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps()\"\n >\n <span\n v-if=\"\n context.statusField &&\n vi.raw[context.statusField] != null &&\n vi.raw[context.statusField] !== ''\n \"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[context.statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps()\"\n >\n <template v-if=\"context.reorderMode\">\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :disabled=\"vi.firstInParent\"\n class=\"mx-1 a-le-action a-le-action--up\"\n @click.stop=\"callbacks.moveUp(vi.key)\"\n >\n <VIcon\n icon=\"mdi-arrow-up\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.moveUp')\"\n />\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :disabled=\"vi.lastInParent\"\n class=\"mx-1 a-le-action a-le-action--down\"\n @click.stop=\"callbacks.moveDown(vi.key)\"\n >\n <VIcon\n icon=\"mdi-arrow-down\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.moveDown')\"\n />\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n :disabled=\"vi.firstInParent\"\n @click.stop=\"callbacks.moveTop(vi.key)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-up\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.moveToTop') }}</VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"vi.lastInParent\"\n @click.stop=\"callbacks.moveBottom(vi.key)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-down\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.moveToBottom') }}</VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showMoveToPosition && (!vi.firstInParent || !vi.lastInParent)\"\n @click.stop=\"callbacks.openMoveToPosition(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-target\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.moveToPosition.action') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showChangeParent\"\n @click.stop=\"callbacks.openChangeParent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-folder-move-outline\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.changeParent.action') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"!vi.canIndent\"\n @click.stop=\"callbacks.indent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-format-indent-increase\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.indent') }}</VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"!vi.canOutdent\"\n @click.stop=\"callbacks.outdent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-format-indent-decrease\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.outdent') }}</VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showDeleteButton && context.canInteract\"\n @click.stop=\"callbacks.onDeleteClick(vi)\"\n >\n <template #prepend>\n <VIcon\n icon=\"mdi-trash-can-outline\"\n color=\"error\"\n />\n </template>\n <VListItemTitle class=\"text-error\">\n {{ t('common.sortable.delete') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n <template v-else>\n <VBtn\n v-if=\"context.showEditButton && context.canInteract\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"callbacks.onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"context.showDeleteButton && context.canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"callbacks.onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"\n context.canInteract &&\n ((context.showAddChildButton && vi.canAddChild) || context.showAddAfterAction)\n \"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n v-if=\"context.showAddAfterAction\"\n @click.stop=\"callbacks.onAddAfterClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-playlist-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showAddChildButton && vi.canAddChild\"\n @click.stop=\"callbacks.onAddChildClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-subdirectory-arrow-right\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addChild') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <!-- Inline edit body — status badge intentionally NOT rendered here,\n the compact header's status is enough; stacking it in the form body\n was visually noisy. -->\n <template v-if=\"vi.editing && !context.reorderMode && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps()\"\n >\n <div\n v-if=\"context.showInlineSaveFooter\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"callbacks.onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"callbacks.onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"\n $slots['item-readonly'] && (context.readonly || vi.expanded) && !context.reorderMode\n \"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n\n <!-- Recursive children — any depth level. The `::before` on this wrapper\n renders the single continuous vertical tree line at the parent's\n chevron column (see CSS). One line per group = no per-row gaps. -->\n <div\n v-if=\"vi.hasChildren && vi.childrenExpanded\"\n class=\"a-nested-list-editor__children\"\n :style=\"{ '--parent-depth': vi.depth }\"\n >\n <div\n :class=\"[GROUP_CLASS]\"\n :data-parent-id=\"String(vi.key)\"\n >\n <LeNestedRow\n v-for=\"child in directChildren()\"\n :key=\"String(child.key)\"\n :vi=\"child\"\n :view-items=\"viewItems\"\n :drag-state=\"dragState\"\n :context=\"context\"\n :callbacks=\"callbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type {\n ListEditorKey,\n NestedTree,\n NestedTreeNode,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface Props<TItem extends Record<string, any>> {\n tree: NestedTree<TItem>\n sourceKey: ListEditorKey | null\n keyField: string\n maxDepth: number\n resolveLabel: (raw: TItem, key: ListEditorKey) => string\n calculateSubtreeDepth: (node: NestedTreeNode<TItem>) => number\n}\n\ninterface Candidate {\n key: ListEditorKey | null\n depth: number\n label: string\n hasChildren: boolean\n disallowed: boolean\n reason: 'self' | 'descendant' | 'maxDepth' | 'currentParent' | null\n}\n\nconst props = defineProps<Props<TItem>>()\n\nconst emit = defineEmits<{\n confirm: [parentId: ListEditorKey | null, position: 'first' | 'last']\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n\nconst { t } = useI18n()\n\nconst selectedKey = ref<ListEditorKey | null | undefined>(undefined)\nconst placement = ref<'first' | 'last'>('last')\n\nwatch(open, (now) => {\n if (now) {\n selectedKey.value = undefined\n placement.value = 'last'\n }\n})\n\n// Walk the source's subtree to gather descendant keys (cycle prevention).\nconst descendantKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n if (props.sourceKey === null) return out\n const walk = (nodes: NestedTreeNode<TItem>[]): boolean => {\n for (const n of nodes) {\n const k = n.data[props.keyField] as ListEditorKey\n if (k === props.sourceKey) {\n const collect = (sub: NestedTreeNode<TItem>[]) => {\n for (const s of sub) {\n out.add(s.data[props.keyField] as ListEditorKey)\n if (s.children?.length) collect(s.children)\n }\n }\n if (n.children?.length) collect(n.children)\n return true\n }\n if (n.children?.length && walk(n.children)) return true\n }\n return false\n }\n walk(props.tree.children)\n return out\n})\n\nconst sourceNode = computed<NestedTreeNode<TItem> | null>(() => {\n if (props.sourceKey === null) return null\n const find = (nodes: NestedTreeNode<TItem>[]): NestedTreeNode<TItem> | null => {\n for (const n of nodes) {\n if ((n.data[props.keyField] as ListEditorKey) === props.sourceKey) return n\n if (n.children?.length) {\n const hit = find(n.children)\n if (hit) return hit\n }\n }\n return null\n }\n return find(props.tree.children)\n})\n\n// `currentParentKey` = parent of the source row (null if source is at root).\n// We exclude this from candidates because moving to \"the same parent\" is not a\n// \"change parent\" operation (use Move-to-position instead).\nconst currentParentKey = computed<ListEditorKey | null | undefined>(() => {\n if (props.sourceKey === null) return undefined\n const find = (\n nodes: NestedTreeNode<TItem>[],\n parentKey: ListEditorKey | null,\n ): ListEditorKey | null | undefined => {\n for (const n of nodes) {\n if ((n.data[props.keyField] as ListEditorKey) === props.sourceKey) return parentKey\n if (n.children?.length) {\n const hit = find(n.children, n.data[props.keyField] as ListEditorKey)\n if (hit !== undefined) return hit\n }\n }\n return undefined\n }\n return find(props.tree.children, null)\n})\n\nconst candidates = computed<Candidate[]>(() => {\n const out: Candidate[] = []\n const subtreeDepth = sourceNode.value ? props.calculateSubtreeDepth(sourceNode.value) : 1\n\n out.push({\n key: null,\n depth: 0,\n label: t('common.sortable.changeParent.rootLabel'),\n hasChildren: props.tree.children.length > 0,\n disallowed: currentParentKey.value === null,\n reason: currentParentKey.value === null ? 'currentParent' : null,\n })\n\n const walk = (nodes: NestedTreeNode<TItem>[], depth: number) => {\n for (const n of nodes) {\n const key = n.data[props.keyField] as ListEditorKey\n let disallowed = false\n let reason: Candidate['reason'] = null\n if (key === props.sourceKey) {\n disallowed = true\n reason = 'self'\n } else if (descendantKeys.value.has(key)) {\n disallowed = true\n reason = 'descendant'\n } else if (currentParentKey.value !== undefined && currentParentKey.value === key) {\n disallowed = true\n reason = 'currentParent'\n } else if (depth + 1 + subtreeDepth > props.maxDepth) {\n disallowed = true\n reason = 'maxDepth'\n }\n out.push({\n key,\n depth: depth + 1,\n label: props.resolveLabel(n.data as TItem, key),\n hasChildren: !!(n.children && n.children.length > 0),\n disallowed,\n reason,\n })\n if (n.children?.length) walk(n.children, depth + 1)\n }\n }\n walk(props.tree.children, 0)\n return out\n})\n\nconst validCandidates = computed(() => candidates.value.filter((c) => !c.disallowed))\n\nconst selectedCandidate = computed<Candidate | null>(() =>\n selectedKey.value === undefined\n ? null\n : (candidates.value.find((c) => c.key === selectedKey.value) ?? null),\n)\n\nconst showPlacementPicker = computed<boolean>(\n () => !!selectedCandidate.value && selectedCandidate.value.hasChildren,\n)\n\nconst onCandidateClick = (c: Candidate) => {\n if (c.disallowed) return\n selectedKey.value = c.key\n}\n\nconst onConfirm = () => {\n if (!selectedCandidate.value) return\n emit('confirm', selectedCandidate.value.key, placement.value)\n open.value = false\n}\n\nconst onCancel = () => {\n open.value = false\n}\n\nconst indent = (depth: number): string => `${depth * 16}px`\n\nconst reasonLabel = (reason: Candidate['reason']): string => {\n if (reason === 'maxDepth') return t('common.sortable.changeParent.errorMaxDepth')\n return ''\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"540\"\n persistent\n >\n <VCard>\n <VCardTitle>\n {{ t('common.sortable.changeParent.title') }}\n </VCardTitle>\n\n <VCardText\n v-if=\"validCandidates.length === 0\"\n class=\"text-body-medium\"\n >\n <VAlert\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n >\n <strong>{{ t('common.sortable.changeParent.noTargetsTitle') }}</strong>\n <div>{{ t('common.sortable.changeParent.noTargetsText') }}</div>\n </VAlert>\n </VCardText>\n\n <template v-else>\n <VCardText class=\"pb-1\">\n <VList\n density=\"compact\"\n class=\"le-change-parent__list\"\n >\n <VListItem\n v-for=\"c in candidates\"\n :key=\"c.key === null ? '__root__' : String(c.key)\"\n :disabled=\"c.disallowed\"\n :active=\"selectedKey === c.key\"\n :title=\"c.label\"\n :subtitle=\"reasonLabel(c.reason)\"\n :style=\"{ paddingInlineStart: indent(c.depth) }\"\n :data-disallowed=\"c.disallowed ? 'true' : 'false'\"\n :data-reason=\"c.reason ?? ''\"\n @click=\"onCandidateClick(c)\"\n >\n <template #prepend>\n <VIcon\n v-if=\"c.key === null\"\n icon=\"mdi-folder-home-outline\"\n size=\"18\"\n />\n <VIcon\n v-else-if=\"c.hasChildren\"\n icon=\"mdi-folder-outline\"\n size=\"18\"\n />\n <VIcon\n v-else\n icon=\"mdi-file-outline\"\n size=\"18\"\n />\n </template>\n </VListItem>\n </VList>\n </VCardText>\n\n <VCardText\n v-if=\"showPlacementPicker\"\n class=\"pt-0\"\n >\n <div class=\"text-body-medium mb-2\">\n {{\n t('common.sortable.changeParent.placementHeading', {\n label: selectedCandidate?.label ?? '',\n })\n }}\n </div>\n <VRadioGroup\n v-model=\"placement\"\n density=\"compact\"\n hide-details\n >\n <VRadio\n value=\"first\"\n :label=\"t('common.sortable.changeParent.placeFirst')\"\n />\n <VRadio\n value=\"last\"\n :label=\"t('common.sortable.changeParent.placeLast')\"\n />\n </VRadioGroup>\n </VCardText>\n </template>\n\n <VCardActions>\n <VSpacer />\n <VBtn\n variant=\"text\"\n @click=\"onCancel\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"elevated\"\n :disabled=\"!selectedCandidate || selectedCandidate.disallowed\"\n @click=\"onConfirm\"\n >\n {{ t('common.sortable.changeParent.confirm') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style lang=\"scss\" scoped>\n.le-change-parent__list {\n max-height: 340px;\n overflow-y: auto;\n}\n</style>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n shallowRef,\n useSlots,\n useTemplateRef,\n watch,\n} from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useContainerWidth } from '@/labs/listEditor/composables/useContainerWidth'\nimport { useIsTouchDevice } from '@/labs/listEditor/composables/useIsTouchDevice'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport { useValidationRegistry } from '@/labs/listEditor/composables/useValidationRegistry'\nimport { ListEditorUnsavedKeysKey } from '@/labs/listEditor/composables/useListEditorItemValidation'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport {\n useNestedListEditor,\n type NestedViewItem,\n} from '@/labs/listEditor/composables/useNestedListEditor'\nimport {\n computeInstruction,\n type ExecutableInstruction,\n type Instruction,\n} from '@/labs/listEditor/composables/useDragInstruction'\nimport { useDirtyBaseline } from '@/labs/listEditor/composables/useDirtyBaseline'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedKeysSync } from '@/labs/listEditor/composables/useUnsavedKeysSync'\nimport { useUnsavedSection } from '@/labs/unsavedGuard/useUnsavedSection'\nimport { useDeleteDialog } from '@/labs/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/labs/listEditor/composables/useInlineEditing'\nimport { useReorderMode } from '@/labs/listEditor/composables/useReorderMode'\nimport { cloneDeep } from '@/utils/common'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n NestedPositionHint,\n NestedTree,\n NestedTreeNode,\n} from '@/labs/listEditor/types/listEditorTypes'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { stringToInt } from '@/utils/string'\nimport LeNestedRow from '@/labs/listEditor/internal/LeNestedRow.vue'\nimport LeDeleteDialog from '@/labs/listEditor/internal/LeDeleteDialog.vue'\nimport LeMoveToPositionDialog from '@/labs/listEditor/internal/LeMoveToPositionDialog.vue'\nimport LeChangeParentDialog from '@/labs/listEditor/internal/LeChangeParentDialog.vue'\nimport LeEmptyState from '@/labs/listEditor/internal/LeEmptyState.vue'\nimport LeStatus from '@/labs/listEditor/internal/LeStatus.vue'\nimport {\n DRAG_GHOST_CLASS,\n DRAG_CHOSEN_CLASS,\n DRAG_CLASS,\n} from '@/labs/listEditor/internal/constants'\n\nexport interface DecoratedNestedViewItem<T> extends NestedViewItem<T> {\n editing: boolean\n expanded: boolean\n childrenExpanded: boolean\n loading: boolean\n dirty: boolean\n moved: boolean\n unsaved: boolean\n}\n\nexport interface DragState {\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n instruction: Instruction | null\n}\n\nexport type ReorderMode = 'view' | 'reorder'\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => NestedTree<TItem>\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedNestedViewItem<TItem> & { validationState: ListEditorValidationState }\n raw: TItem\n index: number\n key: ListEditorKey\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n firstInParent: boolean\n lastInParent: boolean\n readonly: boolean\n disabled: boolean\n expanded: boolean\n childrenExpanded: boolean\n editing: boolean\n dirty: boolean\n unsaved: boolean\n moved: boolean\n reorderMode: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n canIndent: boolean\n canOutdent: boolean\n canAddChild: boolean\n touch: boolean\n actions: RowActions<TItem>\n}\nexport interface ToolbarSlotProps {\n applying: boolean\n hasPendingChanges: boolean\n movedCount: number\n error: string | null\n actions: { apply: () => Promise<void>; cancel: () => void }\n}\nexport interface ReorderToggleSlotProps {\n mode: ReorderMode\n disabled: boolean\n hasPendingChanges: boolean\n actions: { enterReorderMode: () => void; exitReorderMode: () => void }\n}\nexport interface HeaderSlotProps extends ReorderToggleSlotProps {\n title: string | null\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n maxDepth: number\n\n keyField?: string\n positionField?: string\n parentField?: string\n positionMultiplier?: number\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n title?: string | null\n\n compactField?: string | null\n statusField?: string | null\n\n showAddButton?: boolean\n showAddChildButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n showMoveToPosition?: boolean\n showChangeParent?: boolean\n showExpandToggle?: boolean\n\n getValidationState?: (item: TItem, key: ListEditorKey, index: number) => ListEditorValidationState\n\n addLabel?: string | null\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n loadingKeys?: Set<ListEditorKey> | null\n\n showReorderToggle?: boolean\n disableReorder?: boolean\n disableDrag?: boolean\n /** Disable unsaved-state tracking — no dirty/moved markers, never feeds `unsaved-keys`. */\n disableUnsaved?: boolean\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n onReorderApply?: (tree: NestedTree<TItem>) => Promise<void> | void\n\n /**\n * Registers this editor as a named unsaved-changes section under the given\n * (already translated) label — replaces the per-consumer `useUnsavedSection`\n * call for the common one-editor case.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n unsavedSectionLabel: undefined,\n keyField: 'id',\n positionField: 'position',\n parentField: 'parent',\n positionMultiplier: 1,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n showAddButton: true,\n showAddChildButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n showMoveToPosition: false,\n showChangeParent: false,\n showExpandToggle: true,\n getValidationState: undefined,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n closeVariant: 'auto',\n loadingKeys: null,\n showReorderToggle: true,\n disableReorder: false,\n disableDrag: false,\n disableUnsaved: false,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n onReorderApply: undefined,\n})\n\nconst emit = defineEmits<{\n add: [hint: NestedPositionHint | undefined]\n 'add-child': [parent: NestedViewItem<TItem>]\n edit: [item: NestedViewItem<TItem>]\n deleted: [item: NestedViewItem<TItem>]\n close: [item: NestedViewItem<TItem>]\n 'item-saved': [item: NestedViewItem<TItem>]\n 'item-expand': [item: NestedViewItem<TItem>, expanded: boolean]\n 'reorder-start': []\n 'reorder-cancel': []\n 'reorder-applied': [tree: NestedTree<TItem>]\n 'reorder-apply-error': [error: unknown]\n 'reorder-end': []\n indent: [item: NestedViewItem<TItem>]\n outdent: [item: NestedViewItem<TItem>]\n}>()\n\nconst modelValue = defineModel<NestedTree<TItem>>({ required: true })\nconst mode = defineModel<ReorderMode>('mode', { default: 'view' })\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n 'reorder-toggle'?: (props: ReorderToggleSlotProps) => unknown\n 'reorder-toolbar'?: (props: ToolbarSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst { showWarningT } = useAlerts()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(rootEl)\n\nconst isTouch = useIsTouchDevice()\n\nconst effectiveCloseVariant = computed<'icon' | 'labeled'>(() => {\n if (props.closeVariant === 'icon') return 'icon'\n if (props.closeVariant === 'labeled') return 'labeled'\n return isNarrow.value ? 'icon' : 'labeled'\n})\n\nconst childrenExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n// Readonly detail body visibility — independent of subtree expansion.\nconst detailExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst initChildrenExpanded = (tree: NestedTree<TItem>) => {\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n childrenExpandedKeys.value.add(n.data[props.keyField] as ListEditorKey)\n walk(n.children)\n }\n }\n }\n walk(tree.children)\n}\n// eslint-disable-next-line vue/no-ref-object-reactivity-loss\ninitChildrenExpanded(modelValue.value)\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst editor = useNestedListEditor<TItem>(modelValue, {\n keyField: props.keyField,\n positionField: props.positionField,\n parentField: props.parentField,\n positionMultiplier: props.positionMultiplier,\n maxDepth: props.maxDepth,\n expandedKeys: childrenExpandedKeys,\n})\n\n// `positionField` and `parentField` excluded: drag rewrites them on shifted siblings, would falsely flag unmoved rows.\n\nconst { captureDirtyBaseline, rebaselineKey, isItemDirty, ignoreNextSourceChange } =\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n useDirtyBaseline<TItem>(\n () => {\n const out: Array<{ key: ListEditorKey; data: TItem }> = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n out.push({ key: n.data[props.keyField] as ListEditorKey, data: n.data })\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return out\n },\n { excludeFields: [props.positionField, props.parentField], source: modelValue },\n )\n\n// Snapshot for reorder-cancel restore only; dirty detection uses movedKeys (explicit user actions),\n// not snapshot diff (sibling shifts would falsely flag unmoved rows).\nconst snapshot = shallowRef<NestedTree<TItem> | null>(null)\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst resetDirtyBaseline = () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n}\n// Marks row + every descendant — moving a parent visually carries its subtree.\nconst markMoved = (key: ListEditorKey) => {\n const { node } = editor.findNode(key)\n if (!node) {\n movedKeys.value.add(key)\n return\n }\n const collect = (n: NestedTreeNode<TItem>) => {\n movedKeys.value.add(n.data[props.keyField] as ListEditorKey)\n if (n.children) n.children.forEach(collect)\n }\n collect(node)\n}\n\n// One-pass dirty-key computation so per-row decorator re-renders avoid the stringify cost.\nconst dirtyKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n const walk = (nodes: typeof modelValue.value.children) => {\n for (const n of nodes) {\n const key = n.data[props.keyField] as ListEditorKey\n if (isItemDirty(key, n.data as TItem)) out.add(key)\n if (n.children?.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return out\n})\n\nconst decoratorCache = new Map<ListEditorKey, DecoratedNestedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedNestedViewItem<TItem>[]>(() => {\n const next: DecoratedNestedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of editor.viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = detailExpandedKeys.value.has(vi.key)\n const childrenExpanded = childrenExpandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n const moved = props.disableUnsaved ? false : movedKeys.value.has(vi.key)\n const dirty = props.disableUnsaved ? false : dirtyKeys.value.has(vi.key)\n const unsaved = dirty || moved\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.depth === vi.depth &&\n cached.parentKey === vi.parentKey &&\n cached.childrenCount === vi.childrenCount &&\n cached.firstInParent === vi.firstInParent &&\n cached.lastInParent === vi.lastInParent &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.childrenExpanded === childrenExpanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.moved === moved &&\n cached.unsaved === unsaved\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedNestedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n childrenExpanded,\n loading,\n dirty,\n moved,\n unsaved,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => modelValue.value.children.length === 0)\nconst totalItemCount = computed(() => editor.viewItems.value.length)\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canEnterReorder = computed(\n () => canInteract.value && !props.disableReorder && totalItemCount.value > 1,\n)\n\nconst isInlineEdit = computed(() => !!(slots as Record<string, unknown>).item)\nconst hasReadonlyDetail = computed(() => !!(slots as Record<string, unknown>)['item-readonly'])\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\nconst {\n editingKeys,\n editingSnapshots,\n clearEditing,\n beginEdit,\n cancelEdit,\n commitEdit,\n closeEdit,\n requestAutoOpen,\n} = useInlineEditing<TItem, NestedViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row-wrapper',\n isInlineEdit,\n // markDirty=false: restoring the pre-edit snapshot on cancel must not flag\n // the node dirty (it would otherwise be resent by partial-multi saves).\n restoreSnapshot: (key, data) => editor.updateItem(key, data, false),\n watchKeys: () => {\n const keys: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n keys.push(n.data[props.keyField] as ListEditorKey)\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return keys\n },\n findEntry: (key) => {\n const { node } = editor.findNode(key)\n return node ? { data: node.data } : null\n },\n afterAutoOpen: (key) => {\n const { parent } = editor.findNode(key)\n if (parent) {\n childrenExpandedKeys.value.add(parent.data[props.keyField] as ListEditorKey)\n }\n },\n})\n\nconst {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n} = useReorderMode<NestedTree<TItem>>({\n mode,\n snapshot,\n movedKeys,\n modelValue,\n cloneModel: (m) => cloneDeep(m) as NestedTree<TItem>,\n applyModel: (m) => {\n ignoreNextSourceChange()\n modelValue.value = m\n },\n canEnterReorder,\n onEnter: () => {\n clearEditing()\n // Expand all branches so every row is a reachable drag target.\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n nextTick(() => {\n if (dragEnabled.value) initSortables()\n })\n },\n onExternalEnter: () => {\n clearEditing()\n },\n onCancel: () => {\n destroySortables()\n },\n onApplyEnd: () => {\n destroySortables()\n },\n onReorderApply: (tree) => props.onReorderApply?.(tree),\n emit: {\n reorderStart: () => emit('reorder-start'),\n reorderCancel: () => emit('reorder-cancel'),\n reorderApplied: (payload) => emit('reorder-applied', payload),\n reorderApplyError: (err) => emit('reorder-apply-error', err),\n reorderEnd: () => emit('reorder-end'),\n },\n})\n\nconst canAdd = computed(() => canInteract.value && props.showAddButton && !reorderMode.value)\nconst dragEnabled = computed(() => reorderMode.value && !isTouch.value && !props.disableDrag)\n\nconst addLabelResolved = computed(() =>\n props.addLabel ? t(props.addLabel) : t('common.sortable.add'),\n)\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(\n () => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'),\n)\nconst deleteConfirmTextResolved = computed(\n () => props.deleteConfirmText ?? t('common.sortable.deleteConfirmText'),\n)\n\nconst reorderToggleVisible = computed<boolean>(\n (): boolean =>\n !props.readonly && props.showReorderToggle && !reorderMode.value && totalItemCount.value > 0,\n)\n\nconst compactReorderButton = computed<boolean>((): boolean => !!props.title && isNarrow.value)\n\n// Keys of every node that *has* children — the candidates for expand/collapse.\nconst expandableKeys = computed<ListEditorKey[]>(() => {\n const out: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n out.push(n.data[props.keyField] as ListEditorKey)\n walk(n.children)\n }\n }\n }\n walk(modelValue.value.children)\n return out\n})\n\nconst allExpanded = computed<boolean>(\n () =>\n expandableKeys.value.length > 0 &&\n expandableKeys.value.every((k) => childrenExpandedKeys.value.has(k)),\n)\n\nconst expandAllVisible = computed<boolean>(\n () => !reorderMode.value && expandableKeys.value.length > 0,\n)\n\nconst toggleExpandAll = () => {\n if (allExpanded.value) {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.delete(k)\n } else {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n }\n}\n\nconst headerVisible = computed<boolean>(\n (): boolean =>\n !!(\n props.title ||\n (slots as Record<string, unknown>).header ||\n (slots as Record<string, unknown>)['reorder-toggle'] ||\n reorderToggleVisible.value ||\n expandAllVisible.value ||\n reorderMode.value\n ),\n)\n\n// Initialize nested SortableJS groups. We create one Sortable instance per group\n// so drag/drop can move items within/between groups — SortableJS handles the\n// pointer events; onEnd reconciles via editor.moveTo().\nconst sortableInstances = ref<\n Array<{ stop: () => void; option?: (k: string, v: unknown) => void }>\n>([])\nconst forceRerender = ref(0)\n\nconst destroySortables = () => {\n for (const s of sortableInstances.value) {\n try {\n s.stop()\n } catch {\n // no-op\n }\n }\n sortableInstances.value = []\n}\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\n// Live drag state. `instruction` is recomputed on every pointermove while\n// drag is active — it encodes WHERE the dragged item will land (sibling-above/\n// below/make-child/blocked) and at WHAT DEPTH. The overlay template reads it\n// to render the drop indicator; `onEnd` applies it via `editor.moveTo`.\n//\n// We don't rely on SortableJS to move the DOM — onMove always returns false.\n// SortableJS is reduced to \"drag lifecycle + floating clone\"; hit-testing,\n// depth picking and the final mutation are all ours.\nconst dragState = ref<DragState | null>(null)\n\n// Drop indicator anchor geometry — kept in sync with CSS:\n// row-header padding-left (reorder mode) = 12px + depth * --ansle-indent(24)\n// drag handle icon size = 20px (VIcon size=\"20\")\n// Anchor X at depth 0 = padding-left (12) + half handle width (10) = 22px, so\n// the dot sits on top of the drag handle's visual centre and the line walks\n// right/left in 24px steps, visually matching the actual row indent hierarchy.\nconst INDENT_PX = 24\nconst ANCHOR_X = 22\n\nconst hitTestRow = (\n clientX: number,\n clientY: number,\n): { el: HTMLElement; viewItem: DecoratedNestedViewItem<TItem> } | null => {\n const hit = document.elementFromPoint(clientX, clientY) as HTMLElement | null\n if (!hit) return null\n const wrapper = hit.closest('.a-le-row-wrapper') as HTMLElement | null\n if (!wrapper) return null\n // Only consider wrappers inside our rowsContainer — elementFromPoint could\n // hit a different ANestedSortableListEditor instance on the same page.\n if (!rowsContainer.value || !rowsContainer.value.contains(wrapper)) return null\n const key = parseKey(wrapper.getAttribute('data-id'))\n if (key === null) return null\n const vi = viewItemsDecorated.value.find((v) => v.key === key)\n if (!vi) return null\n return { el: wrapper, viewItem: vi }\n}\n\nconst recomputeInstruction = (clientX: number, clientY: number) => {\n if (!dragState.value || !rowsContainer.value) return\n const hit = hitTestRow(clientX, clientY)\n if (!hit) {\n dragState.value.instruction = null\n return\n }\n const containerRect = rowsContainer.value.getBoundingClientRect()\n // For hovered-row rect we read the row element (not the whole wrapper,\n // whose height balloons when children are rendered). The wrapper's first\n // `.a-le-row` child is the header+body we want to hit-test.\n const rowEl = hit.el.querySelector(':scope > .a-le-row') as HTMLElement | null\n const rowRect = (rowEl ?? hit.el).getBoundingClientRect()\n dragState.value.instruction = computeInstruction({\n pointer: { x: clientX, y: clientY },\n hoveredRow: {\n key: hit.viewItem.key,\n rect: rowRect,\n depth: hit.viewItem.depth,\n parentKey: hit.viewItem.parentKey,\n siblingIndex: hit.viewItem.siblingIndex,\n siblingCount: hit.viewItem.siblingCount,\n },\n sourceKey: dragState.value.sourceKey,\n sourceSubtreeDepth: dragState.value.sourceSubtreeDepth,\n viewItems: viewItemsDecorated.value,\n maxDepth: props.maxDepth,\n indentPx: INDENT_PX,\n containerLeft: containerRect.left,\n containerPaddingLeft: ANCHOR_X,\n })\n}\n\nconst onPointerMove = (e: PointerEvent) => {\n recomputeInstruction(e.clientX, e.clientY)\n}\n\nconst applyInstruction = (inst: ExecutableInstruction, sourceKey: ListEditorKey) => {\n const res = editor.moveTo(sourceKey, inst.parentKey, inst.index)\n if (res === null) {\n showWarningT('common.sortable.error.maxDeepExceed')\n forceRerender.value++\n nextTick(() => initSortables())\n return\n }\n markMoved(sourceKey)\n // The dragged row landed as a new first child — expand the target so the\n // just-moved row stays visible instead of disappearing into a collapsed\n // branch. Only needed when we created a new parent (makeChild === true).\n if (inst.makeChild && inst.parentKey !== null) {\n childrenExpandedKeys.value.add(inst.parentKey)\n }\n}\n\nconst initSortables = () => {\n destroySortables()\n if (!dragEnabled.value) return\n if (!rowsContainer.value) return\n const groups = Array.from(rowsContainer.value.querySelectorAll<HTMLElement>('.' + GROUP_CLASS))\n for (const group of groups) {\n const sortable = useSortable(group, [], {\n group: { name: 'a-nested', pull: true, put: true },\n handle: '.' + HANDLE_CLASS,\n animation: 0,\n ghostClass: DRAG_GHOST_CLASS,\n chosenClass: DRAG_CHOSEN_CLASS,\n dragClass: DRAG_CLASS,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 3,\n onStart: (event) => {\n const draggedEl = event.item as HTMLElement\n const id = parseKey(draggedEl.getAttribute('data-id'))\n if (id === null) return\n const draggedNode = editor.findNode(id).node\n const subtreeDepth = draggedNode ? editor.calculateSubtreeDepth(draggedNode) : 1\n dragState.value = {\n sourceKey: id,\n sourceSubtreeDepth: subtreeDepth,\n instruction: null,\n }\n document.addEventListener('pointermove', onPointerMove, { passive: true })\n },\n onMove: (event) => {\n // Track pointer via SortableJS's event stream too (redundant with\n // document pointermove but keeps `instruction` in sync when the\n // browser coalesces pointermove events during fast drags).\n const orig = (event as unknown as { originalEvent?: Event }).originalEvent\n if (orig) {\n if ('clientX' in orig && 'clientY' in orig) {\n recomputeInstruction((orig as MouseEvent).clientX, (orig as MouseEvent).clientY)\n } else if ('touches' in orig) {\n const tev = orig as TouchEvent\n if (tev.touches.length > 0) {\n recomputeInstruction(tev.touches[0].clientX, tev.touches[0].clientY)\n }\n }\n }\n // Always refuse SortableJS's own DOM insertion — our overlay and\n // `editor.moveTo` in onEnd drive the actual move.\n return false\n },\n onEnd: () => {\n document.removeEventListener('pointermove', onPointerMove)\n const state = dragState.value\n dragState.value = null\n if (!state) return\n const inst = state.instruction\n if (inst === null) return\n if (inst.type === 'blocked') return\n applyInstruction(inst, state.sourceKey)\n },\n })\n sortableInstances.value.push(sortable)\n }\n}\n\nconst parseKey = (raw: string | null): ListEditorKey | null => {\n if (raw === null || raw === '') return null\n // Use the numeric key only when `data-id` is a pure integer string (incl.\n // negative temp ids like \"-1\"); otherwise it's a DocId/UUID string key.\n // `n > 0` wrongly sent negative temp ids to the string branch, so a freshly\n // added (unsaved) row's move marked the wrong key.\n const n = stringToInt(raw)\n return String(n) === raw ? n : raw\n}\n\nwatch(\n () => dragEnabled.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n else destroySortables()\n },\n)\n\nwatch(\n () => forceRerender.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n },\n)\n\n// Rebuild sortable instances whenever the tree shape changes during drag/drop mode —\n// otherwise newly rendered groups would not be draggable.\nwatch(\n () => viewItemsDecorated.value.map((v) => v.key).join('|'),\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n },\n)\n\nonMounted(() => {\n if (dragEnabled.value) initSortables()\n})\nonBeforeUnmount(() => {\n destroySortables()\n document.removeEventListener('pointermove', onPointerMove)\n})\n\n// Visual props derived from the current instruction. `null` = overlay hidden\n// — either because no instruction is active, or because the instruction is\n// `blocked`. The optional connector is a thin rail from the drop line up to\n// the row whose level dictates the insert (previous sibling or the ancestor\n// being joined as sibling of). Positions are computed from getBoundingClientRect\n// rather than CSS anchor positioning: nested row elements in a deep tree\n// aren't always reachable from an overlay-level anchor() call (Chrome's\n// anchor reachability rule excludes some deeply-nested descendants), so\n// JS measurement is both simpler and more reliable here.\ntype OverlayVisual = {\n line: { top: number; left: number; right: number }\n connector: { top: number; height: number; left: number } | null\n}\n\nconst overlayVisual = computed<OverlayVisual | null>(() => {\n const state = dragState.value\n if (!state || state.instruction === null || !rowsContainer.value) return null\n const inst = state.instruction\n // Blocked drops render nothing on purpose — the silent empty space IS the\n // \"not here\" signal. No warning-coloured ghost of the attempted target.\n if (inst.type === 'blocked') return null\n const refWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.refKey))}\"]`,\n )\n if (!refWrapper) return null\n const rowEl = refWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const containerRect = rowsContainer.value.getBoundingClientRect()\n const rowRect = (rowEl ?? refWrapper).getBoundingClientRect()\n\n const lineLeft = ANCHOR_X + inst.depth * INDENT_PX\n const lineTop =\n inst.refEdge === 'top' ? rowRect.top - containerRect.top : rowRect.bottom - containerRect.top\n const line = { top: lineTop, left: lineLeft, right: 16 }\n\n let connector: OverlayVisual['connector'] = null\n if (inst.levelRowKey !== null) {\n const levelWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.levelRowKey))}\"]`,\n )\n if (levelWrapper) {\n const levelRow = levelWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const levelRect = (levelRow ?? levelWrapper).getBoundingClientRect()\n const levelCentreY = levelRect.top - containerRect.top + levelRect.height / 2\n if (levelCentreY < lineTop) {\n connector = {\n top: levelCentreY,\n height: lineTop - levelCentreY,\n left: lineLeft,\n }\n }\n }\n }\n\n return { line, connector }\n})\n\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n emit('add', { afterId: vi.key, childrenAllowed: vi.childrenAllowed })\n}\n\nconst onAddChildClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n if (!vi.canAddChild) return\n requestAutoOpen()\n childrenExpandedKeys.value.add(vi.key)\n emit('add-child', vi)\n // Append to the end of existing children — matches the root-level \"Add\n // item\" button's semantic (append to end of root). Drag-drop make-child\n // still lands at index 0 because the drop line there is visually at the\n // gap immediately below the parent.\n emit('add', { parentId: vi.key, childrenAllowed: true })\n}\n\nconst onEditClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value || reorderMode.value) return\n // Clicking the edit affordance while already editing closes the form — so the\n // pencil button works as a toggle just like clicking the row header.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n }\n emit('edit', vi)\n}\n\n// Chevron click — toggles tree children visibility.\nconst onChevronClick = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = childrenExpandedKeys.value.has(key)\n if (currently) childrenExpandedKeys.value.delete(key)\n else childrenExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\n// Detail body toggle — controls the row's readonly-detail body (separate from tree).\nconst onDetailToggle = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = detailExpandedKeys.value.has(key)\n if (currently) detailExpandedKeys.value.delete(key)\n else detailExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\nconst isRowClickable = (vi: DecoratedNestedViewItem<TItem>): boolean => {\n if (props.disableRowClick) return false\n if (props.disabled || props.loading) return false\n if (reorderMode.value) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) onDetailToggle(vi)\n else onEditClick(vi)\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, NestedViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n detailExpandedKeys.value.delete(vi.key)\n childrenExpandedKeys.value.delete(vi.key)\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm,\n})\n\nconst onDeleteClick = async (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\nconst onSaveClick = async (vi: NestedViewItem<TItem>) => {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: NestedViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: NestedViewItem<TItem>) => {\n closeEdit(vi)\n emit('close', vi)\n}\n\nconst moveUp = (id: ListEditorKey) => {\n if (editor.moveUp(id)) markMoved(id)\n}\nconst moveDown = (id: ListEditorKey) => {\n if (editor.moveDown(id)) markMoved(id)\n}\nconst moveTop = (id: ListEditorKey) => {\n if (editor.moveTop(id)) markMoved(id)\n}\nconst moveBottom = (id: ListEditorKey) => {\n if (editor.moveBottom(id)) markMoved(id)\n}\nconst doIndent = (vi: NestedViewItem<TItem>) => {\n const res = editor.indent(vi.key)\n if (res === null) {\n showWarningT('common.sortable.error.maxDeepExceed')\n return\n }\n markMoved(vi.key)\n emit('indent', vi)\n}\nconst doOutdent = (vi: NestedViewItem<TItem>) => {\n const res = editor.outdent(vi.key)\n if (res === null) return\n markMoved(vi.key)\n emit('outdent', vi)\n}\n\nconst resolveCompactText = (raw: TItem): string =>\n resolveCompactTextUtil(raw, { compactField: props.compactField })\n\nconst { resolveValidation } = useValidationRegistry<TItem>({\n getValidationState: (item, key, index) => props.getValidationState?.(item, key, index) ?? null,\n})\n\n// Per-key actions cache: stable identity per row, see equivalent block in\n// AListEditor for rationale. Closures capture key (stable) and look up\n// the current vi via findVi at call time.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => NestedTree<TItem>\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n if (vi) return onSaveClick(vi)\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n addChild: () => {\n const vi = findVi(key)\n if (vi) onAddChildClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n toggleDetail: () => {\n const vi = findVi(key)\n if (vi) onDetailToggle(vi)\n },\n moveUp: () => moveUp(key),\n moveDown: () => moveDown(key),\n moveTop: () => moveTop(key),\n moveBottom: () => moveBottom(key),\n indent: () => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n outdent: () => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n update: (data: TItem) => editor.updateItem(key, data),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n },\n)\n\nconst buildSlotProps = (vi: DecoratedNestedViewItem<TItem>) => ({\n item: { ...vi, validationState: resolveValidation(vi.raw as TItem, vi.key, vi.index) },\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n depth: vi.depth,\n parent: vi.parent,\n parentKey: vi.parentKey,\n childrenCount: vi.childrenCount,\n hasChildren: vi.hasChildren,\n childrenAllowed: vi.childrenAllowed,\n firstInParent: vi.firstInParent,\n lastInParent: vi.lastInParent,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n childrenExpanded: vi.childrenExpanded,\n editing: vi.editing,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n moved: vi.moved,\n reorderMode: reorderMode.value,\n canMoveUp: !vi.firstInParent,\n canMoveDown: !vi.lastInParent,\n canIndent: vi.canIndent,\n canOutdent: vi.canOutdent,\n canAddChild: vi.canAddChild,\n touch: isTouch.value,\n actions: getActions(vi.key),\n})\n\nconst toolbarSlotProps = computed(() => ({\n applying: applying.value,\n hasPendingChanges: hasPendingChanges.value,\n movedCount: movedCount.value,\n error: applyError.value,\n actions: {\n apply: applyReorder,\n cancel: cancelReorderMode,\n },\n}))\n\nconst reorderToggleSlotProps = computed(() => ({\n mode: mode.value,\n disabled: !canEnterReorder.value,\n hasPendingChanges: hasPendingChanges.value,\n actions: {\n enterReorderMode,\n exitReorderMode: cancelReorderMode,\n },\n}))\n\nconst expandableKeySet = computed(() => new Set(expandableKeys.value))\n\nconst findVi = (key: ListEditorKey): DecoratedNestedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() =>\n viewItemsDecorated.value.map((vi) => ({\n key: vi.key,\n expanded: vi.childrenExpanded,\n canExpand: expandableKeySet.value.has(vi.key),\n canIndent: true,\n canOutdent: true,\n })),\n ),\n variant: 'nested',\n isReorderMode: reorderMode,\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n onMoveUp: (key) => moveUp(key),\n onMoveDown: (key) => moveDown(key),\n onMoveTop: (key) => moveTop(key),\n onMoveBottom: (key) => moveBottom(key),\n onIndent: (key) => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n onOutdent: (key) => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n onToggleChildren: (key) => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n onCancelReorder: () => cancelReorderMode(),\n})\n\nconst moveToPositionDialogOpen = ref<boolean>(false)\nconst moveToPositionTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst moveToPositionContext = computed<{\n parentId: ListEditorKey | null\n total: number\n currentIndex: number\n} | null>(() => {\n const target = moveToPositionTarget.value\n if (!target) return null\n const found = editor.findNode(target.key)\n const siblings = found.parent?.children ?? modelValue.value.children\n const idx = siblings.findIndex((s) => (s.data[props.keyField] as ListEditorKey) === target.key)\n return {\n parentId: found.parent ? (found.parent.data[props.keyField] as ListEditorKey) : null,\n total: siblings.length,\n currentIndex: idx,\n }\n})\nconst moveToPositionLabel = computed<string>(() =>\n moveToPositionTarget.value ? resolveCompactText(moveToPositionTarget.value.raw) : '',\n)\nconst openMoveToPosition = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showMoveToPosition) return\n moveToPositionTarget.value = vi\n moveToPositionDialogOpen.value = true\n}\nconst onMoveToPositionConfirm = (newIndex: number) => {\n const ctx = moveToPositionContext.value\n const target = moveToPositionTarget.value\n moveToPositionTarget.value = null\n if (!ctx || !target) return\n if (newIndex === ctx.currentIndex) return\n if (editor.moveTo(target.key, ctx.parentId, newIndex)) {\n markMoved(target.key)\n }\n}\n\nconst changeParentDialogOpen = ref<boolean>(false)\nconst changeParentTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst openChangeParent = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showChangeParent) return\n changeParentTarget.value = vi\n changeParentDialogOpen.value = true\n}\nconst onChangeParentConfirm = (parentId: ListEditorKey | null, position: 'first' | 'last') => {\n const target = changeParentTarget.value\n changeParentTarget.value = null\n if (!target) return\n // Determine sibling count under the new parent so 'last' becomes the right\n // numeric index. For 'first' the index is 0.\n let siblingCount = 0\n if (parentId === null) {\n siblingCount = modelValue.value.children.length\n } else {\n const found = editor.findNode(parentId)\n siblingCount = found.node?.children?.length ?? 0\n }\n const targetIndex = position === 'first' ? 0 : siblingCount\n if (editor.moveTo(target.key, parentId, targetIndex)) {\n markMoved(target.key)\n if (parentId !== null) childrenExpandedKeys.value.add(parentId)\n }\n}\n\n// Aggregated display flags + helpers passed into each <LeNestedRow>. Recomputed\n// reactively when any underlying dependency changes.\nconst rowContext = computed(() => ({\n reorderMode: reorderMode.value,\n readonly: props.readonly,\n canInteract: canInteract.value,\n dragEnabled: dragEnabled.value,\n showExpandToggle: props.showExpandToggle,\n showEditButton: props.showEditButton,\n showDeleteButton: props.showDeleteButton,\n showAddChildButton: props.showAddChildButton,\n showAddAfterAction: props.showAddAfterAction,\n showMoveToPosition: props.showMoveToPosition,\n showChangeParent: props.showChangeParent,\n showInlineSaveFooter: showInlineSaveFooter.value,\n statusField: props.statusField,\n effectiveCloseVariant: effectiveCloseVariant.value,\n keyboardNav,\n isRowClickable,\n resolveCompactText,\n resolveValidation: (raw: TItem, key?: ListEditorKey, index?: number) =>\n resolveValidation(raw, key, index),\n buildSlotProps,\n}))\n\n// Event callback bundle — each handler mutates the main component's local state\n// (editingKeys, expandedKeys, etc.) or delegates to the editor composable.\nconst rowCallbacks = {\n onRowClick,\n onChevronClick,\n onEditClick,\n onDeleteClick,\n onCloseClick,\n onSaveClick,\n onCancelClick,\n onAddAfterClick: onRowAddAfterClick,\n onAddChildClick,\n moveUp: (id: ListEditorKey) => moveUp(id),\n moveDown: (id: ListEditorKey) => moveDown(id),\n moveTop: (id: ListEditorKey) => moveTop(id),\n moveBottom: (id: ListEditorKey) => moveBottom(id),\n indent: doIndent,\n outdent: doOutdent,\n openMoveToPosition,\n openChangeParent,\n}\n\nconst rootViewItems = computed(() => viewItemsDecorated.value.filter((v) => v.parentKey === null))\n\n// Expose imperative API — mirrors legacy ASortableNested signatures for easier\n// migration of admin-cms consumers (LinkedListManage calls these on the ref).\n// These methods assume the caller has already persisted the change server-side,\n// so they re-capture the dirty baseline — the affected items should not render\n// as \"unsaved\" immediately after this call.\n//\n// All four `*ById` aliases are kept for backward-compat with the pre-Phase-7\n// `ASortableNested` API. New consumers should call `editor.addItem` /\n// `editor.deleteItem` / `editor.updateItem` directly via the exposed handle\n// (canonical names match the flat editors). The aliases will be removed in\n// the next major.\n\n/** @deprecated Use `addItem(data, { afterId, childrenAllowed })` directly. */\nconst addAfterId = (targetId: ListEditorKey | null, data: TItem, childrenAllowed: boolean) => {\n const res = editor.addItem(data, { afterId: targetId ?? undefined, childrenAllowed })\n nextTick(() => captureDirtyBaseline())\n return res\n}\n/** @deprecated Use `addItem(data, { parentId, asFirstChild: true, childrenAllowed })`. */\nconst addChildToId = (targetId: ListEditorKey, data: TItem, childrenAllowed: boolean) => {\n childrenExpandedKeys.value.add(targetId)\n const res = editor.addItem(data, { parentId: targetId, asFirstChild: true, childrenAllowed })\n nextTick(() => captureDirtyBaseline())\n return res\n}\n/** @deprecated Use `deleteItem(id)` instead. */\nconst removeById = (id: ListEditorKey) => {\n editor.deleteItem(id)\n editingKeys.value.delete(id)\n editingSnapshots.value.delete(id)\n detailExpandedKeys.value.delete(id)\n childrenExpandedKeys.value.delete(id)\n nextTick(() => captureDirtyBaseline())\n}\n/** @deprecated Use `updateItem(id, data)` instead. */\nconst updateData = (\n id: ListEditorKey,\n data: TItem,\n _children: unknown = null,\n _position: unknown = null,\n _markUnsaved: unknown = null,\n) => {\n editor.updateItem(id, data)\n nextTick(() => captureDirtyBaseline())\n}\n\nconst unsavedKeysModel = defineModel<Set<ListEditorKey>>('unsavedKeys', {\n default: () => new Set<ListEditorKey>(),\n})\n\nconst internalUnsavedKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const vi of viewItemsDecorated.value) {\n if (vi.unsaved) out.add(vi.key)\n }\n return out\n})\n// Let row validity sentinels surface 'invalid' as soon as their row is unsaved.\n// Includes each unsaved row's id/position too, so the lookup matches whatever\n// key the sentinel registers under (which may differ from the editor's key-field).\nconst unsavedValidationKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const vi of viewItemsDecorated.value) {\n if (!vi.unsaved) continue\n out.add(vi.key)\n const raw = vi.raw as Record<string, any>\n if (raw.id !== undefined && raw.id !== null) out.add(raw.id)\n if (raw.position !== undefined && raw.position !== null) out.add(raw.position)\n }\n return out\n})\nprovide(ListEditorUnsavedKeysKey, unsavedValidationKeys)\n\nconst { hasUnsavedChanges, unsavedCount, clearUnsavedState } = useUnsavedKeysSync({\n unsavedKeysModel,\n internalUnsavedKeys,\n onClearAll: () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n // Collapse open inline-edit forms once the parent persisted.\n clearEditing()\n },\n onClearKey: (key) => {\n rebaselineKey(key)\n movedKeys.value.delete(key)\n },\n})\n\n// Registers this editor as a named unsaved-changes section when the consumer\n// passes a label — replaces the per-consumer useUnsavedSection boilerplate.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel\n ? { label: props.unsavedSectionLabel, dirty: unsavedCount.value > 0 }\n : [],\n)\n\ndefineExpose({\n addItem: editor.addItem,\n addAfterId,\n addChildToId,\n removeById,\n updateData,\n updateItem: editor.updateItem,\n deleteItem: editor.deleteItem,\n moveUp: editor.moveUp,\n moveDown: editor.moveDown,\n moveTop: editor.moveTop,\n moveBottom: editor.moveBottom,\n indent: editor.indent,\n outdent: editor.outdent,\n moveTo: editor.moveTo,\n recalculatePositions: editor.recalculatePositions,\n viewItems: editor.viewItems,\n resetDirtyBaseline,\n hasUnsavedChanges,\n unsavedCount,\n clearUnsavedState,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n // Tree children visibility (expand/collapse a branch)\n expand: (id: ListEditorKey) => childrenExpandedKeys.value.add(id),\n collapse: (id: ListEditorKey) => childrenExpandedKeys.value.delete(id),\n toggleExpand: (id: ListEditorKey) => {\n if (childrenExpandedKeys.value.has(id)) childrenExpandedKeys.value.delete(id)\n else childrenExpandedKeys.value.add(id)\n },\n // Row readonly-detail body visibility\n expandDetail: (id: ListEditorKey) => detailExpandedKeys.value.add(id),\n collapseDetail: (id: ListEditorKey) => detailExpandedKeys.value.delete(id),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-nested-list-editor\"\n :class=\"[\n `a-nested-list-editor--mode-${mode}`,\n {\n 'a-nested-list-editor--readonly': readonly,\n 'a-nested-list-editor--disabled': disabled,\n 'a-nested-list-editor--touch': isTouch,\n 'a-nested-list-editor--drag-enabled': dragEnabled,\n },\n ]\"\n >\n <div class=\"a-le-card\">\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n <div class=\"a-le-header-actions\">\n <template v-if=\"reorderMode\">\n <!-- Reorder-mode header: pending-changes count + Cancel/Apply.\n Replaces the old sticky bottom toolbar — the actions sit\n where the \"Reorder\" button lives in view mode, so the eye\n doesn't have to hunt down the bottom of the widget. -->\n <slot\n name=\"reorder-toolbar\"\n v-bind=\"toolbarSlotProps\"\n >\n <LeStatus\n :class=\"{ 'a-le-toolbar-status--pending': hasPendingChanges }\"\n :has-pending-changes=\"hasPendingChanges\"\n :pending-count=\"movedCount\"\n :error=\"applyError\"\n />\n <VBtn\n variant=\"text\"\n size=\"small\"\n :disabled=\"applying\"\n @click=\"cancelReorderMode\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n size=\"small\"\n prepend-icon=\"mdi-check\"\n :loading=\"applying\"\n :disabled=\"applying || !hasPendingChanges\"\n @click=\"applyReorder\"\n >\n {{ t('common.sortable.reorderApply') }}\n </VBtn>\n </slot>\n </template>\n <template v-else>\n <VBtn\n v-if=\"expandAllVisible && compactReorderButton\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n @click=\"toggleExpandAll\"\n >\n <VIcon\n :icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"\n allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\n \"\n />\n </VBtn>\n <VBtn\n v-else-if=\"expandAllVisible\"\n variant=\"tonal\"\n color=\"primary\"\n size=\"small\"\n :prepend-icon=\"\n allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\n \"\n @click=\"toggleExpandAll\"\n >\n {{\n allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\n }}\n </VBtn>\n <slot\n v-if=\"reorderToggleVisible\"\n name=\"reorder-toggle\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <VBtn\n v-if=\"compactReorderButton\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n <VIcon\n icon=\"mdi-sort\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.reorder')\"\n />\n </VBtn>\n <VBtn\n v-else\n variant=\"tonal\"\n color=\"primary\"\n prepend-icon=\"mdi-sort\"\n size=\"small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n {{ t('common.sortable.reorder') }}\n </VBtn>\n </slot>\n </template>\n </div>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <div\n v-else\n :key=\"forceRerender\"\n ref=\"rowsContainer\"\n class=\"a-nested-list-editor__rows\"\n :class=\"{ 'a-nested-list-editor__rows--dragging': dragState !== null }\"\n >\n <div\n :class=\"[GROUP_CLASS, 'a-nested-list-editor__group--root']\"\n data-parent-id=\"\"\n >\n <LeNestedRow\n v-for=\"vi in rootViewItems\"\n :key=\"String(vi.key)\"\n :vi=\"vi\"\n :view-items=\"viewItemsDecorated\"\n :drag-state=\"dragState\"\n :context=\"rowContext\"\n :callbacks=\"rowCallbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n\n <!-- Drop indicator overlay — only rendered for valid drops. Horizontal\n line at a row edge (depth encoded in `left` offset) plus an\n optional vertical connector rail linking the line up to the row\n whose level the insert will match. Blocked drops render nothing\n at all — the silent empty space IS the \"not here\". -->\n <template v-if=\"overlayVisual !== null\">\n <div\n v-if=\"overlayVisual.connector !== null\"\n class=\"a-nested-list-editor__drop-connector\"\n :style=\"{\n left: `${overlayVisual.connector.left}px`,\n top: `${overlayVisual.connector.top}px`,\n height: `${overlayVisual.connector.height}px`,\n }\"\n />\n <div\n class=\"a-nested-list-editor__drop-line\"\n :style=\"{\n top: `${overlayVisual.line.top}px`,\n left: `${overlayVisual.line.left}px`,\n right: `${overlayVisual.line.right}px`,\n }\"\n >\n <span class=\"a-nested-list-editor__drop-line-dot\" />\n </div>\n </template>\n </div>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeMoveToPositionDialog\n v-model=\"moveToPositionDialogOpen\"\n :total=\"moveToPositionContext?.total ?? 0\"\n :current-index=\"moveToPositionContext?.currentIndex ?? 0\"\n :item-label=\"moveToPositionLabel\"\n @confirm=\"onMoveToPositionConfirm\"\n />\n\n <LeChangeParentDialog\n v-model=\"changeParentDialogOpen\"\n :tree=\"modelValue\"\n :source-key=\"changeParentTarget?.key ?? null\"\n :key-field=\"keyField\"\n :max-depth=\"maxDepth\"\n :resolve-label=\"resolveCompactText\"\n :calculate-subtree-depth=\"editor.calculateSubtreeDepth\"\n @confirm=\"onChangeParentConfirm\"\n />\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use './styles/tokens';\n@use './styles/shared';\n\n// Variant-specific rules for ANestedSortableListEditor — depth-aware padding,\n// tree toggle caret, children groups, drop indicator overlay, drag clone.\n.a-nested-list-editor {\n // Depth-aware left padding — caret column + indent per depth level.\n .a-le-row-header {\n padding: var(--le-row-pad-y) 12px var(--le-row-pad-y)\n calc(16px + var(--nested-depth, 0) * var(--le-indent));\n }\n\n // Row wrappers + inter-row group layout.\n &__rows {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n &__group {\n display: flex;\n flex-direction: column;\n }\n\n // Toolbar-status uses the shorthand `font: 500 13px/1 var(...)` — the\n // shared class emits the equivalent longhand for the flat variants. Re-apply\n // the shorthand here so the nested variant keeps its explicit line-height\n // reset.\n .a-le-toolbar-status {\n font: 500 13px/1 var(--v-font-body, inherit);\n }\n}\n\n.a-le-row-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.a-nested-list-editor {\n // Root-level rows carry a bolder title weight to anchor the visual\n // hierarchy without separate header rows.\n .a-le-row:not(.a-le-row--child) .a-le-title {\n font-weight: 600;\n }\n\n // Reorder mode — depth-aware padding matches the flat variant's shape but\n // offset by the row's indent level.\n .a-le-row--reorder .a-le-row-header {\n padding-left: calc(12px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 8px;\n gap: 8px;\n }\n\n // Active (editing / readonly-expanded) tree-toggle picks up the primary\n // tint so the whole header reads \"active\" together with the title color.\n .a-le-row--editing &__tree-toggle,\n .a-le-row--expanded &__tree-toggle {\n color: var(--le-primary);\n }\n\n // Children wrapper — flat layout; depth is conveyed by the row's\n // padding-left indent alone (no background tint or tree guide line).\n &__children {\n position: relative;\n }\n\n // Triangle-caret toggle — VBtn-text-style circular button: transparent by\n // default, subtle tinted circle on hover so the affordance is obvious.\n // Size matches the flat icon-btn rhythm (24×24) with the triangle\n // optically centred.\n &__tree-toggle {\n width: 24px;\n height: 24px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n color: rgb(0 0 0 / 54%);\n z-index: 2;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s;\n\n &:hover {\n background: rgb(0 0 0 / 5%);\n color: var(--le-on-surface);\n }\n\n &:focus-visible {\n outline: none;\n background: rgb(0 0 0 / 8%);\n }\n }\n\n // Spacer keeps caret column width reserved on leaf rows so titles align\n // vertically across siblings regardless of whether they have children.\n &__tree-toggle--spacer,\n &__tree-toggle--empty {\n width: 24px;\n height: 24px;\n background: transparent;\n visibility: hidden;\n pointer-events: none;\n }\n\n // Pure CSS right-pointing triangle; rotates to down when the row is open.\n &__tree-toggle-caret {\n width: 0;\n height: 0;\n border-left: 5px solid currentcolor;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-right: 0;\n transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(1px); // optical centering — triangle leans left\n }\n\n &__tree-toggle--open &__tree-toggle-caret {\n transform: translate(0, 1px) rotate(90deg);\n }\n\n // Source row + every descendant inside the dragged subtree — dimmed and\n // made non-hittable during drag. `!important` on display beats SortableJS's\n // inline `display: none` under `forceFallback: true`.\n .a-le-row-wrapper.a-le-row--chosen,\n .a-le-row-wrapper.a-le-row-wrapper--drop-disabled {\n display: flex !important;\n opacity: 0.4 !important;\n pointer-events: none !important;\n }\n\n // Hide SortableJS's own placeholder — our overlay (drop-line / drop-box)\n // is the sole landing indicator.\n .a-le-row--ghost {\n display: none !important;\n }\n\n // No floating clone at the cursor — for nested trees the line overlay\n // carries all the \"where will it land\" information; a ghost card dragging\n // behind the pointer is pure noise. The selector matches the wrapper to\n // beat the `.row-wrapper--drop-disabled` rule that the clone inherits.\n .a-le-row-wrapper.a-le-row--drag {\n display: none !important;\n }\n\n // Drop indicator line — 2 px primary stroke with an 8 px terminal dot on\n // the left that bleeds 4 px outside the anchor column. Absolute-positioned\n // inside `__rows` (position: relative).\n &__drop-line {\n position: absolute;\n height: 2px;\n margin-top: -1px;\n background: var(--le-primary);\n pointer-events: none;\n z-index: 4;\n border-radius: 1px;\n }\n\n &__drop-line-dot {\n position: absolute;\n left: -4px;\n top: 50%;\n width: 8px;\n height: 8px;\n background: var(--le-primary);\n border-radius: 50%;\n transform: translateY(-50%);\n }\n\n // Connector rail — thin vertical line linking the drop indicator line up\n // to the row whose level is being matched.\n &__drop-connector {\n position: absolute;\n width: 2px;\n margin-left: -1px;\n background: var(--le-primary);\n opacity: 0.5;\n pointer-events: none;\n z-index: 3;\n }\n\n // While dragging, dim the add-button so focus stays on the drag target.\n &__rows--dragging .a-le-row-add {\n opacity: 0.4;\n }\n\n // \"+N\" children indicator — rendered on every row with children, but\n // hidden in the normal DOM. Only becomes visible inside the SortableJS\n // drag clone (carrying `.a-le-row--drag`) so the user sees that the\n // whole branch will follow the item being moved.\n &__drag-count {\n display: none;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n padding: 2px 8px;\n font: 500 11px/1 var(--v-font-body, inherit);\n letter-spacing: 0.02em;\n color: var(--le-primary);\n background: var(--le-primary-container);\n border-radius: var(--le-radius-pill);\n flex-shrink: 0;\n }\n\n .a-le-row--drag &__drag-count {\n display: inline-flex;\n }\n}\n\n// Container-query driven desktop layout — depth-aware padding-left so the\n// inline form aligns with the row title column: 16 (pad) + depth*24 (indent)\n// + 24 (caret) + 10 (gap) = 50 + depth*indent.\n@container le-shell (min-width: 769px) {\n .a-nested-list-editor {\n .a-le-row--editing .a-le-row-body,\n .a-le-row--expanded .a-le-row-body,\n .a-le-row--editing .a-le-row-footer,\n .a-le-row--expanded .a-le-row-footer {\n padding-left: calc(50px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 16px;\n }\n }\n}\n\n// Narrow-container / mobile layout — tighter indent so deep branches still\n// fit, taller rows for comfortable touch targets, always-visible actions,\n// status badge dropped to make room for the title.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-nested-list-editor {\n --le-indent: 18px;\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu,\n .a-le-row .a-le-action--up,\n .a-le-row .a-le-action--down,\n .a-le-row .a-le-action--add-child {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\n\nexport interface Props {\n title?: string\n body?: string\n stayLabel?: string\n discardLabel?: string\n /**\n * Names of the dirty sections (from the guard's `dirtyLabels`). When\n * non-empty the dialog lists them instead of the generic body message.\n */\n dirtyLabels?: string[]\n}\n\nwithDefaults(defineProps<Props>(), {\n title: undefined,\n body: undefined,\n stayLabel: undefined,\n discardLabel: undefined,\n dirtyLabels: () => [],\n})\n\nconst emit = defineEmits<{\n resolve: [discard: boolean]\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n\nconst { t } = useI18n()\n\nconst onStay = () => {\n emit('resolve', false)\n}\n\nconst onDiscard = () => {\n emit('resolve', true)\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"480\"\n persistent\n >\n <VCard>\n <VCardTitle>\n {{ title ?? t('common.sortable.unsavedChanges.title') }}\n </VCardTitle>\n <VCardText>\n <template v-if=\"body\">\n {{ body }}\n </template>\n <template v-else-if=\"dirtyLabels.length\">\n {{ t('common.sortable.unsavedChanges.sectionsIntro') }}\n <ul class=\"a-unsaved-sections\">\n <li\n v-for=\"(label, i) in dirtyLabels\"\n :key=\"i\"\n >\n {{ label }}\n </li>\n </ul>\n {{ t('common.sortable.unsavedChanges.leaveQuestion') }}\n </template>\n <template v-else>\n {{ t('common.sortable.unsavedChanges.body') }}\n </template>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <VBtn\n variant=\"text\"\n @click=\"onStay\"\n >\n {{ stayLabel ?? t('common.sortable.unsavedChanges.stay') }}\n </VBtn>\n <VBtn\n color=\"warning\"\n variant=\"flat\"\n @click=\"onDiscard\"\n >\n {{ discardLabel ?? t('common.sortable.unsavedChanges.discard') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style scoped lang=\"scss\">\n.a-unsaved-sections {\n margin: 8px 0;\n padding-left: 20px;\n\n li {\n font-weight: 500;\n }\n}\n</style>\n","import {\n computed,\n getCurrentInstance,\n onBeforeUnmount,\n ref,\n watch,\n type ComputedRef,\n type Ref,\n} from 'vue'\nimport { onBeforeRouteLeave } from 'vue-router'\nimport {\n provideUnsavedSectionRegistry,\n type UnsavedSectionDescriptor,\n type UnsavedSectionSource,\n} from '@/labs/unsavedGuard/useUnsavedSection'\n\ntype UnsavedSource = Ref<boolean | Set<unknown> | unknown[] | null | undefined>\n\nexport interface UseUnsavedChangesGuardOptions {\n /**\n * Reactive sources that signal \"unsaved\" state. Each source's truthiness is\n * checked: a Set/array is \"dirty\" when non-empty, a boolean when true, null\n * or undefined as not dirty.\n */\n sources: UnsavedSource[]\n /**\n * Block route navigation via vue-router's onBeforeRouteLeave. Default true.\n * When omitted/false, the route guard is not registered.\n */\n guardRoute?: boolean | Ref<boolean>\n /**\n * Block window/tab unload via beforeunload. Default true.\n */\n guardWindowUnload?: boolean | Ref<boolean>\n /**\n * Optional Vuetify dialog v-model. When provided, attempts to close the\n * dialog while dirty are intercepted: dialog stays open until the user\n * confirms via the confirm dialog or via `acknowledge()`.\n */\n guardDialogModel?: Ref<boolean>\n /**\n * Named sections owned by the guard host component itself. Descendants use\n * `useUnsavedSection` instead — but a component can't `inject` its own\n * `provide`, so when the host *is* the section owner (e.g. a dialog), pass\n * the sections here.\n */\n ownSections?: UnsavedSectionSource\n}\n\nexport interface UseUnsavedChangesGuardApi {\n hasUnsavedChanges: ComputedRef<boolean>\n /**\n * Labels of the dirty sections registered by descendants via\n * `useUnsavedSection`. Bind to `AUnsavedConfirmDialog`'s `dirtyLabels` prop\n * so the dialog names *which* parts are unsaved. Empty when no descendant\n * registered a section (dialog falls back to the generic message).\n */\n dirtyLabels: ComputedRef<string[]>\n /**\n * v-model-bound to the confirm dialog. When the guard wants to ask the user\n * to confirm leaving, it sets this to true. The confirm dialog reads it.\n */\n promptOpen: Ref<boolean>\n /**\n * Resolves the confirm prompt with `discard=true` (proceed) or `false`\n * (stay). Called by the confirm dialog.\n */\n resolvePrompt: (discard: boolean) => void\n /**\n * Manually mark the most recent intent as acknowledged so the next\n * route/dialog/unload attempt proceeds without prompting. Useful right\n * before a programmatic navigation that the consumer has already\n * confirmed.\n */\n acknowledge: () => void\n}\n\nconst isTruthySource = (value: unknown): boolean => {\n if (value === null || value === undefined) return false\n if (typeof value === 'boolean') return value\n if (value instanceof Set) return value.size > 0\n if (Array.isArray(value)) return value.length > 0\n return Boolean(value)\n}\n\nconst resolveBool = (v: boolean | Ref<boolean> | undefined, fallback: boolean): boolean => {\n if (v === undefined) return fallback\n if (typeof v === 'boolean') return v\n return v.value\n}\n\nexport function useUnsavedChangesGuard(\n options: UseUnsavedChangesGuardOptions,\n): UseUnsavedChangesGuardApi {\n // Provide a section registry so descendants can name their dirty sections\n // via `useUnsavedSection`. The dialog reads `dirtyLabels` from this.\n const sectionRegistry = provideUnsavedSectionRegistry()\n\n // The host component can't inject its own provide, so register its own\n // sections directly.\n if (options.ownSections) {\n const ownSections = options.ownSections\n const id = Symbol('unsaved.section.own')\n const normalized = computed<UnsavedSectionDescriptor[]>(() => {\n const resolved = ownSections()\n return Array.isArray(resolved) ? resolved : [resolved]\n })\n sectionRegistry.register(id, normalized)\n }\n\n const hasUnsavedChanges = computed<boolean>(\n () =>\n options.sources.some((s) => isTruthySource(s.value)) ||\n sectionRegistry.dirtyLabels.value.length > 0,\n )\n\n const promptOpen = ref<boolean>(false)\n let pendingResolver: ((discard: boolean) => void) | null = null\n let acknowledgedOnce = false\n\n const askToLeave = (): Promise<boolean> => {\n if (acknowledgedOnce) {\n acknowledgedOnce = false\n return Promise.resolve(true)\n }\n return new Promise((resolve) => {\n pendingResolver = resolve\n promptOpen.value = true\n })\n }\n\n const resolvePrompt = (discard: boolean) => {\n promptOpen.value = false\n if (pendingResolver) {\n pendingResolver(discard)\n pendingResolver = null\n }\n }\n\n const acknowledge = () => {\n acknowledgedOnce = true\n }\n\n // Route guard — `onBeforeRouteLeave` only works inside a route component\n // (it reads the current vm context). Outside a component it's a no-op.\n if (resolveBool(options.guardRoute, true) && getCurrentInstance()) {\n try {\n onBeforeRouteLeave(async () => {\n if (!hasUnsavedChanges.value) return true\n const discard = await askToLeave()\n return discard\n })\n } catch {\n // Not in a route context — skip silently.\n }\n }\n\n // beforeunload — modern browsers strip custom messages but still display a\n // generic confirm. Setting `returnValue` is the canonical way to opt in.\n if (resolveBool(options.guardWindowUnload, true)) {\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n if (!hasUnsavedChanges.value) return\n e.preventDefault()\n e.returnValue = ''\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', onBeforeUnload)\n onBeforeUnmount(() => {\n window.removeEventListener('beforeunload', onBeforeUnload)\n })\n }\n }\n\n // Dialog guard — when the parent dialog tries to close while dirty, intercept\n // and ask the user to confirm. The parent dialog model goes from false→true\n // (open) to true→false (closing); we re-open it while we await the prompt.\n if (options.guardDialogModel) {\n const dialogModel = options.guardDialogModel\n let suppressNext = false\n watch(dialogModel, async (now, prev) => {\n if (suppressNext) {\n suppressNext = false\n return\n }\n if (prev === true && now === false && hasUnsavedChanges.value) {\n // Re-open the dialog while we wait for the user's choice.\n suppressNext = true\n dialogModel.value = true\n const discard = await askToLeave()\n if (discard) {\n suppressNext = true\n dialogModel.value = false\n }\n }\n })\n }\n\n return {\n hasUnsavedChanges,\n dirtyLabels: sectionRegistry.dirtyLabels,\n promptOpen,\n resolvePrompt,\n acknowledge,\n }\n}\n","import type { Ref } from 'vue'\nimport { useListEditorItemValidation } from '@/labs/listEditor/composables/useListEditorItemValidation'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\n/**\n * Minimal surface of a vuelidate instance the sentinel reads — any\n * `useVuelidate()` return value is structurally assignable.\n */\nexport interface VuelidateSentinelSource {\n $invalid: boolean\n $anyDirty: boolean\n}\n\n/**\n * Registers a row's vuelidate state with the surrounding list editor so the\n * row shows the red invalid rail (invalid + unsaved/dirty) instead of amber.\n *\n * This is the one blessed shape for row validity sentinels — domain sentinels\n * call their validation composable and delegate here:\n *\n * ```ts\n * const item = computed(() => props.modelValue)\n * const { v$ } = useReviewListItemValidation(item)\n * useListEditorVuelidateSentinel(v$, () => item.value.id ?? item.value.position)\n * ```\n *\n * `key` must return the same key the editor resolves for the row\n * (its `key-field`) or the item's own id/position — the editor's validation\n * registry accepts either.\n */\nexport function useListEditorVuelidateSentinel(\n v$: Ref<VuelidateSentinelSource>,\n key: () => ListEditorKey,\n): void {\n useListEditorItemValidation({\n key,\n invalid: () => v$.value.$invalid,\n dirty: () => v$.value.$anyDirty,\n })\n}\n","let seq = 0\n\n/**\n * Unique negative temp id for new (unsaved) list rows.\n *\n * Row keys must be unique per row — duplicate or missing keys break dirty\n * tracking, validation rails and reorder targeting. A single module-wide\n * negative sequence guarantees uniqueness across all factories (two domain\n * factories can no longer both hand out `-1`), and can never collide with\n * persisted ids, which are positive. The backend assigns real ids on save.\n */\nexport const nextListEditorTempId = (): number => --seq\n","import { computed, ref, type ComputedRef, type Ref } from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface UseNestedUnsavedKeysApi {\n /** Set of unsaved keys for one parent row — used as the inner editor's `v-model:unsaved-keys`. */\n getForParent: (parentKey: ListEditorKey) => Set<ListEditorKey>\n /** Push a child editor's unsaved-key set up under `parentKey`. */\n setForParent: (parentKey: ListEditorKey, set: Set<ListEditorKey>) => void\n /**\n * Aggregated set with prefix-merged keys (`${parentKey}:${childKey}`) so two\n * different parents can't collide on a shared child key (typical for newly\n * created rows whose `id` is `0` until the API assigns one).\n */\n merged: ComputedRef<Set<ListEditorKey>>\n /** Total count across all parents — handy for the parent v-model:unsaved-keys. */\n count: ComputedRef<number>\n}\n\n/**\n * Aggregates per-parent child-editor unsaved-keys into one prefix-merged set.\n * Used by stacked editors (e.g. quiz: questions → answers) so the outer\n * editor's parent gets a single merged `Set<ListEditorKey>` to thread into a\n * unsaved-changes guard, without losing per-parent identity.\n *\n * Key collision matters: a brand-new question and a brand-new answer both\n * have `id: 0` from the factory; without the prefix the answers from two\n * different questions would dedupe into one entry and the count would\n * under-report. Prefix `${parentKey}:${childKey}` keeps them distinct.\n *\n * Usage:\n * const childSets = useNestedUnsavedKeys()\n * <ChildEditor\n * :unsaved-keys=\"childSets.getForParent(parent.id)\"\n * @update:unsaved-keys=\"(s) => childSets.setForParent(parent.id, s)\"\n * />\n * // emit `childSets.merged.value` upward\n *\n * IMPORTANT: when the parent editor uses `manage-delete`, clear the removed\n * parent's entry on its `@deleted` — `setForParent(deletedKey, new Set())` —\n * otherwise the deleted row's stale child-unsaved keys keep `merged` non-empty\n * and the unsaved-changes guard lingers after an add-then-delete.\n */\nexport function useNestedUnsavedKeys(): UseNestedUnsavedKeysApi {\n const byParent: Ref<Map<ListEditorKey, Set<ListEditorKey>>> = ref(new Map())\n\n const empty = new Set<ListEditorKey>()\n\n const getForParent = (parentKey: ListEditorKey): Set<ListEditorKey> =>\n byParent.value.get(parentKey) ?? empty\n\n const setForParent = (parentKey: ListEditorKey, set: Set<ListEditorKey>) => {\n if (set.size === 0) {\n byParent.value.delete(parentKey)\n } else {\n byParent.value.set(parentKey, set)\n }\n // Trigger reactivity for `merged` — Map mutations are tracked in Vue 3,\n // but we want a defensive re-emit by reassigning on every call so\n // consumers using shallow equality see a new identity.\n byParent.value = new Map(byParent.value)\n }\n\n const merged = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const [parentKey, set] of byParent.value.entries()) {\n for (const childKey of set) {\n out.add(`${String(parentKey)}:${String(childKey)}`)\n }\n }\n return out\n })\n\n const count = computed<number>(() => merged.value.size)\n\n return { getForParent, setForParent, merged, count }\n}\n"],"names":["emit","__emit","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","provide","FilterSubmitResetCounterKey","ref","FilterSelectedKey","submitFilter","_createBlock","_component_VForm","__props","_renderSlot","_ctx","props","modelValue","_useModel","pagination","DatatablePaginationKey","t","useI18n","defaultItemsCreatedAt","SortOrder","defaultItemsId","defaultItemsMostRelevant","SORT_BY_SCORE","activeTitle","computed","found","options","item","onItemClick","paginationUpdateDefault","watch","newValue","oldValue","option","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_unref","_createVNode","_component_VBtn","_createTextVNode","_component_VMenu","_component_VList","_Fragment","_renderList","_component_VListItem","$event","_component_VListItemTitle","_normalizeClass","setStoredPage","useDatatablePageStore","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","isNull","disabledNext","computedTotalCountText","onClickFirst","useThrottleFn","onClickLast","onClickPrev","onClickNext","_component_VBtnToggle","_cache","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","generateByIdsApiQuery","ids","isSearchApi","field","querySetLimit","querySetOffset","querySetOrder","queryBuild","queryAddFilter","queryAdd","useApiQueryBuilder","limit","useApiFetchByIds","params","client","system","entity","urlTemplate","urlParams","silentConsoleError","abortController","fetchParams","urlTemplateOverride","urlParamsOverride","resolvedParams","isDefined","template","url","replaceUrlParameters","res","isValidHTTPStatus","AnzuApiResponseCodeError","HTTP_STATUS_NO_CONTENT","AnzuFatalError","err","isAnzuApiResponseCodeError","axiosErrorResponseIsForbidden","AnzuApiForbiddenError","axiosErrorResponseHasValidationData","AnzuApiValidationError","axiosErrorResponseHasDependencyExistsData","AnzuApiDependencyExistsError","axiosErrorResponseHasForbiddenOperationData","AnzuApiForbiddenOperationError","axiosErrorIsTimeout","AnzuApiTimeoutError","axios","AnzuApiAxiosError","useApiFetchListBatch","sortBy","sortDesc","batchSize","forceElastic","searchApi","usePagination","results","generateListQuery","resData","isApiInfiniteResponseList","nextPageData","isApiResponseList","promises","numPages","i","pageCopy","paginationRef","pageResponse","END_POINT","ENTITY","useJobApi","useApiFetchList","id","apiFetchOne","data","type","stringToKebabCase","apiCreateOne","apiDeleteOne","defaultColumn","DatatableColumnsConfigMoreOptionsDefault","createDatatableColumnsConfig","config","columnsHidden","subject","moreOptions","localI18n","i18n","storeKey","isString","isBoolean","columnsAll","obj","DATETIME_AUTO_LABEL_TRACKING","columnsVisible","columns","column","loadStoredColumns","stored","storedData","isObject","isArray","storeColumns","onMounted","useSubjectSelect","datatableConfig","datatableHiddenColumns","executeFetch","filterSortBy","enableActions","filterTouched","items","selected","loading","setSortBy","incrementPage","resetFilter","useFilterHelpers","showErrorsDefault","useAlerts","onOpen","resetState","getListDebounced","sortByChange","onFetchNextPage","e","getList","useDebounceFn","event","eventTarget","parent","firstTd","input","dialogLocal","dialog","paginationComputed","toRaw","mdAndDown","useDisplay","sidebarLeft","closeSidebarOnMobile","SubjectSelectCloseSidebarKey","selectedItemsCount","disabledSubmit","toggleSidebar","onClose","onConfirm","fetchNextPage","onPageChange","hasNextPage","autoloadOnIntersect","isIntersecting","__expose","withModifiers","_component_VDialog","_mergeProps","_component_VCard","ADialogToolbar","_component_VToolbar","_component_VIcon","_component_VTooltip","_hoisted_7","_hoisted_8","_component_ABtnSecondary","_vShow","ADatatablePagination","_hoisted_9","_component_VSpacer","_component_ABtnPrimary","slots","useSlots","display","rootEl","useTemplateRef","isTouch","editor","useListEditor","expandedKeys","rowsContainer","isInlineEdit","hasReadonlyDetail","captureDirtyBaseline","rebaselineKey","isItemDirty","ignoreNextSourceChange","useDirtyBaseline","editingKeys","editingSnapshots","beginEdit","cancelEdit","commitEdit","closeEdit","requestAutoOpen","clearEditing","useInlineEditing","key","it","hit","addLabelResolved","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","canInteract","canAdd","headerVisible","showInlineSaveFooter","dirtyKeys","out","decoratorCache","viewItemsDecorated","next","liveKeys","vi","editing","expanded","dirty","cached","decorated","isEmpty","findVi","v","keyboardNav","useKeyboardNav","resolveCompactText","raw","resolveCompactTextUtil","resolveValidation","useValidationRegistry","index","addViaFactory","positionHint","result","x","onAddClick","onRowAddAfterClick","onEditClick","onCloseClick","onExpandClick","currentlyExpanded","k","isRowClickable","onRowClick","deleteDialog","deleteInFlight","deleteError","triggerDeleteClick","onDeleteDialogConfirm","onDeleteDialogCancel","useDeleteDialog","onDeleteClick","onSaveClick","onCancelClick","actionsCache","getActions","actions","now","buildSlotProps","unsavedKeysModel","internalUnsavedKeys","unsavedValidationKeys","ListEditorUnsavedKeysKey","hasUnsavedChanges","unsavedCount","clearUnsavedState","useUnsavedKeysSync","useUnsavedSection","_component_VProgressCircular","_component_VAlert","LeEmptyState","LeUnsavedLabel","_hoisted_10","_hoisted_11","_hoisted_12","_withModifiers","$slots","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","LeDeleteDialog","_hoisted_18","DEFAULT_KEY_FIELD","DEFAULT_POSITION_FIELD","DEFAULT_PARENT_FIELD","useNestedListEditor","model","keyField","positionField","parentField","positionMultiplier","maxDepth","getKey","calculateSubtreeDepth","node","max","child","d","findNode","arr","recalculateSiblings","siblings","pos","sibling","recalculateAll","tree","walk","recalculatePositions","cloned","cloneDeep","buildViewItems","flat","flatIndex","nodes","depth","parentNode","childrenAllowed","hasChildren","childrenCount","isExpanded","remainingDepth","canAddChild","canOutdent","canIndent","viewItems","insertAfter","afterIdx","newNode","resolveInsertIndex","hint","idx","s","addItem","targetSiblings","afterNode","afterParent","insertIdx","deleteItem","updateItem","markDirty","swapSiblings","getTargetIndex","target","removed","moveUp","_s","moveDown","moveTop","moveBottom","indent","prev","subtreeDepth","calculateParentDepth","outdent","grandParent","grandSiblings","parentIdx","currentSiblings","targetParentId","targetIndex","isDescendant","n","c","newParentNode","newParentDepth","targetParent","sourceSiblings","sourceIdx","samelist","insertAt","findByKey","isDescendantOf","ancestorKey","candidateKey","current","findAncestorAtDepth","startKey","targetDepth","isInSourceSubtree","sourceKey","findSiblingNotInSource","startIdx","dir","computeInstruction","args","pointer","hoveredRow","sourceSubtreeDepth","indentPx","containerLeft","containerPaddingLeft","y","h","inTopHalf","refEdge","flatIdx","pointerRelX","rawDepth","depthCeiling","depthFloor","clampedDepth","desired","ancestor","GROUP_CLASS","HANDLE_CLASS","LeNestedRow","LeNestedRowSelf","anchorName","directChildren","_normalizeStyle","LeDragHandle","_normalizeProps","_guardReactiveProps","_withCtx","slotScope","open","selectedKey","placement","descendantKeys","collect","sub","sourceNode","find","currentParentKey","parentKey","candidates","disallowed","reason","validCandidates","selectedCandidate","showPlacementPicker","onCandidateClick","onCancel","reasonLabel","_component_VCardTitle","_component_VCardText","_component_VRadioGroup","_component_VRadio","_component_VCardActions","INDENT_PX","ANCHOR_X","mode","showWarningT","isNarrow","useContainerWidth","useIsTouchDevice","effectiveCloseVariant","childrenExpandedKeys","detailExpandedKeys","snapshot","shallowRef","movedKeys","resetDirtyBaseline","markMoved","childrenExpanded","moved","unsaved","totalItemCount","canEnterReorder","keys","applying","applyError","hasPendingChanges","movedCount","reorderMode","enterReorderMode","cancelReorderMode","applyReorder","useReorderMode","m","expandableKeys","nextTick","dragEnabled","initSortables","destroySortables","payload","reorderToggleVisible","compactReorderButton","allExpanded","expandAllVisible","toggleExpandAll","sortableInstances","forceRerender","dragState","hitTestRow","clientX","clientY","wrapper","parseKey","recomputeInstruction","containerRect","rowRect","onPointerMove","applyInstruction","inst","groups","group","sortable","useSortable","DRAG_GHOST_CLASS","DRAG_CHOSEN_CLASS","DRAG_CLASS","draggedEl","draggedNode","orig","tev","state","stringToInt","onBeforeUnmount","overlayVisual","refWrapper","rowEl","lineLeft","lineTop","line","connector","levelWrapper","levelRect","levelCentreY","onAddChildClick","onChevronClick","currently","onDetailToggle","doIndent","doOutdent","toolbarSlotProps","reorderToggleSlotProps","expandableKeySet","moveToPositionDialogOpen","moveToPositionTarget","moveToPositionContext","moveToPositionLabel","openMoveToPosition","onMoveToPositionConfirm","newIndex","ctx","changeParentDialogOpen","changeParentTarget","openChangeParent","onChangeParentConfirm","parentId","position","siblingCount","rowContext","rowCallbacks","rootViewItems","addAfterId","targetId","addChildToId","removeById","updateData","_children","_position","_markUnsaved","LeStatus","LeMoveToPositionDialog","LeChangeParentDialog","onStay","onDiscard","label","isTruthySource","value","resolveBool","fallback","useUnsavedChangesGuard","sectionRegistry","provideUnsavedSectionRegistry","ownSections","normalized","resolved","promptOpen","pendingResolver","acknowledgedOnce","askToLeave","resolve","resolvePrompt","discard","acknowledge","getCurrentInstance","onBeforeRouteLeave","onBeforeUnload","dialogModel","suppressNext","useListEditorVuelidateSentinel","v$","useListEditorItemValidation","seq","nextListEditorTempId","useNestedUnsavedKeys","byParent","empty","getForParent","setForParent","set","merged","childKey","count"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"labs.js","sources":["../src/labs/filters/AFilterWrapperSidebar.vue","../src/labs/filters/ADatatableOrdering.vue","../src/labs/filters/ADatatablePagination.vue","../src/labs/api/useApiFetchByIds.ts","../src/labs/api/useApiFetchListBatch.ts","../src/labs/job/jobApi.ts","../src/labs/filters/datatableColumns.ts","../src/labs/subjectSelect/useSubjectSelect.ts","../src/labs/subjectSelect/ASubjectSelect.vue","../src/labs/listEditor/AListEditor.vue","../src/labs/listEditor/composables/useNestedListEditor.ts","../src/labs/listEditor/composables/useNestedListEditorController.ts","../src/labs/listEditor/composables/useDragInstruction.ts","../src/labs/listEditor/internal/LeNestedRow.vue","../src/labs/listEditor/internal/LeChangeParentDialog.vue","../src/labs/listEditor/ANestedSortableListEditor.vue","../src/labs/unsavedGuard/AUnsavedConfirmDialog.vue","../src/labs/unsavedGuard/useUnsavedChangesGuard.ts","../src/labs/listEditor/composables/useListEditor.ts","../src/labs/listEditor/composables/useListEditorItemValidation.ts","../src/labs/listEditor/composables/useListEditorVuelidateSentinel.ts","../src/labs/listEditor/composables/useNestedUnsavedKeys.ts"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { inject, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isUndefined } from '@/utils/common'\n\nwithDefaults(\n defineProps<{\n formName?: string\n }>(),\n {\n formName: 'search',\n },\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nprovide(FilterSubmitResetCounterKey, ref(0))\nprovide(FilterSelectedKey, ref<Map<string, ValueObjectOption<string | number>[]>>(new Map()))\n\nconst submitFilter = () => {\n emit('submit')\n}\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <slot />\n </VForm>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n SortOrder,\n} from '@/composables/system/datatableColumns'\nimport { isUndefined } from '@/utils/common'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\n\nimport type { Pagination } from '@/labs/filters/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?:\n | ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void)\n | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n },\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\nwatch(\n pagination,\n (newValue, oldValue) => {\n if (\n newValue.sortBy?.key === oldValue?.sortBy?.key &&\n newValue.sortBy?.order === oldValue?.sortBy?.order\n ) {\n return\n }\n const found = options.value.find((option) => {\n return (\n newValue.sortBy?.key === option.sortBy?.key &&\n newValue.sortBy?.order === option.sortBy?.order\n )\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-body-small mr-1\">\n {{ t('common.system.datatable.ordering.title') }}:\n </div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n class=\"text-medium-emphasis\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\nimport { useThrottleFn } from '@vueuse/core'\nimport { useDatatablePageStore } from '@/composables/system/datatablePageStore'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n },\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\nconst { setStoredPage } = useDatatablePageStore()\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page === lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page === lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\nwatch(\n () => pagination.value.rowsPerPage,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n pagination.value.page = 1\n emit('change')\n }\n },\n)\n\nwatch(\n () => pagination.value.page,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n setStoredPage(newValue)\n emit('change')\n }\n },\n)\n\nconst onClickFirst = useThrottleFn(() => {\n pagination.value.page = 1\n}, 300)\n\nconst onClickLast = useThrottleFn(() => {\n pagination.value.page = lastPage.value\n}, 300)\n\nconst onClickPrev = useThrottleFn(() => {\n pagination.value.page = pagination.value.page - 1\n}, 300)\n\nconst onClickNext = useThrottleFn(() => {\n pagination.value.page = pagination.value.page + 1\n}, 300)\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }}\n {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n","import {\n AnzuApiResponseCodeError,\n isAnzuApiResponseCodeError,\n} from '@/model/error/AnzuApiResponseCodeError'\nimport {\n AnzuApiValidationError,\n axiosErrorResponseHasValidationData,\n} from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosRequestConfig } from 'axios'\nimport {\n AnzuApiForbiddenError,\n axiosErrorResponseIsForbidden,\n} from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport type { AxiosClientFn } from '@/labs/api/client'\nimport { useApiQueryBuilder } from '@/labs/api/useApiQueryBuilder'\n\nexport type UseApiFetchByIdsParams = {\n client: AxiosClientFn\n system: string\n entity: string\n urlTemplate?: string\n urlParams?: UrlParams\n options?: AxiosRequestConfig\n isSearchApi?: boolean\n field?: string\n silentConsoleError?: boolean\n}\n\nexport type FetchByIdsParams = {\n urlTemplate?: string\n urlParams?: UrlParams\n}\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nconst generateByIdsApiQuery = (\n ids: IntegerId[] | DocId[],\n isSearchApi: boolean,\n field = 'id',\n): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, queryAddFilter, queryAdd } =\n useApiQueryBuilder()\n const limit = ids.length // todo add batch fetch\n querySetLimit(limit)\n querySetOffset(1, limit)\n querySetOrder(field, false)\n if (isSearchApi) queryAdd(field, ids.join(','))\n else queryAddFilter('in', field, ids.join(','))\n\n return queryBuild()\n}\n\nexport const useApiFetchByIds = <R>(\n params: UseApiFetchByIdsParams,\n): UseApiFetchByIdsReturnType<R> => {\n const {\n client,\n system,\n entity,\n urlTemplate,\n urlParams,\n options = {},\n isSearchApi = false,\n field = 'id',\n silentConsoleError = false,\n } = params\n\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n ids: DocId[] | IntegerId[],\n fetchParams: FetchByIdsParams = {},\n ): Promise<R> => {\n abortController = new AbortController()\n\n const { urlTemplate: urlTemplateOverride, urlParams: urlParamsOverride } = fetchParams\n\n try {\n const resolvedParams = isDefined(urlParamsOverride) ? urlParamsOverride : urlParams\n const template = isDefined(urlTemplateOverride) ? urlTemplateOverride : urlTemplate\n if (isUndefined(template)) throw new Error('Url template is undefined')\n const url =\n (isUndefined(resolvedParams) ? template : replaceUrlParameters(template, resolvedParams)) +\n generateByIdsApiQuery(ids, isSearchApi, field)\n\n const res = await client().get(url, {\n ...options,\n signal: abortController.signal,\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data?.data) {\n return res.data.data as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err, err.config?.url)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n if (!silentConsoleError)\n console.error('Axios error: ' + urlTemplate, ...(err.cause ? [err.cause] : []))\n throw new AnzuApiAxiosError(err)\n }\n\n if (!silentConsoleError) console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchByIdsReturnType<R> = {\n executeFetch: (ids: DocId[] | IntegerId[], params?: FetchByIdsParams) => Promise<R>\n abortFetch: () => void\n}\n","import {\n AnzuApiResponseCodeError,\n isAnzuApiResponseCodeError,\n} from '@/model/error/AnzuApiResponseCodeError'\nimport {\n AnzuApiValidationError,\n axiosErrorResponseHasValidationData,\n} from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosRequestConfig } from 'axios'\nimport {\n AnzuApiForbiddenError,\n axiosErrorResponseIsForbidden,\n} from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport type { ApiInfiniteResponseList, ApiResponseList } from '@/types/ApiResponse'\nimport { isApiInfiniteResponseList, isApiResponseList } from '@/types/ApiResponse'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport { generateListQuery } from '@/labs/api/useApiFetchList'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport type { FilterConfig, FilterData } from '@/labs/filters/filterFactory'\nimport { ref } from 'vue'\nimport { usePagination } from '@/labs/filters/pagination'\nimport { SortOrder } from '@/composables/system/datatableColumns'\nimport type { AxiosClientFn } from '@/labs/api/client'\n\nexport type UseApiFetchListBatchParams = {\n client: AxiosClientFn\n system: string\n entity: string\n urlTemplate?: string\n urlParams?: UrlParams\n options?: AxiosRequestConfig\n silentConsoleError?: boolean\n}\n\nexport type FetchListBatchParams = {\n urlTemplate?: string\n urlParams?: UrlParams\n sortBy?: string\n sortDesc?: boolean\n batchSize?: number\n forceElastic?: boolean\n}\n\nexport const useApiFetchListBatch = <R>(\n params: UseApiFetchListBatchParams,\n): UseApiFetchListBatchReturnType<R> => {\n const {\n client,\n system,\n entity,\n urlTemplate,\n urlParams,\n options = {},\n silentConsoleError = false,\n } = params\n\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n fetchParams: FetchListBatchParams = {},\n ): Promise<R> => {\n abortController = new AbortController()\n\n const {\n urlTemplate: urlTemplateOverride,\n urlParams: urlParamsOverride,\n sortBy = 'id',\n sortDesc = true,\n batchSize = 100,\n forceElastic = false,\n } = fetchParams\n\n try {\n const searchApi = filterConfig.general.elastic || forceElastic ? '/search' : ''\n const resolvedParams = isDefined(urlParamsOverride) ? urlParamsOverride : urlParams\n const template = isDefined(urlTemplateOverride) ? urlTemplateOverride : urlTemplate\n if (isUndefined(template)) throw new Error('Url template is undefined')\n const { pagination } = usePagination(sortBy, sortDesc ? SortOrder.Desc : SortOrder.Asc, {\n rowsPerPage: batchSize,\n })\n const url =\n (isUndefined(resolvedParams) ? template : replaceUrlParameters(template, resolvedParams)) +\n searchApi\n const results = [] as unknown as R\n\n // First page request\n const res = await client().get(\n url + generateListQuery(pagination, filterData, filterConfig),\n {\n ...options,\n signal: abortController.signal,\n },\n )\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n // @ts-ignore\n results.push(...resData.data)\n\n if (isApiInfiniteResponseList(resData)) {\n pagination.value.hasNextPage = resData.hasNextPage\n\n // Handle pagination for infinite lists\n while (pagination.value.hasNextPage) {\n pagination.value.page++\n const nextPageResponse = await client().get(\n url + generateListQuery(pagination, filterData, filterConfig),\n {\n ...options,\n signal: abortController.signal,\n },\n )\n const nextPageData = nextPageResponse.data\n // @ts-ignore\n results.push(...nextPageData.data)\n pagination.value.hasNextPage = nextPageData.hasNextPage\n }\n } else if (isApiResponseList(resData)) {\n pagination.value.totalCount = resData.totalCount\n\n if (pagination.value.totalCount <= pagination.value.rowsPerPage) {\n return results as R\n }\n\n // Handle pagination for regular lists - fetch all remaining pages in parallel\n const promises: Promise<any>[] = []\n const numPages = Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n\n for (let i = 1; i < numPages; i++) {\n // Start from 1 since we already fetched page 0\n const pageCopy = { ...pagination.value, page: i + 1 }\n const paginationRef = ref(pageCopy)\n promises.push(\n client().get(url + generateListQuery(paginationRef, filterData, filterConfig), {\n ...options,\n signal: abortController.signal,\n }),\n )\n }\n\n const allResponses = await Promise.all(promises)\n allResponses.forEach((pageResponse) => {\n // @ts-ignore\n results.push(...pageResponse.data.data)\n })\n }\n\n return results as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err, err.config?.url)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n if (!silentConsoleError)\n console.error('Axios error: ' + urlTemplate, ...(err.cause ? [err.cause] : []))\n throw new AnzuApiAxiosError(err)\n }\n\n if (!silentConsoleError) console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchListBatchReturnType<R> = {\n executeFetch: (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n params?: FetchListBatchParams,\n ) => Promise<R>\n abortFetch: () => void\n}\n","import type { AxiosInstance } from 'axios'\nimport type { JobBase } from '@/types/Job'\nimport { apiFetchOne } from '@/services/api/apiFetchOne'\nimport { apiCreateOne } from '@/services/api/apiCreateOne'\nimport { apiDeleteOne } from '@/services/api/apiDeleteOne'\nimport { stringToKebabCase } from '@/utils/string'\nimport { useApiFetchList } from '@/labs/api/useApiFetchList'\n\nconst END_POINT = '/adm/v1/job'\nexport const ENTITY = 'job'\n\nexport function useJobApi<JobType extends JobBase = JobBase>(\n client: () => AxiosInstance,\n system: string,\n) {\n const useFetchJobList = () =>\n useApiFetchList<JobType[]>({ client, system, entity: ENTITY, urlTemplate: END_POINT })\n\n const fetchJob = (id: number) =>\n apiFetchOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n const createJob = (data: JobType) => {\n const type = stringToKebabCase(data._resourceName)\n .slice(4) // remove \"job-\" prefix\n .replace('-kind-', '-kind/') // replace \"-kind-\" with \"-kind/\" if the needle is found\n\n return apiCreateOne<JobType>(client, data, END_POINT + '/:type', { type }, system, ENTITY)\n }\n\n const deleteJob = (id: number) =>\n apiDeleteOne<JobType>(client, END_POINT + '/:id', { id }, system, ENTITY)\n\n return {\n useFetchJobList,\n fetchJob,\n createJob,\n deleteJob,\n }\n}\n","import {\n type ColumnConfig,\n type ColumnInternalValues,\n DATETIME_AUTO_LABEL_TRACKING,\n type StoredData,\n} from '@/composables/system/datatableColumns'\nimport { computed, onMounted, type Ref, watch } from 'vue'\nimport { i18n } from '@/plugins/i18n'\nimport { isArray, isBoolean, isObject, isString, isUndefined } from '@/utils/common'\n\nconst defaultColumn: ColumnInternalValues = {\n key: '',\n title: undefined,\n sortable: false,\n fixed: false,\n}\n\ninterface DatatableColumnsConfigMoreOptions {\n storeColumnsLocalStorage: string | boolean // false to disable, string to override store key\n disableActions: boolean\n customI18n: any\n showExpand: boolean\n}\n\nconst DatatableColumnsConfigMoreOptionsDefault = {\n storeColumnsLocalStorage: true,\n disableActions: false,\n customI18n: undefined,\n showExpand: false,\n}\n\nexport function createDatatableColumnsConfig(\n config: ColumnConfig[],\n columnsHidden: Ref<Array<string>>,\n system: string,\n subject: string,\n moreOptions: Partial<DatatableColumnsConfigMoreOptions> = {},\n) {\n const options = { ...DatatableColumnsConfigMoreOptionsDefault, ...moreOptions }\n const localI18n = options.customI18n ?? i18n\n const { t } = localI18n.global || localI18n\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeColumnsLocalStorage)) {\n storeKey = options.storeColumnsLocalStorage\n } else if (\n isBoolean(options.storeColumnsLocalStorage) &&\n true === options.storeColumnsLocalStorage\n ) {\n storeKey = 'table_' + system + '_' + subject\n }\n\n const columnsAll = config.map((item) => {\n const obj = { ...defaultColumn, ...item }\n if (!isUndefined(obj.title)) {\n // do not modify\n } else if (isUndefined(obj.title) && DATETIME_AUTO_LABEL_TRACKING.includes(obj.key)) {\n obj.title = t('common.model.tracking.' + obj.key)\n } else if (isUndefined(obj.title) && system && subject) {\n obj.title = t(system + '.' + subject + '.model.' + obj.key)\n } else {\n obj.title = ''\n }\n return obj\n })\n\n const columnsVisible = computed(() => {\n const columns: any = []\n if (options.showExpand) columns.push({ key: 'data-table-expand', sortable: false })\n columnsAll.forEach((column) => {\n if (!columnsHidden.value.includes(column.key)) {\n columns.push(column)\n }\n })\n if (!options.disableActions) columns.push({ key: 'actions', sortable: false, fixed: 'end' })\n return columns\n })\n\n const loadStoredColumns = () => {\n if (!storeKey || !localStorage) return\n const stored = localStorage.getItem(storeKey)\n if (!stored) return\n const storedData = JSON.parse(stored) as StoredData\n if (!isObject(storedData)) return\n if (!isArray(storedData.hidden)) return\n columnsHidden.value = storedData.hidden as string[]\n }\n\n const storeColumns = (columns: string[]) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, JSON.stringify({ hidden: columns }))\n }\n\n onMounted(() => {\n loadStoredColumns()\n })\n\n watch(columnsHidden, (newValue) => {\n storeColumns(newValue)\n })\n\n return {\n columnsAll,\n columnsVisible,\n columnsHidden,\n }\n}\n","import {\n type DatatableOrderingOption,\n type DatatableSortBy,\n} from '@/composables/system/datatableColumns'\nimport type { Ref } from 'vue'\nimport { ref } from 'vue'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { type FilterConfig, type FilterData, useFilterHelpers } from '@/labs/filters/filterFactory'\nimport { createDatatableColumnsConfig } from '@/labs/filters/datatableColumns'\nimport { type Pagination, usePagination } from '@/labs/filters/pagination'\nimport type { FetchListParams } from '@/labs/api/useApiFetchList'\nimport { useDebounceFn } from '@vueuse/core'\nimport { isNull } from '@/utils/common'\n\nexport function useSubjectSelect<TItem>(\n datatableConfig: any,\n datatableHiddenColumns: any,\n system: string,\n subject: string,\n executeFetch: (\n pagination: Ref<Pagination>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n params?: FetchListParams,\n ) => Promise<TItem[]>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n filterSortBy: DatatableSortBy | null = null,\n fetchParams: FetchListParams | undefined = undefined,\n enableActions: boolean = false,\n) {\n const filterTouched: Ref<boolean> = ref(false)\n const items: Ref<Array<TItem>> = ref([])\n const selected: Ref<Array<TItem>> = ref([])\n const loading = ref(false)\n const { pagination, setSortBy, incrementPage } = usePagination(\n isNull(filterSortBy) ? null : filterSortBy.key,\n filterSortBy?.order,\n )\n\n const { resetFilter, submitFilter } = useFilterHelpers(filterData, filterConfig, {\n storeFiltersLocalStorage: false,\n populateUrlParams: false,\n })\n const { showErrorsDefault } = useAlerts()\n\n const { columnsVisible, columnsAll, columnsHidden } = createDatatableColumnsConfig(\n datatableConfig,\n datatableHiddenColumns,\n system,\n subject,\n { storeColumnsLocalStorage: false, disableActions: !enableActions },\n )\n\n const onOpen = () => {\n resetState()\n getListDebounced()\n }\n\n const sortByChange = (option: DatatableOrderingOption) => {\n setSortBy(option.sortBy)\n getListDebounced()\n }\n\n const onFetchNextPage = async () => {\n loading.value = true\n incrementPage()\n try {\n const res = (await executeFetch(pagination, filterData, filterConfig, fetchParams)) as TItem[]\n items.value.push(...res)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const resetState = () => {\n items.value = []\n selected.value = []\n }\n\n const getList = async () => {\n loading.value = true\n try {\n items.value = (await executeFetch(\n pagination,\n filterData,\n filterConfig,\n fetchParams,\n )) as TItem[]\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n loading.value = false\n }\n }\n\n const getListDebounced = useDebounceFn(async () => {\n await getList()\n })\n\n const onRowClick = (event: Event) => {\n const eventTarget = event.target as HTMLElement | null\n if (\n !eventTarget ||\n (eventTarget.tagName === 'INPUT' && (eventTarget as HTMLInputElement).type === 'checkbox')\n ) {\n return\n }\n const parent = eventTarget.closest('.v-data-table__tr')\n if (!parent || !parent.classList.contains('v-data-table__tr')) return\n const firstTd = parent.firstElementChild\n if (!firstTd || !firstTd.classList.contains('v-data-table__td')) return\n const input = firstTd.querySelector('input')\n if (!input) return\n input.click()\n }\n\n return {\n items,\n selected,\n pagination,\n columnsVisible,\n columnsHidden,\n columnsAll,\n filterTouched,\n loading,\n onRowClick,\n onFetchNextPage,\n onOpen,\n sortByChange,\n getList: getListDebounced,\n resetFilter: () => resetFilter(pagination, getListDebounced),\n submitFilter: () => submitFilter(pagination, getListDebounced),\n }\n}\n","<script lang=\"ts\" setup generic=\"TItem\">\nimport { computed, onMounted, provide, ref, toRaw, withModifiers } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport type { Pagination } from '@/labs/filters/pagination'\nimport ADatatablePagination from '@/labs/filters/ADatatablePagination.vue'\nimport { SubjectSelectCloseSidebarKey } from '@/labs/filters/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n selectedItems: Array<TItem>\n pagination: Pagination\n loading?: boolean\n minCount?: number\n maxCount?: number\n modelValue?: boolean | undefined // dialog\n dialogTitleT?: string\n paginationMode?: 'standard' | 'more'\n autoOpen?: boolean\n }>(),\n {\n loading: false,\n minCount: 1,\n maxCount: 1,\n modelValue: undefined,\n dialogTitleT: 'common.subjectSelect.texts.title',\n paginationMode: 'standard',\n autoOpen: false,\n },\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: boolean): void\n (e: 'update:pagination', data: Pagination): void\n (e: 'onOpen'): void\n (e: 'onPageChange'): void\n (e: 'onConfirm', data: Array<TItem>): void\n (e: 'onFetchNextPage'): void\n}>()\n\nconst dialogLocal = ref(false)\nconst dialog = computed({\n get() {\n if (isUndefined(props.modelValue)) return dialogLocal.value\n return props.modelValue\n },\n set(newValue: boolean) {\n dialogLocal.value = newValue\n emit('update:modelValue', newValue)\n },\n})\n\nconst paginationComputed = computed({\n get: () => props.pagination,\n set: (newValue) => {\n emit('update:pagination', { ...toRaw(newValue) })\n },\n})\n\nconst { mdAndDown } = useDisplay()\nconst sidebarLeft = ref(!mdAndDown.value)\n\nconst closeSidebarOnMobile = () => {\n if (mdAndDown.value) sidebarLeft.value = false\n}\n\nprovide(SubjectSelectCloseSidebarKey, closeSidebarOnMobile)\n\nconst { t } = useI18n()\n\nconst selectedItemsCount = computed(() => {\n return props.selectedItems.length\n})\n\nconst disabledSubmit = computed(() => {\n return selectedItemsCount.value < props.minCount || selectedItemsCount.value > props.maxCount\n})\n\nconst onOpen = () => {\n emit('onOpen')\n sidebarLeft.value = !mdAndDown.value\n dialog.value = true\n}\n\nconst toggleSidebar = () => {\n sidebarLeft.value = !sidebarLeft.value\n}\n\nconst onClose = () => {\n dialog.value = false\n}\n\nconst onConfirm = () => {\n emit(\n 'onConfirm',\n props.selectedItems.map((item) => toRaw(item)),\n )\n onClose()\n}\n\nconst fetchNextPage = () => {\n emit('onFetchNextPage')\n}\n\nconst onPageChange = () => {\n emit('onPageChange')\n}\n\nconst lastPage = computed(() => {\n return Math.ceil(paginationComputed.value.totalCount / paginationComputed.value.rowsPerPage)\n})\n\nconst hasNextPage = computed(() => {\n return !(\n (isNull(paginationComputed.value.hasNextPage) &&\n paginationComputed.value.page === lastPage.value) ||\n paginationComputed.value.hasNextPage === false\n )\n})\n\nconst autoloadOnIntersect = (isIntersecting: boolean) => {\n if (isIntersecting && hasNextPage.value && !props.loading) {\n fetchNextPage()\n }\n}\n\nonMounted(() => {\n if (props.autoOpen) {\n onOpen()\n }\n})\n\ndefineExpose({\n open: onOpen,\n closeSidebarOnMobile,\n})\n</script>\n\n<template>\n <slot\n name=\"activator\"\n :props=\"{ onClick: withModifiers(() => onOpen(), ['stop']) }\"\n />\n <VDialog\n v-bind=\"$attrs\"\n :model-value=\"dialog\"\n fullscreen\n class=\"subject-select\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n >\n <VCard\n v-if=\"dialog\"\n class=\"subject-select__card\"\n >\n <ADialogToolbar\n class=\"subject-select__toolbar system-border-b\"\n @on-cancel=\"onClose\"\n >\n <slot name=\"title\">\n {{ t(dialogTitleT) }}\n </slot>\n </ADialogToolbar>\n <VToolbar\n density=\"compact\"\n color=\"transparent\"\n :height=\"46\"\n elevation=\"0\"\n class=\"system-border-b subject-select__second-bar\"\n >\n <slot name=\"second-bar\">\n <div class=\"d-flex flex-column w-100 px-1 align-center\">\n <div class=\"d-flex justify-space-between w-100 align-center\">\n <div class=\"d-flex align-center\">\n <VBtn\n icon\n :width=\"30\"\n :height=\"30\"\n @click=\"toggleSidebar\"\n >\n <VIcon\n icon=\"mdi-tune\"\n :size=\"16\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.subjectSelect.filter.toggle') }}\n </VTooltip>\n </VBtn>\n <slot name=\"second-bar-left\" />\n </div>\n <div class=\"d-flex align-center\">\n <slot name=\"second-bar-right\" />\n </div>\n </div>\n </div>\n </slot>\n </VToolbar>\n <div\n class=\"subject-select__main\"\n :class=\"{ 'subject-select__main--sidebar-active': sidebarLeft }\"\n >\n <div class=\"subject-select__sidebar system-border-r\">\n <div class=\"subject-select-filter\">\n <slot name=\"filter\" />\n </div>\n </div>\n <div class=\"subject-select__content\">\n <slot name=\"content\" />\n <div\n v-if=\"paginationMode === 'more'\"\n class=\"d-flex w-100 align-center justify-center pa-4\"\n >\n <ABtnSecondary\n v-show=\"hasNextPage || loading\"\n v-intersect.quiet=\"autoloadOnIntersect\"\n :loading=\"loading\"\n size=\"small\"\n @click=\"fetchNextPage\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.loadMore') }}\n </slot>\n </ABtnSecondary>\n </div>\n <ADatatablePagination\n v-else\n v-model=\"paginationComputed\"\n @change=\"onPageChange\"\n />\n </div>\n </div>\n <div class=\"subject-select__actions system-border-t\">\n <div v-if=\"minCount === maxCount\">\n {{\n t('common.subjectSelect.texts.pickExactCount', {\n count: minCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <div v-else>\n {{\n t('common.subjectSelect.texts.pickRangeCount', {\n minCount: minCount,\n maxCount: maxCount,\n selected: selectedItemsCount,\n })\n }}\n </div>\n <VSpacer />\n <ABtnPrimary\n :disabled=\"disabledSubmit\"\n @click.stop=\"onConfirm\"\n >\n <slot name=\"button-confirm-title\">\n {{ t('common.button.confirm') }}\n </slot>\n </ABtnPrimary>\n </div>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, useSlots, useTemplateRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport {\n useListEditorController,\n type GetKey,\n type ListEditorHandle,\n type ListEditorValidationResult,\n type PositionOption,\n} from '@/labs/listEditor/composables/useListEditorController'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedSection } from '@/labs/unsavedGuard/useUnsavedSection'\nimport { useDeleteDialog } from '@/labs/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/labs/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/labs/listEditor/utils/revealInvalidRows'\nimport LeDeleteDialog from '@/labs/listEditor/internal/LeDeleteDialog.vue'\nimport LeEmptyState from '@/labs/listEditor/internal/LeEmptyState.vue'\nimport LeUnsavedLabel from '@/labs/listEditor/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n ListViewItem,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface DecoratedViewItem<T> extends ListViewItem<T> {\n editing: boolean\n expanded: boolean\n loading: boolean\n dirty: boolean\n unsaved: boolean\n validationState: ListEditorValidationState\n}\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedViewItem<TItem>\n raw: TItem\n index: number\n key: ListEditorKey\n readonly: boolean\n disabled: boolean\n expanded: boolean\n editing: boolean\n dirty: boolean\n /** Aliases `dirty` here (no reorder mode → no `moved` to OR). Same field name as on sortable/nested variants. */\n unsaved: boolean\n touch: boolean\n actions: RowActions<TItem>\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\nexport interface HeaderSlotProps {\n title: string | null\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n /**\n * New-row factory. Add / \"add after\" insert `factory()` through the controller\n * (positions renumbered) — no consumer `@add` push handler is needed.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`; never the position field. Typed `string`\n * not `keyof TItem` because the latter compiles to a Boolean-only runtime prop\n * type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. `string` must be\n * listed before `false` (and not be `keyof TItem`): otherwise Vue's runtime\n * type goes Boolean-first and coerces `position=\"position\"` to `true`.\n */\n position?: string | false | { field: string; multiplier?: number }\n /**\n * Extra fields to drop from the dirty content-hash (position is always dropped).\n * Use when a SEPARATE nested editor already tracks a child collection, so editing\n * a child doesn't flip the parent row amber. Still saved; only the diff ignores it.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Opt-in lifted controller from `useListEditorController()` — pass it so editor\n * state survives this component's unmount/remount. Omitted: the editor owns one\n * internally. Either way the `ListEditorHandle` is reachable via `useTemplateRef`.\n */\n editor?: ListEditorHandle<TItem>\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n title?: string | null\n\n compactField?: string | null\n statusField?: string | null\n twoRows?: 'never' | 'mobile' | 'always'\n chips?: boolean\n\n showAddButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n\n addLabel?: string | null\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /** Disable unsaved-state tracking — no dirty markers, never reads as unsaved. */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n /**\n * Render every `#item` slot expanded — no edit pencil, inline footer, or row-click\n * toggle. Use when all forms should be visible at once (e.g. ThirdPartyTracker).\n */\n defaultExpanded?: boolean\n\n loadingKeys?: Set<ListEditorKey> | null\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n\n /**\n * Registers this editor as a named unsaved-changes section under this (already\n * translated) label — replaces a per-consumer `useUnsavedSection` call.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n factory: undefined,\n getKey: undefined,\n position: undefined,\n dirtyExclude: undefined,\n validate: undefined,\n editor: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n twoRows: 'never',\n chips: false,\n showAddButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n closeVariant: 'auto',\n defaultExpanded: false,\n loadingKeys: null,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n unsavedSectionLabel: undefined,\n})\n\nconst emit = defineEmits<{\n edit: [item: ListViewItem<TItem>]\n deleted: [item: ListViewItem<TItem>]\n close: [item: ListViewItem<TItem>]\n 'item-saved': [item: ListViewItem<TItem>]\n 'item-expand': [item: ListViewItem<TItem>, expanded: boolean]\n}>()\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst modelValue = defineModel<TItem[]>({ required: true })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\n\n// State controller (v2): this editor owns one unless a lifted `:editor` is passed.\n// `factory`/`getKey`/`position`/`validate` are construction-time options read once\n// to seed it (undefined → controller defaults 'id'/'position'/always-valid), not\n// reactive props — so the reactivity-loss rule is intentionally suppressed here.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst controller =\n props.editor ??\n useListEditorController<TItem>({\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n })\n\n// Mirror the controller's key resolution so rendered rows key the way it tracks them.\nconst getKeyOpt = props.getKey ?? 'id'\n/* eslint-enable vue/no-setup-props-reactivity-loss */\nconst keyOf = (item: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function'\n ? getKeyOpt(item)\n : (item[getKeyOpt as keyof TItem] as ListEditorKey)\n\nconst keyFieldName = computed<string>(() =>\n typeof getKeyOpt === 'function' ? '(fn)' : (getKeyOpt as string),\n)\n\n// Managed position field name, mirroring the controller's resolution.\nconst positionFieldName = computed<string>(() => {\n const p = props.position\n if (p === undefined) return 'position'\n if (p === false) return 'position'\n if (typeof p === 'object') return p.field as string\n return p as string\n})\n\n// Render projection only — the controller owns the data (key + index + raw + position).\nconst viewItems = computed<ListViewItem<TItem>[]>(() =>\n modelValue.value.map((raw, index) => ({\n key: keyOf(raw),\n index,\n raw,\n position: raw[positionFieldName.value] as number | undefined,\n })),\n)\n\n// Surfaces row-key wiring bugs loudly: undefined or duplicate keys silently break\n// dirty tracking, validity rails and reorder targeting and are hard to trace from\n// symptoms. Deduped per signature so a stable bad state warns once, a new one again.\nconst warnedKeySignatures = new Set<string>()\nconst warnOnBadKeys = (items: ListViewItem<TItem>[]): void => {\n const seen = new Set<ListEditorKey>()\n const duplicates = new Set<string>()\n let missing = 0\n for (const vi of items) {\n if (vi.key === undefined || vi.key === null) {\n missing++\n continue\n }\n if (seen.has(vi.key)) duplicates.add(String(vi.key))\n seen.add(vi.key)\n }\n if (missing === 0 && duplicates.size === 0) return\n const signature = `${missing}|${[...duplicates].sort().join(',')}`\n if (warnedKeySignatures.has(signature)) return\n warnedKeySignatures.add(signature)\n if (missing > 0) {\n console.warn(\n `[list-editor] ${missing} row(s) resolve to an undefined key (key-field \"${keyFieldName.value}\"). ` +\n 'Point get-key at a field every item has, or give new items unique temp ids ' +\n '(see nextListEditorTempId).',\n )\n }\n if (duplicates.size > 0) {\n console.warn(\n `[list-editor] duplicate row keys (key-field \"${keyFieldName.value}\"): ${[...duplicates].join(', ')}. ` +\n 'Row keys must be unique — dirty tracking and validation rails target rows by key.',\n )\n }\n}\nwatch(viewItems, (items) => warnOnBadKeys(items), { immediate: true })\n\nconst expandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst isInlineEdit = computed(() => !props.chips && !!slots.item)\nconst hasReadonlyDetail = computed(() => !props.chips && !!slots['item-readonly'])\n\nconst {\n editingKeys,\n editingSnapshots,\n beginEdit,\n cancelEdit,\n commitEdit,\n closeEdit,\n requestAutoOpen,\n} = useInlineEditing<TItem, ListViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row',\n isInlineEdit,\n restoreSnapshot: (key, data) => controller.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => keyOf(it)),\n findEntry: (key) => {\n const hit = modelValue.value.find((it) => keyOf(it) === key)\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n})\n\nconst addLabelResolved = computed(() =>\n props.addLabel ? t(props.addLabel) : t('common.sortable.add'),\n)\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(\n () => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'),\n)\nconst deleteConfirmTextResolved = computed(\n () => props.deleteConfirmText ?? t('common.sortable.deleteConfirmText'),\n)\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canAdd = computed(() => canInteract.value && props.showAddButton)\n\nconst headerVisible = computed(() => !!(props.title || slots.header))\n\n// Per-row Save/Cancel footer only makes sense with a per-item persist callback;\n// without one the parent form's global save flushes everything, so hide it.\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\n// Per-key decorator cache: reuse the cached object when base item AND every flag\n// match, giving slot consumers a stable reference for unchanged rows. `disableUnsaved`\n// suppresses only the amber marker — the validation rail still shows, since hiding\n// dirty-state shouldn't hide a real error.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const next: DecoratedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = expandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n // Readonly can't have user-unsaved changes; never paint amber there (also avoids\n // a mount-before-load baseline marking every loaded row added). (QA 85050 sweep)\n const unsaved = props.disableUnsaved || props.readonly ? false : controller.isUnsaved(vi.key)\n const dirty = unsaved\n const validationState = controller.rowState(vi.raw, vi.key)\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.unsaved === unsaved &&\n cached.validationState === validationState\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n unsaved,\n validationState,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => viewItemsDecorated.value.length === 0)\n\nconst findVi = (key: ListEditorKey): DecoratedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() => viewItemsDecorated.value.map((vi) => ({ key: vi.key }))),\n variant: 'flat',\n isReorderMode: ref(false),\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n})\n\nconst resolveCompactText = (raw: TItem): string =>\n resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Managed add: the controller inserts `factory()` and renumbers; the inline-editing\n// watch picks up the new key off the model change and auto-opens it.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n controller.addItem(undefined, undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n controller.addItem(undefined, { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n // Toggle: edit while already editing closes the form, matching row-header click.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n expandedKeys.value.delete(vi.key)\n }\n emit('edit', vi)\n}\n\nconst onExpandClick = (vi: ListViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currentlyExpanded = expandedKeys.value.has(key)\n if (currentlyExpanded) {\n expandedKeys.value.delete(key)\n } else {\n for (const k of expandedKeys.value) expandedKeys.value.delete(k)\n expandedKeys.value.add(key)\n }\n emit('item-expand', vi, !currentlyExpanded)\n}\n\nconst isRowClickable = (vi: DecoratedViewItem<TItem>): boolean => {\n if (props.chips) return false\n if (props.disableRowClick) return false\n if (props.defaultExpanded) return false\n if (props.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) {\n onExpandClick(vi)\n } else {\n onEditClick(vi)\n }\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, ListViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(vi.key)\n // Controller owns removal: a temp row vanishes, a saved row is recorded in\n // `getChanges().deleted`.\n controller.deleteItem(vi.key)\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm || props.chips,\n})\n\nconst onDeleteClick = async (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\nconst onSaveClick = async (vi: ListViewItem<TItem>) => {\n if (props.onItemSave) {\n await props.onItemSave(vi.raw)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: ListViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: ListViewItem<TItem>) => {\n closeEdit(vi)\n expandedKeys.value.delete(vi.key)\n emit('close', vi)\n}\n\n// Per-key actions cache: each row's `actions` bundle is allocated once so slot\n// consumers get a stable identity (no prop-ref churn → no spurious re-renders).\n// Closures capture the stable key and look up the live decorator via `findVi(key)`.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n if (vi) return onSaveClick(vi)\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onExpandClick(vi)\n },\n update: (next) => controller.updateItem(key, next),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\n// Garbage-collect cache entries for keys that have left the model.\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n },\n)\n\nconst buildSlotProps = (vi: DecoratedViewItem<TItem>) => ({\n item: vi,\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n editing: vi.editing || props.defaultExpanded,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n touch: isTouch.value,\n actions: getActions(vi.key),\n})\n\n// Named unsaved-changes section, registered only when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : [],\n)\n\n// Expose the controller handle via `useTemplateRef<ListEditorHandle<TItem>>`.\ndefineExpose<ListEditorHandle<TItem>>({\n ...controller,\n // Opens invalid rows so a blocked save surfaces WHICH rows are wrong instead of a\n // collapsed red rail. The body is gated on `editing` not `expanded`, so drive\n // `beginEdit` not `expandedKeys` (QA 85050 B4-17). Shared via the helper.\n validateAll: () =>\n validateAllAndReveal(controller, (key) => {\n const vi = viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n }),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-list-editor\"\n :class=\"[\n `a-list-editor--two-rows-${twoRows}`,\n {\n 'a-list-editor--readonly': readonly,\n 'a-list-editor--disabled': disabled,\n 'a-list-editor--touch': isTouch,\n 'a-list-editor--chips': chips,\n },\n ]\"\n >\n <div\n ref=\"rowsContainer\"\n class=\"a-le-card\"\n >\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <template v-else>\n <div\n v-for=\"vi in viewItemsDecorated\"\n :key=\"String(vi.key)\"\n :data-id=\"String(vi.key)\"\n role=\"listitem\"\n :tabindex=\"keyboardNav.rowTabindex(vi.key)\"\n class=\"a-le-row\"\n :class=\"{\n 'a-le-row--two-rows': twoRows === 'always',\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--clickable': isRowClickable(vi),\n [`a-le-row--validation-${vi.validationState}`]: vi.validationState !== null,\n }\"\n @keydown=\"keyboardNav.handleKeydown(vi.key, $event)\"\n >\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n\n <div\n class=\"a-le-row-header\"\n @click=\"onRowClick(vi)\"\n >\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span class=\"a-le-title\">\n {{ resolveCompactText(vi.raw) }}\n </span>\n </slot>\n <LeUnsavedLabel\n v-if=\"vi.unsaved\"\n :dot-only=\"chips\"\n />\n </div>\n\n <div\n v-if=\"!chips\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span\n v-if=\"statusField && vi.raw[statusField] != null && vi.raw[statusField] !== ''\"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <VBtn\n v-if=\"chips && showDeleteButton && canInteract\"\n icon\n size=\"x-small\"\n variant=\"text\"\n density=\"compact\"\n :active=\"false\"\n class=\"a-le-action a-le-action--chip-close\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-close\"\n size=\"14\"\n />\n </VBtn>\n <template v-else>\n <VBtn\n v-if=\"showEditButton && canInteract && !defaultExpanded\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showAddAfterAction && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem @click=\"onRowAddAfterClick(vi)\">\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <template v-if=\"(vi.editing || defaultExpanded) && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <div\n v-if=\"showInlineSaveFooter && !defaultExpanded\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"$slots['item-readonly'] && (readonly || vi.expanded)\"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </template>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use './styles/tokens';\n@use './styles/shared';\n\n// Variant-specific rules, scoped under the AListEditor root.\n.a-list-editor {\n // Chips: 12px left padding (flat) vs 8px in sortable, which reserves drag-handle room.\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 12px;\n gap: 4px;\n min-height: 28px;\n }\n}\n\n// Narrow/mobile layout: taller rows, always-visible actions, status badge dropped for room.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-list-editor {\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n","import { computed, type ComputedRef, type Ref } from 'vue'\nimport { cloneDeep, isUndefined } from '@/utils/common'\nimport type {\n ListEditorKey,\n ListViewItem,\n NestedTree,\n NestedTreeNode,\n PositionHint,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface NestedViewItem<TItem> extends ListViewItem<TItem> {\n node: NestedTreeNode<TItem>\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n siblingIndex: number\n siblingCount: number\n firstInParent: boolean\n lastInParent: boolean\n canAddChild: boolean\n canIndent: boolean\n canOutdent: boolean\n}\n\nexport interface UseNestedListEditorOptions {\n keyField?: string\n /**\n * Resolve a row's key; takes precedence over `keyField`. Pass the controller's\n * `keyOf` so tree ops key rows the same way as dirty/validity tracking — incl.\n * a FUNCTION get-key, which `keyField` lookup would miss.\n */\n getKey?: (data: any) => ListEditorKey\n positionField?: string\n parentField?: string\n positionMultiplier?: number\n maxDepth: number\n expandedKeys?: Ref<Set<ListEditorKey>>\n}\n\nexport interface NestedListEditorApi<TItem extends Record<string, any>> {\n viewItems: ComputedRef<NestedViewItem<TItem>[]>\n findNode: (id: ListEditorKey) => {\n node: NestedTreeNode<TItem> | null\n parent: NestedTreeNode<TItem> | null\n }\n addItem: (\n data: TItem,\n hint?: PositionHint & {\n parentId?: ListEditorKey | null\n asFirstChild?: boolean\n childrenAllowed?: boolean\n },\n ) => NestedTree<TItem>\n deleteItem: (id: ListEditorKey) => NestedTree<TItem>\n updateItem: (id: ListEditorKey, data: TItem, markDirty?: boolean) => NestedTree<TItem>\n moveUp: (id: ListEditorKey) => NestedTree<TItem> | null\n moveDown: (id: ListEditorKey) => NestedTree<TItem> | null\n moveTop: (id: ListEditorKey) => NestedTree<TItem> | null\n moveBottom: (id: ListEditorKey) => NestedTree<TItem> | null\n indent: (id: ListEditorKey) => NestedTree<TItem> | null\n outdent: (id: ListEditorKey) => NestedTree<TItem> | null\n moveTo: (\n id: ListEditorKey,\n targetParentId: ListEditorKey | null,\n targetIndex: number,\n ) => NestedTree<TItem> | null\n recalculatePositions: (model: NestedTree<TItem>) => NestedTree<TItem>\n calculateSubtreeDepth: (node: NestedTreeNode<TItem>) => number\n}\n\nconst DEFAULT_KEY_FIELD = 'id'\nconst DEFAULT_POSITION_FIELD = 'position'\nconst DEFAULT_PARENT_FIELD = 'parent'\n\n/**\n * Nested list editor core. Pure data behavior shared by ANestedSortableListEditor.\n * Works on a tree of `{ data, children, meta }` nodes — shape-compatible with the\n * legacy `SortableNested` wrapper so migration can pass existing data through\n * unchanged. Mutators return a cloned tree and also assign it to `model.value`.\n */\nexport function useNestedListEditor<TItem extends Record<string, any>>(\n model: Ref<NestedTree<TItem>>,\n options: UseNestedListEditorOptions,\n): NestedListEditorApi<TItem> {\n const keyField = options.keyField ?? DEFAULT_KEY_FIELD\n const resolveKey = options.getKey\n const positionField = options.positionField ?? DEFAULT_POSITION_FIELD\n const parentField = options.parentField ?? DEFAULT_PARENT_FIELD\n const positionMultiplier = options.positionMultiplier ?? 1\n const maxDepth = options.maxDepth\n\n const getKey = (data: TItem): ListEditorKey =>\n resolveKey ? resolveKey(data) : (data[keyField] as ListEditorKey)\n\n const calculateSubtreeDepth = (node: NestedTreeNode<TItem>): number => {\n if (!node.children || node.children.length === 0) return 1\n let max = 0\n for (const child of node.children) {\n const d = calculateSubtreeDepth(child)\n if (d > max) max = d\n }\n return max + 1\n }\n\n const findNode = (\n id: ListEditorKey,\n arr: NestedTreeNode<TItem>[] = model.value.children,\n parent: NestedTreeNode<TItem> | null = null,\n ): { node: NestedTreeNode<TItem> | null; parent: NestedTreeNode<TItem> | null } => {\n for (const item of arr) {\n if (getKey(item.data) === id) return { node: item, parent }\n if (item.children && item.children.length > 0) {\n const found = findNode(id, item.children, item)\n if (found.node) return found\n }\n }\n return { node: null, parent: null }\n }\n\n const recalculateSiblings = (siblings: NestedTreeNode<TItem>[]) => {\n let pos = 1 * positionMultiplier\n for (const sibling of siblings) {\n if (sibling.data[positionField] !== pos) {\n ;(sibling.data as any)[positionField] = pos\n // Flag dirty so a partial-subset save persists the new position;\n // otherwise reorders are lost on reload and rows collide on old positions.\n sibling.meta.dirty = true\n }\n pos += positionMultiplier\n }\n }\n\n const recalculateAll = (tree: NestedTree<TItem>) => {\n const walk = (arr: NestedTreeNode<TItem>[]) => {\n recalculateSiblings(arr)\n for (const item of arr) if (item.children && item.children.length) walk(item.children)\n }\n walk(tree.children)\n }\n\n const recalculatePositions = (tree: NestedTree<TItem>): NestedTree<TItem> => {\n const cloned = cloneDeep(tree) as NestedTree<TItem>\n recalculateAll(cloned)\n return cloned\n }\n\n const buildViewItems = (tree: NestedTree<TItem>): NestedViewItem<TItem>[] => {\n const flat: NestedViewItem<TItem>[] = []\n const expandedKeys = options.expandedKeys?.value\n let flatIndex = 0\n const walk = (\n nodes: NestedTreeNode<TItem>[],\n depth: number,\n parentNode: NestedTreeNode<TItem> | null,\n ) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n const key = getKey(node.data)\n const childrenAllowed = !isUndefined(node.children)\n const hasChildren = childrenAllowed && (node.children?.length ?? 0) > 0\n const childrenCount = node.children?.length ?? 0\n const isExpanded = expandedKeys ? expandedKeys.has(key) : true\n const remainingDepth = maxDepth - (depth + 1)\n const canAddChild = childrenAllowed && remainingDepth > 0\n const canOutdent = depth > 0\n const canIndent = i > 0\n flat.push({\n key,\n index: flatIndex++,\n raw: node.data,\n position: node.data[positionField] as number | undefined,\n node,\n depth,\n parent: parentNode?.data ?? null,\n parentKey: parentNode ? getKey(parentNode.data) : null,\n childrenCount,\n hasChildren,\n childrenAllowed,\n siblingIndex: i,\n siblingCount: nodes.length,\n firstInParent: i === 0,\n lastInParent: i === nodes.length - 1,\n canAddChild,\n canIndent,\n canOutdent,\n })\n if (hasChildren && isExpanded) {\n walk(node.children as NestedTreeNode<TItem>[], depth + 1, node)\n }\n }\n }\n walk(tree.children, 0, null)\n return flat\n }\n\n const viewItems = computed<NestedViewItem<TItem>[]>(() => buildViewItems(model.value))\n\n const insertAfter = (\n siblings: NestedTreeNode<TItem>[],\n afterIdx: number,\n newNode: NestedTreeNode<TItem>,\n ) => {\n siblings.splice(afterIdx + 1, 0, newNode)\n }\n\n const resolveInsertIndex = (siblings: NestedTreeNode<TItem>[], hint?: PositionHint): number => {\n if (!hint) return siblings.length\n if (hint.afterId !== undefined) {\n const idx = siblings.findIndex((s) => getKey(s.data) === hint.afterId)\n return idx === -1 ? siblings.length : idx + 1\n }\n if (hint.afterIndex !== undefined) {\n if (hint.afterIndex < 0) return siblings.length\n return Math.min(hint.afterIndex + 1, siblings.length)\n }\n if (hint.index !== undefined) {\n return Math.max(0, Math.min(hint.index, siblings.length))\n }\n return siblings.length\n }\n\n const addItem = (\n data: TItem,\n hint?: PositionHint & {\n parentId?: ListEditorKey | null\n asFirstChild?: boolean\n childrenAllowed?: boolean\n },\n ): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const childrenAllowed = hint?.childrenAllowed ?? true\n const newNode: NestedTreeNode<TItem> = {\n data: cloneDeep(data) as TItem,\n children: childrenAllowed ? [] : undefined,\n meta: { dirty: false },\n }\n\n let targetSiblings: NestedTreeNode<TItem>[] = cloned.children\n let parentNode: NestedTreeNode<TItem> | null = null\n\n if (hint?.parentId !== undefined && hint.parentId !== null) {\n const { node } = findNode(hint.parentId, cloned.children)\n if (node && node.children) {\n targetSiblings = node.children\n parentNode = node\n }\n }\n\n if (hint?.afterId !== undefined) {\n const { node: afterNode, parent: afterParent } = findNode(hint.afterId, cloned.children)\n if (afterNode) {\n const siblings = afterParent\n ? (afterParent.children as NestedTreeNode<TItem>[])\n : cloned.children\n const idx = siblings.indexOf(afterNode)\n if (idx !== -1) {\n insertAfter(siblings, idx, newNode)\n ;(newNode.data as any)[parentField] = afterParent ? getKey(afterParent.data) : null\n recalculateSiblings(siblings)\n model.value = cloned\n return cloned\n }\n }\n }\n\n const insertIdx = hint?.asFirstChild ? 0 : resolveInsertIndex(targetSiblings, hint)\n targetSiblings.splice(insertIdx, 0, newNode)\n ;(newNode.data as any)[parentField] = parentNode ? getKey(parentNode.data) : null\n recalculateSiblings(targetSiblings)\n model.value = cloned\n return cloned\n }\n\n const deleteItem = (id: ListEditorKey): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return cloned\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx === -1) return cloned\n siblings.splice(idx, 1)\n recalculateSiblings(siblings)\n model.value = cloned\n return cloned\n }\n\n const updateItem = (id: ListEditorKey, data: TItem, markDirty = true): NestedTree<TItem> => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node } = findNode(id, cloned.children)\n if (!node) return cloned\n node.data = cloneDeep(data) as TItem\n // An edit must be persisted by partial-subset saves. `markDirty=false` is for\n // snapshot restore on edit-cancel, which must NOT flag the node dirty.\n if (markDirty) node.meta.dirty = true\n model.value = cloned\n return cloned\n }\n\n const swapSiblings = (\n cloned: NestedTree<TItem>,\n id: ListEditorKey,\n getTargetIndex: (siblings: NestedTreeNode<TItem>[], currentIdx: number) => number | null,\n ): NestedTree<TItem> | null => {\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx === -1) return null\n const target = getTargetIndex(siblings, idx)\n if (target === null || target === idx) return null\n const [removed] = siblings.splice(idx, 1)\n siblings.splice(target, 0, removed)\n recalculateSiblings(siblings)\n return cloned\n }\n\n const moveUp = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (_s, idx) => (idx > 0 ? idx - 1 : null))\n if (res) model.value = res\n return res\n }\n\n const moveDown = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (s, idx) => (idx < s.length - 1 ? idx + 1 : null))\n if (res) model.value = res\n return res\n }\n\n const moveTop = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (_s, idx) => (idx > 0 ? 0 : null))\n if (res) model.value = res\n return res\n }\n\n const moveBottom = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const res = swapSiblings(cloned, id, (s, idx) => (idx < s.length - 1 ? s.length - 1 : null))\n if (res) model.value = res\n return res\n }\n\n /**\n * Indent: move the item under its previous sibling as its last child.\n * Fails if: no previous sibling, previous sibling doesn't allow children,\n * or the resulting depth would exceed maxDepth.\n */\n const indent = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n const siblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const idx = siblings.indexOf(node)\n if (idx <= 0) return null\n const prev = siblings[idx - 1]\n if (isUndefined(prev.children)) return null\n const subtreeDepth = calculateSubtreeDepth(node)\n const prevDepth = calculateParentDepth(cloned, getKey(prev.data))\n if (prevDepth + 1 + subtreeDepth > maxDepth) return null\n\n siblings.splice(idx, 1)\n prev.children!.push(node)\n ;(node.data as any)[parentField] = getKey(prev.data)\n // Persist the reparent even when the position number is unchanged (QA 85050 BUG-13).\n node.meta.dirty = true\n recalculateSiblings(siblings)\n recalculateSiblings(prev.children!)\n model.value = cloned\n return cloned\n }\n\n /**\n * Outdent: move the item up one level — it becomes the next sibling of its current parent.\n * Fails if the item is already at root.\n */\n const outdent = (id: ListEditorKey): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node || !parent) return null\n\n const { parent: grandParent } = findNode(getKey(parent.data), cloned.children)\n const grandSiblings = grandParent\n ? (grandParent.children as NestedTreeNode<TItem>[])\n : cloned.children\n const parentIdx = grandSiblings.indexOf(parent)\n if (parentIdx === -1) return null\n\n const currentSiblings = parent.children as NestedTreeNode<TItem>[]\n const idx = currentSiblings.indexOf(node)\n if (idx === -1) return null\n currentSiblings.splice(idx, 1)\n grandSiblings.splice(parentIdx + 1, 0, node)\n ;(node.data as any)[parentField] = grandParent ? getKey(grandParent.data) : null\n // Persist the reparent even when the position number is unchanged (QA 85050 BUG-13).\n node.meta.dirty = true\n\n recalculateSiblings(currentSiblings)\n recalculateSiblings(grandSiblings)\n model.value = cloned\n return cloned\n }\n\n const calculateParentDepth = (tree: NestedTree<TItem>, id: ListEditorKey): number => {\n const walk = (arr: NestedTreeNode<TItem>[], depth: number): number | null => {\n for (const item of arr) {\n if (getKey(item.data) === id) return depth\n if (item.children && item.children.length) {\n const d = walk(item.children, depth + 1)\n if (d !== null) return d\n }\n }\n return null\n }\n return walk(tree.children, 0) ?? 0\n }\n\n /**\n * Move a node to a specific parent at a specific index. Used by drag/drop.\n * Respects maxDepth — returns null if the move would exceed it.\n */\n const moveTo = (\n id: ListEditorKey,\n targetParentId: ListEditorKey | null,\n targetIndex: number,\n ): NestedTree<TItem> | null => {\n const cloned = cloneDeep(model.value) as NestedTree<TItem>\n const { node, parent } = findNode(id, cloned.children)\n if (!node) return null\n\n if (targetParentId !== null) {\n const isDescendant = (n: NestedTreeNode<TItem>): boolean => {\n if (!n.children) return false\n for (const c of n.children) {\n if (getKey(c.data) === targetParentId) return true\n if (isDescendant(c)) return true\n }\n return false\n }\n if (getKey(node.data) === targetParentId || isDescendant(node)) return null\n }\n\n let targetSiblings: NestedTreeNode<TItem>[]\n let newParentNode: NestedTreeNode<TItem> | null = null\n let newParentDepth = 0\n if (targetParentId === null) {\n targetSiblings = cloned.children\n newParentDepth = 0\n } else {\n const { node: targetParent } = findNode(targetParentId, cloned.children)\n if (!targetParent || isUndefined(targetParent.children)) return null\n targetSiblings = targetParent.children\n newParentNode = targetParent\n newParentDepth = calculateParentDepth(cloned, targetParentId) + 1\n }\n\n const subtreeDepth = calculateSubtreeDepth(node)\n if (newParentDepth + subtreeDepth > maxDepth) return null\n\n const sourceSiblings = parent ? (parent.children as NestedTreeNode<TItem>[]) : cloned.children\n const sourceIdx = sourceSiblings.indexOf(node)\n if (sourceIdx === -1) return null\n\n const samelist = sourceSiblings === targetSiblings\n const [removed] = sourceSiblings.splice(sourceIdx, 1)\n let insertAt = targetIndex\n if (samelist && sourceIdx < targetIndex) insertAt = targetIndex - 1\n insertAt = Math.max(0, Math.min(insertAt, targetSiblings.length))\n targetSiblings.splice(insertAt, 0, removed)\n ;(removed.data as any)[parentField] = newParentNode ? getKey(newParentNode.data) : null\n // Flag explicitly: a reparent at an unchanged position number (root pos 2 →\n // a group's 2nd child, also pos 2) isn't caught by recalculateSiblings, so the\n // partial save would omit it and the child reverts to root on reload (BUG-13).\n removed.meta.dirty = true\n\n if (!samelist) recalculateSiblings(sourceSiblings)\n recalculateSiblings(targetSiblings)\n model.value = cloned\n return cloned\n }\n\n return {\n viewItems,\n findNode,\n addItem,\n deleteItem,\n updateItem,\n moveUp,\n moveDown,\n moveTop,\n moveBottom,\n indent,\n outdent,\n moveTo,\n recalculatePositions,\n calculateSubtreeDepth,\n }\n}\n","import {\n computed,\n reactive,\n ref,\n toValue,\n watch,\n type ComputedRef,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n NestedPositionHint,\n NestedTree,\n NestedTreeNode,\n} from '@/labs/listEditor/types/listEditorTypes'\nimport {\n useNestedListEditor,\n type NestedViewItem,\n} from '@/labs/listEditor/composables/useNestedListEditor'\nimport type {\n GetKey,\n ListEditorValidationResult,\n PositionOption,\n} from '@/labs/listEditor/composables/useListEditorController'\nimport { nextListEditorTempId } from '@/labs/listEditor/utils/tempId'\nimport { cloneDeep } from '@/utils/common'\n\nexport type { ListEditorValidationResult, GetKey, PositionOption }\n\n/** Flattened ordered row carrying its resolved key (for change-sets + payload). */\nexport interface NestedListEditorChanges<TItem> {\n added: TItem[]\n updated: TItem[]\n moved: TItem[]\n deleted: TItem[]\n /**\n * Rows whose parent changed since the last commit (BUG-13 — persisted even\n * when the position number is unchanged).\n */\n reparented: TItem[]\n}\n\nexport interface UseNestedListEditorControllerOptions<TItem extends Record<string, any>> {\n /** Read the live tree (the editor's v-model, or a consumer store getter). */\n get: () => NestedTree<TItem>\n /** Write the tree back. */\n set: (tree: NestedTree<TItem>) => void\n /** New-row factory. Optional for read-only / no-add trees. Should mint a stable temp id. */\n factory?: () => TItem\n /** Stable row identity. Default `'id'`. Never point this at the position field. */\n getKey?: GetKey<TItem>\n /** Managed order field. Default `'position'`. `false` opts out of position management. */\n position?: PositionOption<TItem>\n /** Parent-key field written onto reparented rows. Default `'parent'`. */\n parentField?: string\n /** Maximum nesting depth (1-based). Enforced by indent/outdent/moveTo. */\n maxDepth: number\n /**\n * Extra top-level fields to drop from the dirty content-hash (position +\n * parent are always dropped). Same purpose as the flat controller — a child\n * collection tracked by a separate editor shouldn't flip its owner amber.\n * Accepts a getter/ref so a `computed` set is honoured reactively.\n */\n dirtyExclude?: MaybeRefOrGetter<string[]>\n /** Per-row validity — `true` = valid. Drives the red rail + `hasErrors`. */\n validate?: (item: TItem) => ListEditorValidationResult\n /** Custom dirty predicate (override the default `meta.dirty ∪ content-diff`). */\n isDirty?: (current: TItem, saved: TItem | undefined) => boolean\n /** Custom save payload (overrides `getPayload`). Receives the flattened ordered rows. */\n payload?: (items: TItem[]) => TItem[]\n /** Resolve a saved row's key on commit (default: existing key, else mint a temp id). */\n commitKey?: (saved: TItem, previous: TItem | undefined) => ListEditorKey\n /** Normalize the server tree before it becomes the new baseline on commit. */\n normalizeSaved?: (saved: NestedTree<TItem>) => NestedTree<TItem>\n}\n\n/**\n * Tree-shaped state controller for the nested list editor (v2). A superset of\n * the flat `ListEditorHandle`: same dirty/validate/commit/reset semantics, but\n * the row set is a flattened ordered projection of a `NestedTree` and the\n * mutators are tree ops (indent / outdent / moveTo / addChild …) delegated to\n * `useNestedListEditor`. Each flattened payload row carries its resolved\n * `position` and parent key written onto it.\n */\nexport interface NestedListEditorHandle<TItem extends Record<string, any>> {\n /** Flattened ordered rows (depth-first), matching the rendered order. */\n items: ComputedRef<TItem[]>\n /** Tree view rows (key/index/raw/depth/parent…), as consumed by the renderer. */\n viewItems: ComputedRef<NestedViewItem<TItem>[]>\n hasUnsaved: ComputedRef<boolean>\n hasErrors: ComputedRef<boolean>\n invalidKeys: ComputedRef<Set<ListEditorKey>>\n /** Amber: is this row added / edited / moved / reparented since the last commit? */\n isUnsaved: (key: ListEditorKey) => boolean\n /** Red rail (gated): 'invalid' only once the row is unsaved or `validateAll()` ran. */\n rowState: (item: TItem, key: ListEditorKey) => ListEditorValidationState\n /** Force-show all invalid rows + return whether the tree is valid. The save guard. */\n validateAll: () => boolean\n /** Flattened ordered array (each row carrying its resolved position + parent key) for a full-DTO save. */\n getPayload: () => TItem[]\n /** Change-set for partial-save endpoints (added/updated/moved/deleted/reparented), keyed. */\n getChanges: () => NestedListEditorChanges<TItem>\n /** Adopt the saved tree as the new baseline; backfill keys; clear dirty/submitted. */\n commit: (saved?: NestedTree<TItem>) => void\n /** Discard unsaved edits back to the last committed baseline (or a given tree). */\n reset: (tree?: NestedTree<TItem>) => void\n\n // Tree mutations — delegate to useNestedListEditor (which carries BUG-13).\n addItem: (item?: TItem, hint?: NestedPositionHint) => void\n addAfter: (afterKey: ListEditorKey, item?: TItem, childrenAllowed?: boolean) => void\n addChild: (parentKey: ListEditorKey, item?: TItem, childrenAllowed?: boolean) => void\n updateItem: (key: ListEditorKey, data: TItem, markDirty?: boolean) => void\n deleteItem: (key: ListEditorKey) => void\n moveUp: (key: ListEditorKey) => boolean\n moveDown: (key: ListEditorKey) => boolean\n moveTop: (key: ListEditorKey) => boolean\n moveBottom: (key: ListEditorKey) => boolean\n indent: (key: ListEditorKey) => boolean\n outdent: (key: ListEditorKey) => boolean\n moveTo: (\n key: ListEditorKey,\n targetParentKey: ListEditorKey | null,\n targetIndex: number,\n ) => boolean\n recalculatePositions: () => void\n\n /** Escape hatch: a row form (e.g. vuelidate) reports its own validity instead of `validate`. */\n registerValidity: (key: ListEditorKey, isValid: () => boolean) => () => void\n\n // Internal handles the editor needs to drive the tree directly (find a node,\n // subtree depth for drag, the underlying `editor.moveTo` returning the tree).\n findNode: (key: ListEditorKey) => {\n node: NestedTreeNode<TItem> | null\n parent: NestedTreeNode<TItem> | null\n }\n calculateSubtreeDepth: (node: NestedTreeNode<TItem>) => number\n}\n\nconst flatten = <TItem extends Record<string, any>>(tree: NestedTree<TItem>): TItem[] => {\n const out: TItem[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n out.push(n.data)\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(tree.children)\n return out\n}\n\nconst walkNodes = <TItem extends Record<string, any>>(\n tree: NestedTree<TItem>,\n visit: (node: NestedTreeNode<TItem>) => void,\n): void => {\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n visit(n)\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(tree.children)\n}\n\nexport function useNestedListEditorController<TItem extends Record<string, any>>(\n options: UseNestedListEditorControllerOptions<TItem>,\n): NestedListEditorHandle<TItem> {\n const keyField = (typeof options.getKey === 'function' ? null : (options.getKey ?? 'id')) as\n | keyof TItem\n | null\n const keyOf = (item: TItem): ListEditorKey =>\n typeof options.getKey === 'function'\n ? options.getKey(item)\n : (item[keyField as keyof TItem] as ListEditorKey)\n const keyFieldName = (keyField ?? 'id') as string\n\n const positionOpt = options.position ?? 'position'\n const managedPosition = positionOpt !== false\n const positionField = (\n typeof positionOpt === 'object'\n ? positionOpt.field\n : positionOpt === false\n ? 'position'\n : positionOpt\n ) as string\n const positionMultiplier =\n typeof positionOpt === 'object' && positionOpt.multiplier ? positionOpt.multiplier : 1\n const parentField = options.parentField ?? 'parent'\n\n // Two-way bridge to the consumer's tree: the composable's per-op\n // `model.value = cloned` writes back via `set`, the getter re-reads live edits.\n const model = computed<NestedTree<TItem>>({\n get: () => options.get(),\n set: (v) => options.set(v),\n }) as unknown as Ref<NestedTree<TItem>>\n\n const tree = useNestedListEditor<TItem>(model, {\n keyField: keyFieldName,\n // Pass the controller's keyOf so tree ops resolve keys identically to\n // invalidKeys/dirty tracking — supports a function get-key, not just a field.\n getKey: keyOf,\n positionField,\n parentField,\n positionMultiplier,\n maxDepth: options.maxDepth,\n })\n\n const items = computed<TItem[]>(() => flatten(options.get()))\n const viewItems = tree.viewItems\n\n // Baseline = last committed snapshot. `hashes` powers content-diff dirty\n // (position + parent excluded so a reorder/reparent never lights up via the\n // content hash — meta.dirty / the reparented set carries those instead).\n const dirtyExclude = computed<string[]>(() => toValue(options.dirtyExclude) ?? [])\n const normalize = (item: TItem): string => {\n const copy = { ...item } as Record<string, unknown>\n if (managedPosition) delete copy[positionField]\n delete copy[parentField]\n for (const f of dirtyExclude.value) delete copy[f]\n return JSON.stringify(copy)\n }\n const baselineHashes = ref(new Map<ListEditorKey, string>()) as Ref<Map<ListEditorKey, string>>\n // Parent-key per row at baseline — drives reparented detection (BUG-13).\n const baselineParents = ref(new Map<ListEditorKey, ListEditorKey | null>()) as Ref<\n Map<ListEditorKey, ListEditorKey | null>\n >\n const baselineTree = ref<NestedTree<TItem> | null>(null) as Ref<NestedTree<TItem> | null>\n\n const cloneTree = (t: NestedTree<TItem>): NestedTree<TItem> => cloneDeep(t)\n\n const captureBaseline = (t: NestedTree<TItem>) => {\n const hashes = new Map<ListEditorKey, string>()\n const parents = new Map<ListEditorKey, ListEditorKey | null>()\n const walk = (nodes: NestedTreeNode<TItem>[], parentKey: ListEditorKey | null) => {\n for (const n of nodes) {\n const key = keyOf(n.data)\n hashes.set(key, normalize(n.data))\n parents.set(key, parentKey)\n if (n.children && n.children.length) walk(n.children, key)\n }\n }\n walk(t.children, null)\n baselineHashes.value = hashes\n baselineParents.value = parents\n baselineTree.value = cloneTree(t)\n }\n captureBaseline(options.get())\n // Re-hash when the excluded-field set changes; `sync` so baseline + live\n // normalize() never disagree mid-flush. (Mirrors the flat controller.)\n watch(\n dirtyExclude,\n () => {\n if (!baselineTree.value) return\n const hashes = new Map<ListEditorKey, string>()\n walkNodes(baselineTree.value, (n) => hashes.set(keyOf(n.data), normalize(n.data)))\n baselineHashes.value = hashes\n },\n { flush: 'sync' },\n )\n\n const submitted = ref(false)\n // Reactive so a row form (re)registering its validity re-runs invalidKeys/rowState.\n const registeredValidity = reactive(new Map<ListEditorKey, () => boolean>())\n\n // Amber = added OR content-edited OR reparented (vs baseline). Position is\n // excluded, so a displaced sibling's pure renumber is NOT amber (like the flat\n // editor); BUG-13 adds the parent-changed signal so a reparent registers even\n // at an unchanged position number. `getChanges().moved` still reads meta.dirty,\n // so displaced siblings' new positions are persisted regardless.\n const isItemDirty = (\n node: NestedTreeNode<TItem>,\n key: ListEditorKey,\n parentKey: ListEditorKey | null,\n ): boolean => {\n if (options.isDirty) {\n const saved = baselineTreeRow(key)\n return options.isDirty(node.data, saved)\n }\n const baseHash = baselineHashes.value.get(key)\n if (baseHash === undefined) return true // added\n if (baseHash !== normalize(node.data)) return true // content-edited (pos/parent excluded)\n // Reparented vs baseline (BUG-13).\n if (baselineParents.value.has(key)) {\n const baseParent = baselineParents.value.get(key) ?? null\n if ((baseParent ?? null) !== (parentKey ?? null)) return true\n }\n return false\n }\n\n const baselineTreeRow = (key: ListEditorKey): TItem | undefined => {\n if (!baselineTree.value) return undefined\n let hit: TItem | undefined\n walkNodes(baselineTree.value, (n) => {\n if (hit === undefined && keyOf(n.data) === key) hit = n.data\n })\n return hit\n }\n\n const unsavedKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n const walk = (nodes: NestedTreeNode<TItem>[], parentKey: ListEditorKey | null) => {\n for (const n of nodes) {\n const key = keyOf(n.data)\n if (isItemDirty(n, key, parentKey)) out.add(key)\n if (n.children && n.children.length) walk(n.children, key)\n }\n }\n walk(options.get().children, null)\n return out\n })\n\n const isUnsaved = (key: ListEditorKey): boolean => unsavedKeys.value.has(key)\n const hasUnsaved = computed<boolean>(() => unsavedKeys.value.size > 0)\n\n const resolveValidity = (\n item: TItem,\n key: ListEditorKey,\n ): { invalid: boolean; warning: boolean } => {\n const registered = registeredValidity.get(key)\n if (registered) return { invalid: !registered(), warning: false }\n if (!options.validate) return { invalid: false, warning: false }\n const r = options.validate(item)\n if (typeof r === 'boolean') return { invalid: !r, warning: false }\n return { invalid: !r.valid, warning: r.valid && r.state === 'warning' }\n }\n\n const invalidKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n walkNodes(options.get(), (n) => {\n const key = keyOf(n.data)\n if (resolveValidity(n.data, key).invalid) out.add(key)\n })\n return out\n })\n const hasErrors = computed<boolean>(() => invalidKeys.value.size > 0)\n\n // Red rail gated behind \"row interacted with\" (unsaved) or an explicit\n // validateAll() — mirrors the flat controller. Kills the collapsed-row\n // save-guard gap: validateAll() surfaces every offender, mounted or not.\n const rowState = (item: TItem, key: ListEditorKey): ListEditorValidationState => {\n const { invalid, warning } = resolveValidity(item, key)\n if (invalid) return isUnsaved(key) || submitted.value ? 'invalid' : null\n if (warning) return 'warning'\n return null\n }\n\n const validateAll = (): boolean => {\n submitted.value = true\n return invalidKeys.value.size === 0\n }\n\n // Flattened ordered payload; parent key is resolved from tree structure (so a\n // reparent is reflected even if the node's own parent field lagged).\n const buildPayload = (): TItem[] => {\n const out: TItem[] = []\n const walk = (nodes: NestedTreeNode<TItem>[], parentKey: ListEditorKey | null) => {\n for (const n of nodes) {\n const row = { ...n.data } as TItem\n ;(row as Record<string, unknown>)[parentField] = parentKey\n out.push(row)\n if (n.children && n.children.length) walk(n.children, keyOf(n.data))\n }\n }\n walk(options.get().children, null)\n return out\n }\n\n const getPayload = (): TItem[] =>\n options.payload ? options.payload(buildPayload()) : buildPayload()\n\n const getChanges = (): NestedListEditorChanges<TItem> => {\n const added: TItem[] = []\n const updated: TItem[] = []\n const moved: TItem[] = []\n const reparented: TItem[] = []\n const payload = buildPayload()\n const byKey = new Map<ListEditorKey, TItem>()\n for (const row of payload) byKey.set(keyOf(row), row)\n\n walkNodes(options.get(), (n) => {\n const key = keyOf(n.data)\n const row = byKey.get(key) ?? n.data\n const baseHash = baselineHashes.value.get(key)\n if (baseHash === undefined) {\n added.push(row)\n } else if (baseHash !== normalize(n.data)) {\n updated.push(row)\n }\n // meta.dirty without a content change => a move/reparent (position/parent\n // changed). recalculateSiblings + BUG-13 set meta.dirty on those.\n if (baseHash !== undefined && n.meta.dirty && baseHash === normalize(n.data)) {\n moved.push(row)\n }\n // Reparented = parent key differs from baseline (subset of moved, but\n // surfaced separately for partial-multi saves that re-link parents).\n if (baselineParents.value.has(key)) {\n const baseParent = baselineParents.value.get(key) ?? null\n const nowParent = (row as Record<string, unknown>)[parentField] as ListEditorKey | null\n if ((baseParent ?? null) !== (nowParent ?? null)) reparented.push(row)\n }\n })\n\n const deleted: TItem[] = []\n if (baselineTree.value) {\n const liveKeys = new Set<ListEditorKey>()\n walkNodes(options.get(), (n) => liveKeys.add(keyOf(n.data)))\n walkNodes(baselineTree.value, (n) => {\n if (!liveKeys.has(keyOf(n.data))) deleted.push(n.data)\n })\n }\n return { added, updated, moved, deleted, reparented }\n }\n\n const commit = (saved?: NestedTree<TItem>): void => {\n const source = saved ?? options.get()\n const normalized = options.normalizeSaved ? options.normalizeSaved(source) : source\n // Backfill missing keys + clear meta.dirty on the committed tree.\n const next = cloneTree(normalized)\n walkNodes(next, (n) => {\n const previous = baselineTreeRow(keyOf(n.data))\n const resolvedKey = options.commitKey ? options.commitKey(n.data, previous) : keyOf(n.data)\n if (resolvedKey === undefined || resolvedKey === null) {\n if (keyField) (n.data as Record<string, unknown>)[keyFieldName] = nextListEditorTempId()\n }\n n.meta.dirty = false\n })\n options.set(next)\n captureBaseline(next)\n submitted.value = false\n }\n\n const reset = (t?: NestedTree<TItem>): void => {\n const restore = t ?? (baselineTree.value ? cloneTree(baselineTree.value) : options.get())\n options.set(restore)\n submitted.value = false\n }\n\n // --- Tree mutations (delegate to useNestedListEditor) -----------------------\n\n const addItem = (item?: TItem, hint?: NestedPositionHint): void => {\n const data = item ?? options.factory?.()\n if (data === undefined) return // no item + no factory (read-only) → no-op\n tree.addItem(data, hint)\n }\n const addAfter = (afterKey: ListEditorKey, item?: TItem, childrenAllowed = true): void => {\n const data = item ?? options.factory?.()\n if (data === undefined) return\n tree.addItem(data, { afterId: afterKey, childrenAllowed })\n }\n const addChild = (parentKey: ListEditorKey, item?: TItem, childrenAllowed = true): void => {\n const data = item ?? options.factory?.()\n if (data === undefined) return\n tree.addItem(data, { parentId: parentKey, childrenAllowed })\n }\n const updateItem = (key: ListEditorKey, data: TItem, markDirty = true): void => {\n tree.updateItem(key, data, markDirty)\n }\n const deleteItem = (key: ListEditorKey): void => {\n tree.deleteItem(key)\n }\n const moveUp = (key: ListEditorKey): boolean => tree.moveUp(key) !== null\n const moveDown = (key: ListEditorKey): boolean => tree.moveDown(key) !== null\n const moveTop = (key: ListEditorKey): boolean => tree.moveTop(key) !== null\n const moveBottom = (key: ListEditorKey): boolean => tree.moveBottom(key) !== null\n const indent = (key: ListEditorKey): boolean => tree.indent(key) !== null\n const outdent = (key: ListEditorKey): boolean => tree.outdent(key) !== null\n const moveTo = (\n key: ListEditorKey,\n targetParentKey: ListEditorKey | null,\n targetIndex: number,\n ): boolean => tree.moveTo(key, targetParentKey, targetIndex) !== null\n const recalculatePositions = (): void => {\n options.set(tree.recalculatePositions(options.get()))\n }\n\n const registerValidity = (key: ListEditorKey, isValid: () => boolean): (() => void) => {\n registeredValidity.set(key, isValid)\n return () => registeredValidity.delete(key)\n }\n\n return {\n items,\n viewItems,\n hasUnsaved,\n hasErrors,\n invalidKeys,\n isUnsaved,\n rowState,\n validateAll,\n getPayload,\n getChanges,\n commit,\n reset,\n addItem,\n addAfter,\n addChild,\n updateItem,\n deleteItem,\n moveUp,\n moveDown,\n moveTop,\n moveBottom,\n indent,\n outdent,\n moveTo,\n recalculatePositions,\n registerValidity,\n findNode: tree.findNode,\n calculateSubtreeDepth: tree.calculateSubtreeDepth,\n }\n}\n","import type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\nimport type { NestedViewItem } from '@/labs/listEditor/composables/useNestedListEditor'\n\n/**\n * Drop instruction — where the dragged item will land + how to paint the line.\n *\n * Outliner model (dnd-kit / Workflowy style):\n * - Pointer Y picks which gap the drop lands in: the upper 50% of the\n * hovered row = the gap above it, the lower 50% = the gap below.\n * - Pointer X picks the depth within that gap. Depth is measured in indent\n * columns of `indentPx` each, rounded to the nearest column, and clamped\n * to `[0, anchor.depth + 1]` where `anchor` is the visible row immediately\n * above the target gap. You can never skip more than one level deeper\n * than what's already on the row above — same rule as dnd-kit's\n * SortableTree — which keeps the tree structure coherent.\n *\n * `makeChild: true` when the chosen depth is one level deeper than the\n * anchor. The target becomes a new parent and the consumer should\n * auto-expand `parentKey` so the inserted row stays visible.\n *\n * `blocked` wraps the would-be instruction when the move would breach\n * `maxDepth` — the overlay keeps rendering the line in a warning colour\n * so the intent stays legible but the mutation is refused.\n */\n\nexport type ExecutableInstruction = {\n type: 'insert'\n refKey: ListEditorKey\n refEdge: 'top' | 'bottom'\n parentKey: ListEditorKey | null\n index: number\n depth: number\n makeChild: boolean\n // Row whose level the inserted item will match — the sibling we're\n // inserting after (sibling case) or the ancestor we're joining as sibling\n // of (reparent case). `null` for make-child (creating a brand new deeper\n // level, no existing peer to anchor against) and the root-top fallback.\n // Consumers render a thin connector from the drop line up to this row so\n // the user can see which row dictates the new level.\n levelRowKey: ListEditorKey | null\n}\n\nexport type Instruction =\n | ExecutableInstruction\n | {\n type: 'blocked'\n desired: ExecutableInstruction\n reason: 'maxDepth'\n }\n\nexport interface HoveredRow {\n key: ListEditorKey\n rect: DOMRect\n depth: number\n parentKey: ListEditorKey | null\n siblingIndex: number\n siblingCount: number\n}\n\nexport interface ComputeInstructionArgs {\n pointer: { x: number; y: number }\n hoveredRow: HoveredRow\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n viewItems: NestedViewItem<any>[]\n maxDepth: number\n indentPx: number\n containerLeft: number\n containerPaddingLeft: number\n}\n\nconst findByKey = (\n viewItems: NestedViewItem<any>[],\n key: ListEditorKey,\n): NestedViewItem<any> | null => viewItems.find((v) => v.key === key) ?? null\n\nconst isDescendantOf = (\n viewItems: NestedViewItem<any>[],\n ancestorKey: ListEditorKey,\n candidateKey: ListEditorKey,\n): boolean => {\n let current = findByKey(viewItems, candidateKey)\n while (current && current.parentKey !== null) {\n if (current.parentKey === ancestorKey) return true\n current = findByKey(viewItems, current.parentKey)\n }\n return false\n}\n\nconst findAncestorAtDepth = (\n viewItems: NestedViewItem<any>[],\n startKey: ListEditorKey,\n targetDepth: number,\n): NestedViewItem<any> | null => {\n let current = findByKey(viewItems, startKey)\n while (current && current.depth > targetDepth) {\n if (current.parentKey === null) return null\n current = findByKey(viewItems, current.parentKey)\n }\n return current && current.depth === targetDepth ? current : null\n}\n\nconst isInSourceSubtree = (\n viewItems: NestedViewItem<any>[],\n sourceKey: ListEditorKey,\n candidateKey: ListEditorKey,\n): boolean => candidateKey === sourceKey || isDescendantOf(viewItems, sourceKey, candidateKey)\n\n// Walk the flat view-items list in `dir` (±1) starting at `startIdx`, skipping\n// any row that belongs to the dragged subtree — those rows aren't visible drop\n// targets so they shouldn't define the gap boundaries for depth clamping.\nconst findSiblingNotInSource = (\n viewItems: NestedViewItem<any>[],\n startIdx: number,\n dir: 1 | -1,\n sourceKey: ListEditorKey,\n): NestedViewItem<any> | null => {\n for (let i = startIdx; i >= 0 && i < viewItems.length; i += dir) {\n const vi = viewItems[i]\n if (!isInSourceSubtree(viewItems, sourceKey, vi.key)) return vi\n }\n return null\n}\n\nexport const computeInstruction = (args: ComputeInstructionArgs): Instruction | null => {\n const {\n pointer,\n hoveredRow,\n sourceKey,\n sourceSubtreeDepth,\n viewItems,\n maxDepth,\n indentPx,\n containerLeft,\n containerPaddingLeft,\n } = args\n\n if (hoveredRow.key === sourceKey) return null\n if (isDescendantOf(viewItems, sourceKey, hoveredRow.key)) return null\n\n const y = pointer.y - hoveredRow.rect.top\n const h = hoveredRow.rect.height\n const inTopHalf = y < h / 2\n const refEdge: 'top' | 'bottom' = inTopHalf ? 'top' : 'bottom'\n\n // The gap between two flat-adjacent rows frames the drop. `prev` is the\n // row immediately above the gap, `next` is the row immediately below it.\n // Rows belonging to the dragged subtree don't exist for clamping purposes —\n // they'll disappear from the flat list once the move completes, so they\n // can't define the depth bounds of the drop.\n const flatIdx = viewItems.findIndex((v) => v.key === hoveredRow.key)\n const prev: NestedViewItem<any> | null = inTopHalf\n ? findSiblingNotInSource(viewItems, flatIdx - 1, -1, sourceKey)\n : findSiblingNotInSource(viewItems, flatIdx, -1, sourceKey)\n const next: NestedViewItem<any> | null = inTopHalf\n ? findSiblingNotInSource(viewItems, flatIdx, 1, sourceKey)\n : findSiblingNotInSource(viewItems, flatIdx + 1, 1, sourceKey)\n\n // Depth bounds for this gap:\n // maxDepth = prev.depth + 1 (you can nest one level deeper than prev).\n // minDepth = next.depth (shallower would insert AFTER next's parent\n // subtree, i.e., at a different Y than the\n // user is pointing at — so that's not a valid\n // option for THIS gap).\n // If prev is missing (gap at top of tree) or next is missing (bottom of\n // tree), the missing side defaults to 0.\n const pointerRelX = pointer.x - containerLeft - containerPaddingLeft\n const rawDepth = Math.round(pointerRelX / indentPx)\n const depthCeiling = prev ? prev.depth + 1 : 0\n const depthFloor = next ? next.depth : 0\n const clampedDepth = Math.max(depthFloor, Math.min(rawDepth, depthCeiling))\n\n let desired: ExecutableInstruction\n\n if (!prev) {\n // Gap at the very top of the tree — only landing is root index 0.\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge: 'top',\n parentKey: null,\n index: 0,\n depth: 0,\n makeChild: false,\n levelRowKey: null,\n }\n } else if (clampedDepth === prev.depth + 1) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.key,\n index: 0,\n depth: clampedDepth,\n makeChild: true,\n levelRowKey: null,\n }\n } else if (clampedDepth === prev.depth) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.parentKey,\n index: prev.siblingIndex + 1,\n depth: clampedDepth,\n makeChild: false,\n levelRowKey: prev.key,\n }\n } else {\n // clampedDepth < prev.depth → reparent to ancestor at clampedDepth.\n const ancestor = findAncestorAtDepth(viewItems, prev.key, clampedDepth)\n if (ancestor) {\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: ancestor.parentKey,\n index: ancestor.siblingIndex + 1,\n depth: clampedDepth,\n makeChild: false,\n levelRowKey: ancestor.key,\n }\n } else {\n // Shouldn't hit with clampedDepth ≥ 0 but keep a safe fallback.\n desired = {\n type: 'insert',\n refKey: hoveredRow.key,\n refEdge,\n parentKey: prev.parentKey,\n index: prev.siblingIndex + 1,\n depth: prev.depth,\n makeChild: false,\n levelRowKey: prev.key,\n }\n }\n }\n\n if (desired.depth + sourceSubtreeDepth - 1 >= maxDepth) {\n return { type: 'blocked', desired, reason: 'maxDepth' }\n }\n\n return desired\n}\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { useI18n } from 'vue-i18n'\nimport LeNestedRowSelf from './LeNestedRow.vue'\nimport LeDragHandle from '@/labs/listEditor/internal/LeDragHandle.vue'\nimport LeUnsavedLabel from '@/labs/listEditor/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n} from '@/labs/listEditor/types/listEditorTypes'\n\n// Self-recursive row. Interior uses `any` — strong typing lives on the public ANestedSortableListEditor wrapper.\n\nexport type Props = {\n vi: any\n viewItems: any[]\n dragState: any\n context: any\n callbacks: any\n}\nconst props = defineProps<Props>()\n\n// `as any` breaks Vue's circular type inference on self-import.\nconst LeNestedRow = LeNestedRowSelf as any\n\nconst { t } = useI18n()\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\nconst anchorName = (key: ListEditorKey): string => `--row-${String(key).replace(/\\W/g, '_')}`\n\n// Delegate to the parent editor's resolver so the registry + getValidationState\n// prop apply consistently. Falls back to reading raw.validationState if context\n// doesn't supply one.\nconst resolveValidation = (raw: TItem): ListEditorValidationState => {\n if (typeof props.context.resolveValidation === 'function') {\n return props.context.resolveValidation(raw, props.vi.key, props.vi.index)\n }\n const v = raw.validationState\n if (v === 'valid' || v === 'invalid' || v === 'warning') return v\n return null\n}\n\nconst buildSlotProps = () => props.context.buildSlotProps(props.vi)\n\nconst directChildren = (): any[] => props.viewItems.filter((v) => v.parentKey === props.vi.key)\n</script>\n\n<template>\n <div\n :class=\"[\n 'a-le-row-wrapper',\n {\n 'a-le-row-wrapper--drop-disabled': dragState !== null && dragState.sourceKey === vi.key,\n },\n ]\"\n :data-id=\"String(vi.key)\"\n role=\"treeitem\"\n :aria-level=\"vi.depth + 1\"\n :tabindex=\"context.keyboardNav ? context.keyboardNav.rowTabindex(vi.key) : undefined\"\n @keydown=\"context.keyboardNav ? context.keyboardNav.handleKeydown(vi.key, $event) : undefined\"\n >\n <div\n :class=\"[\n 'a-le-row',\n vi.depth > 0 ? 'a-le-row--child' : null,\n {\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--reorder': context.reorderMode,\n 'a-le-row--grabbed': context.keyboardNav && context.keyboardNav.isGrabbed(vi.key),\n 'a-le-row--clickable': context.isRowClickable(vi),\n 'a-le-row--drop-source': dragState !== null && dragState.sourceKey === vi.key,\n [`a-le-row--validation-${resolveValidation(vi.raw)}`]: resolveValidation(vi.raw) !== null,\n },\n ]\"\n :style=\"{\n '--nested-depth': vi.depth,\n 'anchor-name': anchorName(vi.key),\n '--parent-anchor': vi.parentKey !== null ? anchorName(vi.parentKey) : 'none',\n }\"\n >\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps()\"\n />\n\n <div\n class=\"a-le-row-header\"\n @click=\"callbacks.onRowClick(vi)\"\n >\n <LeDragHandle\n v-if=\"context.dragEnabled\"\n :class=\"HANDLE_CLASS\"\n />\n\n <!-- Expand toggle — a small triangular caret rendered uniformly for both\n root and nested rows. For leaf rows (no children) the toggle is\n hidden via `visibility: hidden` so the column stays aligned. -->\n <button\n v-if=\"context.showExpandToggle && vi.childrenAllowed\"\n type=\"button\"\n :class=\"[\n 'a-nested-list-editor__tree-toggle',\n {\n 'a-nested-list-editor__tree-toggle--empty': !vi.hasChildren,\n 'a-nested-list-editor__tree-toggle--open': vi.childrenExpanded,\n },\n ]\"\n :aria-label=\"vi.childrenExpanded ? t('common.sortable.close') : t('common.sortable.edit')\"\n @click.stop=\"vi.hasChildren && callbacks.onChevronClick(vi)\"\n >\n <span class=\"a-nested-list-editor__tree-toggle-caret\" />\n </button>\n <!-- Spacer for leaf rows that have no caret, so titles align with\n parents having one. -->\n <span\n v-else-if=\"context.showExpandToggle\"\n class=\"a-nested-list-editor__tree-toggle a-nested-list-editor__tree-toggle--spacer\"\n aria-hidden=\"true\"\n />\n\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps()\"\n >\n <span class=\"a-le-title\">\n {{ context.resolveCompactText(vi.raw, vi.key) }}\n </span>\n </slot>\n <!-- Visible only inside the SortableJS drag clone — signals that the\n item being moved carries a subtree so the user realises the whole\n branch will follow. Sits right after the title. Hidden in the\n normal DOM via CSS. -->\n <span\n v-if=\"vi.hasChildren\"\n class=\"a-nested-list-editor__drag-count\"\n aria-hidden=\"true\"\n >\n <VIcon\n icon=\"mdi-file-tree\"\n size=\"14\"\n />\n +{{ vi.childrenCount }}\n </span>\n <LeUnsavedLabel v-if=\"vi.unsaved\" />\n </div>\n\n <div\n v-if=\"!context.reorderMode\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps()\"\n >\n <span\n v-if=\"\n context.statusField &&\n vi.raw[context.statusField] != null &&\n vi.raw[context.statusField] !== ''\n \"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[context.statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps()\"\n >\n <template v-if=\"context.reorderMode\">\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :disabled=\"vi.firstInParent\"\n class=\"mx-1 a-le-action a-le-action--up\"\n @click.stop=\"callbacks.moveUp(vi.key)\"\n >\n <VIcon\n icon=\"mdi-arrow-up\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.moveUp')\"\n />\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :disabled=\"vi.lastInParent\"\n class=\"mx-1 a-le-action a-le-action--down\"\n @click.stop=\"callbacks.moveDown(vi.key)\"\n >\n <VIcon\n icon=\"mdi-arrow-down\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.moveDown')\"\n />\n </VBtn>\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n :disabled=\"vi.firstInParent\"\n @click.stop=\"callbacks.moveTop(vi.key)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-up\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.moveToTop') }}</VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"vi.lastInParent\"\n @click.stop=\"callbacks.moveBottom(vi.key)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-down\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.moveToBottom') }}</VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showMoveToPosition && (!vi.firstInParent || !vi.lastInParent)\"\n @click.stop=\"callbacks.openMoveToPosition(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-target\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.moveToPosition.action') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showChangeParent\"\n @click.stop=\"callbacks.openChangeParent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-folder-move-outline\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.changeParent.action') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"!vi.canIndent\"\n @click.stop=\"callbacks.indent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-format-indent-increase\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.indent') }}</VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"!vi.canOutdent\"\n @click.stop=\"callbacks.outdent(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-format-indent-decrease\" />\n </template>\n <VListItemTitle>{{ t('common.sortable.outdent') }}</VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showDeleteButton && context.canInteract\"\n @click.stop=\"callbacks.onDeleteClick(vi)\"\n >\n <template #prepend>\n <VIcon\n icon=\"mdi-trash-can-outline\"\n color=\"error\"\n />\n </template>\n <VListItemTitle class=\"text-error\">\n {{ t('common.sortable.delete') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n <template v-else>\n <VBtn\n v-if=\"context.showEditButton && context.canInteract\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"callbacks.onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"context.showDeleteButton && context.canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"callbacks.onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"\n context.canInteract &&\n ((context.showAddChildButton && vi.canAddChild) || context.showAddAfterAction)\n \"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem\n v-if=\"context.showAddAfterAction\"\n @click.stop=\"callbacks.onAddAfterClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-playlist-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"context.showAddChildButton && vi.canAddChild\"\n @click.stop=\"callbacks.onAddChildClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-subdirectory-arrow-right\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addChild') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <!-- Inline edit body — status badge intentionally NOT rendered here,\n the compact header's status is enough; stacking it in the form body\n was visually noisy. -->\n <template v-if=\"vi.editing && !context.reorderMode && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps()\"\n >\n <div\n v-if=\"context.showInlineSaveFooter\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"callbacks.onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"callbacks.onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"\n $slots['item-readonly'] && (context.readonly || vi.expanded) && !context.reorderMode\n \"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps()\"\n />\n </div>\n\n <!-- Recursive children — any depth level. The `::before` on this wrapper\n renders the single continuous vertical tree line at the parent's\n chevron column (see CSS). One line per group = no per-row gaps. -->\n <div\n v-if=\"vi.hasChildren && vi.childrenExpanded\"\n class=\"a-nested-list-editor__children\"\n :style=\"{ '--parent-depth': vi.depth }\"\n >\n <div\n :class=\"[GROUP_CLASS]\"\n :data-parent-id=\"String(vi.key)\"\n >\n <LeNestedRow\n v-for=\"child in directChildren()\"\n :key=\"String(child.key)\"\n :vi=\"child\"\n :view-items=\"viewItems\"\n :drag-state=\"dragState\"\n :context=\"context\"\n :callbacks=\"callbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type {\n ListEditorKey,\n NestedTree,\n NestedTreeNode,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface Props<TItem extends Record<string, any>> {\n tree: NestedTree<TItem>\n sourceKey: ListEditorKey | null\n keyField: string\n maxDepth: number\n resolveLabel: (raw: TItem, key: ListEditorKey) => string\n calculateSubtreeDepth: (node: NestedTreeNode<TItem>) => number\n}\n\ninterface Candidate {\n key: ListEditorKey | null\n depth: number\n label: string\n hasChildren: boolean\n disallowed: boolean\n reason: 'self' | 'descendant' | 'maxDepth' | 'currentParent' | null\n}\n\nconst props = defineProps<Props<TItem>>()\n\nconst emit = defineEmits<{\n confirm: [parentId: ListEditorKey | null, position: 'first' | 'last']\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n\nconst { t } = useI18n()\n\nconst selectedKey = ref<ListEditorKey | null | undefined>(undefined)\nconst placement = ref<'first' | 'last'>('last')\n\nwatch(open, (now) => {\n if (now) {\n selectedKey.value = undefined\n placement.value = 'last'\n }\n})\n\n// Walk the source's subtree to gather descendant keys (cycle prevention).\nconst descendantKeys = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n if (props.sourceKey === null) return out\n const walk = (nodes: NestedTreeNode<TItem>[]): boolean => {\n for (const n of nodes) {\n const k = n.data[props.keyField] as ListEditorKey\n if (k === props.sourceKey) {\n const collect = (sub: NestedTreeNode<TItem>[]) => {\n for (const s of sub) {\n out.add(s.data[props.keyField] as ListEditorKey)\n if (s.children?.length) collect(s.children)\n }\n }\n if (n.children?.length) collect(n.children)\n return true\n }\n if (n.children?.length && walk(n.children)) return true\n }\n return false\n }\n walk(props.tree.children)\n return out\n})\n\nconst sourceNode = computed<NestedTreeNode<TItem> | null>(() => {\n if (props.sourceKey === null) return null\n const find = (nodes: NestedTreeNode<TItem>[]): NestedTreeNode<TItem> | null => {\n for (const n of nodes) {\n if ((n.data[props.keyField] as ListEditorKey) === props.sourceKey) return n\n if (n.children?.length) {\n const hit = find(n.children)\n if (hit) return hit\n }\n }\n return null\n }\n return find(props.tree.children)\n})\n\n// `currentParentKey` = parent of the source row (null if source is at root).\n// We exclude this from candidates because moving to \"the same parent\" is not a\n// \"change parent\" operation (use Move-to-position instead).\nconst currentParentKey = computed<ListEditorKey | null | undefined>(() => {\n if (props.sourceKey === null) return undefined\n const find = (\n nodes: NestedTreeNode<TItem>[],\n parentKey: ListEditorKey | null,\n ): ListEditorKey | null | undefined => {\n for (const n of nodes) {\n if ((n.data[props.keyField] as ListEditorKey) === props.sourceKey) return parentKey\n if (n.children?.length) {\n const hit = find(n.children, n.data[props.keyField] as ListEditorKey)\n if (hit !== undefined) return hit\n }\n }\n return undefined\n }\n return find(props.tree.children, null)\n})\n\nconst candidates = computed<Candidate[]>(() => {\n const out: Candidate[] = []\n const subtreeDepth = sourceNode.value ? props.calculateSubtreeDepth(sourceNode.value) : 1\n\n out.push({\n key: null,\n depth: 0,\n label: t('common.sortable.changeParent.rootLabel'),\n hasChildren: props.tree.children.length > 0,\n disallowed: currentParentKey.value === null,\n reason: currentParentKey.value === null ? 'currentParent' : null,\n })\n\n const walk = (nodes: NestedTreeNode<TItem>[], depth: number) => {\n for (const n of nodes) {\n const key = n.data[props.keyField] as ListEditorKey\n let disallowed = false\n let reason: Candidate['reason'] = null\n if (key === props.sourceKey) {\n disallowed = true\n reason = 'self'\n } else if (descendantKeys.value.has(key)) {\n disallowed = true\n reason = 'descendant'\n } else if (currentParentKey.value !== undefined && currentParentKey.value === key) {\n disallowed = true\n reason = 'currentParent'\n } else if (depth + 1 + subtreeDepth > props.maxDepth) {\n disallowed = true\n reason = 'maxDepth'\n }\n out.push({\n key,\n depth: depth + 1,\n label: props.resolveLabel(n.data as TItem, key),\n hasChildren: !!(n.children && n.children.length > 0),\n disallowed,\n reason,\n })\n if (n.children?.length) walk(n.children, depth + 1)\n }\n }\n walk(props.tree.children, 0)\n return out\n})\n\nconst validCandidates = computed(() => candidates.value.filter((c) => !c.disallowed))\n\nconst selectedCandidate = computed<Candidate | null>(() =>\n selectedKey.value === undefined\n ? null\n : (candidates.value.find((c) => c.key === selectedKey.value) ?? null),\n)\n\nconst showPlacementPicker = computed<boolean>(\n () => !!selectedCandidate.value && selectedCandidate.value.hasChildren,\n)\n\nconst onCandidateClick = (c: Candidate) => {\n if (c.disallowed) return\n selectedKey.value = c.key\n}\n\nconst onConfirm = () => {\n if (!selectedCandidate.value) return\n emit('confirm', selectedCandidate.value.key, placement.value)\n open.value = false\n}\n\nconst onCancel = () => {\n open.value = false\n}\n\nconst indent = (depth: number): string => `${depth * 16}px`\n\nconst reasonLabel = (reason: Candidate['reason']): string => {\n if (reason === 'maxDepth') return t('common.sortable.changeParent.errorMaxDepth')\n return ''\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"540\"\n persistent\n >\n <VCard>\n <VCardTitle>\n {{ t('common.sortable.changeParent.title') }}\n </VCardTitle>\n\n <VCardText\n v-if=\"validCandidates.length === 0\"\n class=\"text-body-medium\"\n >\n <VAlert\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n >\n <strong>{{ t('common.sortable.changeParent.noTargetsTitle') }}</strong>\n <div>{{ t('common.sortable.changeParent.noTargetsText') }}</div>\n </VAlert>\n </VCardText>\n\n <template v-else>\n <VCardText class=\"pb-1\">\n <VList\n density=\"compact\"\n class=\"le-change-parent__list\"\n >\n <VListItem\n v-for=\"c in candidates\"\n :key=\"c.key === null ? '__root__' : String(c.key)\"\n :disabled=\"c.disallowed\"\n :active=\"selectedKey === c.key\"\n :title=\"c.label\"\n :subtitle=\"reasonLabel(c.reason)\"\n :style=\"{ paddingInlineStart: indent(c.depth) }\"\n :data-disallowed=\"c.disallowed ? 'true' : 'false'\"\n :data-reason=\"c.reason ?? ''\"\n @click=\"onCandidateClick(c)\"\n >\n <template #prepend>\n <VIcon\n v-if=\"c.key === null\"\n icon=\"mdi-folder-home-outline\"\n size=\"18\"\n />\n <VIcon\n v-else-if=\"c.hasChildren\"\n icon=\"mdi-folder-outline\"\n size=\"18\"\n />\n <VIcon\n v-else\n icon=\"mdi-file-outline\"\n size=\"18\"\n />\n </template>\n </VListItem>\n </VList>\n </VCardText>\n\n <VCardText\n v-if=\"showPlacementPicker\"\n class=\"pt-0\"\n >\n <div class=\"text-body-medium mb-2\">\n {{\n t('common.sortable.changeParent.placementHeading', {\n label: selectedCandidate?.label ?? '',\n })\n }}\n </div>\n <VRadioGroup\n v-model=\"placement\"\n density=\"compact\"\n hide-details\n >\n <VRadio\n value=\"first\"\n :label=\"t('common.sortable.changeParent.placeFirst')\"\n />\n <VRadio\n value=\"last\"\n :label=\"t('common.sortable.changeParent.placeLast')\"\n />\n </VRadioGroup>\n </VCardText>\n </template>\n\n <VCardActions>\n <VSpacer />\n <VBtn\n variant=\"text\"\n @click=\"onCancel\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"elevated\"\n :disabled=\"!selectedCandidate || selectedCandidate.disallowed\"\n @click=\"onConfirm\"\n >\n {{ t('common.sortable.changeParent.confirm') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style lang=\"scss\" scoped>\n.le-change-parent__list {\n max-height: 340px;\n overflow-y: auto;\n}\n</style>\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n useSlots,\n useTemplateRef,\n watch,\n} from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useContainerWidth } from '@/labs/listEditor/composables/useContainerWidth'\nimport { useIsTouchDevice } from '@/labs/listEditor/composables/useIsTouchDevice'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport { type NestedViewItem } from '@/labs/listEditor/composables/useNestedListEditor'\nimport {\n useNestedListEditorController,\n type GetKey,\n type ListEditorValidationResult,\n type NestedListEditorHandle,\n type PositionOption,\n} from '@/labs/listEditor/composables/useNestedListEditorController'\nimport {\n computeInstruction,\n type ExecutableInstruction,\n type Instruction,\n} from '@/labs/listEditor/composables/useDragInstruction'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedSection } from '@/labs/unsavedGuard/useUnsavedSection'\nimport { useDeleteDialog } from '@/labs/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/labs/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/labs/listEditor/utils/revealInvalidRows'\nimport { useReorderMode } from '@/labs/listEditor/composables/useReorderMode'\nimport { cloneDeep } from '@/utils/common'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n NestedPositionHint,\n NestedTree,\n NestedTreeNode,\n} from '@/labs/listEditor/types/listEditorTypes'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { stringToInt } from '@/utils/string'\nimport LeNestedRow from '@/labs/listEditor/internal/LeNestedRow.vue'\nimport LeDeleteDialog from '@/labs/listEditor/internal/LeDeleteDialog.vue'\nimport LeMoveToPositionDialog from '@/labs/listEditor/internal/LeMoveToPositionDialog.vue'\nimport LeChangeParentDialog from '@/labs/listEditor/internal/LeChangeParentDialog.vue'\nimport LeEmptyState from '@/labs/listEditor/internal/LeEmptyState.vue'\nimport LeStatus from '@/labs/listEditor/internal/LeStatus.vue'\nimport {\n DRAG_GHOST_CLASS,\n DRAG_CHOSEN_CLASS,\n DRAG_CLASS,\n} from '@/labs/listEditor/internal/constants'\n\nexport interface DecoratedNestedViewItem<T> extends NestedViewItem<T> {\n editing: boolean\n expanded: boolean\n childrenExpanded: boolean\n loading: boolean\n dirty: boolean\n moved: boolean\n unsaved: boolean\n}\n\nexport interface DragState {\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n instruction: Instruction | null\n}\n\nexport type ReorderMode = 'view' | 'reorder'\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedNestedViewItem<TItem> & { validationState: ListEditorValidationState }\n raw: TItem\n index: number\n key: ListEditorKey\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n firstInParent: boolean\n lastInParent: boolean\n readonly: boolean\n disabled: boolean\n expanded: boolean\n childrenExpanded: boolean\n editing: boolean\n dirty: boolean\n unsaved: boolean\n moved: boolean\n reorderMode: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n canIndent: boolean\n canOutdent: boolean\n canAddChild: boolean\n touch: boolean\n actions: RowActions<TItem>\n}\nexport interface ToolbarSlotProps {\n applying: boolean\n hasPendingChanges: boolean\n movedCount: number\n error: string | null\n actions: { apply: () => Promise<void>; cancel: () => void }\n}\nexport interface ReorderToggleSlotProps {\n mode: ReorderMode\n disabled: boolean\n hasPendingChanges: boolean\n actions: { enterReorderMode: () => void; exitReorderMode: () => void }\n}\nexport interface HeaderSlotProps extends ReorderToggleSlotProps {\n title: string | null\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n maxDepth: number\n\n /**\n * New-row factory; if set, add/add-after/add-inside insert through the\n * controller (no `@add` handler needed). Optional for read-only trees.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`. Never point at the position field.\n * Typed `string` (not `keyof TItem`): a bare keyof compiles to a Boolean-only\n * runtime type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. Typed\n * `[String, Boolean, Object]` with `string` before `false`: a bare keyof\n * compiles Boolean-only, and `false`-first would coerce `position=\"position\"`\n * (value == prop name) to `true`. Object form folds in `{ field, multiplier }`.\n */\n position?: string | false | { field: string; multiplier?: number }\n /** Parent-key field written onto reparented rows. Default `'parent'`. */\n parentField?: string\n /**\n * Extra fields dropped from the dirty content-hash (position + parent always\n * dropped), e.g. a child collection tracked by a separate editor.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Opt-in lifted controller (`useNestedListEditorController()`) so state\n * survives unmount/remount; omitted = internal controller. Same handle\n * reachable via `useTemplateRef`.\n */\n editor?: NestedListEditorHandle<TItem>\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n title?: string | null\n\n compactField?: string | null\n statusField?: string | null\n\n showAddButton?: boolean\n showAddChildButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n showMoveToPosition?: boolean\n showChangeParent?: boolean\n showExpandToggle?: boolean\n\n addLabel?: string | null\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n loadingKeys?: Set<ListEditorKey> | null\n\n showReorderToggle?: boolean\n disableReorder?: boolean\n disableDrag?: boolean\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n onReorderApply?: (tree: NestedTree<TItem>) => Promise<void> | void\n\n /** Registers this editor as a named unsaved-changes section under the given (translated) label. */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n unsavedSectionLabel: undefined,\n factory: undefined,\n getKey: undefined,\n position: undefined,\n parentField: 'parent',\n dirtyExclude: undefined,\n validate: undefined,\n editor: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n showAddButton: true,\n showAddChildButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n showMoveToPosition: false,\n showChangeParent: false,\n showExpandToggle: true,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n closeVariant: 'auto',\n loadingKeys: null,\n showReorderToggle: true,\n disableReorder: false,\n disableDrag: false,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n onReorderApply: undefined,\n})\n\nconst emit = defineEmits<{\n add: [hint: NestedPositionHint | undefined]\n 'add-child': [parent: NestedViewItem<TItem>]\n edit: [item: NestedViewItem<TItem>]\n deleted: [item: NestedViewItem<TItem>]\n close: [item: NestedViewItem<TItem>]\n 'item-saved': [item: NestedViewItem<TItem>]\n 'item-expand': [item: NestedViewItem<TItem>, expanded: boolean]\n 'reorder-start': []\n 'reorder-cancel': []\n 'reorder-applied': [tree: NestedTree<TItem>]\n 'reorder-apply-error': [error: unknown]\n 'reorder-end': []\n indent: [item: NestedViewItem<TItem>]\n outdent: [item: NestedViewItem<TItem>]\n}>()\n\nconst modelValue = defineModel<NestedTree<TItem>>({ required: true })\nconst mode = defineModel<ReorderMode>('mode', { default: 'view' })\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n 'reorder-toggle'?: (props: ReorderToggleSlotProps) => unknown\n 'reorder-toolbar'?: (props: ToolbarSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst { showWarningT } = useAlerts()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(rootEl)\n\nconst isTouch = useIsTouchDevice()\n\nconst effectiveCloseVariant = computed<'icon' | 'labeled'>(() => {\n if (props.closeVariant === 'icon') return 'icon'\n if (props.closeVariant === 'labeled') return 'labeled'\n return isNarrow.value ? 'icon' : 'labeled'\n})\n\nconst childrenExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n// Readonly detail body visibility — independent of subtree expansion.\nconst detailExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n\n// Local mirror of the controller's key resolution so walkers + the template key\n// rows the same way the controller tracks them. Construction-time config, read once.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst getKeyOpt = props.getKey ?? 'id'\nconst keyFieldName = (typeof getKeyOpt === 'function' ? 'id' : getKeyOpt) as string\nconst keyOf = (data: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function'\n ? getKeyOpt(data)\n : (data[getKeyOpt as keyof TItem] as ListEditorKey)\n\n// Managed position field (row position, move-to-position dialog, flatViewItems). Mirrors the controller.\nconst positionFieldName = ((): string => {\n const p = props.position\n if (p === undefined || p === false) return 'position'\n if (typeof p === 'object') return p.field\n return p\n})()\n\nconst initChildrenExpanded = (tree: NestedTree<TItem>) => {\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n childrenExpandedKeys.value.add(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(tree.children)\n}\n// eslint-disable-next-line vue/no-ref-object-reactivity-loss\ninitChildrenExpanded(modelValue.value)\n\n// State controller (v2). Default: this editor owns it; opt-in `:editor` lift lets\n// state survive unmount/remount. Undefined getKey/position/validate fall back to\n// controller defaults ('id' / 'position' / always-valid). Its `viewItems` ignores\n// expand state, so we re-project an expand-aware list below (flatViewItems).\nconst controller =\n props.editor ??\n useNestedListEditorController<TItem>({\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n parentField: props.parentField,\n maxDepth: props.maxDepth,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// FULL flattened list (collapsed-branch rows included) built directly off the\n// tree: the recursive renderer (LeNestedRow) filters by parentKey + childrenExpandedKeys,\n// so it needs every row present in viewItemsDecorated even when hidden.\nconst flatViewItems = computed<NestedViewItem<TItem>[]>(() => {\n const flat: NestedViewItem<TItem>[] = []\n let flatIndex = 0\n const maxDepth = props.maxDepth\n const walk = (\n nodes: NestedTreeNode<TItem>[],\n depth: number,\n parentNode: NestedTreeNode<TItem> | null,\n ) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n const key = keyOf(node.data)\n const childrenAllowed = node.children !== undefined\n const hasChildren = childrenAllowed && (node.children?.length ?? 0) > 0\n const childrenCount = node.children?.length ?? 0\n const remainingDepth = maxDepth - (depth + 1)\n flat.push({\n key,\n index: flatIndex++,\n raw: node.data,\n position: node.data[positionFieldName] as number | undefined,\n node,\n depth,\n parent: parentNode?.data ?? null,\n parentKey: parentNode ? keyOf(parentNode.data) : null,\n childrenCount,\n hasChildren,\n childrenAllowed,\n siblingIndex: i,\n siblingCount: nodes.length,\n firstInParent: i === 0,\n lastInParent: i === nodes.length - 1,\n canAddChild: childrenAllowed && remainingDepth > 0,\n canIndent: i > 0,\n canOutdent: depth > 0,\n })\n if (hasChildren) walk(node.children as NestedTreeNode<TItem>[], depth + 1, node)\n }\n }\n walk(modelValue.value.children, 0, null)\n return flat\n})\n\n// Snapshot for reorder-cancel restore only; dirty detection lives in the controller.\n// `movedKeys` is component view state driving the toolbar \"N pending\" counter,\n// cleared on every mode transition by `useReorderMode`.\nconst snapshot = shallowRef<NestedTree<TItem> | null>(null)\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n\n// Re-baseline current tree as saved. Legacy name kept; maps onto `controller.commit()`.\nconst resetDirtyBaseline = () => {\n controller.commit()\n movedKeys.value = new Set()\n}\n// Mark row + every descendant moved — a moved parent visually carries its subtree.\nconst markMoved = (key: ListEditorKey) => {\n const { node } = controller.findNode(key)\n if (!node) {\n movedKeys.value.add(key)\n return\n }\n const collect = (n: NestedTreeNode<TItem>) => {\n movedKeys.value.add(keyOf(n.data))\n if (n.children) n.children.forEach(collect)\n }\n collect(node)\n}\n\nconst decoratorCache = new Map<ListEditorKey, DecoratedNestedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedNestedViewItem<TItem>[]>(() => {\n const next: DecoratedNestedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of flatViewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = detailExpandedKeys.value.has(vi.key)\n const childrenExpanded = childrenExpandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n const moved = movedKeys.value.has(vi.key)\n // Amber = controller dirty OR reorder-session moved. readonly suppresses it\n // (read-only views can't be unsaved; also dodges a mount-before-load baseline). (QA 85050 sweep)\n const dirty = props.readonly ? false : controller.isUnsaved(vi.key)\n const unsaved = props.readonly ? false : dirty || moved\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.depth === vi.depth &&\n cached.parentKey === vi.parentKey &&\n cached.childrenCount === vi.childrenCount &&\n cached.firstInParent === vi.firstInParent &&\n cached.lastInParent === vi.lastInParent &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.childrenExpanded === childrenExpanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.moved === moved &&\n cached.unsaved === unsaved\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedNestedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n childrenExpanded,\n loading,\n dirty,\n moved,\n unsaved,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => modelValue.value.children.length === 0)\nconst totalItemCount = computed(() => flatViewItems.value.length)\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canEnterReorder = computed(\n () => canInteract.value && !props.disableReorder && totalItemCount.value > 1,\n)\n\nconst isInlineEdit = computed(() => !!(slots as Record<string, unknown>).item)\nconst hasReadonlyDetail = computed(() => !!(slots as Record<string, unknown>)['item-readonly'])\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\nconst {\n editingKeys,\n editingSnapshots,\n clearEditing,\n beginEdit,\n cancelEdit,\n commitEdit,\n closeEdit,\n requestAutoOpen,\n} = useInlineEditing<TItem, NestedViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row-wrapper',\n isInlineEdit,\n // markDirty=false: restoring the pre-edit snapshot on cancel must not flag the\n // node dirty (it would otherwise be resent by partial-multi saves).\n restoreSnapshot: (key, data) => controller.updateItem(key, data, false),\n watchKeys: () => {\n const keys: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n keys.push(keyOf(n.data))\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return keys\n },\n findEntry: (key) => {\n const { node } = controller.findNode(key)\n return node ? { data: node.data } : null\n },\n afterAutoOpen: (key) => {\n const { parent } = controller.findNode(key)\n if (parent) {\n childrenExpandedKeys.value.add(keyOf(parent.data))\n }\n },\n})\n\nconst {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n} = useReorderMode<NestedTree<TItem>>({\n mode,\n snapshot,\n movedKeys,\n modelValue,\n cloneModel: (m) => cloneDeep(m) as NestedTree<TItem>,\n applyModel: (m) => {\n modelValue.value = m\n },\n canEnterReorder,\n onEnter: () => {\n clearEditing()\n // Expand every branch so all rows are reachable drag targets.\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n nextTick(() => {\n if (dragEnabled.value) initSortables()\n })\n },\n onExternalEnter: () => {\n clearEditing()\n },\n onCancel: () => {\n destroySortables()\n },\n onApplyEnd: () => {\n destroySortables()\n },\n onReorderApply: (tree) => props.onReorderApply?.(tree),\n emit: {\n reorderStart: () => emit('reorder-start'),\n reorderCancel: () => emit('reorder-cancel'),\n reorderApplied: (payload) => emit('reorder-applied', payload),\n reorderApplyError: (err) => emit('reorder-apply-error', err),\n reorderEnd: () => emit('reorder-end'),\n },\n})\n\nconst canAdd = computed(() => canInteract.value && props.showAddButton && !reorderMode.value)\nconst dragEnabled = computed(() => reorderMode.value && !isTouch.value && !props.disableDrag)\n\nconst addLabelResolved = computed(() =>\n props.addLabel ? t(props.addLabel) : t('common.sortable.add'),\n)\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(\n () => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'),\n)\nconst deleteConfirmTextResolved = computed(\n () => props.deleteConfirmText ?? t('common.sortable.deleteConfirmText'),\n)\n\nconst reorderToggleVisible = computed<boolean>(\n (): boolean =>\n !props.readonly && props.showReorderToggle && !reorderMode.value && totalItemCount.value > 0,\n)\n\nconst compactReorderButton = computed<boolean>((): boolean => !!props.title && isNarrow.value)\n\n// Keys of every node that has children — the expand/collapse candidates.\nconst expandableKeys = computed<ListEditorKey[]>(() => {\n const out: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n out.push(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(modelValue.value.children)\n return out\n})\n\nconst allExpanded = computed<boolean>(\n () =>\n expandableKeys.value.length > 0 &&\n expandableKeys.value.every((k) => childrenExpandedKeys.value.has(k)),\n)\n\nconst expandAllVisible = computed<boolean>(\n () => !reorderMode.value && expandableKeys.value.length > 0,\n)\n\nconst toggleExpandAll = () => {\n if (allExpanded.value) {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.delete(k)\n } else {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n }\n}\n\nconst headerVisible = computed<boolean>(\n (): boolean =>\n !!(\n props.title ||\n (slots as Record<string, unknown>).header ||\n (slots as Record<string, unknown>)['reorder-toggle'] ||\n reorderToggleVisible.value ||\n expandAllVisible.value ||\n reorderMode.value\n ),\n)\n\n// One Sortable instance per group so drag/drop moves items within/between groups;\n// SortableJS owns the pointer events, onEnd reconciles via editor.moveTo().\nconst sortableInstances = ref<\n Array<{ stop: () => void; option?: (k: string, v: unknown) => void }>\n>([])\nconst forceRerender = ref(0)\n\nconst destroySortables = () => {\n for (const s of sortableInstances.value) {\n try {\n s.stop()\n } catch {\n // no-op\n }\n }\n sortableInstances.value = []\n}\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\n// Live drag state. `instruction` is recomputed on every pointermove and encodes\n// where + at what depth the dragged item lands (sibling-above/below/make-child/blocked);\n// the overlay reads it, onEnd applies it via `editor.moveTo`. SortableJS never moves\n// the DOM (onMove always returns false) — hit-testing, depth and the mutation are all ours.\nconst dragState = ref<DragState | null>(null)\n\n// Drop indicator anchor geometry, kept in sync with CSS (reorder-mode header\n// padding-left = 12 + depth*24, drag handle = 20px). ANCHOR_X = 12 + half handle\n// (10) = 22 puts the dot on the handle's centre; the line steps 24px per depth.\nconst INDENT_PX = 24\nconst ANCHOR_X = 22\n\nconst hitTestRow = (\n clientX: number,\n clientY: number,\n): { el: HTMLElement; viewItem: DecoratedNestedViewItem<TItem> } | null => {\n const hit = document.elementFromPoint(clientX, clientY) as HTMLElement | null\n if (!hit) return null\n const wrapper = hit.closest('.a-le-row-wrapper') as HTMLElement | null\n if (!wrapper) return null\n // Only wrappers inside our rowsContainer — elementFromPoint could hit a\n // different ANestedSortableListEditor instance on the same page.\n if (!rowsContainer.value || !rowsContainer.value.contains(wrapper)) return null\n const key = parseKey(wrapper.getAttribute('data-id'))\n if (key === null) return null\n const vi = viewItemsDecorated.value.find((v) => v.key === key)\n if (!vi) return null\n return { el: wrapper, viewItem: vi }\n}\n\nconst recomputeInstruction = (clientX: number, clientY: number) => {\n if (!dragState.value || !rowsContainer.value) return\n const hit = hitTestRow(clientX, clientY)\n if (!hit) {\n dragState.value.instruction = null\n return\n }\n const containerRect = rowsContainer.value.getBoundingClientRect()\n // Hit-test the `.a-le-row` child, not the wrapper — the wrapper's height\n // balloons when children are rendered.\n const rowEl = hit.el.querySelector(':scope > .a-le-row') as HTMLElement | null\n const rowRect = (rowEl ?? hit.el).getBoundingClientRect()\n dragState.value.instruction = computeInstruction({\n pointer: { x: clientX, y: clientY },\n hoveredRow: {\n key: hit.viewItem.key,\n rect: rowRect,\n depth: hit.viewItem.depth,\n parentKey: hit.viewItem.parentKey,\n siblingIndex: hit.viewItem.siblingIndex,\n siblingCount: hit.viewItem.siblingCount,\n },\n sourceKey: dragState.value.sourceKey,\n sourceSubtreeDepth: dragState.value.sourceSubtreeDepth,\n viewItems: viewItemsDecorated.value,\n maxDepth: props.maxDepth,\n indentPx: INDENT_PX,\n containerLeft: containerRect.left,\n containerPaddingLeft: ANCHOR_X,\n })\n}\n\nconst onPointerMove = (e: PointerEvent) => {\n recomputeInstruction(e.clientX, e.clientY)\n}\n\nconst applyInstruction = (inst: ExecutableInstruction, sourceKey: ListEditorKey) => {\n const ok = controller.moveTo(sourceKey, inst.parentKey, inst.index)\n if (!ok) {\n showWarningT('common.sortable.error.maxDeepExceed')\n forceRerender.value++\n nextTick(() => initSortables())\n return\n }\n markMoved(sourceKey)\n // makeChild: expand the new parent so the just-moved row doesn't vanish into a collapsed branch.\n if (inst.makeChild && inst.parentKey !== null) {\n childrenExpandedKeys.value.add(inst.parentKey)\n }\n}\n\nconst initSortables = () => {\n destroySortables()\n if (!dragEnabled.value) return\n if (!rowsContainer.value) return\n const groups = Array.from(rowsContainer.value.querySelectorAll<HTMLElement>('.' + GROUP_CLASS))\n for (const group of groups) {\n const sortable = useSortable(group, [], {\n group: { name: 'a-nested', pull: true, put: true },\n handle: '.' + HANDLE_CLASS,\n animation: 0,\n ghostClass: DRAG_GHOST_CLASS,\n chosenClass: DRAG_CHOSEN_CLASS,\n dragClass: DRAG_CLASS,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 3,\n onStart: (event) => {\n const draggedEl = event.item as HTMLElement\n const id = parseKey(draggedEl.getAttribute('data-id'))\n if (id === null) return\n const draggedNode = controller.findNode(id).node\n const subtreeDepth = draggedNode ? controller.calculateSubtreeDepth(draggedNode) : 1\n dragState.value = {\n sourceKey: id,\n sourceSubtreeDepth: subtreeDepth,\n instruction: null,\n }\n document.addEventListener('pointermove', onPointerMove, { passive: true })\n },\n onMove: (event) => {\n // Also track the pointer via SortableJS's stream — keeps `instruction`\n // in sync when the browser coalesces pointermove events during fast drags.\n const orig = (event as unknown as { originalEvent?: Event }).originalEvent\n if (orig) {\n if ('clientX' in orig && 'clientY' in orig) {\n recomputeInstruction((orig as MouseEvent).clientX, (orig as MouseEvent).clientY)\n } else if ('touches' in orig) {\n const tev = orig as TouchEvent\n if (tev.touches.length > 0) {\n recomputeInstruction(tev.touches[0].clientX, tev.touches[0].clientY)\n }\n }\n }\n // Refuse SortableJS's own DOM insertion — onEnd's `editor.moveTo` drives the move.\n return false\n },\n onEnd: () => {\n document.removeEventListener('pointermove', onPointerMove)\n const state = dragState.value\n dragState.value = null\n if (!state) return\n const inst = state.instruction\n if (inst === null) return\n if (inst.type === 'blocked') return\n applyInstruction(inst, state.sourceKey)\n },\n })\n sortableInstances.value.push(sortable)\n }\n}\n\nconst parseKey = (raw: string | null): ListEditorKey | null => {\n if (raw === null || raw === '') return null\n // Numeric key only when `data-id` is a pure integer string (incl. negative temp\n // ids like \"-1\"); else a DocId/UUID. The old `n > 0` test sent negative temp ids\n // to the string branch, so a freshly-added row's move marked the wrong key.\n const n = stringToInt(raw)\n return String(n) === raw ? n : raw\n}\n\nwatch(\n () => dragEnabled.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n else destroySortables()\n },\n)\n\nwatch(\n () => forceRerender.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n },\n)\n\n// Rebuild sortables when the tree shape changes during drag mode, else newly rendered groups aren't draggable.\nwatch(\n () => viewItemsDecorated.value.map((v) => v.key).join('|'),\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n },\n)\n\nonMounted(() => {\n if (dragEnabled.value) initSortables()\n})\nonBeforeUnmount(() => {\n destroySortables()\n document.removeEventListener('pointermove', onPointerMove)\n})\n\n// Overlay visual props from the current instruction; `null` = hidden (no\n// instruction, or blocked). The optional connector is a rail from the drop line\n// up to the row whose level dictates the insert. Measured via getBoundingClientRect\n// rather than CSS anchor positioning: Chrome's anchor-reachability rule excludes\n// some deeply-nested descendants, so JS measurement is simpler and more reliable.\ntype OverlayVisual = {\n line: { top: number; left: number; right: number }\n connector: { top: number; height: number; left: number } | null\n}\n\nconst overlayVisual = computed<OverlayVisual | null>(() => {\n const state = dragState.value\n if (!state || state.instruction === null || !rowsContainer.value) return null\n const inst = state.instruction\n // Blocked drops render nothing — the silent empty space is the \"not here\" signal.\n if (inst.type === 'blocked') return null\n const refWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.refKey))}\"]`,\n )\n if (!refWrapper) return null\n const rowEl = refWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const containerRect = rowsContainer.value.getBoundingClientRect()\n const rowRect = (rowEl ?? refWrapper).getBoundingClientRect()\n\n const lineLeft = ANCHOR_X + inst.depth * INDENT_PX\n const lineTop =\n inst.refEdge === 'top' ? rowRect.top - containerRect.top : rowRect.bottom - containerRect.top\n const line = { top: lineTop, left: lineLeft, right: 16 }\n\n let connector: OverlayVisual['connector'] = null\n if (inst.levelRowKey !== null) {\n const levelWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.levelRowKey))}\"]`,\n )\n if (levelWrapper) {\n const levelRow = levelWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const levelRect = (levelRow ?? levelWrapper).getBoundingClientRect()\n const levelCentreY = levelRect.top - containerRect.top + levelRect.height / 2\n if (levelCentreY < lineTop) {\n connector = {\n top: levelCentreY,\n height: lineTop - levelCentreY,\n left: lineLeft,\n }\n }\n }\n }\n\n return { line, connector }\n})\n\n// With a `factory`, the editor inserts through the controller; without one it\n// stays emit-only so legacy `@add` consumers drive the insert. The `add` event\n// fires either way.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n if (props.factory) controller.addItem()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n if (props.factory) controller.addAfter(vi.key, undefined, vi.childrenAllowed)\n emit('add', { afterId: vi.key, childrenAllowed: vi.childrenAllowed })\n}\n\nconst onAddChildClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n if (!vi.canAddChild) return\n requestAutoOpen()\n childrenExpandedKeys.value.add(vi.key)\n emit('add-child', vi)\n // Append to the end of children, matching the root \"Add item\" semantic.\n // (Drag-drop make-child still lands at index 0 — its drop line sits just below the parent.)\n if (props.factory) controller.addChild(vi.key, undefined, true)\n emit('add', { parentId: vi.key, childrenAllowed: true })\n}\n\nconst onEditClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value || reorderMode.value) return\n // Clicking edit while already editing closes the form, so the pencil toggles like the row header.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n }\n emit('edit', vi)\n}\n\n// Toggles tree children visibility (distinct from the readonly-detail body below).\nconst onChevronClick = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = childrenExpandedKeys.value.has(key)\n if (currently) childrenExpandedKeys.value.delete(key)\n else childrenExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\n// Toggles the row's readonly-detail body (separate from tree children).\nconst onDetailToggle = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = detailExpandedKeys.value.has(key)\n if (currently) detailExpandedKeys.value.delete(key)\n else detailExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\nconst isRowClickable = (vi: DecoratedNestedViewItem<TItem>): boolean => {\n if (props.disableRowClick) return false\n if (props.disabled || props.loading) return false\n if (reorderMode.value) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) onDetailToggle(vi)\n else onEditClick(vi)\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, NestedViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n detailExpandedKeys.value.delete(vi.key)\n childrenExpandedKeys.value.delete(vi.key)\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm,\n})\n\nconst onDeleteClick = async (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\nconst onSaveClick = async (vi: NestedViewItem<TItem>) => {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: NestedViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: NestedViewItem<TItem>) => {\n closeEdit(vi)\n emit('close', vi)\n}\n\nconst moveUp = (id: ListEditorKey) => {\n if (controller.moveUp(id)) markMoved(id)\n}\nconst moveDown = (id: ListEditorKey) => {\n if (controller.moveDown(id)) markMoved(id)\n}\nconst moveTop = (id: ListEditorKey) => {\n if (controller.moveTop(id)) markMoved(id)\n}\nconst moveBottom = (id: ListEditorKey) => {\n if (controller.moveBottom(id)) markMoved(id)\n}\nconst doIndent = (vi: NestedViewItem<TItem>) => {\n if (!controller.indent(vi.key)) {\n showWarningT('common.sortable.error.maxDeepExceed')\n return\n }\n markMoved(vi.key)\n emit('indent', vi)\n}\nconst doOutdent = (vi: NestedViewItem<TItem>) => {\n if (!controller.outdent(vi.key)) return\n markMoved(vi.key)\n emit('outdent', vi)\n}\n\nconst resolveCompactText = (raw: TItem): string =>\n resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Row validation from the controller's gated `rowState` — red rail shows only\n// once the row is unsaved or `validateAll()` ran.\nconst resolveValidation = (raw: TItem, key?: ListEditorKey): ListEditorValidationState =>\n key === undefined ? null : controller.rowState(raw, key)\n\n// Per-key actions cache for stable per-row identity (see AListEditor). Closures\n// capture the stable key and look up the current vi via findVi at call time.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n if (vi) return onSaveClick(vi)\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n addChild: () => {\n const vi = findVi(key)\n if (vi) onAddChildClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n toggleDetail: () => {\n const vi = findVi(key)\n if (vi) onDetailToggle(vi)\n },\n moveUp: () => moveUp(key),\n moveDown: () => moveDown(key),\n moveTop: () => moveTop(key),\n moveBottom: () => moveBottom(key),\n indent: () => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n outdent: () => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n update: (data: TItem) => controller.updateItem(key, data),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n },\n)\n\nconst buildSlotProps = (vi: DecoratedNestedViewItem<TItem>) => ({\n item: { ...vi, validationState: resolveValidation(vi.raw as TItem, vi.key) },\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n depth: vi.depth,\n parent: vi.parent,\n parentKey: vi.parentKey,\n childrenCount: vi.childrenCount,\n hasChildren: vi.hasChildren,\n childrenAllowed: vi.childrenAllowed,\n firstInParent: vi.firstInParent,\n lastInParent: vi.lastInParent,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n childrenExpanded: vi.childrenExpanded,\n editing: vi.editing,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n moved: vi.moved,\n reorderMode: reorderMode.value,\n canMoveUp: !vi.firstInParent,\n canMoveDown: !vi.lastInParent,\n canIndent: vi.canIndent,\n canOutdent: vi.canOutdent,\n canAddChild: vi.canAddChild,\n touch: isTouch.value,\n actions: getActions(vi.key),\n})\n\nconst toolbarSlotProps = computed(() => ({\n applying: applying.value,\n hasPendingChanges: hasPendingChanges.value,\n movedCount: movedCount.value,\n error: applyError.value,\n actions: {\n apply: applyReorder,\n cancel: cancelReorderMode,\n },\n}))\n\nconst reorderToggleSlotProps = computed(() => ({\n mode: mode.value,\n disabled: !canEnterReorder.value,\n hasPendingChanges: hasPendingChanges.value,\n actions: {\n enterReorderMode,\n exitReorderMode: cancelReorderMode,\n },\n}))\n\nconst expandableKeySet = computed(() => new Set(expandableKeys.value))\n\nconst findVi = (key: ListEditorKey): DecoratedNestedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() =>\n viewItemsDecorated.value.map((vi) => ({\n key: vi.key,\n expanded: vi.childrenExpanded,\n canExpand: expandableKeySet.value.has(vi.key),\n canIndent: true,\n canOutdent: true,\n })),\n ),\n variant: 'nested',\n isReorderMode: reorderMode,\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n onMoveUp: (key) => moveUp(key),\n onMoveDown: (key) => moveDown(key),\n onMoveTop: (key) => moveTop(key),\n onMoveBottom: (key) => moveBottom(key),\n onIndent: (key) => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n onOutdent: (key) => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n onToggleChildren: (key) => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n onCancelReorder: () => cancelReorderMode(),\n})\n\nconst moveToPositionDialogOpen = ref<boolean>(false)\nconst moveToPositionTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst moveToPositionContext = computed<{\n parentId: ListEditorKey | null\n total: number\n currentIndex: number\n} | null>(() => {\n const target = moveToPositionTarget.value\n if (!target) return null\n const found = controller.findNode(target.key)\n const siblings = found.parent?.children ?? modelValue.value.children\n const idx = siblings.findIndex((s) => keyOf(s.data) === target.key)\n return {\n parentId: found.parent ? keyOf(found.parent.data) : null,\n total: siblings.length,\n currentIndex: idx,\n }\n})\nconst moveToPositionLabel = computed<string>(() =>\n moveToPositionTarget.value ? resolveCompactText(moveToPositionTarget.value.raw) : '',\n)\nconst openMoveToPosition = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showMoveToPosition) return\n moveToPositionTarget.value = vi\n moveToPositionDialogOpen.value = true\n}\nconst onMoveToPositionConfirm = (newIndex: number) => {\n const ctx = moveToPositionContext.value\n const target = moveToPositionTarget.value\n moveToPositionTarget.value = null\n if (!ctx || !target) return\n if (newIndex === ctx.currentIndex) return\n if (controller.moveTo(target.key, ctx.parentId, newIndex)) {\n markMoved(target.key)\n }\n}\n\nconst changeParentDialogOpen = ref<boolean>(false)\nconst changeParentTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst openChangeParent = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showChangeParent) return\n changeParentTarget.value = vi\n changeParentDialogOpen.value = true\n}\nconst onChangeParentConfirm = (parentId: ListEditorKey | null, position: 'first' | 'last') => {\n const target = changeParentTarget.value\n changeParentTarget.value = null\n if (!target) return\n // Sibling count under the new parent so 'last' resolves to the right index ('first' = 0).\n let siblingCount = 0\n if (parentId === null) {\n siblingCount = modelValue.value.children.length\n } else {\n const found = controller.findNode(parentId)\n siblingCount = found.node?.children?.length ?? 0\n }\n const targetIndex = position === 'first' ? 0 : siblingCount\n if (controller.moveTo(target.key, parentId, targetIndex)) {\n markMoved(target.key)\n if (parentId !== null) childrenExpandedKeys.value.add(parentId)\n }\n}\n\n// Aggregated display flags + helpers passed into each <LeNestedRow>.\nconst rowContext = computed(() => ({\n reorderMode: reorderMode.value,\n readonly: props.readonly,\n canInteract: canInteract.value,\n dragEnabled: dragEnabled.value,\n showExpandToggle: props.showExpandToggle,\n showEditButton: props.showEditButton,\n showDeleteButton: props.showDeleteButton,\n showAddChildButton: props.showAddChildButton,\n showAddAfterAction: props.showAddAfterAction,\n showMoveToPosition: props.showMoveToPosition,\n showChangeParent: props.showChangeParent,\n showInlineSaveFooter: showInlineSaveFooter.value,\n statusField: props.statusField,\n effectiveCloseVariant: effectiveCloseVariant.value,\n keyboardNav,\n isRowClickable,\n resolveCompactText,\n resolveValidation: (raw: TItem, key?: ListEditorKey) => resolveValidation(raw, key),\n buildSlotProps,\n}))\n\n// Event callback bundle passed to each row.\nconst rowCallbacks = {\n onRowClick,\n onChevronClick,\n onEditClick,\n onDeleteClick,\n onCloseClick,\n onSaveClick,\n onCancelClick,\n onAddAfterClick: onRowAddAfterClick,\n onAddChildClick,\n moveUp: (id: ListEditorKey) => moveUp(id),\n moveDown: (id: ListEditorKey) => moveDown(id),\n moveTop: (id: ListEditorKey) => moveTop(id),\n moveBottom: (id: ListEditorKey) => moveBottom(id),\n indent: doIndent,\n outdent: doOutdent,\n openMoveToPosition,\n openChangeParent,\n}\n\nconst rootViewItems = computed(() => viewItemsDecorated.value.filter((v) => v.parentKey === null))\n\n// Imperative aliases mirroring the legacy ASortableNested signatures so existing\n// consumers keep working. They assume the caller persists server-side, so they\n// re-baseline via `controller.commit()` (rows don't render \"unsaved\" after the\n// call) and return the live model. New consumers should use the controller handle directly.\n\n/** @deprecated Use `addItem(data, { afterId, childrenAllowed })` on the handle. */\nconst addAfterId = (targetId: ListEditorKey | null, data: TItem, childrenAllowed: boolean) => {\n controller.addItem(data, { afterId: targetId ?? undefined, childrenAllowed })\n nextTick(() => controller.commit())\n return modelValue.value\n}\n/** @deprecated Use `addChild(parentKey, data, childrenAllowed)` on the handle. */\nconst addChildToId = (targetId: ListEditorKey, data: TItem, childrenAllowed: boolean) => {\n childrenExpandedKeys.value.add(targetId)\n // Legacy \"prepend as first child\" semantic (canonical `addChild` appends to the end).\n controller.addItem(data, { parentId: targetId, asFirstChild: true, childrenAllowed })\n nextTick(() => controller.commit())\n return modelValue.value\n}\n/** @deprecated Use `deleteItem(id)` on the handle. */\nconst removeById = (id: ListEditorKey) => {\n controller.deleteItem(id)\n editingKeys.value.delete(id)\n editingSnapshots.value.delete(id)\n detailExpandedKeys.value.delete(id)\n childrenExpandedKeys.value.delete(id)\n nextTick(() => controller.commit())\n}\n/** @deprecated Use `updateItem(id, data)` on the handle. */\nconst updateData = (\n id: ListEditorKey,\n data: TItem,\n _children: unknown = null,\n _position: unknown = null,\n _markUnsaved: unknown = null,\n) => {\n controller.updateItem(id, data)\n nextTick(() => controller.commit())\n}\n\n// Count of unsaved rows (controller dirty ∪ reorder-session moved) — drives the unsaved-section label.\nconst unsavedCount = computed<number>(\n () => viewItemsDecorated.value.filter((v) => v.unsaved).length,\n)\n\n// Re-baseline as saved, clear the moved set, close open edits. Legacy name kept.\nconst clearUnsavedState = () => {\n controller.commit()\n movedKeys.value = new Set()\n clearEditing()\n}\n\n// Registers this editor as a named unsaved-changes section when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel\n ? { label: props.unsavedSectionLabel, dirty: unsavedCount.value > 0 }\n : [],\n)\n\n// Expose the controller handle plus legacy aliases and reorder/expand controls.\n// Entries after the spread override controller methods where the historic name or\n// return shape differs (e.g. `viewItems` is this component's expand-aware list).\ndefineExpose<\n NestedListEditorHandle<TItem> & {\n addAfterId: typeof addAfterId\n addChildToId: typeof addChildToId\n removeById: typeof removeById\n updateData: typeof updateData\n resetDirtyBaseline: () => void\n hasUnsavedChanges: typeof controller.hasUnsaved\n unsavedCount: typeof unsavedCount\n clearUnsavedState: () => void\n enterReorderMode: () => void\n cancelReorderMode: () => void\n applyReorder: () => Promise<void>\n expand: (id: ListEditorKey) => void\n collapse: (id: ListEditorKey) => void\n toggleExpand: (id: ListEditorKey) => void\n expandDetail: (id: ListEditorKey) => void\n collapseDetail: (id: ListEditorKey) => void\n }\n>({\n ...controller,\n // validateAll() opens invalid rows so a blocked save surfaces which are wrong\n // (B4-17 reveal; `...controller` alone only flips the red rail). Nested also\n // expands the offender's ancestor chain so a collapsed row becomes visible.\n validateAll: () =>\n validateAllAndReveal(controller, (key) => {\n let ancestor = controller.findNode(key).parent\n while (ancestor) {\n childrenExpandedKeys.value.add(keyOf(ancestor.data))\n ancestor = controller.findNode(keyOf(ancestor.data)).parent\n }\n const vi = controller.viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n }),\n // Legacy aliases (pre-v2 ASortableNested API).\n addAfterId,\n addChildToId,\n removeById,\n updateData,\n resetDirtyBaseline,\n hasUnsavedChanges: controller.hasUnsaved,\n unsavedCount,\n clearUnsavedState,\n // Expand-aware flattened view (controller's own `viewItems` ignores collapse state).\n viewItems: flatViewItems,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n expand: (id: ListEditorKey) => childrenExpandedKeys.value.add(id),\n collapse: (id: ListEditorKey) => childrenExpandedKeys.value.delete(id),\n toggleExpand: (id: ListEditorKey) => {\n if (childrenExpandedKeys.value.has(id)) childrenExpandedKeys.value.delete(id)\n else childrenExpandedKeys.value.add(id)\n },\n expandDetail: (id: ListEditorKey) => detailExpandedKeys.value.add(id),\n collapseDetail: (id: ListEditorKey) => detailExpandedKeys.value.delete(id),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-nested-list-editor\"\n :class=\"[\n `a-nested-list-editor--mode-${mode}`,\n {\n 'a-nested-list-editor--readonly': readonly,\n 'a-nested-list-editor--disabled': disabled,\n 'a-nested-list-editor--touch': isTouch,\n 'a-nested-list-editor--drag-enabled': dragEnabled,\n },\n ]\"\n >\n <div class=\"a-le-card\">\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n <div class=\"a-le-header-actions\">\n <template v-if=\"reorderMode\">\n <!-- Reorder-mode header: pending count + Cancel/Apply, sitting where\n the \"Reorder\" button lives in view mode (not a bottom toolbar). -->\n <slot\n name=\"reorder-toolbar\"\n v-bind=\"toolbarSlotProps\"\n >\n <LeStatus\n :class=\"{ 'a-le-toolbar-status--pending': hasPendingChanges }\"\n :has-pending-changes=\"hasPendingChanges\"\n :pending-count=\"movedCount\"\n :error=\"applyError\"\n />\n <VBtn\n variant=\"text\"\n size=\"small\"\n :disabled=\"applying\"\n @click=\"cancelReorderMode\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n size=\"small\"\n prepend-icon=\"mdi-check\"\n :loading=\"applying\"\n :disabled=\"applying || !hasPendingChanges\"\n @click=\"applyReorder\"\n >\n {{ t('common.sortable.reorderApply') }}\n </VBtn>\n </slot>\n </template>\n <template v-else>\n <VBtn\n v-if=\"expandAllVisible && compactReorderButton\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n @click=\"toggleExpandAll\"\n >\n <VIcon\n :icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"\n allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\n \"\n />\n </VBtn>\n <VBtn\n v-else-if=\"expandAllVisible\"\n variant=\"tonal\"\n color=\"primary\"\n size=\"small\"\n :prepend-icon=\"\n allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\n \"\n @click=\"toggleExpandAll\"\n >\n {{\n allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\n }}\n </VBtn>\n <slot\n v-if=\"reorderToggleVisible\"\n name=\"reorder-toggle\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <VBtn\n v-if=\"compactReorderButton\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n <VIcon\n icon=\"mdi-sort\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.reorder')\"\n />\n </VBtn>\n <VBtn\n v-else\n variant=\"tonal\"\n color=\"primary\"\n prepend-icon=\"mdi-sort\"\n size=\"small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n {{ t('common.sortable.reorder') }}\n </VBtn>\n </slot>\n </template>\n </div>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <div\n v-else\n :key=\"forceRerender\"\n ref=\"rowsContainer\"\n class=\"a-nested-list-editor__rows\"\n :class=\"{ 'a-nested-list-editor__rows--dragging': dragState !== null }\"\n >\n <div\n :class=\"[GROUP_CLASS, 'a-nested-list-editor__group--root']\"\n data-parent-id=\"\"\n >\n <LeNestedRow\n v-for=\"vi in rootViewItems\"\n :key=\"String(vi.key)\"\n :vi=\"vi\"\n :view-items=\"viewItemsDecorated\"\n :drag-state=\"dragState\"\n :context=\"rowContext\"\n :callbacks=\"rowCallbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n\n <!-- Drop indicator overlay (valid drops only): horizontal line at a row\n edge (depth in `left`) + an optional vertical connector rail to the\n row whose level the insert matches. -->\n <template v-if=\"overlayVisual !== null\">\n <div\n v-if=\"overlayVisual.connector !== null\"\n class=\"a-nested-list-editor__drop-connector\"\n :style=\"{\n left: `${overlayVisual.connector.left}px`,\n top: `${overlayVisual.connector.top}px`,\n height: `${overlayVisual.connector.height}px`,\n }\"\n />\n <div\n class=\"a-nested-list-editor__drop-line\"\n :style=\"{\n top: `${overlayVisual.line.top}px`,\n left: `${overlayVisual.line.left}px`,\n right: `${overlayVisual.line.right}px`,\n }\"\n >\n <span class=\"a-nested-list-editor__drop-line-dot\" />\n </div>\n </template>\n </div>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeMoveToPositionDialog\n v-model=\"moveToPositionDialogOpen\"\n :total=\"moveToPositionContext?.total ?? 0\"\n :current-index=\"moveToPositionContext?.currentIndex ?? 0\"\n :item-label=\"moveToPositionLabel\"\n @confirm=\"onMoveToPositionConfirm\"\n />\n\n <LeChangeParentDialog\n v-model=\"changeParentDialogOpen\"\n :tree=\"modelValue\"\n :source-key=\"changeParentTarget?.key ?? null\"\n :key-field=\"keyFieldName\"\n :max-depth=\"maxDepth\"\n :resolve-label=\"resolveCompactText\"\n :calculate-subtree-depth=\"controller.calculateSubtreeDepth\"\n @confirm=\"onChangeParentConfirm\"\n />\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use './styles/tokens';\n@use './styles/shared';\n\n// Nested-variant rules — depth-aware padding, tree toggle caret, children\n// groups, drop indicator overlay, drag clone.\n.a-nested-list-editor {\n // Depth-aware left padding — caret column + indent per depth level.\n .a-le-row-header {\n padding: var(--le-row-pad-y) 12px var(--le-row-pad-y)\n calc(16px + var(--nested-depth, 0) * var(--le-indent));\n }\n\n // Row wrappers + inter-row group layout.\n &__rows {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n &__group {\n display: flex;\n flex-direction: column;\n }\n\n // Re-apply the `font` shorthand (shared class uses longhand for flat variants)\n // so the nested variant keeps its explicit line-height reset.\n .a-le-toolbar-status {\n font: 500 13px/1 var(--v-font-body, inherit);\n }\n}\n\n.a-le-row-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.a-nested-list-editor {\n // Root rows get a bolder title weight to anchor the hierarchy without header rows.\n .a-le-row:not(.a-le-row--child) .a-le-title {\n font-weight: 600;\n }\n\n // Reorder mode — flat-variant padding offset by the row's indent level.\n .a-le-row--reorder .a-le-row-header {\n padding-left: calc(12px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 8px;\n gap: 8px;\n }\n\n // Active (editing / readonly-expanded) tree-toggle picks up the primary tint\n // so the header reads \"active\" together with the title color.\n .a-le-row--editing &__tree-toggle,\n .a-le-row--expanded &__tree-toggle {\n color: var(--le-primary);\n }\n\n // Children wrapper — depth conveyed by the row's padding-left indent alone.\n &__children {\n position: relative;\n }\n\n // Triangle-caret toggle — circular text-style button (24×24), transparent\n // with a subtle tinted circle on hover.\n &__tree-toggle {\n width: 24px;\n height: 24px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n color: rgb(0 0 0 / 54%);\n z-index: 2;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s;\n\n &:hover {\n background: rgb(0 0 0 / 5%);\n color: var(--le-on-surface);\n }\n\n &:focus-visible {\n outline: none;\n background: rgb(0 0 0 / 8%);\n }\n }\n\n // Reserve caret column width on leaf rows so titles align across siblings.\n &__tree-toggle--spacer,\n &__tree-toggle--empty {\n width: 24px;\n height: 24px;\n background: transparent;\n visibility: hidden;\n pointer-events: none;\n }\n\n // Pure CSS right-pointing triangle; rotates to down when the row is open.\n &__tree-toggle-caret {\n width: 0;\n height: 0;\n border-left: 5px solid currentcolor;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-right: 0;\n transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(1px); // optical centering — triangle leans left\n }\n\n &__tree-toggle--open &__tree-toggle-caret {\n transform: translate(0, 1px) rotate(90deg);\n }\n\n // Dragged subtree (source + descendants) dimmed and non-hittable. `!important`\n // on display beats SortableJS's inline `display: none` under `forceFallback`.\n .a-le-row-wrapper.a-le-row--chosen,\n .a-le-row-wrapper.a-le-row-wrapper--drop-disabled {\n display: flex !important;\n opacity: 0.4 !important;\n pointer-events: none !important;\n }\n\n // Hide SortableJS's placeholder — our overlay is the sole landing indicator.\n .a-le-row--ghost {\n display: none !important;\n }\n\n // No floating clone — the line overlay carries all the \"where it lands\" info.\n // Wrapper selector beats the `.row-wrapper--drop-disabled` rule the clone inherits.\n .a-le-row-wrapper.a-le-row--drag {\n display: none !important;\n }\n\n // Drop indicator line — 2px primary stroke with an 8px left terminal dot,\n // absolute-positioned inside `__rows`.\n &__drop-line {\n position: absolute;\n height: 2px;\n margin-top: -1px;\n background: var(--le-primary);\n pointer-events: none;\n z-index: 4;\n border-radius: 1px;\n }\n\n &__drop-line-dot {\n position: absolute;\n left: -4px;\n top: 50%;\n width: 8px;\n height: 8px;\n background: var(--le-primary);\n border-radius: 50%;\n transform: translateY(-50%);\n }\n\n // Connector rail — vertical line linking the drop line up to the level-match row.\n &__drop-connector {\n position: absolute;\n width: 2px;\n margin-left: -1px;\n background: var(--le-primary);\n opacity: 0.5;\n pointer-events: none;\n z-index: 3;\n }\n\n // While dragging, dim the add-button so focus stays on the drag target.\n &__rows--dragging .a-le-row-add {\n opacity: 0.4;\n }\n\n // \"+N\" children indicator — hidden in the normal DOM, visible only inside the\n // SortableJS drag clone so the user sees the whole branch will follow.\n &__drag-count {\n display: none;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n padding: 2px 8px;\n font: 500 11px/1 var(--v-font-body, inherit);\n letter-spacing: 0.02em;\n color: var(--le-primary);\n background: var(--le-primary-container);\n border-radius: var(--le-radius-pill);\n flex-shrink: 0;\n }\n\n .a-le-row--drag &__drag-count {\n display: inline-flex;\n }\n}\n\n// Desktop — depth-aware padding-left aligns the inline form with the title column:\n// 16 (pad) + 24 (caret) + 10 (gap) = 50, plus depth*indent.\n@container le-shell (min-width: 769px) {\n .a-nested-list-editor {\n .a-le-row--editing .a-le-row-body,\n .a-le-row--expanded .a-le-row-body,\n .a-le-row--editing .a-le-row-footer,\n .a-le-row--expanded .a-le-row-footer {\n padding-left: calc(50px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 16px;\n }\n }\n}\n\n// Narrow / mobile — tighter indent so deep branches fit, taller touch rows,\n// always-visible actions, status badge dropped to make room for the title.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-nested-list-editor {\n --le-indent: 18px;\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu,\n .a-le-row .a-le-action--up,\n .a-le-row .a-le-action--down,\n .a-le-row .a-le-action--add-child {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\n\nexport interface Props {\n title?: string\n body?: string\n stayLabel?: string\n discardLabel?: string\n /**\n * Names of the dirty sections (from the guard's `dirtyLabels`). When\n * non-empty the dialog lists them instead of the generic body message.\n */\n dirtyLabels?: string[]\n}\n\nwithDefaults(defineProps<Props>(), {\n title: undefined,\n body: undefined,\n stayLabel: undefined,\n discardLabel: undefined,\n dirtyLabels: () => [],\n})\n\nconst emit = defineEmits<{\n resolve: [discard: boolean]\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n\nconst { t } = useI18n()\n\nconst onStay = () => {\n emit('resolve', false)\n}\n\nconst onDiscard = () => {\n emit('resolve', true)\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"480\"\n persistent\n >\n <VCard>\n <VCardTitle>\n {{ title ?? t('common.sortable.unsavedChanges.title') }}\n </VCardTitle>\n <VCardText>\n <template v-if=\"body\">\n {{ body }}\n </template>\n <template v-else-if=\"dirtyLabels.length\">\n {{ t('common.sortable.unsavedChanges.sectionsIntro') }}\n <ul class=\"a-unsaved-sections\">\n <li\n v-for=\"(label, i) in dirtyLabels\"\n :key=\"i\"\n >\n {{ label }}\n </li>\n </ul>\n {{ t('common.sortable.unsavedChanges.leaveQuestion') }}\n </template>\n <template v-else>\n {{ t('common.sortable.unsavedChanges.body') }}\n </template>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <VBtn\n variant=\"text\"\n @click=\"onStay\"\n >\n {{ stayLabel ?? t('common.sortable.unsavedChanges.stay') }}\n </VBtn>\n <VBtn\n color=\"warning\"\n variant=\"flat\"\n @click=\"onDiscard\"\n >\n {{ discardLabel ?? t('common.sortable.unsavedChanges.discard') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style scoped lang=\"scss\">\n.a-unsaved-sections {\n margin: 8px 0;\n padding-left: 20px;\n\n li {\n font-weight: 500;\n }\n}\n</style>\n","import {\n computed,\n getCurrentInstance,\n onBeforeUnmount,\n ref,\n watch,\n type ComputedRef,\n type Ref,\n} from 'vue'\nimport { onBeforeRouteLeave } from 'vue-router'\nimport {\n provideUnsavedSectionRegistry,\n type UnsavedSectionDescriptor,\n type UnsavedSectionSource,\n} from '@/labs/unsavedGuard/useUnsavedSection'\n\ntype UnsavedSource = Ref<boolean | Set<unknown> | unknown[] | null | undefined>\n\nexport interface UseUnsavedChangesGuardOptions {\n /**\n * Reactive sources that signal \"unsaved\" state. Each source's truthiness is\n * checked: a Set/array is \"dirty\" when non-empty, a boolean when true, null\n * or undefined as not dirty.\n */\n sources: UnsavedSource[]\n /**\n * Block route navigation via vue-router's onBeforeRouteLeave. Default true.\n * When omitted/false, the route guard is not registered.\n */\n guardRoute?: boolean | Ref<boolean>\n /**\n * Block window/tab unload via beforeunload. Default true.\n */\n guardWindowUnload?: boolean | Ref<boolean>\n /**\n * Optional Vuetify dialog v-model. When provided, attempts to close the\n * dialog while dirty are intercepted: dialog stays open until the user\n * confirms via the confirm dialog or via `acknowledge()`.\n */\n guardDialogModel?: Ref<boolean>\n /**\n * Named sections owned by the guard host component itself. Descendants use\n * `useUnsavedSection` instead — but a component can't `inject` its own\n * `provide`, so when the host *is* the section owner (e.g. a dialog), pass\n * the sections here.\n */\n ownSections?: UnsavedSectionSource\n}\n\nexport interface UseUnsavedChangesGuardApi {\n hasUnsavedChanges: ComputedRef<boolean>\n /**\n * Labels of the dirty sections registered by descendants via\n * `useUnsavedSection`. Bind to `AUnsavedConfirmDialog`'s `dirtyLabels` prop\n * so the dialog names *which* parts are unsaved. Empty when no descendant\n * registered a section (dialog falls back to the generic message).\n */\n dirtyLabels: ComputedRef<string[]>\n /**\n * v-model-bound to the confirm dialog. When the guard wants to ask the user\n * to confirm leaving, it sets this to true. The confirm dialog reads it.\n */\n promptOpen: Ref<boolean>\n /**\n * Resolves the confirm prompt with `discard=true` (proceed) or `false`\n * (stay). Called by the confirm dialog.\n */\n resolvePrompt: (discard: boolean) => void\n /**\n * Manually mark the most recent intent as acknowledged so the next\n * route/dialog/unload attempt proceeds without prompting. Useful right\n * before a programmatic navigation that the consumer has already\n * confirmed.\n */\n acknowledge: () => void\n}\n\nconst isTruthySource = (value: unknown): boolean => {\n if (value === null || value === undefined) return false\n if (typeof value === 'boolean') return value\n if (value instanceof Set) return value.size > 0\n if (Array.isArray(value)) return value.length > 0\n return Boolean(value)\n}\n\nconst resolveBool = (v: boolean | Ref<boolean> | undefined, fallback: boolean): boolean => {\n if (v === undefined) return fallback\n if (typeof v === 'boolean') return v\n return v.value\n}\n\nexport function useUnsavedChangesGuard(\n options: UseUnsavedChangesGuardOptions,\n): UseUnsavedChangesGuardApi {\n // Provide a section registry so descendants can name their dirty sections\n // via `useUnsavedSection`. The dialog reads `dirtyLabels` from this.\n const sectionRegistry = provideUnsavedSectionRegistry()\n\n // The host component can't inject its own provide, so register its own\n // sections directly.\n if (options.ownSections) {\n const ownSections = options.ownSections\n const id = Symbol('unsaved.section.own')\n const normalized = computed<UnsavedSectionDescriptor[]>(() => {\n const resolved = ownSections()\n return Array.isArray(resolved) ? resolved : [resolved]\n })\n sectionRegistry.register(id, normalized)\n }\n\n const hasUnsavedChanges = computed<boolean>(\n () =>\n options.sources.some((s) => isTruthySource(s.value)) ||\n sectionRegistry.dirtyLabels.value.length > 0,\n )\n\n const promptOpen = ref<boolean>(false)\n let pendingResolver: ((discard: boolean) => void) | null = null\n let acknowledgedOnce = false\n\n const askToLeave = (): Promise<boolean> => {\n if (acknowledgedOnce) {\n acknowledgedOnce = false\n return Promise.resolve(true)\n }\n return new Promise((resolve) => {\n pendingResolver = resolve\n promptOpen.value = true\n })\n }\n\n const resolvePrompt = (discard: boolean) => {\n promptOpen.value = false\n if (pendingResolver) {\n pendingResolver(discard)\n pendingResolver = null\n }\n }\n\n const acknowledge = () => {\n acknowledgedOnce = true\n }\n\n // Route guard — `onBeforeRouteLeave` only works inside a route component\n // (it reads the current vm context). Outside a component it's a no-op.\n if (resolveBool(options.guardRoute, true) && getCurrentInstance()) {\n try {\n onBeforeRouteLeave(async () => {\n if (!hasUnsavedChanges.value) return true\n const discard = await askToLeave()\n return discard\n })\n } catch {\n // Not in a route context — skip silently.\n }\n }\n\n // beforeunload — modern browsers strip custom messages but still display a\n // generic confirm. Setting `returnValue` is the canonical way to opt in.\n if (resolveBool(options.guardWindowUnload, true)) {\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n if (!hasUnsavedChanges.value) return\n e.preventDefault()\n e.returnValue = ''\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', onBeforeUnload)\n onBeforeUnmount(() => {\n window.removeEventListener('beforeunload', onBeforeUnload)\n })\n }\n }\n\n // Dialog guard — when the parent dialog tries to close while dirty, intercept\n // and ask the user to confirm. The parent dialog model goes from false→true\n // (open) to true→false (closing); we re-open it while we await the prompt.\n if (options.guardDialogModel) {\n const dialogModel = options.guardDialogModel\n let suppressNext = false\n watch(dialogModel, async (now, prev) => {\n if (suppressNext) {\n suppressNext = false\n return\n }\n if (prev === true && now === false && hasUnsavedChanges.value) {\n // Re-open the dialog while we wait for the user's choice.\n suppressNext = true\n dialogModel.value = true\n const discard = await askToLeave()\n if (discard) {\n suppressNext = true\n dialogModel.value = false\n }\n }\n })\n }\n\n return {\n hasUnsavedChanges,\n dirtyLabels: sectionRegistry.dirtyLabels,\n promptOpen,\n resolvePrompt,\n acknowledge,\n }\n}\n","import { computed, type ComputedRef, type Ref } from 'vue'\nimport type {\n ListEditorKey,\n ListViewItem,\n PositionHint,\n UseListEditorOptions,\n} from '@/labs/listEditor/types/listEditorTypes'\nimport { renumberPositions } from '@/labs/listEditor/utils/positions'\n\nexport interface ListEditorApi<TItem> {\n viewItems: ComputedRef<ListViewItem<TItem>[]>\n addItem: (data: TItem, positionHint?: PositionHint) => TItem[]\n deleteItem: (idOrItem: ListEditorKey | TItem) => TItem[]\n updateItem: (idOrItem: ListEditorKey | TItem, data: TItem) => TItem[]\n moveItem: (fromIndex: number, toIndex: number) => TItem[]\n recalculatePositions: (items: TItem[]) => TItem[]\n}\n\n/**\n * Flat list editor core. Pure data behavior shared by AListEditor and\n * ASortableListEditor. Does not touch the DOM, SortableJS, or emits.\n *\n * The caller passes a writable ref (typically `defineModel<TItem[]>`).\n * Mutators write a new array to `model.value` and also return it.\n * Input items are never mutated — when positions need to change, a new\n * item object is produced with `{ ...item, [positionField]: n }`.\n */\nexport function useListEditor<TItem extends Record<string, any>>(\n model: Ref<TItem[]>,\n options: UseListEditorOptions = {},\n): ListEditorApi<TItem> {\n const keyField = options.keyField ?? 'id'\n const positionField = options.positionField ?? 'position'\n const positionMultiplier = options.positionMultiplier ?? 1\n const updatePositionEnabled = options.updatePosition === true\n\n // Using the position field as the row key while `update-position` is on is\n // self-defeating: every reorder renumbers positions, which changes the keys,\n // so dirty/validity tracking flags the displaced rows as unsaved (QA 85050\n // BUG-09). Point key-field at a stable identity field (e.g. \"id\").\n if (updatePositionEnabled && keyField === positionField) {\n console.warn(\n `[list-editor] key-field === position-field (\"${keyField}\") with update-position enabled. ` +\n 'Reordering renumbers positions and thus changes row keys, breaking dirty/validity ' +\n 'tracking. Point key-field at a stable identity field (e.g. \"id\").',\n )\n }\n\n // Surfaces row-key wiring bugs loudly: rows keyed `undefined` (item lacks the\n // key-field) or two rows sharing one key silently break dirty tracking,\n // validity rails and reorder targeting in ways that are hard to trace from\n // symptoms (QA 85050 BUG-09 class). Deduplicated per signature so a stable\n // bad state warns once, but a new offender warns again.\n const warnedKeySignatures = new Set<string>()\n const warnOnBadKeys = (items: ListViewItem<TItem>[]): void => {\n const seen = new Set<ListEditorKey>()\n const duplicates = new Set<string>()\n let missing = 0\n for (const vi of items) {\n if (vi.key === undefined || vi.key === null) {\n missing++\n continue\n }\n if (seen.has(vi.key)) duplicates.add(String(vi.key))\n seen.add(vi.key)\n }\n if (missing === 0 && duplicates.size === 0) return\n const signature = `${missing}|${[...duplicates].sort().join(',')}`\n if (warnedKeySignatures.has(signature)) return\n warnedKeySignatures.add(signature)\n if (missing > 0) {\n console.warn(\n `[list-editor] ${missing} row(s) resolve to an undefined key (key-field \"${keyField}\"). ` +\n 'Point key-field at a field every item has, or give new items unique temp ids ' +\n '(see nextListEditorTempId).',\n )\n }\n if (duplicates.size > 0) {\n console.warn(\n `[list-editor] duplicate row keys (key-field \"${keyField}\"): ${[...duplicates].join(', ')}. ` +\n 'Row keys must be unique — dirty tracking and validation rails target rows by key.',\n )\n }\n }\n\n const viewItems = computed<ListViewItem<TItem>[]>(() => {\n const items = model.value.map((raw, index) => ({\n key: raw[keyField] as ListEditorKey,\n index,\n raw,\n position: raw[positionField] as number | undefined,\n }))\n warnOnBadKeys(items)\n return items\n })\n\n const recalculatePositions = (items: TItem[]): TItem[] =>\n renumberPositions(items, { positionField, positionMultiplier })\n\n const finalize = (arr: TItem[]): TItem[] => {\n const result = updatePositionEnabled ? recalculatePositions(arr) : arr\n model.value = result\n return result\n }\n\n const isItem = (value: ListEditorKey | TItem): value is TItem =>\n value !== null && typeof value === 'object'\n\n const resolveIndexByKey = (items: TItem[], key: ListEditorKey): number =>\n items.findIndex((x) => x[keyField] === key)\n\n const resolveIndex = (items: TItem[], idOrItem: ListEditorKey | TItem): number => {\n const key = isItem(idOrItem) ? (idOrItem[keyField] as ListEditorKey) : idOrItem\n return resolveIndexByKey(items, key)\n }\n\n const resolveInsertIndex = (items: TItem[], hint?: PositionHint): number => {\n if (!hint) return items.length\n if (hint.afterId !== undefined) {\n const idx = resolveIndexByKey(items, hint.afterId)\n return idx === -1 ? items.length : idx + 1\n }\n if (hint.afterIndex !== undefined) {\n if (hint.afterIndex < 0) return items.length\n return Math.min(hint.afterIndex + 1, items.length)\n }\n if (hint.index !== undefined) {\n return Math.max(0, Math.min(hint.index, items.length))\n }\n return items.length\n }\n\n const addItem = (data: TItem, positionHint?: PositionHint): TItem[] => {\n const arr = [...model.value]\n const insertIndex = resolveInsertIndex(arr, positionHint)\n arr.splice(insertIndex, 0, data)\n return finalize(arr)\n }\n\n const deleteItem = (idOrItem: ListEditorKey | TItem): TItem[] => {\n const idx = resolveIndex(model.value, idOrItem)\n if (idx === -1) return model.value\n const arr = [...model.value]\n arr.splice(idx, 1)\n return finalize(arr)\n }\n\n const updateItem = (idOrItem: ListEditorKey | TItem, data: TItem): TItem[] => {\n const idx = resolveIndex(model.value, idOrItem)\n if (idx === -1) return model.value\n const arr = [...model.value]\n arr[idx] = data\n return finalize(arr)\n }\n\n const moveItem = (fromIndex: number, toIndex: number): TItem[] => {\n const len = model.value.length\n if (fromIndex === toIndex) return model.value\n if (fromIndex < 0 || fromIndex >= len) return model.value\n if (toIndex < 0 || toIndex >= len) return model.value\n const arr = [...model.value]\n const [el] = arr.splice(fromIndex, 1)\n arr.splice(toIndex, 0, el)\n return finalize(arr)\n }\n\n return {\n viewItems,\n addItem,\n deleteItem,\n updateItem,\n moveItem,\n recalculatePositions,\n }\n}\n","import {\n computed,\n getCurrentInstance,\n inject,\n onBeforeUnmount,\n watch,\n type ComputedRef,\n type InjectionKey,\n type Ref,\n} from 'vue'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface ListEditorValidationRegistry {\n register: (\n key: ListEditorKey,\n state: Ref<ListEditorValidationState> | ComputedRef<ListEditorValidationState>,\n ) => void\n unregister: (key: ListEditorKey) => void\n}\n\nexport const ListEditorValidationKey = Symbol(\n 'le.validation',\n) as InjectionKey<ListEditorValidationRegistry>\n\n// Editor-provided set of currently-unsaved row keys (added / modified rows).\n// Consumed by `useListEditorItemValidation` so a row's `invalid` state surfaces\n// as soon as the row is unsaved — vuelidate's own `$anyDirty` is relative to\n// when the sentinel mounted and stays false for a freshly-added still-empty row,\n// which left invalid rows showing amber instead of red. (QA Batch2 BUG-08)\nexport const ListEditorUnsavedKeysKey = Symbol('le.unsavedKeys') as InjectionKey<\n ComputedRef<Set<ListEditorKey>>\n>\n\nexport interface UseListEditorItemValidationOptions {\n /**\n * Stable identity of the row in the editor's v-model. Pass a getter so the\n * composable can re-register if the key ever swaps.\n */\n key: () => ListEditorKey\n /**\n * Reactive validation state. Common shape: a computed reading vuelidate's\n * `v$.$dirty && v$.$invalid` and returning 'invalid' or null.\n *\n * Prefer `invalid` (+ optional `dirty`) below: it lets the editor surface the\n * error once the row is unsaved without relying on mount-relative `$anyDirty`.\n * `state` is kept for callers that report 'valid'/'warning' or custom logic.\n */\n state?:\n | Ref<ListEditorValidationState>\n | ComputedRef<ListEditorValidationState>\n | (() => ListEditorValidationState)\n /**\n * Whether the row's data fails validation right now (e.g. `() => v$.value.$invalid`).\n * When provided, the row is flagged 'invalid' as soon as it is invalid AND the\n * user has had a chance to fix it — i.e. the row is unsaved (added / modified)\n * or `dirty` below is true. Untouched rows on initial load stay clear so a\n * persisted-but-invalid record does not light up red before any interaction.\n */\n invalid?: () => boolean\n /**\n * Optional extra \"has been interacted with\" signal OR-ed with the editor's\n * unsaved tracking (e.g. `() => v$.value.$anyDirty`). Useful when unsaved\n * tracking is disabled on the editor.\n */\n dirty?: () => boolean\n}\n\n// Lets a row's inline form report its own validation state to the surrounding\n// list editor without prop-drilling. The parent editor `provide`s the registry;\n// any descendant in the slot tree can `inject` it via this composable.\n//\n// No-op when called outside an editor (e.g. a form re-used elsewhere) — the\n// inject silently returns null.\nexport function useListEditorItemValidation(options: UseListEditorItemValidationOptions): void {\n const registry = inject(ListEditorValidationKey, null)\n if (!registry) return\n if (!getCurrentInstance()) return\n\n const unsavedKeys = inject(ListEditorUnsavedKeysKey, null)\n\n const stateRef = computed<ListEditorValidationState>(() => {\n if (options.invalid) {\n if (!options.invalid()) return null\n const interacted =\n (options.dirty?.() ?? false) || (unsavedKeys?.value.has(options.key()) ?? false)\n return interacted ? 'invalid' : null\n }\n const s = options.state\n if (s === undefined) return null\n if (typeof s === 'function') return s()\n return s.value\n })\n\n let lastKey: ListEditorKey | null = null\n watch(\n options.key,\n (now) => {\n if (lastKey !== null && lastKey !== now) registry.unregister(lastKey)\n registry.register(now, stateRef)\n lastKey = now\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => {\n if (lastKey !== null) registry.unregister(lastKey)\n })\n}\n","import type { Ref } from 'vue'\nimport { useListEditorItemValidation } from '@/labs/listEditor/composables/useListEditorItemValidation'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\n/**\n * Minimal surface of a vuelidate instance the sentinel reads — any\n * `useVuelidate()` return value is structurally assignable.\n */\nexport interface VuelidateSentinelSource {\n $invalid: boolean\n $anyDirty: boolean\n}\n\n/**\n * Registers a row's vuelidate state with the surrounding list editor so the\n * row shows the red invalid rail (invalid + unsaved/dirty) instead of amber.\n *\n * This is the one blessed shape for row validity sentinels — domain sentinels\n * call their validation composable and delegate here:\n *\n * ```ts\n * const item = computed(() => props.modelValue)\n * const { v$ } = useReviewListItemValidation(item)\n * useListEditorVuelidateSentinel(v$, () => item.value.id ?? item.value.position)\n * ```\n *\n * `key` must return the same key the editor resolves for the row\n * (its `key-field`) or the item's own id/position — the editor's validation\n * registry accepts either.\n */\nexport function useListEditorVuelidateSentinel(\n v$: Ref<VuelidateSentinelSource>,\n key: () => ListEditorKey,\n): void {\n useListEditorItemValidation({\n key,\n invalid: () => v$.value.$invalid,\n dirty: () => v$.value.$anyDirty,\n })\n}\n","import { computed, ref, type ComputedRef, type Ref } from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface UseNestedUnsavedKeysApi {\n /** Set of unsaved keys for one parent row — used as the inner editor's `v-model:unsaved-keys`. */\n getForParent: (parentKey: ListEditorKey) => Set<ListEditorKey>\n /** Push a child editor's unsaved-key set up under `parentKey`. */\n setForParent: (parentKey: ListEditorKey, set: Set<ListEditorKey>) => void\n /**\n * Aggregated set with prefix-merged keys (`${parentKey}:${childKey}`) so two\n * different parents can't collide on a shared child key (typical for newly\n * created rows whose `id` is `0` until the API assigns one).\n */\n merged: ComputedRef<Set<ListEditorKey>>\n /** Total count across all parents — handy for the parent v-model:unsaved-keys. */\n count: ComputedRef<number>\n}\n\n/**\n * Aggregates per-parent child-editor unsaved-keys into one prefix-merged set.\n * Used by stacked editors (e.g. quiz: questions → answers) so the outer\n * editor's parent gets a single merged `Set<ListEditorKey>` to thread into a\n * unsaved-changes guard, without losing per-parent identity.\n *\n * Key collision matters: a brand-new question and a brand-new answer both\n * have `id: 0` from the factory; without the prefix the answers from two\n * different questions would dedupe into one entry and the count would\n * under-report. Prefix `${parentKey}:${childKey}` keeps them distinct.\n *\n * Usage:\n * const childSets = useNestedUnsavedKeys()\n * <ChildEditor\n * :unsaved-keys=\"childSets.getForParent(parent.id)\"\n * @update:unsaved-keys=\"(s) => childSets.setForParent(parent.id, s)\"\n * />\n * // emit `childSets.merged.value` upward\n *\n * IMPORTANT: when the parent editor uses `manage-delete`, clear the removed\n * parent's entry on its `@deleted` — `setForParent(deletedKey, new Set())` —\n * otherwise the deleted row's stale child-unsaved keys keep `merged` non-empty\n * and the unsaved-changes guard lingers after an add-then-delete.\n */\nexport function useNestedUnsavedKeys(): UseNestedUnsavedKeysApi {\n const byParent: Ref<Map<ListEditorKey, Set<ListEditorKey>>> = ref(new Map())\n\n const empty = new Set<ListEditorKey>()\n\n const getForParent = (parentKey: ListEditorKey): Set<ListEditorKey> =>\n byParent.value.get(parentKey) ?? empty\n\n const setForParent = (parentKey: ListEditorKey, set: Set<ListEditorKey>) => {\n if (set.size === 0) {\n byParent.value.delete(parentKey)\n } else {\n byParent.value.set(parentKey, set)\n }\n // Trigger reactivity for `merged` — Map mutations are tracked in Vue 3,\n // but we want a defensive re-emit by reassigning on every call so\n // consumers using shallow equality see a new identity.\n byParent.value = new Map(byParent.value)\n }\n\n const merged = computed<Set<ListEditorKey>>(() => {\n const out = new Set<ListEditorKey>()\n for (const [parentKey, set] of byParent.value.entries()) {\n for (const childKey of set) {\n out.add(`${String(parentKey)}:${String(childKey)}`)\n }\n }\n return out\n })\n\n const count = computed<number>(() => merged.value.size)\n\n return { getForParent, setForParent, merged, count }\n}\n"],"names":["emit","__emit","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","provide","FilterSubmitResetCounterKey","ref","FilterSelectedKey","submitFilter","_createBlock","_component_VForm","__props","_renderSlot","_ctx","props","modelValue","_useModel","pagination","DatatablePaginationKey","t","useI18n","defaultItemsCreatedAt","SortOrder","defaultItemsId","defaultItemsMostRelevant","SORT_BY_SCORE","activeTitle","computed","found","options","item","onItemClick","paginationUpdateDefault","watch","newValue","oldValue","option","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_unref","_createVNode","_component_VBtn","_createTextVNode","_component_VMenu","_component_VList","_Fragment","_renderList","_component_VListItem","$event","_component_VListItemTitle","_normalizeClass","setStoredPage","useDatatablePageStore","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","isNull","disabledNext","computedTotalCountText","onClickFirst","useThrottleFn","onClickLast","onClickPrev","onClickNext","_component_VBtnToggle","_cache","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","generateByIdsApiQuery","ids","isSearchApi","field","querySetLimit","querySetOffset","querySetOrder","queryBuild","queryAddFilter","queryAdd","useApiQueryBuilder","limit","useApiFetchByIds","params","client","system","entity","urlTemplate","urlParams","silentConsoleError","abortController","fetchParams","urlTemplateOverride","urlParamsOverride","resolvedParams","isDefined","template","url","replaceUrlParameters","res","isValidHTTPStatus","AnzuApiResponseCodeError","HTTP_STATUS_NO_CONTENT","AnzuFatalError","err","isAnzuApiResponseCodeError","axiosErrorResponseIsForbidden","AnzuApiForbiddenError","axiosErrorResponseHasValidationData","AnzuApiValidationError","axiosErrorResponseHasDependencyExistsData","AnzuApiDependencyExistsError","axiosErrorResponseHasForbiddenOperationData","AnzuApiForbiddenOperationError","axiosErrorIsTimeout","AnzuApiTimeoutError","axios","AnzuApiAxiosError","useApiFetchListBatch","sortBy","sortDesc","batchSize","forceElastic","searchApi","usePagination","results","generateListQuery","resData","isApiInfiniteResponseList","nextPageData","isApiResponseList","promises","numPages","i","pageCopy","paginationRef","pageResponse","END_POINT","ENTITY","useJobApi","useApiFetchList","id","apiFetchOne","data","type","stringToKebabCase","apiCreateOne","apiDeleteOne","defaultColumn","DatatableColumnsConfigMoreOptionsDefault","createDatatableColumnsConfig","config","columnsHidden","subject","moreOptions","localI18n","i18n","storeKey","isString","isBoolean","columnsAll","obj","DATETIME_AUTO_LABEL_TRACKING","columnsVisible","columns","column","loadStoredColumns","stored","storedData","isObject","isArray","storeColumns","onMounted","useSubjectSelect","datatableConfig","datatableHiddenColumns","executeFetch","filterSortBy","enableActions","filterTouched","items","selected","loading","setSortBy","incrementPage","resetFilter","useFilterHelpers","showErrorsDefault","useAlerts","onOpen","resetState","getListDebounced","sortByChange","onFetchNextPage","e","getList","useDebounceFn","event","eventTarget","parent","firstTd","input","dialogLocal","dialog","paginationComputed","toRaw","mdAndDown","useDisplay","sidebarLeft","closeSidebarOnMobile","SubjectSelectCloseSidebarKey","selectedItemsCount","disabledSubmit","toggleSidebar","onClose","onConfirm","fetchNextPage","onPageChange","hasNextPage","autoloadOnIntersect","isIntersecting","__expose","withModifiers","_component_VDialog","_mergeProps","_component_VCard","ADialogToolbar","_component_VToolbar","_component_VIcon","_component_VTooltip","_hoisted_7","_hoisted_8","_component_ABtnSecondary","_vShow","ADatatablePagination","_hoisted_9","_component_VSpacer","_component_ABtnPrimary","slots","useSlots","display","rootEl","useTemplateRef","isTouch","controller","useListEditorController","v","getKeyOpt","keyOf","keyFieldName","positionFieldName","p","viewItems","raw","index","warnedKeySignatures","warnOnBadKeys","seen","duplicates","missing","vi","signature","expandedKeys","rowsContainer","isInlineEdit","hasReadonlyDetail","editingKeys","editingSnapshots","beginEdit","cancelEdit","commitEdit","closeEdit","requestAutoOpen","useInlineEditing","key","it","hit","addLabelResolved","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","canInteract","canAdd","headerVisible","showInlineSaveFooter","decoratorCache","viewItemsDecorated","next","liveKeys","editing","expanded","unsaved","dirty","validationState","cached","decorated","isEmpty","findVi","keyboardNav","useKeyboardNav","resolveCompactText","resolveCompactTextUtil","onAddClick","onRowAddAfterClick","onEditClick","onCloseClick","onExpandClick","currentlyExpanded","k","isRowClickable","onRowClick","deleteDialog","deleteInFlight","deleteError","triggerDeleteClick","onDeleteDialogConfirm","onDeleteDialogCancel","useDeleteDialog","onDeleteClick","onSaveClick","onCancelClick","actionsCache","getActions","actions","now","buildSlotProps","useUnsavedSection","validateAllAndReveal","_component_VProgressCircular","_component_VAlert","LeEmptyState","LeUnsavedLabel","_hoisted_10","_hoisted_11","_hoisted_12","_withModifiers","$slots","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","LeDeleteDialog","_hoisted_18","DEFAULT_KEY_FIELD","DEFAULT_POSITION_FIELD","DEFAULT_PARENT_FIELD","useNestedListEditor","model","keyField","resolveKey","positionField","parentField","positionMultiplier","maxDepth","getKey","calculateSubtreeDepth","node","max","child","d","findNode","arr","recalculateSiblings","siblings","pos","sibling","recalculateAll","tree","walk","recalculatePositions","cloned","cloneDeep","buildViewItems","flat","flatIndex","nodes","depth","parentNode","childrenAllowed","hasChildren","childrenCount","isExpanded","remainingDepth","canAddChild","canOutdent","canIndent","insertAfter","afterIdx","newNode","resolveInsertIndex","hint","idx","s","addItem","targetSiblings","afterNode","afterParent","insertIdx","deleteItem","updateItem","markDirty","swapSiblings","getTargetIndex","target","removed","moveUp","_s","moveDown","moveTop","moveBottom","indent","prev","subtreeDepth","calculateParentDepth","outdent","grandParent","grandSiblings","parentIdx","currentSiblings","targetParentId","targetIndex","isDescendant","n","c","newParentNode","newParentDepth","targetParent","sourceSiblings","sourceIdx","samelist","insertAt","flatten","out","walkNodes","visit","useNestedListEditorController","positionOpt","managedPosition","dirtyExclude","toValue","normalize","copy","f","baselineHashes","baselineParents","baselineTree","cloneTree","captureBaseline","hashes","parents","parentKey","submitted","registeredValidity","reactive","isItemDirty","saved","baselineTreeRow","baseHash","unsavedKeys","isUnsaved","hasUnsaved","resolveValidity","registered","r","invalidKeys","hasErrors","rowState","invalid","warning","validateAll","buildPayload","row","added","updated","moved","reparented","payload","byKey","baseParent","nowParent","deleted","source","normalized","previous","resolvedKey","nextListEditorTempId","restore","afterKey","targetParentKey","isValid","findByKey","isDescendantOf","ancestorKey","candidateKey","current","findAncestorAtDepth","startKey","targetDepth","isInSourceSubtree","sourceKey","findSiblingNotInSource","startIdx","dir","computeInstruction","args","pointer","hoveredRow","sourceSubtreeDepth","indentPx","containerLeft","containerPaddingLeft","y","h","inTopHalf","refEdge","flatIdx","pointerRelX","rawDepth","depthCeiling","depthFloor","clampedDepth","desired","ancestor","GROUP_CLASS","HANDLE_CLASS","LeNestedRow","LeNestedRowSelf","anchorName","resolveValidation","directChildren","_normalizeStyle","LeDragHandle","_normalizeProps","_guardReactiveProps","_withCtx","slotScope","open","selectedKey","placement","descendantKeys","collect","sub","sourceNode","find","currentParentKey","candidates","disallowed","reason","validCandidates","selectedCandidate","showPlacementPicker","onCandidateClick","onCancel","reasonLabel","_component_VCardTitle","_component_VCardText","_component_VRadioGroup","_component_VRadio","_component_VCardActions","INDENT_PX","ANCHOR_X","mode","showWarningT","isNarrow","useContainerWidth","useIsTouchDevice","effectiveCloseVariant","childrenExpandedKeys","detailExpandedKeys","flatViewItems","snapshot","shallowRef","movedKeys","resetDirtyBaseline","markMoved","childrenExpanded","totalItemCount","canEnterReorder","clearEditing","keys","applying","applyError","hasPendingChanges","movedCount","reorderMode","enterReorderMode","cancelReorderMode","applyReorder","useReorderMode","m","expandableKeys","nextTick","dragEnabled","initSortables","destroySortables","reorderToggleVisible","compactReorderButton","allExpanded","expandAllVisible","toggleExpandAll","sortableInstances","forceRerender","dragState","hitTestRow","clientX","clientY","wrapper","parseKey","recomputeInstruction","containerRect","rowRect","onPointerMove","applyInstruction","inst","groups","group","sortable","useSortable","DRAG_GHOST_CLASS","DRAG_CHOSEN_CLASS","DRAG_CLASS","draggedEl","draggedNode","orig","tev","state","stringToInt","onBeforeUnmount","overlayVisual","refWrapper","rowEl","lineLeft","lineTop","line","connector","levelWrapper","levelRect","levelCentreY","onAddChildClick","onChevronClick","currently","onDetailToggle","doIndent","doOutdent","toolbarSlotProps","reorderToggleSlotProps","expandableKeySet","moveToPositionDialogOpen","moveToPositionTarget","moveToPositionContext","moveToPositionLabel","openMoveToPosition","onMoveToPositionConfirm","newIndex","ctx","changeParentDialogOpen","changeParentTarget","openChangeParent","onChangeParentConfirm","parentId","position","siblingCount","rowContext","rowCallbacks","rootViewItems","addAfterId","targetId","addChildToId","removeById","updateData","_children","_position","_markUnsaved","unsavedCount","clearUnsavedState","LeStatus","LeMoveToPositionDialog","LeChangeParentDialog","onStay","onDiscard","label","isTruthySource","value","resolveBool","fallback","useUnsavedChangesGuard","sectionRegistry","provideUnsavedSectionRegistry","ownSections","resolved","hasUnsavedChanges","promptOpen","pendingResolver","acknowledgedOnce","askToLeave","resolve","resolvePrompt","discard","acknowledge","getCurrentInstance","onBeforeRouteLeave","onBeforeUnload","dialogModel","suppressNext","useListEditor","updatePositionEnabled","renumberPositions","finalize","result","isItem","resolveIndexByKey","x","resolveIndex","idOrItem","positionHint","insertIndex","fromIndex","toIndex","len","el","ListEditorValidationKey","ListEditorUnsavedKeysKey","useListEditorItemValidation","registry","stateRef","lastKey","useListEditorVuelidateSentinel","v$","useNestedUnsavedKeys","byParent","empty","getForParent","setForParent","set","merged","childKey","count"],"mappings":"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"}
|