@nhtio/lucid-resourceful-vue-components 1.20260107.0 → 1.20260108.0
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/{VChip-DWwcL8cL.mjs → VChip-DakTCdq2.mjs} +2 -2
- package/{VChip-DWwcL8cL.mjs.map → VChip-DakTCdq2.mjs.map} +1 -1
- package/{VDatePicker-C7_ULYfO.mjs → VDatePicker-DlZlcF2O.mjs} +4 -4
- package/{VDatePicker-C7_ULYfO.mjs.map → VDatePicker-DlZlcF2O.mjs.map} +1 -1
- package/{VDialog-BVRDhoD7.mjs → VDialog-BljV_Pfu.mjs} +3 -3
- package/{VDialog-BVRDhoD7.mjs.map → VDialog-BljV_Pfu.mjs.map} +1 -1
- package/{VEmptyState-C2B0Znk9.mjs → VEmptyState-BubXzExt.mjs} +2 -2
- package/{VEmptyState-C2B0Znk9.mjs.map → VEmptyState-BubXzExt.mjs.map} +1 -1
- package/{VHover-DnB1GlWG.mjs → VHover-DYt7f7-R.mjs} +3 -3
- package/{VHover-DnB1GlWG.mjs.map → VHover-DYt7f7-R.mjs.map} +1 -1
- package/{VListItem-DojRgtpe.mjs → VListItem-CHkJtaF9.mjs} +4 -4
- package/{VListItem-DojRgtpe.mjs.map → VListItem-CHkJtaF9.mjs.map} +1 -1
- package/{VMenu-D2biKkpd.mjs → VMenu-Xveh72QZ.mjs} +3 -3
- package/{VMenu-D2biKkpd.mjs.map → VMenu-Xveh72QZ.mjs.map} +1 -1
- package/{VPicker-dxKS1KK4.mjs → VPicker-D9TBI61U.mjs} +4 -4
- package/{VPicker-dxKS1KK4.mjs.map → VPicker-D9TBI61U.mjs.map} +1 -1
- package/{VRadioGroup-lC_c6Ath.mjs → VRadioGroup-CFazRh5q.mjs} +4 -4
- package/{VRadioGroup-lC_c6Ath.mjs.map → VRadioGroup-CFazRh5q.mjs.map} +1 -1
- package/{VRow-BBY2gEjT.mjs → VRow-Db84ydOG.mjs} +2 -2
- package/{VRow-BBY2gEjT.mjs.map → VRow-Db84ydOG.mjs.map} +1 -1
- package/{VSheet-B4SA9_dv.mjs → VSheet-CX-0tYk0.mjs} +2 -2
- package/{VSheet-B4SA9_dv.mjs.map → VSheet-CX-0tYk0.mjs.map} +1 -1
- package/{actions-CXhEUJp6.mjs → actions-CAGyXfrI.mjs} +12 -12
- package/{actions-CXhEUJp6.mjs.map → actions-CAGyXfrI.mjs.map} +1 -1
- package/{alert-B0j6GH3V.mjs → alert-D4Zq_X5a.mjs} +11 -11
- package/{alert-B0j6GH3V.mjs.map → alert-D4Zq_X5a.mjs.map} +1 -1
- package/{bigint-DXS_rVbG.mjs → bigint-MqcXh7nS.mjs} +7 -7
- package/{bigint-DXS_rVbG.mjs.map → bigint-MqcXh7nS.mjs.map} +1 -1
- package/{boolean-BTu-4Ihs.mjs → boolean-h31TIpoH.mjs} +10 -10
- package/{boolean-BTu-4Ihs.mjs.map → boolean-h31TIpoH.mjs.map} +1 -1
- package/{clipboard-C6YTX8YB.mjs → clipboard-jPiC4eq0.mjs} +7 -7
- package/{clipboard-C6YTX8YB.mjs.map → clipboard-jPiC4eq0.mjs.map} +1 -1
- package/{common-a_cd4SQg.mjs → common-CRFL2oQX.mjs} +1362 -1362
- package/common-CRFL2oQX.mjs.map +1 -0
- package/components/autorefresh_controller.mjs +1 -1
- package/components/control_button.mjs +1 -1
- package/components/control_button_bar.mjs +2 -2
- package/components/control_menu.mjs +1 -1
- package/components/custom_field.mjs +1 -1
- package/components/exporter.mjs +1 -1
- package/components/fields/bigint.mjs +1 -1
- package/components/fields/boolean.mjs +1 -1
- package/components/fields/date.mjs +1 -1
- package/components/fields/date_time.mjs +1 -1
- package/components/fields/enum.mjs +1 -1
- package/components/fields/integer.mjs +1 -1
- package/components/fields/number.mjs +1 -1
- package/components/fields/string.mjs +1 -1
- package/components/fields/unsigned_integer.mjs +1 -1
- package/components/fields.mjs +9 -9
- package/components/form_with_validation.mjs +1 -1
- package/components/resourceful_alerter.mjs +1 -1
- package/components/resourceful_index.mjs +1 -1
- package/components/resourceful_record.mjs +2 -2
- package/components/resourceful_record_default_form.mjs +1 -1
- package/components/resourceful_record_form.mjs +1 -1
- package/components/sortable.mjs +1 -1
- package/components/svg_icon.mjs +1 -1
- package/components/timezone_picker.mjs +1 -1
- package/components.mjs +23 -23
- package/composables.mjs +11 -11
- package/{custom-CgyU3A_B.mjs → custom-Dj2ib6qT.mjs} +7 -7
- package/{custom-CgyU3A_B.mjs.map → custom-Dj2ib6qT.mjs.map} +1 -1
- package/{date-B8edF8kU.mjs → date-fxb-e0m9.mjs} +10 -10
- package/{date-B8edF8kU.mjs.map → date-fxb-e0m9.mjs.map} +1 -1
- package/{date_time-BNsYnH-e.mjs → date_time-n4zJtaSr.mjs} +18 -18
- package/{date_time-BNsYnH-e.mjs.map → date_time-n4zJtaSr.mjs.map} +1 -1
- package/{display-CHspVOz6.mjs → display-DNgEbAdH.mjs} +38 -38
- package/{display-CHspVOz6.mjs.map → display-DNgEbAdH.mjs.map} +1 -1
- package/{display-pfXaBUr6.mjs → display-DxJktZAm.mjs} +4 -4
- package/{display-pfXaBUr6.mjs.map → display-DxJktZAm.mjs.map} +1 -1
- package/{enum-DoxJn16e.mjs → enum-CjkTx4L6.mjs} +9 -9
- package/{enum-DoxJn16e.mjs.map → enum-CjkTx4L6.mjs.map} +1 -1
- package/{exceptions-BeFuVcrH.mjs → exceptions-lwCt3BKI.mjs} +2 -2
- package/{exceptions-BeFuVcrH.mjs.map → exceptions-lwCt3BKI.mjs.map} +1 -1
- package/exceptions.mjs +2 -2
- package/factories.mjs +2 -2
- package/{field_composer-CPqM1aSV.mjs → field_composer-B_4w9YL9.mjs} +3 -3
- package/{field_composer-CPqM1aSV.mjs.map → field_composer-B_4w9YL9.mjs.map} +1 -1
- package/{form-BkQlevYR.mjs → form-B7uOzLn2.mjs} +15 -15
- package/{form-BkQlevYR.mjs.map → form-B7uOzLn2.mjs.map} +1 -1
- package/{guards-D0G8CU2m.mjs → guards-BI3Zu4tN.mjs} +2 -2
- package/{guards-D0G8CU2m.mjs.map → guards-BI3Zu4tN.mjs.map} +1 -1
- package/guards.mjs +4 -4
- package/helpers.mjs +12 -12
- package/{http-ChBUYgv8.mjs → http-B7MNWS03.mjs} +2 -2
- package/{http-ChBUYgv8.mjs.map → http-B7MNWS03.mjs.map} +1 -1
- package/{http-C15bx-Gn.mjs → http-C2_4xIMQ.mjs} +9 -6
- package/{http-C15bx-Gn.mjs.map → http-C2_4xIMQ.mjs.map} +1 -1
- package/http.mjs +1 -1
- package/{index-DHoLuRuJ.mjs → index-3roRSYqk.mjs} +6 -6
- package/{index-DHoLuRuJ.mjs.map → index-3roRSYqk.mjs.map} +1 -1
- package/{index-CvhhGjZn.mjs → index-B-PEjqXn.mjs} +3 -3
- package/{index-CvhhGjZn.mjs.map → index-B-PEjqXn.mjs.map} +1 -1
- package/{index-CdaTAyzs.mjs → index-BC-vhUQX.mjs} +15 -15
- package/{index-CdaTAyzs.mjs.map → index-BC-vhUQX.mjs.map} +1 -1
- package/{index-CduefDwU.mjs → index-BJmmZly3.mjs} +3 -3
- package/{index-CduefDwU.mjs.map → index-BJmmZly3.mjs.map} +1 -1
- package/{index-DLzoBhUb.mjs → index-BawSct2l.mjs} +4 -4
- package/{index-DLzoBhUb.mjs.map → index-BawSct2l.mjs.map} +1 -1
- package/{index-Cb3Fmo7E.mjs → index-DDsxXe9z.mjs} +43 -43
- package/{index-Cb3Fmo7E.mjs.map → index-DDsxXe9z.mjs.map} +1 -1
- package/{index-BcDX9w4T.mjs → index-DLXKobUt.mjs} +8 -8
- package/{index-BcDX9w4T.mjs.map → index-DLXKobUt.mjs.map} +1 -1
- package/{index-CHELe70a.mjs → index-DWI2DYc2.mjs} +8 -8
- package/{index-CHELe70a.mjs.map → index-DWI2DYc2.mjs.map} +1 -1
- package/{index-De0W4KPF.mjs → index-Dh9Wblnw.mjs} +8 -8
- package/{index-De0W4KPF.mjs.map → index-Dh9Wblnw.mjs.map} +1 -1
- package/index.mjs +37 -37
- package/{integer-BWdmDp7S.mjs → integer-BYichJsH.mjs} +3 -3
- package/{integer-BWdmDp7S.mjs.map → integer-BYichJsH.mjs.map} +1 -1
- package/{ioc-Q-KAX6x1.mjs → ioc-DOAKMPdw.mjs} +2 -2
- package/{ioc-Q-KAX6x1.mjs.map → ioc-DOAKMPdw.mjs.map} +1 -1
- package/ioc.mjs +1 -1
- package/lucid-resourceful-vue-components.css +828 -828
- package/{mdi-jw9Ee7p6.mjs → mdi-VGx06N8O.mjs} +9 -9
- package/{mdi-jw9Ee7p6.mjs.map → mdi-VGx06N8O.mjs.map} +1 -1
- package/{number-Chf-qQs7.mjs → number-B5AryNzI.mjs} +8 -8
- package/{number-Chf-qQs7.mjs.map → number-B5AryNzI.mjs.map} +1 -1
- package/package.json +5 -5
- package/{props-eYGYq1uo.mjs → props-BZryUy0q.mjs} +4 -4
- package/{props-eYGYq1uo.mjs.map → props-BZryUy0q.mjs.map} +1 -1
- package/{props-fFnbtBgH.mjs → props-Dcuv5Iv7.mjs} +4 -4
- package/{props-fFnbtBgH.mjs.map → props-Dcuv5Iv7.mjs.map} +1 -1
- package/{renderers-DLsO8zG-.mjs → renderers-C7XOwFHb.mjs} +14 -14
- package/{renderers-DLsO8zG-.mjs.map → renderers-C7XOwFHb.mjs.map} +1 -1
- package/{string-D-UsgMTx.mjs → string-CJvxnWzd.mjs} +13 -13
- package/{string-D-UsgMTx.mjs.map → string-CJvxnWzd.mjs.map} +1 -1
- package/{unsigned_integer-7R2vw_Qn.mjs → unsigned_integer-CRQsMWxW.mjs} +4 -4
- package/{unsigned_integer-7R2vw_Qn.mjs.map → unsigned_integer-CRQsMWxW.mjs.map} +1 -1
- package/{utils-DehfJ8pT.mjs → utils-BBXjywEs.mjs} +2 -2
- package/{utils-DehfJ8pT.mjs.map → utils-BBXjywEs.mjs.map} +1 -1
- package/{validation-41gHTtyY.mjs → validation-NVIikb_s.mjs} +5 -5
- package/{validation-41gHTtyY.mjs.map → validation-NVIikb_s.mjs.map} +1 -1
- package/{vendor-nhtio-vuetifiable-CS-KbH1h.mjs → vendor-nhtio-vuetifiable-CTlDfYMJ.mjs} +7 -7
- package/{vendor-nhtio-vuetifiable-CS-KbH1h.mjs.map → vendor-nhtio-vuetifiable-CTlDfYMJ.mjs.map} +1 -1
- package/common-a_cd4SQg.mjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { k as useBrowser } from "./ioc-
|
|
1
|
+
import { k as useBrowser } from "./ioc-DOAKMPdw.mjs";
|
|
2
2
|
import { useDisplay } from "vuetify";
|
|
3
|
-
import { t as toUnreactive, f as isHTMLElement } from "./utils-
|
|
4
|
-
import {
|
|
3
|
+
import { t as toUnreactive, f as isHTMLElement } from "./utils-BBXjywEs.mjs";
|
|
4
|
+
import { g as getCurrentInstanceName, S as SUPPORTS_INTERSECTION, d as debounce, I as IN_BROWSER } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
|
|
5
5
|
import { shallowRef, reactive, onMounted, watch, onUnmounted, toRefs, triggerRef, nextTick } from "vue";
|
|
6
6
|
const SUPPORTS_RESIZE_OBSERVATION = IN_BROWSER && "ResizeObserver" in window;
|
|
7
7
|
const SUPPORTS_VISUAL_VIEWPORT = IN_BROWSER && "visualViewport" in window;
|
|
@@ -261,4 +261,4 @@ export {
|
|
|
261
261
|
SUPPORTS_VISUAL_VIEWPORT as a,
|
|
262
262
|
useScopedDisplay as u
|
|
263
263
|
};
|
|
264
|
-
//# sourceMappingURL=display-
|
|
264
|
+
//# sourceMappingURL=display-DxJktZAm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-pfXaBUr6.mjs","sources":["../src/private/ux/display.ts"],"sourcesContent":["import { useBrowser } from '../ioc'\nimport { useDisplay } from 'vuetify'\nimport { toUnreactive } from '../common/utils'\nimport { isHTMLElement } from '../common/guards'\nimport { debounce } from '@nhtio/vuetifiable/util/helpers'\nimport { IN_BROWSER, SUPPORTS_INTERSECTION } from '@nhtio/vuetifiable/util/globals'\nimport { getCurrentInstanceName } from '@nhtio/vuetifiable/util/getCurrentInstance'\nimport {\n reactive,\n shallowRef,\n triggerRef,\n toRefs,\n watch,\n onMounted,\n onUnmounted,\n nextTick,\n} from 'vue'\nimport type { Ref, ComponentPublicInstance, UnwrapRef, WatchStopHandle } from 'vue'\nimport type { DisplayInstance, DisplayBreakpoint, DisplayThresholds } from 'vuetify'\n\nexport const SUPPORTS_RESIZE_OBSERVATION = IN_BROWSER && 'ResizeObserver' in window\n\nexport const SUPPORTS_VISUAL_VIEWPORT = IN_BROWSER && 'visualViewport' in window\n\ntype DisplayPlatform = DisplayInstance['platform']\n\nexport type ReferencedContainer = Ref<HTMLElement | ComponentPublicInstance | null>\n\nexport const ScopedDisplayOrientation = ['landscape', 'portrait', 'square'] as const\nexport type ScopedDisplayOrientation = (typeof ScopedDisplayOrientation)[number]\n\nexport type ScopedDisplayInstance = DisplayInstance & {\n ssr: boolean\n intersecting: Ref<boolean>\n visible: Ref<boolean>\n orientation: Ref<ScopedDisplayOrientation>\n}\n\n// Extract the ref types as non-ref types and exclude functions\ntype InternalReactiveScopedDisplayStateTypes = {\n [key in keyof ScopedDisplayInstance]: ScopedDisplayInstance[key] extends Ref<any>\n ? UnwrapRef<ScopedDisplayInstance[key]>\n : ScopedDisplayInstance[key] extends Function\n ? never\n : ScopedDisplayInstance[key]\n}\n\n// Create a type that only includes the non-excluded keys\ntype InternalReactiveScopedDisplayState = {\n [K in keyof InternalReactiveScopedDisplayStateTypes as InternalReactiveScopedDisplayStateTypes[K] extends never\n ? never\n : K]: InternalReactiveScopedDisplayStateTypes[K]\n}\n\nexport const useScopedDisplay = (\n container: ReferencedContainer,\n name: string = getCurrentInstanceName('resourcefulComposables')\n) => {\n const vuetifyState = useDisplay({ mobile: null }, name)\n const {\n mobile,\n mobileBreakpoint,\n platform,\n thresholds,\n ssr,\n update: vuetifyUseDisplayUpdate,\n } = vuetifyState\n // despite the urge to use a Set here, an array is more peformant for doing simple iterations\n const watchStopHandles: WatchStopHandle[] = []\n let resizeObserver: ResizeObserver | undefined\n let intersectionObserver: IntersectionObserver | undefined\n const width = shallowRef<number>(0)\n const height = shallowRef<number>(0)\n const intersecting = shallowRef<boolean>(false)\n const visible = shallowRef<boolean>(false)\n const state = reactive<Omit<InternalReactiveScopedDisplayState, 'ssr'>>({\n xs: false,\n sm: false,\n md: false,\n lg: false,\n xl: false,\n xxl: false,\n smAndUp: false,\n mdAndUp: false,\n lgAndUp: false,\n xlAndUp: false,\n smAndDown: false,\n mdAndDown: false,\n lgAndDown: false,\n xlAndDown: false,\n name: 'xs' as const,\n width: 0,\n height: 0,\n mobile: false,\n mobileBreakpoint: toUnreactive(mobileBreakpoint),\n platform: toUnreactive(platform),\n thresholds: toUnreactive(thresholds),\n intersecting: false,\n visible: false,\n orientation: 'square' as ScopedDisplayOrientation,\n })\n const resizeObserverHandler = (entries: ResizeObserverEntry[]) => {\n let w: number = 0\n let h: number = 0\n for (const entry of entries) {\n if ('contentBoxSize' in entry && 'undefined' !== typeof entry.contentBoxSize) {\n const contentBoxSize = Array.isArray(entry.contentBoxSize)\n ? (entry.contentBoxSize[0] as ResizeObserverSize)\n : // Old versions of Firefox treat ResizeObserverSize as a single item\n (entry.contentBoxSize as unknown as ResizeObserverSize)\n w = contentBoxSize.inlineSize\n } else {\n w = entry.contentRect.width\n }\n h = entry.contentRect.height\n updateDimensions(w, h)\n }\n }\n const intersectionObserverHandler = (entries: IntersectionObserverEntry[]) => {\n const isIntersecting = entries.some((entry) => entry.isIntersecting)\n const isVisible = entries.some((entry) =>\n 'isVisible' in entry ? (entry as any).isVisible : entry.isIntersecting\n )\n intersecting.value = isIntersecting\n visible.value = isVisible\n triggerRef(intersecting)\n triggerRef(visible)\n }\n // helper utility to ensure that the width and height are updated\n const updateDimensions = (w: number = 0, h: number = 0) => {\n width.value = w\n height.value = h\n triggerRef(width)\n triggerRef(height)\n }\n // an exposed method to force an update of the display state\n const update = () => {\n vuetifyUseDisplayUpdate()\n const el = getContainerHtmlElement()\n if (el) {\n const rect = el.getBoundingClientRect()\n updateDimensions(rect.width, rect.height)\n } else {\n updateDimensions(0, 0)\n }\n }\n // helper utility to get the mobile breakpoint as a number for comparisons\n const getMobileBreakpointAsNumber = () => {\n if (typeof state.mobileBreakpoint === 'number') {\n return state.mobileBreakpoint\n }\n if (state.mobileBreakpoint in state.thresholds) {\n return state.thresholds[state.mobileBreakpoint]\n }\n // fallback to 600\n return 600\n }\n // helper utility to get the element from a referenced value\n // used to get the container element from the reference, and in watchers\n const getReferencedHtmlElement = (value: HTMLElement | ComponentPublicInstance | null) => {\n const browser = useBrowser()\n if (!value || browser.ssr) return undefined\n if (isHTMLElement(value)) return value\n if ('$el' in value && isHTMLElement(value.$el)) {\n return value.$el\n }\n return undefined\n }\n // helper utility to get the referenced container element\n const getContainerHtmlElement = (): HTMLElement | undefined => {\n return getReferencedHtmlElement(container.value)\n }\n // observers for changes in the values from vuetify's useDisplay composable\n const vuetifyUseDisplayMobileObserver = (is: boolean) => {\n if (true === is) {\n state.mobile = true\n } else if (width.value < getMobileBreakpointAsNumber()) {\n state.mobile = true\n } else {\n state.mobile = false\n }\n }\n const vuetifyUseDisplayMobileBreakpointObserver = (is: number | DisplayBreakpoint) => {\n state.mobileBreakpoint = toUnreactive(is)\n queueMicrotask(() => vuetifyUseDisplayMobileObserver(mobile.value))\n }\n const vuetifyUseDisplayPlatformObserver = (is: DisplayPlatform) => {\n state.platform = toUnreactive(is)\n }\n const vuetifyUseDisplayThresholdsObserver = (is: DisplayThresholds) => {\n state.thresholds = toUnreactive(is)\n queueMicrotask(() => vuetifyUseDisplayMobileObserver(mobile.value))\n }\n const containerObserver = (\n is: HTMLElement | ComponentPublicInstance | null,\n was: HTMLElement | ComponentPublicInstance | null | undefined\n ) => {\n const newEl = getReferencedHtmlElement(is)\n const oldEl = getReferencedHtmlElement(was ?? null)\n if (newEl === oldEl) return\n if (intersectionObserver) {\n if (oldEl) {\n intersectionObserver.unobserve(oldEl)\n }\n if (newEl) {\n intersectionObserver.observe(newEl)\n }\n }\n if (resizeObserver) {\n if (oldEl) {\n resizeObserver.unobserve(oldEl)\n }\n if (newEl) {\n resizeObserver.observe(newEl)\n }\n }\n const el = getContainerHtmlElement()\n if (el) {\n const rect = el.getBoundingClientRect()\n updateDimensions(rect.width, rect.height)\n } else {\n updateDimensions(0, 0)\n }\n }\n const dimensionsObserver = debounce(() => {\n state.width = width.value\n state.height = height.value\n vuetifyUseDisplayMobileObserver(mobile.value)\n const xs = width.value < thresholds.value.sm\n const sm = width.value < thresholds.value.md && !xs\n const md = width.value < thresholds.value.lg && !(sm || xs)\n const lg = width.value < thresholds.value.xl && !(md || sm || xs)\n const xl = width.value < thresholds.value.xxl && !(lg || md || sm || xs)\n const xxl = width.value >= thresholds.value.xxl\n const breakpointName = xs ? 'xs' : sm ? 'sm' : md ? 'md' : lg ? 'lg' : xl ? 'xl' : 'xxl'\n const smAndUp = !xs\n const mdAndUp = !(xs || sm)\n const lgAndUp = !(xs || sm || md)\n const xlAndUp = !(xs || sm || md || lg)\n const smAndDown = !(md || lg || xl || xxl)\n const mdAndDown = !(lg || xl || xxl)\n const lgAndDown = !(xl || xxl)\n const xlAndDown = !xxl\n const orientation: ScopedDisplayOrientation =\n width.value > height.value ? 'landscape' : height.value > width.value ? 'portrait' : 'square'\n state.xs = xs\n state.sm = sm\n state.md = md\n state.lg = lg\n state.xl = xl\n state.xxl = xxl\n state.name = breakpointName\n state.smAndUp = smAndUp\n state.mdAndUp = mdAndUp\n state.lgAndUp = lgAndUp\n state.xlAndUp = xlAndUp\n state.smAndDown = smAndDown\n state.mdAndDown = mdAndDown\n state.lgAndDown = lgAndDown\n state.xlAndDown = xlAndDown\n state.orientation = orientation\n }, 50)\n const intersectionAndVisibilityObserver = debounce(() => {\n state.intersecting = intersecting.value\n state.visible = visible.value\n }, 50)\n const windowResizeHandler = debounce(() => {\n // Update Vuetify's display state (handles viewport breakpoints)\n vuetifyUseDisplayUpdate()\n // Give the process a tick and then force an update\n nextTick(update)\n }, 50)\n onMounted(() => {\n watchStopHandles.push(watch(mobile, vuetifyUseDisplayMobileObserver, { immediate: true }))\n watchStopHandles.push(\n watch(mobileBreakpoint, vuetifyUseDisplayMobileBreakpointObserver, { immediate: true })\n )\n watchStopHandles.push(watch(platform, vuetifyUseDisplayPlatformObserver, { immediate: true }))\n watchStopHandles.push(\n watch(thresholds, vuetifyUseDisplayThresholdsObserver, { immediate: true })\n )\n if (SUPPORTS_RESIZE_OBSERVATION) {\n resizeObserver = new ResizeObserver(resizeObserverHandler)\n }\n if (SUPPORTS_INTERSECTION) {\n intersectionObserver = new IntersectionObserver(intersectionObserverHandler)\n }\n watchStopHandles.push(watch(container, containerObserver, { immediate: true }))\n watchStopHandles.push(watch(width, dimensionsObserver, { immediate: true }))\n watchStopHandles.push(watch(height, dimensionsObserver, { immediate: true }))\n watchStopHandles.push(\n watch(intersecting, intersectionAndVisibilityObserver, { immediate: true })\n )\n watchStopHandles.push(watch(visible, intersectionAndVisibilityObserver, { immediate: true }))\n // Add window resize listener\n if (IN_BROWSER) {\n window.addEventListener('resize', windowResizeHandler)\n }\n // Add visual viewport listeners\n if (SUPPORTS_VISUAL_VIEWPORT) {\n window.visualViewport!.addEventListener('resize', windowResizeHandler)\n window.visualViewport!.addEventListener('scroll', windowResizeHandler)\n }\n })\n onUnmounted(() => {\n // Remove window resize listener\n if (IN_BROWSER) {\n window.removeEventListener('resize', windowResizeHandler)\n }\n // Remove visual viewport listeners\n if (SUPPORTS_VISUAL_VIEWPORT) {\n window.visualViewport!.removeEventListener('resize', windowResizeHandler)\n window.visualViewport!.removeEventListener('scroll', windowResizeHandler)\n }\n // clear all of the watch stop handles\n watchStopHandles.forEach((stopHandle) => stopHandle())\n watchStopHandles.splice(0, watchStopHandles.length)\n // cleanup the resize observer\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = undefined\n }\n // cleanup the intersection observer\n if (intersectionObserver) {\n intersectionObserver.disconnect()\n intersectionObserver = undefined\n }\n })\n return { ...toRefs(state), update, ssr: !!ssr }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"display-DxJktZAm.mjs","sources":["../src/private/ux/display.ts"],"sourcesContent":["import { useBrowser } from '../ioc'\nimport { useDisplay } from 'vuetify'\nimport { toUnreactive } from '../common/utils'\nimport { isHTMLElement } from '../common/guards'\nimport { debounce } from '@nhtio/vuetifiable/util/helpers'\nimport { IN_BROWSER, SUPPORTS_INTERSECTION } from '@nhtio/vuetifiable/util/globals'\nimport { getCurrentInstanceName } from '@nhtio/vuetifiable/util/getCurrentInstance'\nimport {\n reactive,\n shallowRef,\n triggerRef,\n toRefs,\n watch,\n onMounted,\n onUnmounted,\n nextTick,\n} from 'vue'\nimport type { Ref, ComponentPublicInstance, UnwrapRef, WatchStopHandle } from 'vue'\nimport type { DisplayInstance, DisplayBreakpoint, DisplayThresholds } from 'vuetify'\n\nexport const SUPPORTS_RESIZE_OBSERVATION = IN_BROWSER && 'ResizeObserver' in window\n\nexport const SUPPORTS_VISUAL_VIEWPORT = IN_BROWSER && 'visualViewport' in window\n\ntype DisplayPlatform = DisplayInstance['platform']\n\nexport type ReferencedContainer = Ref<HTMLElement | ComponentPublicInstance | null>\n\nexport const ScopedDisplayOrientation = ['landscape', 'portrait', 'square'] as const\nexport type ScopedDisplayOrientation = (typeof ScopedDisplayOrientation)[number]\n\nexport type ScopedDisplayInstance = DisplayInstance & {\n ssr: boolean\n intersecting: Ref<boolean>\n visible: Ref<boolean>\n orientation: Ref<ScopedDisplayOrientation>\n}\n\n// Extract the ref types as non-ref types and exclude functions\ntype InternalReactiveScopedDisplayStateTypes = {\n [key in keyof ScopedDisplayInstance]: ScopedDisplayInstance[key] extends Ref<any>\n ? UnwrapRef<ScopedDisplayInstance[key]>\n : ScopedDisplayInstance[key] extends Function\n ? never\n : ScopedDisplayInstance[key]\n}\n\n// Create a type that only includes the non-excluded keys\ntype InternalReactiveScopedDisplayState = {\n [K in keyof InternalReactiveScopedDisplayStateTypes as InternalReactiveScopedDisplayStateTypes[K] extends never\n ? never\n : K]: InternalReactiveScopedDisplayStateTypes[K]\n}\n\nexport const useScopedDisplay = (\n container: ReferencedContainer,\n name: string = getCurrentInstanceName('resourcefulComposables')\n) => {\n const vuetifyState = useDisplay({ mobile: null }, name)\n const {\n mobile,\n mobileBreakpoint,\n platform,\n thresholds,\n ssr,\n update: vuetifyUseDisplayUpdate,\n } = vuetifyState\n // despite the urge to use a Set here, an array is more peformant for doing simple iterations\n const watchStopHandles: WatchStopHandle[] = []\n let resizeObserver: ResizeObserver | undefined\n let intersectionObserver: IntersectionObserver | undefined\n const width = shallowRef<number>(0)\n const height = shallowRef<number>(0)\n const intersecting = shallowRef<boolean>(false)\n const visible = shallowRef<boolean>(false)\n const state = reactive<Omit<InternalReactiveScopedDisplayState, 'ssr'>>({\n xs: false,\n sm: false,\n md: false,\n lg: false,\n xl: false,\n xxl: false,\n smAndUp: false,\n mdAndUp: false,\n lgAndUp: false,\n xlAndUp: false,\n smAndDown: false,\n mdAndDown: false,\n lgAndDown: false,\n xlAndDown: false,\n name: 'xs' as const,\n width: 0,\n height: 0,\n mobile: false,\n mobileBreakpoint: toUnreactive(mobileBreakpoint),\n platform: toUnreactive(platform),\n thresholds: toUnreactive(thresholds),\n intersecting: false,\n visible: false,\n orientation: 'square' as ScopedDisplayOrientation,\n })\n const resizeObserverHandler = (entries: ResizeObserverEntry[]) => {\n let w: number = 0\n let h: number = 0\n for (const entry of entries) {\n if ('contentBoxSize' in entry && 'undefined' !== typeof entry.contentBoxSize) {\n const contentBoxSize = Array.isArray(entry.contentBoxSize)\n ? (entry.contentBoxSize[0] as ResizeObserverSize)\n : // Old versions of Firefox treat ResizeObserverSize as a single item\n (entry.contentBoxSize as unknown as ResizeObserverSize)\n w = contentBoxSize.inlineSize\n } else {\n w = entry.contentRect.width\n }\n h = entry.contentRect.height\n updateDimensions(w, h)\n }\n }\n const intersectionObserverHandler = (entries: IntersectionObserverEntry[]) => {\n const isIntersecting = entries.some((entry) => entry.isIntersecting)\n const isVisible = entries.some((entry) =>\n 'isVisible' in entry ? (entry as any).isVisible : entry.isIntersecting\n )\n intersecting.value = isIntersecting\n visible.value = isVisible\n triggerRef(intersecting)\n triggerRef(visible)\n }\n // helper utility to ensure that the width and height are updated\n const updateDimensions = (w: number = 0, h: number = 0) => {\n width.value = w\n height.value = h\n triggerRef(width)\n triggerRef(height)\n }\n // an exposed method to force an update of the display state\n const update = () => {\n vuetifyUseDisplayUpdate()\n const el = getContainerHtmlElement()\n if (el) {\n const rect = el.getBoundingClientRect()\n updateDimensions(rect.width, rect.height)\n } else {\n updateDimensions(0, 0)\n }\n }\n // helper utility to get the mobile breakpoint as a number for comparisons\n const getMobileBreakpointAsNumber = () => {\n if (typeof state.mobileBreakpoint === 'number') {\n return state.mobileBreakpoint\n }\n if (state.mobileBreakpoint in state.thresholds) {\n return state.thresholds[state.mobileBreakpoint]\n }\n // fallback to 600\n return 600\n }\n // helper utility to get the element from a referenced value\n // used to get the container element from the reference, and in watchers\n const getReferencedHtmlElement = (value: HTMLElement | ComponentPublicInstance | null) => {\n const browser = useBrowser()\n if (!value || browser.ssr) return undefined\n if (isHTMLElement(value)) return value\n if ('$el' in value && isHTMLElement(value.$el)) {\n return value.$el\n }\n return undefined\n }\n // helper utility to get the referenced container element\n const getContainerHtmlElement = (): HTMLElement | undefined => {\n return getReferencedHtmlElement(container.value)\n }\n // observers for changes in the values from vuetify's useDisplay composable\n const vuetifyUseDisplayMobileObserver = (is: boolean) => {\n if (true === is) {\n state.mobile = true\n } else if (width.value < getMobileBreakpointAsNumber()) {\n state.mobile = true\n } else {\n state.mobile = false\n }\n }\n const vuetifyUseDisplayMobileBreakpointObserver = (is: number | DisplayBreakpoint) => {\n state.mobileBreakpoint = toUnreactive(is)\n queueMicrotask(() => vuetifyUseDisplayMobileObserver(mobile.value))\n }\n const vuetifyUseDisplayPlatformObserver = (is: DisplayPlatform) => {\n state.platform = toUnreactive(is)\n }\n const vuetifyUseDisplayThresholdsObserver = (is: DisplayThresholds) => {\n state.thresholds = toUnreactive(is)\n queueMicrotask(() => vuetifyUseDisplayMobileObserver(mobile.value))\n }\n const containerObserver = (\n is: HTMLElement | ComponentPublicInstance | null,\n was: HTMLElement | ComponentPublicInstance | null | undefined\n ) => {\n const newEl = getReferencedHtmlElement(is)\n const oldEl = getReferencedHtmlElement(was ?? null)\n if (newEl === oldEl) return\n if (intersectionObserver) {\n if (oldEl) {\n intersectionObserver.unobserve(oldEl)\n }\n if (newEl) {\n intersectionObserver.observe(newEl)\n }\n }\n if (resizeObserver) {\n if (oldEl) {\n resizeObserver.unobserve(oldEl)\n }\n if (newEl) {\n resizeObserver.observe(newEl)\n }\n }\n const el = getContainerHtmlElement()\n if (el) {\n const rect = el.getBoundingClientRect()\n updateDimensions(rect.width, rect.height)\n } else {\n updateDimensions(0, 0)\n }\n }\n const dimensionsObserver = debounce(() => {\n state.width = width.value\n state.height = height.value\n vuetifyUseDisplayMobileObserver(mobile.value)\n const xs = width.value < thresholds.value.sm\n const sm = width.value < thresholds.value.md && !xs\n const md = width.value < thresholds.value.lg && !(sm || xs)\n const lg = width.value < thresholds.value.xl && !(md || sm || xs)\n const xl = width.value < thresholds.value.xxl && !(lg || md || sm || xs)\n const xxl = width.value >= thresholds.value.xxl\n const breakpointName = xs ? 'xs' : sm ? 'sm' : md ? 'md' : lg ? 'lg' : xl ? 'xl' : 'xxl'\n const smAndUp = !xs\n const mdAndUp = !(xs || sm)\n const lgAndUp = !(xs || sm || md)\n const xlAndUp = !(xs || sm || md || lg)\n const smAndDown = !(md || lg || xl || xxl)\n const mdAndDown = !(lg || xl || xxl)\n const lgAndDown = !(xl || xxl)\n const xlAndDown = !xxl\n const orientation: ScopedDisplayOrientation =\n width.value > height.value ? 'landscape' : height.value > width.value ? 'portrait' : 'square'\n state.xs = xs\n state.sm = sm\n state.md = md\n state.lg = lg\n state.xl = xl\n state.xxl = xxl\n state.name = breakpointName\n state.smAndUp = smAndUp\n state.mdAndUp = mdAndUp\n state.lgAndUp = lgAndUp\n state.xlAndUp = xlAndUp\n state.smAndDown = smAndDown\n state.mdAndDown = mdAndDown\n state.lgAndDown = lgAndDown\n state.xlAndDown = xlAndDown\n state.orientation = orientation\n }, 50)\n const intersectionAndVisibilityObserver = debounce(() => {\n state.intersecting = intersecting.value\n state.visible = visible.value\n }, 50)\n const windowResizeHandler = debounce(() => {\n // Update Vuetify's display state (handles viewport breakpoints)\n vuetifyUseDisplayUpdate()\n // Give the process a tick and then force an update\n nextTick(update)\n }, 50)\n onMounted(() => {\n watchStopHandles.push(watch(mobile, vuetifyUseDisplayMobileObserver, { immediate: true }))\n watchStopHandles.push(\n watch(mobileBreakpoint, vuetifyUseDisplayMobileBreakpointObserver, { immediate: true })\n )\n watchStopHandles.push(watch(platform, vuetifyUseDisplayPlatformObserver, { immediate: true }))\n watchStopHandles.push(\n watch(thresholds, vuetifyUseDisplayThresholdsObserver, { immediate: true })\n )\n if (SUPPORTS_RESIZE_OBSERVATION) {\n resizeObserver = new ResizeObserver(resizeObserverHandler)\n }\n if (SUPPORTS_INTERSECTION) {\n intersectionObserver = new IntersectionObserver(intersectionObserverHandler)\n }\n watchStopHandles.push(watch(container, containerObserver, { immediate: true }))\n watchStopHandles.push(watch(width, dimensionsObserver, { immediate: true }))\n watchStopHandles.push(watch(height, dimensionsObserver, { immediate: true }))\n watchStopHandles.push(\n watch(intersecting, intersectionAndVisibilityObserver, { immediate: true })\n )\n watchStopHandles.push(watch(visible, intersectionAndVisibilityObserver, { immediate: true }))\n // Add window resize listener\n if (IN_BROWSER) {\n window.addEventListener('resize', windowResizeHandler)\n }\n // Add visual viewport listeners\n if (SUPPORTS_VISUAL_VIEWPORT) {\n window.visualViewport!.addEventListener('resize', windowResizeHandler)\n window.visualViewport!.addEventListener('scroll', windowResizeHandler)\n }\n })\n onUnmounted(() => {\n // Remove window resize listener\n if (IN_BROWSER) {\n window.removeEventListener('resize', windowResizeHandler)\n }\n // Remove visual viewport listeners\n if (SUPPORTS_VISUAL_VIEWPORT) {\n window.visualViewport!.removeEventListener('resize', windowResizeHandler)\n window.visualViewport!.removeEventListener('scroll', windowResizeHandler)\n }\n // clear all of the watch stop handles\n watchStopHandles.forEach((stopHandle) => stopHandle())\n watchStopHandles.splice(0, watchStopHandles.length)\n // cleanup the resize observer\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = undefined\n }\n // cleanup the intersection observer\n if (intersectionObserver) {\n intersectionObserver.disconnect()\n intersectionObserver = undefined\n }\n })\n return { ...toRefs(state), update, ssr: !!ssr }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { u as useFieldComposer } from "./field_composer-
|
|
2
|
-
import { S as SvgIcon, s as svgPathToIconValue } from "./index-
|
|
3
|
-
import { p as propsAndEmitsFactory, s as stripUndefinedValuesFromObject } from "./utils-
|
|
4
|
-
import { o as omit, b as IconValue, a as pick, f as makeVFieldProps,
|
|
5
|
-
import { c as commonEmitsValidators, m as makeCommonResourcefulFieldProps,
|
|
1
|
+
import { u as useFieldComposer } from "./field_composer-B_4w9YL9.mjs";
|
|
2
|
+
import { S as SvgIcon, s as svgPathToIconValue } from "./index-BJmmZly3.mjs";
|
|
3
|
+
import { p as propsAndEmitsFactory, s as stripUndefinedValuesFromObject } from "./utils-BBXjywEs.mjs";
|
|
4
|
+
import { o as omit, b as IconValue, a as pick, f as makeVFieldProps, h as makeVInputProps, t as throttle } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
|
|
5
|
+
import { c as commonEmitsValidators, m as makeCommonResourcefulFieldProps, g as VAutocomplete } from "./common-CRFL2oQX.mjs";
|
|
6
6
|
import { h, defineComponent, toRefs, shallowRef, ref, computed, watch, triggerRef } from "vue";
|
|
7
|
-
import { g as mdiMenuDown, h as mdiCheckboxBlankCircleOutline, i as mdiCircleSlice8, a as mdiClose, j as mdiRefresh } from "./mdi-
|
|
8
|
-
import { c as VBtn, d as VIcon } from "./display-
|
|
9
|
-
import { V as VRadioGroup, a as VRadio } from "./VRadioGroup-
|
|
7
|
+
import { g as mdiMenuDown, h as mdiCheckboxBlankCircleOutline, i as mdiCircleSlice8, a as mdiClose, j as mdiRefresh } from "./mdi-VGx06N8O.mjs";
|
|
8
|
+
import { c as VBtn, d as VIcon } from "./display-DNgEbAdH.mjs";
|
|
9
|
+
import { V as VRadioGroup, a as VRadio } from "./VRadioGroup-CFazRh5q.mjs";
|
|
10
10
|
const REnumFieldRenderable = ["select", "radio"];
|
|
11
11
|
const isValidREnumFieldValue = (value) => {
|
|
12
12
|
if ("undefined" === typeof value || !Array.isArray(value) && (typeof value === "string" || typeof value === "number" || typeof value === "bigint"))
|
|
@@ -371,4 +371,4 @@ export {
|
|
|
371
371
|
REnumField as R,
|
|
372
372
|
REnumFieldRenderable as a
|
|
373
373
|
};
|
|
374
|
-
//# sourceMappingURL=enum-
|
|
374
|
+
//# sourceMappingURL=enum-CjkTx4L6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-DoxJn16e.mjs","sources":["../src/private/fields/enum.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Enum Field\n|--------------------------------------------------------------------------\n|\n| A comprehensive field component for enum/enumeration values with dynamic choice\n| loading support and professional UX features. Automatically adapts between single\n| field editing, multiple selection management, and read-only display through the\n| unified field composer architecture.\n|\n| ## Supported Values:\n| - string: Text-based enum values (e.g., \"active\", \"pending\", \"completed\")\n| - number: Numeric enum values (e.g., 1, 2, 3 for status codes)\n| - bigint: Large integer enum values for high-precision scenarios\n|\n| ## Rendering Variants (renderAs):\n| - select: Default autocomplete dropdown with search and filtering\n| - radio: VRadioGroup for explicit choice with visual radio buttons\n|\n| ## Dynamic Choice Loading:\n| - Supports static choices via the `choices` prop\n| - Enables dynamic loading via `doRefreshChoices` callback prop\n| - Parent component controls loading logic, timing, and error handling\n| - Field triggers initial load on mount via watch with immediate: true\n| - Future support for manual refresh via exposed refresh() method\n|\n| ## Choice Management:\n| - Choices are expected as objects with `value` and `label` properties\n| - Value can be string, number, or bigint matching the field's data type\n| - Label provides human-readable display text for the enum value\n| - Stringifier automatically maps values to labels for display\n| - Fallback to String(value) when choice not found in list\n|\n| ## Operational Modes:\n|\n| ### Single Mode (multiple: false, renderMode: 'edit')\n| Direct enum control with chosen render variant (select or radio) for\n| selecting a single value from the available choices.\n|\n| ### Multiple Mode (multiple: true, renderMode: 'edit')\n| RMultipleField with sophisticated chip management showing labeled chips,\n| full dialog interface for enum array management with search and filtering.\n|\n| ### Read Mode (renderMode: 'read')\n| Clean text presentation with Oxford comma formatting for arrays, showing\n| localized labels for each enum value.\n|\n| ## Real-World Use Cases:\n| - Status fields (draft/published/archived)\n| - Priority levels (low/medium/high/critical)\n| - User roles (admin/editor/viewer)\n| - Category selection from predefined list\n| - Configuration options loaded from API\n| - Dynamic form fields based on external data\n|\n| ## Integration Pattern:\n| Parent components handle choice loading via HTTP, caching, and error handling\n| while the field focuses solely on rendering and value management. This clean\n| separation enables flexible data loading strategies without coupling the field\n| to specific HTTP implementations.\n|\n*/\n\nimport { VBtn } from 'vuetify/components/VBtn'\nimport { VIcon } from 'vuetify/components/VIcon'\nimport { VRadio } from 'vuetify/components/VRadio'\nimport { useFieldComposer } from './field_composer'\nimport { VInputPublicProps } from '../filtration/common'\nimport { SvgIcon, svgPathToIconValue } from '../svg-icon'\nimport { propsAndEmitsFactory } from '../common/factories'\nimport { throttle } from '@nhtio/vuetifiable/util/throttle'\nimport { VRadioGroup } from 'vuetify/components/VRadioGroup'\nimport { omit, pick } from '@nhtio/vuetifiable/util/helpers'\nimport { VAutocomplete } from 'vuetify/components/VAutocomplete'\nimport { IconValue } from '@nhtio/vuetifiable/composables/icons'\nimport { stripUndefinedValuesFromObject } from '../common/utils'\nimport { makeVInputProps } from '@nhtio/vuetifiable/components/VInput/VInput'\nimport { makeVFieldProps } from '@nhtio/vuetifiable/components/VField/VField'\nimport { makeCommonResourcefulFieldProps, commonEmitsValidators } from './common'\nimport { makeVRadioGroupProps } from '@nhtio/vuetifiable/components/VRadioGroup/VRadioGroup'\nimport { h, defineComponent, toRefs, computed, ref, watch, shallowRef, triggerRef } from 'vue'\nimport { makeVAutocompleteProps } from '@nhtio/vuetifiable/components/VAutocomplete/VAutocomplete'\nimport {\n mdiClose,\n mdiMenuDown,\n mdiCircleSlice8,\n mdiCheckboxBlankCircleOutline,\n mdiRefresh,\n} from '@mdi/js'\nimport type { VInput } from 'vuetify/components/VInput'\nimport type { SingleFieldRenderer } from './field_composer'\nimport type { ExtractSlotDefinitions } from '../common/types'\nimport type { LooseRequired } from '@vue/shared/dist/shared.d.ts'\nimport type { CommonResourcefulFieldPublicProps, RFieldStringifier } from './common'\nimport type {\n PropType,\n ExtractPublicPropTypes,\n ToRefs,\n SlotsType,\n ComponentPublicInstance,\n} from 'vue'\n\ntype VInputSlots = ExtractSlotDefinitions<typeof VInput.slots>\ntype VAutocompletePublicProps = ExtractPublicPropTypes<ReturnType<typeof makeVAutocompleteProps>>\ntype VRadioGroupPublicProps = ExtractPublicPropTypes<ReturnType<typeof makeVRadioGroupProps>>\n\n/**\n * Supported enum field values representing any enumerable type.\n * Includes string for text-based enums (most common), number for numeric\n * status codes or identifiers, and bigint for high-precision scenarios\n * requiring large integer enum values.\n *\n * @example\n * ```typescript\n * // String-based status enum\n * type Status = \"draft\" | \"published\" | \"archived\"\n * const status: REnumFieldValue = \"published\"\n *\n * // Numeric priority enum\n * enum Priority { Low = 1, Medium = 2, High = 3, Critical = 4 }\n * const priority: REnumFieldValue = Priority.High // 3\n *\n * // BigInt identifier enum\n * const largeId: REnumFieldValue = 9007199254740991n\n * ```\n */\nexport type REnumFieldValue = string | number | bigint\n\n/**\n * Rendering variants for enum fields that determine the UI control type.\n * Each variant provides different user interaction patterns while maintaining\n * consistent enum value selection logic.\n *\n * - `select`: Default autocomplete dropdown with search, filtering, and keyboard navigation\n * - `radio`: VRadioGroup for explicit choice scenarios with visual radio button controls\n *\n * @example\n * ```typescript\n * // Status dropdown with search\n * <REnumField renderAs=\"select\" v-model=\"status\" :choices=\"statusChoices\" />\n *\n * // Priority radio buttons for explicit selection\n * <REnumField renderAs=\"radio\" v-model=\"priority\" :choices=\"priorityChoices\" />\n *\n * // Multiple selection (select works best)\n * <REnumField multiple v-model=\"categories\" :choices=\"categoryChoices\" />\n * ```\n */\nexport const REnumFieldRenderable = ['select', 'radio'] as const\n\n/**\n * Union type for enum field rendering variants. Used for the renderAs prop\n * to specify which UI control should be used for enum value interaction.\n */\nexport type REnumFieldRenderable = (typeof REnumFieldRenderable)[number]\n\nexport type REnumFieldLoadedChoice = {\n value: string | number | bigint\n title: string\n}\n\nconst isValidREnumFieldValue = (\n value: REnumFieldValue | REnumFieldValue[] | null | undefined\n): boolean => {\n if (\n 'undefined' === typeof value ||\n (!Array.isArray(value) &&\n (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint'))\n )\n return true\n if (Array.isArray(value)) {\n return value.every(\n (v) => 'string' === typeof v || 'number' === typeof v || 'bigint' === typeof v\n )\n }\n return false\n}\n\nconst { makeProps: makeREnumFieldProps, emits: REnumFieldEmits } = propsAndEmitsFactory(\n {\n ...pick(makeVInputProps(), [\n 'focused',\n 'disabled',\n 'error',\n 'errorMessages',\n 'maxErrors',\n 'name',\n 'label',\n 'readonly',\n 'validateOn',\n 'theme',\n 'width',\n 'maxWidth',\n 'minWidth',\n 'density',\n 'class',\n 'style',\n 'id',\n 'baseColor',\n 'color',\n 'glow',\n 'iconColor',\n 'hideDetails',\n 'hint',\n 'persistentHint',\n 'messages',\n 'direction',\n ]),\n ...pick(\n makeVFieldProps({\n clearIcon: () => h(SvgIcon, { d: mdiClose }),\n }),\n ['variant', 'clearIcon', 'clearable']\n ),\n modelValue: {\n type: [String, Number, BigInt, Array] as PropType<\n REnumFieldValue | REnumFieldValue[] | null | undefined\n >,\n default: undefined,\n },\n renderAs: {\n type: String as PropType<REnumFieldRenderable>,\n default: 'select',\n },\n iconForSelectedRadio: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiCircleSlice8 }),\n },\n iconForUnselectedRadio: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiCheckboxBlankCircleOutline }),\n },\n selectMenuIcon: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiMenuDown }),\n },\n ripple: {\n type: Boolean,\n default: false,\n },\n ...omit(makeCommonResourcefulFieldProps(), ['variant']),\n doRefreshChoices: {\n type: Function as PropType<(() => Promise<REnumFieldLoadedChoice[]>) | undefined>,\n default: undefined,\n },\n },\n {\n 'update:modelValue': (value: REnumFieldValue | REnumFieldValue[] | null | undefined) =>\n isValidREnumFieldValue(value),\n 'update:model-value': (value: REnumFieldValue | REnumFieldValue[] | null | undefined) =>\n isValidREnumFieldValue(value),\n ...commonEmitsValidators,\n },\n 'REnumField'\n)\n\n/**\n * Factory function that creates comprehensive props for the REnumField component.\n * Combines VInput props with enum-specific options for dynamic choice loading,\n * rendering variants, icon customization, and unified field architecture integration.\n *\n * @returns Props definition object for use with defineComponent\n *\n * @example\n * ```typescript\n * // Basic enum field props\n * const props = makeREnumFieldProps()\n *\n * // Access specific prop configurations\n * console.log(props.renderAs) // Rendering variant prop\n * console.log(props.doRefreshChoices) // Dynamic loading callback prop\n * console.log(props.multiple) // Multiple selection mode prop\n * ```\n */\nexport { makeREnumFieldProps }\n\n/**\n * Public props interface for the REnumField component. Includes all VInput\n * props plus enum field-specific options for dynamic choice loading,\n * rendering variants, icon customization, and unified field architecture features.\n *\n * @example\n * ```typescript\n * // Component props typing\n * interface MyComponentProps {\n * enumFieldProps: REnumFieldProps\n * }\n *\n * // Programmatic prop construction\n * const fieldProps: REnumFieldProps = {\n * renderAs: 'select',\n * choices: [\n * { value: 'draft', label: 'Draft' },\n * { value: 'published', label: 'Published' },\n * ],\n * doRefreshChoices: async () => {\n * // Load choices from API\n * },\n * multiple: false,\n * label: 'Status',\n * // ... other VInput props\n * }\n * ```\n */\nexport type REnumFieldProps = ExtractPublicPropTypes<ReturnType<typeof makeREnumFieldProps>>\n\n/**\n * Comprehensive enum field component with dynamic choice loading support and\n * multiple rendering variants. Automatically adapts between single field editing,\n * multiple selection management, and read-only display through the unified field\n * composer architecture.\n *\n * Supports configurable rendering as autocomplete dropdown or radio group, with\n * dynamic choice loading via callback prop for flexible data fetching strategies.\n * Parent components control loading logic while the field focuses on rendering.\n *\n * @example\n * ```vue\n * <!-- Static choices with select dropdown -->\n * <REnumField\n * v-model=\"status\"\n * renderAs=\"select\"\n * :choices=\"[\n * { value: 'draft', label: 'Draft' },\n * { value: 'published', label: 'Published' },\n * { value: 'archived', label: 'Archived' }\n * ]\"\n * label=\"Status\"\n * />\n *\n * <!-- Dynamic loading with radio buttons -->\n * <REnumField\n * v-model=\"category\"\n * renderAs=\"radio\"\n * :choices=\"categoryChoices\"\n * :doRefreshChoices=\"loadCategories\"\n * label=\"Category\"\n * />\n *\n * <!-- Multiple selection with search -->\n * <REnumField\n * v-model=\"tags\"\n * multiple\n * :choices=\"tagChoices\"\n * :doRefreshChoices=\"loadTags\"\n * label=\"Tags\"\n * />\n *\n * <!-- Clearable enum field -->\n * <REnumField\n * v-model=\"priority\"\n * :choices=\"priorityChoices\"\n * clearable\n * label=\"Priority (Optional)\"\n * />\n * ```\n */\nexport const REnumField = defineComponent({\n name: 'REnumField',\n props: makeREnumFieldProps(),\n emits: REnumFieldEmits,\n slots: Object as SlotsType<VInputSlots>,\n setup(props, { emit, slots }) {\n const {\n focused,\n disabled,\n error,\n errorMessages,\n maxErrors,\n name,\n label,\n readonly,\n validateOn,\n theme,\n width,\n maxWidth,\n minWidth,\n density,\n class: className,\n style,\n id,\n baseColor,\n color,\n glow,\n iconColor,\n hideDetails,\n hint,\n persistentHint,\n messages,\n direction,\n modelValue,\n renderAs,\n renderMode,\n multiple,\n choices: passedChoices,\n to,\n href,\n menuIcon,\n active,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n noValuesText,\n selectMenuIcon,\n ripple,\n iconForSelectedRadio,\n iconForUnselectedRadio,\n dirty,\n onBlur,\n onChange,\n onInput,\n clearable,\n doRefreshChoices,\n } = toRefs(props)\n const externalChoices = shallowRef<any[] | undefined>(undefined)\n const refreshingChoices = ref(false)\n const handleRefreshChoices = async () => {\n refreshingChoices.value = true\n if (doRefreshChoices.value && typeof doRefreshChoices.value === 'function') {\n try {\n const results = await doRefreshChoices.value()\n externalChoices.value = results.map((r) => ({ value: r.value, label: r.title }))\n triggerRef(externalChoices)\n } catch {\n // Ignore errors from refresh\n externalChoices.value = undefined\n triggerRef(externalChoices)\n }\n }\n refreshingChoices.value = false\n }\n const callRefreshChoices = throttle(handleRefreshChoices, 300)\n const choices = computed(() => passedChoices.value ?? externalChoices.value)\n const commonProps: ToRefs<LooseRequired<Readonly<CommonResourcefulFieldPublicProps>>> = {\n style,\n label,\n density,\n renderMode,\n multiple,\n to,\n href,\n menuIcon,\n active,\n theme,\n disabled,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n focused,\n noValuesText,\n 'allowUnspecifiedChoices': ref(false),\n 'choices': choices,\n 'class': className,\n 'onUpdate:focused': toRefs(props)['onUpdate:focused'],\n 'onClick:append': toRefs(props)['onClick:append'],\n 'onClick:appendInner': toRefs(props)['onClick:appendInner'],\n 'onClick:clear': toRefs(props)['onClick:clear'],\n 'onClick:prependInner': toRefs(props)['onClick:prependInner'],\n 'onClick:prepend': toRefs(props)['onClick:prepend'],\n 'onMousedown:control': toRefs(props)['onMousedown:control'],\n 'onClick:control': toRefs(props)['onClick:control'],\n error,\n errorMessages,\n dirty,\n onBlur,\n onChange,\n onInput,\n }\n const stringifier = computed<RFieldStringifier<REnumFieldValue>>(() => {\n return (val: REnumFieldValue) => {\n const choice = choices.value?.find((c) => c.value === val)\n if (!choice) {\n return String(val)\n }\n return choice.label\n }\n })\n const commonFieldBindings = computed<VInputPublicProps>(() => ({\n focused: focused.value,\n disabled: disabled.value,\n error: error.value,\n errorMessages: errorMessages.value,\n maxErrors: maxErrors.value,\n name: name.value,\n label: label.value,\n readonly: readonly.value,\n validateOn: validateOn.value,\n theme: theme.value,\n width: width.value,\n maxWidth: maxWidth.value,\n minWidth: minWidth.value,\n density: density.value,\n class: className.value,\n style: style.value,\n id: id.value,\n baseColor: baseColor.value,\n color: color.value,\n glow: glow.value,\n iconColor: iconColor.value,\n hideDetails: hideDetails.value,\n hint: hint.value,\n persistentHint: persistentHint.value,\n messages: messages.value,\n direction: direction.value,\n dirty: dirty.value,\n onBlur: onBlur.value,\n onChange: onChange.value,\n onInput: onInput.value,\n }))\n const vAutocompleteFieldBindings = computed<VAutocompletePublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n ...commonFieldBindings.value,\n active: active.value,\n disabled: commonFieldBindings.value.disabled || undefined,\n items: choices.value,\n clearable: clearable.value,\n clearIcon: () => h(SvgIcon, { d: mdiClose }),\n density: density.value,\n itemTitle: 'label',\n itemValue: 'value',\n variant: variant.value,\n menuIcon: selectMenuIcon.value,\n prefix: prefix.value,\n persistentPlaceholder: persistentPlaceholder.value,\n suffix: suffix.value,\n role: role.value,\n }) satisfies VAutocompletePublicProps\n )\n const vRadioGroupFieldBindings = computed<VRadioGroupPublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n ...commonFieldBindings.value,\n density: density.value,\n falseIcon: iconForUnselectedRadio.value,\n trueIcon: iconForSelectedRadio.value,\n ripple: ripple.value,\n }) satisfies VRadioGroupPublicProps\n )\n const singleFieldRenderer: SingleFieldRenderer = ({ props: fieldBindings, isMultiAdd }) => {\n const renderableVAutocompleteFieldBindings = {\n ...vAutocompleteFieldBindings.value,\n ...fieldBindings,\n class: isMultiAdd ? [] : vAutocompleteFieldBindings.value.class,\n }\n const renderableVRadioGroupFieldBindings = {\n ...vRadioGroupFieldBindings.value,\n ...fieldBindings,\n class: isMultiAdd ? [] : vRadioGroupFieldBindings.value.class,\n }\n switch (renderAs.value) {\n case 'radio':\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return h(VRadioGroup, renderableVRadioGroupFieldBindings, {\n ...slots,\n default: () =>\n Array.from(choices.value || []).map((i) =>\n h(\n VRadio,\n {\n value: i.value,\n },\n {\n label: () => i.label,\n }\n )\n ),\n append: (...args: any[]) => [\n // @ts-ignore\n slots['append'] ? slots['append'](...args) : null,\n typeof doRefreshChoices.value === 'function'\n ? h(\n VBtn,\n {\n icon: true,\n loading: refreshingChoices.value,\n disabled: disabled.value,\n density: 'compact',\n class: 'ms-2',\n onClick: (e: MouseEvent) => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n callRefreshChoices()\n },\n },\n () => h(VIcon, { icon: svgPathToIconValue(mdiRefresh) })\n )\n : null,\n ],\n })\n default:\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return h(VAutocomplete, renderableVAutocompleteFieldBindings, {\n ...slots,\n 'append-inner': (...args: any[]) => [\n // @ts-ignore\n slots['append-inner'] ? slots['append-inner'](...args) : null,\n typeof doRefreshChoices.value === 'function'\n ? h(\n VBtn,\n {\n icon: true,\n loading: refreshingChoices.value,\n disabled: disabled.value,\n density: 'compact',\n class: 'ms-2',\n onClick: (e: MouseEvent) => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n callRefreshChoices()\n },\n },\n () => h(VIcon, { icon: svgPathToIconValue(mdiRefresh) })\n )\n : null,\n ],\n })\n }\n }\n watch(\n doRefreshChoices,\n (newVal) => {\n if (newVal && typeof newVal === 'function') {\n handleRefreshChoices()\n }\n },\n { immediate: true }\n )\n const { composed } = useFieldComposer(\n commonProps,\n stringifier,\n singleFieldRenderer,\n emit,\n props['onUpdate:modelValue'],\n props['onUpdate:model-value'],\n modelValue,\n props.modelValue,\n false,\n false,\n () => {},\n callRefreshChoices\n )\n return composed\n },\n})\n\n/**\n * Component type for the REnumField. Represents the complete enum field\n * component with dynamic choice loading support, multiple rendering variants,\n * and unified field architecture integration. Use this type for component\n * references, template refs, and programmatic component manipulation.\n *\n * @example\n * ```typescript\n * // Template ref typing\n * const enumFieldRef = ref<REnumField>()\n *\n * // Component type checking\n * const isEnumField = (component: unknown): component is REnumField => {\n * return component?.name === 'REnumField'\n * }\n *\n * // Programmatic component usage\n * const createEnumField = (): REnumField => {\n * return REnumField\n * }\n * ```\n */\nexport type REnumField = typeof REnumField & ComponentPublicInstance\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enum-CjkTx4L6.mjs","sources":["../src/private/fields/enum.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Enum Field\n|--------------------------------------------------------------------------\n|\n| A comprehensive field component for enum/enumeration values with dynamic choice\n| loading support and professional UX features. Automatically adapts between single\n| field editing, multiple selection management, and read-only display through the\n| unified field composer architecture.\n|\n| ## Supported Values:\n| - string: Text-based enum values (e.g., \"active\", \"pending\", \"completed\")\n| - number: Numeric enum values (e.g., 1, 2, 3 for status codes)\n| - bigint: Large integer enum values for high-precision scenarios\n|\n| ## Rendering Variants (renderAs):\n| - select: Default autocomplete dropdown with search and filtering\n| - radio: VRadioGroup for explicit choice with visual radio buttons\n|\n| ## Dynamic Choice Loading:\n| - Supports static choices via the `choices` prop\n| - Enables dynamic loading via `doRefreshChoices` callback prop\n| - Parent component controls loading logic, timing, and error handling\n| - Field triggers initial load on mount via watch with immediate: true\n| - Future support for manual refresh via exposed refresh() method\n|\n| ## Choice Management:\n| - Choices are expected as objects with `value` and `label` properties\n| - Value can be string, number, or bigint matching the field's data type\n| - Label provides human-readable display text for the enum value\n| - Stringifier automatically maps values to labels for display\n| - Fallback to String(value) when choice not found in list\n|\n| ## Operational Modes:\n|\n| ### Single Mode (multiple: false, renderMode: 'edit')\n| Direct enum control with chosen render variant (select or radio) for\n| selecting a single value from the available choices.\n|\n| ### Multiple Mode (multiple: true, renderMode: 'edit')\n| RMultipleField with sophisticated chip management showing labeled chips,\n| full dialog interface for enum array management with search and filtering.\n|\n| ### Read Mode (renderMode: 'read')\n| Clean text presentation with Oxford comma formatting for arrays, showing\n| localized labels for each enum value.\n|\n| ## Real-World Use Cases:\n| - Status fields (draft/published/archived)\n| - Priority levels (low/medium/high/critical)\n| - User roles (admin/editor/viewer)\n| - Category selection from predefined list\n| - Configuration options loaded from API\n| - Dynamic form fields based on external data\n|\n| ## Integration Pattern:\n| Parent components handle choice loading via HTTP, caching, and error handling\n| while the field focuses solely on rendering and value management. This clean\n| separation enables flexible data loading strategies without coupling the field\n| to specific HTTP implementations.\n|\n*/\n\nimport { VBtn } from 'vuetify/components/VBtn'\nimport { VIcon } from 'vuetify/components/VIcon'\nimport { VRadio } from 'vuetify/components/VRadio'\nimport { useFieldComposer } from './field_composer'\nimport { VInputPublicProps } from '../filtration/common'\nimport { SvgIcon, svgPathToIconValue } from '../svg-icon'\nimport { propsAndEmitsFactory } from '../common/factories'\nimport { throttle } from '@nhtio/vuetifiable/util/throttle'\nimport { VRadioGroup } from 'vuetify/components/VRadioGroup'\nimport { omit, pick } from '@nhtio/vuetifiable/util/helpers'\nimport { VAutocomplete } from 'vuetify/components/VAutocomplete'\nimport { IconValue } from '@nhtio/vuetifiable/composables/icons'\nimport { stripUndefinedValuesFromObject } from '../common/utils'\nimport { makeVInputProps } from '@nhtio/vuetifiable/components/VInput/VInput'\nimport { makeVFieldProps } from '@nhtio/vuetifiable/components/VField/VField'\nimport { makeCommonResourcefulFieldProps, commonEmitsValidators } from './common'\nimport { makeVRadioGroupProps } from '@nhtio/vuetifiable/components/VRadioGroup/VRadioGroup'\nimport { h, defineComponent, toRefs, computed, ref, watch, shallowRef, triggerRef } from 'vue'\nimport { makeVAutocompleteProps } from '@nhtio/vuetifiable/components/VAutocomplete/VAutocomplete'\nimport {\n mdiClose,\n mdiMenuDown,\n mdiCircleSlice8,\n mdiCheckboxBlankCircleOutline,\n mdiRefresh,\n} from '@mdi/js'\nimport type { VInput } from 'vuetify/components/VInput'\nimport type { SingleFieldRenderer } from './field_composer'\nimport type { ExtractSlotDefinitions } from '../common/types'\nimport type { LooseRequired } from '@vue/shared/dist/shared.d.ts'\nimport type { CommonResourcefulFieldPublicProps, RFieldStringifier } from './common'\nimport type {\n PropType,\n ExtractPublicPropTypes,\n ToRefs,\n SlotsType,\n ComponentPublicInstance,\n} from 'vue'\n\ntype VInputSlots = ExtractSlotDefinitions<typeof VInput.slots>\ntype VAutocompletePublicProps = ExtractPublicPropTypes<ReturnType<typeof makeVAutocompleteProps>>\ntype VRadioGroupPublicProps = ExtractPublicPropTypes<ReturnType<typeof makeVRadioGroupProps>>\n\n/**\n * Supported enum field values representing any enumerable type.\n * Includes string for text-based enums (most common), number for numeric\n * status codes or identifiers, and bigint for high-precision scenarios\n * requiring large integer enum values.\n *\n * @example\n * ```typescript\n * // String-based status enum\n * type Status = \"draft\" | \"published\" | \"archived\"\n * const status: REnumFieldValue = \"published\"\n *\n * // Numeric priority enum\n * enum Priority { Low = 1, Medium = 2, High = 3, Critical = 4 }\n * const priority: REnumFieldValue = Priority.High // 3\n *\n * // BigInt identifier enum\n * const largeId: REnumFieldValue = 9007199254740991n\n * ```\n */\nexport type REnumFieldValue = string | number | bigint\n\n/**\n * Rendering variants for enum fields that determine the UI control type.\n * Each variant provides different user interaction patterns while maintaining\n * consistent enum value selection logic.\n *\n * - `select`: Default autocomplete dropdown with search, filtering, and keyboard navigation\n * - `radio`: VRadioGroup for explicit choice scenarios with visual radio button controls\n *\n * @example\n * ```typescript\n * // Status dropdown with search\n * <REnumField renderAs=\"select\" v-model=\"status\" :choices=\"statusChoices\" />\n *\n * // Priority radio buttons for explicit selection\n * <REnumField renderAs=\"radio\" v-model=\"priority\" :choices=\"priorityChoices\" />\n *\n * // Multiple selection (select works best)\n * <REnumField multiple v-model=\"categories\" :choices=\"categoryChoices\" />\n * ```\n */\nexport const REnumFieldRenderable = ['select', 'radio'] as const\n\n/**\n * Union type for enum field rendering variants. Used for the renderAs prop\n * to specify which UI control should be used for enum value interaction.\n */\nexport type REnumFieldRenderable = (typeof REnumFieldRenderable)[number]\n\nexport type REnumFieldLoadedChoice = {\n value: string | number | bigint\n title: string\n}\n\nconst isValidREnumFieldValue = (\n value: REnumFieldValue | REnumFieldValue[] | null | undefined\n): boolean => {\n if (\n 'undefined' === typeof value ||\n (!Array.isArray(value) &&\n (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint'))\n )\n return true\n if (Array.isArray(value)) {\n return value.every(\n (v) => 'string' === typeof v || 'number' === typeof v || 'bigint' === typeof v\n )\n }\n return false\n}\n\nconst { makeProps: makeREnumFieldProps, emits: REnumFieldEmits } = propsAndEmitsFactory(\n {\n ...pick(makeVInputProps(), [\n 'focused',\n 'disabled',\n 'error',\n 'errorMessages',\n 'maxErrors',\n 'name',\n 'label',\n 'readonly',\n 'validateOn',\n 'theme',\n 'width',\n 'maxWidth',\n 'minWidth',\n 'density',\n 'class',\n 'style',\n 'id',\n 'baseColor',\n 'color',\n 'glow',\n 'iconColor',\n 'hideDetails',\n 'hint',\n 'persistentHint',\n 'messages',\n 'direction',\n ]),\n ...pick(\n makeVFieldProps({\n clearIcon: () => h(SvgIcon, { d: mdiClose }),\n }),\n ['variant', 'clearIcon', 'clearable']\n ),\n modelValue: {\n type: [String, Number, BigInt, Array] as PropType<\n REnumFieldValue | REnumFieldValue[] | null | undefined\n >,\n default: undefined,\n },\n renderAs: {\n type: String as PropType<REnumFieldRenderable>,\n default: 'select',\n },\n iconForSelectedRadio: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiCircleSlice8 }),\n },\n iconForUnselectedRadio: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiCheckboxBlankCircleOutline }),\n },\n selectMenuIcon: {\n type: IconValue as PropType<IconValue>,\n default: () => h(SvgIcon, { d: mdiMenuDown }),\n },\n ripple: {\n type: Boolean,\n default: false,\n },\n ...omit(makeCommonResourcefulFieldProps(), ['variant']),\n doRefreshChoices: {\n type: Function as PropType<(() => Promise<REnumFieldLoadedChoice[]>) | undefined>,\n default: undefined,\n },\n },\n {\n 'update:modelValue': (value: REnumFieldValue | REnumFieldValue[] | null | undefined) =>\n isValidREnumFieldValue(value),\n 'update:model-value': (value: REnumFieldValue | REnumFieldValue[] | null | undefined) =>\n isValidREnumFieldValue(value),\n ...commonEmitsValidators,\n },\n 'REnumField'\n)\n\n/**\n * Factory function that creates comprehensive props for the REnumField component.\n * Combines VInput props with enum-specific options for dynamic choice loading,\n * rendering variants, icon customization, and unified field architecture integration.\n *\n * @returns Props definition object for use with defineComponent\n *\n * @example\n * ```typescript\n * // Basic enum field props\n * const props = makeREnumFieldProps()\n *\n * // Access specific prop configurations\n * console.log(props.renderAs) // Rendering variant prop\n * console.log(props.doRefreshChoices) // Dynamic loading callback prop\n * console.log(props.multiple) // Multiple selection mode prop\n * ```\n */\nexport { makeREnumFieldProps }\n\n/**\n * Public props interface for the REnumField component. Includes all VInput\n * props plus enum field-specific options for dynamic choice loading,\n * rendering variants, icon customization, and unified field architecture features.\n *\n * @example\n * ```typescript\n * // Component props typing\n * interface MyComponentProps {\n * enumFieldProps: REnumFieldProps\n * }\n *\n * // Programmatic prop construction\n * const fieldProps: REnumFieldProps = {\n * renderAs: 'select',\n * choices: [\n * { value: 'draft', label: 'Draft' },\n * { value: 'published', label: 'Published' },\n * ],\n * doRefreshChoices: async () => {\n * // Load choices from API\n * },\n * multiple: false,\n * label: 'Status',\n * // ... other VInput props\n * }\n * ```\n */\nexport type REnumFieldProps = ExtractPublicPropTypes<ReturnType<typeof makeREnumFieldProps>>\n\n/**\n * Comprehensive enum field component with dynamic choice loading support and\n * multiple rendering variants. Automatically adapts between single field editing,\n * multiple selection management, and read-only display through the unified field\n * composer architecture.\n *\n * Supports configurable rendering as autocomplete dropdown or radio group, with\n * dynamic choice loading via callback prop for flexible data fetching strategies.\n * Parent components control loading logic while the field focuses on rendering.\n *\n * @example\n * ```vue\n * <!-- Static choices with select dropdown -->\n * <REnumField\n * v-model=\"status\"\n * renderAs=\"select\"\n * :choices=\"[\n * { value: 'draft', label: 'Draft' },\n * { value: 'published', label: 'Published' },\n * { value: 'archived', label: 'Archived' }\n * ]\"\n * label=\"Status\"\n * />\n *\n * <!-- Dynamic loading with radio buttons -->\n * <REnumField\n * v-model=\"category\"\n * renderAs=\"radio\"\n * :choices=\"categoryChoices\"\n * :doRefreshChoices=\"loadCategories\"\n * label=\"Category\"\n * />\n *\n * <!-- Multiple selection with search -->\n * <REnumField\n * v-model=\"tags\"\n * multiple\n * :choices=\"tagChoices\"\n * :doRefreshChoices=\"loadTags\"\n * label=\"Tags\"\n * />\n *\n * <!-- Clearable enum field -->\n * <REnumField\n * v-model=\"priority\"\n * :choices=\"priorityChoices\"\n * clearable\n * label=\"Priority (Optional)\"\n * />\n * ```\n */\nexport const REnumField = defineComponent({\n name: 'REnumField',\n props: makeREnumFieldProps(),\n emits: REnumFieldEmits,\n slots: Object as SlotsType<VInputSlots>,\n setup(props, { emit, slots }) {\n const {\n focused,\n disabled,\n error,\n errorMessages,\n maxErrors,\n name,\n label,\n readonly,\n validateOn,\n theme,\n width,\n maxWidth,\n minWidth,\n density,\n class: className,\n style,\n id,\n baseColor,\n color,\n glow,\n iconColor,\n hideDetails,\n hint,\n persistentHint,\n messages,\n direction,\n modelValue,\n renderAs,\n renderMode,\n multiple,\n choices: passedChoices,\n to,\n href,\n menuIcon,\n active,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n noValuesText,\n selectMenuIcon,\n ripple,\n iconForSelectedRadio,\n iconForUnselectedRadio,\n dirty,\n onBlur,\n onChange,\n onInput,\n clearable,\n doRefreshChoices,\n } = toRefs(props)\n const externalChoices = shallowRef<any[] | undefined>(undefined)\n const refreshingChoices = ref(false)\n const handleRefreshChoices = async () => {\n refreshingChoices.value = true\n if (doRefreshChoices.value && typeof doRefreshChoices.value === 'function') {\n try {\n const results = await doRefreshChoices.value()\n externalChoices.value = results.map((r) => ({ value: r.value, label: r.title }))\n triggerRef(externalChoices)\n } catch {\n // Ignore errors from refresh\n externalChoices.value = undefined\n triggerRef(externalChoices)\n }\n }\n refreshingChoices.value = false\n }\n const callRefreshChoices = throttle(handleRefreshChoices, 300)\n const choices = computed(() => passedChoices.value ?? externalChoices.value)\n const commonProps: ToRefs<LooseRequired<Readonly<CommonResourcefulFieldPublicProps>>> = {\n style,\n label,\n density,\n renderMode,\n multiple,\n to,\n href,\n menuIcon,\n active,\n theme,\n disabled,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n focused,\n noValuesText,\n 'allowUnspecifiedChoices': ref(false),\n 'choices': choices,\n 'class': className,\n 'onUpdate:focused': toRefs(props)['onUpdate:focused'],\n 'onClick:append': toRefs(props)['onClick:append'],\n 'onClick:appendInner': toRefs(props)['onClick:appendInner'],\n 'onClick:clear': toRefs(props)['onClick:clear'],\n 'onClick:prependInner': toRefs(props)['onClick:prependInner'],\n 'onClick:prepend': toRefs(props)['onClick:prepend'],\n 'onMousedown:control': toRefs(props)['onMousedown:control'],\n 'onClick:control': toRefs(props)['onClick:control'],\n error,\n errorMessages,\n dirty,\n onBlur,\n onChange,\n onInput,\n }\n const stringifier = computed<RFieldStringifier<REnumFieldValue>>(() => {\n return (val: REnumFieldValue) => {\n const choice = choices.value?.find((c) => c.value === val)\n if (!choice) {\n return String(val)\n }\n return choice.label\n }\n })\n const commonFieldBindings = computed<VInputPublicProps>(() => ({\n focused: focused.value,\n disabled: disabled.value,\n error: error.value,\n errorMessages: errorMessages.value,\n maxErrors: maxErrors.value,\n name: name.value,\n label: label.value,\n readonly: readonly.value,\n validateOn: validateOn.value,\n theme: theme.value,\n width: width.value,\n maxWidth: maxWidth.value,\n minWidth: minWidth.value,\n density: density.value,\n class: className.value,\n style: style.value,\n id: id.value,\n baseColor: baseColor.value,\n color: color.value,\n glow: glow.value,\n iconColor: iconColor.value,\n hideDetails: hideDetails.value,\n hint: hint.value,\n persistentHint: persistentHint.value,\n messages: messages.value,\n direction: direction.value,\n dirty: dirty.value,\n onBlur: onBlur.value,\n onChange: onChange.value,\n onInput: onInput.value,\n }))\n const vAutocompleteFieldBindings = computed<VAutocompletePublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n ...commonFieldBindings.value,\n active: active.value,\n disabled: commonFieldBindings.value.disabled || undefined,\n items: choices.value,\n clearable: clearable.value,\n clearIcon: () => h(SvgIcon, { d: mdiClose }),\n density: density.value,\n itemTitle: 'label',\n itemValue: 'value',\n variant: variant.value,\n menuIcon: selectMenuIcon.value,\n prefix: prefix.value,\n persistentPlaceholder: persistentPlaceholder.value,\n suffix: suffix.value,\n role: role.value,\n }) satisfies VAutocompletePublicProps\n )\n const vRadioGroupFieldBindings = computed<VRadioGroupPublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n ...commonFieldBindings.value,\n density: density.value,\n falseIcon: iconForUnselectedRadio.value,\n trueIcon: iconForSelectedRadio.value,\n ripple: ripple.value,\n }) satisfies VRadioGroupPublicProps\n )\n const singleFieldRenderer: SingleFieldRenderer = ({ props: fieldBindings, isMultiAdd }) => {\n const renderableVAutocompleteFieldBindings = {\n ...vAutocompleteFieldBindings.value,\n ...fieldBindings,\n class: isMultiAdd ? [] : vAutocompleteFieldBindings.value.class,\n }\n const renderableVRadioGroupFieldBindings = {\n ...vRadioGroupFieldBindings.value,\n ...fieldBindings,\n class: isMultiAdd ? [] : vRadioGroupFieldBindings.value.class,\n }\n switch (renderAs.value) {\n case 'radio':\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return h(VRadioGroup, renderableVRadioGroupFieldBindings, {\n ...slots,\n default: () =>\n Array.from(choices.value || []).map((i) =>\n h(\n VRadio,\n {\n value: i.value,\n },\n {\n label: () => i.label,\n }\n )\n ),\n append: (...args: any[]) => [\n // @ts-ignore\n slots['append'] ? slots['append'](...args) : null,\n typeof doRefreshChoices.value === 'function'\n ? h(\n VBtn,\n {\n icon: true,\n loading: refreshingChoices.value,\n disabled: disabled.value,\n density: 'compact',\n class: 'ms-2',\n onClick: (e: MouseEvent) => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n callRefreshChoices()\n },\n },\n () => h(VIcon, { icon: svgPathToIconValue(mdiRefresh) })\n )\n : null,\n ],\n })\n default:\n // eslint-disable-next-line @nht/require-function-slots-for-programmatic-components\n return h(VAutocomplete, renderableVAutocompleteFieldBindings, {\n ...slots,\n 'append-inner': (...args: any[]) => [\n // @ts-ignore\n slots['append-inner'] ? slots['append-inner'](...args) : null,\n typeof doRefreshChoices.value === 'function'\n ? h(\n VBtn,\n {\n icon: true,\n loading: refreshingChoices.value,\n disabled: disabled.value,\n density: 'compact',\n class: 'ms-2',\n onClick: (e: MouseEvent) => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n callRefreshChoices()\n },\n },\n () => h(VIcon, { icon: svgPathToIconValue(mdiRefresh) })\n )\n : null,\n ],\n })\n }\n }\n watch(\n doRefreshChoices,\n (newVal) => {\n if (newVal && typeof newVal === 'function') {\n handleRefreshChoices()\n }\n },\n { immediate: true }\n )\n const { composed } = useFieldComposer(\n commonProps,\n stringifier,\n singleFieldRenderer,\n emit,\n props['onUpdate:modelValue'],\n props['onUpdate:model-value'],\n modelValue,\n props.modelValue,\n false,\n false,\n () => {},\n callRefreshChoices\n )\n return composed\n },\n})\n\n/**\n * Component type for the REnumField. Represents the complete enum field\n * component with dynamic choice loading support, multiple rendering variants,\n * and unified field architecture integration. Use this type for component\n * references, template refs, and programmatic component manipulation.\n *\n * @example\n * ```typescript\n * // Template ref typing\n * const enumFieldRef = ref<REnumField>()\n *\n * // Component type checking\n * const isEnumField = (component: unknown): component is REnumField => {\n * return component?.name === 'REnumField'\n * }\n *\n * // Programmatic component usage\n * const createEnumField = (): REnumField => {\n * return REnumField\n * }\n * ```\n */\nexport type REnumField = typeof REnumField & ComponentPublicInstance\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as createError } from "./http-
|
|
1
|
+
import { d as createError } from "./http-C2_4xIMQ.mjs";
|
|
2
2
|
const E_FORM_NOT_RENDERED = createError(
|
|
3
3
|
"The form has not been rendered yet.",
|
|
4
4
|
"E_FORM_NOT_RENDERED"
|
|
@@ -21,4 +21,4 @@ export {
|
|
|
21
21
|
E_FAILED_TO_DECODE_STATE_MODEL as b,
|
|
22
22
|
E_FAILED_TO_COMPARE_STATE_MODEL_VALUES as c
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=exceptions-
|
|
24
|
+
//# sourceMappingURL=exceptions-lwCt3BKI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exceptions-
|
|
1
|
+
{"version":3,"file":"exceptions-lwCt3BKI.mjs","sources":["../src/private/resourceful-record/exceptions.ts"],"sourcesContent":["import { createError } from '../common/base_exception'\n\nexport const E_FORM_NOT_RENDERED = createError(\n 'The form has not been rendered yet.',\n 'E_FORM_NOT_RENDERED'\n)\n\nexport const E_DECODED_STATE_MODEL_INCOMPATIBLE = createError(\n 'The decoded state model is not an object',\n 'E_DECODED_STATE_MODEL_INCOMPATIBLE'\n)\n\nexport const E_FAILED_TO_DECODE_STATE_MODEL = createError<[string]>(\n 'Failed to decode form state model value from state string \"%s\".',\n 'E_FAILED_TO_DECODE_STATE_MODEL'\n)\n\nexport const E_FAILED_TO_COMPARE_STATE_MODEL_VALUES = createError(\n 'Failed to compare form state model values.',\n 'E_FAILED_TO_COMPARE_STATE_MODEL_VALUES'\n)\n"],"names":[],"mappings":";AAEO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AACF;AAEO,MAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AACF;AAEO,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AACF;AAEO,MAAM,yCAAyC;AAAA,EACpD;AAAA,EACA;AACF;"}
|
package/exceptions.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B, E } from "./http-
|
|
2
|
-
import { a, c, b, E as E2 } from "./exceptions-
|
|
1
|
+
import { B, E } from "./http-C2_4xIMQ.mjs";
|
|
2
|
+
import { a, c, b, E as E2 } from "./exceptions-lwCt3BKI.mjs";
|
|
3
3
|
export {
|
|
4
4
|
B as BaseException,
|
|
5
5
|
a as E_DECODED_STATE_MODEL_INCOMPATIBLE,
|
package/factories.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { o, a, p } from "./vendor-nhtio-vuetifiable-
|
|
2
|
-
import { e, g, d, p as p2 } from "./utils-
|
|
1
|
+
import { o, a, p } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
|
|
2
|
+
import { e, g, d, p as p2 } from "./utils-BBXjywEs.mjs";
|
|
3
3
|
export {
|
|
4
4
|
e as emitsFactory,
|
|
5
5
|
g as getCamelAndMaybeKebabPropKeysFor,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { u as useLocalState, R as RReadModeRenderer,
|
|
1
|
+
import { u as useLocalState, R as RReadModeRenderer, a as RMultipleField } from "./common-CRFL2oQX.mjs";
|
|
2
2
|
import { d as deepmerge } from "./index-DGAy0amb.mjs";
|
|
3
3
|
import { computed, toValue, h } from "vue";
|
|
4
|
-
import { s as stripUndefinedValuesFromObject, t as toUnreactive } from "./utils-
|
|
4
|
+
import { s as stripUndefinedValuesFromObject, t as toUnreactive } from "./utils-BBXjywEs.mjs";
|
|
5
5
|
const useFieldComposer = (commonProps, stringifier, singleFieldRenderer, emit, onUpdateModelValueCamelProp, onUpdateModelValueKebabProp, modelValueRef, modelValueProp, nullIsValue = false, undefinedIsValue = false, onChange = () => {
|
|
6
6
|
}, callRefreshChoices) => {
|
|
7
7
|
const {
|
|
@@ -129,4 +129,4 @@ const useFieldComposer = (commonProps, stringifier, singleFieldRenderer, emit, o
|
|
|
129
129
|
export {
|
|
130
130
|
useFieldComposer as u
|
|
131
131
|
};
|
|
132
|
-
//# sourceMappingURL=field_composer-
|
|
132
|
+
//# sourceMappingURL=field_composer-B_4w9YL9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field_composer-CPqM1aSV.mjs","sources":["../src/private/fields/field_composer.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Field Composer\n|--------------------------------------------------------------------------\n|\n| A sophisticated composable that unifies field rendering across three distinct\n| operational modes: single field editing, multiple selection management, and\n| read-only display. This composer eliminates boilerplate by automatically \n| handling state management, event binding, and mode switching.\n|\n| KEY CAPABILITIES:\n| - Unified field interface across single/multiple/read modes\n| - Automatic state management with local state synchronization\n| - Type-safe slot argument mapping for consistent interfaces\n| - Complete event handling delegation with proper prop binding\n| - Seamless integration with RMultipleField and RReadModeRenderer\n| - Generic type support for any data type via RFieldStringifier\n|\n| ARCHITECTURE:\n| - Single renderer: Focus only on individual field logic\n| - Composer: Handles all mode complexity and state orchestration\n| - Consistent slot args: Same interface whether standalone or in multiple field\n| - Smart bindings: Automatic prop/event mapping with type safety\n|\n| USAGE PATTERN:\n| Individual field components become trivial - just provide the single field\n| renderer and stringifier, and get multiple selection + read mode for free.\n*/\n\nimport { useLocalState } from './common'\nimport { deepmerge } from 'deepmerge-ts'\nimport { computed, h, toValue } from 'vue'\nimport { RMultipleField } from './multiple'\nimport { RReadModeRenderer } from './read_mode_renderer'\nimport { stripUndefinedValuesFromObject, toUnreactive } from '../common/utils'\nimport type { VNode, MaybeRef, Ref, ToRefs } from 'vue'\nimport type { LooseRequired } from '@vue/shared/dist/shared.d.ts'\nimport type { RReadModeRendererPublicProps } from './read_mode_renderer'\nimport type { RMultipleFieldProps, SingleVariantSlotArgs } from './multiple'\nimport type {\n CommonResourcefulFieldPublicProps,\n EmitWithUpdateModelValue,\n LocalStateModelValue,\n RFieldStringifier,\n} from './common'\n\n/**\n * Extended RMultipleField props that include optional event handlers.\n * This type combines the base multiple field props with all possible\n * click and interaction event handlers for complete event delegation.\n *\n * Used internally to ensure type safety when binding events from the\n * composer options to the underlying RMultipleField component.\n */\ntype RMultipleFieldPropsWithEvents = RMultipleFieldProps & {\n 'onClick:append'?: ((e: MouseEvent) => void) | undefined\n 'onClick:appendInner'?: ((e: MouseEvent) => void) | undefined\n 'onClick:clear'?: ((e: MouseEvent) => void) | undefined\n 'onClick:prependInner'?: ((e: MouseEvent) => void) | undefined\n 'onClick:prepend'?: ((e: MouseEvent) => void) | undefined\n 'onMousedown:control'?: ((e: MouseEvent) => void) | undefined\n 'onClick:control'?: ((e: MouseEvent) => void) | undefined\n}\n\nexport type SingleFieldRenderer = MaybeRef<(...args: SingleVariantSlotArgs) => VNode>\n\n/**\n * A sophisticated composable that unifies field rendering across three operational modes:\n * single field editing, multiple selection management, and read-only display.\n *\n * This composer eliminates the complexity of managing different field states by providing\n * a unified interface. Individual field components only need to implement their single\n * field renderer, and the composer automatically handles multiple selection and read mode.\n *\n * ## Operational Modes\n *\n * 1. **Single Mode** (`multiple: false`, `renderMode: 'edit'`): Direct single field rendering\n * 2. **Multiple Mode** (`multiple: true`, `renderMode: 'edit'`): RMultipleField with single renderer as slot\n * 3. **Read Mode** (`renderMode: 'read'`): RReadModeRenderer with Oxford comma formatting\n *\n * ## Key Benefits\n *\n * - **Unified Configuration**: All options consolidated in commonProps - no separate option objects\n * - **Unified State Management**: Automatic local state sync with proper emit handling\n * - **Consistent Interface**: Same slot args pattern across all modes\n * - **Type Safety**: Full generic type propagation with proper TypeScript support\n * - **Event Delegation**: Complete event handling with prop binding automation\n * - **Zero Boilerplate**: Individual fields become trivial to implement\n *\n * ## Simplified Architecture\n *\n * ```typescript\n * // Individual field becomes this simple:\n * const { composed } = useFieldComposer(\n * toRefs(props), // All options unified in commonProps!\n * stringifier,\n * singleRenderer, // Just focus on single field logic!\n * emit,\n * // ... standard parameters\n * )\n * return () => composed()\n * ```\n *\n * @template T - The data type managed by the field (string, number, User, etc.)\n * @param commonProps - Reactive common field properties including all mode options (renderMode, multiple, variant, theme, to, href, events, etc.)\n * @param stringifier - Function to convert values to display format (supports VNode + string)\n * @param singleFieldRenderer - The core field renderer using SingleVariantSlotArgs interface\n * @param emit - Vue emit function for modelValue updates\n * @param onUpdateModelValueCamelProp - Optional camelCase prop event handler\n * @param onUpdateModelValueKebabProp - Optional kebab-case prop event handler\n * @param modelValueRef - Reactive reference to the current model value\n * @param modelValueProp - The initial model value prop\n * @param nullIsValue - Whether null should be treated as a valid value (default: false)\n * @param undefinedIsValue - Whether undefined should be treated as a valid value (default: false)\n * @param onChange - Optional callback for state change tracking\n * @returns Object with state management functions and the composed renderer\n *\n * @example\n * ```typescript\n * // String field implementation with unified props\n * export const RStringField = defineComponent({\n * name: 'RStringField',\n * props: {\n * ...makeCommonResourcefulFieldProps(),\n * // Add any field-specific props here\n * },\n * emits: commonEmits,\n * setup(props, { emit }) {\n * const stringStringifier: RFieldStringifier<string> = (val) => val || ''\n * const stringRenderer = ({ props }: SingleVariantSlotArgs<string>[0]) =>\n * h(VTextField, props)\n *\n * const { composed } = useFieldComposer(\n * toRefs(props), // All mode options included automatically!\n * stringStringifier,\n * stringRenderer,\n * emit,\n * props['onUpdate:modelValue'],\n * props['onUpdate:model-value'],\n * toRef(props, 'modelValue'),\n * props.modelValue,\n * false, // nullIsValue - null is not a valid string value\n * false // undefinedIsValue - undefined is not a valid string value\n * )\n *\n * return () => composed()\n * }\n * })\n * ```\n */\nexport const useFieldComposer = <T>(\n commonProps: ToRefs<LooseRequired<Readonly<CommonResourcefulFieldPublicProps>>>,\n stringifier: MaybeRef<RFieldStringifier<T>>,\n singleFieldRenderer: MaybeRef<(...args: SingleVariantSlotArgs) => VNode>,\n emit: EmitWithUpdateModelValue<T>,\n onUpdateModelValueCamelProp: ((val: T | T[] | null | undefined) => void) | undefined,\n onUpdateModelValueKebabProp: ((val: T | T[] | null | undefined) => void) | undefined,\n modelValueRef: Ref<T | T[] | null | undefined>,\n modelValueProp: T | T[] | null | undefined,\n nullIsValue: MaybeRef<boolean> = false,\n undefinedIsValue: MaybeRef<boolean> = false,\n onChange: (\n is: LocalStateModelValue<T>,\n was?: LocalStateModelValue<T> | undefined\n ) => void = () => {},\n callRefreshChoices?: () => void | Promise<void>\n) => {\n const {\n renderMode,\n multiple,\n choices,\n allowUnspecifiedChoices,\n label,\n density,\n class: className,\n style,\n to,\n href,\n menuIcon,\n active,\n theme,\n disabled,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n focused,\n } = commonProps\n const isMultiple = computed(() => multiple.value === true)\n const { localState, setLocalState, getLocalState, recomputeLocalState } = useLocalState(\n emit,\n onUpdateModelValueCamelProp,\n onUpdateModelValueKebabProp,\n isMultiple,\n modelValueRef,\n modelValueProp,\n onChange\n )\n const rReadModeRendererBindings = computed<RReadModeRendererPublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n stringifier: toValue(stringifier),\n modelValue: localState.value,\n label: label.value,\n density: density.value,\n class: className.value,\n style: style.value,\n to: to.value,\n href: href.value,\n nullIsValue: toValue(nullIsValue),\n undefinedIsValue: toValue(undefinedIsValue),\n callRefreshChoices,\n }) satisfies RReadModeRendererPublicProps\n )\n const multipleVariantBindings = computed<RMultipleFieldPropsWithEvents>(\n () =>\n stripUndefinedValuesFromObject(\n deepmerge(\n {\n stringifier: toValue(stringifier),\n menuIcon: menuIcon.value,\n class: className.value,\n style: style.value,\n active: active.value,\n theme: theme.value,\n disabled: disabled.value,\n variant: variant.value,\n prefix: prefix.value,\n persistentPlaceholder: persistentPlaceholder.value,\n suffix: suffix.value,\n role: role.value,\n focused: focused.value,\n choices: choices.value,\n allowUnspecifiedChoices: allowUnspecifiedChoices.value,\n density: density.value,\n nullIsValue: toValue(nullIsValue),\n undefinedIsValue: toValue(undefinedIsValue),\n },\n {\n 'onUpdate:modelValue': (val: LocalStateModelValue<T>) => setLocalState(val),\n 'onUpdate:focused': commonProps['onUpdate:focused'].value,\n 'onClick:append': commonProps['onClick:append'].value,\n 'onClick:appendInner': commonProps['onClick:appendInner'].value,\n 'onClick:clear': commonProps['onClick:clear'].value,\n 'onClick:prependInner': commonProps['onClick:prependInner'].value,\n 'onClick:prepend': commonProps['onClick:prepend'].value,\n 'onMousedown:control': commonProps['onMousedown:control'].value,\n 'onClick:control': commonProps['onClick:control'].value,\n },\n {\n modelValue: localState.value,\n }\n ) as RMultipleFieldPropsWithEvents\n ) satisfies RMultipleFieldPropsWithEvents\n )\n const singleVariantRendererArgs = computed<SingleVariantSlotArgs<T>>(() => [\n {\n props: {\n 'modelValue': Array.isArray(localState.value) ? localState.value[0] : localState.value,\n 'onUpdate:model-value': (val: T | null | undefined) => setLocalState(val),\n 'onUpdate:modelValue': (val: T | null | undefined) => setLocalState(val),\n },\n add: () => {},\n isMultiAdd: false,\n },\n ])\n const composed = () => {\n const currentSingleVariantRendererArgs = singleVariantRendererArgs.value\n if (!Array.isArray(currentSingleVariantRendererArgs)) return null\n if ('read' === renderMode.value) {\n return h(RReadModeRenderer, rReadModeRendererBindings.value)\n } else if (isMultiple.value) {\n const singleVariant = toUnreactive(singleFieldRenderer)\n return h(RMultipleField, multipleVariantBindings.value, {\n 'single-variant': (...args: SingleVariantSlotArgs<T>) => singleVariant(...args),\n })\n } else {\n const singleVariant = toUnreactive(singleFieldRenderer)\n return singleVariant(...currentSingleVariantRendererArgs)\n }\n }\n return {\n localState,\n setLocalState,\n getLocalState,\n recomputeLocalState,\n composed,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"field_composer-B_4w9YL9.mjs","sources":["../src/private/fields/field_composer.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| Resourceful Field Composer\n|--------------------------------------------------------------------------\n|\n| A sophisticated composable that unifies field rendering across three distinct\n| operational modes: single field editing, multiple selection management, and\n| read-only display. This composer eliminates boilerplate by automatically \n| handling state management, event binding, and mode switching.\n|\n| KEY CAPABILITIES:\n| - Unified field interface across single/multiple/read modes\n| - Automatic state management with local state synchronization\n| - Type-safe slot argument mapping for consistent interfaces\n| - Complete event handling delegation with proper prop binding\n| - Seamless integration with RMultipleField and RReadModeRenderer\n| - Generic type support for any data type via RFieldStringifier\n|\n| ARCHITECTURE:\n| - Single renderer: Focus only on individual field logic\n| - Composer: Handles all mode complexity and state orchestration\n| - Consistent slot args: Same interface whether standalone or in multiple field\n| - Smart bindings: Automatic prop/event mapping with type safety\n|\n| USAGE PATTERN:\n| Individual field components become trivial - just provide the single field\n| renderer and stringifier, and get multiple selection + read mode for free.\n*/\n\nimport { useLocalState } from './common'\nimport { deepmerge } from 'deepmerge-ts'\nimport { computed, h, toValue } from 'vue'\nimport { RMultipleField } from './multiple'\nimport { RReadModeRenderer } from './read_mode_renderer'\nimport { stripUndefinedValuesFromObject, toUnreactive } from '../common/utils'\nimport type { VNode, MaybeRef, Ref, ToRefs } from 'vue'\nimport type { LooseRequired } from '@vue/shared/dist/shared.d.ts'\nimport type { RReadModeRendererPublicProps } from './read_mode_renderer'\nimport type { RMultipleFieldProps, SingleVariantSlotArgs } from './multiple'\nimport type {\n CommonResourcefulFieldPublicProps,\n EmitWithUpdateModelValue,\n LocalStateModelValue,\n RFieldStringifier,\n} from './common'\n\n/**\n * Extended RMultipleField props that include optional event handlers.\n * This type combines the base multiple field props with all possible\n * click and interaction event handlers for complete event delegation.\n *\n * Used internally to ensure type safety when binding events from the\n * composer options to the underlying RMultipleField component.\n */\ntype RMultipleFieldPropsWithEvents = RMultipleFieldProps & {\n 'onClick:append'?: ((e: MouseEvent) => void) | undefined\n 'onClick:appendInner'?: ((e: MouseEvent) => void) | undefined\n 'onClick:clear'?: ((e: MouseEvent) => void) | undefined\n 'onClick:prependInner'?: ((e: MouseEvent) => void) | undefined\n 'onClick:prepend'?: ((e: MouseEvent) => void) | undefined\n 'onMousedown:control'?: ((e: MouseEvent) => void) | undefined\n 'onClick:control'?: ((e: MouseEvent) => void) | undefined\n}\n\nexport type SingleFieldRenderer = MaybeRef<(...args: SingleVariantSlotArgs) => VNode>\n\n/**\n * A sophisticated composable that unifies field rendering across three operational modes:\n * single field editing, multiple selection management, and read-only display.\n *\n * This composer eliminates the complexity of managing different field states by providing\n * a unified interface. Individual field components only need to implement their single\n * field renderer, and the composer automatically handles multiple selection and read mode.\n *\n * ## Operational Modes\n *\n * 1. **Single Mode** (`multiple: false`, `renderMode: 'edit'`): Direct single field rendering\n * 2. **Multiple Mode** (`multiple: true`, `renderMode: 'edit'`): RMultipleField with single renderer as slot\n * 3. **Read Mode** (`renderMode: 'read'`): RReadModeRenderer with Oxford comma formatting\n *\n * ## Key Benefits\n *\n * - **Unified Configuration**: All options consolidated in commonProps - no separate option objects\n * - **Unified State Management**: Automatic local state sync with proper emit handling\n * - **Consistent Interface**: Same slot args pattern across all modes\n * - **Type Safety**: Full generic type propagation with proper TypeScript support\n * - **Event Delegation**: Complete event handling with prop binding automation\n * - **Zero Boilerplate**: Individual fields become trivial to implement\n *\n * ## Simplified Architecture\n *\n * ```typescript\n * // Individual field becomes this simple:\n * const { composed } = useFieldComposer(\n * toRefs(props), // All options unified in commonProps!\n * stringifier,\n * singleRenderer, // Just focus on single field logic!\n * emit,\n * // ... standard parameters\n * )\n * return () => composed()\n * ```\n *\n * @template T - The data type managed by the field (string, number, User, etc.)\n * @param commonProps - Reactive common field properties including all mode options (renderMode, multiple, variant, theme, to, href, events, etc.)\n * @param stringifier - Function to convert values to display format (supports VNode + string)\n * @param singleFieldRenderer - The core field renderer using SingleVariantSlotArgs interface\n * @param emit - Vue emit function for modelValue updates\n * @param onUpdateModelValueCamelProp - Optional camelCase prop event handler\n * @param onUpdateModelValueKebabProp - Optional kebab-case prop event handler\n * @param modelValueRef - Reactive reference to the current model value\n * @param modelValueProp - The initial model value prop\n * @param nullIsValue - Whether null should be treated as a valid value (default: false)\n * @param undefinedIsValue - Whether undefined should be treated as a valid value (default: false)\n * @param onChange - Optional callback for state change tracking\n * @returns Object with state management functions and the composed renderer\n *\n * @example\n * ```typescript\n * // String field implementation with unified props\n * export const RStringField = defineComponent({\n * name: 'RStringField',\n * props: {\n * ...makeCommonResourcefulFieldProps(),\n * // Add any field-specific props here\n * },\n * emits: commonEmits,\n * setup(props, { emit }) {\n * const stringStringifier: RFieldStringifier<string> = (val) => val || ''\n * const stringRenderer = ({ props }: SingleVariantSlotArgs<string>[0]) =>\n * h(VTextField, props)\n *\n * const { composed } = useFieldComposer(\n * toRefs(props), // All mode options included automatically!\n * stringStringifier,\n * stringRenderer,\n * emit,\n * props['onUpdate:modelValue'],\n * props['onUpdate:model-value'],\n * toRef(props, 'modelValue'),\n * props.modelValue,\n * false, // nullIsValue - null is not a valid string value\n * false // undefinedIsValue - undefined is not a valid string value\n * )\n *\n * return () => composed()\n * }\n * })\n * ```\n */\nexport const useFieldComposer = <T>(\n commonProps: ToRefs<LooseRequired<Readonly<CommonResourcefulFieldPublicProps>>>,\n stringifier: MaybeRef<RFieldStringifier<T>>,\n singleFieldRenderer: MaybeRef<(...args: SingleVariantSlotArgs) => VNode>,\n emit: EmitWithUpdateModelValue<T>,\n onUpdateModelValueCamelProp: ((val: T | T[] | null | undefined) => void) | undefined,\n onUpdateModelValueKebabProp: ((val: T | T[] | null | undefined) => void) | undefined,\n modelValueRef: Ref<T | T[] | null | undefined>,\n modelValueProp: T | T[] | null | undefined,\n nullIsValue: MaybeRef<boolean> = false,\n undefinedIsValue: MaybeRef<boolean> = false,\n onChange: (\n is: LocalStateModelValue<T>,\n was?: LocalStateModelValue<T> | undefined\n ) => void = () => {},\n callRefreshChoices?: () => void | Promise<void>\n) => {\n const {\n renderMode,\n multiple,\n choices,\n allowUnspecifiedChoices,\n label,\n density,\n class: className,\n style,\n to,\n href,\n menuIcon,\n active,\n theme,\n disabled,\n variant,\n prefix,\n persistentPlaceholder,\n suffix,\n role,\n focused,\n } = commonProps\n const isMultiple = computed(() => multiple.value === true)\n const { localState, setLocalState, getLocalState, recomputeLocalState } = useLocalState(\n emit,\n onUpdateModelValueCamelProp,\n onUpdateModelValueKebabProp,\n isMultiple,\n modelValueRef,\n modelValueProp,\n onChange\n )\n const rReadModeRendererBindings = computed<RReadModeRendererPublicProps>(\n () =>\n stripUndefinedValuesFromObject({\n stringifier: toValue(stringifier),\n modelValue: localState.value,\n label: label.value,\n density: density.value,\n class: className.value,\n style: style.value,\n to: to.value,\n href: href.value,\n nullIsValue: toValue(nullIsValue),\n undefinedIsValue: toValue(undefinedIsValue),\n callRefreshChoices,\n }) satisfies RReadModeRendererPublicProps\n )\n const multipleVariantBindings = computed<RMultipleFieldPropsWithEvents>(\n () =>\n stripUndefinedValuesFromObject(\n deepmerge(\n {\n stringifier: toValue(stringifier),\n menuIcon: menuIcon.value,\n class: className.value,\n style: style.value,\n active: active.value,\n theme: theme.value,\n disabled: disabled.value,\n variant: variant.value,\n prefix: prefix.value,\n persistentPlaceholder: persistentPlaceholder.value,\n suffix: suffix.value,\n role: role.value,\n focused: focused.value,\n choices: choices.value,\n allowUnspecifiedChoices: allowUnspecifiedChoices.value,\n density: density.value,\n nullIsValue: toValue(nullIsValue),\n undefinedIsValue: toValue(undefinedIsValue),\n },\n {\n 'onUpdate:modelValue': (val: LocalStateModelValue<T>) => setLocalState(val),\n 'onUpdate:focused': commonProps['onUpdate:focused'].value,\n 'onClick:append': commonProps['onClick:append'].value,\n 'onClick:appendInner': commonProps['onClick:appendInner'].value,\n 'onClick:clear': commonProps['onClick:clear'].value,\n 'onClick:prependInner': commonProps['onClick:prependInner'].value,\n 'onClick:prepend': commonProps['onClick:prepend'].value,\n 'onMousedown:control': commonProps['onMousedown:control'].value,\n 'onClick:control': commonProps['onClick:control'].value,\n },\n {\n modelValue: localState.value,\n }\n ) as RMultipleFieldPropsWithEvents\n ) satisfies RMultipleFieldPropsWithEvents\n )\n const singleVariantRendererArgs = computed<SingleVariantSlotArgs<T>>(() => [\n {\n props: {\n 'modelValue': Array.isArray(localState.value) ? localState.value[0] : localState.value,\n 'onUpdate:model-value': (val: T | null | undefined) => setLocalState(val),\n 'onUpdate:modelValue': (val: T | null | undefined) => setLocalState(val),\n },\n add: () => {},\n isMultiAdd: false,\n },\n ])\n const composed = () => {\n const currentSingleVariantRendererArgs = singleVariantRendererArgs.value\n if (!Array.isArray(currentSingleVariantRendererArgs)) return null\n if ('read' === renderMode.value) {\n return h(RReadModeRenderer, rReadModeRendererBindings.value)\n } else if (isMultiple.value) {\n const singleVariant = toUnreactive(singleFieldRenderer)\n return h(RMultipleField, multipleVariantBindings.value, {\n 'single-variant': (...args: SingleVariantSlotArgs<T>) => singleVariant(...args),\n })\n } else {\n const singleVariant = toUnreactive(singleFieldRenderer)\n return singleVariant(...currentSingleVariantRendererArgs)\n }\n }\n return {\n localState,\n setLocalState,\n getLocalState,\n recomputeLocalState,\n composed,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { useDefaults } from "vuetify";
|
|
2
|
-
import { m as makeCommonResourcefulFieldProps, D as DevErrorAlert } from "./common-
|
|
3
|
-
import { u as useScopedDisplay } from "./display-
|
|
4
|
-
import { u as useValidation } from "./validation-
|
|
5
|
-
import { a as E_DECODED_STATE_MODEL_INCOMPATIBLE, b as E_FAILED_TO_DECODE_STATE_MODEL, c as E_FAILED_TO_COMPARE_STATE_MODEL_VALUES, E as E_FORM_NOT_RENDERED } from "./exceptions-
|
|
2
|
+
import { m as makeCommonResourcefulFieldProps, D as DevErrorAlert } from "./common-CRFL2oQX.mjs";
|
|
3
|
+
import { u as useScopedDisplay } from "./display-DxJktZAm.mjs";
|
|
4
|
+
import { u as useValidation } from "./validation-NVIikb_s.mjs";
|
|
5
|
+
import { a as E_DECODED_STATE_MODEL_INCOMPATIBLE, b as E_FAILED_TO_DECODE_STATE_MODEL, c as E_FAILED_TO_COMPARE_STATE_MODEL_VALUES, E as E_FORM_NOT_RENDERED } from "./exceptions-lwCt3BKI.mjs";
|
|
6
6
|
import { v as validator } from "./vendor-nhtio-validation-IJWW0vrt.mjs";
|
|
7
7
|
import { o } from "./vendor-nhtio-tiny-typed-emitter-gOxdt9O8.mjs";
|
|
8
|
-
import { a as pick, y as makeVCardProps, o as omit, d as debounce, t as throttle,
|
|
9
|
-
import { d as propsAndDefaultsFactory, p as propsAndEmitsFactory, i as isObject, h as getDefaultsForPropFactory, s as stripUndefinedValuesFromObject, q as typeAndFormatToResourcefulFieldType, g as getCamelAndMaybeKebabPropKeysFor } from "./utils-
|
|
10
|
-
import { d as defaultControlButtonBarOptionsProps } from "./props-
|
|
11
|
-
import { a as defaultControlButtonOverrideProps, d as defaultControlButtonProps, C as ControlButton } from "./index-
|
|
12
|
-
import { h as isResourcefulRecordFailureEvent, g as isResourcefulRecordSuccessEvent, e as isResourcefulRecordSubmittedEvent, d as isResourcefulRecordPreventedEvent, f as isResourcefulRecordProcessingEvent } from "./guards-
|
|
8
|
+
import { a as pick, y as makeVCardProps, o as omit, d as debounce, t as throttle, g as getCurrentInstanceName, u as useRender } from "./vendor-nhtio-vuetifiable-CTlDfYMJ.mjs";
|
|
9
|
+
import { d as propsAndDefaultsFactory, p as propsAndEmitsFactory, i as isObject, h as getDefaultsForPropFactory, s as stripUndefinedValuesFromObject, q as typeAndFormatToResourcefulFieldType, g as getCamelAndMaybeKebabPropKeysFor } from "./utils-BBXjywEs.mjs";
|
|
10
|
+
import { d as defaultControlButtonBarOptionsProps } from "./props-BZryUy0q.mjs";
|
|
11
|
+
import { a as defaultControlButtonOverrideProps, d as defaultControlButtonProps, C as ControlButton } from "./index-3roRSYqk.mjs";
|
|
12
|
+
import { h as isResourcefulRecordFailureEvent, g as isResourcefulRecordSuccessEvent, e as isResourcefulRecordSubmittedEvent, d as isResourcefulRecordPreventedEvent, f as isResourcefulRecordProcessingEvent } from "./guards-BI3Zu4tN.mjs";
|
|
13
13
|
import { watch, computed, toValue, shallowRef, triggerRef, warn, nextTick, h, defineComponent, ref, inject, provide, toRefs } from "vue";
|
|
14
14
|
import { ResourcefulRecordScopedDisplaySymbol, ResourcefulRecordFormScopedDisplaySymbol } from "./symbols.mjs";
|
|
15
|
-
import { l as dotCtor, a as useI18n } from "./ioc-
|
|
15
|
+
import { l as dotCtor, a as useI18n } from "./ioc-DOAKMPdw.mjs";
|
|
16
16
|
import { H as Hooks } from "./vendor-nhtio-hooks-Drha6Hpk.mjs";
|
|
17
|
-
import { S as SvgIcon } from "./index-
|
|
18
|
-
import { d as diff } from "./index-
|
|
17
|
+
import { S as SvgIcon } from "./index-BJmmZly3.mjs";
|
|
18
|
+
import { d as diff } from "./index-B-PEjqXn.mjs";
|
|
19
19
|
import { M as Middleware } from "./vendor-nhtio-middleware-DPyFv1NP.mjs";
|
|
20
20
|
import { e as encode, d as decode } from "./index-BEXQjukb.mjs";
|
|
21
|
-
import {
|
|
22
|
-
import { V as VSheet } from "./VSheet-
|
|
21
|
+
import { B as mdiContentSave, j as mdiRefresh, C as mdiFileUndo } from "./mdi-VGx06N8O.mjs";
|
|
22
|
+
import { V as VSheet } from "./VSheet-CX-0tYk0.mjs";
|
|
23
23
|
const ResourcefulRecordViewMode = ["read", "create", "update"];
|
|
24
24
|
class ResourcefulRecordBusConsumer {
|
|
25
25
|
#emitter;
|
|
@@ -1708,4 +1708,4 @@ export {
|
|
|
1708
1708
|
resourcefulRecordEmits as r,
|
|
1709
1709
|
useResourcefulPassthroughHook as u
|
|
1710
1710
|
};
|
|
1711
|
-
//# sourceMappingURL=form-
|
|
1711
|
+
//# sourceMappingURL=form-B7uOzLn2.mjs.map
|