import React from 'react';
import { Node as PMNode } from 'prosemirror-model';
import { EditorState, Transaction } from 'prosemirror-state';
import styled from 'styled-components';
import {
decisionItem,
decisionList,
taskItem,
taskList,
} from '@atlaskit/adf-schema';
import { EditorPlugin } from '../../types';
import { INPUT_METHOD } from '../analytics';
import { messages as insertBlockMessages } from '../insert-block/ui/ToolbarInsertBlock/messages';
import { IconAction, IconDecision } from '../quick-insert/assets';
import { getListTypes, insertTaskDecisionWithAnalytics } from './commands';
import inputRulePlugin from './pm-plugins/input-rules';
import keymap from './pm-plugins/keymaps';
import { createPlugin } from './pm-plugins/main';
import { TaskDecisionListType, TaskDecisionPluginOptions } from './types';
import ToolbarDecision from './ui/ToolbarDecision';
import ToolbarTask from './ui/ToolbarTask';
const TaskDecisionToolbarGroup = styled.div`
display: flex;
`;
const quickInsertItem = (
insert: (node: PMNode) => Transaction,
state: EditorState,
listType: TaskDecisionListType,
): Transaction => {
const { list, item } = getListTypes(listType, state.schema);
const addItem = ({
listLocalId,
itemLocalId,
}: {
listLocalId?: string;
itemLocalId?: string;
}) =>
insert(
list.createChecked(
{ localId: listLocalId },
item.createChecked({
localId: itemLocalId,
}),
),
);
return insertTaskDecisionWithAnalytics(
state,
listType,
INPUT_METHOD.QUICK_INSERT,
addItem,
) as Transaction;
};
const tasksAndDecisionsPlugin = ({
allowNestedTasks,
consumeTabs,
useLongPressSelection,
}: TaskDecisionPluginOptions = {}): EditorPlugin => ({
name: 'taskDecision',
nodes() {
return [
{ name: 'decisionList', node: decisionList },
{ name: 'decisionItem', node: decisionItem },
{
name: 'taskList',
node: taskList,
},
{ name: 'taskItem', node: taskItem },
];
},
pmPlugins() {
return [
{
name: 'tasksAndDecisions',
plugin: ({
portalProviderAPI,
providerFactory,
eventDispatcher,
dispatch,
}) => {
return createPlugin(
portalProviderAPI,
eventDispatcher,
providerFactory,
dispatch,
useLongPressSelection,
);
},
},
{
name: 'tasksAndDecisionsInputRule',
plugin: ({ schema, featureFlags }) =>
inputRulePlugin(schema, featureFlags),
},
{
name: 'tasksAndDecisionsKeyMap',
plugin: ({ schema }) => keymap(schema, allowNestedTasks, consumeTabs),
}, // Needs to be after "save-on-enter"
];
},
secondaryToolbarComponent({ editorView, disabled }) {
return (
);
},
pluginsOptions: {
quickInsert: ({ formatMessage }) => [
{
id: 'action',
title: formatMessage(insertBlockMessages.action),
description: formatMessage(insertBlockMessages.actionDescription),
priority: 100,
keywords: ['checkbox', 'task', 'todo'],
keyshortcut: '[]',
icon: () => ,
action(insert, state) {
return quickInsertItem(insert, state, 'taskList');
},
},
{
id: 'decision',
title: formatMessage(insertBlockMessages.decision),
description: formatMessage(insertBlockMessages.decisionDescription),
priority: 900,
keyshortcut: '<>',
icon: () => ,
action(insert, state) {
return quickInsertItem(insert, state, 'decisionList');
},
},
],
},
});
export default tasksAndDecisionsPlugin;