@anzusystems/common-admin 1.47.0-beta.359 → 1.47.0-beta.360

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/labs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"labs.js","sources":["../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"],"sourcesContent":["<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"],"names":["props","__props","emit","__emit","modelValue","_useModel","pagination","inject","DatatablePaginationKey","isUndefined","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","_createBlock","_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","filterData","filterConfig","sortBy","sortDesc","batchSize","forceElastic","searchApi","usePagination","results","generateListQuery","resData","isApiInfiniteResponseList","nextPageData","isApiResponseList","promises","numPages","i","pageCopy","paginationRef","ref","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","submitFilter","useFilterHelpers","showErrorsDefault","useAlerts","onOpen","resetState","getListDebounced","sortByChange","onFetchNextPage","e","getList","useDebounceFn","event","eventTarget","parent","firstTd","input","dialogLocal","dialog","paginationComputed","toRaw","mdAndDown","useDisplay","sidebarLeft","closeSidebarOnMobile","provide","SubjectSelectCloseSidebarKey","selectedItemsCount","disabledSubmit","toggleSidebar","onClose","onConfirm","fetchNextPage","onPageChange","hasNextPage","autoloadOnIntersect","isIntersecting","__expose","_renderSlot","_ctx","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"],"mappings":"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"}
1
+ {"version":3,"file":"labs.js","sources":["../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/composables/useKeyboardNav.ts","../src/labs/listEditor/composables/useListEditorItemValidation.ts","../src/labs/listEditor/composables/useValidationRegistry.ts","../src/labs/listEditor/composables/useListEditor.ts","../src/labs/listEditor/composables/resolveCompactText.ts","../src/labs/listEditor/composables/useUnsavedKeysSync.ts","../src/labs/listEditor/composables/useDirtyBaseline.ts","../src/labs/listEditor/composables/useDeleteDialog.ts","../src/labs/listEditor/composables/useInlineEditing.ts","../src/labs/listEditor/internal/LeDeleteDialog.vue","../src/labs/listEditor/internal/LeEmptyState.vue","../src/labs/listEditor/internal/LeUnsavedLabel.vue","../src/labs/listEditor/AListEditor.vue","../src/labs/listEditor/composables/useContainerWidth.ts","../src/labs/listEditor/composables/useReorderMode.ts","../src/labs/listEditor/internal/LeMoveToPositionDialog.vue","../src/labs/listEditor/internal/LeStatus.vue","../src/labs/listEditor/internal/LeDragHandle.vue","../src/labs/listEditor/internal/constants.ts","../src/labs/listEditor/ASortableListEditor.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/useNestedUnsavedKeys.ts"],"sourcesContent":["<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","import { computed, ref, watch, type ComputedRef, type Ref } from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface KeyboardNavViewItem {\n key: ListEditorKey\n expanded?: boolean\n canExpand?: boolean\n canIndent?: boolean\n canOutdent?: boolean\n}\n\nexport type KeyboardNavVariant = 'flat' | 'sortable' | 'nested'\n\nexport interface KeyboardNavOptions {\n viewItems: ComputedRef<KeyboardNavViewItem[]>\n variant: KeyboardNavVariant\n isReorderMode: Ref<boolean> | ComputedRef<boolean>\n disabled?: Ref<boolean> | ComputedRef<boolean>\n\n isEditing: (key: ListEditorKey) => boolean\n\n onToggleEdit?: (key: ListEditorKey) => void\n onCancelEdit?: (key: ListEditorKey) => void\n\n onMoveUp?: (key: ListEditorKey) => void\n onMoveDown?: (key: ListEditorKey) => void\n onMoveTop?: (key: ListEditorKey) => void\n onMoveBottom?: (key: ListEditorKey) => void\n\n onIndent?: (key: ListEditorKey) => void\n onOutdent?: (key: ListEditorKey) => void\n onToggleChildren?: (key: ListEditorKey, expand: boolean) => void\n\n onCancelReorder?: () => void\n}\n\nexport interface KeyboardNavApi {\n focusedKey: Ref<ListEditorKey | null>\n grabbedKey: Ref<ListEditorKey | null>\n /** 0-based index of the grabbed row in the current ordering, or -1 if no grab. */\n grabbedIndex: ComputedRef<number>\n /** Total count of rows currently in the editor. */\n totalCount: ComputedRef<number>\n isFocused: (key: ListEditorKey) => boolean\n isGrabbed: (key: ListEditorKey) => boolean\n rowTabindex: (key: ListEditorKey) => number\n setFocus: (key: ListEditorKey | null) => void\n releaseGrab: () => void\n handleKeydown: (key: ListEditorKey, e: KeyboardEvent) => void\n}\n\n// Roving tabindex + keyboard navigation for list-editor rows. Single tabstop\n// per editor; arrow keys move an internal pointer; reorder mode adds a \"grab\"\n// state where Enter/Space picks up the focused row and arrows move it.\nexport function useKeyboardNav(options: KeyboardNavOptions): KeyboardNavApi {\n const focusedKey = ref<ListEditorKey | null>(null)\n const grabbedKey = ref<ListEditorKey | null>(null)\n\n const orderedKeys = computed<ListEditorKey[]>(() =>\n options.viewItems.value.map((v) => v.key),\n )\n\n const isFocused = (key: ListEditorKey): boolean => focusedKey.value === key\n const isGrabbed = (key: ListEditorKey): boolean => grabbedKey.value === key\n\n const grabbedIndex = computed<number>(() => {\n if (grabbedKey.value === null) return -1\n return orderedKeys.value.indexOf(grabbedKey.value)\n })\n\n const totalCount = computed<number>(() => orderedKeys.value.length)\n\n function rowTabindex(key: ListEditorKey): number {\n const ordered = orderedKeys.value\n if (ordered.length === 0) return -1\n if (focusedKey.value === null) return ordered[0] === key ? 0 : -1\n return focusedKey.value === key ? 0 : -1\n }\n\n function focusRowElement(key: ListEditorKey | null) {\n if (key === null || typeof document === 'undefined') return\n void Promise.resolve().then(() => {\n const el = document.querySelector<HTMLElement>(\n `[data-id=\"${CSS.escape(String(key))}\"]`,\n )\n el?.focus()\n })\n }\n\n function setFocus(key: ListEditorKey | null) {\n focusedKey.value = key\n focusRowElement(key)\n }\n\n // When the focused row is removed (e.g. via delete), fall to the row that\n // took its slot, or to the new last row if it was at the end. Without this,\n // focus vanishes to <body> after a delete and the user has to Tab back in.\n // We snapshot the previous ordering so we can look up where the focused key\n // *was* — by the time the watcher fires, the key is already gone from `now`.\n // eslint-disable-next-line vue/no-ref-object-reactivity-loss\n let prevOrderedKeys: ListEditorKey[] = [...orderedKeys.value]\n watch(\n orderedKeys,\n (now) => {\n if (focusedKey.value === null) {\n prevOrderedKeys = [...now]\n return\n }\n if (now.includes(focusedKey.value)) {\n prevOrderedKeys = [...now]\n return\n }\n if (now.length === 0) {\n focusedKey.value = null\n prevOrderedKeys = []\n return\n }\n const oldIndex = prevOrderedKeys.indexOf(focusedKey.value)\n const fallbackIndex = Math.min(Math.max(oldIndex, 0), now.length - 1)\n setFocus(now[fallbackIndex])\n prevOrderedKeys = [...now]\n },\n )\n\n // Releasing a grab when the grabbed row is no longer in the list — keeps the\n // grab state consistent if the row gets removed externally.\n watch(orderedKeys, (now) => {\n if (grabbedKey.value !== null && !now.includes(grabbedKey.value)) {\n grabbedKey.value = null\n }\n })\n\n function releaseGrab() {\n grabbedKey.value = null\n }\n\n function isFormField(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n return !!el?.matches?.('input, textarea, select, [contenteditable], [contenteditable=\"true\"]')\n }\n\n function handleKeydown(key: ListEditorKey, e: KeyboardEvent) {\n if (options.disabled?.value) return\n\n const ordered = orderedKeys.value\n const i = ordered.indexOf(key)\n if (i < 0) return\n\n const focusedItem = options.viewItems.value[i]\n const inReorder = options.isReorderMode.value\n const isGrabbedNow = grabbedKey.value === key\n const grabbedSomewhere = grabbedKey.value !== null\n\n // Form fields keep native key behavior (cursor, newlines, selection) for\n // every key except Escape. Esc still closes the edit panel even mid-typing.\n const onFormField = isFormField(e.target)\n\n switch (e.key) {\n case 'ArrowUp':\n if (onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow) {\n options.onMoveUp?.(key)\n } else if (i > 0) {\n setFocus(ordered[i - 1])\n }\n return\n\n case 'ArrowDown':\n if (onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow) {\n options.onMoveDown?.(key)\n } else if (i < ordered.length - 1) {\n setFocus(ordered[i + 1])\n }\n return\n\n case 'Home':\n if (onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow) {\n options.onMoveTop?.(key)\n } else if (ordered.length > 0) {\n setFocus(ordered[0])\n }\n return\n\n case 'End':\n if (onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow) {\n options.onMoveBottom?.(key)\n } else if (ordered.length > 0) {\n setFocus(ordered[ordered.length - 1])\n }\n return\n\n case 'ArrowLeft':\n if (options.variant !== 'nested' || onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow && focusedItem.canOutdent) {\n options.onOutdent?.(key)\n } else if (focusedItem.expanded) {\n options.onToggleChildren?.(key, false)\n }\n return\n\n case 'ArrowRight':\n if (options.variant !== 'nested' || onFormField) return\n e.preventDefault()\n if (inReorder && isGrabbedNow && focusedItem.canIndent) {\n options.onIndent?.(key)\n } else if (focusedItem.canExpand && !focusedItem.expanded) {\n options.onToggleChildren?.(key, true)\n }\n return\n\n case 'Enter':\n case ' ': // Space\n if (onFormField) return\n e.preventDefault()\n if (inReorder) {\n if (isGrabbedNow) {\n grabbedKey.value = null\n } else {\n grabbedKey.value = key\n }\n } else {\n options.onToggleEdit?.(key)\n }\n return\n\n case 'Escape':\n if (grabbedSomewhere) {\n e.preventDefault()\n grabbedKey.value = null\n return\n }\n if (inReorder) {\n e.preventDefault()\n options.onCancelReorder?.()\n return\n }\n if (options.isEditing(key)) {\n e.preventDefault()\n options.onCancelEdit?.(key)\n return\n }\n return\n\n default:\n return\n }\n }\n\n return {\n focusedKey,\n grabbedKey,\n grabbedIndex,\n totalCount,\n isFocused,\n isGrabbed,\n rowTabindex,\n setFocus,\n releaseGrab,\n handleKeydown,\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\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 state:\n | Ref<ListEditorValidationState>\n | ComputedRef<ListEditorValidationState>\n | (() => ListEditorValidationState)\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(\n options: UseListEditorItemValidationOptions,\n): void {\n const registry = inject(ListEditorValidationKey, null)\n if (!registry) return\n if (!getCurrentInstance()) return\n\n const stateRef = computed<ListEditorValidationState>(() => {\n const s = options.state\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 { provide, reactive, type ComputedRef, type Ref } from 'vue'\nimport {\n ListEditorValidationKey,\n type ListEditorValidationRegistry,\n} from '@/labs/listEditor/composables/useListEditorItemValidation'\nimport type {\n ListEditorKey,\n ListEditorValidationState,\n} from '@/labs/listEditor/types/listEditorTypes'\n\nconst isValidState = (\n v: unknown,\n): v is Exclude<ListEditorValidationState, null> =>\n v === 'valid' || v === 'invalid' || v === 'warning'\n\nexport interface UseValidationRegistryOptions<TItem extends Record<string, any>> {\n /**\n * Caller-provided fallback callback. Tried only when no descendant has\n * registered a state for the row via `useListEditorItemValidation`.\n */\n getValidationState?: (\n item: TItem,\n key: ListEditorKey,\n index: number,\n ) => ListEditorValidationState\n}\n\nexport interface UseValidationRegistryApi<TItem extends Record<string, any>> {\n /**\n * Resolves a row's validation state by checking, in order:\n * 1. The provide/inject registry (descendants registered via `useListEditorItemValidation`)\n * 2. The `getValidationState` prop fallback\n * 3. The item's own `validationState` field\n *\n * Returns null when none of the above flagged a state.\n */\n resolveValidation: (\n raw: TItem,\n key?: ListEditorKey,\n index?: number,\n ) => ListEditorValidationState\n}\n\n/**\n * Sets up the per-item validation provide/inject registry shared by all 3\n * editor variants. Descendant rows can register their `'invalid'`/`'valid'`/\n * `'warning'` state via `useListEditorItemValidation`; the editor's row-render\n * priority order is registry → prop callback → item field.\n *\n * Used by `AListEditor`, `ASortableListEditor`, `ANestedSortableListEditor`.\n */\nexport function useValidationRegistry<TItem extends Record<string, any>>(\n options: UseValidationRegistryOptions<TItem>,\n): UseValidationRegistryApi<TItem> {\n const itemValidationStates = reactive(\n new Map<\n ListEditorKey,\n Ref<ListEditorValidationState> | ComputedRef<ListEditorValidationState>\n >(),\n )\n\n provide<ListEditorValidationRegistry>(ListEditorValidationKey, {\n register(key, state) {\n itemValidationStates.set(key, state)\n },\n unregister(key) {\n itemValidationStates.delete(key)\n },\n })\n\n const resolveValidation = (\n raw: TItem,\n key?: ListEditorKey,\n index?: number,\n ): ListEditorValidationState => {\n if (key !== undefined) {\n const fromRegistry = itemValidationStates.get(key)?.value\n if (isValidState(fromRegistry)) return fromRegistry\n }\n if (options.getValidationState && key !== undefined && index !== undefined) {\n const fromProp = options.getValidationState(raw, key, index)\n if (isValidState(fromProp)) return fromProp\n }\n const v = raw.validationState\n if (isValidState(v)) return v\n return null\n }\n\n return { resolveValidation }\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'\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 const viewItems = computed<ListViewItem<TItem>[]>(() =>\n model.value.map((raw, index) => ({\n key: raw[keyField] as ListEditorKey,\n index,\n raw,\n position: raw[positionField] as number | undefined,\n })),\n )\n\n const recalculatePositions = (items: TItem[]): TItem[] =>\n items.map((item, idx) => {\n const newPosition = (idx + 1) * positionMultiplier\n if (item[positionField] === newPosition) return item\n return { ...item, [positionField]: newPosition }\n })\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 type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\n// Fallback chain for the row's compact (collapsed) display text. Used by\n// every editor variant when the consumer didn't provide an `#item-compact`\n// slot — picks the first non-empty value from the configured `compactField`\n// or a sensible set of common fields, then falls back to the row's key.\n//\n// Pure function — no Vue reactivity. Pass the i18n `t` so the caller's\n// translation context is preserved.\nexport function resolveCompactText<TItem extends Record<string, any>>(\n raw: TItem,\n key: ListEditorKey,\n options: {\n compactField?: string | null\n fallback: string\n },\n): string {\n const pick = (v: unknown): string | null =>\n v == null || v === '' ? null : String(v)\n const fromField = options.compactField ? pick(raw[options.compactField]) : null\n if (fromField !== null) return fromField\n const fallbacks = [\n pick(raw.title),\n pick(raw.name),\n pick(raw.texts?.title),\n pick(raw.text),\n pick(key),\n ]\n const hit = fallbacks.find((v): v is string => v !== null)\n return hit ?? options.fallback\n}\n","import { computed, watch, type ComputedRef, type Ref } from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nconst setsEqual = (\n a: Set<ListEditorKey>,\n b: Set<ListEditorKey>,\n): boolean => a.size === b.size && [...a].every((k) => b.has(k))\n\nexport interface UseUnsavedKeysSyncOptions {\n /** v-model-bound external Set (consumer's `defineModel<Set<ListEditorKey>>('unsavedKeys', …)`). */\n unsavedKeysModel: Ref<Set<ListEditorKey>>\n /** Internal source of truth — typically a computed deriving `dirty || moved` per row. */\n internalUnsavedKeys: ComputedRef<Set<ListEditorKey>>\n /**\n * Called when the consumer clears every unsaved key externally\n * (`unsavedKeys.value = new Set()` after a successful parent-form save).\n * Editor variants typically re-capture the dirty baseline here.\n */\n onClearAll: () => void\n /**\n * Called per-key when the consumer rebases just one row (e.g. dropped a\n * specific key from the unsaved set). Editor variants typically\n * re-baseline that key only.\n */\n onClearKey: (key: ListEditorKey) => void\n}\n\nexport interface UseUnsavedKeysSyncApi {\n hasUnsavedChanges: ComputedRef<boolean>\n unsavedCount: ComputedRef<number>\n /**\n * Imperative API exposed via `defineExpose` — callers pass a key to clear\n * just that row, omit it to clear everything (mirrors the model-driven\n * paths).\n */\n clearUnsavedState: (key?: ListEditorKey) => void\n}\n\n/**\n * Two-way sync between an editor's own per-row dirty/moved state and the\n * external `v-model:unsaved-keys` Set the consumer passes in.\n *\n * Internal → external: when `internalUnsavedKeys` changes, write a fresh\n * Set into the model (skipping no-op writes).\n *\n * External → internal: when the consumer overwrites the model (typically\n * to clear it after a successful save), call `onClearAll` (full clear) or\n * `onClearKey` (per-key) so the editor's dirty baseline catches up.\n *\n * The `suppressNext` flag keeps the watcher pair from ping-ponging when\n * the internal change is what triggered the model write.\n *\n * Used by `AListEditor`, `ASortableListEditor`, `ANestedSortableListEditor`.\n */\nexport function useUnsavedKeysSync(\n options: UseUnsavedKeysSyncOptions,\n): UseUnsavedKeysSyncApi {\n let suppressNextModelWatch = false\n\n watch(\n options.internalUnsavedKeys,\n (now) => {\n if (setsEqual(options.unsavedKeysModel.value, now)) return\n suppressNextModelWatch = true\n options.unsavedKeysModel.value = new Set(now)\n },\n { immediate: true },\n )\n\n watch(options.unsavedKeysModel, (now) => {\n if (suppressNextModelWatch) {\n suppressNextModelWatch = false\n return\n }\n if (now.size === 0 && options.internalUnsavedKeys.value.size > 0) {\n options.onClearAll()\n } else {\n // Selective per-key clear: rebaseline keys present in internal but\n // absent in model.\n for (const key of options.internalUnsavedKeys.value) {\n if (!now.has(key)) options.onClearKey(key)\n }\n }\n })\n\n const hasUnsavedChanges = computed<boolean>(\n () => options.internalUnsavedKeys.value.size > 0,\n )\n const unsavedCount = computed<number>(\n () => options.internalUnsavedKeys.value.size,\n )\n\n const clearUnsavedState = (key?: ListEditorKey) => {\n if (key === undefined) {\n options.onClearAll()\n } else {\n options.onClearKey(key)\n }\n }\n\n return { hasUnsavedChanges, unsavedCount, clearUnsavedState }\n}\n","import { ref, type Ref } from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface UseDirtyBaselineOptions {\n /**\n * Field names to strip from item payload before hashing. Useful when the\n * consumer rewrites fields as a side effect of other operations (e.g. flat\n * sortable rewrites `[positionField]` on every row whose index shifts after\n * a move, nested sortable rewrites `[positionField, parentField]`) — those\n * rewrites shouldn't flag unchanged rows as dirty.\n */\n excludeFields?: string[]\n}\n\nexport interface UseDirtyBaselineApi<TItem> {\n dirtyBaseline: Ref<Map<ListEditorKey, string>>\n captureDirtyBaseline: () => void\n rebaselineKey: (key: ListEditorKey) => void\n isItemDirty: (key: ListEditorKey, data: TItem) => boolean\n stringifyContent: (data: TItem) => string\n}\n\n/**\n * Dirty-baseline tracking shared across list-editor variants. Captures a\n * content snapshot (key → stringified payload) so per-row \"unsaved\" markers\n * can be derived by diffing current data against the baseline.\n *\n * Pure data behaviour — no DOM, no emits, no editor-specific state. Consumers\n * (the components) own any related state like `movedKeys` and invoke\n * `captureDirtyBaseline()` themselves when resetting; splitting that out\n * keeps the composable focused on a single responsibility.\n *\n * Note: the initial baseline is captured the first time this function runs,\n * reading from `getEntries()` immediately. Callers that want to reset the\n * baseline later (e.g. after a successful parent-form save) call\n * `captureDirtyBaseline()` again.\n */\nexport function useDirtyBaseline<TItem extends Record<string, any>>(\n getEntries: () => Array<{ key: ListEditorKey; data: TItem }>,\n options: UseDirtyBaselineOptions = {},\n): UseDirtyBaselineApi<TItem> {\n const excludeFields = options.excludeFields ?? []\n const hasExcludes = excludeFields.length > 0\n // Pre-build the exclude lookup once at setup. With a typical exclude list\n // of 1-2 fields the savings are tiny, but the Set is referenced from the\n // hot stringify path so it's worth the one-time cost.\n const excludeSet = hasExcludes ? new Set(excludeFields) : null\n\n // `JSON.stringify` per-call is intentionally NOT memoized by data\n // reference. Some consumers mutate item fields in place (e.g. a v-model\n // bound to `data.title` inside an inline form) — that mutation doesn't\n // change the object identity, so a WeakMap cache would return a stale\n // dirty result. Correctness wins; the per-call cost is bounded by item\n // size and only pays at render time. For very large forms (100+ rows of\n // deeply-nested objects) this dominates GC; profile and revisit if it\n // shows up in a flame graph for a real consumer.\n const stringifyContent = (data: TItem): string => {\n if (!hasExcludes) return JSON.stringify(data)\n const copy = { ...data } as Record<string, unknown>\n for (const field of excludeSet!) {\n delete copy[field]\n }\n return JSON.stringify(copy)\n }\n\n const dirtyBaseline = ref(new Map<ListEditorKey, string>()) as Ref<\n Map<ListEditorKey, string>\n >\n\n const captureDirtyBaseline = () => {\n const next = new Map<ListEditorKey, string>()\n for (const { key, data } of getEntries()) {\n next.set(key, stringifyContent(data))\n }\n dirtyBaseline.value = next\n }\n\n const rebaselineKey = (key: ListEditorKey) => {\n const entries = getEntries()\n const entry = entries.find((e) => e.key === key)\n if (entry) {\n dirtyBaseline.value.set(key, stringifyContent(entry.data))\n } else {\n dirtyBaseline.value.delete(key)\n }\n }\n\n const isItemDirty = (key: ListEditorKey, data: TItem): boolean => {\n const baseline = dirtyBaseline.value.get(key)\n if (baseline === undefined) return true\n return baseline !== stringifyContent(data)\n }\n\n captureDirtyBaseline()\n\n return {\n dirtyBaseline,\n captureDirtyBaseline,\n rebaselineKey,\n isItemDirty,\n stringifyContent,\n }\n}\n","import { ref, type Ref } from 'vue'\n\nexport interface UseDeleteDialogOptions<TItem, ViewItem> {\n /**\n * Confirm hook — called before any destructive work. Returning `false`\n * aborts the delete silently; rejecting is treated the same as the caller's\n * `onDelete` rejecting (error message surfaced in the dialog).\n */\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n /**\n * Destructive work hook — consumer-side deletion (e.g. API call). If it\n * throws, the error is surfaced in the dialog and the local state is not\n * mutated.\n */\n onDelete?: (item: TItem) => Promise<void> | void\n /**\n * Called once the delete has succeeded end-to-end. The consumer performs\n * the editor mutation + clears component-local state here (editingKeys,\n * editingSnapshots, expanded flags, etc.). Keeping this step outside the\n * composable is deliberate — it lets each editor variant own its\n * per-component state shape without leaking it into the shared code.\n */\n onDeleted: (item: ViewItem) => void\n /**\n * Runs at click time. When true, the confirmation dialog is skipped and\n * delete proceeds immediately. Lets callers bypass the dialog for\n * specific modes (e.g. chips) without threading a prop through.\n */\n disableDeleteConfirm: () => boolean\n}\n\nexport interface UseDeleteDialogApi<ViewItem> {\n deleteDialog: Ref<boolean>\n deleteTarget: Ref<ViewItem | null>\n deleteInFlight: Ref<boolean>\n deleteError: Ref<string | null>\n performDelete: (vi: ViewItem) => Promise<boolean>\n onDeleteClick: (vi: ViewItem) => Promise<void>\n onDeleteDialogConfirm: () => Promise<void>\n onDeleteDialogCancel: () => void\n}\n\n/**\n * Delete-flow state + handlers shared across list-editor variants. Owns the\n * dialog boolean, the target row, the in-flight flag and the error string;\n * dispatches to the caller's confirm/delete/deleted hooks in the right order.\n *\n * Pure behaviour — no template, no editor dependency. The dialog markup\n * stays in each component (it references component-local slots and refs).\n */\nexport function useDeleteDialog<\n TItem extends Record<string, any>,\n ViewItem extends { key: string | number; raw: TItem },\n>(\n options: UseDeleteDialogOptions<TItem, ViewItem>,\n): UseDeleteDialogApi<ViewItem> {\n const deleteDialog = ref(false)\n const deleteTarget = ref<ViewItem | null>(null) as Ref<ViewItem | null>\n const deleteInFlight = ref(false)\n const deleteError = ref<string | null>(null)\n\n const performDelete = async (vi: ViewItem): Promise<boolean> => {\n deleteError.value = null\n if (options.onDeleteConfirm) {\n const ok = await options.onDeleteConfirm(vi.raw)\n if (!ok) return false\n }\n if (options.onDelete) {\n deleteInFlight.value = true\n try {\n await options.onDelete(vi.raw)\n } catch (err) {\n deleteInFlight.value = false\n deleteError.value = err instanceof Error ? err.message : String(err)\n return false\n }\n deleteInFlight.value = false\n }\n options.onDeleted(vi)\n return true\n }\n\n const onDeleteClick = async (vi: ViewItem) => {\n if (options.disableDeleteConfirm()) {\n await performDelete(vi)\n return\n }\n deleteTarget.value = vi\n deleteError.value = null\n deleteDialog.value = true\n }\n\n const onDeleteDialogConfirm = async () => {\n if (!deleteTarget.value) return\n const ok = await performDelete(deleteTarget.value as ViewItem)\n if (ok) {\n deleteDialog.value = false\n deleteTarget.value = null\n }\n }\n\n const onDeleteDialogCancel = () => {\n if (deleteInFlight.value) return\n deleteDialog.value = false\n deleteTarget.value = null\n deleteError.value = null\n }\n\n return {\n deleteDialog,\n deleteTarget,\n deleteInFlight,\n deleteError,\n performDelete,\n onDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n }\n}\n","import { nextTick, ref, watch, type ComputedRef, type Ref } from 'vue'\nimport { cloneDeep } from '@/utils/common'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\nexport interface UseInlineEditingOptions<TItem> {\n /**\n * DOM ref of the scrolling container — the parent element that wraps every\n * row. Used to scope `querySelector` during the auto-scroll step so a page\n * with multiple editor instances doesn't accidentally scroll a sibling's\n * row into view.\n */\n rowsContainer: Ref<HTMLElement | null>\n /**\n * CSS selector for the per-row element to scroll into view. Flat editors\n * target the row directly (`.a-le-row`); the nested variant wraps rows\n * for drag/drop so the selector is the wrapper (`.a-le-row-wrapper`).\n * Must contain a `[data-id=\"...\"]` slot — filled at call time with the\n * CSS-escaped key.\n */\n rowSelector: string\n /**\n * Whether consumer-provided `#item` slot is present AND this variant is in\n * an inline-edit-capable configuration. Flat/sortable toggle this off in\n * chips mode; nested derives it from the slot existence. Auto-open on add\n * is a no-op when this is false.\n */\n isInlineEdit: ComputedRef<boolean>\n /**\n * Called when the user cancels an open edit. Consumer writes the snapshot\n * back to the underlying editor (flat: `editor.updateItem(vi.index, data)`;\n * nested: `editor.updateItem(vi.key, data)`) — the signature differs per\n * variant so the composable stays agnostic and delegates via this callback.\n */\n restoreSnapshot: (key: ListEditorKey, data: TItem) => void\n /**\n * Flat list of keys the auto-open watch should react to. Flat editors\n * return `modelValue.map(...)`; the nested variant walks the tree. Called\n * as the watch source getter — keep it referentially stable-ish so watch\n * dependencies are honoured.\n */\n watchKeys: () => ListEditorKey[]\n /**\n * Look up raw data for a key during auto-open so we can snapshot it before\n * the user starts editing. Flat editors return the item out of modelValue;\n * nested walks its tree. Returning `null` aborts the auto-open.\n */\n findEntry: (key: ListEditorKey) => { data: TItem } | null\n /**\n * Nested-only hook — after the new key is marked editing, the nested\n * variant needs to expand ancestors so the row is visible. Flat variants\n * don't need this and pass `undefined`.\n */\n afterAutoOpen?: (key: ListEditorKey) => void\n}\n\nexport interface UseInlineEditingApi<TItem, ViewItem> {\n editingKeys: Ref<Set<ListEditorKey>>\n editingSnapshots: Ref<Map<ListEditorKey, TItem>>\n pendingAutoOpen: Ref<boolean>\n clearEditing: () => void\n beginEdit: (vi: ViewItem) => void\n cancelEdit: (vi: ViewItem) => void\n commitEdit: (vi: ViewItem) => void\n closeEdit: (vi: ViewItem) => void\n requestAutoOpen: () => void\n}\n\n/**\n * Inline-edit lifecycle shared across list-editor variants.\n *\n * Owns:\n * - the per-key editing set (rows currently rendering the inline form),\n * - per-key content snapshots (taken on edit-open, used to revert on\n * cancel),\n * - the `pendingAutoOpen` flag + watch that auto-opens the most-recently\n * appended row after an `@add` emit resolves,\n * - the double-`nextTick` + `scrollIntoView` dance that pulls the new row\n * into view on long lists.\n *\n * Agnostic of the underlying editor composable — callers pass a\n * `restoreSnapshot` callback so the flat/nested signature mismatch\n * (`updateItem(index, data)` vs `updateItem(key, data)`) stays in the\n * consumer.\n */\nexport function useInlineEditing<\n TItem extends Record<string, any>,\n ViewItem extends { key: ListEditorKey; raw: TItem },\n>(\n options: UseInlineEditingOptions<TItem>,\n): UseInlineEditingApi<TItem, ViewItem> {\n const editingKeys = ref<Set<ListEditorKey>>(new Set())\n const editingSnapshots = ref(new Map<ListEditorKey, TItem>()) as Ref<\n Map<ListEditorKey, TItem>\n >\n const pendingAutoOpen = ref(false)\n\n const clearEditing = () => {\n editingKeys.value.clear()\n editingSnapshots.value.clear()\n }\n\n const beginEdit = (vi: ViewItem) => {\n if (!editingSnapshots.value.has(vi.key)) {\n editingSnapshots.value.set(vi.key, cloneDeep(vi.raw) as TItem)\n }\n editingKeys.value.add(vi.key)\n }\n\n const cancelEdit = (vi: ViewItem) => {\n const snap = editingSnapshots.value.get(vi.key)\n if (snap) {\n options.restoreSnapshot(vi.key, snap as TItem)\n }\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n }\n\n const commitEdit = (vi: ViewItem) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n }\n\n const closeEdit = (vi: ViewItem) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n }\n\n const requestAutoOpen = () => {\n pendingAutoOpen.value = true\n }\n\n watch(options.watchKeys, (newKeys, oldKeys) => {\n if (!pendingAutoOpen.value) return\n pendingAutoOpen.value = false\n const oldSet = new Set(oldKeys ?? [])\n const addedKey = newKeys.find((k) => !oldSet.has(k))\n if (addedKey === undefined) return\n if (!options.isInlineEdit.value) return\n const entry = options.findEntry(addedKey)\n if (!entry) return\n if (!editingSnapshots.value.has(addedKey)) {\n editingSnapshots.value.set(addedKey, cloneDeep(entry.data) as TItem)\n }\n editingKeys.value.add(addedKey)\n options.afterAutoOpen?.(addedKey)\n // Scroll the newly added row into view so the user sees their new item\n // even on long lists where the append lands below the viewport fold.\n // Double nextTick so the inline-edit body has rendered; `block: 'center'`\n // because `'nearest'` often decides a partially-visible row is good\n // enough and does nothing.\n nextTick(() => {\n nextTick(() => {\n const el = options.rowsContainer.value?.querySelector<HTMLElement>(\n `${options.rowSelector}[data-id=\"${CSS.escape(String(addedKey))}\"]`,\n )\n el?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n })\n })\n })\n\n return {\n editingKeys,\n editingSnapshots,\n pendingAutoOpen,\n clearEditing,\n beginEdit,\n cancelEdit,\n commitEdit,\n closeEdit,\n requestAutoOpen,\n }\n}\n","<script setup lang=\"ts\">\n// Shared delete-confirmation dialog used by all three list-editor variants.\n// The outer editors keep their own dialog-related state (open flag, in-flight,\n// error message) and supply i18n-resolved title / text / button labels — this\n// component is pure presentation plus confirm/cancel emits.\n\nexport interface Props {\n title: string\n text: string\n confirmLabel?: string\n cancelLabel?: string\n error?: string | null\n inFlight?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n error: null,\n inFlight: false,\n})\n\ndefineEmits<{\n confirm: []\n cancel: []\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"420\"\n :persistent=\"inFlight\"\n >\n <VCard>\n <VCardTitle class=\"text-headline-small\">\n {{ title }}\n </VCardTitle>\n <VCardText>\n {{ text }}\n <VAlert\n v-if=\"error\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-3\"\n >\n {{ error }}\n </VAlert>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <VBtn\n variant=\"text\"\n :disabled=\"inFlight\"\n @click=\"$emit('cancel')\"\n >\n {{ cancelLabel }}\n </VBtn>\n <VBtn\n color=\"error\"\n variant=\"flat\"\n :loading=\"inFlight\"\n :disabled=\"inFlight\"\n @click=\"$emit('confirm')\"\n >\n {{ confirmLabel }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\n\n// Shared empty-state block used by all three list-editor variants. Since the\n// refactor to a flat `.a-le-*` namespace, the block class no longer depends\n// on the parent variant — the same three classes render inside any editor.\n\nexport interface Props {\n title: string\n text: string\n addLabel?: string | null\n canAdd?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n addLabel: null,\n canAdd: false,\n})\n\ndefineEmits<{\n add: []\n}>()\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"a-le-empty\">\n <h3 class=\"a-le-empty-title\">\n {{ title }}\n </h3>\n <p class=\"a-le-empty-text\">\n {{ text }}\n </p>\n <VBtn\n v-if=\"addLabel && canAdd\"\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-plus\"\n @click=\"$emit('add')\"\n >\n {{ t('common.sortable.addFirst') }}\n </VBtn>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\n\n// Small \"unsaved\" pill (warning dot + translated label). Emits the shared\n// `.a-le-unsaved-label` class directly — the flat `.a-le-*` namespace means\n// every variant shares the same selector, no per-variant BEM prefix needed.\n\nexport interface Props {\n label?: string | null\n}\n\nwithDefaults(defineProps<Props>(), {\n label: null,\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <span class=\"a-le-unsaved-label\">\n <VIcon\n icon=\"mdi-circle-medium\"\n size=\"12\"\n />\n {{ label ?? t('common.sortable.unsaved') }}\n </span>\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 { useValidationRegistry } from '@/labs/listEditor/composables/useValidationRegistry'\nimport { useListEditor } from '@/labs/listEditor/composables/useListEditor'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedKeysSync } from '@/labs/listEditor/composables/useUnsavedKeysSync'\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// Public slot scope shapes — mirror what `buildSlotProps(vi)` actually emits.\n// Hoisted to the top-level so vite-plugin-dts can include them in the .d.ts;\n// putting them after `defineProps`/`defineEmits` would emit `private name`\n// errors during 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 /**\n * Aliases `dirty` on the flat editor (no reorder mode → no `moved` to OR\n * with). Mirrors the field name on the sortable + nested variants so a\n * consumer slot template can use the same name across all three editors.\n */\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 emptyText?: 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 getValidationState?: (\n item: TItem,\n key: ListEditorKey,\n index: number,\n ) => 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\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 emptyText: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n closeVariant: 'auto',\n loadingKeys: null,\n getValidationState: undefined,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n})\n\nconst emit = defineEmits<{\n add: [positionHint: PositionHint | undefined]\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// Options are captured once at setup; list-editor config is expected to be stable.\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 } = useDirtyBaseline<TItem>(() =>\n modelValue.value.map((item) => ({\n key: item[props.keyField] as ListEditorKey,\n data: item,\n })),\n)\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) => editor.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => it[props.keyField] as ListEditorKey),\n findEntry: (key) => {\n const hit = modelValue.value.find(\n (it) => (it[props.keyField] as ListEditorKey) === key,\n )\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n})\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst emptyTextResolved = computed(() => props.emptyText ?? t('common.sortable.emptyText'))\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 = 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, key: ListEditorKey): string =>\n resolveCompactTextUtil(raw, key, {\n compactField: props.compactField,\n fallback: t('common.sortable.itemFallback'),\n })\n\nconst { resolveValidation } = useValidationRegistry<TItem>({\n getValidationState: (item, key, index) => props.getValidationState?.(item, key, index) ?? null,\n})\n\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\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.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n if (props.readonly && hasReadonlyDetail.value) 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 editor.deleteItem(vi.key)\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(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 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: () => { const vi = findVi(key); if (vi) onEditClick(vi) },\n save: () => { const vi = findVi(key); if (vi) return onSaveClick(vi) },\n cancel: () => { const vi = findVi(key); if (vi) onCancelClick(vi) },\n close: () => { const vi = findVi(key); if (vi) onCloseClick(vi) },\n delete: async () => { const vi = findVi(key); if (vi) await onDeleteClick(vi) },\n addAfter: () => { const vi = findVi(key); if (vi) onRowAddAfterClick(vi) },\n toggleExpand: () => { const vi = findVi(key); if (vi) onExpandClick(vi) },\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,\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\nconst { hasUnsavedChanges, unsavedCount, clearUnsavedState } = useUnsavedKeysSync({\n unsavedKeysModel,\n internalUnsavedKeys,\n onClearAll: () => captureDirtyBaseline(),\n onClearKey: (key) => rebaselineKey(key),\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 :text=\"emptyTextResolved\"\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, vi.key) }}\n </span>\n </slot>\n <LeUnsavedLabel v-if=\"vi.dirty\" />\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\"\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.stop=\"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 && $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\"\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=\"vi.expanded && $slots['item-readonly']\"\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 { useElementSize } from '@vueuse/core'\n\n// Aligns JS-driven layout decisions (close button variant, mobile title icon)\n// with the CSS `@container le-shell` queries which fire on the editor's own\n// width rather than the viewport. Default threshold matches the 768/769 split\n// in `_shared.scss` and per-component narrow-container blocks.\nexport function useContainerWidth(\n el: Ref<HTMLElement | null | undefined>,\n threshold = 769,\n): { width: Ref<number>; isNarrow: ComputedRef<boolean> } {\n const { width } = useElementSize(el)\n const isNarrow = computed(() => width.value > 0 && width.value < threshold)\n return { width, isNarrow }\n}\n","import {\n computed,\n ref,\n watch,\n type ComputedRef,\n type InjectionKey,\n type Ref,\n} from 'vue'\nimport type { ListEditorKey } from '@/labs/listEditor/types/listEditorTypes'\n\n// Registry that lets embedded inner editors push their reorder pending-count\n// up to the nearest non-embedded outer editor. The outer's reorder toolbar\n// status (\"N pending changes\") then reflects child moves too — so toggling\n// the order of an answer inside a question increments the outer's counter\n// just like a question move would.\nexport interface SharedReorderRegistry {\n register: (\n id: symbol,\n movedCount: ComputedRef<number>,\n hasPendingChanges: ComputedRef<boolean>,\n ) => void\n unregister: (id: symbol) => void\n}\n\nexport const SharedReorderRegistryKey = Symbol(\n 'le.sharedReorderRegistry',\n) as InjectionKey<SharedReorderRegistry>\n\nexport type ReorderModeValue = 'view' | 'reorder'\n\nexport interface UseReorderModeEmit<T> {\n reorderStart: () => void\n reorderCancel: () => void\n reorderApplied: (payload: T) => void\n reorderApplyError: (err: unknown) => void\n reorderEnd: () => void\n}\n\nexport interface UseReorderModeOptions<T> {\n /**\n * v-model-backed mode ref — the composable reads + writes, but the\n * component owns the `defineModel('mode', ...)` so external\n * `v-model:mode` bindings still flow. Passing the ref in avoids\n * duplicating the defineModel contract inside the composable.\n */\n mode: Ref<ReorderModeValue>\n /**\n * Reorder snapshot — cloned on enter, restored on cancel, cleared on\n * apply. Stays at component level (the dirty-baseline needs to read it\n * indirectly too), but the composable owns every assignment.\n */\n snapshot: Ref<T | null>\n /**\n * Keys the user has actively moved this session (drag, arrow buttons,\n * indent/outdent). Cleared on every mode transition. Stays at component\n * level because the per-row decorator reads it for the `moved` flag.\n */\n movedKeys: Ref<Set<ListEditorKey>>\n modelValue: Ref<T>\n /**\n * Deep-clone the model value for snapshotting. Caller-provided because\n * the nested tree shape and flat array shape need different serializer\n * handling (both use `cloneDeep` in practice, but the callsite already\n * imports it).\n */\n cloneModel: (m: T) => T\n applyModel: (m: T) => void\n canEnterReorder: ComputedRef<boolean>\n /**\n * Hook run after mode flips to `reorder` but before emit — nested uses\n * this to expand every branch + init sortable instances, flat uses it\n * (via nothing — the sortable initialises lazily via a watch in the\n * flat variant). Left optional.\n */\n onEnter?: () => void\n /**\n * Hook run after mode flips back to `view` on cancel — nested destroys\n * its sortable instances here. Flat doesn't need it.\n */\n onCancel?: () => void\n /**\n * Hook run after apply succeeds — nested destroys its sortable instances\n * here. Flat doesn't need it.\n */\n onApplyEnd?: () => void\n /**\n * Called from the mode watcher when mode flips externally from `view` to\n * `reorder` (e.g. v-model:mode bound by the parent) — each variant uses\n * this to clear variant-specific caches that `enterReorderMode` itself\n * also clears via its own call-site. The flat variant clears editing +\n * expanded; nested clears editing only (children-expanded stays).\n */\n onExternalEnter?: () => void\n /**\n * Async persist callback wired from the parent — identical semantics to\n * the old `props.onReorderApply`. Receives the cloned payload (array for\n * flat, tree for nested); throwing surfaces the error in the header\n * toolbar via `applyError`.\n */\n onReorderApply?: (payload: T) => Promise<void> | void\n /**\n * Optional override for the payload passed to `onReorderApply` + the\n * `reorder-applied` emit — defaults to `cloneModel(modelValue)`. Exists\n * so consumers could send a different shape than their stored snapshot\n * if the need arises; both current callers use the default.\n */\n clonePayload?: (m: T) => T\n /**\n * Embedded mode — the editor follows external mode changes but does NOT\n * own a snapshot or apply/cancel logic. The parent (a non-embedded outer\n * editor) takes a deep snapshot covering this editor's data too, so cancel\n * at the top restores everything. Used for the \"shared reorder\" pattern\n * where a single Reorder button drives multiple stacked editors.\n */\n embedded?: ComputedRef<boolean> | Ref<boolean>\n emit: UseReorderModeEmit<T>\n}\n\nexport interface UseReorderModeApi {\n applying: Ref<boolean>\n applyError: Ref<string | null>\n hasPendingChanges: ComputedRef<boolean>\n movedCount: ComputedRef<number>\n reorderMode: ComputedRef<boolean>\n enterReorderMode: () => void\n cancelReorderMode: () => void\n applyReorder: () => Promise<void>\n}\n\n/**\n * Reorder-mode state machine shared between ASortableListEditor and\n * ANestedSortableListEditor. Owns the `applying` + `applyError` flags, the\n * pending-changes counters, and the enter / cancel / apply transitions —\n * plus the mode watcher that fires when the v-model:mode flips externally.\n *\n * The snapshot and `movedKeys` sets stay at component level because the\n * per-row decorator + dirty-baseline read them directly; the composable\n * takes them as refs so it can still drive the state machine.\n */\nexport function useReorderMode<T>(\n options: UseReorderModeOptions<T>,\n): UseReorderModeApi {\n const applying = ref(false)\n const applyError = ref<string | null>(null)\n\n const reorderMode = computed(() => options.mode.value === 'reorder')\n const movedCount = computed(() => options.movedKeys.value.size)\n const hasPendingChanges = computed(() => movedCount.value > 0)\n\n const clonePayload = (): T =>\n options.clonePayload\n ? options.clonePayload(options.modelValue.value)\n : options.cloneModel(options.modelValue.value)\n\n const isEmbedded = (): boolean => options.embedded?.value === true\n\n const enterReorderMode = () => {\n if (!options.canEnterReorder.value || reorderMode.value) return\n if (!isEmbedded()) {\n options.snapshot.value = options.cloneModel(options.modelValue.value)\n }\n options.movedKeys.value = new Set()\n applyError.value = null\n options.mode.value = 'reorder'\n options.onEnter?.()\n options.emit.reorderStart()\n }\n\n const cancelReorderMode = () => {\n if (!reorderMode.value) return\n if (!isEmbedded() && options.snapshot.value) {\n options.applyModel(options.snapshot.value as T)\n }\n options.snapshot.value = null\n options.movedKeys.value = new Set()\n applyError.value = null\n applying.value = false\n options.mode.value = 'view'\n options.onCancel?.()\n options.emit.reorderCancel()\n options.emit.reorderEnd()\n }\n\n const applyReorder = async () => {\n if (!reorderMode.value) return\n const payload = clonePayload()\n applyError.value = null\n if (!isEmbedded() && options.onReorderApply) {\n applying.value = true\n try {\n await options.onReorderApply(payload)\n } catch (err) {\n applying.value = false\n applyError.value = err instanceof Error ? err.message : String(err)\n options.emit.reorderApplyError(err)\n return\n }\n applying.value = false\n }\n // Deliberately keep `movedKeys` populated — consumer still has to persist\n // the new order via their own API call before rows are truly \"saved\"; we\n // let them clear the state manually via `resetDirtyBaseline` on success.\n options.snapshot.value = null\n options.mode.value = 'view'\n options.onApplyEnd?.()\n options.emit.reorderApplied(payload)\n options.emit.reorderEnd()\n }\n\n // Handle external mode flips (v-model:mode from a parent) — mirror the\n // same bookkeeping enterReorderMode / cancelReorderMode do so the state\n // stays consistent whether the transition came from a button click or a\n // parent binding. Embedded editors do NOT take a snapshot; their parent\n // (the outer non-embedded editor) owns one that covers nested data too.\n //\n // The view→reorder→view cleanup path differs between embedded and\n // non-embedded:\n // - non-embedded cancel: snapshot is set → clear state here\n // - non-embedded apply: applyReorder nulls snapshot BEFORE flipping\n // mode, so the snapshot-guarded branch is skipped → movedKeys stays\n // populated until consumer calls resetDirtyBaseline (the contract)\n // - embedded: no snapshot ever, clear state on every view transition\n // so the inner editor's movedKeys doesn't outlive a parent\n // cancel/apply (otherwise rows would render as `unsaved` after the\n // parent restores the original data)\n watch(options.mode, (newMode, oldMode) => {\n if (newMode === 'reorder' && oldMode !== 'reorder') {\n if (!isEmbedded() && !options.snapshot.value) {\n options.snapshot.value = options.cloneModel(options.modelValue.value)\n }\n options.movedKeys.value = new Set()\n options.onExternalEnter?.()\n }\n if (newMode === 'view' && oldMode === 'reorder') {\n if (options.snapshot.value) {\n options.snapshot.value = null\n options.movedKeys.value = new Set()\n applyError.value = null\n applying.value = false\n } else if (isEmbedded()) {\n options.movedKeys.value = new Set()\n applyError.value = null\n applying.value = false\n }\n }\n })\n\n return {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nexport interface Props {\n total: number\n currentIndex: number\n itemLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n itemLabel: undefined,\n})\n\nconst emit = defineEmits<{\n confirm: [newIndex: number]\n}>()\n\nconst open = defineModel<boolean>({ required: true })\n\nconst { t } = useI18n()\n\n// `currentIndex` is read once at setup to seed the field; subsequent changes\n// to the prop don't reset the user's typed-in value mid-edit, only re-opening\n// the dialog (via the `open` watcher below) does.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst targetPosition = ref<number>(props.currentIndex + 1)\n\nwatch(open, (now) => {\n if (now) targetPosition.value = props.currentIndex + 1\n})\n\nconst totalLabel = computed(() => Math.max(props.total, 1))\nconst isInvalid = computed<boolean>(\n () => !Number.isFinite(targetPosition.value) || targetPosition.value < 1 || targetPosition.value > totalLabel.value,\n)\n\nconst onConfirm = () => {\n if (isInvalid.value) return\n const newIndex = Math.max(0, Math.min(props.total - 1, targetPosition.value - 1))\n emit('confirm', newIndex)\n open.value = false\n}\n\nconst onCancel = () => {\n open.value = false\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n max-width=\"420\"\n persistent\n >\n <VCard>\n <VCardTitle>\n {{ t('common.sortable.moveToPosition.title') }}\n </VCardTitle>\n\n <VCardText>\n <p\n v-if=\"itemLabel\"\n class=\"text-body-medium mb-3\"\n >\n {{ t('common.sortable.moveToPosition.itemDescription', { label: itemLabel }) }}\n </p>\n <VTextField\n v-model.number=\"targetPosition\"\n type=\"number\"\n :min=\"1\"\n :max=\"totalLabel\"\n :label=\"t('common.sortable.moveToPosition.positionLabel', { max: totalLabel })\"\n :hint=\"t('common.sortable.moveToPosition.positionHint', { current: currentIndex + 1, max: totalLabel })\"\n :error=\"isInvalid\"\n autofocus\n density=\"comfortable\"\n variant=\"outlined\"\n @keydown.enter.prevent=\"onConfirm\"\n />\n </VCardText>\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=\"isInvalid\"\n @click=\"onConfirm\"\n >\n {{ t('common.sortable.moveToPosition.confirm') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\n\n// Reorder-mode header status pill. Emits `.a-le-toolbar-status` on its root,\n// caller adds the `--pending` modifier via class binding. inheritAttrs stays\n// default so additional classes (e.g. the --pending modifier) stick to the\n// root div.\n\nexport interface Props {\n hasPendingChanges: boolean\n pendingCount: number\n error?: string | null\n}\n\nwithDefaults(defineProps<Props>(), {\n error: null,\n})\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"a-le-toolbar-status\">\n <VIcon\n v-if=\"hasPendingChanges\"\n icon=\"mdi-circle-medium\"\n color=\"warning\"\n size=\"18\"\n />\n <span\n v-if=\"error\"\n class=\"text-body-small\"\n >\n {{ error }}\n </span>\n <span\n v-else-if=\"hasPendingChanges\"\n class=\"text-body-small\"\n >\n {{ t('common.sortable.pendingChanges', { count: pendingCount }) }}\n </span>\n <span\n v-else\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ t('common.sortable.noPendingChanges') }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Drag-handle icon. Emits the shared `.a-le-drag-handle` class so SortableJS\n// `handle` selectors ('.a-le-drag-handle') match across every variant.\n</script>\n\n<template>\n <VIcon\n class=\"a-le-drag-handle\"\n icon=\"mdi-drag\"\n size=\"20\"\n />\n</template>\n","// Shared internal constants for the list-editor variants.\n// Class names are referenced both as SortableJS option strings and as CSS\n// selectors in `_shared.scss`; centralising them avoids the typo risk that\n// comes with the same string literal living in 2+ places.\n\nexport const DRAG_GHOST_CLASS = 'a-le-row--ghost'\nexport const DRAG_CHOSEN_CLASS = 'a-le-row--chosen'\nexport const DRAG_CLASS = 'a-le-row--drag'\n","<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport {\n computed,\n inject,\n onBeforeUnmount,\n provide,\n ref,\n shallowReactive,\n shallowRef,\n useSlots,\n useTemplateRef,\n watch,\n type ComputedRef,\n} from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useContainerWidth } from '@/labs/listEditor/composables/useContainerWidth'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport { useValidationRegistry } from '@/labs/listEditor/composables/useValidationRegistry'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport { useListEditor } from '@/labs/listEditor/composables/useListEditor'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/labs/listEditor/composables/resolveCompactText'\nimport { useUnsavedKeysSync } from '@/labs/listEditor/composables/useUnsavedKeysSync'\nimport { useDirtyBaseline } from '@/labs/listEditor/composables/useDirtyBaseline'\nimport { useDeleteDialog } from '@/labs/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/labs/listEditor/composables/useInlineEditing'\nimport {\n useReorderMode,\n SharedReorderRegistryKey,\n type SharedReorderRegistry,\n} from '@/labs/listEditor/composables/useReorderMode'\nimport LeDeleteDialog from '@/labs/listEditor/internal/LeDeleteDialog.vue'\nimport LeMoveToPositionDialog from '@/labs/listEditor/internal/LeMoveToPositionDialog.vue'\nimport LeEmptyState from '@/labs/listEditor/internal/LeEmptyState.vue'\nimport LeStatus from '@/labs/listEditor/internal/LeStatus.vue'\nimport LeUnsavedLabel from '@/labs/listEditor/internal/LeUnsavedLabel.vue'\nimport LeDragHandle from '@/labs/listEditor/internal/LeDragHandle.vue'\nimport {\n DRAG_GHOST_CLASS,\n DRAG_CHOSEN_CLASS,\n DRAG_CLASS,\n} from '@/labs/listEditor/internal/constants'\nimport { cloneDeep } from '@/utils/common'\nimport { stringToInt } from '@/utils/string'\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 moved: boolean\n unsaved: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n}\n\nexport type ReorderMode = 'view' | 'reorder'\n\n// Public slot scope shapes — see AListEditor for the rationale on hoisting.\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 moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => 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 unsaved: boolean\n reorderMode: boolean\n moved: boolean\n canMoveUp: boolean\n canMoveDown: 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 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 emptyText?: 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 showMoveToPosition?: boolean\n\n /**\n * Embedded mode — this editor is nested inside another editor's `#item`\n * slot and follows a shared `v-model:mode` from the outer editor. When\n * set, the editor:\n * - hides its own Reorder button + Cancel/Apply toolbar\n * - skips the snapshot/restore (the outer editor's deep snapshot covers\n * nested data, so cancel at the top reverts everything)\n * - paints lighter chrome so it visually reads as part of the parent row\n * Pair with `v-model:mode` bound to the same ref the outer editor uses.\n */\n embedded?: boolean\n /**\n * Allow rows to remain inline-editable while the editor is in reorder\n * mode. By default, entering reorder closes any open inline edit and the\n * `#item` slot body is hidden — this keeps the visual focus on dragging.\n * Set this when the open row's body needs to render in reorder mode (e.g.\n * the parent editor of a shared-reorder pair, where the open question\n * exposes its embedded answers list for dragging).\n */\n allowEditInReorder?: boolean\n\n getValidationState?: (\n item: TItem,\n key: ListEditorKey,\n index: number,\n ) => ListEditorValidationState\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n onReorderApply?: (items: TItem[]) => Promise<void> | void\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 emptyText: 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 showMoveToPosition: false,\n embedded: false,\n allowEditInReorder: false,\n getValidationState: undefined,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n onReorderApply: undefined,\n})\n\nconst emit = defineEmits<{\n add: [positionHint: PositionHint | undefined]\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 'reorder-start': []\n 'reorder-cancel': []\n 'reorder-applied': [items: TItem[]]\n 'reorder-apply-error': [error: unknown]\n 'reorder-end': []\n}>()\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-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 })\nconst mode = defineModel<ReorderMode>('mode', { default: 'view' })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(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\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.\n// `position` is deliberately stripped out: drag-drop rewrites it on every row\n// whose flat index shifts as a side-effect, and flagging those unmoved rows\n// as dirty would paint ghost \"unsaved\" markers. The per-row visual cue is\n// what matters; position data still flows to the parent on apply.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { captureDirtyBaseline, rebaselineKey, isItemDirty } = useDirtyBaseline<TItem>(\n () =>\n modelValue.value.map((item) => ({\n key: item[props.keyField] as ListEditorKey,\n data: item,\n })),\n { excludeFields: [props.positionField] },\n)\n\n// Keys the user has actively moved during this reorder session. Clearing\n// this set is part of \"mark current data as saved\" — paired with\n// captureDirtyBaseline in the exposed resetDirtyBaseline so the orange\n// badges go away when consumers confirm a server save.\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst resetDirtyBaseline = () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n}\n\nconst snapshot = shallowRef<TItem[] | null>(null)\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 clearEditing,\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) => editor.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => it[props.keyField] as ListEditorKey),\n findEntry: (key) => {\n const hit = modelValue.value.find(\n (it) => (it[props.keyField] as ListEditorKey) === key,\n )\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n})\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canEnterReorder = computed(\n () => canInteract.value && !props.disableReorder && modelValue.value.length > 1,\n)\n\nconst embeddedRef = computed(() => props.embedded)\nconst allowEditInReorderRef = computed(() => props.allowEditInReorder)\n\nconst {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n} = useReorderMode<TItem[]>({\n mode,\n snapshot,\n movedKeys,\n modelValue,\n cloneModel: (m) => cloneDeep(m) as TItem[],\n applyModel: (m) => {\n modelValue.value = m\n },\n canEnterReorder,\n embedded: embeddedRef,\n onEnter: () => {\n if (!allowEditInReorderRef.value) {\n clearEditing()\n expandedKeys.value.clear()\n }\n },\n onExternalEnter: () => {\n if (!allowEditInReorderRef.value) {\n clearEditing()\n expandedKeys.value.clear()\n }\n },\n onReorderApply: (items) => props.onReorderApply?.(items),\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\n// Cross-editor pending-changes aggregation. When this editor is the outer\n// (non-embedded) one in a stacked-editor setup, it provides a registry that\n// embedded children push their own movedCount + hasPendingChanges into.\n// The toolbar's \"N pending changes\" then totals across all levels — drag a\n// question OR drag an answer inside an open question and the same counter\n// increments either way. When this editor IS embedded, it injects the\n// nearest parent's registry and registers itself.\n// shallowReactive (not reactive) so the stored ComputedRef objects don't get\n// auto-unwrapped — we read `.value` on them inside the aggregator computeds.\n// `embedded` is a setup-time decision; it doesn't flip during a component's\n// lifetime so reading it once at root scope is intentional.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst childContributions = props.embedded\n ? null\n : shallowReactive(\n new Map<\n symbol,\n { count: ComputedRef<number>; hasChanges: ComputedRef<boolean> }\n >(),\n )\n\nif (childContributions) {\n const registry: SharedReorderRegistry = {\n register: (id, count, hasChanges) => {\n childContributions.set(id, { count, hasChanges })\n },\n unregister: (id) => {\n childContributions.delete(id)\n },\n }\n provide(SharedReorderRegistryKey, registry)\n}\n\nif (props.embedded) {\n const parent = inject(SharedReorderRegistryKey, null)\n if (parent) {\n const id = Symbol('le.embedded')\n parent.register(id, movedCount, hasPendingChanges)\n onBeforeUnmount(() => parent.unregister(id))\n }\n}\n\nconst totalMovedCount = computed<number>(() => {\n let sum = movedCount.value\n if (childContributions) {\n for (const c of childContributions.values()) sum += c.count.value\n }\n return sum\n})\n\nconst totalHasPendingChanges = computed<boolean>(() => {\n if (hasPendingChanges.value) return true\n if (childContributions) {\n for (const c of childContributions.values()) {\n if (c.hasChanges.value) return true\n }\n }\n return false\n})\n\nconst canAdd = computed(() => canInteract.value && props.showAddButton && !reorderMode.value)\n// Chips mode keeps drag always-on (no mode toggle) on non-touch devices.\nconst dragEnabled = computed(\n () => (reorderMode.value || props.chips) && !isTouch.value && !props.disableDrag,\n)\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst emptyTextResolved = computed(() => props.emptyText ?? t('common.sortable.emptyText'))\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.chips\n && !props.embedded\n && props.showReorderToggle\n && !reorderMode.value\n && modelValue.value.length > 0,\n)\n\n// When there IS a title and viewport is narrow, the reorder button shrinks to an\n// icon-only round button to keep the single-line header from overflowing.\nconst compactReorderButton = computed<boolean>(\n (): boolean => !!props.title && isNarrow.value,\n)\n\nconst headerVisible = computed<boolean>(\n (): boolean =>\n !!(\n props.title\n || slots.header\n || slots['reorder-toggle']\n || reorderToggleVisible.value\n || (reorderMode.value && !props.embedded)\n ),\n)\n\n// Editor band-only header — true when the only thing in the header is the\n// reorder button (no title, no slot). Lets the template float the button\n// over the editor's top-right corner instead of reserving an empty band.\nconst headerHasContent = computed<boolean>(\n (): boolean =>\n !!(\n props.title\n || slots.header\n || slots['reorder-toggle']\n || (reorderMode.value && !props.embedded)\n ),\n)\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// Tracks only rows the user actively moved (drag, arrow buttons) — snapshot\n// vs current-index diffing would also flag side-effect index shifts, which\n// isn't what the user means by \"unsaved\".\nconst markMoved = (key: ListEditorKey) => {\n movedKeys.value.add(key)\n}\n\n// Decoupled dirty pass — see AListEditor for rationale.\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 — see AListEditor for rationale.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const total = modelValue.value.length\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 moved = movedKeys.value.has(vi.key)\n const dirty = dirtyKeys.value.has(vi.key)\n const unsaved = dirty || moved\n const canMoveUp = vi.index > 0\n const canMoveDown = vi.index < total - 1\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.moved === moved\n && cached.unsaved === unsaved\n && cached.canMoveUp === canMoveUp\n && cached.canMoveDown === canMoveDown\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n moved,\n unsaved,\n canMoveUp,\n canMoveDown,\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: 'sortable',\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) => {\n const vi = findVi(key)\n if (vi) moveUp(vi.index)\n },\n onMoveDown: (key) => {\n const vi = findVi(key)\n if (vi) moveDown(vi.index)\n },\n onMoveTop: (key) => {\n const vi = findVi(key)\n if (vi) moveTop(vi.index)\n },\n onMoveBottom: (key) => {\n const vi = findVi(key)\n if (vi) moveBottom(vi.index)\n },\n onCancelReorder: () => cancelReorderMode(),\n})\n\nconst moveToPositionDialogOpen = ref<boolean>(false)\nconst moveToPositionTarget = shallowRef<DecoratedViewItem<TItem> | null>(null)\nconst moveToPositionLabel = computed<string>(() =>\n moveToPositionTarget.value\n ? resolveCompactText(moveToPositionTarget.value.raw, moveToPositionTarget.value.key)\n : '',\n)\nconst openMoveToPosition = (vi: DecoratedViewItem<TItem>) => {\n if (!props.showMoveToPosition) return\n moveToPositionTarget.value = vi\n moveToPositionDialogOpen.value = true\n}\nconst onMoveToPositionConfirm = (newIndex: number) => {\n const target = moveToPositionTarget.value\n moveToPositionTarget.value = null\n if (!target) return\n if (newIndex === target.index) return\n editor.moveItem(target.index, newIndex)\n markMoved(target.key)\n}\n\nconst resolveCompactText = (raw: TItem, key: ListEditorKey): string =>\n resolveCompactTextUtil(raw, key, {\n compactField: props.compactField,\n fallback: t('common.sortable.itemFallback'),\n })\n\nconst { resolveValidation } = useValidationRegistry<TItem>({\n getValidationState: (item, key, index) => props.getValidationState?.(item, key, index) ?? null,\n})\n\n// Skip SortableJS entirely on touch devices — touch users reorder via arrows + menu,\n// so the drag/drop library is never needed and there is no point paying its setup cost.\n// The one-shot reads below are intentional: touch detection is fixed at setup time,\n// and dragEnabled's initial value seeds SortableJS; later changes flow via the watch.\n/* eslint-disable vue/no-ref-object-reactivity-loss */\nif (!isTouch.value) {\n const sortable = useSortable(rowsContainer, modelValue, {\n handle: '.a-le-drag-handle',\n animation: 150,\n // Force the fallback renderer so `dragClass` is applied to a CSS-controlled\n // clone that follows the cursor — gives us a custom, row-shaped ghost\n // instead of the opaque browser-native drag bitmap.\n forceFallback: true,\n fallbackTolerance: 3,\n fallbackOnBody: true,\n ghostClass: DRAG_GHOST_CLASS,\n chosenClass: DRAG_CHOSEN_CLASS,\n dragClass: DRAG_CLASS,\n disabled: !dragEnabled.value,\n onEnd: (event) => {\n // Resolve which row was dragged by reading its data-id attribute\n // (set via template binding on .row). SortableJS's `event.item` is\n // the moved DOM element; we only mark that one specific key as moved\n // rather than diffing the whole list, so siblings that shifted index\n // as a side-effect stay clean.\n const el = event.item as HTMLElement\n const raw = el.getAttribute('data-id')\n if (raw !== null && raw !== '') {\n const n = stringToInt(raw)\n const key: ListEditorKey = n > 0 ? n : raw\n markMoved(key)\n }\n if (props.updatePosition) {\n modelValue.value = editor.recalculatePositions(modelValue.value) as TItem[]\n }\n },\n })\n\n watch(dragEnabled, (enabled) => {\n sortable.option('disabled', !enabled)\n })\n}\n/* eslint-enable vue/no-ref-object-reactivity-loss */\n\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n emit('add', { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n if (reorderMode.value && !props.allowEditInReorder) 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 if (reorderMode.value && !props.allowEditInReorder) 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.disabled || props.loading) return false\n if (reorderMode.value && !props.allowEditInReorder) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n if (props.readonly && hasReadonlyDetail.value) 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 editor.deleteItem(vi.key)\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(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\nconst keyAtIndex = (idx: number): ListEditorKey | null => {\n const item = modelValue.value[idx]\n if (!item) return null\n return item[props.keyField] as ListEditorKey\n}\n\nconst moveUp = (idx: number) => {\n if (idx <= 0) return\n const key = keyAtIndex(idx)\n editor.moveItem(idx, idx - 1)\n if (key !== null) markMoved(key)\n}\nconst moveDown = (idx: number) => {\n if (idx >= modelValue.value.length - 1) return\n const key = keyAtIndex(idx)\n editor.moveItem(idx, idx + 1)\n if (key !== null) markMoved(key)\n}\nconst moveTop = (idx: number) => {\n if (idx <= 0) return\n const key = keyAtIndex(idx)\n editor.moveItem(idx, 0)\n if (key !== null) markMoved(key)\n}\nconst moveBottom = (idx: number) => {\n if (idx >= modelValue.value.length - 1) return\n const key = keyAtIndex(idx)\n editor.moveItem(idx, modelValue.value.length - 1)\n if (key !== null) markMoved(key)\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 the\n// 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 toggleExpand: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => 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: () => { const vi = findVi(key); if (vi) onEditClick(vi) },\n save: () => { const vi = findVi(key); if (vi) return onSaveClick(vi) },\n cancel: () => { const vi = findVi(key); if (vi) onCancelClick(vi) },\n close: () => { const vi = findVi(key); if (vi) onCloseClick(vi) },\n delete: async () => { const vi = findVi(key); if (vi) await onDeleteClick(vi) },\n addAfter: () => { const vi = findVi(key); if (vi) onRowAddAfterClick(vi) },\n toggleExpand: () => { const vi = findVi(key); if (vi) onExpandClick(vi) },\n moveUp: () => { const vi = findVi(key); if (vi) moveUp(vi.index) },\n moveDown: () => { const vi = findVi(key); if (vi) moveDown(vi.index) },\n moveTop: () => { const vi = findVi(key); if (vi) moveTop(vi.index) },\n moveBottom: () => { const vi = findVi(key); if (vi) moveBottom(vi.index) },\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: 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,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n reorderMode: reorderMode.value,\n moved: vi.moved,\n canMoveUp: vi.canMoveUp,\n canMoveDown: vi.canMoveDown,\n touch: isTouch.value,\n actions: getActions(vi.key),\n})\n\nconst toolbarSlotProps = computed(() => ({\n applying: applying.value,\n hasPendingChanges: totalHasPendingChanges.value,\n movedCount: totalMovedCount.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: totalHasPendingChanges.value,\n actions: {\n enterReorderMode,\n exitReorderMode: cancelReorderMode,\n },\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\nconst { hasUnsavedChanges, unsavedCount, clearUnsavedState } = useUnsavedKeysSync({\n unsavedKeysModel,\n internalUnsavedKeys,\n onClearAll: () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n },\n onClearKey: (key) => {\n rebaselineKey(key)\n movedKeys.value.delete(key)\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,\n hasUnsavedChanges,\n unsavedCount,\n clearUnsavedState,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-sortable-list-editor\"\n :class=\"[\n `a-sortable-list-editor--two-rows-${twoRows}`,\n `a-sortable-list-editor--mode-${mode}`,\n {\n 'a-sortable-list-editor--readonly': readonly,\n 'a-sortable-list-editor--disabled': disabled,\n 'a-sortable-list-editor--touch': isTouch,\n 'a-sortable-list-editor--drag-enabled': dragEnabled,\n 'a-sortable-list-editor--chips': chips,\n 'a-sortable-list-editor--embedded': embedded,\n 'a-sortable-list-editor--header-floating':\n !embedded && !chips && !headerHasContent && headerVisible,\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 && !embedded\">\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. -->\n <slot\n name=\"reorder-toolbar\"\n v-bind=\"toolbarSlotProps\"\n >\n <span\n v-if=\"!title\"\n class=\"a-le-reorder-mode-label\"\n >\n {{ t('common.sortable.reorderModeLabel') }}\n </span>\n <LeStatus\n :class=\"{ 'a-le-toolbar-status--pending': totalHasPendingChanges }\"\n :has-pending-changes=\"totalHasPendingChanges\"\n :pending-count=\"totalMovedCount\"\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 || !totalHasPendingChanges\"\n @click=\"applyReorder\"\n >\n {{ t('common.sortable.reorderApply') }}\n </VBtn>\n </slot>\n </template>\n <slot\n v-else-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 </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 :text=\"emptyTextResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <div\n v-else\n ref=\"rowsContainer\"\n class=\"a-sortable-list-editor__rows\"\n >\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--reorder': reorderMode,\n 'a-le-row--grabbed': keyboardNav.isGrabbed(vi.key),\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 <LeDragHandle v-if=\"dragEnabled\" />\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, vi.key) }}\n </span>\n </slot>\n <LeUnsavedLabel v-if=\"vi.unsaved\" />\n </div>\n\n <div\n v-if=\"!chips && !reorderMode\"\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-if=\"reorderMode\">\n <VBtn\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :disabled=\"!vi.canMoveUp\"\n class=\"mx-1 a-le-action a-le-action--up\"\n @click.stop=\"moveUp(vi.index)\"\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.canMoveDown\"\n class=\"mx-1 a-le-action a-le-action--down\"\n @click.stop=\"moveDown(vi.index)\"\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.canMoveUp\"\n @click.stop=\"moveTop(vi.index)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-up\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.moveToTop') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n :disabled=\"!vi.canMoveDown\"\n @click.stop=\"moveBottom(vi.index)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-arrow-collapse-down\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.moveToBottom') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"showMoveToPosition && viewItemsDecorated.length > 1\"\n @click.stop=\"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=\"showAddAfterAction && canInteract\"\n @click.stop=\"onRowAddAfterClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n <VListItem\n v-if=\"showDeleteButton && canInteract\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <template #prepend>\n <VIcon icon=\"mdi-trash-can-outline\" />\n </template>\n <VListItemTitle>\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=\"showEditButton && 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=\"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.stop=\"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\n v-if=\"vi.editing && (allowEditInReorder || !reorderMode) && $slots.item\"\n >\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 && !reorderMode\"\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=\"\n vi.expanded\n && (allowEditInReorder || !reorderMode)\n && $slots['item-readonly']\n \"\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 </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=\"viewItemsDecorated.length\"\n :current-index=\"moveToPositionTarget?.index ?? 0\"\n :item-label=\"moveToPositionLabel\"\n @confirm=\"onMoveToPositionConfirm\"\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 ASortableListEditor — reorder-mode trims, drag\n// clone styling, chips flex-wrap layout, and the validation rail.\n.a-sortable-list-editor {\n &__rows {\n display: flex;\n flex-direction: column;\n }\n\n // Reorder-mode trims the row-header padding since the drag handle already\n // eats some of the horizontal rhythm.\n .a-le-row--reorder .a-le-row-header {\n padding-left: 12px;\n padding-right: 8px;\n gap: 8px;\n }\n\n // Drag rendering — SortableJS clone + ghost + chosen source.\n .a-le-row--ghost {\n opacity: 0.35;\n background: var(--le-primary-state);\n }\n\n .a-le-row--chosen {\n opacity: 0.5;\n }\n\n // Floating clone that follows the cursor. Row-shaped card with elevation;\n // action column and status badge hidden so the preview stays clean.\n .a-le-row--drag {\n background: var(--le-surface);\n border: 1px solid var(--le-border);\n border-radius: var(--le-radius);\n box-shadow: var(--le-elev-3);\n max-width: 420px;\n opacity: 0.96;\n pointer-events: none;\n }\n\n .a-le-row--drag .a-le-actions,\n .a-le-row--drag .a-le-status {\n display: none;\n }\n\n // Reorder-mode contextual label — shown when there's no title so the user\n // sees a \"Reorder mode\" hint next to the pending-changes status. Hidden\n // when the consumer passes a title (the title already provides context).\n .a-le-reorder-mode-label {\n font: 500 13px/1 var(--v-font-body, inherit);\n color: var(--le-primary);\n margin-right: 8px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n // Floating-header variant — when the only thing in the header is the\n // Reorder button, drop the band entirely and float the button absolutely\n // over the editor's top-right corner so we don't waste ~50 px of vertical\n // rhythm on an empty bar.\n &--header-floating .a-le-card {\n position: relative;\n }\n\n &--header-floating .a-le-header {\n position: absolute;\n top: 6px;\n right: 6px;\n padding: 0;\n background: transparent;\n border: none;\n z-index: 2;\n }\n\n &--header-floating .a-le-header-actions {\n margin-left: 0;\n }\n\n // Embedded variant — this editor sits inside another editor's row. Drop\n // the card chrome (border, shadow), tighten rows, lighten background so it\n // visually reads as part of the parent's body, not a sibling list.\n &--embedded .a-le-card {\n background: transparent;\n border: none;\n box-shadow: none;\n border-radius: 0;\n }\n\n &--embedded .a-le-header {\n padding: 4px 0 6px;\n background: transparent;\n border: none;\n }\n\n &--embedded .a-le-title-heading {\n font-size: 13px;\n font-weight: 500;\n color: var(--le-on-surface-medium, rgb(0 0 0 / 70%));\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n &--embedded .a-le-row {\n background: var(--le-surface);\n border: 1px solid var(--le-border);\n border-radius: 6px;\n margin-bottom: 4px;\n }\n\n &--embedded .a-le-row:last-of-type {\n margin-bottom: 0;\n }\n\n &--embedded .a-le-row-add {\n min-height: var(--le-row-min-height);\n padding: 0 16px;\n background: transparent;\n border: 1px dashed var(--le-border);\n border-radius: 6px;\n color: var(--le-primary);\n margin-top: 4px;\n width: 100%;\n }\n\n &--embedded .a-le-row-add:hover {\n background: var(--le-primary-state);\n border-style: solid;\n }\n\n // Chips-layout variant-specific overrides — `__rows` flex-wraps into pills,\n // `row-header` gets the drag-handle-friendly 8 px left padding (vs 12 px\n // in AListEditor), `drag-handle` shrinks to match the pill height.\n &--chips &__rows {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n flex: 1 1 100%;\n }\n\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 8px;\n gap: 4px;\n min-height: 28px;\n }\n\n &--chips .a-le-drag-handle {\n padding: 0;\n font-size: 16px;\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-sortable-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 .a-le-row .a-le-action--up,\n .a-le-row .a-le-action--down {\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) => { node: NestedTreeNode<TItem> | null; parent: NestedTreeNode<TItem> | null }\n addItem: (\n data: TItem,\n hint?: PositionHint & { parentId?: ListEditorKey | null; asFirstChild?: boolean; childrenAllowed?: boolean },\n ) => NestedTree<TItem>\n deleteItem: (id: ListEditorKey) => NestedTree<TItem>\n updateItem: (id: ListEditorKey, data: TItem) => 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 }\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 = (\n siblings: NestedTreeNode<TItem>[],\n hint?: PositionHint,\n ): 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 & { parentId?: ListEditorKey | null; asFirstChild?: boolean; childrenAllowed?: boolean },\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 ? (afterParent.children as NestedTreeNode<TItem>[]) : 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): 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 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 ? (grandParent.children as NestedTreeNode<TItem>[]) : 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 = (\n arr: NestedTreeNode<TItem>[],\n depth: number,\n ): 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 =>\n 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 = (\n args: ComputeInstructionArgs,\n): 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// Recursive nested row. Renders a single row plus — when expanded — a group of\n// child rows through self-reference, so trees of arbitrary depth share a single\n// template. All presentation flags + event callbacks are passed down as the\n// `context` and `callbacks` prop bundles (avoids 20+ individual prop-drills).\n//\n// Types intentionally use `any` on the interior: the strong typing lives on the\n// public `ANestedSortableListEditor` wrapper, where generics actually matter.\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// Self-reference cast to any breaks the TypeScript circular type inference that\n// Vue's template compiler triggers when a `<script setup generic>` component\n// imports itself for recursion. The runtime behaviour is unaffected.\n\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 =>\n `--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[] =>\n 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':\n 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':\n context.keyboardNav && context.keyboardNav.isGrabbed(vi.key),\n 'a-le-row--clickable': context.isRowClickable(vi),\n 'a-le-row--drop-source':\n dragState !== null && dragState.sourceKey === vi.key,\n [`a-le-row--validation-${resolveValidation(vi.raw)}`]:\n 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=\"\n vi.childrenExpanded ? t('common.sortable.close') : t('common.sortable.edit')\n \"\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)\n || 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=\"vi.expanded && !context.reorderMode && $slots['item-readonly']\"\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\n ? props.calculateSubtreeDepth(sourceNode.value)\n : 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 { useDisplay } from 'vuetify'\nimport { useContainerWidth } from '@/labs/listEditor/composables/useContainerWidth'\nimport { useKeyboardNav } from '@/labs/listEditor/composables/useKeyboardNav'\nimport { useValidationRegistry } from '@/labs/listEditor/composables/useValidationRegistry'\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 { 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// Public slot surface. Same general shape as the flat sortable variant but\n// row-level slots also carry depth/parent/childrenAllowed/firstInParent etc.\n// from the nested decorator, plus the actions bundle gains addChild,\n// toggleDetail, indent, outdent. Hoisted to top-level so vite-plugin-dts can\n// include them in the .d.ts.\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?: (\n item: TItem,\n key: ListEditorKey,\n index: number,\n ) => ListEditorValidationState\n\n addLabel?: string | null\n emptyTitle?: string | null\n emptyText?: 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\nconst props = withDefaults(defineProps<Props<TItem>>(), {\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 emptyText: 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 display = useDisplay()\nconst { showWarningT } = useAlerts()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(rootEl)\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\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\n// Tree-level expand/collapse — controls which descendants are visible in the flat\n// viewItems list. Auto-populated at mount for every node that has children.\nconst childrenExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n// Row-level readonly detail visibility — used in readonly mode with #item-readonly slot.\n// Independent of children expansion, so a node can have its subtree visible while its\n// own detail body is collapsed, and vice versa.\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// One-shot init at setup time — subsequent expansions are user-driven.\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// Dirty baseline — compares content (title, user-editable fields) against the\n// initial snapshot. `position` and `parent` are deliberately stripped out:\n// drag-drop rewrites those on side-effect rows (siblings shifted to keep the\n// position sequence consistent), and flagging those unmoved rows as dirty\n// would produce ghost \"unsaved\" markers everywhere. The consumer saves the\n// whole tree on apply anyway — we only care about the per-row visual cue.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { captureDirtyBaseline, rebaselineKey, isItemDirty } = 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] },\n)\n\n// Reorder snapshot — captures the tree at reorder-start so we can restore it\n// on cancel. Dirty/moved detection does NOT derive from the snapshot: we\n// used to compare each row's current parent + sibling-index against snapshot\n// values, which flagged unmoved rows as \"moved\" whenever a neighbour shifted\n// sibling positions as a side-effect. Instead we track explicit user actions\n// in `movedKeys` below — only rows the user actively moved get marked.\nconst snapshot = shallowRef<NestedTree<TItem> | null>(null)\n// Keys the user has actively moved during this reorder session (drag, arrow\n// buttons, indent/outdent). Clearing this set is paired with\n// captureDirtyBaseline in the exposed resetDirtyBaseline cycle — consumers\n// expect the orange badges to go away once a server save confirms.\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst resetDirtyBaseline = () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n}\n// Mark the row AND every descendant. Moving a parent visually carries its\n// whole subtree to the new location, so the children are \"moved\" too from\n// the user's perspective — even though they stayed in place relative to\n// their parent. Without this, only the grabbed parent would light up orange\n// and its descendants would silently travel along, which reads as missing\n// feedback when nested trees are moved around.\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// Decoupled dirty pass — see AListEditor for rationale. Walk the tree once\n// to collect every dirty key; viewItemsDecorated then reads dirtyKeys.has()\n// instead of calling isItemDirty inline so flag-only re-renders skip the\n// stringify pass.\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\n// Per-key decorator cache — see AListEditor for rationale. The base view item\n// for nested already carries a lot of stable shape info (parent, depth,\n// childrenCount, sibling-position flags, *Allowed); we only need to invalidate\n// when those, or any per-row flag, changes.\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 = movedKeys.value.has(vi.key)\n const dirty = 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(\n () => !!(slots as Record<string, unknown>)['item-readonly'],\n)\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 restoreSnapshot: (key, data) => editor.updateItem(key, data),\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 modelValue.value = m\n },\n canEnterReorder,\n onEnter: () => {\n clearEditing()\n // Expand every branch so the user can see (and reach) every row before\n // picking something to drag — otherwise collapsed subtrees would be invisible\n // reorder 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(\n () => reorderMode.value && !isTouch.value && !props.disableDrag,\n)\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst emptyTextResolved = computed(() => props.emptyText ?? t('common.sortable.emptyText'))\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\n && props.showReorderToggle\n && !reorderMode.value\n && totalItemCount.value > 0,\n)\n\nconst compactReorderButton = computed<boolean>(\n (): boolean => !!props.title && isNarrow.value,\n)\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 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<Array<{ stop: () => void; option?: (k: string, v: unknown) => void }>>(\n [],\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(\n ':scope > .a-le-row',\n ) 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(\n rowsContainer.value.querySelectorAll<HTMLElement>('.' + GROUP_CLASS),\n )\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 const n = stringToInt(raw)\n if (n > 0) return n\n // Fallback to string keys (DocId)\n return 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>(\n ':scope > .a-le-row',\n )\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'\n ? rowRect.top - containerRect.top\n : 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>(\n ':scope > .a-le-row',\n )\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 if (props.readonly && hasReadonlyDetail.value) 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 editor.deleteItem(vi.key)\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, key: ListEditorKey): string =>\n resolveCompactTextUtil(raw, key, {\n compactField: props.compactField,\n fallback: t('common.sortable.itemFallback'),\n })\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: () => { const vi = findVi(key); if (vi) onEditClick(vi) },\n save: () => { const vi = findVi(key); if (vi) return onSaveClick(vi) },\n cancel: () => { const vi = findVi(key); if (vi) onCancelClick(vi) },\n close: () => { const vi = findVi(key); if (vi) onCloseClick(vi) },\n delete: async () => { const vi = findVi(key); if (vi) await onDeleteClick(vi) },\n addAfter: () => { const vi = findVi(key); if (vi) onRowAddAfterClick(vi) },\n addChild: () => { const vi = findVi(key); if (vi) onAddChildClick(vi) },\n toggleExpand: () => { const vi = findVi(key); if (vi) onChevronClick(vi) },\n toggleDetail: () => { const vi = findVi(key); if (vi) onDetailToggle(vi) },\n moveUp: () => moveUp(key),\n moveDown: () => moveDown(key),\n moveTop: () => moveTop(key),\n moveBottom: () => moveBottom(key),\n indent: () => { const vi = findVi(key); if (vi) doIndent(vi) },\n outdent: () => { const vi = findVi(key); if (vi) doOutdent(vi) },\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(\n (s) => (s.data[props.keyField] as ListEditorKey) === target.key,\n )\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\n ? resolveCompactText(moveToPositionTarget.value.raw, moveToPositionTarget.value.key)\n : '',\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 = (\n parentId: ListEditorKey | null,\n position: 'first' | 'last',\n) => {\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 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(() =>\n viewItemsDecorated.value.filter((v) => v.parentKey === null),\n)\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 = (\n targetId: ListEditorKey | null,\n data: TItem,\n childrenAllowed: boolean,\n) => {\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 = (\n targetId: ListEditorKey,\n data: TItem,\n childrenAllowed: boolean,\n) => {\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\nconst { hasUnsavedChanges, unsavedCount, clearUnsavedState } = useUnsavedKeysSync({\n unsavedKeysModel,\n internalUnsavedKeys,\n onClearAll: () => {\n captureDirtyBaseline()\n movedKeys.value = new Set()\n },\n onClearKey: (key) => {\n rebaselineKey(key)\n movedKeys.value.delete(key)\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\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=\"\n allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\n \"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"\n allExpanded\n ? t('common.sortable.collapseAll')\n : 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\n ? t('common.sortable.collapseAll')\n : 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 :text=\"emptyTextResolved\"\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: background 0.15s, 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\nwithDefaults(defineProps<Props>(), {\n title: undefined,\n body: undefined,\n stayLabel: undefined,\n discardLabel: undefined,\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 {{ body ?? t('common.sortable.unsavedChanges.body') }}\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=\"elevated\"\n @click=\"onDiscard\"\n >\n {{ discardLabel ?? t('common.sortable.unsavedChanges.discard') }}\n </VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","import { computed, getCurrentInstance, onBeforeUnmount, ref, watch, type ComputedRef, type Ref } from 'vue'\nimport { onBeforeRouteLeave } from 'vue-router'\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\nexport interface UseUnsavedChangesGuardApi {\n hasUnsavedChanges: ComputedRef<boolean>\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 const hasUnsavedChanges = computed<boolean>(() =>\n options.sources.some((s) => isTruthySource(s.value)),\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 promptOpen,\n resolvePrompt,\n acknowledge,\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 */\nexport function useNestedUnsavedKeys(): UseNestedUnsavedKeysApi {\n const byParent: Ref<Map<ListEditorKey, Set<ListEditorKey>>> = ref(\n new Map(),\n )\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 = (\n parentKey: ListEditorKey,\n set: Set<ListEditorKey>,\n ) => {\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":["props","__props","emit","__emit","modelValue","_useModel","pagination","inject","DatatablePaginationKey","isUndefined","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","_createBlock","_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","filterData","filterConfig","sortBy","sortDesc","batchSize","forceElastic","searchApi","usePagination","results","generateListQuery","resData","isApiInfiniteResponseList","nextPageData","isApiResponseList","promises","numPages","i","pageCopy","paginationRef","ref","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","submitFilter","useFilterHelpers","showErrorsDefault","useAlerts","onOpen","resetState","getListDebounced","sortByChange","onFetchNextPage","e","getList","useDebounceFn","event","eventTarget","parent","firstTd","input","dialogLocal","dialog","paginationComputed","toRaw","mdAndDown","useDisplay","sidebarLeft","closeSidebarOnMobile","provide","SubjectSelectCloseSidebarKey","selectedItemsCount","disabledSubmit","toggleSidebar","onClose","onConfirm","fetchNextPage","onPageChange","hasNextPage","autoloadOnIntersect","isIntersecting","__expose","_renderSlot","_ctx","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","useKeyboardNav","focusedKey","grabbedKey","orderedKeys","v","isFocused","key","isGrabbed","grabbedIndex","totalCount","rowTabindex","ordered","focusRowElement","setFocus","prevOrderedKeys","now","oldIndex","fallbackIndex","releaseGrab","isFormField","target","handleKeydown","focusedItem","inReorder","isGrabbedNow","grabbedSomewhere","onFormField","ListEditorValidationKey","useListEditorItemValidation","registry","getCurrentInstance","stateRef","lastKey","onBeforeUnmount","isValidState","useValidationRegistry","itemValidationStates","reactive","state","raw","index","fromRegistry","fromProp","useListEditor","model","keyField","positionField","positionMultiplier","updatePositionEnabled","viewItems","recalculatePositions","idx","newPosition","finalize","arr","result","isItem","value","resolveIndexByKey","x","resolveIndex","idOrItem","resolveInsertIndex","hint","positionHint","insertIndex","fromIndex","toIndex","len","el","resolveCompactText","pick","fromField","setsEqual","a","b","k","useUnsavedKeysSync","suppressNextModelWatch","hasUnsavedChanges","unsavedCount","useDirtyBaseline","getEntries","excludeFields","hasExcludes","excludeSet","stringifyContent","copy","dirtyBaseline","captureDirtyBaseline","next","rebaselineKey","entry","isItemDirty","baseline","useDeleteDialog","deleteDialog","deleteTarget","deleteInFlight","deleteError","performDelete","vi","useInlineEditing","editingKeys","editingSnapshots","pendingAutoOpen","clearEditing","beginEdit","cloneDeep","cancelEdit","snap","commitEdit","closeEdit","requestAutoOpen","newKeys","oldKeys","oldSet","addedKey","nextTick","open","_component_VCardTitle","_component_VCardText","_component_VAlert","_component_VCardActions","$emit","slots","useSlots","display","rootEl","useTemplateRef","isTouch","editor","expandedKeys","rowsContainer","isInlineEdit","hasReadonlyDetail","it","hit","addLabelResolved","emptyTitleResolved","emptyTextResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","canInteract","canAdd","headerVisible","showInlineSaveFooter","dirtyKeys","out","decoratorCache","viewItemsDecorated","liveKeys","editing","expanded","dirty","cached","decorated","isEmpty","findVi","keyboardNav","resolveCompactTextUtil","resolveValidation","onAddClick","onRowAddAfterClick","onEditClick","onCloseClick","onExpandClick","currentlyExpanded","isRowClickable","onRowClick","triggerDeleteClick","onDeleteDialogConfirm","onDeleteDialogCancel","onDeleteClick","onSaveClick","onCancelClick","actionsCache","getActions","actions","buildSlotProps","unsavedKeysModel","internalUnsavedKeys","clearUnsavedState","_component_VProgressCircular","LeEmptyState","LeUnsavedLabel","_hoisted_10","_hoisted_11","_hoisted_12","_withModifiers","$slots","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","LeDeleteDialog","_hoisted_18","useContainerWidth","threshold","width","useElementSize","isNarrow","SharedReorderRegistryKey","useReorderMode","applying","applyError","reorderMode","movedCount","hasPendingChanges","clonePayload","isEmbedded","enterReorderMode","cancelReorderMode","applyReorder","payload","newMode","oldMode","targetPosition","totalLabel","isInvalid","newIndex","onCancel","_component_VTextField","DRAG_GHOST_CLASS","DRAG_CHOSEN_CLASS","DRAG_CLASS","mode","movedKeys","resetDirtyBaseline","snapshot","shallowRef","canEnterReorder","embeddedRef","allowEditInReorderRef","m","childContributions","shallowReactive","count","hasChanges","totalMovedCount","sum","c","totalHasPendingChanges","dragEnabled","reorderToggleVisible","compactReorderButton","headerHasContent","markMoved","total","moved","unsaved","canMoveUp","canMoveDown","moveUp","moveDown","moveTop","moveBottom","moveToPositionDialogOpen","moveToPositionTarget","moveToPositionLabel","openMoveToPosition","onMoveToPositionConfirm","sortable","useSortable","n","stringToInt","enabled","keyAtIndex","toolbarSlotProps","reorderToggleSlotProps","_normalizeProps","LeStatus","LeDragHandle","_hoisted_19","_hoisted_20","LeMoveToPositionDialog","_hoisted_21","DEFAULT_KEY_FIELD","DEFAULT_POSITION_FIELD","DEFAULT_PARENT_FIELD","useNestedListEditor","parentField","maxDepth","getKey","calculateSubtreeDepth","node","max","child","d","findNode","recalculateSiblings","siblings","pos","sibling","recalculateAll","tree","walk","cloned","buildViewItems","flat","flatIndex","nodes","depth","parentNode","childrenAllowed","hasChildren","childrenCount","isExpanded","remainingDepth","canAddChild","canOutdent","canIndent","insertAfter","afterIdx","newNode","s","addItem","targetSiblings","afterNode","afterParent","insertIdx","deleteItem","updateItem","swapSiblings","getTargetIndex","removed","_s","indent","prev","subtreeDepth","calculateParentDepth","outdent","grandParent","grandSiblings","parentIdx","currentSiblings","targetParentId","targetIndex","isDescendant","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","_guardReactiveProps","_withCtx","slotScope","selectedKey","placement","descendantKeys","collect","sub","sourceNode","find","currentParentKey","parentKey","candidates","disallowed","reason","validCandidates","selectedCandidate","showPlacementPicker","onCandidateClick","reasonLabel","_component_VRadioGroup","_component_VRadio","INDENT_PX","ANCHOR_X","showWarningT","effectiveCloseVariant","childrenExpandedKeys","detailExpandedKeys","childrenExpanded","totalItemCount","keys","expandableKeys","initSortables","destroySortables","allExpanded","expandAllVisible","toggleExpandAll","sortableInstances","forceRerender","dragState","hitTestRow","clientX","clientY","wrapper","parseKey","recomputeInstruction","containerRect","rowRect","onPointerMove","applyInstruction","inst","groups","group","draggedEl","draggedNode","orig","tev","overlayVisual","refWrapper","rowEl","lineLeft","lineTop","line","connector","levelWrapper","levelRect","levelCentreY","onAddChildClick","onChevronClick","currently","onDetailToggle","doIndent","doOutdent","expandableKeySet","moveToPositionContext","ctx","changeParentDialogOpen","changeParentTarget","openChangeParent","onChangeParentConfirm","parentId","position","siblingCount","rowContext","rowCallbacks","rootViewItems","addAfterId","targetId","addChildToId","removeById","updateData","_children","_position","_markUnsaved","LeChangeParentDialog","onStay","onDiscard","isTruthySource","resolveBool","fallback","useUnsavedChangesGuard","promptOpen","pendingResolver","acknowledgedOnce","askToLeave","resolve","resolvePrompt","discard","acknowledge","onBeforeRouteLeave","onBeforeUnload","dialogModel","suppressNext","useNestedUnsavedKeys","byParent","empty","getForParent","setForParent","set","merged","childKey"],"mappings":"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"}