@crisp-ui-kit/crisp 0.57.3 → 0.57.4
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/assigneepicker.css +13 -0
- package/dist/assigneepicker.d.ts +7 -0
- package/dist/assigneepicker.layered.css +15 -0
- package/dist/button.css +1 -1
- package/dist/button.layered.css +1 -1
- package/dist/cjs/components/button/button.recipe.js +15 -10
- package/dist/cjs/components/datatable/datatable.js +6 -3
- package/dist/cjs/components/datatable/datatable.recipe.js +35 -2
- package/dist/cjs/components/menu/menu.js +48 -8
- package/dist/cjs/components/multiselect/multiselect.js +3 -0
- package/dist/cjs/components/multiselect/multiselect.recipe.js +18 -0
- package/dist/cjs/components/select/select.js +2 -2
- package/dist/cjs/components/select/select.recipe.js +19 -0
- package/dist/cjs/core/index.js +2 -1
- package/dist/cjs/core/place-floating.js +38 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/product/assigneepicker/assigneepicker.js +127 -0
- package/dist/cjs/product/assigneepicker/assigneepicker.recipe.js +36 -0
- package/dist/cjs/product/assigneepicker/index.js +7 -0
- package/dist/cjs/product/notesgallery/index.js +7 -0
- package/dist/cjs/product/notesgallery/notesgallery.js +80 -0
- package/dist/cjs/product/notesgallery/notesgallery.recipe.js +46 -0
- package/dist/cjs/product/objectpagemenu/index.js +17 -0
- package/dist/cjs/product/objectpagemenu/objectpagemenu.js +26 -0
- package/dist/cjs/product/objectpagemenu/objectpagemenu.recipe.js +30 -0
- package/dist/cjs/product/objectsettings/objectsettings.js +107 -14
- package/dist/cjs/product/recordpage/recordpage.js +64 -5
- package/dist/cjs/product/recordpage/recordpage.recipe.js +38 -0
- package/dist/cjs/product/recordpicker/index.js +7 -0
- package/dist/cjs/product/recordpicker/recordpicker.js +100 -0
- package/dist/cjs/product/recordpicker/recordpicker.recipe.js +36 -0
- package/dist/cjs/product/savedviews/index.js +2 -1
- package/dist/cjs/product/savedviews/savedviews.js +22 -0
- package/dist/cjs/product/savedviews/savedviews.recipe.js +47 -0
- package/dist/cjs/product/share/index.js +7 -0
- package/dist/cjs/product/share/share.js +179 -0
- package/dist/cjs/product/share/share.recipe.js +114 -0
- package/dist/cjs/product/shortcutssheet/index.js +17 -0
- package/dist/cjs/product/shortcutssheet/shortcutssheet.js +125 -0
- package/dist/cjs/product/shortcutssheet/shortcutssheet.recipe.js +50 -0
- package/dist/cjs/product/taskeditpopover/index.js +7 -0
- package/dist/cjs/product/taskeditpopover/taskeditpopover.js +159 -0
- package/dist/cjs/product/taskeditpopover/taskeditpopover.recipe.js +68 -0
- package/dist/cjs/product/workspaceswitchermenu/index.js +17 -0
- package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.js +38 -0
- package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +34 -0
- package/dist/cjs/tokens/palette.js +27 -0
- package/dist/cjs/tokens/semantic.js +20 -0
- package/dist/datatable.css +40 -7
- package/dist/datatable.layered.css +40 -7
- package/dist/esm/components/button/button.recipe.js +15 -10
- package/dist/esm/components/datatable/datatable.js +6 -3
- package/dist/esm/components/datatable/datatable.recipe.js +35 -2
- package/dist/esm/components/menu/menu.js +47 -7
- package/dist/esm/components/multiselect/multiselect.js +3 -0
- package/dist/esm/components/multiselect/multiselect.recipe.js +18 -0
- package/dist/esm/components/select/select.js +2 -2
- package/dist/esm/components/select/select.recipe.js +19 -0
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/place-floating.js +37 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/product/assigneepicker/assigneepicker.js +91 -0
- package/dist/esm/product/assigneepicker/assigneepicker.recipe.js +33 -0
- package/dist/esm/product/assigneepicker/index.js +2 -0
- package/dist/esm/product/notesgallery/index.js +2 -0
- package/dist/esm/product/notesgallery/notesgallery.js +44 -0
- package/dist/esm/product/notesgallery/notesgallery.recipe.js +43 -0
- package/dist/esm/product/objectpagemenu/index.js +1 -0
- package/dist/esm/product/objectpagemenu/objectpagemenu.js +23 -0
- package/dist/esm/product/objectpagemenu/objectpagemenu.recipe.js +27 -0
- package/dist/esm/product/objectsettings/objectsettings.js +106 -13
- package/dist/esm/product/recordpage/recordpage.js +64 -5
- package/dist/esm/product/recordpage/recordpage.recipe.js +38 -0
- package/dist/esm/product/recordpicker/index.js +2 -0
- package/dist/esm/product/recordpicker/recordpicker.js +64 -0
- package/dist/esm/product/recordpicker/recordpicker.recipe.js +33 -0
- package/dist/esm/product/savedviews/index.js +1 -1
- package/dist/esm/product/savedviews/savedviews.js +22 -1
- package/dist/esm/product/savedviews/savedviews.recipe.js +47 -0
- package/dist/esm/product/share/index.js +2 -0
- package/dist/esm/product/share/share.js +143 -0
- package/dist/esm/product/share/share.recipe.js +111 -0
- package/dist/esm/product/shortcutssheet/index.js +1 -0
- package/dist/esm/product/shortcutssheet/shortcutssheet.js +88 -0
- package/dist/esm/product/shortcutssheet/shortcutssheet.recipe.js +47 -0
- package/dist/esm/product/taskeditpopover/index.js +2 -0
- package/dist/esm/product/taskeditpopover/taskeditpopover.js +123 -0
- package/dist/esm/product/taskeditpopover/taskeditpopover.recipe.js +65 -0
- package/dist/esm/product/workspaceswitchermenu/index.js +1 -0
- package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.js +35 -0
- package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +31 -0
- package/dist/esm/tokens/palette.js +27 -0
- package/dist/esm/tokens/semantic.js +20 -0
- package/dist/multiselect.css +18 -0
- package/dist/multiselect.layered.css +18 -0
- package/dist/native/tokens.d.ts +1 -1
- package/dist/native/tokens.js +56 -4
- package/dist/notesgallery.css +15 -0
- package/dist/notesgallery.d.ts +7 -0
- package/dist/notesgallery.layered.css +17 -0
- package/dist/objectpagemenu.css +3 -0
- package/dist/objectpagemenu.d.ts +7 -0
- package/dist/objectpagemenu.layered.css +5 -0
- package/dist/recordpage.css +36 -0
- package/dist/recordpage.layered.css +36 -0
- package/dist/recordpicker.css +13 -0
- package/dist/recordpicker.d.ts +7 -0
- package/dist/recordpicker.layered.css +15 -0
- package/dist/savedviews.css +47 -0
- package/dist/savedviews.layered.css +47 -0
- package/dist/select.css +19 -0
- package/dist/select.layered.css +19 -0
- package/dist/share.css +84 -0
- package/dist/share.d.ts +7 -0
- package/dist/share.layered.css +86 -0
- package/dist/shortcutssheet.css +24 -0
- package/dist/shortcutssheet.d.ts +7 -0
- package/dist/shortcutssheet.layered.css +26 -0
- package/dist/styles.css +387 -8
- package/dist/styles.layered.css +387 -8
- package/dist/taskeditpopover.css +36 -0
- package/dist/taskeditpopover.d.ts +7 -0
- package/dist/taskeditpopover.layered.css +38 -0
- package/dist/tokens.css +26 -0
- package/dist/tokens.json +56 -4
- package/dist/types/components/button/button.recipe.d.ts +2 -3
- package/dist/types/components/datatable/datatable.d.ts +8 -0
- package/dist/types/components/menu/menu.d.ts +50 -7
- package/dist/types/components/multiselect/multiselect.d.ts +9 -0
- package/dist/types/components/select/select.d.ts +10 -0
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/place-floating.d.ts +37 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/product/assigneepicker/assigneepicker.d.ts +36 -0
- package/dist/types/product/assigneepicker/assigneepicker.recipe.d.ts +3 -0
- package/dist/types/product/assigneepicker/index.d.ts +2 -0
- package/dist/types/product/notesgallery/index.d.ts +2 -0
- package/dist/types/product/notesgallery/notesgallery.d.ts +54 -0
- package/dist/types/product/notesgallery/notesgallery.recipe.d.ts +3 -0
- package/dist/types/product/objectpagemenu/index.d.ts +1 -0
- package/dist/types/product/objectpagemenu/objectpagemenu.d.ts +40 -0
- package/dist/types/product/objectpagemenu/objectpagemenu.recipe.d.ts +17 -0
- package/dist/types/product/objectsettings/objectsettings.d.ts +71 -15
- package/dist/types/product/recordpage/index.d.ts +1 -1
- package/dist/types/product/recordpage/recordpage.d.ts +96 -1
- package/dist/types/product/recordpicker/index.d.ts +2 -0
- package/dist/types/product/recordpicker/recordpicker.d.ts +38 -0
- package/dist/types/product/recordpicker/recordpicker.recipe.d.ts +3 -0
- package/dist/types/product/savedviews/index.d.ts +1 -1
- package/dist/types/product/savedviews/savedviews.d.ts +36 -0
- package/dist/types/product/share/index.d.ts +2 -0
- package/dist/types/product/share/share.d.ts +85 -0
- package/dist/types/product/share/share.recipe.d.ts +3 -0
- package/dist/types/product/shortcutssheet/index.d.ts +1 -0
- package/dist/types/product/shortcutssheet/shortcutssheet.d.ts +49 -0
- package/dist/types/product/shortcutssheet/shortcutssheet.recipe.d.ts +3 -0
- package/dist/types/product/taskeditpopover/index.d.ts +2 -0
- package/dist/types/product/taskeditpopover/taskeditpopover.d.ts +67 -0
- package/dist/types/product/taskeditpopover/taskeditpopover.recipe.d.ts +3 -0
- package/dist/types/product/workspaceswitchermenu/index.d.ts +1 -0
- package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.d.ts +54 -0
- package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.recipe.d.ts +19 -0
- package/dist/types/tokens/contract.d.ts +13 -0
- package/dist/types/tokens/palette.d.ts +52 -0
- package/dist/types/tokens/semantic.d.ts +20 -0
- package/dist/workspaceswitchermenu.css +4 -0
- package/dist/workspaceswitchermenu.d.ts +7 -0
- package/dist/workspaceswitchermenu.layered.css +6 -0
- package/package.json +41 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
import type { SelectOption } from "../../components/select";
|
|
2
3
|
export type ObjectSummary = {
|
|
3
4
|
id: string;
|
|
4
5
|
name: React.ReactNode;
|
|
@@ -127,6 +128,9 @@ export type AttributeRow = {
|
|
|
127
128
|
dataType: React.ReactNode;
|
|
128
129
|
/** e.g. "Unique" — rendered as a plain constraint label per row. */
|
|
129
130
|
constraint?: React.ReactNode;
|
|
131
|
+
/** The attribute's own slug (crisp#673, G-107) — "Copy slug" needs
|
|
132
|
+
* something to copy; omit on a row with no slug of its own yet. */
|
|
133
|
+
slug?: string;
|
|
130
134
|
system?: boolean;
|
|
131
135
|
enriched?: boolean;
|
|
132
136
|
};
|
|
@@ -134,6 +138,21 @@ export type AttributesTableProps = {
|
|
|
134
138
|
attributes: AttributeRow[];
|
|
135
139
|
onOpenAttribute?: (id: string) => void;
|
|
136
140
|
onEditAttribute?: (id: string) => void;
|
|
141
|
+
/** crisp#673, G-107. */
|
|
142
|
+
onDuplicateAttribute?: (id: string) => void;
|
|
143
|
+
/** Defaults to a real `navigator.clipboard.writeText(id)` when omitted —
|
|
144
|
+
* the same default-with-override shape `CommentsPanel`'s `onCopyLink`
|
|
145
|
+
* already has, so a consumer only needs this to know when it happened
|
|
146
|
+
* (a toast, analytics), not to implement the copy itself. */
|
|
147
|
+
onCopyId?: (id: string) => void;
|
|
148
|
+
/** Same default-clipboard-write shape as `onCopyId`, over the row's own
|
|
149
|
+
* `slug`. A row with no `slug` renders the item disabled rather than
|
|
150
|
+
* copying an empty string. */
|
|
151
|
+
onCopySlug?: (slug: string) => void;
|
|
152
|
+
/** Opens Attio's own rename-slug flow — crisp models no slug-editing UI
|
|
153
|
+
* of its own (out of scope, same reasoning as the plan-gated notices
|
|
154
|
+
* elsewhere), just the entry point into it. */
|
|
155
|
+
onChangeSlug?: (id: string) => void;
|
|
137
156
|
onArchiveAttribute?: (id: string) => void;
|
|
138
157
|
onReorder?: (rows: AttributeRow[]) => void;
|
|
139
158
|
onCreateAttribute?: () => void;
|
|
@@ -149,14 +168,20 @@ export type AttributesTableProps = {
|
|
|
149
168
|
systemLabel?: string;
|
|
150
169
|
enrichedLabel?: string;
|
|
151
170
|
editLabel?: string;
|
|
171
|
+
duplicateLabel?: string;
|
|
172
|
+
copyIdLabel?: string;
|
|
173
|
+
copySlugLabel?: string;
|
|
174
|
+
changeSlugLabel?: string;
|
|
152
175
|
archiveLabel?: string;
|
|
153
176
|
/** Overrides the row "…" menu entirely — return the `MenuItem`s a
|
|
154
|
-
* consumer's own actions need (crisp#660). Attio's own row menu
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
177
|
+
* consumer's own actions need (crisp#660). Attio's own row menu (crisp#673,
|
|
178
|
+
* G-107, corrects this comment's former "Edit/Archive" claim — the real
|
|
179
|
+
* menu has six items) is Edit attribute/Duplicate attribute/Copy ID/Copy
|
|
180
|
+
* slug/Change slug/Archive attribute (the default, unchanged when this is
|
|
181
|
+
* omitted); a consumer whose data isn't Attio's own attribute model (no
|
|
182
|
+
* "archive"/"slug" concept, a different action set entirely) supplies its
|
|
183
|
+
* own instead of working around six fixed items that don't fit. Receives
|
|
184
|
+
* the row so an item's handler can close over its id. */
|
|
160
185
|
rowActions?: (row: AttributeRow) => React.ReactNode;
|
|
161
186
|
emptyLabel?: React.ReactNode;
|
|
162
187
|
};
|
|
@@ -169,7 +194,7 @@ export type AttributesTableProps = {
|
|
|
169
194
|
* measures 40px here — a real, small divergence left to DataTable's owner
|
|
170
195
|
* rather than patched locally (see the PR).
|
|
171
196
|
*/
|
|
172
|
-
export declare function AttributesTable({ attributes, onOpenAttribute, onEditAttribute, onArchiveAttribute, onReorder, onCreateAttribute, title: titleProp, subtitle: subtitleProp, createLabel: createLabelProp, searchPlaceholder: searchPlaceholderProp, filterLabel: filterLabelProp, nameColumnLabel: nameColumnLabelProp, dataTypeColumnLabel: dataTypeColumnLabelProp, constraintsColumnLabel: constraintsColumnLabelProp, propertiesColumnLabel: propertiesColumnLabelProp, systemLabel: systemLabelProp, enrichedLabel: enrichedLabelProp, editLabel: editLabelProp, archiveLabel: archiveLabelProp, rowActions, emptyLabel, }: AttributesTableProps): React.JSX.Element;
|
|
197
|
+
export declare function AttributesTable({ attributes, onOpenAttribute, onEditAttribute, onDuplicateAttribute, onCopyId, onCopySlug, onChangeSlug, onArchiveAttribute, onReorder, onCreateAttribute, title: titleProp, subtitle: subtitleProp, createLabel: createLabelProp, searchPlaceholder: searchPlaceholderProp, filterLabel: filterLabelProp, nameColumnLabel: nameColumnLabelProp, dataTypeColumnLabel: dataTypeColumnLabelProp, constraintsColumnLabel: constraintsColumnLabelProp, propertiesColumnLabel: propertiesColumnLabelProp, systemLabel: systemLabelProp, enrichedLabel: enrichedLabelProp, editLabel: editLabelProp, duplicateLabel: duplicateLabelProp, copyIdLabel: copyIdLabelProp, copySlugLabel: copySlugLabelProp, changeSlugLabel: changeSlugLabelProp, archiveLabel: archiveLabelProp, rowActions, emptyLabel, }: AttributesTableProps): React.JSX.Element;
|
|
173
198
|
export declare namespace AttributesTable {
|
|
174
199
|
var displayName: string;
|
|
175
200
|
}
|
|
@@ -212,6 +237,9 @@ export declare function AttributeTypeSelect({ value, onValueChange, options, aiA
|
|
|
212
237
|
export declare namespace AttributeTypeSelect {
|
|
213
238
|
var displayName: string;
|
|
214
239
|
}
|
|
240
|
+
export declare const CURRENCY_DISPLAY_OPTIONS: SelectOption[];
|
|
241
|
+
export declare const CURRENCY_DECIMAL_PLACES_OPTIONS: SelectOption[];
|
|
242
|
+
export declare const CURRENCY_GROUPING_OPTIONS: SelectOption[];
|
|
215
243
|
export type CreateAttributeDialogProps = {
|
|
216
244
|
type: string;
|
|
217
245
|
onTypeChange: (value: string) => void;
|
|
@@ -221,6 +249,27 @@ export type CreateAttributeDialogProps = {
|
|
|
221
249
|
onNameChange: (value: string) => void;
|
|
222
250
|
description: string;
|
|
223
251
|
onDescriptionChange: (value: string) => void;
|
|
252
|
+
/** Currency's own extra fields (shown only while `type === "currency"`).
|
|
253
|
+
* See `CURRENCY_DISPLAY_OPTIONS`/`CURRENCY_DECIMAL_PLACES_OPTIONS`/
|
|
254
|
+
* `CURRENCY_GROUPING_OPTIONS` for the (small, fixed) defaults; there is
|
|
255
|
+
* no default `currencyOptions` — a real currency list is the consumer's
|
|
256
|
+
* own reference data. */
|
|
257
|
+
currency?: string;
|
|
258
|
+
onCurrencyChange?: (value: string) => void;
|
|
259
|
+
currencyOptions?: SelectOption[];
|
|
260
|
+
display?: string;
|
|
261
|
+
onDisplayChange?: (value: string) => void;
|
|
262
|
+
displayOptions?: SelectOption[];
|
|
263
|
+
decimalPlaces?: string;
|
|
264
|
+
onDecimalPlacesChange?: (value: string) => void;
|
|
265
|
+
decimalPlacesOptions?: SelectOption[];
|
|
266
|
+
grouping?: string;
|
|
267
|
+
onGroupingChange?: (value: string) => void;
|
|
268
|
+
groupingOptions?: SelectOption[];
|
|
269
|
+
currencyFieldLabel?: string;
|
|
270
|
+
displayFieldLabel?: string;
|
|
271
|
+
decimalPlacesFieldLabel?: string;
|
|
272
|
+
groupingFieldLabel?: string;
|
|
224
273
|
aiAutofillEnabled?: boolean;
|
|
225
274
|
onAiAutofillChange?: (enabled: boolean) => void;
|
|
226
275
|
onSubmit: () => void;
|
|
@@ -237,15 +286,22 @@ export type CreateAttributeDialogProps = {
|
|
|
237
286
|
createLabel?: string;
|
|
238
287
|
};
|
|
239
288
|
/**
|
|
240
|
-
* "Create attribute" (crisp#637, P-125, verified live): Attribute Type
|
|
241
|
-
* select (defaults to Text
|
|
242
|
-
* +
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
289
|
+
* "Create attribute" (crisp#637/#673, P-125, verified live): Attribute Type
|
|
290
|
+
* select (defaults to Text, type-ahead search built in via `Select`'s own
|
|
291
|
+
* `searchable`) + Name (autofocused on open, and again after picking a type
|
|
292
|
+
* — G-106) + Description (optional) + Currency's own four extra required
|
|
293
|
+
* fields when `type === "currency"` (G-104) + an AI-autofill switch row,
|
|
294
|
+
* footer Cancel/Create. Built on `FormDialog` in its plain (non-`createMode`)
|
|
295
|
+
* shape — Attio's own footer here has a real Cancel button, unlike the
|
|
296
|
+
* record-create dialog `createMode` models (crisp#548), so `createMode`
|
|
297
|
+
* would be the wrong fit even though the button carries the same ⌘↵ hint;
|
|
298
|
+
* that hint is rendered locally instead. The outside-click/Escape
|
|
299
|
+
* "Discard changes" confirm gated on dirty state (G-105) needed no work
|
|
300
|
+
* here at all — `FormDialog` already tracks dirtiness generically and shows
|
|
301
|
+
* it, so this dialog inherited it for free; `CreateAttributeDialog`'s own
|
|
302
|
+
* tests below just pin the behaviour to this component specifically.
|
|
247
303
|
*/
|
|
248
|
-
export declare function CreateAttributeDialog({ type, onTypeChange, typeOptions, aiAutofillTypeOptions, name, onNameChange, description, onDescriptionChange, aiAutofillEnabled, onAiAutofillChange, onSubmit, onClose, busy, error, title: titleProp, attributeTypeLabel: attributeTypeLabelProp, nameLabel: nameLabelProp, descriptionLabel: descriptionLabelProp, descriptionPlaceholder: descriptionPlaceholderProp, aiAutofillLabel: aiAutofillLabelProp, setUpAiAutofillLabel: setUpAiAutofillLabelProp, createLabel: createLabelProp, }: CreateAttributeDialogProps): React.JSX.Element;
|
|
304
|
+
export declare function CreateAttributeDialog({ type, onTypeChange, typeOptions, aiAutofillTypeOptions, name, onNameChange, description, onDescriptionChange, currency, onCurrencyChange, currencyOptions, display, onDisplayChange, displayOptions, decimalPlaces, onDecimalPlacesChange, decimalPlacesOptions, grouping, onGroupingChange, groupingOptions, currencyFieldLabel: currencyFieldLabelProp, displayFieldLabel: displayFieldLabelProp, decimalPlacesFieldLabel: decimalPlacesFieldLabelProp, groupingFieldLabel: groupingFieldLabelProp, aiAutofillEnabled, onAiAutofillChange, onSubmit, onClose, busy, error, title: titleProp, attributeTypeLabel: attributeTypeLabelProp, nameLabel: nameLabelProp, descriptionLabel: descriptionLabelProp, descriptionPlaceholder: descriptionPlaceholderProp, aiAutofillLabel: aiAutofillLabelProp, setUpAiAutofillLabel: setUpAiAutofillLabelProp, createLabel: createLabelProp, }: CreateAttributeDialogProps): React.JSX.Element;
|
|
249
305
|
export declare namespace CreateAttributeDialog {
|
|
250
306
|
var displayName: string;
|
|
251
307
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { type Column, type ColumnType, type EntityValue, type ReferenceOption, type Row, type StatusOption, tagTone, } from "./column";
|
|
2
2
|
export { type EditableOption, editableInputType, useEditableField, } from "./editable-field";
|
|
3
|
-
export { RecordDetails, type RecordDetailsProps, RecordPage, type RecordPageHighlight, type RecordPageLabels, type RecordPageLabelsInput, RecordPageMain, type RecordPageMainProps, type RecordPageNote, type RecordPageProps, type RecordPageSection, type RecordPageTab, type RecordPageTask, recordPageLabels, } from "./recordpage";
|
|
3
|
+
export { RecordDetails, type RecordDetailsProps, RecordPage, type RecordPageHighlight, type RecordPageLabels, type RecordPageLabelsInput, RecordPageMain, type RecordPageMainProps, type RecordPageMenuAction, type RecordPageNote, type RecordPageProps, type RecordPageSection, type RecordPageTab, type RecordPageTask, recordPageLabels, } from "./recordpage";
|
|
4
4
|
export { recordpageRecipe } from "./recordpage.recipe";
|
|
@@ -78,6 +78,22 @@ export type RecordPageQuickAction = {
|
|
|
78
78
|
icon: LucideIcon;
|
|
79
79
|
onSelect?: () => void;
|
|
80
80
|
};
|
|
81
|
+
/**
|
|
82
|
+
* One consumer-supplied item in the "…" record-actions menu (crisp#1012) —
|
|
83
|
+
* appended after Attio's own fixed group (Merge records/Configure page/Copy
|
|
84
|
+
* page URL/Copy record ID, Add to favorites), before Delete. Own group,
|
|
85
|
+
* separator-delimited on both sides, never merged into Attio's own items —
|
|
86
|
+
* the same "caller's own list, not a merge" choice `tabs` (#379) and
|
|
87
|
+
* `highlights` (#528) already make.
|
|
88
|
+
*/
|
|
89
|
+
export type RecordPageMenuAction = {
|
|
90
|
+
label: string;
|
|
91
|
+
icon: LucideIcon;
|
|
92
|
+
onSelect: () => void;
|
|
93
|
+
/** Red text/icon, `MenuItem`'s own `danger` — for a destructive action
|
|
94
|
+
* that isn't Delete itself (Delete has its own dedicated `onDelete`). */
|
|
95
|
+
danger?: boolean;
|
|
96
|
+
};
|
|
81
97
|
export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
|
|
82
98
|
record: Row;
|
|
83
99
|
columns: Column[];
|
|
@@ -196,6 +212,74 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
|
|
|
196
212
|
* convention) — Attio's own Share opens a dialog crisp has no measured
|
|
197
213
|
* content for; only the entry point is in scope here (#864). */
|
|
198
214
|
onShare?: () => void;
|
|
215
|
+
/**
|
|
216
|
+
* crisp#1012: the header entity's `Avatar` `shape` — defaults to
|
|
217
|
+
* `"rounded"` (Attio's own CRM entities), matching `DataTable`'s own
|
|
218
|
+
* `avatarShape` prop (#892) exactly, for a consumer whose record type
|
|
219
|
+
* reads as a person (GRC's Employee, `"circle"`) rather than a company/
|
|
220
|
+
* generic entity.
|
|
221
|
+
*/
|
|
222
|
+
avatarShape?: "rounded" | "circle";
|
|
223
|
+
/**
|
|
224
|
+
* crisp#1012: wires the entity header's Pencil "edit record" button,
|
|
225
|
+
* which drew with no `onClick` at all before this. The button itself
|
|
226
|
+
* still always renders (same as Merge/Configure page/Copy page URL/Copy
|
|
227
|
+
* record ID below, and Compose email/Add to list's own documented "this
|
|
228
|
+
* component draws the chrome, a consumer wires the behaviour") — omit
|
|
229
|
+
* to keep it exactly as inert as it always was. Named `onEditRecord`,
|
|
230
|
+
* not `onEdit` — that name is already `onEdit`'s own per-FIELD commit
|
|
231
|
+
* handler above; reusing it here for a whole-record action would be two
|
|
232
|
+
* unrelated things behind one prop.
|
|
233
|
+
*/
|
|
234
|
+
onEditRecord?: () => void;
|
|
235
|
+
/**
|
|
236
|
+
* crisp#1012: wires the "…" menu's "Delete record" item, chrome-only (no
|
|
237
|
+
* `onSelect` at all) before this. Delete itself always renders — it's
|
|
238
|
+
* one of Attio's own fixed 6 items (#621/#905), not a consumer-optional
|
|
239
|
+
* one — omit to leave it exactly as inert as Merge/Configure/Copy page
|
|
240
|
+
* URL/Copy record ID already are by default.
|
|
241
|
+
*/
|
|
242
|
+
onDelete?: () => void;
|
|
243
|
+
/**
|
|
244
|
+
* crisp#1012: appends the caller's own items to the "…" menu, in their
|
|
245
|
+
* own separator-delimited group between Attio's fixed items and Delete
|
|
246
|
+
* — e.g. an object-specific "Mark reviewed", or routing "Edit" to a full
|
|
247
|
+
* external form instead of `RecordDetails`' own inline click-to-edit for
|
|
248
|
+
* an object where that's the only real editor (internal/grc's own
|
|
249
|
+
* `EDIT_OPENS_FORM`, the case this was built for). Omit for the built-in
|
|
250
|
+
* group alone.
|
|
251
|
+
*/
|
|
252
|
+
actions?: RecordPageMenuAction[];
|
|
253
|
+
/**
|
|
254
|
+
* crisp#1019: hides the plain breadcrumb row (has no effect in peek mode
|
|
255
|
+
* — when `onClose` is set, the peek header replaces it entirely already).
|
|
256
|
+
* Default `true`, no change for an existing consumer — for one whose own
|
|
257
|
+
* app shell already renders a breadcrumb of its own (a second one would
|
|
258
|
+
* otherwise double up), pass `false`.
|
|
259
|
+
*/
|
|
260
|
+
showBreadcrumb?: boolean;
|
|
261
|
+
/**
|
|
262
|
+
* crisp#1019: hides the topbar's Share button. Default `true` — Share
|
|
263
|
+
* itself is still unconditional chrome with no built-in dialog (`onShare`
|
|
264
|
+
* "renders regardless" per its own doc above); this is a SEPARATE,
|
|
265
|
+
* explicit opt-out, not tied to whether `onShare` is supplied — a missing
|
|
266
|
+
* handler must never silently hide a button an existing consumer already
|
|
267
|
+
* sees, the same reasoning #1012's `onEditRecord`/`onDelete` already
|
|
268
|
+
* settled for the "…" menu's own always-visible items.
|
|
269
|
+
*/
|
|
270
|
+
showShare?: boolean;
|
|
271
|
+
/** crisp#1019: hides the topbar's "Ask AI" button — pure Attio branding
|
|
272
|
+
* chrome with no consumer hook of its own. Default `true`. */
|
|
273
|
+
showAskAttio?: boolean;
|
|
274
|
+
/**
|
|
275
|
+
* crisp#1019: hides the topbar's Comments toggle icon (which opens
|
|
276
|
+
* `RecordPage`'s own internal comments panel) — for a consumer whose
|
|
277
|
+
* Comments live somewhere else in its own UI already (a tab, say),
|
|
278
|
+
* rather than a second, competing entry point to the same feature.
|
|
279
|
+
* Default `true`. Independent of the `comments`/`onPostComment` props
|
|
280
|
+
* above, which control the panel's DATA, not this button's visibility.
|
|
281
|
+
*/
|
|
282
|
+
showComments?: boolean;
|
|
199
283
|
};
|
|
200
284
|
/**
|
|
201
285
|
* Every chrome string RecordPage renders. Supplied as a PARTIAL map, so
|
|
@@ -262,6 +346,17 @@ export type RecordPageLabels = {
|
|
|
262
346
|
upgradeToViewCalls: string;
|
|
263
347
|
callsUpgradeHint: string;
|
|
264
348
|
upgrade: string;
|
|
349
|
+
/** The "Run workflow" quick action's own popover (#620): title, search
|
|
350
|
+
* placeholder, empty state, and its "Create new workflow" link. Chrome
|
|
351
|
+
* only, like Compose email/Add to list above -- crisp has no workflow
|
|
352
|
+
* data model to search over yet. */
|
|
353
|
+
selectWorkflowTitle: string;
|
|
354
|
+
closeWorkflowPopover: string;
|
|
355
|
+
searchWorkflowsPlaceholder: string;
|
|
356
|
+
noWorkflows: string;
|
|
357
|
+
createNewWorkflow: string;
|
|
358
|
+
/** Footer keyboard hint under the "Select workflow" popover's empty list. */
|
|
359
|
+
navigate: string;
|
|
265
360
|
highlights: string;
|
|
266
361
|
recordDetails: string;
|
|
267
362
|
searchFields: string;
|
|
@@ -401,7 +496,7 @@ export declare namespace RecordPageMain {
|
|
|
401
496
|
* Emails sections (Notes & Tasks are live — add and check things off). Drop it
|
|
402
497
|
* into the app's main content area.
|
|
403
498
|
*/
|
|
404
|
-
export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, onClose, closeLabel, onPrevious, previousRecordLabel, onNext, nextRecordLabel, counterLabel, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, sections, highlights: highlightsProp, quickActions: quickActionsProp, comments: commentsProp, onPostComment, currentUser, onShare, ...rest }: RecordPageProps): React.JSX.Element;
|
|
499
|
+
export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, onClose, closeLabel, onPrevious, previousRecordLabel, onNext, nextRecordLabel, counterLabel, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, sections, highlights: highlightsProp, quickActions: quickActionsProp, comments: commentsProp, onPostComment, currentUser, onShare, avatarShape, onEditRecord, onDelete, actions, showBreadcrumb, showShare, showAskAttio, showComments, ...rest }: RecordPageProps): React.JSX.Element;
|
|
405
500
|
export declare namespace RecordPage {
|
|
406
501
|
var displayName: string;
|
|
407
502
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export type RecordPickerRecord = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: React.ReactNode;
|
|
5
|
+
/** Per-type icon, consumer-supplied -- crisp has no built-in
|
|
6
|
+
* object-type-to-icon mapping (same reasoning as `TaskList`'s own
|
|
7
|
+
* `record`/`meta` slots). */
|
|
8
|
+
icon?: React.ReactNode;
|
|
9
|
+
};
|
|
10
|
+
export type RecordPickerProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "onSelect"> & {
|
|
11
|
+
records: RecordPickerRecord[];
|
|
12
|
+
/** Shows the measured "Loading..." row instead of the list (the results
|
|
13
|
+
* are still in flight). */
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
onSelect?: (record: RecordPickerRecord) => void;
|
|
16
|
+
query?: string;
|
|
17
|
+
onQueryChange?: (query: string) => void;
|
|
18
|
+
searchLabel?: string;
|
|
19
|
+
loadingLabel?: string;
|
|
20
|
+
emptyLabel?: React.ReactNode;
|
|
21
|
+
className?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The record-search picker behind a task's "Add record" chip -- measured
|
|
25
|
+
* live on app.attio.com's Tasks page ("Edit task" -> "Add record"): a
|
|
26
|
+
* "Search..." row, then a FLAT list mixed across every object type (a
|
|
27
|
+
* person result sat first, ahead of several companies, with no section
|
|
28
|
+
* headers -- unlike the mention picker's own grouped Users/Records shape,
|
|
29
|
+
* crisp#646). Attio's own live search took a moment to resolve, showing a
|
|
30
|
+
* centred spinner + "Loading..." row meanwhile; not independently
|
|
31
|
+
* re-measured against a second empty-results case, so `emptyLabel`'s
|
|
32
|
+
* default copy ("No records") is inferred by symmetry with
|
|
33
|
+
* `AssigneePicker`'s own measured "No users", not itself pixel-measured.
|
|
34
|
+
*/
|
|
35
|
+
export declare function RecordPicker({ records, loading, onSelect, query: queryProp, onQueryChange, searchLabel: searchLabelProp, loadingLabel: loadingLabelProp, emptyLabel: emptyLabelProp, className, ...rest }: RecordPickerProps): React.JSX.Element;
|
|
36
|
+
export declare namespace RecordPicker {
|
|
37
|
+
var displayName: string;
|
|
38
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { type SavedView, SavedViews, type SavedViewsProps, } from "./savedviews";
|
|
1
|
+
export { type SavedView, SavedViews, type SavedViewsProps, SavedViewsSaveBar, type SavedViewsSaveBarProps, } from "./savedviews";
|
|
2
2
|
export { savedviewsRecipe } from "./savedviews.recipe";
|
|
@@ -90,3 +90,39 @@ export declare function SavedViews({ label, icon, views, activeId, onSelect, onC
|
|
|
90
90
|
export declare namespace SavedViews {
|
|
91
91
|
var displayName: string;
|
|
92
92
|
}
|
|
93
|
+
export type SavedViewsSaveBarProps = React.ComponentPropsWithoutRef<"div"> & {
|
|
94
|
+
/** Commits the live state (filters/sort/columns/…) back onto the loaded
|
|
95
|
+
* view — Attio's own "Save for everyone". */
|
|
96
|
+
onSave: () => void;
|
|
97
|
+
/** Reverts the live state to the loaded view's own saved snapshot. */
|
|
98
|
+
onDiscard: () => void;
|
|
99
|
+
/**
|
|
100
|
+
* Saves the live state as a brand-new view instead — the split button's
|
|
101
|
+
* own chevron menu (measured: exactly one item, "Save as new view").
|
|
102
|
+
* Omit to render a plain button with no chevron/menu.
|
|
103
|
+
*/
|
|
104
|
+
onSaveAsNew?: () => void;
|
|
105
|
+
discardLabel?: string;
|
|
106
|
+
saveLabel?: string;
|
|
107
|
+
saveAsNewLabel?: string;
|
|
108
|
+
/** aria-label on the chevron trigger when `onSaveAsNew` is given. */
|
|
109
|
+
saveOptionsLabel?: string;
|
|
110
|
+
className?: string;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The "unsaved changes" bar for a currently loaded saved view — Attio's own
|
|
114
|
+
* "Discard changes" + a split "Save for everyone ▾" button, measured live
|
|
115
|
+
* (app.attio.com, a saved Companies view with its sort changed). Not a part
|
|
116
|
+
* of `SavedViews`' own trigger/panel: Attio renders this in the page
|
|
117
|
+
* toolbar's own trailing slot, replacing whatever sits there at rest
|
|
118
|
+
* (Import/Export, "+ New …") — the same slot `TableToolbar`'s own
|
|
119
|
+
* `children` prop already documents ("Right-aligned actions after the
|
|
120
|
+
* count"). A consumer swaps this in for that slot's usual content once its
|
|
121
|
+
* own dirty check (live filters/sort/columns vs. the loaded view's
|
|
122
|
+
* snapshot) is true, and swaps it back out once it's false — this
|
|
123
|
+
* component itself carries no dirty state or visibility toggle.
|
|
124
|
+
*/
|
|
125
|
+
export declare function SavedViewsSaveBar({ onSave, onDiscard, onSaveAsNew, discardLabel: discardLabelProp, saveLabel: saveLabelProp, saveAsNewLabel: saveAsNewLabelProp, saveOptionsLabel: saveOptionsLabelProp, className, ...rest }: SavedViewsSaveBarProps): React.JSX.Element;
|
|
126
|
+
export declare namespace SavedViewsSaveBar {
|
|
127
|
+
var displayName: string;
|
|
128
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type SelectOption } from "../../components/select";
|
|
3
|
+
export type ShareRoleOption = SelectOption;
|
|
4
|
+
export type ShareMember = {
|
|
5
|
+
id: string;
|
|
6
|
+
name: React.ReactNode;
|
|
7
|
+
email?: React.ReactNode;
|
|
8
|
+
/** Defaults to a lettered `Avatar` seeded from `name`'s first character. */
|
|
9
|
+
avatar?: React.ReactNode;
|
|
10
|
+
/** The row's own access value, one of `memberRoleOptions`. */
|
|
11
|
+
access: string;
|
|
12
|
+
/** Disables this row's access select (Attio greys the signed-in user's
|
|
13
|
+
* own row on the Pro-gated surface — still rendered, never editable). */
|
|
14
|
+
accessDisabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type SharePopoverProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
|
|
17
|
+
/** The element that toggles the popover (Attio's own "Share" button). */
|
|
18
|
+
trigger: React.ReactElement;
|
|
19
|
+
align?: "start" | "end";
|
|
20
|
+
open?: boolean;
|
|
21
|
+
defaultOpen?: boolean;
|
|
22
|
+
onOpenChange?: (open: boolean) => void;
|
|
23
|
+
/** Controlled active tab. Omit to let the popover manage it. */
|
|
24
|
+
tab?: "members" | "automations";
|
|
25
|
+
defaultTab?: "members" | "automations";
|
|
26
|
+
onTabChange?: (tab: "members" | "automations") => void;
|
|
27
|
+
membersTabLabel?: string;
|
|
28
|
+
automationsTabLabel?: string;
|
|
29
|
+
/** The workspace's own avatar/icon, shown at the "Workspace access" row. */
|
|
30
|
+
workspaceIcon?: React.ReactNode;
|
|
31
|
+
workspaceAccessLabel?: string;
|
|
32
|
+
workspaceAccessValue: string;
|
|
33
|
+
workspaceAccessOptions: ShareRoleOption[];
|
|
34
|
+
onWorkspaceAccessChange?: (value: string) => void;
|
|
35
|
+
/**
|
|
36
|
+
* A slot for the plan-gated upsell card ("Workspace and advanced
|
|
37
|
+
* permissions are not supported on your current plan" + Upgrade, or the
|
|
38
|
+
* Pro "Advanced sharing" card) — crisp has no billing concept, so it
|
|
39
|
+
* never renders this content itself; a consumer on a gated plan supplies
|
|
40
|
+
* its own copy/CTA here. Omit entirely on an ungated plan.
|
|
41
|
+
*/
|
|
42
|
+
advancedSharing?: React.ReactNode;
|
|
43
|
+
/** "Clear permissions" — real, ungated action (unlike `advancedSharing`). */
|
|
44
|
+
onClearPermissions?: () => void;
|
|
45
|
+
clearPermissionsLabel?: string;
|
|
46
|
+
/** The Members tab's "Individual members" list — one row per workspace
|
|
47
|
+
* member with their own access select. Omit to hide the section. */
|
|
48
|
+
members?: ShareMember[];
|
|
49
|
+
membersSectionLabel?: string;
|
|
50
|
+
memberRoleOptions: ShareRoleOption[];
|
|
51
|
+
onMemberAccessChange?: (id: string, value: string) => void;
|
|
52
|
+
/** The Automations tab's search + role + Add row. */
|
|
53
|
+
automationSearchValue?: string;
|
|
54
|
+
defaultAutomationSearchValue?: string;
|
|
55
|
+
onAutomationSearchChange?: (query: string) => void;
|
|
56
|
+
automationSearchPlaceholder?: string;
|
|
57
|
+
automationRoleValue: string;
|
|
58
|
+
automationRoleOptions: ShareRoleOption[];
|
|
59
|
+
onAutomationRoleChange?: (value: string) => void;
|
|
60
|
+
onAddAutomation?: () => void;
|
|
61
|
+
/** Disables "Add" (Attio disables it on an empty search). */
|
|
62
|
+
addAutomationDisabled?: boolean;
|
|
63
|
+
addAutomationLabel?: string;
|
|
64
|
+
learnMoreHref?: string;
|
|
65
|
+
learnMoreLabel?: string;
|
|
66
|
+
"aria-label"?: string;
|
|
67
|
+
className?: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* A Share/permissions popover — measured live on app.attio.com (both an
|
|
71
|
+
* object table's and a List's own "Share" trigger, techpartners workspace):
|
|
72
|
+
* Members/Automations pill tabs, a "Workspace access" row (avatar + label +
|
|
73
|
+
* a `Read and write ⌄`-style role select), an optional plan-gated upsell
|
|
74
|
+
* slot, a "Clear permissions" action, an "Individual members" list (one row
|
|
75
|
+
* per member, its own role select), and — on the Automations tab — a
|
|
76
|
+
* search box + role select + "Add" row. Both tabs share a trailing "Learn
|
|
77
|
+
* more about permissions" link.
|
|
78
|
+
*
|
|
79
|
+
* Its own floating shell (not the generic `Popover`): the measured surface
|
|
80
|
+
* is 440px wide, past `Popover`'s 360px content cap. See share.recipe.ts.
|
|
81
|
+
*/
|
|
82
|
+
export declare function SharePopover({ trigger, align, open: openProp, defaultOpen, onOpenChange, tab: tabProp, defaultTab, onTabChange, membersTabLabel: membersTabLabelProp, automationsTabLabel: automationsTabLabelProp, workspaceIcon, workspaceAccessLabel: workspaceAccessLabelProp, workspaceAccessValue, workspaceAccessOptions, onWorkspaceAccessChange, advancedSharing, onClearPermissions, clearPermissionsLabel: clearPermissionsLabelProp, members, membersSectionLabel: membersSectionLabelProp, memberRoleOptions, onMemberAccessChange, automationSearchValue, defaultAutomationSearchValue, onAutomationSearchChange, automationSearchPlaceholder: automationSearchPlaceholderProp, automationRoleValue, automationRoleOptions, onAutomationRoleChange, onAddAutomation, addAutomationDisabled, addAutomationLabel: addAutomationLabelProp, learnMoreHref, learnMoreLabel: learnMoreLabelProp, "aria-label": ariaLabel, className, ...rest }: SharePopoverProps): React.JSX.Element;
|
|
83
|
+
export declare namespace SharePopover {
|
|
84
|
+
var displayName: string;
|
|
85
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./shortcutssheet";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/** One simultaneous key combo — each entry its own `Kbd` chip, no separator
|
|
3
|
+
* between them (e.g. `["⌘", "K"]` for ⌘K, `["⌘", "⇧", "↑"]` for ⌘⇧↑). */
|
|
4
|
+
export type ShortcutStep = React.ReactNode[];
|
|
5
|
+
export type ShortcutRow = {
|
|
6
|
+
description: React.ReactNode;
|
|
7
|
+
/** More than one step is a SEQUENTIAL shortcut (Attio's own "G then H") —
|
|
8
|
+
* a `then` label renders between them. A single step is a simultaneous
|
|
9
|
+
* combo and gets no separator. */
|
|
10
|
+
steps: ShortcutStep[];
|
|
11
|
+
};
|
|
12
|
+
export type ShortcutSection = {
|
|
13
|
+
label: React.ReactNode;
|
|
14
|
+
rows: ShortcutRow[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Attio's own canonical keyboard-shortcut list (crisp#615), live-measured
|
|
18
|
+
* off app.attio.com/techpartners' "Keyboard shortcuts" panel (Help →
|
|
19
|
+
* "Shortcuts") — 34 rows across 4 sections. The issue's own quoted table
|
|
20
|
+
* collapsed a few of these ("Navigate to the cell above/right/below/left",
|
|
21
|
+
* "Go to next/previous cell") into one row each; the live panel renders
|
|
22
|
+
* them as separate rows, which is what this list follows.
|
|
23
|
+
*/
|
|
24
|
+
export declare const defaultShortcutSections: ShortcutSection[];
|
|
25
|
+
export type ShortcutsSheetProps = {
|
|
26
|
+
open: boolean;
|
|
27
|
+
onOpenChange: (open: boolean) => void;
|
|
28
|
+
/** Defaults to `defaultShortcutSections`. Swap in your own translated
|
|
29
|
+
* array — this is DATA, not one prop per string, the same way
|
|
30
|
+
* `Command`'s own default items are. */
|
|
31
|
+
sections?: ShortcutSection[];
|
|
32
|
+
title?: string;
|
|
33
|
+
/** The connector between a sequential shortcut's two steps (default
|
|
34
|
+
* "then", as in Attio's own "G then H"). */
|
|
35
|
+
thenLabel?: string;
|
|
36
|
+
/** aria-label on the close button (default "Close", `Drawer`'s own). */
|
|
37
|
+
closeLabel?: string;
|
|
38
|
+
className?: string;
|
|
39
|
+
} & Omit<React.ComponentPropsWithoutRef<"div">, "title" | "className" | "children">;
|
|
40
|
+
/**
|
|
41
|
+
* Attio's "Keyboard shortcuts" panel (crisp#615, parity row P-106) — a
|
|
42
|
+
* `Drawer` narrowed to the measured 360px (Drawer's own default is 420px),
|
|
43
|
+
* listing `sections` grouped with a hairline-free 10px row rhythm and a
|
|
44
|
+
* 20px gap before each new section label.
|
|
45
|
+
*/
|
|
46
|
+
export declare function ShortcutsSheet({ open, onOpenChange, sections, title: titleProp, thenLabel: thenLabelProp, closeLabel, className, ...rest }: ShortcutsSheetProps): React.JSX.Element;
|
|
47
|
+
export declare namespace ShortcutsSheet {
|
|
48
|
+
var displayName: string;
|
|
49
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type AssigneePickerUser } from "../assigneepicker/assigneepicker";
|
|
3
|
+
import { type RecordPickerRecord } from "../recordpicker/recordpicker";
|
|
4
|
+
export type { AssigneePickerUser, RecordPickerRecord };
|
|
5
|
+
export type TaskEditPopoverProps = {
|
|
6
|
+
/** The element that opens the popover (a task row, typically). */
|
|
7
|
+
trigger: React.ReactElement;
|
|
8
|
+
open?: boolean;
|
|
9
|
+
defaultOpen?: boolean;
|
|
10
|
+
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
title: string;
|
|
12
|
+
onTitleChange?: (title: string) => void;
|
|
13
|
+
done?: boolean;
|
|
14
|
+
onToggleDone?: (done: boolean) => void;
|
|
15
|
+
/** The due-date chip's own label, already formatted (e.g. "August 26,
|
|
16
|
+
* 2026"). Omit for the unset placeholder. */
|
|
17
|
+
dueDateLabel?: React.ReactNode;
|
|
18
|
+
/** The due-date chip's own sub-popover content -- a date picker is a
|
|
19
|
+
* separate, already-scoped surface elsewhere in crisp, so this stays a
|
|
20
|
+
* consumer-supplied slot rather than a second one built here. */
|
|
21
|
+
dueDatePicker?: React.ReactNode;
|
|
22
|
+
/** The task's current single assignee. */
|
|
23
|
+
assignee?: AssigneePickerUser | null;
|
|
24
|
+
/** Candidate users for the assignee picker's list. */
|
|
25
|
+
users?: AssigneePickerUser[];
|
|
26
|
+
onAssigneeChange?: (user: AssigneePickerUser | null) => void;
|
|
27
|
+
/** How many records are already linked -- Attio's own chip reads "Add
|
|
28
|
+
* record" at 0 and "`N` linked record(s)" from 1 up (live-confirmed:
|
|
29
|
+
* opening the composer from a record's own Activity tab pre-links that
|
|
30
|
+
* record and the chip already reads "1 linked record"). */
|
|
31
|
+
linkedRecordCount?: number;
|
|
32
|
+
/** Search results for the record picker. */
|
|
33
|
+
recordCandidates?: RecordPickerRecord[];
|
|
34
|
+
recordCandidatesLoading?: boolean;
|
|
35
|
+
onRecordQueryChange?: (query: string) => void;
|
|
36
|
+
onSelectRecord?: (record: RecordPickerRecord) => void;
|
|
37
|
+
/** The kebab's own dropdown content (e.g. a `Menu` with "Delete task"). */
|
|
38
|
+
menu?: React.ReactNode;
|
|
39
|
+
onCancel?: () => void;
|
|
40
|
+
onSave?: () => void;
|
|
41
|
+
headingLabel?: string;
|
|
42
|
+
closeLabel?: string;
|
|
43
|
+
dueDatePlaceholder?: string;
|
|
44
|
+
assignLabel?: string;
|
|
45
|
+
assignedToLabel?: string;
|
|
46
|
+
addRecordLabel?: string;
|
|
47
|
+
linkedRecordLabel?: string;
|
|
48
|
+
moreActionsLabel?: string;
|
|
49
|
+
cancelLabel?: string;
|
|
50
|
+
/** The Cancel button's key-cap caption (default "Esc"). */
|
|
51
|
+
cancelKeyLabel?: string;
|
|
52
|
+
saveLabel?: string;
|
|
53
|
+
className?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* A task's "Edit task" popover -- measured live on app.attio.com's Tasks
|
|
57
|
+
* page: a checkbox + editable title, then a chip row (due date / assigned /
|
|
58
|
+
* add record), a "more actions" kebab, and Cancel/Save. Composes
|
|
59
|
+
* `AssigneePicker` and `RecordPicker` (both crisp#626) behind their own
|
|
60
|
+
* chips, using the same core floating primitives `Popover` itself is built
|
|
61
|
+
* on rather than `Popover` directly (its content hardcodes a 360px max
|
|
62
|
+
* width, well under this popover's own measured 800px).
|
|
63
|
+
*/
|
|
64
|
+
export declare function TaskEditPopover({ trigger, open: openProp, defaultOpen, onOpenChange, title, onTitleChange, done, onToggleDone, dueDateLabel, dueDatePicker, assignee, users, onAssigneeChange, linkedRecordCount, recordCandidates, recordCandidatesLoading, onRecordQueryChange, onSelectRecord, menu, onCancel, onSave, headingLabel: headingLabelProp, closeLabel: closeLabelProp, dueDatePlaceholder: dueDatePlaceholderProp, assignLabel: assignLabelProp, assignedToLabel: assignedToLabelProp, addRecordLabel: addRecordLabelProp, linkedRecordLabel: linkedRecordLabelProp, moreActionsLabel: moreActionsLabelProp, cancelLabel: cancelLabelProp, cancelKeyLabel: cancelKeyLabelProp, saveLabel: saveLabelProp, className, }: TaskEditPopoverProps): React.JSX.Element;
|
|
65
|
+
export declare namespace TaskEditPopover {
|
|
66
|
+
var displayName: string;
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./workspaceswitchermenu";
|