sanity 6.9.2-next.21 → 6.9.2-next.22
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/lib/{AddonDatasetProvider-B5npf4J4.js → AddonDatasetProvider-CfAw3oMr.js} +2 -2
- package/lib/{AddonDatasetProvider-B5npf4J4.js.map → AddonDatasetProvider-CfAw3oMr.js.map} +1 -1
- package/lib/{CalendarFilter-DYJEZDCP.js → CalendarFilter-OHGevGRx.js} +3 -3
- package/lib/{CalendarFilter-DYJEZDCP.js.map → CalendarFilter-OHGevGRx.js.map} +1 -1
- package/lib/{CommentsDocumentLayout-CTL7lt6a.js → CommentsDocumentLayout-p8p-oNuH.js} +2 -2
- package/lib/{CommentsDocumentLayout-CTL7lt6a.js.map → CommentsDocumentLayout-p8p-oNuH.js.map} +1 -1
- package/lib/{CommentsField-BE_CI2SY.js → CommentsField-CqXs722Y.js} +3 -3
- package/lib/{CommentsField-BE_CI2SY.js.map → CommentsField-CqXs722Y.js.map} +1 -1
- package/lib/{CommentsInput-D_EM-t5a.js → CommentsInput-B3rd8HlF.js} +5 -5
- package/lib/{CommentsInput-D_EM-t5a.js.map → CommentsInput-B3rd8HlF.js.map} +1 -1
- package/lib/{CommentsInspector-DtBIUadl.js → CommentsInspector-DTHmjTFc.js} +5 -5
- package/lib/{CommentsInspector-DtBIUadl.js.map → CommentsInspector-DTHmjTFc.js.map} +1 -1
- package/lib/{CommentsListItem-BFRqZMJ6.js → CommentsListItem-C2Ac0esL.js} +3 -3
- package/lib/{CommentsListItem-BFRqZMJ6.js.map → CommentsListItem-C2Ac0esL.js.map} +1 -1
- package/lib/{CommentsSelectedPathProvider-CIKpHpK3.js → CommentsSelectedPathProvider-DwDw8s-s.js} +3 -3
- package/lib/{CommentsSelectedPathProvider-CIKpHpK3.js.map → CommentsSelectedPathProvider-DwDw8s-s.js.map} +1 -1
- package/lib/{CommentsStudioLayout-Dx0jIDle.js → CommentsStudioLayout-e2hCA_5z.js} +4 -4
- package/lib/{CommentsStudioLayout-Dx0jIDle.js.map → CommentsStudioLayout-e2hCA_5z.js.map} +1 -1
- package/lib/{ReleasesMetadataProvider-hILX90V4.js → ReleasesMetadataProvider-BWsmHWkh.js} +2 -2
- package/lib/{ReleasesMetadataProvider-hILX90V4.js.map → ReleasesMetadataProvider-BWsmHWkh.js.map} +1 -1
- package/lib/{ReleasesNav-DIv-1iR7.js → ReleasesNav-DPSjEs29.js} +14 -14
- package/lib/{ReleasesNav-DIv-1iR7.js.map → ReleasesNav-DPSjEs29.js.map} +1 -1
- package/lib/{ReleasesStudioLayout-DW7fJSfG.js → ReleasesStudioLayout-CtyE88nI.js} +8 -8
- package/lib/{ReleasesStudioLayout-DW7fJSfG.js.map → ReleasesStudioLayout-CtyE88nI.js.map} +1 -1
- package/lib/{ReleasesTool-BQjO7osC.js → ReleasesTool-BjbRMZlc.js} +15 -15
- package/lib/{ReleasesTool-BQjO7osC.js.map → ReleasesTool-BjbRMZlc.js.map} +1 -1
- package/lib/{SchedulePublishingStudioLayout-Cwmdz7HZ.js → SchedulePublishingStudioLayout-gZWH97ZL.js} +3 -3
- package/lib/{SchedulePublishingStudioLayout-Cwmdz7HZ.js.map → SchedulePublishingStudioLayout-gZWH97ZL.js.map} +1 -1
- package/lib/{SchedulePublishingUpsellProvider-C5B21VDh.js → SchedulePublishingUpsellProvider-DsI8OUg-.js} +2 -2
- package/lib/{SchedulePublishingUpsellProvider-C5B21VDh.js.map → SchedulePublishingUpsellProvider-DsI8OUg-.js.map} +1 -1
- package/lib/{ScheduledPublishingEnabledProvider-BNMAVqrS.js → ScheduledPublishingEnabledProvider-BDRtV8OB.js} +3 -3
- package/lib/{ScheduledPublishingEnabledProvider-BNMAVqrS.js.map → ScheduledPublishingEnabledProvider-BDRtV8OB.js.map} +1 -1
- package/lib/{SearchProvider-DkGUk8a6.js → SearchProvider-Hk7IMQqR.js} +4 -4
- package/lib/{SearchProvider-DkGUk8a6.js.map → SearchProvider-Hk7IMQqR.js.map} +1 -1
- package/lib/{SingleDocReleaseLayout-fW8U-ktp.js → SingleDocReleaseLayout-evCp37zs.js} +2 -2
- package/lib/{SingleDocReleaseLayout-fW8U-ktp.js.map → SingleDocReleaseLayout-evCp37zs.js.map} +1 -1
- package/lib/{SingleDocReleaseUpsellProvider-BNF2Rj3j.js → SingleDocReleaseUpsellProvider-BOe2BACb.js} +4 -4
- package/lib/{SingleDocReleaseUpsellProvider-BNF2Rj3j.js.map → SingleDocReleaseUpsellProvider-BOe2BACb.js.map} +1 -1
- package/lib/{TasksStudioActiveToolLayout-CHazNA61.js → TasksStudioActiveToolLayout-Dbs-1GX6.js} +11 -11
- package/lib/{TasksStudioActiveToolLayout-CHazNA61.js.map → TasksStudioActiveToolLayout-Dbs-1GX6.js.map} +1 -1
- package/lib/{TasksStudioLayout-B7bCL28Q.js → TasksStudioLayout-Pn-RwtPi.js} +5 -5
- package/lib/{TasksStudioLayout-B7bCL28Q.js.map → TasksStudioLayout-Pn-RwtPi.js.map} +1 -1
- package/lib/{Tool-rkq_tjXo.js → Tool-D4-WLZtb.js} +12 -12
- package/lib/{Tool-rkq_tjXo.js.map → Tool-D4-WLZtb.js.map} +1 -1
- package/lib/{UnpublishVersionDialog-DWYCXGkz.js → UnpublishVersionDialog-DmFHVqhI.js} +4 -4
- package/lib/{UnpublishVersionDialog-DWYCXGkz.js.map → UnpublishVersionDialog-DmFHVqhI.js.map} +1 -1
- package/lib/{UpsellDialog-BiDSVmne.js → UpsellDialog-DRhOCOce.js} +2 -2
- package/lib/{UpsellDialog-BiDSVmne.js.map → UpsellDialog-DRhOCOce.js.map} +1 -1
- package/lib/{VariantsStudioNavbar-Bae9LOIN.js → VariantsStudioNavbar-CXpr7UUl.js} +7 -7
- package/lib/{VariantsStudioNavbar-Bae9LOIN.js.map → VariantsStudioNavbar-CXpr7UUl.js.map} +1 -1
- package/lib/{VariantsTool-E4ptTHik.js → VariantsTool-BCtrSWfP.js} +7 -7
- package/lib/{VariantsTool-E4ptTHik.js.map → VariantsTool-BCtrSWfP.js.map} +1 -1
- package/lib/{WorkspaceLoader-sdFQ9rkh.js → WorkspaceLoader-_w6NnbDb.js} +21 -21
- package/lib/{WorkspaceLoader-sdFQ9rkh.js.map → WorkspaceLoader-_w6NnbDb.js.map} +1 -1
- package/lib/_createContext.js +1 -1
- package/lib/{buildTextSelectionFromFragment-CuXpitEZ.js → buildTextSelectionFromFragment-Egmw5rNs.js} +3 -3
- package/lib/{buildTextSelectionFromFragment-CuXpitEZ.js.map → buildTextSelectionFromFragment-Egmw5rNs.js.map} +1 -1
- package/lib/{datastores-XTDIa3jc.js → datastores-DpJ5Y313.js} +2 -2
- package/lib/{datastores-XTDIa3jc.js.map → datastores-DpJ5Y313.js.map} +1 -1
- package/lib/index.js +28 -28
- package/lib/{inputResolver-DLP8YZcM.js → inputResolver-BX-VuloN.js} +4 -4
- package/lib/{inputResolver-DLP8YZcM.js.map → inputResolver-BX-VuloN.js.map} +1 -1
- package/lib/{navigation.telemetry-4pppJENG.js → navigation.telemetry-VbqjOek0.js} +7 -7
- package/lib/{navigation.telemetry-4pppJENG.js.map → navigation.telemetry-VbqjOek0.js.map} +1 -1
- package/lib/{plugin-BmARoHKH.js → plugin-DGOEvpWT.js} +4 -4
- package/lib/{plugin-BmARoHKH.js.map → plugin-DGOEvpWT.js.map} +1 -1
- package/lib/{plugin-BUox1zeI.js → plugin-Da_fKb0U.js} +3 -3
- package/lib/{plugin-BUox1zeI.js.map → plugin-Da_fKb0U.js.map} +1 -1
- package/lib/{plugin-CjN39wwt.js → plugin-DqqaZdOH.js} +5 -5
- package/lib/{plugin-CjN39wwt.js.map → plugin-DqqaZdOH.js.map} +1 -1
- package/lib/{plugin-BRnqEpCl.js → plugin-qHXYpO99.js} +6 -6
- package/lib/{plugin-BRnqEpCl.js.map → plugin-qHXYpO99.js.map} +1 -1
- package/lib/{scheduleItem-Dtb26ejO.js → scheduleItem-DcC1HE9G.js} +8 -8
- package/lib/{scheduleItem-Dtb26ejO.js.map → scheduleItem-DcC1HE9G.js.map} +1 -1
- package/lib/{schedules-6qsR7E_I.js → schedules-CbnXaXM9.js} +3 -3
- package/lib/{schedules-6qsR7E_I.js.map → schedules-CbnXaXM9.js.map} +1 -1
- package/lib/{searchDocumentRelease-CUk7BiST.js → searchDocumentRelease-C5sClmGF.js} +4 -4
- package/lib/{searchDocumentRelease-CUk7BiST.js.map → searchDocumentRelease-C5sClmGF.js.map} +1 -1
- package/lib/{studioClient-D1Z2zK3C.js → studioClient-CwMJwOTd.js} +2 -2
- package/lib/{studioClient-D1Z2zK3C.js.map → studioClient-CwMJwOTd.js.map} +1 -1
- package/lib/{useBundleDocuments-BnCBcbdJ.js → useBundleDocuments-DvVAF6cf.js} +7 -7
- package/lib/{useBundleDocuments-BnCBcbdJ.js.map → useBundleDocuments-DvVAF6cf.js.map} +1 -1
- package/lib/{useComments-Bm-0CwNH.js → useComments-DuEOnDkA.js} +2 -2
- package/lib/{useComments-Bm-0CwNH.js.map → useComments-DuEOnDkA.js.map} +1 -1
- package/lib/{useCommentsTelemetry-D1kYRuPU.js → useCommentsTelemetry-BgNdQdz5.js} +3 -3
- package/lib/{useCommentsTelemetry-D1kYRuPU.js.map → useCommentsTelemetry-BgNdQdz5.js.map} +1 -1
- package/lib/{useDocumentPreviewValues-DJvES8Wi.js → useDocumentPreviewValues-B1zNjl_D.js} +3 -3
- package/lib/{useDocumentPreviewValues-DJvES8Wi.js.map → useDocumentPreviewValues-B1zNjl_D.js.map} +1 -1
- package/lib/{useFeatureEnabled-g8eZoiLM.js → useFeatureEnabled-4qCpV_mX.js} +2 -2
- package/lib/{useFeatureEnabled-g8eZoiLM.js.map → useFeatureEnabled-4qCpV_mX.js.map} +1 -1
- package/lib/{useFieldActions-BV_qfe65.js → useFieldActions-uDe2qh98.js} +2 -2
- package/lib/{useFieldActions-BV_qfe65.js.map → useFieldActions-uDe2qh98.js.map} +1 -1
- package/lib/{useReleasesToolAvailable-Duu10qV0.js → useReleasesToolAvailable-DDuNc6HV.js} +3 -3
- package/lib/{useReleasesToolAvailable-Duu10qV0.js.map → useReleasesToolAvailable-DDuNc6HV.js.map} +1 -1
- package/lib/{useScheduledDraftMenuActions-Byiy3-k3.js → useScheduledDraftMenuActions-DqkHlC0c.js} +5 -5
- package/lib/{useScheduledDraftMenuActions-Byiy3-k3.js.map → useScheduledDraftMenuActions-DqkHlC0c.js.map} +1 -1
- package/lib/{useStudioUrl-BEb30_UK.js → useStudioUrl-B4w58A2i.js} +5 -5
- package/lib/{useStudioUrl-BEb30_UK.js.map → useStudioUrl-B4w58A2i.js.map} +1 -1
- package/lib/{useTimeZone-zs0ybzXu.js → useTimeZone-8Wd1UR4j.js} +2 -2
- package/lib/{useTimeZone-zs0ybzXu.js.map → useTimeZone-8Wd1UR4j.js.map} +1 -1
- package/lib/{validationUtils-LdwtMTh5.js → validationUtils-Cuk0jhWJ.js} +4 -4
- package/lib/{validationUtils-LdwtMTh5.js.map → validationUtils-Cuk0jhWJ.js.map} +1 -1
- package/lib/{version-XEmBTnIh.js → version-BVcB_xWL.js} +2 -2
- package/lib/{version-XEmBTnIh.js.map → version-BVcB_xWL.js.map} +1 -1
- package/package.json +10 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as useTimeZone } from "./useTimeZone-
|
|
2
|
-
import { o as sortByExecuteDate, s as getLastExecuteDate } from "./validationUtils-
|
|
1
|
+
import { t as useTimeZone } from "./useTimeZone-8Wd1UR4j.js";
|
|
2
|
+
import { o as sortByExecuteDate, s as getLastExecuteDate } from "./validationUtils-Cuk0jhWJ.js";
|
|
3
3
|
import { useContext, useState } from "react";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -55,4 +55,4 @@ function useSchedules() {
|
|
|
55
55
|
}
|
|
56
56
|
export { SchedulesProvider as n, useSchedules as r, SchedulesContext as t };
|
|
57
57
|
|
|
58
|
-
//# sourceMappingURL=schedules-
|
|
58
|
+
//# sourceMappingURL=schedules-CbnXaXM9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules-
|
|
1
|
+
{"version":3,"file":"schedules-CbnXaXM9.js","names":["isSameDay","ReactNode","useCallback","useContext","useMemo","useState","SchedulesContext","useTimeZone","Schedule","ScheduleSort","ScheduleState","getLastExecuteDate","sortByExecuteDate","EMPTY_SCHEDULE","SchedulesProvider","t0","$","_c","children","value","sortBy","setSortBy","t1","Symbol","for","type","utcToCurrentZoneDate","t2","wallDate","schedule","executeDate","scheduleDate","Date","zonedScheduleDate","filterByDate","filterByState","_temp","t3","scheduleState","schedules","selectedDate","filter","scheduleState_0","sort","a","b","reverseOrder","activeSchedules","t4","wallDate_0","schedulesByDate","t5","t6","context","t7","schedule_0","state","useSchedules","undefined","Error"],"sources":["../src/core/scheduled-publishing/tool/contexts/schedules.tsx"],"sourcesContent":["import {isSameDay} from 'date-fns/isSameDay'\nimport {type ReactNode, useCallback, useContext, useMemo, useState} from 'react'\nimport {SchedulesContext} from 'sanity/_singletons'\n\nimport {useTimeZone} from '../../../hooks/useTimeZone'\nimport {type Schedule, type ScheduleSort, type ScheduleState} from '../../types'\nimport {getLastExecuteDate} from '../../utils/scheduleUtils'\nimport {sortByExecuteDate} from '../../utils/sortByExecuteDate'\n\n// re-exported here so the public entry can surface the context without\n// depending on sanity/_singletons directly (boundaries policy)\n// oxlint-disable-next-line no-deprecated -- will fix in follow up PR\nexport {SchedulesContext}\n\nconst EMPTY_SCHEDULE: Schedule[] = []\n\nfunction SchedulesProvider({\n children,\n value,\n}: {\n children: ReactNode\n value: {\n schedules: Schedule[]\n scheduleState: ScheduleState\n selectedDate?: Date\n sortBy?: ScheduleSort\n }\n}) {\n const [sortBy, setSortBy] = useState<ScheduleSort>(value.sortBy || 'executeAt')\n const {utcToCurrentZoneDate} = useTimeZone({type: 'scheduledPublishing'})\n\n const filterByDate = useCallback(\n (wallDate: Date) => {\n return function (schedule: Schedule) {\n const executeDate = getLastExecuteDate(schedule)\n if (!executeDate) {\n return false\n }\n const scheduleDate = new Date(executeDate) // UTC\n const zonedScheduleDate = utcToCurrentZoneDate(scheduleDate)\n return isSameDay(zonedScheduleDate, wallDate)\n }\n },\n [utcToCurrentZoneDate],\n )\n\n const filterByState = useCallback((scheduleState: ScheduleState) => {\n return function (schedule: Schedule) {\n return schedule.state === scheduleState\n }\n }, [])\n\n /**\n * Return all schedules if no date is currently selected, otherwise return all schedules for the\n * selected calendar date.\n *\n * By default, all schedules are displayed in reverse chronlogical order\n * except when filtering by upcoming schedules, or a date has been selected in the calendar.\n *\n * If a schedule as an `executedAt` date, sort by that instead.\n * This is because schedules may have differing values for `executeAt` and `executedAt` if\n * they've been force-published ahead of time, and we only care about the final execution date.\n *\n * Schedules with a null value for `executeAt` (possible if created externally via the Scheduling API)\n * should always be placed after all other results.\n */\n const activeSchedules = useMemo(() => {\n return (\n value.schedules\n .filter((scheduleState) => {\n if (value.selectedDate) {\n return filterByDate(value.selectedDate)(scheduleState)\n }\n return filterByState(value.scheduleState)(scheduleState)\n })\n .sort((a, b) => {\n if (sortBy === 'createdAt') {\n return a[sortBy] < b[sortBy] ? 1 : -1\n }\n if (sortBy === 'executeAt') {\n const reverseOrder = !(value.scheduleState === 'scheduled' || value.selectedDate)\n return sortByExecuteDate({reverseOrder})(a, b)\n }\n return 1\n }) || []\n )\n }, [\n filterByState,\n value.schedules,\n value.scheduleState,\n value.selectedDate,\n sortBy,\n filterByDate,\n ])\n\n /**\n * Return all matching schedules with specified date (in clock time).\n *\n * Scheduled are sorted chronologically by executed + execute date.\n *\n * Schedules with a null value for `executeAt` (possible if created externally via the Scheduling API)\n * should always be placed after all other results.\n */\n const schedulesByDate = useCallback(\n (wallDate: Date) => {\n return value.schedules\n .filter(filterByDate(wallDate)) //\n .sort(sortByExecuteDate())\n },\n [value.schedules, filterByDate],\n )\n\n const context = useMemo(\n () => ({\n activeSchedules,\n schedules: value.schedules || EMPTY_SCHEDULE,\n schedulesByDate,\n scheduleState: value.scheduleState,\n selectedDate: value.selectedDate,\n setSortBy,\n sortBy,\n }),\n [\n activeSchedules,\n schedulesByDate,\n sortBy,\n value.scheduleState,\n value.schedules,\n value.selectedDate,\n ],\n )\n\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n return <SchedulesContext.Provider value={context}>{children}</SchedulesContext.Provider>\n}\n\nfunction useSchedules() {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const context = useContext(SchedulesContext)\n if (context === undefined) {\n throw new Error('useSchedules must be used within a SchedulesProvider')\n }\n return context\n}\n\nexport {SchedulesProvider, useSchedules}\n"],"mappings":";;;;;;;AAcA,MAAMa,iBAA6B,CAAA;AAEnC,SAAAC,kBAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAA2B,EAAAC,UAAAC,UAAAJ,IAYzB,CAAAK,QAAAC,aAA4BhB,SAAuBc,MAAKC,UAAL,WAA2B,GAACE;CAAA,AAAAN,EAAA,OAAAO,OAAAC,IAAA,2BAAA,KACpCF,KAAA,EAAAG,MAAO,sBAAqB,GAACT,EAAA,KAAAM,MAAAA,KAAAN,EAAA;CAAxE,IAAA,EAAAU,yBAA+BnB,YAAYe,EAA6B,GAACK;CAAA,AAAAX,EAAA,OAAAU,uBAatEC,KAAAX,EAAA,MAVDW,MAAAC,aACS,SAAAC,UAAA;EACL,IAAAC,cAAoBnB,mBAAmBkB,QAAQ;EAC/C,IAAI,CAACC,aAAW,OACP;EAET,IAAAC,eAAqB,IAAIC,KAAKF,WAAW,GACzCG,oBAA0BP,qBAAqBK,YAAY;EAAC,OACrD/B,UAAUiC,mBAAmBL,QAAQ;CAAC,GAEhDZ,EAAA,KAAAU,sBAAAV,EAAA,KAAAW;CAXH,IAAAO,eAAqBP,IAerBQ,gBAAsBC,OAIhBC;CAAA,AAAArB,EAAA,OAAAkB,gBAAAlB,EAAA,OAAAI,UAAAJ,EAAA,OAAAG,MAAAmB,iBAAAtB,EAAA,OAAAG,MAAAoB,aAAAvB,EAAA,OAAAG,MAAAqB,gBAkBFH,KAAAlB,MAAKoB,UAAUE,QACLC,oBACFvB,MAAKqB,eACAN,aAAaf,MAAKqB,YAAa,CAAC,CAACF,eAAa,IAEhDH,cAAchB,MAAKmB,aAAc,CAAC,CAACA,eAAa,CACxD,CAAC,CAAAK,MACIC,GAAAC,MAAA;EACJ,IAAIzB,WAAW,aAAW,OACjBwB,EAAExB,UAAUyB,EAAEzB,UAAd,IAAA;EAET,IAAIA,WAAW,aAAW;GACxB,IAAA0B,eAAqB,EAAE3B,MAAKmB,kBAAmB,eAAenB,MAAKqB;GAAc,OAC1E5B,kBAAkB,EAAAkC,aAAa,CAAC,CAAC,CAACF,GAAGC,CAAC;EAAC;EAC/C,OACM;CAAC,CACH,KAhBT,CAAA,GAgBU7B,EAAA,KAAAkB,cAAAlB,EAAA,KAAAI,QAAAJ,EAAA,KAAAG,MAAAmB,eAAAtB,EAAA,KAAAG,MAAAoB,WAAAvB,EAAA,KAAAG,MAAAqB,cAAAxB,EAAA,KAAAqB,MAAAA,KAAArB,EAAA;CAlBd,IAAA+B,kBACEV,IA0BAW;CAAA,AAAAhC,EAAA,OAAAkB,gBAAAlB,EAAA,QAAAG,MAAAoB,aAWAS,MAAAC,eACS9B,MAAKoB,UAAUE,OACZP,aAAaN,UAAQ,CAAC,CAAC,CAAAe,KACzB/B,kBAAkB,CAAC,GAC5BI,EAAA,KAAAkB,cAAAlB,EAAA,MAAAG,MAAAoB,WAAAvB,EAAA,MAAAgC,MAAAA,KAAAhC,EAAA;CALH,IAAAkC,kBAAwBF,IAYTG,KAAAhC,MAAKoB,aAAL1B,gBAAiCuC;CAAA,AAAApC,EAAA,QAAA+B,mBAAA/B,EAAA,QAAAkC,mBAAAlC,EAAA,QAAAI,UAAAJ,EAAA,QAAAmC,MAAAnC,EAAA,QAAAG,MAAAmB,iBAAAtB,EAAA,QAAAG,MAAAqB,gBAFvCY,KAAA;EAAAL;EAAAR,WAEMY;EAAiCD;EAAAZ,eAE7BnB,MAAKmB;EAAcE,cACpBrB,MAAKqB;EAAanB;EAAAD;CAGlC,GAACJ,EAAA,MAAA+B,iBAAA/B,EAAA,MAAAkC,iBAAAlC,EAAA,MAAAI,QAAAJ,EAAA,MAAAmC,IAAAnC,EAAA,MAAAG,MAAAmB,eAAAtB,EAAA,MAAAG,MAAAqB,cAAAxB,EAAA,MAAAoC,MAAAA,KAAApC,EAAA;CATH,IAAAqC,UACSD,IAiBRE;CAGuF,OAHvFtC,EAAA,QAAAE,YAAAF,EAAA,QAAAqC,WAGMC,KAAA,oBAAA,iBAAA,UAAA;EAAkCD,OAAAA;EAAUnC;CAAS,CAAA,GAA4BF,EAAA,MAAAE,UAAAF,EAAA,MAAAqC,SAAArC,EAAA,MAAAsC,MAAAA,KAAAtC,EAAA,KAAjFsC;AAAiF;AArH1F,SAAAlB,MAAAE,eAAA;CAAA,OA+BW,SAAAiB,YAAA;EAAA,OACE1B,WAAQ2B,UAAWlB;CAAa;AACxC;AAuFL,SAAAmB,eAAA;CAEE,IAAAJ,UAAgBlD,WAAWG,gBAAgB;CAC3C,IAAI+C,YAAYK,KAAAA,GACd,MAAUC,MAAM,sDAAsD;CACvE,OACMN;AAAO"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { a as Button$1, i as TooltipDelayGroupProvider$1, o as Tooltip$1 } from "./MenuItem-BWdL61CI.js";
|
|
2
|
-
import { i as useClient, n as DEFAULT_STUDIO_CLIENT_OPTIONS } from "./studioClient-
|
|
3
|
-
import { m as useUser } from "./datastores-
|
|
2
|
+
import { i as useClient, n as DEFAULT_STUDIO_CLIENT_OPTIONS } from "./studioClient-CwMJwOTd.js";
|
|
3
|
+
import { m as useUser } from "./datastores-DpJ5Y313.js";
|
|
4
4
|
import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
|
|
5
|
-
import { $a as UserAvatar, Qa as AvatarSkeleton, la as getTransactionsLogs } from "./useBundleDocuments-
|
|
5
|
+
import { $a as UserAvatar, Qa as AvatarSkeleton, la as getTransactionsLogs } from "./useBundleDocuments-DvVAF6cf.js";
|
|
6
6
|
import { Fragment, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { c } from "react/compiler-runtime";
|
|
8
8
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -996,4 +996,4 @@ function searchDocumentRelease(document, searchTerm) {
|
|
|
996
996
|
}
|
|
997
997
|
export { Table as a, DetailIdentity as c, DocumentTable as i, DetailBackButton as l, EditedByAvatar as n, Headers as o, EditedByCell as r, DetailPropertiesPanel as s, searchDocumentRelease as t, DetailActionRail as u };
|
|
998
998
|
|
|
999
|
-
//# sourceMappingURL=searchDocumentRelease-
|
|
999
|
+
//# sourceMappingURL=searchDocumentRelease-C5sClmGF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchDocumentRelease-CUk7BiST.js","names":["Flex","ReactNode","DetailActionRail","props","$","_c","secondary","primary","menu","t0","ArrowLeftIcon","Button","BACK_ALIGN_STYLE","marginLeft","DetailBackButton","props","$","_c","text","onClick","testId","t0","Box","Flex","Stack","Text","getTheme_v2","ElementType","css","styled","Tooltip","DESCRIPTION_TOOLTIP_MAX_WIDTH","ClampedDescription","div","props","font","theme","text","family","sizes","fontSize","lineHeight","DetailIdentity","$","_c","title","titlePlaceholder","description","titleAs","titleTestId","descriptionTestId","t0","Symbol","for","minWidth","t1","undefined","t2","opacity","t3","t4","t5","maxWidth","whiteSpace","t6","Box","Card","Flex","Stack","Text","getTheme_v2","Fragment","ReactNode","css","styled","MULTI_COLUMN_THRESHOLD","TITLE_SIZE","PropertiesCard","$maxWidth","props","font","theme","fontSize","lineHeight","text","sizes","titleTopLeading","Math","round","SectionGrid","div","$hasGlyphs","GlyphCell","DetailPropertyRow","icon","label","value","DetailPropertiesSection","title","rows","multiColumn","PropertyRowsGrid","t0","$","_c","hasGlyphs","t1","t2","row","rowIndex","minWidth","map","DetailPropertiesPanel","sections","testId","maxWidth","undefined","_temp3","t3","section","sectionIndex","filter","_temp","length","some","_temp2","splitIntoColumns","leftCount","ceil","textTransform","slice","row_0","Boolean","Card","Text","ComponentType","TableEmptyStateProps","emptyState","colSpan","emptyCellStyle","textAlign","const","height","display","alignItems","justifyContent","emptyRowStyle","TableEmptyState","t0","$","_c","t1","t2","EmptyStateComponent","ComponentType","PropsWithChildren","useCallback","useContext","useState","TableContext","SortDirection","TableSort","column","direction","TableContextValue","searchTerm","setSearchTerm","sort","setSortColumn","TableProvider","defaultSort","t0","$","_c","children","setSort","t1","Symbol","for","newColumn","s","String","t2","contextValue","t3","useTableContext","context","Error","ArrowUpIcon","SearchIcon","Box","Card","Flex","Stack","Text","TextInput","motion","CSSProperties","useMemo","styled","Button","ButtonProps","useTranslation","useTableContext","HeaderProps","TableHeaderProps","MotionIcon","create","HeaderSortButton","BasicHeader","t0","$","_c","text","t1","SortHeaderButton","header","paddingLeft","sort","setSortColumn","direction","t2","rotate","t3","Symbol","for","duration","ease","t4","sortIcon","t5","sorting","column","id","undefined","t6","String","t7","TableHeaderSearch","headerProps","searchDisabled","placeholder","t","setSearchTerm","searchTerm","event","currentTarget","value","STICKY_HEADER_STYLE","position","top","zIndex","TableHeader","headers","paddingInline","Header","style","width","as","map","Headers","CSSProperties","ReactNode","useMemo","TableLayoutProps","isEmptyState","header","content","contentHeight","emptyTableStyle","width","height","display","gridTemplateRows","borderSpacing","defaultTableStyle","TableLayout","t0","$","_c","t1","position","overflow","tbodyStyle","t2","Symbol","for","t3","t4","t5","Box","Card","CardProps","Flex","rem","Text","useTheme","useVirtualizer","VirtualItem","isValid","get","CSSProperties","ElementType","Fragment","useMemo","TooltipDelayGroupProvider","TableEmptyState","TableHeader","TableLayout","TableProvider","TableSort","useTableContext","Column","RowDatum","AdditionalRowTableData","TableData","isLoading","TableRowProps","VirtualDatum","virtualRow","index","isFirst","isLast","TableProps","columnDefs","searchFilter","data","searchTerm","emptyState","React","JSX","Element","loading","rowId","rowActions","datum","ReactNode","rowProps","Partial","scrollContainerRef","HTMLDivElement","hideTableInlinePadding","ITEM_HEIGHT","LOADING_ROW_COUNT","TableInner","sort","filteredData","filteredResult","sortColumn","find","column","id","a","b","order","aValue","bValue","map","sortValue","sortTransform","direction","toLowerCase","localeCompare","parseDate","Date","parse","aDate","bDate","rowVirtualizer","count","length","getScrollElement","estimateSize","overscan","rowActionColumnDef","sorting","width","header","headerProps","cell","cellProps","amalgamatedColumnDefs","filter","hidden","tableMinWidth","reduce","sum","col","renderRow","TableRow","_id","style","rowPropsStyle","cardRowProps","cardKey","String","height","size","position","top","left","right","transform","start","paddingInline","Cell","as","undefined","emptyContent","headers","theme","maxInlineSize","sanity","v2","container","renderLoadingRows","rowRenderer","Array","from","_el","lane","key","end","tableContent","getVirtualItems","space","getTotalSize","Table","t0","$","_c","defaultSort","props","t1","t2","SearchIcon","Badge","Box","Card","Checkbox","Container","Flex","TextInput","useMediaIndex","CSSProperties","ReactNode","useCallback","useMemo","useState","Button","Table","TableSort","Column","TABLE_CARD_STYLE","height","overflow","scrollbarGutter","SEARCH_INPUT_STYLE","maxWidth","DEFAULT_COMMAND_LANE_MIN_HEIGHT","FILTER_TABS_STYLE","minWidth","overflowX","maskImage","WebkitMaskImage","DocumentTableSelection","labels","selectAll","selectRow","selectedCount","count","clear","renderActions","context","selectedKeys","compact","selectAllTestId","isRowSelectable","row","Row","DocumentTable","t0","$","_c","rows","loading","t1","columnDefs","rowId","getRowKey","searchPredicate","searchPlaceholder","searchTestId","filterTabs","filterTabsScroll","t2","commandLaneMinHeight","t3","alwaysShowCommandLane","t4","commandLaneActions","selection","rowActions","emptyState","defaultSort","id","undefined","mediaIndex","compactBulkActions","scrollContainerRef","setScrollContainerRef","searchTerm","setSearchTerm","setSelectedKeys","_temp","t5","term","trim","filter","displayRows","t6","t7","row_0","t8","row_1","Set","map","selectableKeys","key","has","selectedVisibleCount","length","allSelected","size","someSelected","t9","Symbol","for","key_0","previous","next","delete","add","toggleRow","t10","previous_0","anyVisibleSelected","some","key_1","toggleAll","t11","clearSelection","t12","bb0","t13","t14","t15","headerProps","t16","cellProps","datum","isLoading","_temp2","width","style","sorting","header","cell","selectColumn","amalgamatedColumnDefs","key_2","selectedKeyList","hasDocuments","showCommandLane","showBulkToolbar","Boolean","minHeight","t17","event_0","event","currentTarget","value","t18","t19","t20","stopPropagation","useCallback","useEffect","useMemo","useRef","useState","useClient","DEFAULT_STUDIO_CLIENT_OPTIONS","getTransactionsLogs","lastEditedByCache","Record","Object","create","activeStreams","pendingResolvers","Array","acquireSlot","maxConcurrent","Promise","resolve","push","releaseSlot","Math","max","next","shift","useDocumentLastEditedBy","documentId","revision","$","_c","client","cacheKey","cachedInitial","undefined","lastEditedBy","setLastEditedBy","loading","setLoading","Boolean","prevCacheKey","setPrevCacheKey","cancelledRef","t0","run","transactions","tag","effectFormat","excludeContent","includeIdentifiedDocumentsOnly","limit","reverse","current","author","catch","error","console","finally","fetchLastEditor","t1","t2","t3","Flex","Text","styled","useDocumentLastEditedBy","useUser","AvatarSkeleton","UserAvatar","CellRoot","NameText","EditedByAvatar","t0","$","_c","userId","loading","user","t1","Symbol","for","t2","displayName","t3","EditedByCell","documentId","revision","lastEditedBy","extractSearchableText","value","depth","visited","Array","toString","isArray","map","item","children","_type","child","text","join","trim","filter","Boolean","includes","push","entries","Object","length","every","key","val","startsWith","title","undefined","name","SanityDocument","extractSearchableText","searchDocumentRelease","document","searchTerm","trim","length","title","name","normalizedSearchTerm","toLowerCase","normalizedTitle","normalizedName","hasTitle","hasName","combinedText","searchWords","split","filter","word","allWordsMatch","every","includes","documentInSearchTerm"],"sources":["../src/core/components/detailLayout/DetailActionRail.tsx","../src/core/components/detailLayout/DetailBackButton.tsx","../src/core/components/detailLayout/DetailIdentity.tsx","../src/core/components/detailLayout/DetailPropertiesPanel.tsx","../src/core/releases/tool/components/Table/TableEmptyState.tsx","../src/core/releases/tool/components/Table/TableProvider.tsx","../src/core/releases/tool/components/Table/TableHeader.tsx","../src/core/releases/tool/components/Table/TableLayout.tsx","../src/core/releases/tool/components/Table/Table.tsx","../src/core/releases/tool/components/Table/DocumentTable.tsx","../src/core/store/translog/useDocumentLastEditedBy.ts","../src/core/components/documentTable/EditedByCell.tsx","../src/core/releases/tool/detail/documentTable/extractSearchableText.ts","../src/core/releases/tool/detail/documentTable/searchDocumentRelease.ts"],"sourcesContent":["import {Flex} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\n/**\n * The top-right action rail of an entity detail page: optional secondary action(s), one prominent\n * primary action, then an overflow `⋯` menu. Placed top-right so the most primary action is where\n * the eye lands first (F-pattern), rather than hunted for in a bottom footer. A pure layout shell —\n * each page supplies its own actions, so the primary's weight can scale to its consequence (a loud,\n * confirm-gated \"Run release\" vs. a calm \"Edit definition\"), with lighter secondary actions (e.g.\n * an icon-only \"Edit details\") sitting beside it. Shared by the Releases and Variant-definition\n * detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailActionRail(props: {\n secondary?: ReactNode\n primary?: ReactNode\n menu?: ReactNode\n}): React.JSX.Element {\n const {secondary, primary, menu} = props\n return (\n <Flex flex=\"none\" gap={2} align=\"center\" data-ui=\"detail-action-rail\">\n {secondary}\n {primary}\n {menu}\n </Flex>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons/ArrowLeft'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button, // Restricted Button: needs textWeight=\"regular\", which the ui-components wrapper does not expose.\n} from '@sanity/ui'\n\n// The bleed back-button carries its own horizontal padding, which would push the label right of the\n// title/table left edge. Cancel that padding so the button sits on the same hard left line as\n// everything below it, framing the pane.\nconst BACK_ALIGN_STYLE = {marginLeft: -8}\n\n/**\n * `← Back to all <X>` — the single back affordance at the top-left of a detail page. The entity\n * title headlines the pane below, so the back control does not repeat it; it only says where \"back\"\n * goes. Shared by the Releases and Variant-definition detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailBackButton(props: {\n text: string\n onClick: () => void\n testId?: string\n}): React.JSX.Element {\n const {text, onClick, testId} = props\n return (\n <Button\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n onClick={onClick}\n text={text}\n textWeight=\"regular\"\n padding={2}\n style={BACK_ALIGN_STYLE}\n data-testid={testId}\n />\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {type ElementType} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {Tooltip} from '../../../ui-components/tooltip/Tooltip'\n\nconst DESCRIPTION_TOOLTIP_MAX_WIDTH = 360\n\n// Bounded, four-line description: title + up to four lines makes the identity block sit at (and\n// never exceed) the height of the properties panel beside it, so the top band is one even zone.\n// Full text lives in the hover tooltip; maxWidth keeps the line length fixed rather than stretching\n// across the whole pane.\n//\n// This is a plain styled.div rather than @sanity/ui <Text> on purpose: <Text> forces its own\n// `display` (flow-root), which defeats `-webkit-line-clamp` (that needs display:-webkit-box) and\n// collapses the box, clipping the first line. Owning the element lets the clamp work correctly.\nconst ClampedDescription = styled.div((props) => {\n const {font} = getTheme_v2(props.theme)\n return css`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 4;\n overflow: hidden;\n max-width: 560px;\n margin: 0;\n font-family: ${font.text.family};\n font-size: ${font.text.sizes[2].fontSize}px;\n line-height: ${font.text.sizes[2].lineHeight}px;\n color: var(--card-muted-fg-color);\n `\n})\n\n/**\n * The identity block (title + description) of an entity detail page, as a read-only **display**\n * surface. Title renders bold; description clamps to four lines with the full text on hover.\n * Shared by the Releases and Variant-definition detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailIdentity(props: {\n title: string | undefined\n titlePlaceholder: string\n description?: string\n /** Element the title renders as — pass `\"h1\"` to make it the page heading. Defaults to a span. */\n titleAs?: ElementType\n titleTestId?: string\n descriptionTestId?: string\n}): React.JSX.Element {\n const {title, titlePlaceholder, description, titleAs, titleTestId, descriptionTestId} = props\n\n return (\n <Stack gap={3}>\n <Flex align=\"center\" gap={2}>\n {/* Box flex={1} + min-width:0 lets the title shrink and truncate instead of overflowing its\n zone; the full title is available on hover. */}\n <Box flex={1} style={{minWidth: 0}}>\n <Text\n as={titleAs}\n size={4}\n weight=\"bold\"\n textOverflow=\"ellipsis\"\n title={title || undefined}\n style={title ? undefined : {opacity: 0.5}}\n data-testid={titleTestId}\n >\n {title || titlePlaceholder}\n </Text>\n </Box>\n </Flex>\n\n {description && (\n <Tooltip\n placement=\"bottom-start\"\n content={\n <Box padding={2} style={{maxWidth: DESCRIPTION_TOOLTIP_MAX_WIDTH}}>\n <Text muted size={1} style={{whiteSpace: 'pre-wrap'}}>\n {description}\n </Text>\n </Box>\n }\n >\n <ClampedDescription data-testid={descriptionTestId}>{description}</ClampedDescription>\n </Tooltip>\n )}\n </Stack>\n )\n}\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {Fragment, type ReactNode} from 'react'\nimport {css, styled} from 'styled-components'\n\n// At or above this many rows, a `multiColumn` section splits into two side-by-side columns so a\n// long list (e.g. six targeting conditions) reads as a compact block instead of a tall stack.\n// Below it, a short list stays single-column — two columns of one or two rows just looks sparse.\nconst MULTI_COLUMN_THRESHOLD = 5\n\n// The size of the detail-page title (bold, size 4) this panel sits beside. Used to drop the panel by\n// the title's top half-leading below.\nconst TITLE_SIZE = 4\n\n// The panel sizes to its content (so a short two-row panel doesn't leave a wide empty gap) but never\n// grows past a sensible max, at which point long values truncate instead of stretching the pane.\n//\n// margin-top drops the panel by the title's top half-leading so its top border lines up with the\n// title's visible cap-height beside it (a text line-box is taller than its glyphs, so the title cap\n// sits a few px below its layout top). Compensating on the panel — moving it down — rather than\n// lifting the title up avoids clipping the title's caps under an overflow-hidden header. Derived from\n// theme font metrics so it tracks the type scale.\nconst PropertiesCard = styled(Card)<{$maxWidth: number}>((props) => {\n const {font} = getTheme_v2(props.theme)\n const {fontSize, lineHeight} = font.text.sizes[TITLE_SIZE]\n const titleTopLeading = Math.round((lineHeight - fontSize) / 2)\n return css`\n width: fit-content;\n max-width: ${props.$maxWidth}px;\n margin-top: ${titleTopLeading}px;\n `\n})\n\n// One grid per section so every row shares column tracks and stays aligned:\n// - glyph (auto) — only present when the section has glyphs\n// - label (max-content) — sizes to the widest label, so labels never truncate and values start on\n// one clean left edge\n// - value (minmax(0, 1fr)) — takes the rest; min-width:0 lets a long value truncate in its column\n// grid-auto-rows keeps every row on an even minimum height, matching the old rhythm.\nconst SectionGrid = styled.div<{$hasGlyphs: boolean}>`\n display: grid;\n align-items: center;\n column-gap: 12px;\n row-gap: 6px;\n grid-auto-rows: minmax(25px, auto);\n ${(props) =>\n props.$hasGlyphs\n ? css`\n grid-template-columns: auto max-content minmax(0, 1fr);\n `\n : css`\n grid-template-columns: max-content minmax(0, 1fr);\n `}\n`\n\nconst GlyphCell = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n`\n\n/**\n * A single row: an optional leading `icon` (a glyph accompanying the label), a `label`, and a\n * `value`. `null`/`false` rows are skipped, so callers can inline conditions.\n */\ninterface DetailPropertyRow {\n icon?: ReactNode\n label: string\n value: ReactNode\n}\n\n/** A group of rows, optionally headed by a section title. */\nexport interface DetailPropertiesSection {\n title?: string\n rows: (DetailPropertyRow | null | false | undefined)[]\n /**\n * When set, a section with several rows splits into two side-by-side columns (each a self-aligned\n * `[glyph] [label] [value]` grid), collapsing back to one column when the panel is too narrow to\n * hold both. Off by default, so single-column sections (e.g. Releases) are unaffected.\n */\n multiColumn?: boolean\n}\n\n// One aligned [glyph] [label] [value] grid for a set of rows. Factored out so a multi-column\n// section can render two of them side by side while each keeps its own internal alignment.\nfunction PropertyRowsGrid({\n rows,\n hasGlyphs,\n}: {\n rows: DetailPropertyRow[]\n hasGlyphs: boolean\n}): React.JSX.Element {\n return (\n <SectionGrid $hasGlyphs={hasGlyphs}>\n {rows.map((row, rowIndex) => (\n // oxlint-disable-next-line no-array-index-key\n <Fragment key={rowIndex}>\n {hasGlyphs && <GlyphCell>{row.icon}</GlyphCell>}\n <Text muted size={1}>\n {row.label}\n </Text>\n {/* Pure-text value on one left edge; a long value truncates (title tooltip shows the full\n text) rather than wrapping and breaking the single-line grid. */}\n <Box style={{minWidth: 0}}>\n {typeof row.value === 'string' ? (\n <Text size={1} textOverflow=\"ellipsis\" title={row.value}>\n {row.value}\n </Text>\n ) : (\n row.value\n )}\n </Box>\n </Fragment>\n ))}\n </SectionGrid>\n )\n}\n\n/**\n * The bordered \"properties\" surface beside the identity block on an entity detail page. Renders N\n * labeled sections as an aligned `[glyph] [label] [value]` grid: a leading-glyph column, a\n * content-sized label column, and a value column of pure single-line text (semantic colour carries\n * meaning; no chips). The panel sizes to its content up to `maxWidth`; values that overflow truncate\n * with a tooltip rather than wrap. Shared by the Releases and Variant-definition detail pages so both\n * read as one family.\n *\n * @internal\n */\nexport function DetailPropertiesPanel(props: {\n sections: DetailPropertiesSection[]\n testId?: string\n /** Upper bound on the panel width; it shrinks to fit its content below this. */\n maxWidth?: number\n}): React.JSX.Element {\n const {sections, testId, maxWidth = 300} = props\n\n return (\n <PropertiesCard\n flex=\"none\"\n border\n radius={3}\n padding={3}\n tone=\"transparent\"\n $maxWidth={maxWidth}\n data-testid={testId}\n >\n <Stack gap={4}>\n {sections.map((section, sectionIndex) => {\n const rows = section.rows.filter((row): row is DetailPropertyRow => Boolean(row))\n if (rows.length === 0) return null\n // Only reserve the glyph column when a row in this section actually carries a glyph.\n const hasGlyphs = rows.some((row) => Boolean(row.icon))\n // A multi-column section splits its rows into two balanced columns that wrap back to one\n // when the panel is squeezed (flex-wrap, so no container-query fragility). The first\n // (left) column takes the ceiling half, so an odd count leans left.\n const splitIntoColumns = section.multiColumn && rows.length >= MULTI_COLUMN_THRESHOLD\n const leftCount = Math.ceil(rows.length / 2)\n\n return (\n // Sections are positional and static, so the index is a stable key.\n // oxlint-disable-next-line no-array-index-key\n <Stack key={sectionIndex} gap={2}>\n {section.title && (\n <Text muted size={0} weight=\"semibold\" style={{textTransform: 'uppercase'}}>\n {section.title}\n </Text>\n )}\n {splitIntoColumns ? (\n <Flex gap={4} wrap=\"wrap\">\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows.slice(0, leftCount)} />\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows.slice(leftCount)} />\n </Flex>\n ) : (\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows} />\n )}\n </Stack>\n )\n })}\n </Stack>\n </PropertiesCard>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {type ComponentType} from 'react'\n\ninterface TableEmptyStateProps {\n emptyState: string | ComponentType\n colSpan: number\n}\n\nconst emptyCellStyle = {\n textAlign: 'center' as const,\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst emptyRowStyle = {\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n}\n\n/**\n * @internal\n */\nexport const TableEmptyState = ({emptyState, colSpan}: TableEmptyStateProps) => {\n if (typeof emptyState === 'string') {\n return (\n <Card borderBottom display=\"flex\" padding={4} as=\"tr\" style={emptyRowStyle}>\n <td colSpan={colSpan} style={emptyCellStyle}>\n <Text muted size={1}>\n {emptyState}\n </Text>\n </td>\n </Card>\n )\n }\n\n const EmptyStateComponent = emptyState\n return (\n <Card borderBottom display=\"flex\" padding={4} as=\"tr\" style={emptyRowStyle}>\n <td colSpan={colSpan} style={emptyCellStyle}>\n <EmptyStateComponent />\n </td>\n </Card>\n )\n}\n","import {type ComponentType, type PropsWithChildren, useCallback, useContext, useState} from 'react'\nimport {TableContext} from 'sanity/_singletons'\n\nimport {type SortDirection} from './types'\n\nexport interface TableSort {\n column: string\n direction: SortDirection\n}\n\n/**\n * @internal\n */\nexport interface TableContextValue {\n searchTerm: string | null\n setSearchTerm: (searchTerm: string) => void\n sort: TableSort | null\n setSortColumn: (column: string) => void\n}\n\n/**\n * @internal\n */\nexport const TableProvider: ComponentType<PropsWithChildren & {defaultSort?: TableSort}> = ({\n children,\n defaultSort,\n}) => {\n const [searchTerm, setSearchTerm] = useState<string | null>(null)\n const [sort, setSort] = useState<TableSort | null>(defaultSort || null)\n\n const setSortColumn = useCallback((newColumn: string) => {\n setSort((s) => {\n if (s?.column === newColumn) {\n return {...s, direction: s.direction === 'asc' ? 'desc' : 'asc'}\n }\n\n return {column: String(newColumn), direction: 'desc'}\n })\n }, [])\n\n const contextValue = {searchTerm, setSearchTerm, sort, setSortColumn}\n\n return <TableContext.Provider value={contextValue}>{children}</TableContext.Provider>\n}\n\n/**\n * @internal\n */\nexport const useTableContext = (): TableContextValue => {\n const context = useContext(TableContext)\n if (!context) {\n throw new Error('useTableContext must be used within a TableProvider')\n }\n return context\n}\n","import {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Card, Flex, Stack, Text, TextInput} from '@sanity/ui'\nimport {motion} from 'motion/react'\nimport {type CSSProperties, useMemo} from 'react'\nimport {styled} from 'styled-components'\n\nimport {Button, type ButtonProps} from '../../../../../ui-components/button/Button'\nimport {useTranslation} from '../../../../i18n/hooks/useTranslation'\nimport {useTableContext} from './TableProvider'\nimport {type HeaderProps, type TableHeaderProps} from './types'\n\nconst MotionIcon = motion.create(ArrowUpIcon)\n\n// Column headers are semibold so the header row reads clearly as a header, distinct from the row\n// content below — especially on sparse, single-column tables. For sortable headers (rendered as a\n// button, whose label weight isn't a prop) the same weight is forced onto the inner Text.\nconst HeaderSortButton = styled(Button)`\n & [data-ui='Text'] {\n font-weight: 600;\n }\n`\n\nconst BasicHeader = ({text}: {text: string}) => (\n <Box padding={2}>\n <Text muted size={1} weight=\"semibold\">\n {text}\n </Text>\n </Box>\n)\n\nconst SortHeaderButton = ({\n header,\n text,\n paddingLeft,\n}: Omit<ButtonProps, 'text'> &\n HeaderProps & {\n text: string\n }) => {\n const {sort, setSortColumn} = useTableContext()\n const sortIcon = useMemo(\n () => (\n <MotionIcon\n initial={false}\n animate={{rotate: sort?.direction === 'asc' ? 0 : 180}}\n transition={{duration: 0.25, ease: 'easeInOut'}}\n />\n ),\n [sort?.direction],\n )\n\n return (\n <HeaderSortButton\n iconRight={header.sorting && sort?.column === header.id ? sortIcon : undefined}\n onClick={() => setSortColumn(String(header.id))}\n mode=\"bleed\"\n size=\"default\"\n // Optional left-inset override so a header label can line up with content that is inset less\n // than the default button padding (e.g. an 8px cell). Defaults to the button's own padding.\n paddingLeft={paddingLeft}\n text={text}\n />\n )\n}\n\nconst TableHeaderSearch = ({\n headerProps,\n searchDisabled,\n placeholder,\n}: HeaderProps & {placeholder?: string}) => {\n const {t} = useTranslation()\n const {setSearchTerm, searchTerm} = useTableContext()\n\n return (\n <Stack {...headerProps} flex={1} paddingY={2} paddingRight={3} sizing=\"border\">\n <TextInput\n border={false}\n fontSize={1}\n icon={SearchIcon}\n placeholder={placeholder || t('search.placeholder')}\n radius={3}\n value={searchTerm || ''}\n disabled={searchDisabled}\n onChange={(event) => setSearchTerm(event.currentTarget.value)}\n onClear={() => setSearchTerm('')}\n clearButton={!!searchTerm}\n />\n </Stack>\n )\n}\n\nconst STICKY_HEADER_STYLE: CSSProperties = {position: 'sticky', top: 0, zIndex: 1}\n\n/**\n *\n * @internal\n */\nexport const TableHeader = ({headers, searchDisabled}: TableHeaderProps) => {\n return (\n <Card as=\"thead\" borderBottom style={STICKY_HEADER_STYLE}>\n <Flex\n as=\"tr\"\n style={{\n paddingInline: `max(\n calc((100% - var(--maxInlineSize)) / 2),\n var(--paddingInline)\n )`,\n }}\n >\n {headers.map(\n ({header: Header, style, width, id, sorting}) =>\n !!Header && (\n <Header\n key={String(id)}\n headerProps={{\n as: 'th',\n id: String(id),\n style: {...style, width: width || undefined},\n }}\n header={{id, sorting}}\n searchDisabled={searchDisabled}\n />\n ),\n )}\n </Flex>\n </Card>\n )\n}\n\nexport const Headers = {\n SortHeaderButton,\n TableHeaderSearch,\n BasicHeader,\n}\n","import {type CSSProperties, type ReactNode, useMemo} from 'react'\n\ninterface TableLayoutProps {\n isEmptyState: boolean\n header: ReactNode\n content: ReactNode\n contentHeight?: string\n}\n\n// borderSpacing: 0 on both states so the header sits at the same offset whether the table renders\n// as a grid (empty state) or a default table box (populated). Without it, the populated table keeps\n// the browser-default 2px border-spacing and the header shifts ~2px when the last row filters out.\nconst emptyTableStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'grid',\n gridTemplateRows: 'auto 1fr',\n borderSpacing: 0,\n}\n\nconst defaultTableStyle: CSSProperties = {\n width: '100%',\n borderSpacing: 0,\n}\n\n/**\n * @internal\n */\nexport const TableLayout = ({isEmptyState, header, content, contentHeight}: TableLayoutProps) => {\n // display: block makes the tbody the containing block for the absolutely\n // positioned virtualized rows in Safari too — WebKit doesn't support\n // `position: relative` on internal table boxes (https://bugs.webkit.org/show_bug.cgi?id=240961),\n // which left the rows positioned from the top of the table and the first row\n // hidden behind the sticky header\n const tbodyStyle = useMemo<CSSProperties>(\n () =>\n isEmptyState\n ? {display: 'block', height: '100%', position: 'relative', overflow: 'hidden'}\n : {display: 'block', height: contentHeight, position: 'relative'},\n [isEmptyState, contentHeight],\n )\n\n return (\n <div style={{height: '100%'}}>\n <table style={isEmptyState ? emptyTableStyle : defaultTableStyle}>\n {header}\n <tbody style={tbodyStyle}>{content}</tbody>\n </table>\n </div>\n )\n}\n","import {Box, Card, type CardProps, Flex, rem, Text, useTheme} from '@sanity/ui'\nimport {useVirtualizer, type VirtualItem} from '@tanstack/react-virtual'\nimport {isValid} from 'date-fns/isValid'\nimport get from 'lodash-es/get.js'\nimport {type CSSProperties, type ElementType, Fragment, useMemo} from 'react'\n\nimport {TooltipDelayGroupProvider} from '../../../../../ui-components/tooltipDelayGroupProvider/TooltipDelayGroupProvider'\nimport {TableEmptyState} from './TableEmptyState'\nimport {TableHeader} from './TableHeader'\nimport {TableLayout} from './TableLayout'\nimport {TableProvider, type TableSort, useTableContext} from './TableProvider'\nimport {type Column} from './types'\n\ntype RowDatum<TableData, AdditionalRowTableData> = (AdditionalRowTableData extends undefined\n ? TableData\n : TableData & AdditionalRowTableData) & {isLoading?: boolean}\n\nexport type TableRowProps = CardProps<ElementType>\n\ntype VirtualDatum = {\n virtualRow: VirtualItem\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport interface TableProps<TableData, AdditionalRowTableData> {\n columnDefs: Column<RowDatum<TableData, AdditionalRowTableData>>[]\n searchFilter?: (data: TableData[], searchTerm: string) => TableData[]\n data: TableData[]\n emptyState: (() => React.JSX.Element) | string\n loading?: boolean\n /**\n * Should be the dot separated path to the unique identifier of the row. e.g. document._id\n */\n rowId: string\n rowActions?: ({\n datum,\n }: {\n datum: RowDatum<TableData, AdditionalRowTableData> | unknown\n }) => React.ReactNode\n rowProps?: (datum: TableData) => Partial<TableRowProps>\n scrollContainerRef: HTMLDivElement | null\n hideTableInlinePadding?: boolean\n}\n\nconst ITEM_HEIGHT = 59\nconst LOADING_ROW_COUNT = 3\n\nconst TableInner = <TableData, AdditionalRowTableData>({\n columnDefs,\n data,\n emptyState,\n searchFilter,\n rowId,\n rowActions,\n loading = false,\n rowProps = () => ({}),\n scrollContainerRef,\n hideTableInlinePadding = false,\n}: TableProps<TableData, AdditionalRowTableData>) => {\n const {searchTerm, sort} = useTableContext()\n\n const filteredData = useMemo(() => {\n const filteredResult = searchFilter ? searchFilter(data, searchTerm || '') : data\n if (!sort) return filteredResult\n\n const sortColumn = columnDefs.find((column) => column.id === sort.column)\n return [...filteredResult].sort((a, b) => {\n let order: number\n\n const [aValue, bValue]: (number | string)[] = [a, b].map(\n (sortValue) =>\n sortColumn?.sortTransform?.(\n sortValue as RowDatum<TableData, AdditionalRowTableData>,\n sort.direction,\n ) ?? get(sortValue, sort.column),\n )\n if (\n typeof aValue === 'string' &&\n typeof bValue === 'string' &&\n !isValid(aValue) &&\n !isValid(bValue)\n ) {\n order = aValue.toLowerCase().localeCompare(bValue.toLowerCase())\n } else {\n const parseDate = (datum: number | string) => {\n if (sortColumn?.sortTransform && typeof datum === 'number') return datum\n\n return typeof datum === 'string' ? Date.parse(datum) : 0\n }\n\n const [aDate, bDate] = [aValue, bValue].map(parseDate)\n\n order = aDate - bDate\n }\n\n if (sort.direction === 'asc') return order\n return -order\n })\n }, [columnDefs, data, searchFilter, searchTerm, sort])\n\n const rowVirtualizer = useVirtualizer({\n count: filteredData.length,\n getScrollElement: () => scrollContainerRef,\n estimateSize: () => ITEM_HEIGHT,\n overscan: 5,\n })\n\n const rowActionColumnDef: Column = useMemo(\n () => ({\n id: 'actions',\n sorting: false,\n // Header and body rows are independent flexboxes: this trailing gutter must be the SAME width\n // in both, otherwise the flex:1 \"Document\" column absorbs the difference in the body only and\n // every column to its right (Last edited, Edited by) drifts out of alignment with its header.\n // The body cell below is content-box (width:25px + padding:3 => ~50px actual), so reserve 50\n // here and size the header (border-box) to 50px to match — under-reserving clips the ⋯.\n width: 50,\n header: ({headerProps: {id}}) => (\n <Flex as=\"th\" id={id} paddingY={3} paddingX={3} sizing=\"border\" style={{width: '50px'}}>\n <Text muted size={1} weight=\"medium\">\n \n </Text>\n </Flex>\n ),\n cell: ({datum, cellProps: {id}}) => (\n <Flex as=\"td\" id={id} align=\"center\" flex=\"none\" padding={3} style={{width: '25px'}}>\n {(!datum.isLoading && rowActions?.({datum})) || <Box style={{width: '25px'}} />}\n </Flex>\n ),\n }),\n [rowActions],\n )\n\n const amalgamatedColumnDefs = useMemo(\n () =>\n (rowActions ? [...columnDefs, rowActionColumnDef] : columnDefs).filter(\n (column) => !column.hidden,\n ),\n [columnDefs, rowActionColumnDef, rowActions],\n )\n\n const tableMinWidth = useMemo(\n () => amalgamatedColumnDefs.reduce((sum, col) => sum + (col.width || 200), 0),\n [amalgamatedColumnDefs],\n )\n\n const renderRow = useMemo(\n () =>\n function TableRow(\n datum: VirtualDatum &\n (TableData | (TableData & AdditionalRowTableData) | {_id: string; isLoading: boolean}),\n ) {\n const {style: rowPropsStyle, ...cardRowProps} = rowProps(datum as TableData)\n const cardKey = loading ? `skeleton-${datum.index}` : String(get(datum, rowId))\n\n return (\n <Card\n key={cardKey}\n data-testid={loading ? 'table-row-skeleton' : 'table-row'}\n borderBottom\n display=\"flex\"\n data-index={datum.index}\n as=\"tr\"\n style={{\n height: `${datum.virtualRow.size}px`,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n transform: `translateY(${datum.virtualRow.start}px)`,\n paddingInline: `max(\n calc((100% - var(--maxInlineSize)) / 2),\n var(--paddingInline)\n )`,\n // Consumer-supplied row styles are merged (not clobbered) so they can tint/flag a row\n // without dropping the virtualization layout (height/position/transform).\n ...rowPropsStyle,\n }}\n {...cardRowProps}\n >\n {amalgamatedColumnDefs.map(({cell: Cell, style, width, id, sorting = false}) => (\n <Fragment key={String(id)}>\n <Cell\n datum={\n {...datum, isLoading: loading} as RowDatum<TableData, AdditionalRowTableData>\n }\n cellProps={{\n as: 'td',\n id: String(id),\n style: {...style, width: width || undefined},\n }}\n sorting={sorting}\n />\n </Fragment>\n ))}\n </Card>\n )\n },\n [amalgamatedColumnDefs, loading, rowId, rowProps],\n )\n\n const emptyContent = useMemo(\n () => <TableEmptyState emptyState={emptyState} colSpan={amalgamatedColumnDefs.length} />,\n [amalgamatedColumnDefs.length, emptyState],\n )\n\n const headers = useMemo(\n () =>\n amalgamatedColumnDefs.map(({cell, sortTransform, ...header}) => ({\n ...header,\n id: String(header.id),\n })),\n [amalgamatedColumnDefs],\n )\n\n const theme = useTheme()\n\n const maxInlineSize = (!hideTableInlinePadding && theme.sanity.v2?.container[3]) || 0\n\n const renderLoadingRows = (\n rowRenderer: (\n datum: VirtualDatum &\n ({_id: string; isLoading: boolean} | TableData | (TableData & AdditionalRowTableData)),\n ) => React.ReactNode,\n ) => {\n return Array.from({length: LOADING_ROW_COUNT}).map((_el, index) => {\n const cardKey = `skeleton-${index}`\n const virtualRow: VirtualItem = {\n index,\n start: index * ITEM_HEIGHT,\n size: ITEM_HEIGHT,\n lane: 0,\n key: cardKey,\n end: index * ITEM_HEIGHT + ITEM_HEIGHT,\n }\n\n return rowRenderer({\n _id: cardKey,\n isLoading: true,\n virtualRow,\n index,\n isFirst: index === 0,\n isLast: index === LOADING_ROW_COUNT - 1,\n })\n })\n }\n\n const tableContent = () => {\n if (loading) {\n return renderLoadingRows(renderRow)\n }\n\n if (filteredData.length === 0) {\n return emptyContent\n }\n\n return rowVirtualizer.getVirtualItems().map((virtualRow, index) => {\n const datum = filteredData[virtualRow.index]\n return renderRow({\n ...datum,\n virtualRow,\n index,\n isFirst: virtualRow.index === 0,\n isLast: virtualRow.index === filteredData.length - 1,\n })\n })\n }\n\n return (\n <div style={{height: '100%'}}>\n <div\n style={\n {\n 'width': '100%',\n 'minWidth': `${tableMinWidth}px`,\n 'height': '100%',\n 'position': 'relative',\n '--maxInlineSize': rem(maxInlineSize),\n '--paddingInline': rem(theme.sanity.v2?.space[3] ?? 0),\n } as CSSProperties\n }\n >\n <TableLayout\n isEmptyState={filteredData.length === 0 && !loading}\n header={\n <TableHeader\n headers={headers}\n searchDisabled={loading || (!searchTerm && !data.length)}\n />\n }\n content={tableContent()}\n contentHeight={`${rowVirtualizer.getTotalSize()}px`}\n />\n </div>\n </div>\n )\n}\n\nexport const Table = <TableData, AdditionalRowTableData = undefined>({\n defaultSort,\n ...props\n}: TableProps<TableData, AdditionalRowTableData> & {defaultSort?: TableSort}) => {\n return (\n <TooltipDelayGroupProvider>\n <TableProvider defaultSort={defaultSort}>\n <TableInner<TableData, AdditionalRowTableData> {...props} />\n </TableProvider>\n </TooltipDelayGroupProvider>\n )\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {Badge, Box, Card, Checkbox, Container, Flex, TextInput, useMediaIndex} from '@sanity/ui'\nimport {type CSSProperties, type ReactNode, useCallback, useMemo, useState} from 'react'\n\nimport {Button} from '../../../../../ui-components/button/Button'\nimport {Table} from './Table'\nimport {type TableSort} from './TableProvider'\nimport {type Column} from './types'\n\nconst TABLE_CARD_STYLE: CSSProperties = {\n height: '100%',\n overflow: 'auto',\n // Reserve the scrollbar gutter symmetrically (both edges). Rows are centered in a container[3]\n // block; with a classic (non-overlay) scrollbar, filtering changes the row count, the scrollbar\n // appears/disappears, the content box width changes, and the centered rows jump relative to the\n // command lane above. \"stable both-edges\" keeps the content-box width constant and centered.\n scrollbarGutter: 'stable both-edges',\n}\n\n// Right-aligned, fixed-width search input.\nconst SEARCH_INPUT_STYLE: CSSProperties = {maxWidth: 280}\n\n// Default command-lane height so the browse↔bulk swap never shifts the rows below. Consumers with a\n// taller browse control (e.g. the variants overview's bordered filter group) raise it via the\n// `commandLaneMinHeight` prop so the shorter bulk toolbar reserves the same height.\nconst DEFAULT_COMMAND_LANE_MIN_HEIGHT = 33\n\n// Filter-tab strip: scrolls horizontally when the tabs outrun the width, with a subtle right-edge\n// fade cueing the overflow. When the tabs fit, the fade falls over empty space and is invisible.\nconst FILTER_TABS_STYLE: CSSProperties = {\n minWidth: 0,\n overflowX: 'auto',\n maskImage: 'linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%)',\n WebkitMaskImage: 'linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%)',\n}\n\n/**\n * Declarative selection + bulk-action config for {@link DocumentTable}. When provided, the table\n * gains a leading checkbox column (select-all in the header row, per-row checkboxes) and the command\n * lane swaps to a bulk toolbar while a selection exists.\n *\n * @internal\n */\nexport interface DocumentTableSelection<Row = unknown> {\n labels: {\n selectAll: string\n selectRow: string\n /** e.g. \"3 selected\" */\n selectedCount: (count: number) => string\n clear: string\n }\n /** The bulk actions (right of the count). `compact` is true on narrow widths — collapse to a menu. */\n renderActions: (context: {\n selectedKeys: string[]\n compact: boolean\n clear: () => void\n }) => ReactNode\n /** testId for the select-all checkbox (per-surface, so existing tests keep working). */\n selectAllTestId?: string\n /**\n * Optional predicate: rows for which this returns false get no row checkbox and never count toward\n * the selection or select-all (e.g. pending \"just added\" placeholder rows that can't be bulk-acted\n * on). Defaults to every row selectable.\n */\n isRowSelectable?: (row: Row) => boolean\n}\n\n/**\n * Shared document-table composition used by both the Releases and Variants detail tables. Wraps the\n * low-level {@link Table} and owns the three-zone header: a command lane (zone 1) with search + a\n * caller-provided filter-tab slot, swapping to a bulk toolbar on selection; the column-header row\n * (zone 2, caller columns + an injected select column); and the rows (zone 3). Search is owned here\n * (filtered before the Table sorts) so it lives in the command lane, not the column header.\n *\n * @internal\n */\nexport function DocumentTable<Row extends object>({\n rows,\n loading = false,\n columnDefs,\n rowId,\n getRowKey,\n searchPredicate,\n searchPlaceholder,\n searchTestId,\n filterTabs,\n filterTabsScroll = true,\n commandLaneMinHeight = DEFAULT_COMMAND_LANE_MIN_HEIGHT,\n alwaysShowCommandLane = false,\n commandLaneActions,\n selection,\n rowActions,\n emptyState,\n defaultSort,\n id,\n}: {\n rows: Row[]\n loading?: boolean\n columnDefs: Column<Row>[]\n rowId: string\n getRowKey: (row: Row) => string\n searchPredicate: (row: Row, searchTerm: string) => boolean\n searchPlaceholder: string\n searchTestId?: string\n filterTabs?: ReactNode\n /**\n * When true (default), the filter-tabs slot scrolls horizontally with a right-edge fade — right for\n * tab strips that outrun the width. Set false when the consumer manages its own overflow (e.g. the\n * variants overview collapses its filter chips), so the slot just fills without a scroll or fade.\n */\n filterTabsScroll?: boolean\n /**\n * Minimum height of the command lane, reserved in both the browse and bulk states so swapping\n * between them never shifts the rows. Raise it above the default when the browse controls are\n * taller than the bulk toolbar (e.g. a bordered filter group).\n */\n commandLaneMinHeight?: number\n /**\n * Keep the command lane (filters + search) mounted even when there are zero rows, so a filter or\n * search that empties the result set doesn't also hide the controls needed to change it. Surfaces\n * that own filter tabs and/or command-lane actions (release detail behind beta.variants, the\n * variants overview) turn it on.\n */\n alwaysShowCommandLane?: boolean\n /** Extra command-lane controls rendered right of the search (e.g. an \"Add document\" button). */\n commandLaneActions?: ReactNode\n selection?: DocumentTableSelection<Row>\n rowActions?: (props: {datum: unknown}) => ReactNode\n emptyState: (() => React.JSX.Element) | string\n defaultSort?: TableSort\n /** id + data-testid for the scroll container (the filter-tab `aria-controls` target). */\n id?: string\n}): React.JSX.Element {\n const mediaIndex = useMediaIndex()\n const compactBulkActions = mediaIndex < 2\n const [scrollContainerRef, setScrollContainerRef] = useState<HTMLDivElement | null>(null)\n const [searchTerm, setSearchTerm] = useState('')\n const [selectedKeys, setSelectedKeys] = useState<ReadonlySet<string>>(() => new Set())\n\n const displayRows = useMemo(() => {\n const term = searchTerm.trim()\n return term ? rows.filter((row) => searchPredicate(row, term)) : rows\n }, [rows, searchTerm, searchPredicate])\n\n // Selection is keyed by the caller's row key. The count reflects only currently-visible rows so a\n // filtered-out selection never inflates the bar.\n const selectableKeys = useMemo(\n () =>\n new Set(\n displayRows\n .filter((row) => selection?.isRowSelectable?.(row) ?? true)\n .map((row) => getRowKey(row)),\n ),\n [displayRows, getRowKey, selection],\n )\n const selectedVisibleCount = useMemo(\n () => [...selectedKeys].filter((key) => selectableKeys.has(key)).length,\n [selectedKeys, selectableKeys],\n )\n const allSelected = selectableKeys.size > 0 && selectedVisibleCount === selectableKeys.size\n const someSelected = selectedVisibleCount > 0\n\n const toggleRow = useCallback((key: string) => {\n setSelectedKeys((previous) => {\n const next = new Set(previous)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [])\n\n const toggleAll = useCallback(() => {\n setSelectedKeys((previous) => {\n // Doubles as clear: if anything visible is selected, clicking clears; otherwise selects all.\n const anyVisibleSelected = [...selectableKeys].some((key) => previous.has(key))\n return anyVisibleSelected ? new Set() : new Set(selectableKeys)\n })\n }, [selectableKeys])\n\n const clearSelection = useCallback(() => setSelectedKeys(new Set()), [])\n\n const selectColumn = useMemo<Column<Row> | null>(() => {\n if (!selection) return null\n const {labels, selectAllTestId} = selection\n return {\n id: 'select',\n width: 44,\n style: {minWidth: 44, maxWidth: 44},\n sorting: false,\n // Select-all lives in the column-header row (above the row checkboxes it governs), not the\n // command lane. Doubles as clear.\n header: ({headerProps}) => (\n <Flex {...headerProps} align=\"center\" justify=\"center\" paddingY={3} sizing=\"border\">\n <Checkbox\n aria-label={labels.selectAll}\n checked={allSelected}\n data-testid={selectAllTestId}\n indeterminate={someSelected && !allSelected}\n onChange={toggleAll}\n />\n </Flex>\n ),\n cell: ({cellProps, datum}) => (\n <Flex {...cellProps} align=\"center\" justify=\"center\" paddingX={2} sizing=\"border\">\n {!datum.isLoading && (selection?.isRowSelectable?.(datum) ?? true) && (\n <Checkbox\n aria-label={labels.selectRow}\n checked={selectedKeys.has(getRowKey(datum))}\n onChange={() => toggleRow(getRowKey(datum))}\n onClick={(event) => event.stopPropagation()}\n />\n )}\n </Flex>\n ),\n }\n }, [selection, allSelected, someSelected, toggleAll, selectedKeys, getRowKey, toggleRow])\n\n const amalgamatedColumnDefs = useMemo(\n () => (selectColumn ? [selectColumn, ...columnDefs] : columnDefs),\n [selectColumn, columnDefs],\n )\n\n const selectedKeyList = useMemo(\n () => [...selectedKeys].filter((key) => selectableKeys.has(key)),\n [selectedKeys, selectableKeys],\n )\n\n const hasDocuments = !loading && rows.length > 0\n // Keep the lane mounted for filter-owning surfaces even when a filter/search empties the rows (so\n // the controls to undo that never disappear with the results) AND during the initial load (so the\n // filter-tab loading skeletons stay up and the search/filters don't pop in with a layout shift\n // once documents arrive).\n const showCommandLane = hasDocuments || alwaysShowCommandLane\n const showBulkToolbar = Boolean(selection) && selectedVisibleCount > 0\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\" overflow=\"hidden\" style={{minHeight: 0}}>\n {/* Command lane (zone 1). Fixed height so the browse↔bulk swap never shifts the rows. Idle:\n filter tabs lead from the left (aligned with the columns), search is right-aligned. On\n selection: selected count + Clear on the left, caller's bulk actions on the right.\n container[3] + paddingX={2} aligns the lane with the table's row content below. */}\n {showCommandLane && (\n <Card flex=\"none\" borderBottom paddingY={2}>\n <Container flex=\"none\" width={3}>\n <Box paddingX={2}>\n <Flex align=\"center\" gap={3} style={{minHeight: commandLaneMinHeight}}>\n {showBulkToolbar && selection ? (\n <>\n <Badge data-testid=\"document-table-selected-count\" fontSize={1} tone=\"primary\">\n {selection.labels.selectedCount(selectedVisibleCount)}\n </Badge>\n <Button\n data-testid=\"document-table-clear-selection\"\n mode=\"bleed\"\n onClick={clearSelection}\n text={selection.labels.clear}\n />\n <Box flex={1} />\n {selection.renderActions({\n selectedKeys: selectedKeyList,\n compact: compactBulkActions,\n clear: clearSelection,\n })}\n </>\n ) : (\n <>\n {filterTabs && (\n <Box flex={1} style={filterTabsScroll ? FILTER_TABS_STYLE : {minWidth: 0}}>\n {filterTabs}\n </Box>\n )}\n {/* With filter tabs, search is a fixed-width control pinned to the right (tabs\n lead from the left). Without them, it fills the lane so it doesn't strand a\n wide empty gutter — e.g. the variants overview, which has no filter tabs. */}\n <Box\n flex={filterTabs ? 'none' : 1}\n style={filterTabs ? SEARCH_INPUT_STYLE : undefined}\n >\n <TextInput\n aria-label={searchPlaceholder}\n clearButton={Boolean(searchTerm)}\n data-testid={searchTestId}\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearchTerm(event.currentTarget.value)}\n onClear={() => setSearchTerm('')}\n placeholder={searchPlaceholder}\n value={searchTerm}\n />\n </Box>\n {commandLaneActions ? <Box flex=\"none\">{commandLaneActions}</Box> : null}\n </>\n )}\n </Flex>\n </Box>\n </Container>\n </Card>\n )}\n <Card data-testid={id} flex={1} id={id} ref={setScrollContainerRef} style={TABLE_CARD_STYLE}>\n <Table<Row>\n columnDefs={amalgamatedColumnDefs}\n data={displayRows}\n defaultSort={defaultSort}\n emptyState={emptyState}\n loading={loading}\n rowActions={rowActions}\n rowId={rowId}\n scrollContainerRef={scrollContainerRef}\n />\n </Card>\n </Flex>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport {useClient} from '../../hooks/useClient'\nimport {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../studioClient'\nimport {getTransactionsLogs} from './getTransactionsLogs'\n\n// Cache the resolved editor per (documentId, revision) so re-renders and remounts don't refetch the\n// same transaction. Keyed on revision too, so a fresh edit invalidates the entry.\nconst lastEditedByCache: Record<string, string | undefined> = Object.create(null)\n\n// The history/translog API 429s when many rows fetch at once (e.g. a large documents table mounting\n// all at once). Limit concurrency to the same ceiling the release document-history hook uses — 10\n// was the highest that ran without consistent 429s.\nlet activeStreams = 0\nconst pendingResolvers: Array<() => void> = []\nasync function acquireSlot(maxConcurrent = 10): Promise<void> {\n if (activeStreams >= maxConcurrent) {\n await new Promise<void>((resolve) => pendingResolvers.push(resolve))\n }\n activeStreams += 1\n}\nfunction releaseSlot(): void {\n activeStreams = Math.max(0, activeStreams - 1)\n const next = pendingResolvers.shift()\n if (next) next()\n}\n\n/**\n * Resolves the user id of whoever last edited a document — the author of its most recent\n * transaction. Reads a single transaction (`limit: 1, reverse: true`) from the transaction log,\n * concurrency-limited so a table of rows doesn't stampede the history API, and cached per\n * `(documentId, revision)`.\n *\n * Returns just the user id; render it with `UserAvatar` / `useUser` at the call site.\n *\n * @internal\n */\nexport function useDocumentLastEditedBy(\n documentId: string | undefined,\n revision?: string,\n): {lastEditedBy: string | undefined; loading: boolean} {\n const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)\n const cacheKey = documentId ? `${documentId}-${revision ?? ''}` : ''\n const cachedInitial = cacheKey ? lastEditedByCache[cacheKey] : undefined\n const [lastEditedBy, setLastEditedBy] = useState<string | undefined>(cachedInitial)\n const [loading, setLoading] = useState<boolean>(\n Boolean(documentId) && !(cacheKey in lastEditedByCache),\n )\n\n // Reset during render when (documentId, revision) changes to a new cacheKey, before the new\n // fetch settles — the sibling useReleaseHistory hook fixes the same false-settled flash this\n // way. Without this, `lastEditedBy`/`loading` hold the PREVIOUS key's values (or a stale\n // \"loading: false\" once the previous fetch already settled) until the effect re-runs. Resetting\n // from the cache — rather than unconditionally to `undefined`/`true` — means a key that's\n // already cached settles immediately instead of flashing a loading skeleton.\n const [prevCacheKey, setPrevCacheKey] = useState(cacheKey)\n if (cacheKey !== prevCacheKey) {\n setPrevCacheKey(cacheKey)\n setLastEditedBy(cacheKey ? lastEditedByCache[cacheKey] : undefined)\n setLoading(Boolean(documentId) && !(cacheKey in lastEditedByCache))\n }\n\n const cancelledRef = useRef(false)\n\n const fetchLastEditor = useCallback(async (): Promise<void> => {\n if (!documentId) {\n setLastEditedBy(undefined)\n setLoading(false)\n return\n }\n\n if (cacheKey in lastEditedByCache) {\n setLastEditedBy(lastEditedByCache[cacheKey])\n setLoading(false)\n return\n }\n\n setLoading(true)\n await acquireSlot()\n // run().catch().finally() rather than try/catch/finally because the React Compiler does not yet\n // fully support the latter — matches the sibling release-history hook.\n const run = async () => {\n const transactions = await getTransactionsLogs(client, documentId, {\n tag: 'sanity.studio.document.last-edited-by',\n effectFormat: 'mendoza',\n excludeContent: true,\n includeIdentifiedDocumentsOnly: true,\n limit: 1,\n reverse: true,\n })\n if (cancelledRef.current) return\n const author = transactions[0]?.author\n lastEditedByCache[cacheKey] = author\n setLastEditedBy(author)\n }\n await run()\n .catch((error) => {\n console.error('Failed to fetch document last-editor history:', error)\n if (!cancelledRef.current) setLastEditedBy(undefined)\n })\n .finally(() => {\n releaseSlot()\n if (!cancelledRef.current) setLoading(false)\n })\n }, [cacheKey, client, documentId])\n\n useEffect(() => {\n cancelledRef.current = false\n // oxlint-disable-next-line react/react-compiler\n void fetchLastEditor()\n return () => {\n cancelledRef.current = true\n }\n }, [fetchLastEditor])\n\n return useMemo(() => ({lastEditedBy, loading}), [lastEditedBy, loading])\n}\n","import {Flex, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {useDocumentLastEditedBy} from '../../store/translog/useDocumentLastEditedBy'\nimport {useUser} from '../../store/user/hooks'\nimport {AvatarSkeleton, UserAvatar} from '../userAvatar/UserAvatar'\n\n// container-query wrapper: show the editor's name when the cell has room, collapse to just the\n// avatar when the column is squeezed narrow. The avatar always carries the name in its tooltip, so\n// nothing is lost when the label is hidden. `width: 100%` is required: `container-type: inline-size`\n// imposes size containment, so without a definite width the element collapses to ~0 (a shrink-to-fit\n// flex item derives no intrinsic width once contained) and the query would report \"narrow\" always.\nconst CellRoot = styled(Flex)`\n container-type: inline-size;\n width: 100%;\n min-width: 0;\n`\nconst NameText = styled(Text)`\n min-width: 0;\n @container (max-width: 108px) {\n display: none;\n }\n`\n\n/**\n * Presentation for an \"Edited by\" cell: the avatar + display name of a resolved editor id. A\n * person-named column (not just an avatar) is what distinguishes authorship from live presence — the\n * two used to read as the same round avatar. Collapses to avatar-only when the column is too narrow\n * to fit the name. Shared by the Releases and Variant document tables, each of which resolves the\n * editor id through its own history source.\n *\n * @internal\n */\nexport function EditedByAvatar({\n userId,\n loading,\n}: {\n userId: string | undefined\n loading: boolean\n}): React.JSX.Element | null {\n const [user] = useUser(userId ?? '')\n\n if (loading) {\n return <AvatarSkeleton $size={0} animated />\n }\n\n if (!userId) {\n return null\n }\n\n return (\n <CellRoot align=\"center\" gap={2}>\n <UserAvatar size={0} user={userId} withTooltip />\n {user?.displayName && (\n <NameText muted size={1} textOverflow=\"ellipsis\">\n {user.displayName}\n </NameText>\n )}\n </CellRoot>\n )\n}\n\n/**\n * \"Edited by\" cell for the variant document table: resolves the last editor from the document's\n * transaction log, then renders {@link EditedByAvatar}.\n *\n * @internal\n */\nexport function EditedByCell({\n documentId,\n revision,\n}: {\n documentId: string | undefined\n revision?: string\n}): React.JSX.Element | null {\n const {lastEditedBy, loading} = useDocumentLastEditedBy(documentId, revision)\n\n return <EditedByAvatar loading={loading} userId={lastEditedBy} />\n}\n","/**\n * Extracts a searchable string from a field value, handling various data types\n * @param value - The field value to extract text from\n * @param depth - Current recursion depth\n * @param visited - Array of visited objects thath ave been proceeded so far\n * @returns A string representation suitable for search\n */\nexport function extractSearchableText(\n value: unknown,\n depth: number = 0,\n visited: Array<unknown> = [],\n): string {\n if (typeof value === 'undefined' || value === null) return ''\n\n // Limit recursion depth to avoid going too deeply into a nested structure\n if (depth > 3) return ''\n\n // Handle primitive types\n if (typeof value === 'string') return value\n if (typeof value === 'number') return value.toString()\n\n // Handle Portable Text\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (typeof item === 'object' && item.children && item._type === 'block') {\n return item.children\n .map((child: {text: string}) => child.text)\n .join(' ')\n .trim()\n }\n // If there are nested arrays, then we need to extract the text from the nested arrays\n if (Array.isArray(item)) {\n return extractSearchableText(item, depth + 1, visited)\n }\n\n // Handle other types (numbers, string)\n return item.toString().trim()\n })\n .filter(Boolean)\n .join(' ')\n }\n\n // Handle objects\n if (typeof value === 'object' && value !== null) {\n // Limit the number of items proceeded through the search as to avoid too deep recursion\n // that impacts performance. If the object has already been visited, then there is no need to proceed further.\n if (visited.includes(value)) return ''\n visited.push(value)\n\n // Handle localized objects (common pattern: {en: \"title\", no: \"tittel\"})\n // However, make sure that the values are not internal Sanity keys (starting with _)\n const entries = Object.entries(value)\n if (\n entries.length > 0 &&\n entries.every(([key, val]) => typeof val !== 'boolean' && !key.startsWith('_'))\n ) {\n return entries\n .map(([, val]) => extractSearchableText(val, depth + 1, visited))\n .filter(Boolean)\n .join(' ')\n }\n\n // Handle objects with specific properties (like {title: \"value\"})\n const title =\n 'title' in value && typeof value.title === 'string'\n ? value.title.toString().trim()\n : undefined\n const name =\n 'name' in value && typeof value.name === 'string' ? value.name.toString().trim() : undefined\n const text =\n 'text' in value && typeof value.text === 'string' ? value.text.toString().trim() : undefined\n\n if (title || name || text) {\n return [title, name, text].filter(Boolean).join(' ')\n }\n\n // Generic object handling - extract all string/number values\n return entries\n .filter(([key]) => !key.startsWith('_')) // Skip metadata keys\n .map(([, val]) => extractSearchableText(val, depth + 1, visited))\n .filter(Boolean)\n .join(' ')\n }\n\n return ''\n}\n","import {type SanityDocument} from '@sanity/types'\n\nimport {extractSearchableText} from './extractSearchableText'\n\n/**\n * This is a temporary way of doing the search without the previews\n * until we have it moved to the server side\n * Each document is searchable by title, name, and combined text of title and name, this could be different\n * than the displayed title, given the displayed title is resolved by the preview prepare function, but we cannot use that one\n * here because we will be over-fetching the documents, we will need to resolve the preview for hundreds of documents if we do that.\n *\n * So this is an intermediate solution to allow the search to work without the resolved preview values.\n *\n *\n * @param document - The document to search\n * @param searchTerm - The search term\n * @returns True if the document matches the search term, false otherwise\n */\nexport function searchDocumentRelease(document: SanityDocument, searchTerm: string) {\n // if there is no search term or the document has no title or name, return false\n if (!searchTerm || searchTerm.trim().length === 0 || (!document.title && !document.name)) {\n return false\n }\n\n const title = extractSearchableText(document.title)\n const name = extractSearchableText(document.name)\n\n const normalizedSearchTerm = searchTerm.toLowerCase().trim()\n const normalizedTitle = title.toLowerCase()\n const normalizedName = name.toLowerCase()\n\n const hasTitle = normalizedTitle.trim().length > 0\n const hasName = normalizedName.trim().length > 0\n\n // Create a combined searchable text from both title and name\n const combinedText = `${normalizedTitle} ${normalizedName}`\n\n // Split search term into words for more flexible matching\n const searchWords = normalizedSearchTerm.split(/\\s+/).filter((word) => word.length > 0)\n\n // Check if all search words are found in either title, name, or combined text\n const allWordsMatch = searchWords.every(\n (word) =>\n (hasTitle && normalizedTitle.includes(word)) ||\n (hasName && normalizedName.includes(word)) ||\n combinedText.includes(word),\n )\n\n // Also check if the document name/title is contained within the search term\n const documentInSearchTerm =\n (hasName && normalizedSearchTerm.includes(normalizedName)) ||\n (hasTitle && normalizedSearchTerm.includes(normalizedTitle))\n\n return allWordsMatch || documentInSearchTerm\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"searchDocumentRelease-C5sClmGF.js","names":["Flex","ReactNode","DetailActionRail","props","$","_c","secondary","primary","menu","t0","ArrowLeftIcon","Button","BACK_ALIGN_STYLE","marginLeft","DetailBackButton","props","$","_c","text","onClick","testId","t0","Box","Flex","Stack","Text","getTheme_v2","ElementType","css","styled","Tooltip","DESCRIPTION_TOOLTIP_MAX_WIDTH","ClampedDescription","div","props","font","theme","text","family","sizes","fontSize","lineHeight","DetailIdentity","$","_c","title","titlePlaceholder","description","titleAs","titleTestId","descriptionTestId","t0","Symbol","for","minWidth","t1","undefined","t2","opacity","t3","t4","t5","maxWidth","whiteSpace","t6","Box","Card","Flex","Stack","Text","getTheme_v2","Fragment","ReactNode","css","styled","MULTI_COLUMN_THRESHOLD","TITLE_SIZE","PropertiesCard","$maxWidth","props","font","theme","fontSize","lineHeight","text","sizes","titleTopLeading","Math","round","SectionGrid","div","$hasGlyphs","GlyphCell","DetailPropertyRow","icon","label","value","DetailPropertiesSection","title","rows","multiColumn","PropertyRowsGrid","t0","$","_c","hasGlyphs","t1","t2","row","rowIndex","minWidth","map","DetailPropertiesPanel","sections","testId","maxWidth","undefined","_temp3","t3","section","sectionIndex","filter","_temp","length","some","_temp2","splitIntoColumns","leftCount","ceil","textTransform","slice","row_0","Boolean","Card","Text","ComponentType","TableEmptyStateProps","emptyState","colSpan","emptyCellStyle","textAlign","const","height","display","alignItems","justifyContent","emptyRowStyle","TableEmptyState","t0","$","_c","t1","t2","EmptyStateComponent","ComponentType","PropsWithChildren","useCallback","useContext","useState","TableContext","SortDirection","TableSort","column","direction","TableContextValue","searchTerm","setSearchTerm","sort","setSortColumn","TableProvider","defaultSort","t0","$","_c","children","setSort","t1","Symbol","for","newColumn","s","String","t2","contextValue","t3","useTableContext","context","Error","ArrowUpIcon","SearchIcon","Box","Card","Flex","Stack","Text","TextInput","motion","CSSProperties","useMemo","styled","Button","ButtonProps","useTranslation","useTableContext","HeaderProps","TableHeaderProps","MotionIcon","create","HeaderSortButton","BasicHeader","t0","$","_c","text","t1","SortHeaderButton","header","paddingLeft","sort","setSortColumn","direction","t2","rotate","t3","Symbol","for","duration","ease","t4","sortIcon","t5","sorting","column","id","undefined","t6","String","t7","TableHeaderSearch","headerProps","searchDisabled","placeholder","t","setSearchTerm","searchTerm","event","currentTarget","value","STICKY_HEADER_STYLE","position","top","zIndex","TableHeader","headers","paddingInline","Header","style","width","as","map","Headers","CSSProperties","ReactNode","useMemo","TableLayoutProps","isEmptyState","header","content","contentHeight","emptyTableStyle","width","height","display","gridTemplateRows","borderSpacing","defaultTableStyle","TableLayout","t0","$","_c","t1","position","overflow","tbodyStyle","t2","Symbol","for","t3","t4","t5","Box","Card","CardProps","Flex","rem","Text","useTheme","useVirtualizer","VirtualItem","isValid","get","CSSProperties","ElementType","Fragment","useMemo","TooltipDelayGroupProvider","TableEmptyState","TableHeader","TableLayout","TableProvider","TableSort","useTableContext","Column","RowDatum","AdditionalRowTableData","TableData","isLoading","TableRowProps","VirtualDatum","virtualRow","index","isFirst","isLast","TableProps","columnDefs","searchFilter","data","searchTerm","emptyState","React","JSX","Element","loading","rowId","rowActions","datum","ReactNode","rowProps","Partial","scrollContainerRef","HTMLDivElement","hideTableInlinePadding","ITEM_HEIGHT","LOADING_ROW_COUNT","TableInner","sort","filteredData","filteredResult","sortColumn","find","column","id","a","b","order","aValue","bValue","map","sortValue","sortTransform","direction","toLowerCase","localeCompare","parseDate","Date","parse","aDate","bDate","rowVirtualizer","count","length","getScrollElement","estimateSize","overscan","rowActionColumnDef","sorting","width","header","headerProps","cell","cellProps","amalgamatedColumnDefs","filter","hidden","tableMinWidth","reduce","sum","col","renderRow","TableRow","_id","style","rowPropsStyle","cardRowProps","cardKey","String","height","size","position","top","left","right","transform","start","paddingInline","Cell","as","undefined","emptyContent","headers","theme","maxInlineSize","sanity","v2","container","renderLoadingRows","rowRenderer","Array","from","_el","lane","key","end","tableContent","getVirtualItems","space","getTotalSize","Table","t0","$","_c","defaultSort","props","t1","t2","SearchIcon","Badge","Box","Card","Checkbox","Container","Flex","TextInput","useMediaIndex","CSSProperties","ReactNode","useCallback","useMemo","useState","Button","Table","TableSort","Column","TABLE_CARD_STYLE","height","overflow","scrollbarGutter","SEARCH_INPUT_STYLE","maxWidth","DEFAULT_COMMAND_LANE_MIN_HEIGHT","FILTER_TABS_STYLE","minWidth","overflowX","maskImage","WebkitMaskImage","DocumentTableSelection","labels","selectAll","selectRow","selectedCount","count","clear","renderActions","context","selectedKeys","compact","selectAllTestId","isRowSelectable","row","Row","DocumentTable","t0","$","_c","rows","loading","t1","columnDefs","rowId","getRowKey","searchPredicate","searchPlaceholder","searchTestId","filterTabs","filterTabsScroll","t2","commandLaneMinHeight","t3","alwaysShowCommandLane","t4","commandLaneActions","selection","rowActions","emptyState","defaultSort","id","undefined","mediaIndex","compactBulkActions","scrollContainerRef","setScrollContainerRef","searchTerm","setSearchTerm","setSelectedKeys","_temp","t5","term","trim","filter","displayRows","t6","t7","row_0","t8","row_1","Set","map","selectableKeys","key","has","selectedVisibleCount","length","allSelected","size","someSelected","t9","Symbol","for","key_0","previous","next","delete","add","toggleRow","t10","previous_0","anyVisibleSelected","some","key_1","toggleAll","t11","clearSelection","t12","bb0","t13","t14","t15","headerProps","t16","cellProps","datum","isLoading","_temp2","width","style","sorting","header","cell","selectColumn","amalgamatedColumnDefs","key_2","selectedKeyList","hasDocuments","showCommandLane","showBulkToolbar","Boolean","minHeight","t17","event_0","event","currentTarget","value","t18","t19","t20","stopPropagation","useCallback","useEffect","useMemo","useRef","useState","useClient","DEFAULT_STUDIO_CLIENT_OPTIONS","getTransactionsLogs","lastEditedByCache","Record","Object","create","activeStreams","pendingResolvers","Array","acquireSlot","maxConcurrent","Promise","resolve","push","releaseSlot","Math","max","next","shift","useDocumentLastEditedBy","documentId","revision","$","_c","client","cacheKey","cachedInitial","undefined","lastEditedBy","setLastEditedBy","loading","setLoading","Boolean","prevCacheKey","setPrevCacheKey","cancelledRef","t0","run","transactions","tag","effectFormat","excludeContent","includeIdentifiedDocumentsOnly","limit","reverse","current","author","catch","error","console","finally","fetchLastEditor","t1","t2","t3","Flex","Text","styled","useDocumentLastEditedBy","useUser","AvatarSkeleton","UserAvatar","CellRoot","NameText","EditedByAvatar","t0","$","_c","userId","loading","user","t1","Symbol","for","t2","displayName","t3","EditedByCell","documentId","revision","lastEditedBy","extractSearchableText","value","depth","visited","Array","toString","isArray","map","item","children","_type","child","text","join","trim","filter","Boolean","includes","push","entries","Object","length","every","key","val","startsWith","title","undefined","name","SanityDocument","extractSearchableText","searchDocumentRelease","document","searchTerm","trim","length","title","name","normalizedSearchTerm","toLowerCase","normalizedTitle","normalizedName","hasTitle","hasName","combinedText","searchWords","split","filter","word","allWordsMatch","every","includes","documentInSearchTerm"],"sources":["../src/core/components/detailLayout/DetailActionRail.tsx","../src/core/components/detailLayout/DetailBackButton.tsx","../src/core/components/detailLayout/DetailIdentity.tsx","../src/core/components/detailLayout/DetailPropertiesPanel.tsx","../src/core/releases/tool/components/Table/TableEmptyState.tsx","../src/core/releases/tool/components/Table/TableProvider.tsx","../src/core/releases/tool/components/Table/TableHeader.tsx","../src/core/releases/tool/components/Table/TableLayout.tsx","../src/core/releases/tool/components/Table/Table.tsx","../src/core/releases/tool/components/Table/DocumentTable.tsx","../src/core/store/translog/useDocumentLastEditedBy.ts","../src/core/components/documentTable/EditedByCell.tsx","../src/core/releases/tool/detail/documentTable/extractSearchableText.ts","../src/core/releases/tool/detail/documentTable/searchDocumentRelease.ts"],"sourcesContent":["import {Flex} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\n/**\n * The top-right action rail of an entity detail page: optional secondary action(s), one prominent\n * primary action, then an overflow `⋯` menu. Placed top-right so the most primary action is where\n * the eye lands first (F-pattern), rather than hunted for in a bottom footer. A pure layout shell —\n * each page supplies its own actions, so the primary's weight can scale to its consequence (a loud,\n * confirm-gated \"Run release\" vs. a calm \"Edit definition\"), with lighter secondary actions (e.g.\n * an icon-only \"Edit details\") sitting beside it. Shared by the Releases and Variant-definition\n * detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailActionRail(props: {\n secondary?: ReactNode\n primary?: ReactNode\n menu?: ReactNode\n}): React.JSX.Element {\n const {secondary, primary, menu} = props\n return (\n <Flex flex=\"none\" gap={2} align=\"center\" data-ui=\"detail-action-rail\">\n {secondary}\n {primary}\n {menu}\n </Flex>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons/ArrowLeft'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button, // Restricted Button: needs textWeight=\"regular\", which the ui-components wrapper does not expose.\n} from '@sanity/ui'\n\n// The bleed back-button carries its own horizontal padding, which would push the label right of the\n// title/table left edge. Cancel that padding so the button sits on the same hard left line as\n// everything below it, framing the pane.\nconst BACK_ALIGN_STYLE = {marginLeft: -8}\n\n/**\n * `← Back to all <X>` — the single back affordance at the top-left of a detail page. The entity\n * title headlines the pane below, so the back control does not repeat it; it only says where \"back\"\n * goes. Shared by the Releases and Variant-definition detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailBackButton(props: {\n text: string\n onClick: () => void\n testId?: string\n}): React.JSX.Element {\n const {text, onClick, testId} = props\n return (\n <Button\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n onClick={onClick}\n text={text}\n textWeight=\"regular\"\n padding={2}\n style={BACK_ALIGN_STYLE}\n data-testid={testId}\n />\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {type ElementType} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {Tooltip} from '../../../ui-components/tooltip/Tooltip'\n\nconst DESCRIPTION_TOOLTIP_MAX_WIDTH = 360\n\n// Bounded, four-line description: title + up to four lines makes the identity block sit at (and\n// never exceed) the height of the properties panel beside it, so the top band is one even zone.\n// Full text lives in the hover tooltip; maxWidth keeps the line length fixed rather than stretching\n// across the whole pane.\n//\n// This is a plain styled.div rather than @sanity/ui <Text> on purpose: <Text> forces its own\n// `display` (flow-root), which defeats `-webkit-line-clamp` (that needs display:-webkit-box) and\n// collapses the box, clipping the first line. Owning the element lets the clamp work correctly.\nconst ClampedDescription = styled.div((props) => {\n const {font} = getTheme_v2(props.theme)\n return css`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 4;\n overflow: hidden;\n max-width: 560px;\n margin: 0;\n font-family: ${font.text.family};\n font-size: ${font.text.sizes[2].fontSize}px;\n line-height: ${font.text.sizes[2].lineHeight}px;\n color: var(--card-muted-fg-color);\n `\n})\n\n/**\n * The identity block (title + description) of an entity detail page, as a read-only **display**\n * surface. Title renders bold; description clamps to four lines with the full text on hover.\n * Shared by the Releases and Variant-definition detail pages so both read as one family.\n *\n * @internal\n */\nexport function DetailIdentity(props: {\n title: string | undefined\n titlePlaceholder: string\n description?: string\n /** Element the title renders as — pass `\"h1\"` to make it the page heading. Defaults to a span. */\n titleAs?: ElementType\n titleTestId?: string\n descriptionTestId?: string\n}): React.JSX.Element {\n const {title, titlePlaceholder, description, titleAs, titleTestId, descriptionTestId} = props\n\n return (\n <Stack gap={3}>\n <Flex align=\"center\" gap={2}>\n {/* Box flex={1} + min-width:0 lets the title shrink and truncate instead of overflowing its\n zone; the full title is available on hover. */}\n <Box flex={1} style={{minWidth: 0}}>\n <Text\n as={titleAs}\n size={4}\n weight=\"bold\"\n textOverflow=\"ellipsis\"\n title={title || undefined}\n style={title ? undefined : {opacity: 0.5}}\n data-testid={titleTestId}\n >\n {title || titlePlaceholder}\n </Text>\n </Box>\n </Flex>\n\n {description && (\n <Tooltip\n placement=\"bottom-start\"\n content={\n <Box padding={2} style={{maxWidth: DESCRIPTION_TOOLTIP_MAX_WIDTH}}>\n <Text muted size={1} style={{whiteSpace: 'pre-wrap'}}>\n {description}\n </Text>\n </Box>\n }\n >\n <ClampedDescription data-testid={descriptionTestId}>{description}</ClampedDescription>\n </Tooltip>\n )}\n </Stack>\n )\n}\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {Fragment, type ReactNode} from 'react'\nimport {css, styled} from 'styled-components'\n\n// At or above this many rows, a `multiColumn` section splits into two side-by-side columns so a\n// long list (e.g. six targeting conditions) reads as a compact block instead of a tall stack.\n// Below it, a short list stays single-column — two columns of one or two rows just looks sparse.\nconst MULTI_COLUMN_THRESHOLD = 5\n\n// The size of the detail-page title (bold, size 4) this panel sits beside. Used to drop the panel by\n// the title's top half-leading below.\nconst TITLE_SIZE = 4\n\n// The panel sizes to its content (so a short two-row panel doesn't leave a wide empty gap) but never\n// grows past a sensible max, at which point long values truncate instead of stretching the pane.\n//\n// margin-top drops the panel by the title's top half-leading so its top border lines up with the\n// title's visible cap-height beside it (a text line-box is taller than its glyphs, so the title cap\n// sits a few px below its layout top). Compensating on the panel — moving it down — rather than\n// lifting the title up avoids clipping the title's caps under an overflow-hidden header. Derived from\n// theme font metrics so it tracks the type scale.\nconst PropertiesCard = styled(Card)<{$maxWidth: number}>((props) => {\n const {font} = getTheme_v2(props.theme)\n const {fontSize, lineHeight} = font.text.sizes[TITLE_SIZE]\n const titleTopLeading = Math.round((lineHeight - fontSize) / 2)\n return css`\n width: fit-content;\n max-width: ${props.$maxWidth}px;\n margin-top: ${titleTopLeading}px;\n `\n})\n\n// One grid per section so every row shares column tracks and stays aligned:\n// - glyph (auto) — only present when the section has glyphs\n// - label (max-content) — sizes to the widest label, so labels never truncate and values start on\n// one clean left edge\n// - value (minmax(0, 1fr)) — takes the rest; min-width:0 lets a long value truncate in its column\n// grid-auto-rows keeps every row on an even minimum height, matching the old rhythm.\nconst SectionGrid = styled.div<{$hasGlyphs: boolean}>`\n display: grid;\n align-items: center;\n column-gap: 12px;\n row-gap: 6px;\n grid-auto-rows: minmax(25px, auto);\n ${(props) =>\n props.$hasGlyphs\n ? css`\n grid-template-columns: auto max-content minmax(0, 1fr);\n `\n : css`\n grid-template-columns: max-content minmax(0, 1fr);\n `}\n`\n\nconst GlyphCell = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n`\n\n/**\n * A single row: an optional leading `icon` (a glyph accompanying the label), a `label`, and a\n * `value`. `null`/`false` rows are skipped, so callers can inline conditions.\n */\ninterface DetailPropertyRow {\n icon?: ReactNode\n label: string\n value: ReactNode\n}\n\n/** A group of rows, optionally headed by a section title. */\nexport interface DetailPropertiesSection {\n title?: string\n rows: (DetailPropertyRow | null | false | undefined)[]\n /**\n * When set, a section with several rows splits into two side-by-side columns (each a self-aligned\n * `[glyph] [label] [value]` grid), collapsing back to one column when the panel is too narrow to\n * hold both. Off by default, so single-column sections (e.g. Releases) are unaffected.\n */\n multiColumn?: boolean\n}\n\n// One aligned [glyph] [label] [value] grid for a set of rows. Factored out so a multi-column\n// section can render two of them side by side while each keeps its own internal alignment.\nfunction PropertyRowsGrid({\n rows,\n hasGlyphs,\n}: {\n rows: DetailPropertyRow[]\n hasGlyphs: boolean\n}): React.JSX.Element {\n return (\n <SectionGrid $hasGlyphs={hasGlyphs}>\n {rows.map((row, rowIndex) => (\n // oxlint-disable-next-line no-array-index-key\n <Fragment key={rowIndex}>\n {hasGlyphs && <GlyphCell>{row.icon}</GlyphCell>}\n <Text muted size={1}>\n {row.label}\n </Text>\n {/* Pure-text value on one left edge; a long value truncates (title tooltip shows the full\n text) rather than wrapping and breaking the single-line grid. */}\n <Box style={{minWidth: 0}}>\n {typeof row.value === 'string' ? (\n <Text size={1} textOverflow=\"ellipsis\" title={row.value}>\n {row.value}\n </Text>\n ) : (\n row.value\n )}\n </Box>\n </Fragment>\n ))}\n </SectionGrid>\n )\n}\n\n/**\n * The bordered \"properties\" surface beside the identity block on an entity detail page. Renders N\n * labeled sections as an aligned `[glyph] [label] [value]` grid: a leading-glyph column, a\n * content-sized label column, and a value column of pure single-line text (semantic colour carries\n * meaning; no chips). The panel sizes to its content up to `maxWidth`; values that overflow truncate\n * with a tooltip rather than wrap. Shared by the Releases and Variant-definition detail pages so both\n * read as one family.\n *\n * @internal\n */\nexport function DetailPropertiesPanel(props: {\n sections: DetailPropertiesSection[]\n testId?: string\n /** Upper bound on the panel width; it shrinks to fit its content below this. */\n maxWidth?: number\n}): React.JSX.Element {\n const {sections, testId, maxWidth = 300} = props\n\n return (\n <PropertiesCard\n flex=\"none\"\n border\n radius={3}\n padding={3}\n tone=\"transparent\"\n $maxWidth={maxWidth}\n data-testid={testId}\n >\n <Stack gap={4}>\n {sections.map((section, sectionIndex) => {\n const rows = section.rows.filter((row): row is DetailPropertyRow => Boolean(row))\n if (rows.length === 0) return null\n // Only reserve the glyph column when a row in this section actually carries a glyph.\n const hasGlyphs = rows.some((row) => Boolean(row.icon))\n // A multi-column section splits its rows into two balanced columns that wrap back to one\n // when the panel is squeezed (flex-wrap, so no container-query fragility). The first\n // (left) column takes the ceiling half, so an odd count leans left.\n const splitIntoColumns = section.multiColumn && rows.length >= MULTI_COLUMN_THRESHOLD\n const leftCount = Math.ceil(rows.length / 2)\n\n return (\n // Sections are positional and static, so the index is a stable key.\n // oxlint-disable-next-line no-array-index-key\n <Stack key={sectionIndex} gap={2}>\n {section.title && (\n <Text muted size={0} weight=\"semibold\" style={{textTransform: 'uppercase'}}>\n {section.title}\n </Text>\n )}\n {splitIntoColumns ? (\n <Flex gap={4} wrap=\"wrap\">\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows.slice(0, leftCount)} />\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows.slice(leftCount)} />\n </Flex>\n ) : (\n <PropertyRowsGrid hasGlyphs={hasGlyphs} rows={rows} />\n )}\n </Stack>\n )\n })}\n </Stack>\n </PropertiesCard>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {type ComponentType} from 'react'\n\ninterface TableEmptyStateProps {\n emptyState: string | ComponentType\n colSpan: number\n}\n\nconst emptyCellStyle = {\n textAlign: 'center' as const,\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst emptyRowStyle = {\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n}\n\n/**\n * @internal\n */\nexport const TableEmptyState = ({emptyState, colSpan}: TableEmptyStateProps) => {\n if (typeof emptyState === 'string') {\n return (\n <Card borderBottom display=\"flex\" padding={4} as=\"tr\" style={emptyRowStyle}>\n <td colSpan={colSpan} style={emptyCellStyle}>\n <Text muted size={1}>\n {emptyState}\n </Text>\n </td>\n </Card>\n )\n }\n\n const EmptyStateComponent = emptyState\n return (\n <Card borderBottom display=\"flex\" padding={4} as=\"tr\" style={emptyRowStyle}>\n <td colSpan={colSpan} style={emptyCellStyle}>\n <EmptyStateComponent />\n </td>\n </Card>\n )\n}\n","import {type ComponentType, type PropsWithChildren, useCallback, useContext, useState} from 'react'\nimport {TableContext} from 'sanity/_singletons'\n\nimport {type SortDirection} from './types'\n\nexport interface TableSort {\n column: string\n direction: SortDirection\n}\n\n/**\n * @internal\n */\nexport interface TableContextValue {\n searchTerm: string | null\n setSearchTerm: (searchTerm: string) => void\n sort: TableSort | null\n setSortColumn: (column: string) => void\n}\n\n/**\n * @internal\n */\nexport const TableProvider: ComponentType<PropsWithChildren & {defaultSort?: TableSort}> = ({\n children,\n defaultSort,\n}) => {\n const [searchTerm, setSearchTerm] = useState<string | null>(null)\n const [sort, setSort] = useState<TableSort | null>(defaultSort || null)\n\n const setSortColumn = useCallback((newColumn: string) => {\n setSort((s) => {\n if (s?.column === newColumn) {\n return {...s, direction: s.direction === 'asc' ? 'desc' : 'asc'}\n }\n\n return {column: String(newColumn), direction: 'desc'}\n })\n }, [])\n\n const contextValue = {searchTerm, setSearchTerm, sort, setSortColumn}\n\n return <TableContext.Provider value={contextValue}>{children}</TableContext.Provider>\n}\n\n/**\n * @internal\n */\nexport const useTableContext = (): TableContextValue => {\n const context = useContext(TableContext)\n if (!context) {\n throw new Error('useTableContext must be used within a TableProvider')\n }\n return context\n}\n","import {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Card, Flex, Stack, Text, TextInput} from '@sanity/ui'\nimport {motion} from 'motion/react'\nimport {type CSSProperties, useMemo} from 'react'\nimport {styled} from 'styled-components'\n\nimport {Button, type ButtonProps} from '../../../../../ui-components/button/Button'\nimport {useTranslation} from '../../../../i18n/hooks/useTranslation'\nimport {useTableContext} from './TableProvider'\nimport {type HeaderProps, type TableHeaderProps} from './types'\n\nconst MotionIcon = motion.create(ArrowUpIcon)\n\n// Column headers are semibold so the header row reads clearly as a header, distinct from the row\n// content below — especially on sparse, single-column tables. For sortable headers (rendered as a\n// button, whose label weight isn't a prop) the same weight is forced onto the inner Text.\nconst HeaderSortButton = styled(Button)`\n & [data-ui='Text'] {\n font-weight: 600;\n }\n`\n\nconst BasicHeader = ({text}: {text: string}) => (\n <Box padding={2}>\n <Text muted size={1} weight=\"semibold\">\n {text}\n </Text>\n </Box>\n)\n\nconst SortHeaderButton = ({\n header,\n text,\n paddingLeft,\n}: Omit<ButtonProps, 'text'> &\n HeaderProps & {\n text: string\n }) => {\n const {sort, setSortColumn} = useTableContext()\n const sortIcon = useMemo(\n () => (\n <MotionIcon\n initial={false}\n animate={{rotate: sort?.direction === 'asc' ? 0 : 180}}\n transition={{duration: 0.25, ease: 'easeInOut'}}\n />\n ),\n [sort?.direction],\n )\n\n return (\n <HeaderSortButton\n iconRight={header.sorting && sort?.column === header.id ? sortIcon : undefined}\n onClick={() => setSortColumn(String(header.id))}\n mode=\"bleed\"\n size=\"default\"\n // Optional left-inset override so a header label can line up with content that is inset less\n // than the default button padding (e.g. an 8px cell). Defaults to the button's own padding.\n paddingLeft={paddingLeft}\n text={text}\n />\n )\n}\n\nconst TableHeaderSearch = ({\n headerProps,\n searchDisabled,\n placeholder,\n}: HeaderProps & {placeholder?: string}) => {\n const {t} = useTranslation()\n const {setSearchTerm, searchTerm} = useTableContext()\n\n return (\n <Stack {...headerProps} flex={1} paddingY={2} paddingRight={3} sizing=\"border\">\n <TextInput\n border={false}\n fontSize={1}\n icon={SearchIcon}\n placeholder={placeholder || t('search.placeholder')}\n radius={3}\n value={searchTerm || ''}\n disabled={searchDisabled}\n onChange={(event) => setSearchTerm(event.currentTarget.value)}\n onClear={() => setSearchTerm('')}\n clearButton={!!searchTerm}\n />\n </Stack>\n )\n}\n\nconst STICKY_HEADER_STYLE: CSSProperties = {position: 'sticky', top: 0, zIndex: 1}\n\n/**\n *\n * @internal\n */\nexport const TableHeader = ({headers, searchDisabled}: TableHeaderProps) => {\n return (\n <Card as=\"thead\" borderBottom style={STICKY_HEADER_STYLE}>\n <Flex\n as=\"tr\"\n style={{\n paddingInline: `max(\n calc((100% - var(--maxInlineSize)) / 2),\n var(--paddingInline)\n )`,\n }}\n >\n {headers.map(\n ({header: Header, style, width, id, sorting}) =>\n !!Header && (\n <Header\n key={String(id)}\n headerProps={{\n as: 'th',\n id: String(id),\n style: {...style, width: width || undefined},\n }}\n header={{id, sorting}}\n searchDisabled={searchDisabled}\n />\n ),\n )}\n </Flex>\n </Card>\n )\n}\n\nexport const Headers = {\n SortHeaderButton,\n TableHeaderSearch,\n BasicHeader,\n}\n","import {type CSSProperties, type ReactNode, useMemo} from 'react'\n\ninterface TableLayoutProps {\n isEmptyState: boolean\n header: ReactNode\n content: ReactNode\n contentHeight?: string\n}\n\n// borderSpacing: 0 on both states so the header sits at the same offset whether the table renders\n// as a grid (empty state) or a default table box (populated). Without it, the populated table keeps\n// the browser-default 2px border-spacing and the header shifts ~2px when the last row filters out.\nconst emptyTableStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'grid',\n gridTemplateRows: 'auto 1fr',\n borderSpacing: 0,\n}\n\nconst defaultTableStyle: CSSProperties = {\n width: '100%',\n borderSpacing: 0,\n}\n\n/**\n * @internal\n */\nexport const TableLayout = ({isEmptyState, header, content, contentHeight}: TableLayoutProps) => {\n // display: block makes the tbody the containing block for the absolutely\n // positioned virtualized rows in Safari too — WebKit doesn't support\n // `position: relative` on internal table boxes (https://bugs.webkit.org/show_bug.cgi?id=240961),\n // which left the rows positioned from the top of the table and the first row\n // hidden behind the sticky header\n const tbodyStyle = useMemo<CSSProperties>(\n () =>\n isEmptyState\n ? {display: 'block', height: '100%', position: 'relative', overflow: 'hidden'}\n : {display: 'block', height: contentHeight, position: 'relative'},\n [isEmptyState, contentHeight],\n )\n\n return (\n <div style={{height: '100%'}}>\n <table style={isEmptyState ? emptyTableStyle : defaultTableStyle}>\n {header}\n <tbody style={tbodyStyle}>{content}</tbody>\n </table>\n </div>\n )\n}\n","import {Box, Card, type CardProps, Flex, rem, Text, useTheme} from '@sanity/ui'\nimport {useVirtualizer, type VirtualItem} from '@tanstack/react-virtual'\nimport {isValid} from 'date-fns/isValid'\nimport get from 'lodash-es/get.js'\nimport {type CSSProperties, type ElementType, Fragment, useMemo} from 'react'\n\nimport {TooltipDelayGroupProvider} from '../../../../../ui-components/tooltipDelayGroupProvider/TooltipDelayGroupProvider'\nimport {TableEmptyState} from './TableEmptyState'\nimport {TableHeader} from './TableHeader'\nimport {TableLayout} from './TableLayout'\nimport {TableProvider, type TableSort, useTableContext} from './TableProvider'\nimport {type Column} from './types'\n\ntype RowDatum<TableData, AdditionalRowTableData> = (AdditionalRowTableData extends undefined\n ? TableData\n : TableData & AdditionalRowTableData) & {isLoading?: boolean}\n\nexport type TableRowProps = CardProps<ElementType>\n\ntype VirtualDatum = {\n virtualRow: VirtualItem\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport interface TableProps<TableData, AdditionalRowTableData> {\n columnDefs: Column<RowDatum<TableData, AdditionalRowTableData>>[]\n searchFilter?: (data: TableData[], searchTerm: string) => TableData[]\n data: TableData[]\n emptyState: (() => React.JSX.Element) | string\n loading?: boolean\n /**\n * Should be the dot separated path to the unique identifier of the row. e.g. document._id\n */\n rowId: string\n rowActions?: ({\n datum,\n }: {\n datum: RowDatum<TableData, AdditionalRowTableData> | unknown\n }) => React.ReactNode\n rowProps?: (datum: TableData) => Partial<TableRowProps>\n scrollContainerRef: HTMLDivElement | null\n hideTableInlinePadding?: boolean\n}\n\nconst ITEM_HEIGHT = 59\nconst LOADING_ROW_COUNT = 3\n\nconst TableInner = <TableData, AdditionalRowTableData>({\n columnDefs,\n data,\n emptyState,\n searchFilter,\n rowId,\n rowActions,\n loading = false,\n rowProps = () => ({}),\n scrollContainerRef,\n hideTableInlinePadding = false,\n}: TableProps<TableData, AdditionalRowTableData>) => {\n const {searchTerm, sort} = useTableContext()\n\n const filteredData = useMemo(() => {\n const filteredResult = searchFilter ? searchFilter(data, searchTerm || '') : data\n if (!sort) return filteredResult\n\n const sortColumn = columnDefs.find((column) => column.id === sort.column)\n return [...filteredResult].sort((a, b) => {\n let order: number\n\n const [aValue, bValue]: (number | string)[] = [a, b].map(\n (sortValue) =>\n sortColumn?.sortTransform?.(\n sortValue as RowDatum<TableData, AdditionalRowTableData>,\n sort.direction,\n ) ?? get(sortValue, sort.column),\n )\n if (\n typeof aValue === 'string' &&\n typeof bValue === 'string' &&\n !isValid(aValue) &&\n !isValid(bValue)\n ) {\n order = aValue.toLowerCase().localeCompare(bValue.toLowerCase())\n } else {\n const parseDate = (datum: number | string) => {\n if (sortColumn?.sortTransform && typeof datum === 'number') return datum\n\n return typeof datum === 'string' ? Date.parse(datum) : 0\n }\n\n const [aDate, bDate] = [aValue, bValue].map(parseDate)\n\n order = aDate - bDate\n }\n\n if (sort.direction === 'asc') return order\n return -order\n })\n }, [columnDefs, data, searchFilter, searchTerm, sort])\n\n const rowVirtualizer = useVirtualizer({\n count: filteredData.length,\n getScrollElement: () => scrollContainerRef,\n estimateSize: () => ITEM_HEIGHT,\n overscan: 5,\n })\n\n const rowActionColumnDef: Column = useMemo(\n () => ({\n id: 'actions',\n sorting: false,\n // Header and body rows are independent flexboxes: this trailing gutter must be the SAME width\n // in both, otherwise the flex:1 \"Document\" column absorbs the difference in the body only and\n // every column to its right (Last edited, Edited by) drifts out of alignment with its header.\n // The body cell below is content-box (width:25px + padding:3 => ~50px actual), so reserve 50\n // here and size the header (border-box) to 50px to match — under-reserving clips the ⋯.\n width: 50,\n header: ({headerProps: {id}}) => (\n <Flex as=\"th\" id={id} paddingY={3} paddingX={3} sizing=\"border\" style={{width: '50px'}}>\n <Text muted size={1} weight=\"medium\">\n \n </Text>\n </Flex>\n ),\n cell: ({datum, cellProps: {id}}) => (\n <Flex as=\"td\" id={id} align=\"center\" flex=\"none\" padding={3} style={{width: '25px'}}>\n {(!datum.isLoading && rowActions?.({datum})) || <Box style={{width: '25px'}} />}\n </Flex>\n ),\n }),\n [rowActions],\n )\n\n const amalgamatedColumnDefs = useMemo(\n () =>\n (rowActions ? [...columnDefs, rowActionColumnDef] : columnDefs).filter(\n (column) => !column.hidden,\n ),\n [columnDefs, rowActionColumnDef, rowActions],\n )\n\n const tableMinWidth = useMemo(\n () => amalgamatedColumnDefs.reduce((sum, col) => sum + (col.width || 200), 0),\n [amalgamatedColumnDefs],\n )\n\n const renderRow = useMemo(\n () =>\n function TableRow(\n datum: VirtualDatum &\n (TableData | (TableData & AdditionalRowTableData) | {_id: string; isLoading: boolean}),\n ) {\n const {style: rowPropsStyle, ...cardRowProps} = rowProps(datum as TableData)\n const cardKey = loading ? `skeleton-${datum.index}` : String(get(datum, rowId))\n\n return (\n <Card\n key={cardKey}\n data-testid={loading ? 'table-row-skeleton' : 'table-row'}\n borderBottom\n display=\"flex\"\n data-index={datum.index}\n as=\"tr\"\n style={{\n height: `${datum.virtualRow.size}px`,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n transform: `translateY(${datum.virtualRow.start}px)`,\n paddingInline: `max(\n calc((100% - var(--maxInlineSize)) / 2),\n var(--paddingInline)\n )`,\n // Consumer-supplied row styles are merged (not clobbered) so they can tint/flag a row\n // without dropping the virtualization layout (height/position/transform).\n ...rowPropsStyle,\n }}\n {...cardRowProps}\n >\n {amalgamatedColumnDefs.map(({cell: Cell, style, width, id, sorting = false}) => (\n <Fragment key={String(id)}>\n <Cell\n datum={\n {...datum, isLoading: loading} as RowDatum<TableData, AdditionalRowTableData>\n }\n cellProps={{\n as: 'td',\n id: String(id),\n style: {...style, width: width || undefined},\n }}\n sorting={sorting}\n />\n </Fragment>\n ))}\n </Card>\n )\n },\n [amalgamatedColumnDefs, loading, rowId, rowProps],\n )\n\n const emptyContent = useMemo(\n () => <TableEmptyState emptyState={emptyState} colSpan={amalgamatedColumnDefs.length} />,\n [amalgamatedColumnDefs.length, emptyState],\n )\n\n const headers = useMemo(\n () =>\n amalgamatedColumnDefs.map(({cell, sortTransform, ...header}) => ({\n ...header,\n id: String(header.id),\n })),\n [amalgamatedColumnDefs],\n )\n\n const theme = useTheme()\n\n const maxInlineSize = (!hideTableInlinePadding && theme.sanity.v2?.container[3]) || 0\n\n const renderLoadingRows = (\n rowRenderer: (\n datum: VirtualDatum &\n ({_id: string; isLoading: boolean} | TableData | (TableData & AdditionalRowTableData)),\n ) => React.ReactNode,\n ) => {\n return Array.from({length: LOADING_ROW_COUNT}).map((_el, index) => {\n const cardKey = `skeleton-${index}`\n const virtualRow: VirtualItem = {\n index,\n start: index * ITEM_HEIGHT,\n size: ITEM_HEIGHT,\n lane: 0,\n key: cardKey,\n end: index * ITEM_HEIGHT + ITEM_HEIGHT,\n }\n\n return rowRenderer({\n _id: cardKey,\n isLoading: true,\n virtualRow,\n index,\n isFirst: index === 0,\n isLast: index === LOADING_ROW_COUNT - 1,\n })\n })\n }\n\n const tableContent = () => {\n if (loading) {\n return renderLoadingRows(renderRow)\n }\n\n if (filteredData.length === 0) {\n return emptyContent\n }\n\n return rowVirtualizer.getVirtualItems().map((virtualRow, index) => {\n const datum = filteredData[virtualRow.index]\n return renderRow({\n ...datum,\n virtualRow,\n index,\n isFirst: virtualRow.index === 0,\n isLast: virtualRow.index === filteredData.length - 1,\n })\n })\n }\n\n return (\n <div style={{height: '100%'}}>\n <div\n style={\n {\n 'width': '100%',\n 'minWidth': `${tableMinWidth}px`,\n 'height': '100%',\n 'position': 'relative',\n '--maxInlineSize': rem(maxInlineSize),\n '--paddingInline': rem(theme.sanity.v2?.space[3] ?? 0),\n } as CSSProperties\n }\n >\n <TableLayout\n isEmptyState={filteredData.length === 0 && !loading}\n header={\n <TableHeader\n headers={headers}\n searchDisabled={loading || (!searchTerm && !data.length)}\n />\n }\n content={tableContent()}\n contentHeight={`${rowVirtualizer.getTotalSize()}px`}\n />\n </div>\n </div>\n )\n}\n\nexport const Table = <TableData, AdditionalRowTableData = undefined>({\n defaultSort,\n ...props\n}: TableProps<TableData, AdditionalRowTableData> & {defaultSort?: TableSort}) => {\n return (\n <TooltipDelayGroupProvider>\n <TableProvider defaultSort={defaultSort}>\n <TableInner<TableData, AdditionalRowTableData> {...props} />\n </TableProvider>\n </TooltipDelayGroupProvider>\n )\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {Badge, Box, Card, Checkbox, Container, Flex, TextInput, useMediaIndex} from '@sanity/ui'\nimport {type CSSProperties, type ReactNode, useCallback, useMemo, useState} from 'react'\n\nimport {Button} from '../../../../../ui-components/button/Button'\nimport {Table} from './Table'\nimport {type TableSort} from './TableProvider'\nimport {type Column} from './types'\n\nconst TABLE_CARD_STYLE: CSSProperties = {\n height: '100%',\n overflow: 'auto',\n // Reserve the scrollbar gutter symmetrically (both edges). Rows are centered in a container[3]\n // block; with a classic (non-overlay) scrollbar, filtering changes the row count, the scrollbar\n // appears/disappears, the content box width changes, and the centered rows jump relative to the\n // command lane above. \"stable both-edges\" keeps the content-box width constant and centered.\n scrollbarGutter: 'stable both-edges',\n}\n\n// Right-aligned, fixed-width search input.\nconst SEARCH_INPUT_STYLE: CSSProperties = {maxWidth: 280}\n\n// Default command-lane height so the browse↔bulk swap never shifts the rows below. Consumers with a\n// taller browse control (e.g. the variants overview's bordered filter group) raise it via the\n// `commandLaneMinHeight` prop so the shorter bulk toolbar reserves the same height.\nconst DEFAULT_COMMAND_LANE_MIN_HEIGHT = 33\n\n// Filter-tab strip: scrolls horizontally when the tabs outrun the width, with a subtle right-edge\n// fade cueing the overflow. When the tabs fit, the fade falls over empty space and is invisible.\nconst FILTER_TABS_STYLE: CSSProperties = {\n minWidth: 0,\n overflowX: 'auto',\n maskImage: 'linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%)',\n WebkitMaskImage: 'linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%)',\n}\n\n/**\n * Declarative selection + bulk-action config for {@link DocumentTable}. When provided, the table\n * gains a leading checkbox column (select-all in the header row, per-row checkboxes) and the command\n * lane swaps to a bulk toolbar while a selection exists.\n *\n * @internal\n */\nexport interface DocumentTableSelection<Row = unknown> {\n labels: {\n selectAll: string\n selectRow: string\n /** e.g. \"3 selected\" */\n selectedCount: (count: number) => string\n clear: string\n }\n /** The bulk actions (right of the count). `compact` is true on narrow widths — collapse to a menu. */\n renderActions: (context: {\n selectedKeys: string[]\n compact: boolean\n clear: () => void\n }) => ReactNode\n /** testId for the select-all checkbox (per-surface, so existing tests keep working). */\n selectAllTestId?: string\n /**\n * Optional predicate: rows for which this returns false get no row checkbox and never count toward\n * the selection or select-all (e.g. pending \"just added\" placeholder rows that can't be bulk-acted\n * on). Defaults to every row selectable.\n */\n isRowSelectable?: (row: Row) => boolean\n}\n\n/**\n * Shared document-table composition used by both the Releases and Variants detail tables. Wraps the\n * low-level {@link Table} and owns the three-zone header: a command lane (zone 1) with search + a\n * caller-provided filter-tab slot, swapping to a bulk toolbar on selection; the column-header row\n * (zone 2, caller columns + an injected select column); and the rows (zone 3). Search is owned here\n * (filtered before the Table sorts) so it lives in the command lane, not the column header.\n *\n * @internal\n */\nexport function DocumentTable<Row extends object>({\n rows,\n loading = false,\n columnDefs,\n rowId,\n getRowKey,\n searchPredicate,\n searchPlaceholder,\n searchTestId,\n filterTabs,\n filterTabsScroll = true,\n commandLaneMinHeight = DEFAULT_COMMAND_LANE_MIN_HEIGHT,\n alwaysShowCommandLane = false,\n commandLaneActions,\n selection,\n rowActions,\n emptyState,\n defaultSort,\n id,\n}: {\n rows: Row[]\n loading?: boolean\n columnDefs: Column<Row>[]\n rowId: string\n getRowKey: (row: Row) => string\n searchPredicate: (row: Row, searchTerm: string) => boolean\n searchPlaceholder: string\n searchTestId?: string\n filterTabs?: ReactNode\n /**\n * When true (default), the filter-tabs slot scrolls horizontally with a right-edge fade — right for\n * tab strips that outrun the width. Set false when the consumer manages its own overflow (e.g. the\n * variants overview collapses its filter chips), so the slot just fills without a scroll or fade.\n */\n filterTabsScroll?: boolean\n /**\n * Minimum height of the command lane, reserved in both the browse and bulk states so swapping\n * between them never shifts the rows. Raise it above the default when the browse controls are\n * taller than the bulk toolbar (e.g. a bordered filter group).\n */\n commandLaneMinHeight?: number\n /**\n * Keep the command lane (filters + search) mounted even when there are zero rows, so a filter or\n * search that empties the result set doesn't also hide the controls needed to change it. Surfaces\n * that own filter tabs and/or command-lane actions (release detail behind beta.variants, the\n * variants overview) turn it on.\n */\n alwaysShowCommandLane?: boolean\n /** Extra command-lane controls rendered right of the search (e.g. an \"Add document\" button). */\n commandLaneActions?: ReactNode\n selection?: DocumentTableSelection<Row>\n rowActions?: (props: {datum: unknown}) => ReactNode\n emptyState: (() => React.JSX.Element) | string\n defaultSort?: TableSort\n /** id + data-testid for the scroll container (the filter-tab `aria-controls` target). */\n id?: string\n}): React.JSX.Element {\n const mediaIndex = useMediaIndex()\n const compactBulkActions = mediaIndex < 2\n const [scrollContainerRef, setScrollContainerRef] = useState<HTMLDivElement | null>(null)\n const [searchTerm, setSearchTerm] = useState('')\n const [selectedKeys, setSelectedKeys] = useState<ReadonlySet<string>>(() => new Set())\n\n const displayRows = useMemo(() => {\n const term = searchTerm.trim()\n return term ? rows.filter((row) => searchPredicate(row, term)) : rows\n }, [rows, searchTerm, searchPredicate])\n\n // Selection is keyed by the caller's row key. The count reflects only currently-visible rows so a\n // filtered-out selection never inflates the bar.\n const selectableKeys = useMemo(\n () =>\n new Set(\n displayRows\n .filter((row) => selection?.isRowSelectable?.(row) ?? true)\n .map((row) => getRowKey(row)),\n ),\n [displayRows, getRowKey, selection],\n )\n const selectedVisibleCount = useMemo(\n () => [...selectedKeys].filter((key) => selectableKeys.has(key)).length,\n [selectedKeys, selectableKeys],\n )\n const allSelected = selectableKeys.size > 0 && selectedVisibleCount === selectableKeys.size\n const someSelected = selectedVisibleCount > 0\n\n const toggleRow = useCallback((key: string) => {\n setSelectedKeys((previous) => {\n const next = new Set(previous)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [])\n\n const toggleAll = useCallback(() => {\n setSelectedKeys((previous) => {\n // Doubles as clear: if anything visible is selected, clicking clears; otherwise selects all.\n const anyVisibleSelected = [...selectableKeys].some((key) => previous.has(key))\n return anyVisibleSelected ? new Set() : new Set(selectableKeys)\n })\n }, [selectableKeys])\n\n const clearSelection = useCallback(() => setSelectedKeys(new Set()), [])\n\n const selectColumn = useMemo<Column<Row> | null>(() => {\n if (!selection) return null\n const {labels, selectAllTestId} = selection\n return {\n id: 'select',\n width: 44,\n style: {minWidth: 44, maxWidth: 44},\n sorting: false,\n // Select-all lives in the column-header row (above the row checkboxes it governs), not the\n // command lane. Doubles as clear.\n header: ({headerProps}) => (\n <Flex {...headerProps} align=\"center\" justify=\"center\" paddingY={3} sizing=\"border\">\n <Checkbox\n aria-label={labels.selectAll}\n checked={allSelected}\n data-testid={selectAllTestId}\n indeterminate={someSelected && !allSelected}\n onChange={toggleAll}\n />\n </Flex>\n ),\n cell: ({cellProps, datum}) => (\n <Flex {...cellProps} align=\"center\" justify=\"center\" paddingX={2} sizing=\"border\">\n {!datum.isLoading && (selection?.isRowSelectable?.(datum) ?? true) && (\n <Checkbox\n aria-label={labels.selectRow}\n checked={selectedKeys.has(getRowKey(datum))}\n onChange={() => toggleRow(getRowKey(datum))}\n onClick={(event) => event.stopPropagation()}\n />\n )}\n </Flex>\n ),\n }\n }, [selection, allSelected, someSelected, toggleAll, selectedKeys, getRowKey, toggleRow])\n\n const amalgamatedColumnDefs = useMemo(\n () => (selectColumn ? [selectColumn, ...columnDefs] : columnDefs),\n [selectColumn, columnDefs],\n )\n\n const selectedKeyList = useMemo(\n () => [...selectedKeys].filter((key) => selectableKeys.has(key)),\n [selectedKeys, selectableKeys],\n )\n\n const hasDocuments = !loading && rows.length > 0\n // Keep the lane mounted for filter-owning surfaces even when a filter/search empties the rows (so\n // the controls to undo that never disappear with the results) AND during the initial load (so the\n // filter-tab loading skeletons stay up and the search/filters don't pop in with a layout shift\n // once documents arrive).\n const showCommandLane = hasDocuments || alwaysShowCommandLane\n const showBulkToolbar = Boolean(selection) && selectedVisibleCount > 0\n\n return (\n <Flex direction=\"column\" flex={1} height=\"fill\" overflow=\"hidden\" style={{minHeight: 0}}>\n {/* Command lane (zone 1). Fixed height so the browse↔bulk swap never shifts the rows. Idle:\n filter tabs lead from the left (aligned with the columns), search is right-aligned. On\n selection: selected count + Clear on the left, caller's bulk actions on the right.\n container[3] + paddingX={2} aligns the lane with the table's row content below. */}\n {showCommandLane && (\n <Card flex=\"none\" borderBottom paddingY={2}>\n <Container flex=\"none\" width={3}>\n <Box paddingX={2}>\n <Flex align=\"center\" gap={3} style={{minHeight: commandLaneMinHeight}}>\n {showBulkToolbar && selection ? (\n <>\n <Badge data-testid=\"document-table-selected-count\" fontSize={1} tone=\"primary\">\n {selection.labels.selectedCount(selectedVisibleCount)}\n </Badge>\n <Button\n data-testid=\"document-table-clear-selection\"\n mode=\"bleed\"\n onClick={clearSelection}\n text={selection.labels.clear}\n />\n <Box flex={1} />\n {selection.renderActions({\n selectedKeys: selectedKeyList,\n compact: compactBulkActions,\n clear: clearSelection,\n })}\n </>\n ) : (\n <>\n {filterTabs && (\n <Box flex={1} style={filterTabsScroll ? FILTER_TABS_STYLE : {minWidth: 0}}>\n {filterTabs}\n </Box>\n )}\n {/* With filter tabs, search is a fixed-width control pinned to the right (tabs\n lead from the left). Without them, it fills the lane so it doesn't strand a\n wide empty gutter — e.g. the variants overview, which has no filter tabs. */}\n <Box\n flex={filterTabs ? 'none' : 1}\n style={filterTabs ? SEARCH_INPUT_STYLE : undefined}\n >\n <TextInput\n aria-label={searchPlaceholder}\n clearButton={Boolean(searchTerm)}\n data-testid={searchTestId}\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearchTerm(event.currentTarget.value)}\n onClear={() => setSearchTerm('')}\n placeholder={searchPlaceholder}\n value={searchTerm}\n />\n </Box>\n {commandLaneActions ? <Box flex=\"none\">{commandLaneActions}</Box> : null}\n </>\n )}\n </Flex>\n </Box>\n </Container>\n </Card>\n )}\n <Card data-testid={id} flex={1} id={id} ref={setScrollContainerRef} style={TABLE_CARD_STYLE}>\n <Table<Row>\n columnDefs={amalgamatedColumnDefs}\n data={displayRows}\n defaultSort={defaultSort}\n emptyState={emptyState}\n loading={loading}\n rowActions={rowActions}\n rowId={rowId}\n scrollContainerRef={scrollContainerRef}\n />\n </Card>\n </Flex>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport {useClient} from '../../hooks/useClient'\nimport {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../studioClient'\nimport {getTransactionsLogs} from './getTransactionsLogs'\n\n// Cache the resolved editor per (documentId, revision) so re-renders and remounts don't refetch the\n// same transaction. Keyed on revision too, so a fresh edit invalidates the entry.\nconst lastEditedByCache: Record<string, string | undefined> = Object.create(null)\n\n// The history/translog API 429s when many rows fetch at once (e.g. a large documents table mounting\n// all at once). Limit concurrency to the same ceiling the release document-history hook uses — 10\n// was the highest that ran without consistent 429s.\nlet activeStreams = 0\nconst pendingResolvers: Array<() => void> = []\nasync function acquireSlot(maxConcurrent = 10): Promise<void> {\n if (activeStreams >= maxConcurrent) {\n await new Promise<void>((resolve) => pendingResolvers.push(resolve))\n }\n activeStreams += 1\n}\nfunction releaseSlot(): void {\n activeStreams = Math.max(0, activeStreams - 1)\n const next = pendingResolvers.shift()\n if (next) next()\n}\n\n/**\n * Resolves the user id of whoever last edited a document — the author of its most recent\n * transaction. Reads a single transaction (`limit: 1, reverse: true`) from the transaction log,\n * concurrency-limited so a table of rows doesn't stampede the history API, and cached per\n * `(documentId, revision)`.\n *\n * Returns just the user id; render it with `UserAvatar` / `useUser` at the call site.\n *\n * @internal\n */\nexport function useDocumentLastEditedBy(\n documentId: string | undefined,\n revision?: string,\n): {lastEditedBy: string | undefined; loading: boolean} {\n const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)\n const cacheKey = documentId ? `${documentId}-${revision ?? ''}` : ''\n const cachedInitial = cacheKey ? lastEditedByCache[cacheKey] : undefined\n const [lastEditedBy, setLastEditedBy] = useState<string | undefined>(cachedInitial)\n const [loading, setLoading] = useState<boolean>(\n Boolean(documentId) && !(cacheKey in lastEditedByCache),\n )\n\n // Reset during render when (documentId, revision) changes to a new cacheKey, before the new\n // fetch settles — the sibling useReleaseHistory hook fixes the same false-settled flash this\n // way. Without this, `lastEditedBy`/`loading` hold the PREVIOUS key's values (or a stale\n // \"loading: false\" once the previous fetch already settled) until the effect re-runs. Resetting\n // from the cache — rather than unconditionally to `undefined`/`true` — means a key that's\n // already cached settles immediately instead of flashing a loading skeleton.\n const [prevCacheKey, setPrevCacheKey] = useState(cacheKey)\n if (cacheKey !== prevCacheKey) {\n setPrevCacheKey(cacheKey)\n setLastEditedBy(cacheKey ? lastEditedByCache[cacheKey] : undefined)\n setLoading(Boolean(documentId) && !(cacheKey in lastEditedByCache))\n }\n\n const cancelledRef = useRef(false)\n\n const fetchLastEditor = useCallback(async (): Promise<void> => {\n if (!documentId) {\n setLastEditedBy(undefined)\n setLoading(false)\n return\n }\n\n if (cacheKey in lastEditedByCache) {\n setLastEditedBy(lastEditedByCache[cacheKey])\n setLoading(false)\n return\n }\n\n setLoading(true)\n await acquireSlot()\n // run().catch().finally() rather than try/catch/finally because the React Compiler does not yet\n // fully support the latter — matches the sibling release-history hook.\n const run = async () => {\n const transactions = await getTransactionsLogs(client, documentId, {\n tag: 'sanity.studio.document.last-edited-by',\n effectFormat: 'mendoza',\n excludeContent: true,\n includeIdentifiedDocumentsOnly: true,\n limit: 1,\n reverse: true,\n })\n if (cancelledRef.current) return\n const author = transactions[0]?.author\n lastEditedByCache[cacheKey] = author\n setLastEditedBy(author)\n }\n await run()\n .catch((error) => {\n console.error('Failed to fetch document last-editor history:', error)\n if (!cancelledRef.current) setLastEditedBy(undefined)\n })\n .finally(() => {\n releaseSlot()\n if (!cancelledRef.current) setLoading(false)\n })\n }, [cacheKey, client, documentId])\n\n useEffect(() => {\n cancelledRef.current = false\n // oxlint-disable-next-line react/react-compiler\n void fetchLastEditor()\n return () => {\n cancelledRef.current = true\n }\n }, [fetchLastEditor])\n\n return useMemo(() => ({lastEditedBy, loading}), [lastEditedBy, loading])\n}\n","import {Flex, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {useDocumentLastEditedBy} from '../../store/translog/useDocumentLastEditedBy'\nimport {useUser} from '../../store/user/hooks'\nimport {AvatarSkeleton, UserAvatar} from '../userAvatar/UserAvatar'\n\n// container-query wrapper: show the editor's name when the cell has room, collapse to just the\n// avatar when the column is squeezed narrow. The avatar always carries the name in its tooltip, so\n// nothing is lost when the label is hidden. `width: 100%` is required: `container-type: inline-size`\n// imposes size containment, so without a definite width the element collapses to ~0 (a shrink-to-fit\n// flex item derives no intrinsic width once contained) and the query would report \"narrow\" always.\nconst CellRoot = styled(Flex)`\n container-type: inline-size;\n width: 100%;\n min-width: 0;\n`\nconst NameText = styled(Text)`\n min-width: 0;\n @container (max-width: 108px) {\n display: none;\n }\n`\n\n/**\n * Presentation for an \"Edited by\" cell: the avatar + display name of a resolved editor id. A\n * person-named column (not just an avatar) is what distinguishes authorship from live presence — the\n * two used to read as the same round avatar. Collapses to avatar-only when the column is too narrow\n * to fit the name. Shared by the Releases and Variant document tables, each of which resolves the\n * editor id through its own history source.\n *\n * @internal\n */\nexport function EditedByAvatar({\n userId,\n loading,\n}: {\n userId: string | undefined\n loading: boolean\n}): React.JSX.Element | null {\n const [user] = useUser(userId ?? '')\n\n if (loading) {\n return <AvatarSkeleton $size={0} animated />\n }\n\n if (!userId) {\n return null\n }\n\n return (\n <CellRoot align=\"center\" gap={2}>\n <UserAvatar size={0} user={userId} withTooltip />\n {user?.displayName && (\n <NameText muted size={1} textOverflow=\"ellipsis\">\n {user.displayName}\n </NameText>\n )}\n </CellRoot>\n )\n}\n\n/**\n * \"Edited by\" cell for the variant document table: resolves the last editor from the document's\n * transaction log, then renders {@link EditedByAvatar}.\n *\n * @internal\n */\nexport function EditedByCell({\n documentId,\n revision,\n}: {\n documentId: string | undefined\n revision?: string\n}): React.JSX.Element | null {\n const {lastEditedBy, loading} = useDocumentLastEditedBy(documentId, revision)\n\n return <EditedByAvatar loading={loading} userId={lastEditedBy} />\n}\n","/**\n * Extracts a searchable string from a field value, handling various data types\n * @param value - The field value to extract text from\n * @param depth - Current recursion depth\n * @param visited - Array of visited objects thath ave been proceeded so far\n * @returns A string representation suitable for search\n */\nexport function extractSearchableText(\n value: unknown,\n depth: number = 0,\n visited: Array<unknown> = [],\n): string {\n if (typeof value === 'undefined' || value === null) return ''\n\n // Limit recursion depth to avoid going too deeply into a nested structure\n if (depth > 3) return ''\n\n // Handle primitive types\n if (typeof value === 'string') return value\n if (typeof value === 'number') return value.toString()\n\n // Handle Portable Text\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (typeof item === 'object' && item.children && item._type === 'block') {\n return item.children\n .map((child: {text: string}) => child.text)\n .join(' ')\n .trim()\n }\n // If there are nested arrays, then we need to extract the text from the nested arrays\n if (Array.isArray(item)) {\n return extractSearchableText(item, depth + 1, visited)\n }\n\n // Handle other types (numbers, string)\n return item.toString().trim()\n })\n .filter(Boolean)\n .join(' ')\n }\n\n // Handle objects\n if (typeof value === 'object' && value !== null) {\n // Limit the number of items proceeded through the search as to avoid too deep recursion\n // that impacts performance. If the object has already been visited, then there is no need to proceed further.\n if (visited.includes(value)) return ''\n visited.push(value)\n\n // Handle localized objects (common pattern: {en: \"title\", no: \"tittel\"})\n // However, make sure that the values are not internal Sanity keys (starting with _)\n const entries = Object.entries(value)\n if (\n entries.length > 0 &&\n entries.every(([key, val]) => typeof val !== 'boolean' && !key.startsWith('_'))\n ) {\n return entries\n .map(([, val]) => extractSearchableText(val, depth + 1, visited))\n .filter(Boolean)\n .join(' ')\n }\n\n // Handle objects with specific properties (like {title: \"value\"})\n const title =\n 'title' in value && typeof value.title === 'string'\n ? value.title.toString().trim()\n : undefined\n const name =\n 'name' in value && typeof value.name === 'string' ? value.name.toString().trim() : undefined\n const text =\n 'text' in value && typeof value.text === 'string' ? value.text.toString().trim() : undefined\n\n if (title || name || text) {\n return [title, name, text].filter(Boolean).join(' ')\n }\n\n // Generic object handling - extract all string/number values\n return entries\n .filter(([key]) => !key.startsWith('_')) // Skip metadata keys\n .map(([, val]) => extractSearchableText(val, depth + 1, visited))\n .filter(Boolean)\n .join(' ')\n }\n\n return ''\n}\n","import {type SanityDocument} from '@sanity/types'\n\nimport {extractSearchableText} from './extractSearchableText'\n\n/**\n * This is a temporary way of doing the search without the previews\n * until we have it moved to the server side\n * Each document is searchable by title, name, and combined text of title and name, this could be different\n * than the displayed title, given the displayed title is resolved by the preview prepare function, but we cannot use that one\n * here because we will be over-fetching the documents, we will need to resolve the preview for hundreds of documents if we do that.\n *\n * So this is an intermediate solution to allow the search to work without the resolved preview values.\n *\n *\n * @param document - The document to search\n * @param searchTerm - The search term\n * @returns True if the document matches the search term, false otherwise\n */\nexport function searchDocumentRelease(document: SanityDocument, searchTerm: string) {\n // if there is no search term or the document has no title or name, return false\n if (!searchTerm || searchTerm.trim().length === 0 || (!document.title && !document.name)) {\n return false\n }\n\n const title = extractSearchableText(document.title)\n const name = extractSearchableText(document.name)\n\n const normalizedSearchTerm = searchTerm.toLowerCase().trim()\n const normalizedTitle = title.toLowerCase()\n const normalizedName = name.toLowerCase()\n\n const hasTitle = normalizedTitle.trim().length > 0\n const hasName = normalizedName.trim().length > 0\n\n // Create a combined searchable text from both title and name\n const combinedText = `${normalizedTitle} ${normalizedName}`\n\n // Split search term into words for more flexible matching\n const searchWords = normalizedSearchTerm.split(/\\s+/).filter((word) => word.length > 0)\n\n // Check if all search words are found in either title, name, or combined text\n const allWordsMatch = searchWords.every(\n (word) =>\n (hasTitle && normalizedTitle.includes(word)) ||\n (hasName && normalizedName.includes(word)) ||\n combinedText.includes(word),\n )\n\n // Also check if the document name/title is contained within the search term\n const documentInSearchTerm =\n (hasName && normalizedSearchTerm.includes(normalizedName)) ||\n (hasTitle && normalizedSearchTerm.includes(normalizedTitle))\n\n return allWordsMatch || documentInSearchTerm\n}\n"],"mappings":"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"}
|