@ant-design/icons#CalendarOutlined TypeScript Examples
The following examples show how to use
@ant-design/icons#CalendarOutlined.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: IntervalFilter.tsx From posthog-foss with MIT License | 6 votes |
export function IntervalFilter({ disabled }: InvertalFilterProps): JSX.Element {
const { insightProps } = useValues(insightLogic)
const { interval } = useValues(intervalFilterLogic(insightProps))
const { setInterval } = useActions(intervalFilterLogic(insightProps))
const options = Object.entries(intervals).map(([key, { label }]) => ({
key,
value: key,
label:
key === interval ? (
<>
<CalendarOutlined /> {label}
</>
) : (
label
),
}))
return (
<Select
bordered
disabled={disabled}
defaultValue={interval || 'day'}
value={interval || undefined}
dropdownMatchSelectWidth={false}
onChange={setInterval}
data-attr="interval-filter"
options={options}
/>
)
}
Example #2
Source File: RetentionDatePicker.tsx From posthog-foss with MIT License | 6 votes |
export function RetentionDatePicker(): JSX.Element {
const { insightProps } = useValues(insightLogic)
const { filters } = useValues(retentionTableLogic(insightProps))
const { setFilters } = useActions(retentionTableLogic(insightProps))
const yearSuffix = filters.date_to && dayjs(filters.date_to).year() !== dayjs().year() ? ', YYYY' : ''
return (
<>
<Tooltip title="Cohorts up to this end date">
<span style={{ maxWidth: 100, display: 'inline-flex', alignItems: 'center' }}>
<CalendarOutlined />
<DatePicker
showTime={filters.period === 'Hour'}
use12Hours
format={filters.period === 'Hour' ? `MMM D${yearSuffix}, h a` : `MMM D${yearSuffix}`}
value={filters.date_to ? dayjs(filters.date_to) : undefined}
onChange={(date_to) => setFilters({ date_to: date_to && dayjs(date_to).toISOString() })}
allowClear
placeholder="Today"
className="retention-date-picker"
suffixIcon={null}
/>
</span>
</Tooltip>
</>
)
}
Example #3
Source File: DetailDescription.tsx From mayoor with MIT License | 6 votes |
DetailDescription: React.FC<Props> = ({ createdByName, createdAt, updatedAt }) => {
const { t } = useTranslation();
const { f } = useDateFormatter();
return (
<StyledDescriptions>
<Descriptions.Item label={t('Created By')} key="createdBy">
<UserOutlined />
{createdByName}
</Descriptions.Item>
<Descriptions.Item label={t('Created At')} key="createdAt">
{createdAt && (
<>
<CalendarOutlined /> {f(createdAt, 'datetime')}
</>
)}
</Descriptions.Item>
<Descriptions.Item label={t('Last Updated At')} key="lastUpdatedAt">
{updatedAt && (
<>
<CalendarOutlined /> {f(updatedAt, 'datetime')}
</>
)}
</Descriptions.Item>
</StyledDescriptions>
);
}
Example #4
Source File: DateInput.tsx From ant-extensions with MIT License | 6 votes |
DateInput = React.forwardRef<Input, Omit<InputProps, "onChange">>(
({ value, disabled, readOnly, ...props }, ref) => {
const {
i18n: { language }
} = useTranslation(I18nKey);
const displayLabel = useMemo(
() => (value && !!language ? parseDateLabel(value.toString()) : ""),
[value, language]
);
const isDisabled = useMemo(() => disabled || readOnly, [disabled, readOnly]);
return (
<Input
{...props}
readOnly
ref={ref}
data-testid="input-el"
disabled={isDisabled}
value={displayLabel || ""}
suffix={<CalendarOutlined />}
/>
);
}
)
Example #5
Source File: general-date-picker.editor.spec.tsx From next-basics with GNU General Public License v3.0 | 6 votes |
describe("GeneralDatePickerEditor", () => {
it("should work", () => {
mockUseBuilderNode.mockReturnValueOnce({
type: "brick",
id: "B-001",
brick: "general-date-picker",
alias: "my-brick",
$$parsedProperties: {
placeholder: "请选择日期",
},
});
const wrapper = shallow(<GeneralDatePickerEditor nodeUid={1} />);
expect(wrapper.find(".placeholder").text()).toBe("请选择日期");
expect(wrapper.find(CalendarOutlined).length).toEqual(1);
});
});
Example #6
Source File: SchemaTable.tsx From datart with Apache License 2.0 | 5 votes |
SchemaTable = memo(
({
height,
width: propsWidth,
model,
hierarchy,
dataSource,
hasCategory,
getExtraHeaderActions,
onSchemaTypeChange,
...tableProps
}: SchemaTableProps) => {
const dataSourceWithKey = useMemo(
() => dataSource?.map(o => ({ ...o, [ROW_KEY]: uuidv4() })),
[dataSource],
);
const columnWidthMap = useMemo(
() => getColumnWidthMap(model, dataSource || []),
[model, dataSource],
);
const t = useI18NPrefix('view.schemaTable');
const tg = useI18NPrefix('global');
const {
columns,
tableWidth,
}: {
columns: TableColumnType<object>[];
tableWidth: number;
} = useMemo(() => {
let tableWidth = 0;
const columns = Object.entries(model).map(([name, column]) => {
const hierarchyColumn = getHierarchyColumn(name, hierarchy) || column;
const width = columnWidthMap[name];
tableWidth += width;
let icon;
switch (hierarchyColumn.type) {
case DataViewFieldType.NUMERIC:
icon = <NumberOutlined />;
break;
case DataViewFieldType.DATE:
icon = <CalendarOutlined />;
break;
default:
icon = <FieldStringOutlined />;
break;
}
const extraActions =
getExtraHeaderActions && getExtraHeaderActions(name, hierarchyColumn);
const title = (
<>
<span className="content">{name}</span>
<Dropdown
trigger={['click']}
overlay={
<Menu
selectedKeys={[
hierarchyColumn.type,
`category-${hierarchyColumn.category}`,
]}
className="datart-schema-table-header-menu"
onClick={onSchemaTypeChange(name, hierarchyColumn)}
>
{Object.values(DataViewFieldType).map(t => (
<Menu.Item key={t}>
{tg(`columnType.${t.toLowerCase()}`)}
</Menu.Item>
))}
{hasCategory && (
<>
<Menu.Divider />
<Menu.SubMenu
key="categories"
title={t('category')}
popupClassName="datart-schema-table-header-menu"
>
{Object.values(ColumnCategories).map(t => (
<Menu.Item key={`category-${t}`}>
{tg(`columnCategory.${t.toLowerCase()}`)}
</Menu.Item>
))}
</Menu.SubMenu>
</>
)}
</Menu>
}
>
<Tooltip title={hasCategory ? t('typeAndCategory') : t('type')}>
<ToolbarButton
size="small"
iconSize={FONT_SIZE_BASE}
className="suffix"
icon={icon}
/>
</Tooltip>
</Dropdown>
{extraActions}
</>
);
return {
title,
dataIndex: name,
width,
align:
column.type === DataViewFieldType.NUMERIC
? ('right' as const)
: ('left' as const),
};
});
return { columns, tableWidth };
}, [
model,
hierarchy,
columnWidthMap,
hasCategory,
getExtraHeaderActions,
onSchemaTypeChange,
t,
tg,
]);
return (
<VirtualTable
{...tableProps}
rowKey={ROW_KEY}
size="small"
components={{ header: { cell: TableHeader } }}
dataSource={dataSourceWithKey}
columns={columns}
scroll={{ x: tableWidth, y: height }}
width={propsWidth}
/>
);
},
)
Example #7
Source File: DateLevelFieldContainer.tsx From datart with Apache License 2.0 | 5 votes |
function DateLevelFieldContainer({
onClearCheckedList,
item,
colName,
}: {
onClearCheckedList?: () => any;
item: {
category: string;
expression: string;
id: string;
type: string;
};
colName: string;
}) {
const t = useI18NPrefix(`viz.workbench.dataview`);
const [, drag] = useDrag(
() => ({
type: CHART_DRAG_ELEMENT_TYPE.DATASET_COLUMN,
canDrag: true,
item: {
colName: `${colName}`,
type: item.type,
category: item.category,
expression: `${item.expression}`,
},
collect: monitor => ({
isDragging: monitor.isDragging(),
}),
end: onClearCheckedList,
}),
[],
);
return (
<ItemWrapper ref={drag}>
<CalendarOutlined style={{ color: INFO }} />
<span>
{colName}({t(item.expression)})
</span>
</ItemWrapper>
);
}
Example #8
Source File: general-date-picker.editor.tsx From next-basics with GNU General Public License v3.0 | 5 votes |
export function GeneralDatePickerEditor({
nodeUid,
}: EditorComponentProps): React.ReactElement {
const node = useBuilderNode<GeneralDatePickerProperties>({ nodeUid });
const { label, required, placeholder } = node.$$parsedProperties;
return (
<EditorContainer nodeUid={nodeUid}>
<div className={formSharedStyle.formItemWrapper}>
<div
className={classNames(formSharedStyle.labelContainer, {
[formSharedStyle.requireMark]: required,
})}
>
<span
className={classNames({ [formSharedStyle.formLabel]: !!label })}
>
{formCommonFieldDisplay(label)}
</span>
</div>
<div
className={formSharedStyle.formInputItem}
style={{ flex: "0 0 200px" }}
>
<div
className={classNames(
formSharedStyle.placeholder,
formSharedStyle.placeholderOffset
)}
>
<span>{formCommonFieldDisplay(placeholder)}</span>
</div>
<span className={styles.suffixIcon}>
<CalendarOutlined />
</span>
</div>
</div>
</EditorContainer>
);
}
Example #9
Source File: ElementInfo.tsx From posthog-foss with MIT License | 5 votes |
export function ElementInfo(): JSX.Element | null {
const { clickCount } = useValues(heatmapLogic)
const { hoverElementMeta, selectedElementMeta } = useValues(elementsLogic)
const { createAction } = useActions(elementsLogic)
const activeMeta = hoverElementMeta || selectedElementMeta
if (!activeMeta) {
return null
}
const { element, position, count, actionStep } = activeMeta
return (
<>
<div style={{ padding: 15, borderLeft: '5px solid #8F98FF', background: 'hsla(235, 100%, 99%, 1)' }}>
<h1 className="section-title">Selected Element</h1>
<ActionStep actionStep={actionStep} />
</div>
{position ? (
<div style={{ padding: 15, borderLeft: '5px solid #FF9870', background: 'hsla(19, 99%, 99%, 1)' }}>
<h1 className="section-title">Stats</h1>
<p>
<CalendarOutlined /> <u>Last 7 days</u>
</p>
<Row gutter={16}>
<Col span={16}>
<Statistic
title="Clicks"
value={count || 0}
suffix={`/ ${clickCount} (${
clickCount === 0 ? '-' : Math.round(((count || 0) / clickCount) * 10000) / 100
}%)`}
/>
</Col>
<Col span={8}>
<Statistic title="Ranking" prefix="#" value={position || 0} />
</Col>
</Row>
</div>
) : null}
<div style={{ padding: 15, borderLeft: '5px solid #94D674', background: 'hsla(100, 74%, 98%, 1)' }}>
<h1 className="section-title">Actions ({activeMeta.actions.length})</h1>
{activeMeta.actions.length === 0 ? (
<p>No actions include this element</p>
) : (
<ActionsListView actions={activeMeta.actions.map((a) => a.action)} />
)}
<Button size="small" onClick={() => createAction(element)}>
<PlusOutlined /> Create a new action
</Button>
</div>
</>
)
}
Example #10
Source File: InsightDisplayConfig.tsx From posthog-foss with MIT License | 5 votes |
export function InsightDisplayConfig({ filters, activeView, disableTable }: InsightDisplayConfigProps): JSX.Element {
const showFunnelBarOptions = activeView === InsightType.FUNNELS
const showPathOptions = activeView === InsightType.PATHS
const dateFilterDisabled = showFunnelBarOptions && isFunnelEmpty(filters)
return (
<div className="display-config-inner">
<div className="display-config-inner-row">
{showDateFilter[activeView] && !disableTable && (
<span className="filter">
<span className="head-title-item">Date range</span>
<InsightDateFilter
defaultValue="Last 7 days"
disabled={dateFilterDisabled}
bordered
makeLabel={(key) => (
<>
<CalendarOutlined /> {key}
{key == 'All time' && (
<Tooltip title={`Only events dated after 2015 will be shown`}>
<InfoCircleOutlined className="info-indicator" />
</Tooltip>
)}
</>
)}
/>
</span>
)}
{showIntervalFilter(activeView, filters) && (
<span className="filter">
<span className="head-title-item">
<span className="hide-lte-md">grouped </span>by
</span>
<IntervalFilter view={activeView} />
</span>
)}
{activeView === InsightType.RETENTION && (
<>
<RetentionDatePicker />
<RetentionReferencePicker />
</>
)}
{showPathOptions && (
<span className="filter">
<PathStepPicker />
</span>
)}
{showComparePrevious[activeView] && (
<span className="filter">
<CompareFilter />
</span>
)}
</div>
<div className="display-config-inner-row">
{showChartFilter(activeView) && (
<span className="filter">
<span className="head-title-item">Chart type</span>
<ChartFilter filters={filters} disabled={filters.insight === InsightType.LIFECYCLE} />
</span>
)}
{showFunnelBarOptions && filters.funnel_viz_type === FunnelVizType.Steps && (
<>
<span className="filter">
<FunnelDisplayLayoutPicker />
</span>
</>
)}
{showFunnelBarOptions && filters.funnel_viz_type === FunnelVizType.TimeToConvert && (
<span className="filter">
<FunnelBinsPicker />
</span>
)}
</div>
</div>
)
}
Example #11
Source File: Icon.tsx From html2sketch with MIT License | 4 votes |
IconSymbol: FC = () => {
return (
<Row>
{/*<CaretUpOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/1.CaretUpOutlined'}*/}
{/*/>*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.MailOutlined'}*/}
{/*/>*/}
{/*<StepBackwardOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.StepBackwardOutlined'}*/}
{/*/>*/}
{/*<StepForwardOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.StepBackwardOutlined'}*/}
{/*/>*/}
<StepForwardOutlined />
<ShrinkOutlined />
<ArrowsAltOutlined />
<DownOutlined />
<UpOutlined />
<LeftOutlined />
<RightOutlined />
<CaretUpOutlined />
<CaretDownOutlined />
<CaretLeftOutlined />
<CaretRightOutlined />
<VerticalAlignTopOutlined />
<RollbackOutlined />
<FastBackwardOutlined />
<FastForwardOutlined />
<DoubleRightOutlined />
<DoubleLeftOutlined />
<VerticalLeftOutlined />
<VerticalRightOutlined />
<VerticalAlignMiddleOutlined />
<VerticalAlignBottomOutlined />
<ForwardOutlined />
<BackwardOutlined />
<EnterOutlined />
<RetweetOutlined />
<SwapOutlined />
<SwapLeftOutlined />
<SwapRightOutlined />
<ArrowUpOutlined />
<ArrowDownOutlined />
<ArrowLeftOutlined />
<ArrowRightOutlined />
<LoginOutlined />
<LogoutOutlined />
<MenuFoldOutlined />
<MenuUnfoldOutlined />
<BorderBottomOutlined />
<BorderHorizontalOutlined />
<BorderInnerOutlined />
<BorderOuterOutlined />
<BorderLeftOutlined />
<BorderRightOutlined />
<BorderTopOutlined />
<BorderVerticleOutlined />
<PicCenterOutlined />
<PicLeftOutlined />
<PicRightOutlined />
<RadiusBottomleftOutlined />
<RadiusBottomrightOutlined />
<RadiusUpleftOutlined />
<RadiusUprightOutlined />
<FullscreenOutlined />
<FullscreenExitOutlined />
<QuestionOutlined />
<PauseOutlined />
<MinusOutlined />
<PauseCircleOutlined />
<InfoOutlined />
<CloseOutlined />
<ExclamationOutlined />
<CheckOutlined />
<WarningOutlined />
<IssuesCloseOutlined />
<StopOutlined />
<EditOutlined />
<CopyOutlined />
<ScissorOutlined />
<DeleteOutlined />
<SnippetsOutlined />
<DiffOutlined />
<HighlightOutlined />
<AlignCenterOutlined />
<AlignLeftOutlined />
<AlignRightOutlined />
<BgColorsOutlined />
<BoldOutlined />
<ItalicOutlined />
<UnderlineOutlined />
<StrikethroughOutlined />
<RedoOutlined />
<UndoOutlined />
<ZoomInOutlined />
<ZoomOutOutlined />
<FontColorsOutlined />
<FontSizeOutlined />
<LineHeightOutlined />
<SortAscendingOutlined />
<SortDescendingOutlined />
<DragOutlined />
<OrderedListOutlined />
<UnorderedListOutlined />
<RadiusSettingOutlined />
<ColumnWidthOutlined />
<ColumnHeightOutlined />
<AreaChartOutlined />
<PieChartOutlined />
<BarChartOutlined />
<DotChartOutlined />
<LineChartOutlined />
<RadarChartOutlined />
<HeatMapOutlined />
<FallOutlined />
<RiseOutlined />
<StockOutlined />
<BoxPlotOutlined />
<FundOutlined />
<SlidersOutlined />
<AndroidOutlined />
<AppleOutlined />
<WindowsOutlined />
<IeOutlined />
<ChromeOutlined />
<GithubOutlined />
<AliwangwangOutlined />
<DingdingOutlined />
<WeiboSquareOutlined />
<WeiboCircleOutlined />
<TaobaoCircleOutlined />
<Html5Outlined />
<WeiboOutlined />
<TwitterOutlined />
<WechatOutlined />
<AlipayCircleOutlined />
<TaobaoOutlined />
<SkypeOutlined />
<FacebookOutlined />
<CodepenOutlined />
<CodeSandboxOutlined />
<AmazonOutlined />
<GoogleOutlined />
<AlipayOutlined />
<AntDesignOutlined />
<AntCloudOutlined />
<ZhihuOutlined />
<SlackOutlined />
<SlackSquareOutlined />
<BehanceSquareOutlined />
<DribbbleOutlined />
<DribbbleSquareOutlined />
<InstagramOutlined />
<YuqueOutlined />
<AlibabaOutlined />
<YahooOutlined />
<RedditOutlined />
<SketchOutlined />
<AccountBookOutlined />
<AlertOutlined />
<ApartmentOutlined />
<ApiOutlined />
<QqOutlined />
<MediumWorkmarkOutlined />
<GitlabOutlined />
<MediumOutlined />
<GooglePlusOutlined />
<AppstoreAddOutlined />
<AppstoreOutlined />
<AudioOutlined />
<AudioMutedOutlined />
<AuditOutlined />
<BankOutlined />
<BarcodeOutlined />
<BarsOutlined />
<BellOutlined />
<BlockOutlined />
<BookOutlined />
<BorderOutlined />
<BranchesOutlined />
<BuildOutlined />
<BulbOutlined />
<CalculatorOutlined />
<CalendarOutlined />
<CameraOutlined />
<CarOutlined />
<CarryOutOutlined />
<CiCircleOutlined />
<CiOutlined />
<CloudOutlined />
<ClearOutlined />
<ClusterOutlined />
<CodeOutlined />
<CoffeeOutlined />
<CompassOutlined />
<CompressOutlined />
<ContactsOutlined />
<ContainerOutlined />
<ControlOutlined />
<CopyrightCircleOutlined />
<CopyrightOutlined />
<CreditCardOutlined />
<CrownOutlined />
<CustomerServiceOutlined />
<DashboardOutlined />
<DatabaseOutlined />
<DeleteColumnOutlined />
<DeleteRowOutlined />
<DisconnectOutlined />
<DislikeOutlined />
<DollarCircleOutlined />
<DollarOutlined />
<DownloadOutlined />
<EllipsisOutlined />
<EnvironmentOutlined />
<EuroCircleOutlined />
<EuroOutlined />
<ExceptionOutlined />
<ExpandAltOutlined />
<ExpandOutlined />
<ExperimentOutlined />
<ExportOutlined />
<EyeOutlined />
<FieldBinaryOutlined />
<FieldNumberOutlined />
<FieldStringOutlined />
<DesktopOutlined />
<DingtalkOutlined />
<FileAddOutlined />
<FileDoneOutlined />
<FileExcelOutlined />
<FileExclamationOutlined />
<FileOutlined />
<FileImageOutlined />
<FileJpgOutlined />
<FileMarkdownOutlined />
<FilePdfOutlined />
<FilePptOutlined />
<FileProtectOutlined />
<FileSearchOutlined />
<FileSyncOutlined />
<FileTextOutlined />
<FileUnknownOutlined />
<FileWordOutlined />
<FilterOutlined />
<FireOutlined />
<FlagOutlined />
<FolderAddOutlined />
<FolderOutlined />
<FolderOpenOutlined />
<ForkOutlined />
<FormatPainterOutlined />
<FrownOutlined />
<FunctionOutlined />
<FunnelPlotOutlined />
<GatewayOutlined />
<GifOutlined />
<GiftOutlined />
<GlobalOutlined />
<GoldOutlined />
<GroupOutlined />
<HddOutlined />
<HeartOutlined />
<HistoryOutlined />
<HomeOutlined />
<HourglassOutlined />
<IdcardOutlined />
<ImportOutlined />
<InboxOutlined />
<InsertRowAboveOutlined />
<InsertRowBelowOutlined />
<InsertRowLeftOutlined />
<InsertRowRightOutlined />
<InsuranceOutlined />
<InteractionOutlined />
<KeyOutlined />
<LaptopOutlined />
<LayoutOutlined />
<LikeOutlined />
<LineOutlined />
<LinkOutlined />
<Loading3QuartersOutlined />
<LoadingOutlined />
<LockOutlined />
<MailOutlined />
<ManOutlined />
<MedicineBoxOutlined />
<MehOutlined />
<MenuOutlined />
<MergeCellsOutlined />
<MessageOutlined />
<MobileOutlined />
<MoneyCollectOutlined />
<MonitorOutlined />
<MoreOutlined />
<NodeCollapseOutlined />
<NodeExpandOutlined />
<NodeIndexOutlined />
<NotificationOutlined />
<NumberOutlined />
<PaperClipOutlined />
<PartitionOutlined />
<PayCircleOutlined />
<PercentageOutlined />
<PhoneOutlined />
<PictureOutlined />
<PoundCircleOutlined />
<PoundOutlined />
<PoweroffOutlined />
<PrinterOutlined />
<ProfileOutlined />
<ProjectOutlined />
<PropertySafetyOutlined />
<PullRequestOutlined />
<PushpinOutlined />
<QrcodeOutlined />
<ReadOutlined />
<ReconciliationOutlined />
<RedEnvelopeOutlined />
<ReloadOutlined />
<RestOutlined />
<RobotOutlined />
<RocketOutlined />
<SafetyCertificateOutlined />
<SafetyOutlined />
<ScanOutlined />
<ScheduleOutlined />
<SearchOutlined />
<SecurityScanOutlined />
<SelectOutlined />
<SendOutlined />
<SettingOutlined />
<ShakeOutlined />
<ShareAltOutlined />
<ShopOutlined />
<ShoppingCartOutlined />
<ShoppingOutlined />
<SisternodeOutlined />
<SkinOutlined />
<SmileOutlined />
<SolutionOutlined />
<SoundOutlined />
<SplitCellsOutlined />
<StarOutlined />
<SubnodeOutlined />
<SyncOutlined />
<TableOutlined />
<TabletOutlined />
<TagOutlined />
<TagsOutlined />
<TeamOutlined />
<ThunderboltOutlined />
<ToTopOutlined />
<ToolOutlined />
<TrademarkCircleOutlined />
<TrademarkOutlined />
<TransactionOutlined />
<TrophyOutlined />
<UngroupOutlined />
<UnlockOutlined />
<UploadOutlined />
<UsbOutlined />
<UserAddOutlined />
<UserDeleteOutlined />
<UserOutlined />
<UserSwitchOutlined />
<UsergroupAddOutlined />
<UsergroupDeleteOutlined />
<VideoCameraOutlined />
<WalletOutlined />
<WifiOutlined />
<BorderlessTableOutlined />
<WomanOutlined />
<BehanceOutlined />
<DropboxOutlined />
<DeploymentUnitOutlined />
<UpCircleOutlined />
<DownCircleOutlined />
<LeftCircleOutlined />
<RightCircleOutlined />
<UpSquareOutlined />
<DownSquareOutlined />
<LeftSquareOutlined />
<RightSquareOutlined />
<PlayCircleOutlined />
<QuestionCircleOutlined />
<PlusCircleOutlined />
<PlusSquareOutlined />
<MinusSquareOutlined />
<MinusCircleOutlined />
<InfoCircleOutlined />
<ExclamationCircleOutlined />
<CloseCircleOutlined />
<CloseSquareOutlined />
<CheckCircleOutlined />
<CheckSquareOutlined />
<ClockCircleOutlined />
<FormOutlined />
<DashOutlined />
<SmallDashOutlined />
<YoutubeOutlined />
<CodepenCircleOutlined />
<AliyunOutlined />
<PlusOutlined />
<LinkedinOutlined />
<AimOutlined />
<BugOutlined />
<CloudDownloadOutlined />
<CloudServerOutlined />
<CloudSyncOutlined />
<CloudUploadOutlined />
<CommentOutlined />
<ConsoleSqlOutlined />
<EyeInvisibleOutlined />
<FileGifOutlined />
<DeliveredProcedureOutlined />
<FieldTimeOutlined />
<FileZipOutlined />
<FolderViewOutlined />
<FundProjectionScreenOutlined />
<FundViewOutlined />
<MacCommandOutlined />
<PlaySquareOutlined />
<OneToOneOutlined />
<RotateLeftOutlined />
<RotateRightOutlined />
<SaveOutlined />
<SwitcherOutlined />
<TranslationOutlined />
<VerifiedOutlined />
<VideoCameraAddOutlined />
<WhatsAppOutlined />
{/*</Col>*/}
</Row>
);
}
Example #12
Source File: SessionRecordingsTable.tsx From posthog-foss with MIT License | 4 votes |
export function SessionRecordingsTable({ personUUID, isPersonPage = false }: SessionRecordingsTableProps): JSX.Element {
const sessionRecordingsTableLogicInstance = sessionRecordingsTableLogic({ personUUID })
const {
sessionRecordings,
sessionRecordingsResponseLoading,
sessionRecordingId,
entityFilters,
propertyFilters,
hasNext,
hasPrev,
fromDate,
toDate,
durationFilter,
showFilters,
} = useValues(sessionRecordingsTableLogicInstance)
const {
openSessionPlayer,
closeSessionPlayer,
setEntityFilters,
setPropertyFilters,
loadNext,
loadPrev,
setDateRange,
setDurationFilter,
enableFilter,
} = useActions(sessionRecordingsTableLogicInstance)
const { preflight } = useValues(preflightLogic)
const columns: LemonTableColumns<SessionRecordingType> = [
{
title: 'Start time',
render: function RenderStartTime(_: any, sessionRecording: SessionRecordingType) {
return <TZLabel time={sessionRecording.start_time} formatString="MMMM DD, YYYY h:mm" />
},
},
{
title: 'Duration',
render: function RenderDuration(_: any, sessionRecording: SessionRecordingType) {
return <span>{humanFriendlyDuration(sessionRecording.recording_duration)}</span>
},
},
{
title: 'Person',
key: 'person',
render: function RenderPersonLink(_: any, sessionRecording: SessionRecordingType) {
return <PersonHeader withIcon person={sessionRecording.person} />
},
},
{
render: function RenderPlayButton(_: any, sessionRecording: SessionRecordingType) {
return (
<div className="play-button-container">
<Button
className={sessionRecording.viewed ? 'play-button viewed' : 'play-button'}
data-attr="session-recordings-button"
icon={<PlayCircleOutlined />}
>
Watch recording
</Button>
</div>
)
},
},
]
return (
<div className="session-recordings-table" data-attr="session-recordings-table">
<Row className="filter-row">
<div className="filter-container" style={{ display: showFilters ? undefined : 'none' }}>
<div>
<Typography.Text strong>
{`Filter by events and actions `}
<Tooltip title="Show recordings where all of the events or actions listed below happen.">
<InfoCircleOutlined className="info-icon" />
</Tooltip>
</Typography.Text>
<ActionFilter
fullWidth={true}
filters={entityFilters}
setFilters={(payload) => {
setEntityFilters(payload)
}}
typeKey={isPersonPage ? `person-${personUUID}` : 'session-recordings'}
hideMathSelector={true}
buttonCopy="Add another filter"
horizontalUI
stripeActionRow={false}
propertyFilterWrapperClassName="session-recording-action-property-filter"
customRowPrefix=""
hideRename
showOr
renderRow={(props) => <FilterRow {...props} />}
showNestedArrow={false}
actionsTaxonomicGroupTypes={[
TaxonomicFilterGroupType.Actions,
TaxonomicFilterGroupType.Events,
]}
propertiesTaxonomicGroupTypes={[
TaxonomicFilterGroupType.EventProperties,
TaxonomicFilterGroupType.Elements,
]}
/>
</div>
{!isPersonPage && preflight?.is_clickhouse_enabled && (
<div className="mt-2">
<Typography.Text strong>
{`Filter by persons and cohorts `}
<Tooltip title="Show recordings by persons who match the set criteria">
<InfoCircleOutlined className="info-icon" />
</Tooltip>
</Typography.Text>
<PropertyFilters
popoverPlacement="bottomRight"
pageKey={isPersonPage ? `person-${personUUID}` : 'session-recordings'}
taxonomicGroupTypes={[
TaxonomicFilterGroupType.PersonProperties,
TaxonomicFilterGroupType.Cohorts,
]}
propertyFilters={propertyFilters}
onChange={(properties) => {
setPropertyFilters(properties)
}}
/>
</div>
)}
</div>
<Button
style={{ display: showFilters ? 'none' : undefined }}
onClick={() => {
enableFilter()
if (isPersonPage) {
const entityFilterButtons = document.querySelectorAll('.entity-filter-row button')
if (entityFilterButtons.length > 0) {
;(entityFilterButtons[0] as HTMLElement).click()
}
}
}}
>
<FilterOutlined /> Filter recordings
</Button>
<Row className="time-filter-row">
<Row className="time-filter">
<DateFilter
makeLabel={(key) => (
<>
<CalendarOutlined />
<span> {key}</span>
</>
)}
defaultValue="Last 7 days"
bordered={true}
dateFrom={fromDate ?? undefined}
dateTo={toDate ?? undefined}
onChange={(changedDateFrom, changedDateTo) => {
setDateRange(changedDateFrom, changedDateTo)
}}
dateOptions={{
Custom: { values: [] },
'Last 24 hours': { values: ['-24h'] },
'Last 7 days': { values: ['-7d'] },
'Last 21 days': { values: ['-21d'] },
}}
/>
</Row>
<Row className="time-filter">
<Typography.Text className="filter-label">Duration</Typography.Text>
<DurationFilter
onChange={(newFilter) => {
setDurationFilter(newFilter)
}}
initialFilter={durationFilter}
pageKey={isPersonPage ? `person-${personUUID}` : 'session-recordings'}
/>
</Row>
</Row>
</Row>
<LemonTable
dataSource={sessionRecordings}
columns={columns}
loading={sessionRecordingsResponseLoading}
onRow={(sessionRecording) => ({
onClick: (e) => {
// Lets the link to the person open the person's page and not the session recording
if (!(e.target as HTMLElement).closest('a')) {
openSessionPlayer(sessionRecording.id, RecordingWatchedSource.RecordingsList)
}
},
})}
rowClassName="cursor-pointer"
data-attr="session-recording-table"
/>
{(hasPrev || hasNext) && (
<Row className="pagination-control">
<Button
type="link"
disabled={!hasPrev}
onClick={() => {
loadPrev()
window.scrollTo(0, 0)
}}
>
<LeftOutlined /> Previous
</Button>
<Button
type="link"
disabled={!hasNext}
onClick={() => {
loadNext()
window.scrollTo(0, 0)
}}
>
Next <RightOutlined />
</Button>
</Row>
)}
<div style={{ marginBottom: 64 }} />
{!!sessionRecordingId && <SessionPlayerDrawer isPersonPage={isPersonPage} onClose={closeSessionPlayer} />}
</div>
)
}
Example #13
Source File: index.tsx From nanolooker with MIT License | 4 votes |
AppHeader: React.FC = () => {
const { t } = useTranslation();
const [activeMenu, setActiveMenu] = React.useState<string>("");
const history = useHistory();
const { pathname } = useLocation();
React.useEffect(() => {
const key = pathname.replace(/\/?([^/]+)/, "$1");
setActiveMenu(key);
}, [pathname]);
return (
<>
<Header
className="app-header"
style={{
paddingTop: "6px",
position: "relative",
width: "100%",
height: "auto",
}}
>
<Row style={{ alignItems: "center" }}>
<Col
xs={6}
md={4}
order={1}
style={{
display: "flex",
alignItems: "center",
minHeight: "50px",
}}
>
<Link to="/" style={{ whiteSpace: "nowrap", marginRight: "10px" }}>
NanoLooker
</Link>
</Col>
<Col xs={{ span: 24, order: 3 }} md={{ span: 12, order: 2 }}>
<Menu
onClick={() => {}}
selectedKeys={[activeMenu]}
mode="horizontal"
>
<SubMenu
key="explore-submenu"
title={
<span onClick={() => history.push("/")}>
<ApartmentOutlined />
{t("menu.explore")}
</span>
}
>
<Menu.Item key="representatives">
{t("menu.representatives")}
<Link to="/representatives" />
</Menu.Item>
<Menu.Item key="developer-fund">
{t("menu.developerFund")}
<Link to="/developer-fund" />
</Menu.Item>
<Menu.Item key="known-accounts">
{t("menu.knownAccounts")}
<Link to="/known-accounts" />
</Menu.Item>
<Menu.Item key="large-transactions">
{t("menu.largeTransactions")}
<Link to="/large-transactions" />
</Menu.Item>
<Menu.Item key="distribution">
{t("menu.distribution")}
<Link to="/distribution" />
</Menu.Item>
<Menu.Item key="exchange-tracker">
{t("menu.exchangeTracker")}
<Link to="/exchange-tracker" />
</Menu.Item>
<Menu.Item key="faucets">
{t("menu.faucets")}
<Link to="/faucets" />
</Menu.Item>
</SubMenu>
<Menu.Item key="news">
<CalendarOutlined />
{t("menu.news")}
<Link to="/news" />
</Menu.Item>
<SubMenu
key="status-submenu"
title={
<>
<DatabaseOutlined />
{t("menu.status")}
</>
}
>
<Menu.Item key="node-status">
{t("menu.nodeStatus")}
<Link to="/node-status" />
</Menu.Item>
<Menu.Item key="network-status">
{t("menu.networkStatus")}
<Link to="/network-status" />
</Menu.Item>
</SubMenu>
</Menu>
</Col>
<Col
xs={{ span: 18, order: 2 }}
md={{ span: 8, order: 3 }}
style={{ textAlign: "right" }}
>
<Search />
</Col>
</Row>
</Header>
<div
className="app-sub-header"
style={{
display: "flex",
justifyContent: "space-between",
}}
>
<div
className="price-list"
style={{
display: "flex",
flexWrap: "wrap",
alignItems: "center",
width: "100%",
marginRight: "12px",
}}
>
<Price />
</div>
<div>
<Preferences />
</div>
</div>
</>
);
}
Example #14
Source File: ChartDraggableSourceContainer.tsx From datart with Apache License 2.0 | 4 votes |
ChartDraggableSourceContainer: FC<
{
availableSourceFunctions?: string[];
onDeleteComputedField?: (fieldName) => void;
onEditComputedField?: (fieldName) => void;
onSelectionChange?: (dataItemId, cmdKeyActive, shiftKeyActive) => void;
onClearCheckedList?: () => void;
} & ChartDataViewMeta
> = memo(function ChartDraggableSourceContainer({
id,
name: colName,
type,
subType,
category,
expression,
selectedItems,
isActive,
availableSourceFunctions,
role,
children,
onDeleteComputedField,
onEditComputedField,
onSelectionChange,
onClearCheckedList,
}) {
const t = useI18NPrefix(`viz.workbench.dataview`);
const [showChild, setShowChild] = useToggle(false);
const isHierarchyField = role === ColumnRole.Hierarchy;
const [, drag] = useDrag(
() => ({
type: isHierarchyField
? CHART_DRAG_ELEMENT_TYPE.DATASET_COLUMN_GROUP
: CHART_DRAG_ELEMENT_TYPE.DATASET_COLUMN,
canDrag: true,
item: selectedItems?.length
? selectedItems.map(item => buildDragItem(item))
: buildDragItem({ id: colName, type, subType, category }, children),
collect: monitor => ({
isDragging: monitor.isDragging(),
}),
end: onClearCheckedList,
}),
[selectedItems],
);
const styleClasses: Array<string> = useMemo(() => {
let styleArr: Array<string> = [];
if (isActive) {
styleArr.push('container-active');
}
return styleArr;
}, [isActive]);
const renderContent = useMemo(() => {
const _handleMenuClick = (e, fieldName) => {
if (e.key === 'delete') {
onDeleteComputedField?.(fieldName);
} else {
onEditComputedField?.(fieldName);
}
};
const _isAllowMoreAction = () => {
return (
ChartDataViewFieldCategory.Field === category ||
ChartDataViewFieldCategory.Hierarchy === category
);
};
const _getIconStyle = () => {
if (role === ColumnRole.Hierarchy) {
return WARNING;
}
if (
ChartDataViewFieldCategory.ComputedField === category ||
ChartDataViewFieldCategory.AggregateComputedField === category
) {
return WARNING;
} else {
switch (type) {
case DataViewFieldType.NUMERIC:
return SUCCESS;
default:
return INFO;
}
}
};
const _getExtraActionMenus = () => {
return (
<Menu onClick={e => _handleMenuClick(e, colName)}>
<Menu.Item key="edit">{t('editField')}</Menu.Item>
<Menu.Item key="delete">{t('deleteField')}</Menu.Item>
</Menu>
);
};
let icon = <FileUnknownOutlined />;
const props = {
style: {
alignSelf: 'center',
color: _getIconStyle(),
},
};
if (role === ColumnRole.Hierarchy) {
if (!showChild) {
icon = (
<FolderAddOutlined
{...props}
onClick={() => {
setShowChild(!showChild);
}}
/>
);
} else {
icon = (
<FolderOpenOutlined
{...props}
onClick={() => {
setShowChild(!showChild);
}}
/>
);
}
} else {
switch (type) {
case DataViewFieldType.STRING:
icon = <FieldStringOutlined {...props} />;
break;
case DataViewFieldType.NUMERIC:
icon = <NumberOutlined {...props} />;
break;
case DataViewFieldType.DATE:
icon = <CalendarOutlined {...props} />;
break;
default:
icon = <FileUnknownOutlined {...props} />;
}
}
return type === 'DATE' && category === 'field' ? (
<Row align="middle" style={{ width: '100%' }}>
<CollapseWrapper
defaultActiveKey={[colName]}
ghost
expandIconPosition="right"
expandIcon={({ isActive }) => {
return <DownOutlined rotate={isActive ? -180 : 0} />;
}}
>
<Panel
key={colName}
header={
<div ref={drag}>
<IW fontSize={FONT_SIZE_HEADING}>{icon}</IW>
<p>{colName}</p>
</div>
}
>
{DATE_LEVELS.map((item, i) => {
if (availableSourceFunctions?.includes(item.expression)) {
return (
<DateLevelFieldContainer
colName={colName}
key={i}
item={item}
onClearCheckedList={onClearCheckedList}
/>
);
}
return null;
})}
</Panel>
</CollapseWrapper>
</Row>
) : (
<Row align="middle" style={{ width: '100%' }}>
<IW fontSize={FONT_SIZE_HEADING}>{icon}</IW>
<StyledFieldContent>{colName}</StyledFieldContent>
<div onClick={stopPPG}>
<Dropdown
disabled={_isAllowMoreAction()}
overlay={_getExtraActionMenus()}
trigger={['click']}
>
<ToolbarButton
icon={<MoreOutlined />}
iconSize={FONT_SIZE_BASE}
className="setting"
onClick={e => e.preventDefault()}
/>
</Dropdown>
</div>
</Row>
);
}, [
type,
role,
colName,
showChild,
setShowChild,
onDeleteComputedField,
onEditComputedField,
category,
t,
onClearCheckedList,
drag,
availableSourceFunctions,
]);
const renderChildren = useMemo(() => {
return (children || []).map(item => (
<ChartDraggableSourceContainer
key={item.id}
id={item.id}
name={item.id}
category={item.category}
expression={item.expression}
type={item.type}
role={item.role}
children={item.children}
onDeleteComputedField={onDeleteComputedField}
onClearCheckedList={onClearCheckedList}
selectedItems={selectedItems}
/>
));
}, [children, onDeleteComputedField, onClearCheckedList, selectedItems]);
return (
<Container
flexDirection={children ? 'column' : 'row'}
onClick={e => {
if (isHierarchyField) {
return;
}
onSelectionChange?.(colName, e.metaKey || e.ctrlKey, e.shiftKey);
}}
ref={type === 'DATE' && category === 'field' ? null : drag}
className={
type === 'DATE' && category === 'field' ? '' : styleClasses.join(' ')
}
>
{renderContent}
{showChild && renderChildren}
</Container>
);
})
Example #15
Source File: DataModelNode.tsx From datart with Apache License 2.0 | 4 votes |
DataModelNode: FC<{
node: Column;
className?: string;
onNodeTypeChange: (type: any, name: string) => void;
onMoveToHierarchy: (node: Column) => void;
onCreateHierarchy?: (node: Column) => void;
onDeleteFromHierarchy?: (node: Column) => void;
}> = memo(
({
node,
className,
onCreateHierarchy,
onMoveToHierarchy,
onNodeTypeChange,
onDeleteFromHierarchy,
}) => {
const t = useI18NPrefix('view.model');
const tg = useI18NPrefix('global');
const [isHover, setIsHover] = useState(false);
const hasCategory = true;
const renderNode = (node, isDragging) => {
let icon;
switch (node.type) {
case DataViewFieldType.NUMERIC:
icon = (
<NumberOutlined style={{ alignSelf: 'center', color: SUCCESS }} />
);
break;
case DataViewFieldType.STRING:
icon = (
<FieldStringOutlined style={{ alignSelf: 'center', color: INFO }} />
);
break;
case DataViewFieldType.DATE:
icon = (
<CalendarOutlined style={{ alignSelf: 'center', color: INFO }} />
);
break;
default:
icon = (
<FileUnknownOutlined
style={{ alignSelf: 'center', color: WARNING }}
/>
);
break;
}
const isAllowCreateHierarchy = node => {
return ALLOW_COMBINE_COLUMN_TYPES.includes(node.type);
};
return (
<div
className="content"
onMouseEnter={() => {
setIsHover(true);
}}
onMouseLeave={() => {
setIsHover(false);
}}
>
<Dropdown
trigger={['click']}
overlay={
<Menu
selectedKeys={[node.type, `category-${node.category}`]}
className="datart-schema-table-header-menu"
onClick={({ key }) => onNodeTypeChange(key, node?.name)}
>
{Object.values(DataViewFieldType).map(t => (
<Menu.Item key={t}>
{tg(`columnType.${t.toLowerCase()}`)}
</Menu.Item>
))}
{hasCategory && (
<>
<Menu.Divider />
<Menu.SubMenu
key="categories"
title={t('category')}
popupClassName="datart-schema-table-header-menu"
>
{Object.values(ColumnCategories).map(t => (
<Menu.Item key={`category-${t}`}>
{tg(`columnCategory.${t.toLowerCase()}`)}
</Menu.Item>
))}
</Menu.SubMenu>
</>
)}
</Menu>
}
>
<Tooltip
title={hasCategory ? t('typeAndCategory') : t('category')}
placement="left"
>
<StyledIW fontSize={FONT_SIZE_TITLE}>{icon}</StyledIW>
</Tooltip>
</Dropdown>
<span>{node.name}</span>
<div className="action">
{isHover &&
!isDragging &&
isAllowCreateHierarchy(node) &&
onCreateHierarchy && (
<Tooltip title={t('newHierarchy')}>
<Button
type="link"
onClick={() => onCreateHierarchy(node)}
icon={<BranchesOutlined />}
/>
</Tooltip>
)}
{isHover && !isDragging && isAllowCreateHierarchy(node) && (
<Tooltip title={t('addToHierarchy')}>
<Button
type="link"
onClick={() => onMoveToHierarchy(node)}
icon={<SisternodeOutlined />}
/>
</Tooltip>
)}
{isHover && !isDragging && onDeleteFromHierarchy && (
<Tooltip title={t('delete')}>
<Button
type="link"
onClick={() => onDeleteFromHierarchy(node)}
icon={<DeleteOutlined />}
/>
</Tooltip>
)}
</div>
</div>
);
};
return (
<Draggable key={node?.name} draggableId={node?.name} index={node?.index}>
{(draggableProvided, draggableSnapshot) => (
<StyledDataModelNode
isDragging={draggableSnapshot.isDragging}
className={className}
style={draggableProvided.draggableProps.style}
ref={draggableProvided.innerRef}
{...draggableProvided.draggableProps}
{...draggableProvided.dragHandleProps}
>
{renderNode(node, draggableSnapshot.isDragging)}
</StyledDataModelNode>
)}
</Draggable>
);
},
)
Example #16
Source File: Resource.tsx From datart with Apache License 2.0 | 4 votes |
Resource = memo(() => {
const t = useI18NPrefix('view.resource');
const dispatch = useDispatch();
const { editorCompletionItemProviderRef } = useContext(EditorContext);
const isDatabaseSchemaLoading = useSelector(selectDatabaseSchemaLoading);
const sourceId = useSelector<RootState>(state =>
selectCurrentEditingViewAttr(state, { name: 'sourceId' }),
) as string;
const databaseSchemas = useSelector(state =>
selectSourceDatabaseSchemas(state, { id: sourceId }),
);
const { height, ref: treeWrapperRef } = useResizeObserver({
refreshMode: 'debounce',
refreshRate: 200,
});
const buildTableNode = useCallback((database: DatabaseSchema) => {
const children =
database?.tables?.map(table => {
return buildTableColumnNode([database.dbName], table);
}) || [];
return buildAntdTreeNodeModel([], database.dbName, children, false);
}, []);
const buildTableColumnNode = (ancestors: string[] = [], table) => {
const children =
table?.columns?.map(column => {
return buildAntdTreeNodeModel(
ancestors.concat(table.tableName),
column?.name,
[],
true,
);
}) || [];
return buildAntdTreeNodeModel(ancestors, table.tableName, children, false);
};
const databaseTreeModel = useMemo(() => {
return (databaseSchemas || []).map(buildTableNode);
}, [buildTableNode, databaseSchemas]);
const { filteredData, onExpand, debouncedSearch, expandedRowKeys } =
useSearchAndExpand(
databaseTreeModel,
(keywords, data) => (data.title as string).includes(keywords),
DEFAULT_DEBOUNCE_WAIT,
true,
);
useEffect(() => {
if (databaseTreeModel && editorCompletionItemProviderRef) {
editorCompletionItemProviderRef.current?.dispose();
dispatch(
getEditorProvideCompletionItems({
sourceId,
resolve: getItem => {
editorCompletionItemProviderRef.current =
monaco.languages.registerCompletionItemProvider('sql', {
provideCompletionItems: getItem,
});
},
}),
);
}
}, [dispatch, sourceId, databaseTreeModel, editorCompletionItemProviderRef]);
const renderIcon = useCallback(({ value }) => {
if (Array.isArray(value)) {
switch (value.length) {
case 1:
return <DatabaseOutlined />;
case 2:
return <TableOutlined />;
}
} else {
switch (value.type as DataViewFieldType) {
case DataViewFieldType.STRING:
return <FieldStringOutlined />;
case DataViewFieldType.NUMERIC:
return <FieldNumberOutlined />;
case DataViewFieldType.DATE:
return <CalendarOutlined />;
}
}
}, []);
return (
<Container title="reference">
<Searchbar>
<Col span={24}>
<Input
prefix={<SearchOutlined className="icon" />}
placeholder={t('search')}
className="input"
bordered={false}
onChange={debouncedSearch}
/>
</Col>
</Searchbar>
<TreeWrapper ref={treeWrapperRef}>
<Tree
className="medium"
treeData={filteredData}
loading={isDatabaseSchemaLoading}
icon={renderIcon}
selectable={false}
defaultExpandedKeys={expandedRowKeys}
height={height}
onExpand={onExpand}
/>
</TreeWrapper>
</Container>
);
})
Example #17
Source File: Dashboard.tsx From posthog-foss with MIT License | 4 votes |
function DashboardView(): JSX.Element {
const {
dashboard,
allItemsLoading: loadingFirstTime,
items,
filters: dashboardFilters,
dashboardMode,
receivedErrorsFromAPI,
} = useValues(dashboardLogic)
const { dashboardsLoading } = useValues(dashboardsModel)
const { setDashboardMode, addGraph, setDates } = useActions(dashboardLogic)
useKeyboardHotkeys(
dashboardMode === DashboardMode.Public || dashboardMode === DashboardMode.Internal
? {}
: {
e: {
action: () =>
setDashboardMode(
dashboardMode === DashboardMode.Edit ? null : DashboardMode.Edit,
DashboardEventSource.Hotkey
),
disabled: dashboardMode !== null && dashboardMode !== DashboardMode.Edit,
},
f: {
action: () =>
setDashboardMode(
dashboardMode === DashboardMode.Fullscreen ? null : DashboardMode.Fullscreen,
DashboardEventSource.Hotkey
),
disabled: dashboardMode !== null && dashboardMode !== DashboardMode.Fullscreen,
},
k: {
action: () =>
setDashboardMode(
dashboardMode === DashboardMode.Sharing ? null : DashboardMode.Sharing,
DashboardEventSource.Hotkey
),
disabled: dashboardMode !== null && dashboardMode !== DashboardMode.Sharing,
},
n: {
action: () => addGraph(),
disabled: dashboardMode !== null && dashboardMode !== DashboardMode.Edit,
},
escape: {
// Exit edit mode with Esc. Full screen mode is also exited with Esc, but this behavior is native to the browser.
action: () => setDashboardMode(null, DashboardEventSource.Hotkey),
disabled: dashboardMode !== DashboardMode.Edit,
},
},
[setDashboardMode, dashboardMode]
)
if (dashboardsLoading || loadingFirstTime) {
return <SceneLoading />
}
if (!dashboard) {
return <NotFound object="dashboard" />
}
return (
<div className="dashboard">
{dashboardMode !== DashboardMode.Public && dashboardMode !== DashboardMode.Internal && <DashboardHeader />}
{receivedErrorsFromAPI ? (
<InsightErrorState title={'There was an error loading this dashboard'} />
) : !items || items.length === 0 ? (
<EmptyDashboardComponent />
) : (
<div>
<div className="dashboard-items-actions">
<div
className="left-item"
style={dashboardMode === DashboardMode.Public ? { textAlign: 'right' } : undefined}
>
{dashboardMode === DashboardMode.Public ? <LastRefreshText /> : <DashboardReloadAction />}
</div>
{dashboardMode !== DashboardMode.Public && (
<div
className="right-item"
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end',
}}
>
<TZIndicator style={{ marginRight: 8, fontWeight: 'bold' }} />
<DateFilter
defaultValue="Custom"
showCustom
dateFrom={dashboardFilters?.date_from ?? undefined}
dateTo={dashboardFilters?.date_to ?? undefined}
onChange={setDates}
makeLabel={(key) => (
<>
<CalendarOutlined />
<span className="hide-when-small"> {key}</span>
</>
)}
/>
</div>
)}
</div>
<DashboardItems />
</div>
)}
</div>
)
}