@servicetitan/anvil2 3.15.1 → 3.16.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/CHANGELOG.md +22 -0
- package/dist/{Announcement-Cnz80WGx.js → Announcement-PfnsVVz1.js} +5 -2
- package/dist/Announcement-PfnsVVz1.js.map +1 -0
- package/dist/Announcement.js +1 -1
- package/dist/{DataTable-DkEpJ_Op.js → DataTable-DIXP9-Bx.js} +4 -4
- package/dist/{DataTable-DkEpJ_Op.js.map → DataTable-DIXP9-Bx.js.map} +1 -1
- package/dist/{Dialog-B9llUKJz.js → Dialog-_tHqOsbr.js} +2 -2
- package/dist/{Dialog-B9llUKJz.js.map → Dialog-_tHqOsbr.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/{Drawer-Bjd2XLUX.js → Drawer-D-ThWNp0.js} +2 -2
- package/dist/{Drawer-Bjd2XLUX.js.map → Drawer-D-ThWNp0.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/{FilterBar-ecqJDraA.js → FilterBar-jFn8O7v7.js} +17 -15
- package/dist/FilterBar-jFn8O7v7.js.map +1 -0
- package/dist/FilterBar.js +1 -1
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-DpPO0cya.js → MultiSelectFieldSync-DuImKXuj.js} +3 -3
- package/dist/{MultiSelectFieldSync-DpPO0cya.js.map → MultiSelectFieldSync-DuImKXuj.js.map} +1 -1
- package/dist/MultiSelectMenu.js +1 -1
- package/dist/{MultiSelectMenuSync-BN_3moW_.js → MultiSelectMenuSync-BhNXsgAN.js} +3 -3
- package/dist/{MultiSelectMenuSync-BN_3moW_.js.map → MultiSelectMenuSync-BhNXsgAN.js.map} +1 -1
- package/dist/{Page-IZ4p51iJ.js → Page-ZSHNJs7z.js} +2 -2
- package/dist/{Page-IZ4p51iJ.js.map → Page-ZSHNJs7z.js.map} +1 -1
- package/dist/Page.js +1 -1
- package/dist/{Pagination-Su4VBAhT.js → Pagination-Bsl99RRI.js} +4 -2
- package/dist/{Pagination-Su4VBAhT.js.map → Pagination-Bsl99RRI.js.map} +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/{ProgressBar-TQ0fPmn9.js → ProgressBar-zPKYv4Il.js} +10 -13
- package/dist/ProgressBar-zPKYv4Il.js.map +1 -0
- package/dist/ProgressBar.css +10 -14
- package/dist/ProgressBar.js +1 -1
- package/dist/{RichTextEditor-BpzUo8dB.js → RichTextEditor-DcAVqd2d.js} +18821 -20223
- package/dist/RichTextEditor-DcAVqd2d.js.map +1 -0
- package/dist/RichTextEditor.js +1 -1
- package/dist/{SavedFiltersButton-D9GJbJQu.js → SavedFiltersButton-Bl8mr-LB.js} +4 -4
- package/dist/{SavedFiltersButton-D9GJbJQu.js.map → SavedFiltersButton-Bl8mr-LB.js.map} +1 -1
- package/dist/SavedFiltersButton.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldSync-BN2ebLWT.js → SelectFieldSync-SS7FELT3.js} +3 -3
- package/dist/{SelectFieldSync-BN2ebLWT.js.map → SelectFieldSync-SS7FELT3.js.map} +1 -1
- package/dist/SelectMenu.js +1 -1
- package/dist/{SelectMenuSync-DuPf8KCc.js → SelectMenuSync-CPpE6vUG.js} +3 -3
- package/dist/{SelectMenuSync-DuPf8KCc.js.map → SelectMenuSync-CPpE6vUG.js.map} +1 -1
- package/dist/{SelectOptions-BK7kNjYM.js → SelectOptions-BDAu_9dv.js} +2 -2
- package/dist/{SelectOptions-BK7kNjYM.js.map → SelectOptions-BDAu_9dv.js.map} +1 -1
- package/dist/Table.js +1 -1
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-BryQmKe1.js → Toaster-SqkX0Kes.js} +2 -2
- package/dist/{Toaster-BryQmKe1.js.map → Toaster-SqkX0Kes.js.map} +1 -1
- package/dist/{Toaster-BtP_HezK.js → Toaster-dVGVVcat.js} +2 -2
- package/dist/{Toaster-BtP_HezK.js.map → Toaster-dVGVVcat.js.map} +1 -1
- package/dist/assets/icons/material.ts +184 -184
- package/dist/assets/icons/st.ts +9 -9
- package/dist/beta.js +9 -9
- package/dist/{bulkActionTypes-D5y3Acn1.js → bulkActionTypes-SukoplGV.js} +2 -2
- package/dist/{bulkActionTypes-D5y3Acn1.js.map → bulkActionTypes-SukoplGV.js.map} +1 -1
- package/dist/downshift.esm-U4VMqrF-.js.map +1 -1
- package/dist/extends-Bg2s_OKl.js.map +1 -1
- package/dist/{filter-state-Do862BNr.js → filter-state-hDtCUggM.js} +6 -6
- package/dist/{filter-state-Do862BNr.js.map → filter-state-hDtCUggM.js.map} +1 -1
- package/dist/{index-Dt0zG4YB.js → index-C2dOrf4N.js} +1549 -1582
- package/dist/index-C2dOrf4N.js.map +1 -0
- package/dist/index.js +11 -11
- package/dist/src/components/Pagination/Pagination.d.ts +28 -0
- package/dist/src/internal/components/LoadMoreSlot.d.ts +13 -0
- package/dist/src/internal/hooks/useAutoLoadMore.d.ts +40 -0
- package/dist/src/internal/hooks/useFocusReturnOnUnmount.d.ts +10 -0
- package/dist/{syncFilterUtils-ClEj4Oeg.js → syncFilterUtils-SMop8ckR.js} +177 -62
- package/dist/syncFilterUtils-SMop8ckR.js.map +1 -0
- package/package.json +21 -21
- package/dist/Announcement-Cnz80WGx.js.map +0 -1
- package/dist/FilterBar-ecqJDraA.js.map +0 -1
- package/dist/ProgressBar-TQ0fPmn9.js.map +0 -1
- package/dist/RichTextEditor-BpzUo8dB.js.map +0 -1
- package/dist/check_circle-C3DDoVXp.js +0 -8
- package/dist/check_circle-C3DDoVXp.js.map +0 -1
- package/dist/index-Dt0zG4YB.js.map +0 -1
- package/dist/src/internal/components/InView.d.ts +0 -14
- package/dist/syncFilterUtils-ClEj4Oeg.js.map +0 -1
package/dist/assets/icons/st.ts
CHANGED
|
@@ -45,10 +45,10 @@ export { default as icon_fixed } from "./st/fixed.svg";
|
|
|
45
45
|
export { default as icon_form } from "./st/form.svg";
|
|
46
46
|
export { default as icon_full_fluid } from "./st/full_fluid.svg";
|
|
47
47
|
export { default as icon_full_procurement_integration } from "./st/full_procurement_integration.svg";
|
|
48
|
-
export { default as icon_gnav_account_active } from "./st/gnav_account_active.svg";
|
|
49
|
-
export { default as icon_gnav_account_inactive } from "./st/gnav_account_inactive.svg";
|
|
50
48
|
export { default as icon_gnav_accounting_active } from "./st/gnav_accounting_active.svg";
|
|
51
49
|
export { default as icon_gnav_accounting_inactive } from "./st/gnav_accounting_inactive.svg";
|
|
50
|
+
export { default as icon_gnav_account_active } from "./st/gnav_account_active.svg";
|
|
51
|
+
export { default as icon_gnav_account_inactive } from "./st/gnav_account_inactive.svg";
|
|
52
52
|
export { default as icon_gnav_agreements_active } from "./st/gnav_agreements_active.svg";
|
|
53
53
|
export { default as icon_gnav_agreements_inactive } from "./st/gnav_agreements_inactive.svg";
|
|
54
54
|
export { default as icon_gnav_analytics_active } from "./st/gnav_analytics_active.svg";
|
|
@@ -109,10 +109,10 @@ export { default as icon_gnav_tasks_active } from "./st/gnav_tasks_active.svg";
|
|
|
109
109
|
export { default as icon_gnav_tasks_inactive } from "./st/gnav_tasks_inactive.svg";
|
|
110
110
|
export { default as icon_gnav_titan_advisor_active } from "./st/gnav_titan_advisor_active.svg";
|
|
111
111
|
export { default as icon_gnav_titan_advisor_inactive } from "./st/gnav_titan_advisor_inactive.svg";
|
|
112
|
-
export { default as icon_in_progress } from "./st/in_progress.svg";
|
|
113
112
|
export { default as icon_installed_equipment } from "./st/installed_equipment.svg";
|
|
114
113
|
export { default as icon_insurance_work_queue } from "./st/insurance_work_queue.svg";
|
|
115
114
|
export { default as icon_invoice } from "./st/invoice.svg";
|
|
115
|
+
export { default as icon_in_progress } from "./st/in_progress.svg";
|
|
116
116
|
export { default as icon_job } from "./st/job.svg";
|
|
117
117
|
export { default as icon_leads } from "./st/leads.svg";
|
|
118
118
|
export { default as icon_local_settings } from "./st/local_settings.svg";
|
|
@@ -120,11 +120,11 @@ export { default as icon_location } from "./st/location.svg";
|
|
|
120
120
|
export { default as icon_memberships } from "./st/memberships.svg";
|
|
121
121
|
export { default as icon_payment } from "./st/payment.svg";
|
|
122
122
|
export { default as icon_preview_file } from "./st/preview_file.svg";
|
|
123
|
-
export { default as icon_pro_tip } from "./st/pro_tip.svg";
|
|
124
123
|
export { default as icon_production_manager } from "./st/production_manager.svg";
|
|
125
124
|
export { default as icon_production_work_queue } from "./st/production_work_queue.svg";
|
|
126
125
|
export { default as icon_project } from "./st/project.svg";
|
|
127
126
|
export { default as icon_proposal } from "./st/proposal.svg";
|
|
127
|
+
export { default as icon_pro_tip } from "./st/pro_tip.svg";
|
|
128
128
|
export { default as icon_purchase_order } from "./st/purchase_order.svg";
|
|
129
129
|
export { default as icon_recurring_service } from "./st/recurring_service.svg";
|
|
130
130
|
export { default as icon_release_notes } from "./st/release_notes.svg";
|
|
@@ -132,22 +132,22 @@ export { default as icon_resize_window_alt } from "./st/resize_window_alt.svg";
|
|
|
132
132
|
export { default as icon_response_copy } from "./st/response_copy.svg";
|
|
133
133
|
export { default as icon_response_copy_failed } from "./st/response_copy_failed.svg";
|
|
134
134
|
export { default as icon_response_dislike } from "./st/response_dislike.svg";
|
|
135
|
-
export { default as icon_response_dislike_failed } from "./st/response_dislike_failed.svg";
|
|
136
135
|
export { default as icon_response_disliked } from "./st/response_disliked.svg";
|
|
136
|
+
export { default as icon_response_dislike_failed } from "./st/response_dislike_failed.svg";
|
|
137
137
|
export { default as icon_response_flag } from "./st/response_flag.svg";
|
|
138
|
-
export { default as icon_response_flag_failed } from "./st/response_flag_failed.svg";
|
|
139
138
|
export { default as icon_response_flagged } from "./st/response_flagged.svg";
|
|
139
|
+
export { default as icon_response_flag_failed } from "./st/response_flag_failed.svg";
|
|
140
140
|
export { default as icon_response_like } from "./st/response_like.svg";
|
|
141
|
-
export { default as icon_response_like_failed } from "./st/response_like_failed.svg";
|
|
142
141
|
export { default as icon_response_liked } from "./st/response_liked.svg";
|
|
142
|
+
export { default as icon_response_like_failed } from "./st/response_like_failed.svg";
|
|
143
143
|
export { default as icon_response_read } from "./st/response_read.svg";
|
|
144
|
-
export { default as icon_response_read_failed } from "./st/response_read_failed.svg";
|
|
145
144
|
export { default as icon_response_reading } from "./st/response_reading.svg";
|
|
145
|
+
export { default as icon_response_read_failed } from "./st/response_read_failed.svg";
|
|
146
146
|
export { default as icon_response_replay } from "./st/response_replay.svg";
|
|
147
147
|
export { default as icon_response_replay_failed } from "./st/response_replay_failed.svg";
|
|
148
148
|
export { default as icon_roofing } from "./st/roofing.svg";
|
|
149
|
-
export { default as icon_sales_manager } from "./st/sales_manager.svg";
|
|
150
149
|
export { default as icon_salespro } from "./st/salespro.svg";
|
|
150
|
+
export { default as icon_sales_manager } from "./st/sales_manager.svg";
|
|
151
151
|
export { default as icon_save_for_later } from "./st/save_for_later.svg";
|
|
152
152
|
export { default as icon_send_message } from "./st/send_message.svg";
|
|
153
153
|
export { default as icon_service_agreements } from "./st/service_agreements.svg";
|
package/dist/beta.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export { F as FilterBar } from './FilterBar-
|
|
2
|
-
export { C as COLUMN_TYPE_DEFAULTS, D as DataTable, b as booleanFormatter, a as chipsFormatter, c as createColumnHelper, d as currencyFormatter, i as dateFormatPresets, e as dateFormatter, f as dateTimeFormatter, g as getColumnTypeDefaults, h as htmlFormatter, m as markdownFormatter, n as numberFormatter, p as percentFormatter, r as resolveColumnTypeConfig, t as timeFormatPresets, j as timeFormatter, y as yearlessDateFormatter } from './DataTable-
|
|
1
|
+
export { F as FilterBar } from './FilterBar-jFn8O7v7.js';
|
|
2
|
+
export { C as COLUMN_TYPE_DEFAULTS, D as DataTable, b as booleanFormatter, a as chipsFormatter, c as createColumnHelper, d as currencyFormatter, i as dateFormatPresets, e as dateFormatter, f as dateTimeFormatter, g as getColumnTypeDefaults, h as htmlFormatter, m as markdownFormatter, n as numberFormatter, p as percentFormatter, r as resolveColumnTypeConfig, t as timeFormatPresets, j as timeFormatter, y as yearlessDateFormatter } from './DataTable-DIXP9-Bx.js';
|
|
3
3
|
export { T as Toolbar, a as ToolbarButton, b as ToolbarButtonLink, d as ToolbarControlGroup, f as ToolbarElement, e as ToolbarSearchField, c as ToolbarSelect } from './Toolbar-DGHZpFi9.js';
|
|
4
4
|
export { T as ToolbarButtonToggle } from './ToolbarButtonToggle-T8YnSJ5x.js';
|
|
5
5
|
export { u as useCalendarBetaProps } from './Calendar-IzXG1aJw.js';
|
|
6
6
|
export { C as Calendar } from './Calendar-DoLRAWLp.js';
|
|
7
|
-
import { S as SelectField$1, a as SelectFieldSync$1 } from './SelectFieldSync-
|
|
7
|
+
import { S as SelectField$1, a as SelectFieldSync$1 } from './SelectFieldSync-SS7FELT3.js';
|
|
8
8
|
import { forwardRef, createElement } from 'react';
|
|
9
9
|
import { w as warnOnce } from './warnOnce-Y9PRHcU4.js';
|
|
10
|
-
import { M as MultiSelectField$1, a as MultiSelectFieldSync$1 } from './MultiSelectFieldSync-
|
|
11
|
-
import { S as SelectMenu$1, a as SelectMenuSync$1 } from './SelectMenuSync-
|
|
12
|
-
import { M as MultiSelectMenu$1, a as MultiSelectMenuSync$1 } from './MultiSelectMenuSync-
|
|
10
|
+
import { M as MultiSelectField$1, a as MultiSelectFieldSync$1 } from './MultiSelectFieldSync-DuImKXuj.js';
|
|
11
|
+
import { S as SelectMenu$1, a as SelectMenuSync$1 } from './SelectMenuSync-CPpE6vUG.js';
|
|
12
|
+
import { M as MultiSelectMenu$1, a as MultiSelectMenuSync$1 } from './MultiSelectMenuSync-BhNXsgAN.js';
|
|
13
13
|
export { T as TreeSelectField, a as TreeSelectFieldSync } from './TreeSelectFieldSync-C0mXwYZL.js';
|
|
14
14
|
export { a as TreeSelectMenu, T as TreeSelectMenuSync } from './TreeSelectMenuSync-D2TvKxP-.js';
|
|
15
15
|
export { I as InteractiveCard } from './InteractiveCard-C2CYRtgQ.js';
|
|
16
|
-
export { R as RichTextEditor } from './RichTextEditor-
|
|
17
|
-
export { S as SavedFiltersButton } from './SavedFiltersButton-
|
|
16
|
+
export { R as RichTextEditor } from './RichTextEditor-DcAVqd2d.js';
|
|
17
|
+
export { S as SavedFiltersButton } from './SavedFiltersButton-Bl8mr-LB.js';
|
|
18
18
|
export { T as TypeaheadTextField } from './TypeaheadTextField-DgazozK7.js';
|
|
19
|
-
export { P as Page } from './Page-
|
|
19
|
+
export { P as Page } from './Page-ZSHNJs7z.js';
|
|
20
20
|
export { b as useAdaptiveView } from './useInvalidateOnOptionsChange-BD2VBpbK.js';
|
|
21
21
|
|
|
22
22
|
const BETA_EXPORT_REMOVED_VERSION = "4.0";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useRef, useEffect, useCallback, forwardRef, useMemo } from 'react';
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { V as VirtualizedOptionsPanel, O as OptionsPanel } from './syncFilterUtils-
|
|
3
|
+
import { V as VirtualizedOptionsPanel, O as OptionsPanel } from './syncFilterUtils-SMop8ckR.js';
|
|
4
4
|
|
|
5
5
|
function useBulkActionRunner({
|
|
6
6
|
setDraft
|
|
@@ -118,4 +118,4 @@ function resolveBulkActionLabel(label, current, fallback = "Select All") {
|
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
export { MultiSelectOptions as M, useToggleSelection as a, resolveBulkActionLabel as b, resolveBulkActionCheckState as r, useBulkActionRunner as u };
|
|
121
|
-
//# sourceMappingURL=bulkActionTypes-
|
|
121
|
+
//# sourceMappingURL=bulkActionTypes-SukoplGV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulkActionTypes-D5y3Acn1.js","sources":["../src/internal/hooks/useBulkActionRunner.ts","../src/internal/components/MultiSelectOptions.tsx","../src/internal/hooks/useToggleSelection.ts","../src/internal/types/bulkActionTypes.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype BulkComputeResult<T> = T[] | Promise<T[]>;\n\nexport type UseBulkActionRunnerOptions<T> = {\n setDraft: (next: T[]) => void;\n};\n\nexport type UseBulkActionRunnerResult<T> = {\n pending: boolean;\n runBulk: (\n compute: (current: T[]) => BulkComputeResult<T>,\n current: T[],\n ) => void;\n setDraftAndBump: (next: T[]) => void;\n reset: () => void;\n};\n\n/**\n * Applies Select-All / Select-Filtered computes through `setDraft`, discarding\n * stale async results with a generation counter. Synchronous arrays apply\n * immediately. `setDraftAndBump` and `reset` also advance the generation;\n * `reset` clears `pending` but does not revert the last `setDraft`.\n */\nexport function useBulkActionRunner<T>({\n setDraft,\n}: UseBulkActionRunnerOptions<T>): UseBulkActionRunnerResult<T> {\n const [pending, setPending] = useState(false);\n const genRef = useRef(0);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const runBulk = useCallback(\n (compute: (current: T[]) => BulkComputeResult<T>, current: T[]) => {\n const result = compute(current);\n\n genRef.current += 1;\n const myGen = genRef.current;\n\n if (Array.isArray(result)) {\n setDraft(result);\n // The superseded async branch will skip setPending(false).\n if (pending) setPending(false);\n return;\n }\n\n setPending(true);\n result\n .then((next) => {\n if (!isMountedRef.current) return;\n if (genRef.current !== myGen) return;\n setDraft(next);\n setPending(false);\n })\n .catch(() => {\n if (!isMountedRef.current) return;\n if (genRef.current !== myGen) return;\n // Swallows the rejection; callers own error UI.\n setPending(false);\n });\n },\n [pending, setDraft],\n );\n\n const setDraftAndBump = useCallback(\n (next: T[]) => {\n genRef.current += 1;\n setDraft(next);\n },\n [setDraft],\n );\n\n const reset = useCallback(() => {\n genRef.current += 1;\n setPending(false);\n }, []);\n\n return { pending, runBulk, setDraftAndBump, reset };\n}\n","import type { MultiSelectFieldOption } from \"../../components/MultiSelectField/types\";\nimport type { CheckState } from \"../../types\";\nimport { type CSSProperties, forwardRef, useCallback, useMemo } from \"react\";\nimport { OptionsPanel, type OptionsPanelHandle } from \"./OptionsPanel\";\nimport { VirtualizedOptionsPanel } from \"./VirtualizedOptionsPanel\";\nimport type {\n GetItemPropsFn,\n GetMenuPropsFn,\n SectionMeta,\n SelectItem,\n} from \"../types/selectFieldInternalTypes\";\n\nexport type MultiSelectOptionsProps = {\n /** When false, option rows stay unmounted inside the menu scroller. */\n isOpen: boolean;\n /** Flattened option, pinned/group, and bulk-action rows. */\n items: SelectItem[];\n /** Downshift getter for the menu scroller. */\n getMenuProps: GetMenuPropsFn;\n /** Downshift getter for each option row. */\n getItemProps: GetItemPropsFn;\n /** Host highlight index into `items`. */\n highlightedIndex: number;\n /** Current multi selection used to derive each row's check state. */\n selectedOptions: MultiSelectFieldOption[];\n /** When true, shows the load-more control. */\n hasMore: boolean;\n /** Fetches the next page of options. */\n onLoadMore: () => void;\n /** Replaces the list with a spinner while the current page loads. */\n loading: boolean;\n /** Spinner in the load-more slot. */\n loadingMore: boolean;\n /** Skips automatic next-page fetch; the Load more button remains. */\n disableAutoLoadMore?: boolean;\n /** Disables every row, in addition to per-item `disabled`. */\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n /** Pinned and group ranges over `items`. */\n sectionsMeta?: SectionMeta[];\n /** Uses the virtualized panel when true. Defaults to the non-virtual list. */\n virtualize?: boolean;\n};\n\n/** Multi-select option list. Forwards to {@link OptionsPanel} or the virtualized panel. */\nexport const MultiSelectOptions = forwardRef<\n OptionsPanelHandle,\n MultiSelectOptionsProps\n>(({ selectedOptions, items, virtualize, ...rest }, ref) => {\n const selectedIds = useMemo(\n () => new Set(selectedOptions.map((opt) => opt.id)),\n [selectedOptions],\n );\n\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState => {\n if (item.type === \"select-all\" || item.type === \"select-filtered\") {\n return item.checkState ?? \"indeterminate\";\n }\n // Pinned copies share the source option's id; other rows key off item.id.\n const checkId =\n item.type === \"pinned-option\" ? item.original.id : item.id;\n return selectedIds.has(checkId) ? \"checked\" : \"unchecked\";\n },\n [selectedIds],\n );\n\n const ListComponent = virtualize ? VirtualizedOptionsPanel : OptionsPanel;\n\n return (\n <ListComponent\n {...rest}\n ref={ref}\n items={items}\n selectionType=\"multiple\"\n getCheckedState={getCheckedState}\n />\n );\n});\n\nMultiSelectOptions.displayName = \"MultiSelectOptions\";\n","import { useCallback, useMemo } from \"react\";\nimport type { SelectFieldOption } from \"../../components/SelectField/types\";\nimport type { NormalizedPinnedSection } from \"./usePinnedOptions\";\n\ntype UseToggleSelectionParams<TID extends string | number> = {\n options: SelectFieldOption<TID>[];\n pinnedSections: NormalizedPinnedSection<TID>[];\n selectedOptions: SelectFieldOption<TID>[];\n onSelectedOptionsChange: (options: SelectFieldOption<TID>[]) => void;\n};\n\n/**\n * Toggles an option in a multi-select list. Adding looks up the full option in\n * `options`, then pinned sections; ids in neither are not added. Removing\n * matches by id only.\n */\nexport const useToggleSelection = <TID extends string | number>({\n options,\n pinnedSections,\n selectedOptions,\n onSelectedOptionsChange,\n}: UseToggleSelectionParams<TID>) => {\n const allPinnedOptions = useMemo(() => {\n return pinnedSections.flatMap((section) => section.options);\n }, [pinnedSections]);\n\n const handleItemClick = useCallback(\n (option: { id: TID; label: string }) => {\n const isSelected = selectedOptions.some((opt) => opt.id === option.id);\n if (isSelected) {\n onSelectedOptionsChange(\n selectedOptions.filter((opt) => opt.id !== option.id),\n );\n } else {\n const fullOption =\n options.find((opt) => opt.id === option.id) ||\n allPinnedOptions.find((opt) => opt.id === option.id);\n if (fullOption) {\n onSelectedOptionsChange([...selectedOptions, fullOption]);\n }\n }\n },\n [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions],\n );\n\n return { handleItemClick, allPinnedOptions };\n};\n","import type { CheckState } from \"../../types\";\nimport type { SelectFieldOption } from \"../../components/SelectField/types\";\n\n/**\n * Row checkbox state, or a function of the current selection. Boolean\n * shorthand is resolved by {@link resolveBulkActionCheckState}.\n */\nexport type BulkActionCheckState<\n TID extends string | number = string | number,\n> =\n | boolean\n | CheckState\n | ((current: SelectFieldOption<TID>[]) => boolean | CheckState);\n\n/**\n * Static text or derived from the current selection. Omitted config labels\n * become `\"Select All\"`.\n */\nexport type BulkActionLabel<TID extends string | number = string | number> =\n | string\n | ((current: SelectFieldOption<TID>[]) => string);\n\n/**\n * Select-All / Select-Filtered row. Exactly one of `onClick` or `compute`.\n */\nexport type BulkActionConfig<TID extends string | number> =\n | {\n label?: BulkActionLabel<TID>;\n checkState: BulkActionCheckState<TID>;\n /** Consumer commits the next selection. */\n onClick: () => void;\n compute?: never;\n }\n | {\n label?: BulkActionLabel<TID>;\n checkState: BulkActionCheckState<TID>;\n /** Next selection from the current one; may be async. */\n compute: (\n current: SelectFieldOption<TID>[],\n ) => SelectFieldOption<TID>[] | Promise<SelectFieldOption<TID>[]>;\n onClick?: never;\n };\n\n/**\n * Normalized form after `checkState`'s boolean shorthand is a `CheckState`.\n */\nexport type ResolvedBulkAction<TID extends string | number = string | number> =\n {\n label?: string;\n checkState: CheckState;\n onClick?: () => void;\n compute?: (\n current: SelectFieldOption<TID>[],\n ) => SelectFieldOption<TID>[] | Promise<SelectFieldOption<TID>[]>;\n };\n\n/**\n * Resolves {@link BulkActionCheckState} to a {@link CheckState}.\n * `true` → `\"checked\"`, `false` → `\"unchecked\"`; other values pass through,\n * defaulting to `\"indeterminate\"`.\n */\nexport function resolveBulkActionCheckState<TID extends string | number>(\n checkState: BulkActionCheckState<TID>,\n current: SelectFieldOption<TID>[],\n): CheckState {\n const value =\n typeof checkState === \"function\" ? checkState(current) : checkState;\n return value === true\n ? \"checked\"\n : value === false\n ? \"unchecked\"\n : (value ?? \"indeterminate\");\n}\n\n/** Resolves {@link BulkActionLabel} to a string. */\nexport function resolveBulkActionLabel<TID extends string | number>(\n label: BulkActionLabel<TID> | undefined,\n current: SelectFieldOption<TID>[],\n fallback = \"Select All\",\n): string {\n if (label === undefined) return fallback;\n return typeof label === \"function\" ? label(current) : label;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bulkActionTypes-SukoplGV.js","sources":["../src/internal/hooks/useBulkActionRunner.ts","../src/internal/components/MultiSelectOptions.tsx","../src/internal/hooks/useToggleSelection.ts","../src/internal/types/bulkActionTypes.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype BulkComputeResult<T> = T[] | Promise<T[]>;\n\nexport type UseBulkActionRunnerOptions<T> = {\n setDraft: (next: T[]) => void;\n};\n\nexport type UseBulkActionRunnerResult<T> = {\n pending: boolean;\n runBulk: (\n compute: (current: T[]) => BulkComputeResult<T>,\n current: T[],\n ) => void;\n setDraftAndBump: (next: T[]) => void;\n reset: () => void;\n};\n\n/**\n * Applies Select-All / Select-Filtered computes through `setDraft`, discarding\n * stale async results with a generation counter. Synchronous arrays apply\n * immediately. `setDraftAndBump` and `reset` also advance the generation;\n * `reset` clears `pending` but does not revert the last `setDraft`.\n */\nexport function useBulkActionRunner<T>({\n setDraft,\n}: UseBulkActionRunnerOptions<T>): UseBulkActionRunnerResult<T> {\n const [pending, setPending] = useState(false);\n const genRef = useRef(0);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const runBulk = useCallback(\n (compute: (current: T[]) => BulkComputeResult<T>, current: T[]) => {\n const result = compute(current);\n\n genRef.current += 1;\n const myGen = genRef.current;\n\n if (Array.isArray(result)) {\n setDraft(result);\n // The superseded async branch will skip setPending(false).\n if (pending) setPending(false);\n return;\n }\n\n setPending(true);\n result\n .then((next) => {\n if (!isMountedRef.current) return;\n if (genRef.current !== myGen) return;\n setDraft(next);\n setPending(false);\n })\n .catch(() => {\n if (!isMountedRef.current) return;\n if (genRef.current !== myGen) return;\n // Swallows the rejection; callers own error UI.\n setPending(false);\n });\n },\n [pending, setDraft],\n );\n\n const setDraftAndBump = useCallback(\n (next: T[]) => {\n genRef.current += 1;\n setDraft(next);\n },\n [setDraft],\n );\n\n const reset = useCallback(() => {\n genRef.current += 1;\n setPending(false);\n }, []);\n\n return { pending, runBulk, setDraftAndBump, reset };\n}\n","import type { MultiSelectFieldOption } from \"../../components/MultiSelectField/types\";\nimport type { CheckState } from \"../../types\";\nimport { type CSSProperties, forwardRef, useCallback, useMemo } from \"react\";\nimport { OptionsPanel, type OptionsPanelHandle } from \"./OptionsPanel\";\nimport { VirtualizedOptionsPanel } from \"./VirtualizedOptionsPanel\";\nimport type {\n GetItemPropsFn,\n GetMenuPropsFn,\n SectionMeta,\n SelectItem,\n} from \"../types/selectFieldInternalTypes\";\n\nexport type MultiSelectOptionsProps = {\n /** When false, option rows stay unmounted inside the menu scroller. */\n isOpen: boolean;\n /** Flattened option, pinned/group, and bulk-action rows. */\n items: SelectItem[];\n /** Downshift getter for the menu scroller. */\n getMenuProps: GetMenuPropsFn;\n /** Downshift getter for each option row. */\n getItemProps: GetItemPropsFn;\n /** Host highlight index into `items`. */\n highlightedIndex: number;\n /** Current multi selection used to derive each row's check state. */\n selectedOptions: MultiSelectFieldOption[];\n /** When true, shows the load-more control. */\n hasMore: boolean;\n /** Fetches the next page of options. */\n onLoadMore: () => void;\n /** Replaces the list with a spinner while the current page loads. */\n loading: boolean;\n /** Spinner in the load-more slot. */\n loadingMore: boolean;\n /** Skips automatic next-page fetch; the Load more button remains. */\n disableAutoLoadMore?: boolean;\n /** Disables every row, in addition to per-item `disabled`. */\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n /** Pinned and group ranges over `items`. */\n sectionsMeta?: SectionMeta[];\n /** Uses the virtualized panel when true. Defaults to the non-virtual list. */\n virtualize?: boolean;\n};\n\n/** Multi-select option list. Forwards to {@link OptionsPanel} or the virtualized panel. */\nexport const MultiSelectOptions = forwardRef<\n OptionsPanelHandle,\n MultiSelectOptionsProps\n>(({ selectedOptions, items, virtualize, ...rest }, ref) => {\n const selectedIds = useMemo(\n () => new Set(selectedOptions.map((opt) => opt.id)),\n [selectedOptions],\n );\n\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState => {\n if (item.type === \"select-all\" || item.type === \"select-filtered\") {\n return item.checkState ?? \"indeterminate\";\n }\n // Pinned copies share the source option's id; other rows key off item.id.\n const checkId =\n item.type === \"pinned-option\" ? item.original.id : item.id;\n return selectedIds.has(checkId) ? \"checked\" : \"unchecked\";\n },\n [selectedIds],\n );\n\n const ListComponent = virtualize ? VirtualizedOptionsPanel : OptionsPanel;\n\n return (\n <ListComponent\n {...rest}\n ref={ref}\n items={items}\n selectionType=\"multiple\"\n getCheckedState={getCheckedState}\n />\n );\n});\n\nMultiSelectOptions.displayName = \"MultiSelectOptions\";\n","import { useCallback, useMemo } from \"react\";\nimport type { SelectFieldOption } from \"../../components/SelectField/types\";\nimport type { NormalizedPinnedSection } from \"./usePinnedOptions\";\n\ntype UseToggleSelectionParams<TID extends string | number> = {\n options: SelectFieldOption<TID>[];\n pinnedSections: NormalizedPinnedSection<TID>[];\n selectedOptions: SelectFieldOption<TID>[];\n onSelectedOptionsChange: (options: SelectFieldOption<TID>[]) => void;\n};\n\n/**\n * Toggles an option in a multi-select list. Adding looks up the full option in\n * `options`, then pinned sections; ids in neither are not added. Removing\n * matches by id only.\n */\nexport const useToggleSelection = <TID extends string | number>({\n options,\n pinnedSections,\n selectedOptions,\n onSelectedOptionsChange,\n}: UseToggleSelectionParams<TID>) => {\n const allPinnedOptions = useMemo(() => {\n return pinnedSections.flatMap((section) => section.options);\n }, [pinnedSections]);\n\n const handleItemClick = useCallback(\n (option: { id: TID; label: string }) => {\n const isSelected = selectedOptions.some((opt) => opt.id === option.id);\n if (isSelected) {\n onSelectedOptionsChange(\n selectedOptions.filter((opt) => opt.id !== option.id),\n );\n } else {\n const fullOption =\n options.find((opt) => opt.id === option.id) ||\n allPinnedOptions.find((opt) => opt.id === option.id);\n if (fullOption) {\n onSelectedOptionsChange([...selectedOptions, fullOption]);\n }\n }\n },\n [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions],\n );\n\n return { handleItemClick, allPinnedOptions };\n};\n","import type { CheckState } from \"../../types\";\nimport type { SelectFieldOption } from \"../../components/SelectField/types\";\n\n/**\n * Row checkbox state, or a function of the current selection. Boolean\n * shorthand is resolved by {@link resolveBulkActionCheckState}.\n */\nexport type BulkActionCheckState<\n TID extends string | number = string | number,\n> =\n | boolean\n | CheckState\n | ((current: SelectFieldOption<TID>[]) => boolean | CheckState);\n\n/**\n * Static text or derived from the current selection. Omitted config labels\n * become `\"Select All\"`.\n */\nexport type BulkActionLabel<TID extends string | number = string | number> =\n | string\n | ((current: SelectFieldOption<TID>[]) => string);\n\n/**\n * Select-All / Select-Filtered row. Exactly one of `onClick` or `compute`.\n */\nexport type BulkActionConfig<TID extends string | number> =\n | {\n label?: BulkActionLabel<TID>;\n checkState: BulkActionCheckState<TID>;\n /** Consumer commits the next selection. */\n onClick: () => void;\n compute?: never;\n }\n | {\n label?: BulkActionLabel<TID>;\n checkState: BulkActionCheckState<TID>;\n /** Next selection from the current one; may be async. */\n compute: (\n current: SelectFieldOption<TID>[],\n ) => SelectFieldOption<TID>[] | Promise<SelectFieldOption<TID>[]>;\n onClick?: never;\n };\n\n/**\n * Normalized form after `checkState`'s boolean shorthand is a `CheckState`.\n */\nexport type ResolvedBulkAction<TID extends string | number = string | number> =\n {\n label?: string;\n checkState: CheckState;\n onClick?: () => void;\n compute?: (\n current: SelectFieldOption<TID>[],\n ) => SelectFieldOption<TID>[] | Promise<SelectFieldOption<TID>[]>;\n };\n\n/**\n * Resolves {@link BulkActionCheckState} to a {@link CheckState}.\n * `true` → `\"checked\"`, `false` → `\"unchecked\"`; other values pass through,\n * defaulting to `\"indeterminate\"`.\n */\nexport function resolveBulkActionCheckState<TID extends string | number>(\n checkState: BulkActionCheckState<TID>,\n current: SelectFieldOption<TID>[],\n): CheckState {\n const value =\n typeof checkState === \"function\" ? checkState(current) : checkState;\n return value === true\n ? \"checked\"\n : value === false\n ? \"unchecked\"\n : (value ?? \"indeterminate\");\n}\n\n/** Resolves {@link BulkActionLabel} to a string. */\nexport function resolveBulkActionLabel<TID extends string | number>(\n label: BulkActionLabel<TID> | undefined,\n current: SelectFieldOption<TID>[],\n fallback = \"Select All\",\n): string {\n if (label === undefined) return fallback;\n return typeof label === \"function\" ? label(current) : label;\n}\n"],"names":[],"mappings":"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"}
|