@planningcenter/tapestry 4.9.1-rc.3 → 4.10.0-rc.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/dist/components/DataTable/ActiveFilterInstance.d.ts +1 -0
- package/dist/components/DataTable/ActiveFilterInstance.d.ts.map +1 -1
- package/dist/components/DataTable/ActiveFilterInstance.js +3 -0
- package/dist/components/DataTable/ActiveFilterInstance.js.map +1 -1
- package/dist/components/DataTable/ActiveFilters.d.ts.map +1 -1
- package/dist/components/DataTable/ActiveFilters.js +32 -17
- package/dist/components/DataTable/ActiveFilters.js.map +1 -1
- package/dist/components/DataTable/FilterChip.d.ts +7 -0
- package/dist/components/DataTable/FilterChip.d.ts.map +1 -1
- package/dist/components/DataTable/FilterChip.js +8 -1
- package/dist/components/DataTable/FilterChip.js.map +1 -1
- package/dist/components/DataTable/filters.d.ts +1 -0
- package/dist/components/DataTable/filters.d.ts.map +1 -1
- package/dist/components/DataTable/index.d.ts +1 -0
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/presenceFilter.d.ts +7 -0
- package/dist/components/DataTable/presenceFilter.d.ts.map +1 -0
- package/dist/components/DataTable/presenceFilter.js +37 -0
- package/dist/components/DataTable/presenceFilter.js.map +1 -0
- package/dist/reactRender.css +751 -747
- package/dist/reactRender.css.map +1 -1
- package/dist/reactRenderLegacy.css +751 -747
- package/dist/reactRenderLegacy.css.map +1 -1
- package/dist/unstable.css +17 -13
- package/dist/unstable.css.map +1 -1
- package/dist/unstable.js +1 -0
- package/dist/unstable.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,6 +5,7 @@ export declare abstract class ActiveFilterInstance<T = unknown> {
|
|
|
5
5
|
readonly operator: Operator;
|
|
6
6
|
readonly value: T;
|
|
7
7
|
constructor(filter: FilterNodeItem, operator: Operator, value: T);
|
|
8
|
+
get isCompleteWithoutInput(): boolean;
|
|
8
9
|
toSegments(): string[];
|
|
9
10
|
abstract formatValue(): string | string[];
|
|
10
11
|
toValueSegments(): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilterInstance.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG3E,8BAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAElD,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAFR,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,CAAC;IAGnB,UAAU,IAAI,MAAM,EAAE;IAOtB,QAAQ,CAAC,WAAW,IAAI,MAAM,GAAG,MAAM,EAAE;IAEzC,eAAe,IAAI,MAAM,EAAE;IAM3B,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS;CAC/D"}
|
|
1
|
+
{"version":3,"file":"ActiveFilterInstance.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG3E,8BAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAElD,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAFR,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,CAAC;IAGnB,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,UAAU,IAAI,MAAM,EAAE;IAOtB,QAAQ,CAAC,WAAW,IAAI,MAAM,GAAG,MAAM,EAAE;IAEzC,eAAe,IAAI,MAAM,EAAE;IAM3B,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS;CAC/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilterInstance.js","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"sourcesContent":["import type React from \"react\"\n\nimport type { FilterChange, FilterNodeItem, Operator } from \"./FilterTypes\"\nimport { isEmptyValue } from \"./utils\"\n\nexport abstract class ActiveFilterInstance<T = unknown> {\n constructor(\n readonly filter: FilterNodeItem,\n readonly operator: Operator,\n readonly value: T\n ) {}\n\n toSegments(): string[] {\n const { label } = this.operator\n return label\n ? [this.filter.label, label, ...this.toValueSegments()]\n : [this.filter.label, ...this.toValueSegments()]\n }\n\n abstract formatValue(): string | string[]\n\n toValueSegments(): string[] {\n const value = this.formatValue()\n const segments = Array.isArray(value) ? value : [value]\n return segments.filter((segment) => !isEmptyValue(segment))\n }\n\n abstract renderEditor(onChange: FilterChange): React.ReactNode\n}\n"],"names":[],"mappings":";;MAKsB,oBAAoB,CAAA;AAE7B,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AAHX,IAAA,WAAA,CACW,MAAsB,EACtB,QAAkB,EAClB,KAAQ,EAAA;QAFR,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,KAAK,GAAL,KAAK;IACb;
|
|
1
|
+
{"version":3,"file":"ActiveFilterInstance.js","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"sourcesContent":["import type React from \"react\"\n\nimport type { FilterChange, FilterNodeItem, Operator } from \"./FilterTypes\"\nimport { isEmptyValue } from \"./utils\"\n\nexport abstract class ActiveFilterInstance<T = unknown> {\n constructor(\n readonly filter: FilterNodeItem,\n readonly operator: Operator,\n readonly value: T\n ) {}\n\n get isCompleteWithoutInput(): boolean {\n return false\n }\n\n toSegments(): string[] {\n const { label } = this.operator\n return label\n ? [this.filter.label, label, ...this.toValueSegments()]\n : [this.filter.label, ...this.toValueSegments()]\n }\n\n abstract formatValue(): string | string[]\n\n toValueSegments(): string[] {\n const value = this.formatValue()\n const segments = Array.isArray(value) ? value : [value]\n return segments.filter((segment) => !isEmptyValue(segment))\n }\n\n abstract renderEditor(onChange: FilterChange): React.ReactNode\n}\n"],"names":[],"mappings":";;MAKsB,oBAAoB,CAAA;AAE7B,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AAHX,IAAA,WAAA,CACW,MAAsB,EACtB,QAAkB,EAClB,KAAQ,EAAA;QAFR,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,KAAK,GAAL,KAAK;IACb;AAEH,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,KAAK;IACd;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ;AAC/B,QAAA,OAAO;AACL,cAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;AACtD,cAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACpD;IAIA,eAAe,GAAA;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AACvD,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7D;AAGD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"ActiveFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAMN,MAAM,OAAO,CAAA;AAYd,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAO/D,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,OAAyC,GAC1C,EAAE;IACD,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAA;IACnB,qBAAqB,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,CAAA;IAC9D,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,qBAkJA;AAsBD,iBAAS,YAAY,CAAC,EACpB,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,OAAe,GAChB,EAAE;IACD,YAAY,EAAE,YAAY,CAAA;IAC1B,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,qBAsFA"}
|
|
@@ -6,8 +6,8 @@ import '../button/IconButton.js';
|
|
|
6
6
|
import '../button/LoadingButton.js';
|
|
7
7
|
import '../button/PageHeaderActionsDropdownButton.js';
|
|
8
8
|
import { Popover, PopoverTrigger, PopoverContent } from '../popover/Popover.js';
|
|
9
|
-
import React__default, { useState, useMemo, useLayoutEffect, useRef } from 'react';
|
|
10
|
-
import { FilterChip, FilterChipSegments } from './FilterChip.js';
|
|
9
|
+
import React__default, { useState, useMemo, useLayoutEffect, useRef, useEffect } from 'react';
|
|
10
|
+
import { FilterChip, FilterChipSegments, FilterChipStaticSegments } from './FilterChip.js';
|
|
11
11
|
import { useRestoreFilterFocus, useRelatedFilterOperator } from './FilterContext.js';
|
|
12
12
|
import { getFilterKey, keepFilterKey, getFilterSequence } from './filterKeys.js';
|
|
13
13
|
import { OperatorSelect } from './OperatorSelect.js';
|
|
@@ -136,23 +136,38 @@ function inCreationOrder(entries) {
|
|
|
136
136
|
}
|
|
137
137
|
function ActiveFilter({ activeFilter, onChange, removeActiveFilter, pending = false, }) {
|
|
138
138
|
const { relatedFilter, operator } = useRelatedFilterOperator(activeFilter);
|
|
139
|
-
|
|
139
|
+
const activeFilterInstance = relatedFilter &&
|
|
140
|
+
operator &&
|
|
141
|
+
relatedFilter.createActiveFilterInstance(activeFilter, operator);
|
|
142
|
+
const autoPromoted = useRef(false);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (!pending ||
|
|
145
|
+
!activeFilterInstance?.isCompleteWithoutInput ||
|
|
146
|
+
autoPromoted.current)
|
|
147
|
+
return;
|
|
148
|
+
autoPromoted.current = true;
|
|
149
|
+
onChange({}, { complete: true });
|
|
150
|
+
});
|
|
151
|
+
if (!relatedFilter || !operator || !activeFilterInstance)
|
|
140
152
|
return (React__default.createElement(FilterChip, { label: "Unrecognized filter", onRemove: removeActiveFilter, status: "invalid" },
|
|
141
153
|
React__default.createElement(FilterChipSegments, { segments: ["Unrecognized filter"] })));
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
React__default.createElement(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
154
|
+
const editor = activeFilterInstance.renderEditor(onChange);
|
|
155
|
+
const segments = activeFilterInstance.toSegments();
|
|
156
|
+
const isEditable = relatedFilter.operators.length > 1 || editor != null;
|
|
157
|
+
return (React__default.createElement(FilterChip, { label: `${relatedFilter.label} filter${pending ? " (pending)" : ""}`, onRemove: removeActiveFilter, status: pending ? "inactive" : undefined }, !isEditable ? (React__default.createElement(FilterChipStaticSegments, { segments: segments })) : (React__default.createElement(Popover, { defaultOpen: pending },
|
|
158
|
+
React__default.createElement(PopoverTrigger, null,
|
|
159
|
+
React__default.createElement(FilterChipSegments, { segments: segments })),
|
|
160
|
+
React__default.createElement(PopoverContent, { className: "tds-popover--data-table-filters-popover", modal: false },
|
|
161
|
+
React__default.createElement("h2", { className: "tds-data-table-filters-popover-label" },
|
|
162
|
+
relatedFilter.label,
|
|
163
|
+
relatedFilter.operators.length === 1 && (React__default.createElement("span", { className: "tds-data-table-filters-popover-label-operator" },
|
|
164
|
+
" ",
|
|
165
|
+
operator.label))),
|
|
166
|
+
relatedFilter.description && (React__default.createElement("p", { className: "tds-data-table-filters-popover-description" }, relatedFilter.description)),
|
|
167
|
+
React__default.createElement(OperatorSelect, { operator: operator, relatedFilter: relatedFilter, updateActiveFilter: (updates) => onChange(updates, {
|
|
168
|
+
complete: relatedFilter.createActiveFilterInstance({ ...activeFilter, ...updates }, relatedFilter.operators.find(({ name }) => name === updates.operator) ?? operator).isCompleteWithoutInput,
|
|
169
|
+
}) }),
|
|
170
|
+
editor)))));
|
|
156
171
|
}
|
|
157
172
|
|
|
158
173
|
export { ActiveFilters };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilters.js","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"sourcesContent":["import { Button } from \"@components/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@components/popover/Popover\"\nimport React, { useLayoutEffect, useMemo, useRef, useState } from \"react\"\n\nimport { FilterChip, FilterChipSegments } from \"./FilterChip\"\nimport {\n useRelatedFilterOperator,\n useRestoreFilterFocus,\n} from \"./FilterContext\"\nimport { getFilterKey, getFilterSequence, keepFilterKey } from \"./filterKeys\"\nimport type { ActiveFilter, FilterChange } from \"./FilterTypes\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\n/** A promoted filter the host may not have applied yet. */\ntype Promotion = { filter: ActiveFilter; index: number; key?: string }\n\nexport function ActiveFilters({\n activeFilters,\n hasFilters,\n onActiveFiltersChange,\n onClear = () => onActiveFiltersChange([]),\n}: {\n activeFilters: ActiveFilter[]\n /** Whether the filter schema has loaded. */\n hasFilters: boolean\n onActiveFiltersChange: (activeFilters: ActiveFilter[]) => void\n /** Called by the Clear button. Defaults to `onActiveFiltersChange([])`. */\n onClear?: () => void\n}) {\n const { pendingFilters, removePendingFilter, updatePendingFilter } =\n usePendingFilters()\n const restoreFilterFocus = useRestoreFilterFocus()\n const [promotions, setPromotions] = useState<Promotion[]>([])\n\n // Keep each pending chip, and its open popover, mounted until the host\n // applies its promotion.\n const confirmed = useMemo(\n () =>\n promotions.flatMap((promotion) => {\n const promotedFilter = activeFilters[promotion.index]\n const pendingCopy =\n promotedFilter &&\n pendingFilters.find(\n (filter) => getFilterKey(filter) === promotion.key\n )\n if (!pendingCopy) return []\n keepFilterKey(pendingCopy, promotedFilter)\n return [{ pendingCopy, promotion }]\n }),\n [activeFilters, pendingFilters, promotions]\n )\n const pendingCopies = confirmed.map(({ pendingCopy }) => pendingCopy)\n\n useLayoutEffect(() => {\n if (confirmed.length === 0) return\n confirmed.forEach(({ pendingCopy }) => removePendingFilter(pendingCopy))\n const done = confirmed.map(({ promotion }) => promotion)\n setPromotions((prev) => prev.filter((p) => !done.includes(p)))\n }, [confirmed, removePendingFilter])\n\n // Hosts apply updates in order, so build each one on top of promotions they\n // haven't applied yet. A list without an entry supersedes one that had it.\n const inFlight = promotions.filter((p) => p.index >= activeFilters.length)\n const optimisticFilters = [...activeFilters, ...inFlight.map((p) => p.filter)]\n\n function sendWithout(index: number) {\n setPromotions((prev) =>\n prev\n .filter((p) => p.index !== index)\n .map((p) => (p.index > index ? { ...p, index: p.index - 1 } : p))\n )\n onActiveFiltersChange(optimisticFilters.filter((_, i) => i !== index))\n }\n\n function retractPromotion(filter: ActiveFilter) {\n const promotion = inFlight.find((p) => p.key === getFilterKey(filter))\n if (promotion) sendWithout(promotion.index)\n }\n\n function promote(filter: ActiveFilter, promoted: ActiveFilter) {\n const key = getFilterKey(filter)\n const existing = inFlight.find((p) => p.key === key)\n const index = existing?.index ?? optimisticFilters.length\n const next = [...optimisticFilters]\n next[index] = promoted\n setPromotions((prev) =>\n existing\n ? prev.map((p) => (p.key === key ? { ...p, filter: promoted } : p))\n : [...prev, { filter: promoted, index, key }]\n )\n onActiveFiltersChange(next)\n }\n\n // Hosts may return rebuilt, keyless filters (e.g. a JSON round trip). An\n // unchanged length means an edit, so carry keys over by position.\n const previousActiveFilters = useRef(activeFilters)\n if (activeFilters.length === previousActiveFilters.current.length) {\n activeFilters.forEach((filter, index) => {\n if (!getFilterKey(filter)) {\n keepFilterKey(previousActiveFilters.current[index], filter)\n }\n })\n }\n useLayoutEffect(() => {\n previousActiveFilters.current = activeFilters\n })\n\n // One list: React matches keys only within a list, so separate lists would\n // remount a promoted chip despite its stable key.\n const entries = inCreationOrder([\n ...activeFilters.map((filter, index) => ({\n filter,\n index,\n pending: false as const,\n })),\n ...pendingFilters\n .filter((filter) => !pendingCopies.includes(filter))\n .map((filter, index) => ({\n filter,\n index,\n pending: true as const,\n })),\n ])\n\n return (\n <div className=\"tds-data-table-filters-active\">\n <div className=\"tds-data-table-filters-active-list\">\n {entries.map(({ filter, index, pending }) => (\n <ActiveFilter\n key={\n getFilterKey(filter) ??\n `${pending ? \"pending\" : \"active\"}-${index}`\n }\n activeFilter={filter}\n pending={pending}\n onChange={(updates, { complete = true } = {}) => {\n if (pending) {\n updatePendingFilter(filter, updates)\n if (complete) promote(filter, { ...filter, ...updates })\n else retractPromotion(filter)\n return\n }\n const next = [...optimisticFilters]\n next[index] = keepFilterKey(filter, { ...filter, ...updates })\n onActiveFiltersChange(next)\n }}\n removeActiveFilter={() => {\n if (pending) {\n removePendingFilter(filter)\n retractPromotion(filter)\n return\n }\n sendWithout(index)\n }}\n />\n ))}\n </div>\n <div className=\"tds-data-table-filters-active-actions\">\n <Button\n aria-label=\"Clear filters\"\n disabled={!hasFilters}\n kind=\"secondary\"\n label=\"Clear\"\n size=\"sm\"\n onClick={() => {\n setPromotions([])\n onClear()\n restoreFilterFocus()\n }}\n />\n {/* TODO: Save view button goes here */}\n </div>\n </div>\n )\n}\n\n// A promoted filter is appended to `activeFilters`, ahead of every pending\n// chip. Sorting keyed chips by creation order keeps it in place, so its open\n// popover stays anchored under it.\nfunction inCreationOrder<T extends { filter: ActiveFilter }>(entries: T[]) {\n const keyedSlots = entries.flatMap((entry, slot) =>\n getFilterSequence(entry.filter) === undefined ? [] : [slot]\n )\n const keyedEntries = keyedSlots\n .map((slot) => entries[slot])\n .sort(\n (a, b) =>\n (getFilterSequence(a.filter) ?? 0) - (getFilterSequence(b.filter) ?? 0)\n )\n const sorted = [...entries]\n keyedSlots.forEach((slot, i) => {\n sorted[slot] = keyedEntries[i]\n })\n return sorted\n}\n\nfunction ActiveFilter({\n activeFilter,\n onChange,\n removeActiveFilter,\n pending = false,\n}: {\n activeFilter: ActiveFilter\n onChange: FilterChange\n pending?: boolean\n removeActiveFilter: () => void\n}) {\n const { relatedFilter, operator } = useRelatedFilterOperator(activeFilter)\n\n if (!relatedFilter || !operator)\n return (\n <FilterChip\n label=\"Unrecognized filter\"\n onRemove={removeActiveFilter}\n status=\"invalid\"\n >\n <FilterChipSegments segments={[\"Unrecognized filter\"]} />\n </FilterChip>\n )\n\n const activeFilterInstance = relatedFilter.createActiveFilterInstance(\n activeFilter,\n operator\n )\n\n return (\n <FilterChip\n label={`${relatedFilter.label} filter${pending ? \" (pending)\" : \"\"}`}\n onRemove={removeActiveFilter}\n status={pending ? \"inactive\" : undefined}\n >\n <Popover defaultOpen={pending}>\n <PopoverTrigger>\n <FilterChipSegments segments={activeFilterInstance.toSegments()} />\n </PopoverTrigger>\n <PopoverContent\n className=\"tds-popover--data-table-filters-popover\"\n modal={false}\n >\n <h2 className=\"tds-data-table-filters-popover-label\">\n {relatedFilter.label}\n {relatedFilter.operators.length === 1 && (\n <span className=\"tds-data-table-filters-popover-label-operator\">\n {\" \"}\n {operator.label}\n </span>\n )}\n </h2>\n {relatedFilter.description && (\n <p className=\"tds-data-table-filters-popover-description\">\n {relatedFilter.description}\n </p>\n )}\n <OperatorSelect\n operator={operator}\n relatedFilter={relatedFilter}\n updateActiveFilter={(updates) =>\n onChange(updates, { complete: false })\n }\n />\n {activeFilterInstance.renderEditor(onChange)}\n </PopoverContent>\n </Popover>\n </FilterChip>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActiveFilters.js","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"sourcesContent":["import { Button } from \"@components/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@components/popover/Popover\"\nimport React, {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport {\n FilterChip,\n FilterChipSegments,\n FilterChipStaticSegments,\n} from \"./FilterChip\"\nimport {\n useRelatedFilterOperator,\n useRestoreFilterFocus,\n} from \"./FilterContext\"\nimport { getFilterKey, getFilterSequence, keepFilterKey } from \"./filterKeys\"\nimport type { ActiveFilter, FilterChange } from \"./FilterTypes\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\n/** A promoted filter the host may not have applied yet. */\ntype Promotion = { filter: ActiveFilter; index: number; key?: string }\n\nexport function ActiveFilters({\n activeFilters,\n hasFilters,\n onActiveFiltersChange,\n onClear = () => onActiveFiltersChange([]),\n}: {\n activeFilters: ActiveFilter[]\n /** Whether the filter schema has loaded. */\n hasFilters: boolean\n onActiveFiltersChange: (activeFilters: ActiveFilter[]) => void\n /** Called by the Clear button. Defaults to `onActiveFiltersChange([])`. */\n onClear?: () => void\n}) {\n const { pendingFilters, removePendingFilter, updatePendingFilter } =\n usePendingFilters()\n const restoreFilterFocus = useRestoreFilterFocus()\n const [promotions, setPromotions] = useState<Promotion[]>([])\n\n // Keep each pending chip, and its open popover, mounted until the host\n // applies its promotion.\n const confirmed = useMemo(\n () =>\n promotions.flatMap((promotion) => {\n const promotedFilter = activeFilters[promotion.index]\n const pendingCopy =\n promotedFilter &&\n pendingFilters.find(\n (filter) => getFilterKey(filter) === promotion.key\n )\n if (!pendingCopy) return []\n keepFilterKey(pendingCopy, promotedFilter)\n return [{ pendingCopy, promotion }]\n }),\n [activeFilters, pendingFilters, promotions]\n )\n const pendingCopies = confirmed.map(({ pendingCopy }) => pendingCopy)\n\n useLayoutEffect(() => {\n if (confirmed.length === 0) return\n confirmed.forEach(({ pendingCopy }) => removePendingFilter(pendingCopy))\n const done = confirmed.map(({ promotion }) => promotion)\n setPromotions((prev) => prev.filter((p) => !done.includes(p)))\n }, [confirmed, removePendingFilter])\n\n // Hosts apply updates in order, so build each one on top of promotions they\n // haven't applied yet. A list without an entry supersedes one that had it.\n const inFlight = promotions.filter((p) => p.index >= activeFilters.length)\n const optimisticFilters = [...activeFilters, ...inFlight.map((p) => p.filter)]\n\n function sendWithout(index: number) {\n setPromotions((prev) =>\n prev\n .filter((p) => p.index !== index)\n .map((p) => (p.index > index ? { ...p, index: p.index - 1 } : p))\n )\n onActiveFiltersChange(optimisticFilters.filter((_, i) => i !== index))\n }\n\n function retractPromotion(filter: ActiveFilter) {\n const promotion = inFlight.find((p) => p.key === getFilterKey(filter))\n if (promotion) sendWithout(promotion.index)\n }\n\n function promote(filter: ActiveFilter, promoted: ActiveFilter) {\n const key = getFilterKey(filter)\n const existing = inFlight.find((p) => p.key === key)\n const index = existing?.index ?? optimisticFilters.length\n const next = [...optimisticFilters]\n next[index] = promoted\n setPromotions((prev) =>\n existing\n ? prev.map((p) => (p.key === key ? { ...p, filter: promoted } : p))\n : [...prev, { filter: promoted, index, key }]\n )\n onActiveFiltersChange(next)\n }\n\n // Hosts may return rebuilt, keyless filters (e.g. a JSON round trip). An\n // unchanged length means an edit, so carry keys over by position.\n const previousActiveFilters = useRef(activeFilters)\n if (activeFilters.length === previousActiveFilters.current.length) {\n activeFilters.forEach((filter, index) => {\n if (!getFilterKey(filter)) {\n keepFilterKey(previousActiveFilters.current[index], filter)\n }\n })\n }\n useLayoutEffect(() => {\n previousActiveFilters.current = activeFilters\n })\n\n // One list: React matches keys only within a list, so separate lists would\n // remount a promoted chip despite its stable key.\n const entries = inCreationOrder([\n ...activeFilters.map((filter, index) => ({\n filter,\n index,\n pending: false as const,\n })),\n ...pendingFilters\n .filter((filter) => !pendingCopies.includes(filter))\n .map((filter, index) => ({\n filter,\n index,\n pending: true as const,\n })),\n ])\n\n return (\n <div className=\"tds-data-table-filters-active\">\n <div className=\"tds-data-table-filters-active-list\">\n {entries.map(({ filter, index, pending }) => (\n <ActiveFilter\n key={\n getFilterKey(filter) ??\n `${pending ? \"pending\" : \"active\"}-${index}`\n }\n activeFilter={filter}\n pending={pending}\n onChange={(updates, { complete = true } = {}) => {\n if (pending) {\n updatePendingFilter(filter, updates)\n if (complete) promote(filter, { ...filter, ...updates })\n else retractPromotion(filter)\n return\n }\n const next = [...optimisticFilters]\n next[index] = keepFilterKey(filter, { ...filter, ...updates })\n onActiveFiltersChange(next)\n }}\n removeActiveFilter={() => {\n if (pending) {\n removePendingFilter(filter)\n retractPromotion(filter)\n return\n }\n sendWithout(index)\n }}\n />\n ))}\n </div>\n <div className=\"tds-data-table-filters-active-actions\">\n <Button\n aria-label=\"Clear filters\"\n disabled={!hasFilters}\n kind=\"secondary\"\n label=\"Clear\"\n size=\"sm\"\n onClick={() => {\n setPromotions([])\n onClear()\n restoreFilterFocus()\n }}\n />\n {/* TODO: Save view button goes here */}\n </div>\n </div>\n )\n}\n\n// A promoted filter is appended to `activeFilters`, ahead of every pending\n// chip. Sorting keyed chips by creation order keeps it in place, so its open\n// popover stays anchored under it.\nfunction inCreationOrder<T extends { filter: ActiveFilter }>(entries: T[]) {\n const keyedSlots = entries.flatMap((entry, slot) =>\n getFilterSequence(entry.filter) === undefined ? [] : [slot]\n )\n const keyedEntries = keyedSlots\n .map((slot) => entries[slot])\n .sort(\n (a, b) =>\n (getFilterSequence(a.filter) ?? 0) - (getFilterSequence(b.filter) ?? 0)\n )\n const sorted = [...entries]\n keyedSlots.forEach((slot, i) => {\n sorted[slot] = keyedEntries[i]\n })\n return sorted\n}\n\nfunction ActiveFilter({\n activeFilter,\n onChange,\n removeActiveFilter,\n pending = false,\n}: {\n activeFilter: ActiveFilter\n onChange: FilterChange\n pending?: boolean\n removeActiveFilter: () => void\n}) {\n const { relatedFilter, operator } = useRelatedFilterOperator(activeFilter)\n const activeFilterInstance =\n relatedFilter &&\n operator &&\n relatedFilter.createActiveFilterInstance(activeFilter, operator)\n\n const autoPromoted = useRef(false)\n useEffect(() => {\n if (\n !pending ||\n !activeFilterInstance?.isCompleteWithoutInput ||\n autoPromoted.current\n )\n return\n autoPromoted.current = true\n onChange({}, { complete: true })\n })\n\n if (!relatedFilter || !operator || !activeFilterInstance)\n return (\n <FilterChip\n label=\"Unrecognized filter\"\n onRemove={removeActiveFilter}\n status=\"invalid\"\n >\n <FilterChipSegments segments={[\"Unrecognized filter\"]} />\n </FilterChip>\n )\n\n const editor = activeFilterInstance.renderEditor(onChange)\n const segments = activeFilterInstance.toSegments()\n\n const isEditable = relatedFilter.operators.length > 1 || editor != null\n\n return (\n <FilterChip\n label={`${relatedFilter.label} filter${pending ? \" (pending)\" : \"\"}`}\n onRemove={removeActiveFilter}\n status={pending ? \"inactive\" : undefined}\n >\n {!isEditable ? (\n <FilterChipStaticSegments segments={segments} />\n ) : (\n <Popover defaultOpen={pending}>\n <PopoverTrigger>\n <FilterChipSegments segments={segments} />\n </PopoverTrigger>\n <PopoverContent\n className=\"tds-popover--data-table-filters-popover\"\n modal={false}\n >\n <h2 className=\"tds-data-table-filters-popover-label\">\n {relatedFilter.label}\n {relatedFilter.operators.length === 1 && (\n <span className=\"tds-data-table-filters-popover-label-operator\">\n {\" \"}\n {operator.label}\n </span>\n )}\n </h2>\n {relatedFilter.description && (\n <p className=\"tds-data-table-filters-popover-description\">\n {relatedFilter.description}\n </p>\n )}\n <OperatorSelect\n operator={operator}\n relatedFilter={relatedFilter}\n updateActiveFilter={(updates) =>\n onChange(updates, {\n complete: relatedFilter.createActiveFilterInstance(\n { ...activeFilter, ...updates },\n relatedFilter.operators.find(\n ({ name }) => name === updates.operator\n ) ?? operator\n ).isCompleteWithoutInput,\n })\n }\n />\n {editor}\n </PopoverContent>\n </Popover>\n )}\n </FilterChip>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ export interface FilterChipSegmentsProps extends Omit<ButtonElementProps, "label
|
|
|
12
12
|
* otherwise collapse into an unreadable accessible name.
|
|
13
13
|
*/
|
|
14
14
|
export declare const FilterChipSegments: React.ForwardRefExoticComponent<FilterChipSegmentsProps & React.RefAttributes<HTMLButtonElement>>;
|
|
15
|
+
/**
|
|
16
|
+
* Non-interactive segments for a chip with nothing to edit, so it doesn't
|
|
17
|
+
* expose a button that does nothing.
|
|
18
|
+
*/
|
|
19
|
+
export declare function FilterChipStaticSegments({ segments }: {
|
|
20
|
+
segments: string[];
|
|
21
|
+
}): React.JSX.Element;
|
|
15
22
|
export interface FilterChipProps {
|
|
16
23
|
children: React.ReactNode;
|
|
17
24
|
/** Accessible label for the button group. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterChip.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAK5D,OAAO,KAAqB,MAAM,OAAO,CAAA;AAwBzC,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAClD,yFAAyF;IACzF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,mGAa7B,CAAA;
|
|
1
|
+
{"version":3,"file":"FilterChip.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAK5D,OAAO,KAAqB,MAAM,OAAO,CAAA;AAwBzC,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAClD,yFAAyF;IACzF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,mGAa7B,CAAA;AAIF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,qBAQ5E;AA8BD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,gCAAgC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAA;AAOrD,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,GACP,EAAE,eAAe,qBAajB"}
|
|
@@ -35,6 +35,13 @@ function focusPreviousChip(chip) {
|
|
|
35
35
|
*/
|
|
36
36
|
const FilterChipSegments = forwardRef(({ segments, ...props }, ref) => (React__default.createElement(Button, { "aria-label": segments.join(" "), ...props, label: segments.map((segment, index) => (React__default.createElement("span", { key: index }, segment))), ref: ref, size: "sm" })));
|
|
37
37
|
FilterChipSegments.displayName = "FilterChipSegments";
|
|
38
|
+
/**
|
|
39
|
+
* Non-interactive segments for a chip with nothing to edit, so it doesn't
|
|
40
|
+
* expose a button that does nothing.
|
|
41
|
+
*/
|
|
42
|
+
function FilterChipStaticSegments({ segments }) {
|
|
43
|
+
return (React__default.createElement("span", { className: "tds-btn tds-btn--sm tds-data-table-filters-chip-static" }, segments.map((segment, index) => (React__default.createElement("span", { key: index }, segment)))));
|
|
44
|
+
}
|
|
38
45
|
function FilterChipRemove({ label, onClick }) {
|
|
39
46
|
const restoreFilterFocus = useRestoreFilterFocus();
|
|
40
47
|
const handleClick = (event) => {
|
|
@@ -56,5 +63,5 @@ function FilterChip({ children, label, onRemove, status, }) {
|
|
|
56
63
|
React__default.createElement(FilterChipRemove, { label: label, onClick: onRemove })));
|
|
57
64
|
}
|
|
58
65
|
|
|
59
|
-
export { FilterChip, FilterChipSegments };
|
|
66
|
+
export { FilterChip, FilterChipSegments, FilterChipStaticSegments };
|
|
60
67
|
//# sourceMappingURL=FilterChip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterChip.js","sources":["../../../src/components/DataTable/FilterChip.tsx"],"sourcesContent":["import type { ButtonElementProps } from \"@components/button\"\nimport { Button, IconButton } from \"@components/button\"\nimport { ButtonGroup } from \"@components/button-group\"\nimport Icon from \"@utilities/Icon\"\nimport classNames from \"classnames\"\nimport React, { forwardRef } from \"react\"\n\nimport { useRestoreFilterFocus } from \"./FilterContext\"\n\nconst CHIP_SELECTOR = \".tds-btn-group--data-table-filters-chip\"\nconst REMOVE_BUTTON_SELECTOR = '[aria-label^=\"Remove \"]'\n\n// Removing any other chip leaves the browser to focus the next chip on its\n// own — only the last chip needs this explicit handling.\nfunction isLastChip(chip: Element): boolean {\n return !chip.nextElementSibling\n}\n\nfunction focusPreviousChip(chip: Element): boolean {\n const previousButton = chip.previousElementSibling?.querySelector(\n REMOVE_BUTTON_SELECTOR\n )\n if (previousButton instanceof HTMLElement) {\n previousButton.focus()\n return true\n }\n return false\n}\n\nexport interface FilterChipSegmentsProps\n extends Omit<ButtonElementProps, \"label\" | \"size\"> {\n /** The pieces of content that make up the segment, each rendered in its own `<span>`. */\n segments: string[]\n}\n\n/**\n * The segments within a `FilterChip`.\n * Forwards its ref and props to `Button` — required for `PopoverTrigger` to work.\n * Defaults `aria-label` to the joined segments, since the adjoining `<span>`s\n * (rendered for stylistic dividers) have no separator between them and would\n * otherwise collapse into an unreadable accessible name.\n */\nexport const FilterChipSegments = forwardRef<\n HTMLButtonElement,\n FilterChipSegmentsProps\n>(({ segments, ...props }: FilterChipSegmentsProps, ref) => (\n <Button\n aria-label={segments.join(\" \")}\n {...props}\n label={segments.map((segment, index) => (\n <span key={index}>{segment}</span>\n ))}\n ref={ref}\n size=\"sm\"\n />\n))\n\nFilterChipSegments.displayName = \"FilterChipSegments\"\n\ninterface FilterChipRemoveProps {\n /** The chip's accessible label, used to distinguish this remove button from others. */\n label: string\n onClick?: () => void\n}\n\nfunction FilterChipRemove({ label, onClick }: FilterChipRemoveProps) {\n const restoreFilterFocus = useRestoreFilterFocus()\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n const chip = event.currentTarget.closest(CHIP_SELECTOR)\n if (chip && isLastChip(chip) && !focusPreviousChip(chip)) {\n restoreFilterFocus()\n }\n onClick?.()\n }\n\n return (\n <IconButton\n aria-label={`Remove ${label}`}\n disabled={!onClick}\n icon={<Icon aria-hidden symbol=\"general#x\" />}\n onClick={handleClick}\n size=\"sm\"\n />\n )\n}\n\nexport interface FilterChipProps {\n children: React.ReactNode\n /** Accessible label for the button group. */\n label: string\n /** Called when the remove button is activated. Omit to render it disabled. */\n onRemove?: () => void\n /** The status of the filter. */\n status?: FilterChipStatus\n}\n\nexport type FilterChipStatus = \"inactive\" | \"invalid\"\n\nconst FILTER_CHIP_CLASS_NAME_MAP: Record<FilterChipStatus, string> = {\n inactive: \"tds-btn-group--data-table-filters-chip-inactive\",\n invalid: \"tds-btn-group--data-table-filters-chip-invalid\",\n}\n\nexport function FilterChip({\n children,\n label,\n onRemove,\n status,\n}: FilterChipProps) {\n return (\n <ButtonGroup\n aria-label={label}\n className={classNames(\n \"tds-btn-group--data-table-filters-chip\",\n status && FILTER_CHIP_CLASS_NAME_MAP[status]\n )}\n >\n {children}\n <FilterChipRemove label={label} onClick={onRemove} />\n </ButtonGroup>\n )\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;AASA,MAAM,aAAa,GAAG,yCAAyC;AAC/D,MAAM,sBAAsB,GAAG,yBAAyB;AAExD;AACA;AACA,SAAS,UAAU,CAAC,IAAa,EAAA;AAC/B,IAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB;AACjC;AAEA,SAAS,iBAAiB,CAAC,IAAa,EAAA;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAC/D,sBAAsB,CACvB;AACD,IAAA,IAAI,cAAc,YAAY,WAAW,EAAE;QACzC,cAAc,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK;AACd;AAQA;;;;;;AAMG;AACI,MAAM,kBAAkB,GAAG,UAAU,CAG1C,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA2B,EAAE,GAAG,MACrDA,cAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAA,YAAA,EACO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAA,GAC1B,KAAK,EACT,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,MACjCA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,GAAG,EAAE,KAAK,EAAA,EAAG,OAAO,CAAQ,CACnC,CAAC,EACF,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,IAAI,EAAA,CACT,CACH;AAED,kBAAkB,CAAC,WAAW,GAAG,oBAAoB;
|
|
1
|
+
{"version":3,"file":"FilterChip.js","sources":["../../../src/components/DataTable/FilterChip.tsx"],"sourcesContent":["import type { ButtonElementProps } from \"@components/button\"\nimport { Button, IconButton } from \"@components/button\"\nimport { ButtonGroup } from \"@components/button-group\"\nimport Icon from \"@utilities/Icon\"\nimport classNames from \"classnames\"\nimport React, { forwardRef } from \"react\"\n\nimport { useRestoreFilterFocus } from \"./FilterContext\"\n\nconst CHIP_SELECTOR = \".tds-btn-group--data-table-filters-chip\"\nconst REMOVE_BUTTON_SELECTOR = '[aria-label^=\"Remove \"]'\n\n// Removing any other chip leaves the browser to focus the next chip on its\n// own — only the last chip needs this explicit handling.\nfunction isLastChip(chip: Element): boolean {\n return !chip.nextElementSibling\n}\n\nfunction focusPreviousChip(chip: Element): boolean {\n const previousButton = chip.previousElementSibling?.querySelector(\n REMOVE_BUTTON_SELECTOR\n )\n if (previousButton instanceof HTMLElement) {\n previousButton.focus()\n return true\n }\n return false\n}\n\nexport interface FilterChipSegmentsProps\n extends Omit<ButtonElementProps, \"label\" | \"size\"> {\n /** The pieces of content that make up the segment, each rendered in its own `<span>`. */\n segments: string[]\n}\n\n/**\n * The segments within a `FilterChip`.\n * Forwards its ref and props to `Button` — required for `PopoverTrigger` to work.\n * Defaults `aria-label` to the joined segments, since the adjoining `<span>`s\n * (rendered for stylistic dividers) have no separator between them and would\n * otherwise collapse into an unreadable accessible name.\n */\nexport const FilterChipSegments = forwardRef<\n HTMLButtonElement,\n FilterChipSegmentsProps\n>(({ segments, ...props }: FilterChipSegmentsProps, ref) => (\n <Button\n aria-label={segments.join(\" \")}\n {...props}\n label={segments.map((segment, index) => (\n <span key={index}>{segment}</span>\n ))}\n ref={ref}\n size=\"sm\"\n />\n))\n\nFilterChipSegments.displayName = \"FilterChipSegments\"\n\n/**\n * Non-interactive segments for a chip with nothing to edit, so it doesn't\n * expose a button that does nothing.\n */\nexport function FilterChipStaticSegments({ segments }: { segments: string[] }) {\n return (\n <span className=\"tds-btn tds-btn--sm tds-data-table-filters-chip-static\">\n {segments.map((segment, index) => (\n <span key={index}>{segment}</span>\n ))}\n </span>\n )\n}\n\ninterface FilterChipRemoveProps {\n /** The chip's accessible label, used to distinguish this remove button from others. */\n label: string\n onClick?: () => void\n}\n\nfunction FilterChipRemove({ label, onClick }: FilterChipRemoveProps) {\n const restoreFilterFocus = useRestoreFilterFocus()\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n const chip = event.currentTarget.closest(CHIP_SELECTOR)\n if (chip && isLastChip(chip) && !focusPreviousChip(chip)) {\n restoreFilterFocus()\n }\n onClick?.()\n }\n\n return (\n <IconButton\n aria-label={`Remove ${label}`}\n disabled={!onClick}\n icon={<Icon aria-hidden symbol=\"general#x\" />}\n onClick={handleClick}\n size=\"sm\"\n />\n )\n}\n\nexport interface FilterChipProps {\n children: React.ReactNode\n /** Accessible label for the button group. */\n label: string\n /** Called when the remove button is activated. Omit to render it disabled. */\n onRemove?: () => void\n /** The status of the filter. */\n status?: FilterChipStatus\n}\n\nexport type FilterChipStatus = \"inactive\" | \"invalid\"\n\nconst FILTER_CHIP_CLASS_NAME_MAP: Record<FilterChipStatus, string> = {\n inactive: \"tds-btn-group--data-table-filters-chip-inactive\",\n invalid: \"tds-btn-group--data-table-filters-chip-invalid\",\n}\n\nexport function FilterChip({\n children,\n label,\n onRemove,\n status,\n}: FilterChipProps) {\n return (\n <ButtonGroup\n aria-label={label}\n className={classNames(\n \"tds-btn-group--data-table-filters-chip\",\n status && FILTER_CHIP_CLASS_NAME_MAP[status]\n )}\n >\n {children}\n <FilterChipRemove label={label} onClick={onRemove} />\n </ButtonGroup>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ export { collectionFilter } from "./collectionFilter";
|
|
|
2
2
|
export { dateFilter } from "./dateFilter";
|
|
3
3
|
export { dayFilter } from "./dayFilter";
|
|
4
4
|
export { numberFilter } from "./numberFilter";
|
|
5
|
+
export { presenceFilter } from "./presenceFilter";
|
|
5
6
|
export { scopedFilter } from "./scopedFilter";
|
|
6
7
|
export { textFilter } from "./textFilter";
|
|
7
8
|
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -6,5 +6,6 @@ export type { BooleanColumn, CurrencyColumn, CustomColumn, DataTableColumn, Data
|
|
|
6
6
|
export * from "./filters";
|
|
7
7
|
export type { ActiveFilter, FilterItemConfig, FilterNode, FilterNodeGroup, FilterNodeItem, FilterNodeScoped, Operator, } from "./FilterTypes";
|
|
8
8
|
export type { NumberFilterValue } from "./numberFilter";
|
|
9
|
+
export type { PresenceFilterConfig } from "./presenceFilter";
|
|
9
10
|
export type { ScopedFilterConfig, ScopedFilterOptions } from "./scopedFilter";
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AACpB,OAAO,eAAe,CAAA;AAEtB,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,mBAAmB,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,QAAQ,GACT,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AACpB,OAAO,eAAe,CAAA;AAEtB,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,mBAAmB,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,QAAQ,GACT,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FilterItemConfig, FilterNodeItem } from "./FilterTypes";
|
|
2
|
+
export type PresenceFilterConfig = Omit<FilterItemConfig, "excludes" | "includes"> & {
|
|
3
|
+
/** Adds a `not_present` operator, labeling its chip and option. */
|
|
4
|
+
negatedLabel?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function presenceFilter({ label, negatedLabel, ...config }: PresenceFilterConfig): FilterNodeItem;
|
|
7
|
+
//# sourceMappingURL=presenceFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceFilter.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/presenceFilter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAY,MAAM,eAAe,CAAA;AAE/E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,gBAAgB,EAChB,UAAU,GAAG,UAAU,CACxB,GAAG;IACF,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,YAAY,EACZ,GAAG,MAAM,EACV,EAAE,oBAAoB,GAAG,cAAc,CAkBvC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ActiveFilterInstance } from './ActiveFilterInstance.js';
|
|
2
|
+
|
|
3
|
+
function presenceFilter({ label, negatedLabel, ...config }) {
|
|
4
|
+
const operators = [
|
|
5
|
+
{ inputType: { type: "presence" }, label, name: "present" },
|
|
6
|
+
];
|
|
7
|
+
if (negatedLabel)
|
|
8
|
+
operators.push({
|
|
9
|
+
inputType: { type: "presence" },
|
|
10
|
+
label: negatedLabel,
|
|
11
|
+
name: "not_present",
|
|
12
|
+
});
|
|
13
|
+
const filter = {
|
|
14
|
+
...config,
|
|
15
|
+
createActiveFilterInstance: (_activeFilter, operator) => new PresenceActiveFilter(filter, operator, undefined),
|
|
16
|
+
label,
|
|
17
|
+
operators,
|
|
18
|
+
};
|
|
19
|
+
return filter;
|
|
20
|
+
}
|
|
21
|
+
class PresenceActiveFilter extends ActiveFilterInstance {
|
|
22
|
+
get isCompleteWithoutInput() {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
toSegments() {
|
|
26
|
+
return [this.operator.label];
|
|
27
|
+
}
|
|
28
|
+
formatValue() {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
renderEditor() {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { presenceFilter };
|
|
37
|
+
//# sourceMappingURL=presenceFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceFilter.js","sources":["../../../src/components/DataTable/presenceFilter.tsx"],"sourcesContent":["import { ActiveFilterInstance } from \"./ActiveFilterInstance\"\nimport type { FilterItemConfig, FilterNodeItem, Operator } from \"./FilterTypes\"\n\nexport type PresenceFilterConfig = Omit<\n FilterItemConfig,\n \"excludes\" | \"includes\"\n> & {\n /** Adds a `not_present` operator, labeling its chip and option. */\n negatedLabel?: string\n}\n\nexport function presenceFilter({\n label,\n negatedLabel,\n ...config\n}: PresenceFilterConfig): FilterNodeItem {\n const operators: Operator[] = [\n { inputType: { type: \"presence\" }, label, name: \"present\" },\n ]\n if (negatedLabel)\n operators.push({\n inputType: { type: \"presence\" },\n label: negatedLabel,\n name: \"not_present\",\n })\n const filter: FilterNodeItem = {\n ...config,\n createActiveFilterInstance: (_activeFilter, operator) =>\n new PresenceActiveFilter(filter, operator, undefined),\n label,\n operators,\n }\n return filter\n}\n\nclass PresenceActiveFilter extends ActiveFilterInstance<undefined> {\n get isCompleteWithoutInput() {\n return true\n }\n\n toSegments() {\n return [this.operator.label]\n }\n\n formatValue() {\n return []\n }\n\n renderEditor() {\n return null\n }\n}\n"],"names":[],"mappings":";;AAWM,SAAU,cAAc,CAAC,EAC7B,KAAK,EACL,YAAY,EACZ,GAAG,MAAM,EACY,EAAA;AACrB,IAAA,MAAM,SAAS,GAAe;AAC5B,QAAA,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;KAC5D;AACD,IAAA,IAAI,YAAY;QACd,SAAS,CAAC,IAAI,CAAC;AACb,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;AAC/B,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,IAAI,EAAE,aAAa;AACpB,SAAA,CAAC;AACJ,IAAA,MAAM,MAAM,GAAmB;AAC7B,QAAA,GAAG,MAAM;AACT,QAAA,0BAA0B,EAAE,CAAC,aAAa,EAAE,QAAQ,KAClD,IAAI,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;QACvD,KAAK;QACL,SAAS;KACV;AACD,IAAA,OAAO,MAAM;AACf;AAEA,MAAM,oBAAqB,SAAQ,oBAA+B,CAAA;AAChE,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI;IACb;IAEA,UAAU,GAAA;AACR,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC9B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,EAAE;IACX;IAEA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI;IACb;AACD;;;;"}
|