diff options
Diffstat (limited to 'src/client/views/nodes/TaskManagerTask.tsx')
-rw-r--r-- | src/client/views/nodes/TaskManagerTask.tsx | 301 |
1 files changed, 0 insertions, 301 deletions
diff --git a/src/client/views/nodes/TaskManagerTask.tsx b/src/client/views/nodes/TaskManagerTask.tsx deleted file mode 100644 index 913c46bfb..000000000 --- a/src/client/views/nodes/TaskManagerTask.tsx +++ /dev/null @@ -1,301 +0,0 @@ -import { action, observable, makeObservable, IReactionDisposer, reaction } from 'mobx'; -import { observer } from 'mobx-react'; -import * as React from 'react'; -import { Docs } from '../../documents/Documents'; -import { DocumentType } from '../../documents/DocumentTypes'; -import { FieldView } from './FieldView'; -import { DateField } from '../../../fields/DateField'; -import { Doc } from '../../../fields/Doc'; - -import './TaskManagerTask.scss'; - -interface TaskManagerProps { - Document: Doc; -} - -@observer -export class TaskManagerTask extends React.Component<TaskManagerProps> { - public static LayoutString(fieldStr: string) { - return FieldView.LayoutString(TaskManagerTask, fieldStr); - } - - @action - updateText = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => { - this.props.Document.text = e.target.value; - }; - - @action - updateTitle = (e: React.ChangeEvent<HTMLInputElement>) => { - this.props.Document.title = e.target.value; - }; - - @action - updateAllDay = (e: React.ChangeEvent<HTMLInputElement>) => { - this.props.Document.allDay = e.target.checked; - - if (e.target.checked) { - delete this.props.Document.startTime; - delete this.props.Document.endTime; - } - - this.setTaskDateRange(); - }; - - @action - updateStart = (e: React.ChangeEvent<HTMLInputElement>) => { - const newStart = new Date(e.target.value); - - this.props.Document.startTime = new DateField(newStart); - - const endDate = this.props.Document.endTime instanceof DateField ? this.props.Document.endTime.date : undefined; - if (endDate && newStart > endDate) { - // Alert user - alert('Start time cannot be after end time. End time has been adjusted.'); - - // Fix end time - const adjustedEnd = new Date(newStart.getTime() + 60 * 60 * 1000); - this.props.Document.endTime = new DateField(adjustedEnd); - } - - this.setTaskDateRange(); - }; - - - - @action - updateEnd = (e: React.ChangeEvent<HTMLInputElement>) => { - const newEnd = new Date(e.target.value); - - this.props.Document.endTime = new DateField(newEnd); - - const startDate = this.props.Document.startTime instanceof DateField ? this.props.Document.startTime.date : undefined; - if (startDate && newEnd < startDate) { - // Alert user - alert('End time cannot be before start time. Start time has been adjusted.'); - - // Fix start time - const adjustedStart = new Date(newEnd.getTime() - 60 * 60 * 1000); - this.props.Document.startTime = new DateField(adjustedStart); - } - - this.setTaskDateRange(); - }; - - - - - @action - setTaskDateRange() { - const doc = this.props.Document; - - if (doc.allDay) { - const range = typeof doc.date_range === 'string' ? doc.date_range.split('|') : []; - const dateStr = range[0] ?? new Date().toISOString().split('T')[0]; // default to today - - doc.date_range = `${dateStr}|${dateStr}`; - doc.allDay = true; - } else { - const startField = doc.startTime; - const endField = doc.endTime; - const startDate = startField instanceof DateField ? startField.date : null; - const endDate = endField instanceof DateField ? endField.date : null; - - if (startDate && endDate && !isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) { - doc.date_range = `${startDate.toISOString()}|${endDate.toISOString()}`; - doc.allDay = false; - } - } - } - - - - - @action - toggleComplete = (e: React.ChangeEvent<HTMLInputElement>) => { - this.props.Document.completed = e.target.checked; - }; - - constructor(props: TaskManagerProps) { - super(props); - makeObservable(this); - } - - _heightDisposer?: IReactionDisposer; - _widthDisposer?: IReactionDisposer; - - componentDidMount() { - this.setTaskDateRange(); - - const doc = this.props.Document; - this._heightDisposer = reaction( - () => Number(doc._height), - height => { - const minHeight = Number(doc.height_min ?? 0); - if (!isNaN(height) && height < minHeight) { - doc._height = minHeight; - } - } - ); - - this._widthDisposer = reaction( - () => Number(doc._width), - width => { - const minWidth = Number(doc.width_min ?? 0); - if (!isNaN(width) && width < minWidth) { - doc._width = minWidth; - } - } - ); - } - - componentWillUnmount() { - this._heightDisposer?.(); - this._widthDisposer?.(); - } - - render() { - - function toLocalDateTimeString(date: Date): string { - const pad = (n: number) => n.toString().padStart(2, '0'); - return ( - date.getFullYear() + - '-' + - pad(date.getMonth() + 1) + - '-' + - pad(date.getDate()) + - 'T' + - pad(date.getHours()) + - ':' + - pad(date.getMinutes()) - ); - } - - const doc = this.props.Document; - - const taskDesc = typeof doc.text === 'string' ? doc.text : ''; - const taskTitle = typeof doc.title === 'string' ? doc.title : ''; - const allDay = !!doc.allDay; - const isCompleted = !!this.props.Document.completed; - - const startTime = doc.startTime instanceof DateField && doc.startTime.date instanceof Date - ? toLocalDateTimeString(doc.startTime.date) - : ''; - - const endTime = doc.endTime instanceof DateField && doc.endTime.date instanceof Date - ? toLocalDateTimeString(doc.endTime.date) - : ''; - - - - return ( - <div className="task-manager-container"> - <input - className="task-manager-title" - type="text" - placeholder="Task Title" - value={taskTitle} - onChange={this.updateTitle} - disabled={isCompleted} - style={{opacity: isCompleted ? 0.7 : 1,}} - /> - - <textarea - className="task-manager-description" - placeholder="What’s your task?" - value={taskDesc} - onChange={this.updateText} - disabled={isCompleted} - style={{opacity: isCompleted ? 0.7 : 1,}} - /> - - <div className="task-manager-checkboxes"> - - <label className="task-manager-allday" style={{opacity: isCompleted ? 0.7 : 1,}}> - <input - type="checkbox" - checked={allDay} - onChange={this.updateAllDay} - disabled={isCompleted} - /> - All day - - {allDay && ( - <input - type="date" - value={(() => { - const rawRange = doc.date_range; - if (typeof rawRange !== 'string') return ''; - const datePart = rawRange.split('|')[0]; - if (!datePart) return ''; - const d = new Date(datePart); - return !isNaN(d.getTime()) ? d.toISOString().split('T')[0] : ''; - })()} - onChange={e => { - const newDate = new Date(e.target.value); - if (!isNaN(newDate.getTime())) { - const dateStr = e.target.value; - if (dateStr) { - doc.date_range = `${dateStr}T00:00:00|${dateStr}T00:00:00`; - } - } - }} - disabled={isCompleted} - style={{ marginLeft: '8px' }} - /> - )} - </label> - - <label className="task-manager-complete"> - <input type="checkbox" checked={isCompleted} onChange={this.toggleComplete} /> - Complete - </label> - - </div> - - {!allDay && ( - <div - className="task-manager-times" - style={{ opacity: isCompleted ? 0.7 : 1 }} - > - <label> - Start: - <input - type="datetime-local" - value={startTime} - onChange={this.updateStart} - disabled={isCompleted} - /> - </label> - <label> - End: - <input - type="datetime-local" - value={endTime} - onChange={this.updateEnd} - disabled={isCompleted} - /> - </label> - </div> - )} - </div> - ); - } -} - -Docs.Prototypes.TemplateMap.set(DocumentType.TASK, { - layout: { view: TaskManagerTask, dataField: 'text' }, - options: { - acl: '', - _height: 35, - _xMargin: 10, - _yMargin: 10, - _layout_autoHeight: true, - _layout_nativeDimEditable: true, - _layout_reflowVertical: true, - _layout_reflowHorizontal: true, - defaultDoubleClick: 'ignore', - systemIcon: 'BsCheckSquare', - height_min: 300, - width_min: 300 - }, -}); |