import classnames from 'classnames' import React, { Fragment, useState } from 'react' import { __ } from '@wordpress/i18n' import { humanTimeDiff } from '@wordpress/date' import { RawHTML } from '@wordpress/element' import { useSnippetsAPI } from '../../../hooks/useSnippetsAPI' import { useSnippetsList } from '../../../hooks/useSnippetsList' import { handleUnknownError } from '../../../utils/errors' import { downloadSnippetExportFile } from '../../../utils/files' import { isNetworkAdmin } from '../../../utils/screen' import { cloneSnippetObject, getSnippetDisplayName, getSnippetEditUrl, getSnippetType } from '../../../utils/snippets/snippets' import { buildUrl } from '../../../utils/urls' import { Badge } from '../../common/Badge' import { Button } from '../../common/Button' import { DeleteButton } from '../../common/DeleteButton' import { Tooltip } from '../../common/Tooltip' import { useSnippetsFilters } from './WithSnippetsTableFilters' import { useFilteredSnippets } from './WithFilteredSnippetsContext' import type { Key, ReactNode } from 'react' import type { Snippet } from '../../../types/Snippet' import type { ListTableColumn } from '../../common/ListTable' interface ColumnProps { snippet: Snippet } const RunOnceButton: React.FC = ({ snippet }) => {__('Run Once', 'code-snippets')} const ActivationSwitch: React.FC = ({ snippet }) => { const { activate, deactivate } = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() const actionText = snippet.network && !snippet.shared_network ? snippet.active ? __('Network Deactivate', 'code-snippets') : __('Network Activate', 'code-snippets') : snippet.active ? __('Deactivate', 'code-snippets') : __('Activate', 'code-snippets') return ( { (snippet.active ? deactivate(snippet) : activate(snippet)) .then(refreshSnippetsList) .catch(handleUnknownError) }} /> ) } const ActivateColumn: React.FC = ({ snippet }) => { const { activeByCondition } = useFilteredSnippets() if (snippet.trashed) { return '' } switch (snippet.scope) { case 'single-use': return case 'condition': return ( {activeByCondition.get(snippet.id)?.length ?? 0} ) default: return } } const ActionLinks = ({ snippet }: { snippet: Snippet }) => { const api = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() const Edit = !snippet.trashed && (() => {snippet.locked ? __('View', 'code-snippets') : __('Edit', 'code-snippets')} ) const Clone = !snippet.trashed && (() => ) const Export = !snippet.trashed && (() => ) const Restore = snippet.trashed && (() => ) const Delete = (!snippet.locked || snippet.trashed) && (() => ) return ( <> {[Edit, Clone, Restore, Export, Delete] .filter(Action => false !== Action) .reduce( (Actions, Action) => null === Actions ? : <>{Actions} | , null)} ) } const RowActions: React.FC = ({ snippet }) => { if (!isNetworkAdmin() && snippet.network && !snippet.shared_network) { return (
{snippet.active ? {__('Network Active', 'code-snippets')} : {__('Network Only', 'code-snippets')}}
) } if (snippet.shared_network && !window.CODE_SNIPPETS_MANAGE?.hasNetworkCap) { return undefined } return (
) } const NameColumn: React.FC = ({ snippet }) => <> {snippet.locked && ( )} {!snippet.trashed && (isNetworkAdmin() || !snippet.network || window.CODE_SNIPPETS_MANAGE?.hasNetworkCap) ? {getSnippetDisplayName(snippet)} : getSnippetDisplayName(snippet)} {snippet.shared_network && {__('Shared on Network', 'code-snippets')}} const TypeColumn: React.FC = ({ snippet }) => { const { setCurrentType } = useSnippetsFilters() const type = getSnippetType(snippet) return ( { event.preventDefault() setCurrentType(type) }} > ) } const TagsColumn: React.FC = ({ snippet }) => snippet.tags.map((tag, index) => {tag} {index < snippet.tags.length - 1 ? ', ' : ''} ) const DateColumn: React.FC = ({ snippet }) => snippet.modified ? : <>— const PriorityColumn: React.FC = ({ snippet }) => { const [value, setValue] = useState(snippet.priority) const snippetsAPI = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() const id = `snippet-${snippet.id}-priority` const handleUpdate = () => { snippetsAPI.update({ ...snippet, priority: value }) .then(response => { if (response.id === snippet.id) { setValue(response.priority) } }) .then(refreshSnippetsList) .catch(handleUnknownError) } return (
{ event.preventDefault() handleUpdate() }}> setValue(Number(event.target.value))} disabled={snippet.locked || snippet.trashed} />
) } const baseTableColumns: ListTableColumn[] = [ { id: 'activate', title: {__('Activate', 'code-snippets')}, render: snippet => }, { id: 'name', title: __('Name', 'code-snippets'), isPrimary: true, sortedValue: snippet => getSnippetDisplayName(snippet).toLowerCase(), render: snippet => }, { id: 'type', title: __('Type', 'code-snippets'), sortedValue: snippet => getSnippetType(snippet), render: snippet => }, { id: 'desc', title: __('Description', 'code-snippets'), render: snippet =>
{snippet.desc}
}, { id: 'tags', title: __('Tags', 'code-snippets'), render: snippet => }, { id: 'date', title: __('Modified', 'code-snippets'), sortedValue: snippet => snippet.modified ? new Date(snippet.modified).toISOString() : '', render: snippet => }, { id: 'priority', title: __('Priority', 'code-snippets'), sortedValue: snippet => snippet.priority, render: snippet => } ] export const getTableColumns = (hiddenColumns: Set): ListTableColumn[] => baseTableColumns.map(column => ({ ...column, isHidden: hiddenColumns.has(column.id) }))