*/
protected $_accessible = [
- 'user_id' => true,
+ 'user_id' => false,
'name' => true,
'slug' => true,
'color' => true,
@@ -60,4 +61,11 @@ public function unarchive()
{
$this->archived = false;
}
+
+ protected function _getColorHex(): string
+ {
+ $colors = Configure::read('Colors');
+
+ return $colors[$this->color]['code'];
+ }
}
diff --git a/src/Model/Entity/Subtask.php b/src/Model/Entity/Subtask.php
index 76acc5c1..4bf76f71 100644
--- a/src/Model/Entity/Subtask.php
+++ b/src/Model/Entity/Subtask.php
@@ -36,8 +36,8 @@ class Subtask extends Entity
'body' => true,
'ranking' => true,
'completed' => true,
- 'created' => true,
- 'modified' => true,
+ 'created' => false,
+ 'modified' => false,
'task' => true,
];
diff --git a/src/Model/Entity/Task.php b/src/Model/Entity/Task.php
index 1af14517..4329d13c 100644
--- a/src/Model/Entity/Task.php
+++ b/src/Model/Entity/Task.php
@@ -6,6 +6,7 @@
use Cake\I18n\FrozenDate;
use Cake\I18n\FrozenTime;
use Cake\ORM\Entity;
+use Exception;
/**
* Task Entity
@@ -24,6 +25,9 @@
* @property \Cake\I18n\FrozenTime|null $created
* @property \Cake\I18n\FrozenTime $modified
*
+ * @property int $subtask_count
+ * @property int $complete_subtask_count
+ *
* @property \App\Model\Entity\Project $project
* @property \App\Model\Entity\Subtask[] $subtasks
* @property \App\Model\Entity\Label[] $labels
@@ -47,13 +51,13 @@ class Task extends Entity
'due_on' => true,
'completed' => true,
'evening' => true,
+ 'subtasks' => true,
'child_order' => false,
'day_order' => false,
'created' => false,
'modified' => false,
'deleted_at' => false,
'project' => false,
- 'subtasks' => false,
'labels' => false,
];
@@ -78,4 +82,27 @@ public function undelete(): void
{
$this->deleted_at = null;
}
+
+ public function setDueOnFromString(?string $value)
+ {
+ if (!$value) {
+ return;
+ }
+ try {
+ $this->due_on = FrozenDate::parse($value);
+ } catch (Exception $e) {
+ $this->setError('due_on', 'Invalid date string.');
+ }
+ }
+
+ public function removeTrailingEmptySubtask()
+ {
+ if (empty($this->subtasks)) {
+ return;
+ }
+ $lastIndex = count($this->subtasks) - 1;
+ if (isset($this->subtasks[$lastIndex]) && trim((string)$this->subtasks[$lastIndex]->title) === '') {
+ unset($this->subtasks[$lastIndex]);
+ }
+ }
}
diff --git a/src/Model/Table/ProjectsTable.php b/src/Model/Table/ProjectsTable.php
index e36ddfbe..49f6d1ec 100644
--- a/src/Model/Table/ProjectsTable.php
+++ b/src/Model/Table/ProjectsTable.php
@@ -181,4 +181,19 @@ public function move(Project $project, array $operation)
]);
$sorter->move($project, $operation['ranking'], $conditions);
}
+
+ /**
+ * Update the ranking on a list of projectids to match the provided order.
+ */
+ public function reorder(array $ids): void
+ {
+ $this->getConnection()->transactional(function () use ($ids) {
+ foreach ($ids as $ranking => $id) {
+ $this->updateQuery()
+ ->set(['ranking' => $ranking])
+ ->where(['id' => $id])
+ ->execute();
+ }
+ });
+ }
}
diff --git a/src/Model/Table/SubtasksTable.php b/src/Model/Table/SubtasksTable.php
index 8b968ac6..ea53429e 100644
--- a/src/Model/Table/SubtasksTable.php
+++ b/src/Model/Table/SubtasksTable.php
@@ -5,6 +5,7 @@
use App\Model\Entity\Subtask;
use Cake\Datasource\EntityInterface;
+use Cake\Event\EventInterface;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
@@ -97,6 +98,13 @@ public function buildRules(RulesChecker $rules): RulesChecker
return $rules;
}
+ public function beforeSave(EventInterface $event, Subtask $subtask)
+ {
+ if ($subtask->ranking === null) {
+ $subtask->ranking = $this->getNextRanking($subtask->task_id);
+ }
+ }
+
public function getNextRanking(int $todoId)
{
$query = $this->find();
diff --git a/src/Model/Table/TasksTable.php b/src/Model/Table/TasksTable.php
index e591a8b3..a6f8dc80 100644
--- a/src/Model/Table/TasksTable.php
+++ b/src/Model/Table/TasksTable.php
@@ -5,8 +5,11 @@
use App\Model\Entity\Task;
use App\Model\Entity\User;
+use ArrayObject;
use Cake\Datasource\EntityInterface;
+use Cake\Event\EventInterface;
use Cake\I18n\FrozenDate;
+use Cake\ORM\Association\HasMany;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
@@ -68,6 +71,7 @@ public function initialize(array $config): void
'Subtasks.ranking' => 'ASC',
'Subtasks.title' => 'ASC',
],
+ 'saveStrategy' => HasMany::SAVE_REPLACE,
]);
$this->belongsToMany('Labels', [
'propertyName' => 'labels',
@@ -426,4 +430,18 @@ protected function validateMoveOperation(array $operation)
throw new InvalidArgumentException('section_id must be a number or ""');
}
}
+
+ public function beforeSave(EventInterface $event, Task $task, ArrayObject $options)
+ {
+ if ($task->isDirty('subtasks') && count($task->subtasks)) {
+ // Force a dirty field so that counter cache always runs.
+ // This isn't ideal but it works for now
+ $task->subtasks[0]->setDirty('title');
+ }
+ if ($task->id && $task->isDirty('subtasks') && empty($task->subtasks)) {
+ $this->Subtasks->deleteAll(['task_id' => $task->id]);
+ $task->subtask_count = 0;
+ $task->complete_subtask_count = 0;
+ }
+ }
}
diff --git a/src/Model/Table/UsersTable.php b/src/Model/Table/UsersTable.php
index ee779079..f7ae6d56 100644
--- a/src/Model/Table/UsersTable.php
+++ b/src/Model/Table/UsersTable.php
@@ -32,6 +32,7 @@
*/
class UsersTable extends Table
{
+ // TODO make themes an enum?
public const VALID_THEMES = ['light', 'dark', 'system'];
/**
diff --git a/src/View/Cell/.gitkeep b/src/View/Cell/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/View/Cell/ProjectsMenuCell.php b/src/View/Cell/ProjectsMenuCell.php
new file mode 100644
index 00000000..def85e22
--- /dev/null
+++ b/src/View/Cell/ProjectsMenuCell.php
@@ -0,0 +1,38 @@
+
+ */
+ protected $_validCellOptions = ['identity'];
+
+ /**
+ * @var \App\Model\Entity\User
+ */
+ protected $identity;
+
+ /**
+ * Default display method.
+ *
+ * @return void
+ */
+ public function display($identity)
+ {
+ $projects = $this->fetchTable('Projects');
+
+ $query = $identity->applyScope('index', $projects->find('active')->find('top'));
+ $this->set('projects', $query->all());
+ }
+}
diff --git a/src/View/Helper/.gitkeep b/src/View/Helper/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/View/Helper/DateHelper.php b/src/View/Helper/DateHelper.php
new file mode 100644
index 00000000..ba1f22f6
--- /dev/null
+++ b/src/View/Helper/DateHelper.php
@@ -0,0 +1,78 @@
+
+ */
+ protected $_defaultConfig = [
+ 'timezone' => null,
+ ];
+
+ /**
+ * Get today in the user's timezone.
+ */
+ public function today(): FrozenDate
+ {
+ return FrozenDate::today($this->getConfig('timezone'));
+ }
+
+ /**
+ * Format a date into the compact date format used across the app.
+ */
+ public function formatCompact(?FrozenDate $date, bool $evening = false): string
+ {
+ if ($date === null) {
+ return 'No due date';
+ }
+ $diff = $this->today()->diffInDays($date, false);
+ // In the past? Show the date
+ if ($diff < -90) {
+ return (string)$date->i18nFormat('MMM d yyyy');
+ }
+ if ($diff < 0) {
+ return (string)$date->i18nFormat('MMM d');
+ }
+ // TODO should this include the icon?
+ if ($diff < 1 && $evening) {
+ return 'This evening';
+ }
+ if ($diff < 1) {
+ return 'Today';
+ }
+ if ($diff < 2) {
+ return 'Tomorrow';
+ }
+ if ($diff < 7) {
+ return (string)$date->i18nFormat('cccc');
+ }
+
+ return (string)$date->i18nFormat('MMM d');
+ }
+
+ public function formatDateHeading(FrozenDate $date): array
+ {
+ $delta = $date->diffInDays($this->today());
+ $shortDate = $date->i18nFormat('MMM d');
+ if ($delta < 1) {
+ return ['Today', $shortDate];
+ } elseif ($delta < 2) {
+ return ['Tomorrow', $shortDate];
+ } elseif ($delta < 7) {
+ return [$date->i18nFormat('EEEE'), $shortDate];
+ }
+
+ return [$shortDate, ''];
+ }
+}
diff --git a/src/View/Widget/ColorPickerWidget.php b/src/View/Widget/ColorPickerWidget.php
new file mode 100644
index 00000000..6007ab6a
--- /dev/null
+++ b/src/View/Widget/ColorPickerWidget.php
@@ -0,0 +1,80 @@
+
+ */
+ protected $defaults = [
+ 'name' => '',
+ 'disabled' => null,
+ 'val' => null,
+ 'colors' => [],
+ 'data-niceselect' => 1,
+ 'tabindex' => '-1',
+ 'showName' => true,
+ 'templateVars' => [],
+ ];
+
+ public function __construct(private StringTemplate $templates, private View $view)
+ {
+ }
+
+ public function render(array $data, ContextInterface $context): string
+ {
+ $data = $this->mergeDefaults($data, $context);
+ if (empty($data['colors'])) {
+ throw new RuntimeException('`colors` option is required');
+ }
+ $selected = $data['val'] ?? null;
+ $colors = $data['colors'];
+ unset($data['colors'], $data['data-validity-message'], $data['oninvalid'], $data['oninput']);
+
+ $options = [];
+ foreach ($colors as $color) {
+ $optionBody = $this->view->element('icons/dot16', ['color' => $color['code']]);
+ if (isset($data['showName']) && $data['showName']) {
+ $optionBody .= ' ' . h($color['name']);
+ }
+ $optAttrs = [
+ 'selected' => $color['id'] == $selected,
+ ];
+
+ $options[] = $this->templates->format('select-box-option', [
+ 'value' => $color['id'],
+ 'text' => $optionBody,
+ 'attrs' => $this->templates->formatAttributes($optAttrs, ['text', 'value']),
+ ]);
+ }
+
+ $hidden = $this->templates->format('input', [
+ 'name' => $data['name'],
+ 'value' => $selected,
+ 'type' => 'hidden',
+ ]);
+ $attrs = $this->templates->formatAttributes($data);
+
+ return $this->templates->format('select-box', [
+ 'templateVars' => $data['templateVars'],
+ 'attrs' => $attrs,
+ 'hidden' => $hidden,
+ 'options' => implode('', $options),
+ ]);
+ }
+
+ public function secureFields(array $data): array
+ {
+ return [$data['name']];
+ }
+}
diff --git a/src/View/Widget/DueOnWidget.php b/src/View/Widget/DueOnWidget.php
new file mode 100644
index 00000000..91af71c9
--- /dev/null
+++ b/src/View/Widget/DueOnWidget.php
@@ -0,0 +1,105 @@
+
+ */
+ protected $defaults = [
+ 'name' => '',
+ 'disabled' => null,
+ 'val' => null,
+ 'tabindex' => '-1',
+ 'templateVars' => [],
+ 'inputAttrs' => [],
+ ];
+
+ public function __construct(private StringTemplate $templates, private View $view)
+ {
+ }
+
+ public function render(array $data, ContextInterface $context): string
+ {
+ $data = $this->mergeDefaults($data, $context);
+ $task = $data['val'] ?? null;
+ assert($task instanceof Task, '`val` is required to be a Task');
+
+ $inputAttrs = $data['inputAttrs'] ?? [];
+ unset($data['data-validity-message'], $data['oninvalid'], $data['oninput'], $data['inputAttrs'], $data['val']);
+
+ $inputAttrs += ['style' => 'display:none'];
+ $templateVars = $data['templateVars'] ?? [];
+
+ $hidden = $this->templates->format('input', [
+ 'name' => 'due_on',
+ 'type' => 'text',
+ 'attrs' => $this->templates->formatAttributes(
+ $inputAttrs + [
+ 'value' => $task->due_on ? $task->due_on->format('Y-m-d') : null,
+ ],
+ ),
+ ]);
+ $id = $data['id'] ?? 'task-evening-' . uniqid();
+
+ $templateVars += [
+ 'id' => $id,
+ 'iconEvening' => $this->view->element('icons/moon16'),
+ 'iconDay' => $this->view->element('icons/sun16'),
+ 'inputEvening' => $this->templates->format('input', [
+ 'name' => 'evening',
+ 'type' => 'checkbox',
+ 'attrs' => $this->templates->formatAttributes([
+ 'id' => $id,
+ 'value' => 1,
+ 'checked' => $task->evening ? 1 : 0,
+ ]),
+ ]),
+ ];
+
+ $attrs = $this->templates->formatAttributes($data);
+ $icon = '';
+ if ($task->evening) {
+ $icon = $this->view->element('icons/moon16');
+ }
+
+ return $this->templates->format('due-on', [
+ 'templateVars' => $templateVars,
+ 'attrs' => $attrs,
+ 'hidden' => $hidden,
+ 'label' => $icon . $this->view->Date->formatCompact($task->due_on, $task->evening),
+ 'options' => $this->view->element('task_dueon_menu', [
+ 'task' => $task,
+ 'referer' => '',
+ 'renderForms' => false,
+ 'itemFormatter' => function (string $title, array $options, array $data) {
+ $options += ['icon' => 'sun', 'class' => '', 'testId' => ''];
+ $title = $this->view->element("icons/{$options['icon']}16") . ' ' . $title;
+ echo $this->view->Form->button($title, [
+ 'role' => 'menuitem',
+ 'escapeTitle' => false,
+ 'data-testid' => $options['testId'],
+ 'value' => $data['due_on'],
+ 'data-evening' => $data['evening'] ?? 0,
+ 'class' => "menu-item-button {$options['class']}",
+ ]);
+ },
+ ]),
+ ]);
+ }
+
+ public function secureFields(array $data): array
+ {
+ return [$data['name']];
+ }
+}
diff --git a/src/View/Widget/ProjectPickerWidget.php b/src/View/Widget/ProjectPickerWidget.php
new file mode 100644
index 00000000..a7a6fa0f
--- /dev/null
+++ b/src/View/Widget/ProjectPickerWidget.php
@@ -0,0 +1,87 @@
+
+ */
+ protected $defaults = [
+ 'name' => '',
+ 'disabled' => null,
+ 'val' => null,
+ 'projects' => [],
+ 'data-niceselect' => 1,
+ 'tabindex' => '-1',
+ 'templateVars' => [],
+ 'inputAttrs' => [],
+ ];
+
+ public function __construct(private StringTemplate $templates, private View $view)
+ {
+ }
+
+ public function render(array $data, ContextInterface $context): string
+ {
+ $data = $this->mergeDefaults($data, $context);
+ if (empty($data['projects'])) {
+ throw new RuntimeException('`projects` option is required');
+ }
+ $selected = $data['val'] ?? null;
+ $projects = $data['projects'];
+ $inputAttrs = $data['inputAttrs'] ?? [];
+ unset(
+ $data['projects'],
+ $data['data-validity-message'],
+ $data['oninvalid'],
+ $data['oninput'],
+ $data['inputAttrs']
+ );
+
+ $inputAttrs += ['style' => 'display:none'];
+
+ $options = [];
+ foreach ($projects as $project) {
+ $optionBody = $this->view->element('icons/dot16', ['color' => $project->color_hex]) . h($project->name);
+ $optAttrs = [
+ 'selected' => $project->id == $selected,
+ ];
+
+ $options[] = $this->templates->format('select-box-option', [
+ 'value' => $project->id,
+ 'text' => $optionBody,
+ 'attrs' => $this->templates->formatAttributes($optAttrs, ['text', 'value']),
+ ]);
+ }
+
+ $hidden = $this->templates->format('input', [
+ 'name' => $data['name'],
+ 'value' => $selected,
+ 'type' => 'text',
+ 'attrs' => $this->templates->formatAttributes($inputAttrs),
+ ]);
+ $attrs = $this->templates->formatAttributes($data);
+
+ return $this->templates->format('select-box', [
+ 'templateVars' => $data['templateVars'],
+ 'attrs' => $attrs,
+ 'hidden' => $hidden,
+ 'options' => implode('', $options),
+ ]);
+ }
+
+ public function secureFields(array $data): array
+ {
+ return [$data['name']];
+ }
+}
diff --git a/templates/CalendarProviders/index.php b/templates/CalendarProviders/index.php
new file mode 100644
index 00000000..070b1c9e
--- /dev/null
+++ b/templates/CalendarProviders/index.php
@@ -0,0 +1,37 @@
+setLayout('sidebar');
+$this->assign('title', 'Synced Calendars');
+?>
+Synced Calendars
+
+ Events from linked calendars will be displayed in "today" and "upcoming" views.
+
+
+Connected Calendar Accounts
+
+
+ id === $activeProvider->id;
+ $unlinked = $isActive ? $unlinked : [];
+ echo $this->element(
+ 'calendarprovider_item',
+ [
+ 'provider' => $provider,
+ 'active' => $isActive,
+ 'unlinked' => $unlinked,
+ ]
+ );
+ ?>
+
+
diff --git a/templates/CalendarSources/delete_confirm.php b/templates/CalendarSources/delete_confirm.php
new file mode 100644
index 00000000..53308b53
--- /dev/null
+++ b/templates/CalendarSources/delete_confirm.php
@@ -0,0 +1,20 @@
+set('closable', false);
+$this->set('open', true);
+
+$this->setLayout('modal');
+
+echo $this->element('confirm_dialog', [
+ 'target' => [
+ '_name' => 'calendarsources:delete',
+ 'id' => $calendarSource->id,
+ 'providerId' => $calendarSource->calendar_provider_id,
+ ],
+ 'title' => 'Are you sure?',
+ 'description' => 'This will delete all events in this calendar.',
+]);
diff --git a/templates/ProjectSections/add.php b/templates/ProjectSections/add.php
new file mode 100644
index 00000000..8fd8dae2
--- /dev/null
+++ b/templates/ProjectSections/add.php
@@ -0,0 +1,41 @@
+set('open', true);
+$this->setLayout('modal');
+?>
+
diff --git a/templates/ProjectSections/delete_confirm.php b/templates/ProjectSections/delete_confirm.php
new file mode 100644
index 00000000..785ae3f8
--- /dev/null
+++ b/templates/ProjectSections/delete_confirm.php
@@ -0,0 +1,17 @@
+set('closable', false);
+$this->set('open', true);
+
+$this->setLayout('modal');
+
+echo $this->element('confirm_dialog', [
+ 'target' => ['_name' => 'projectsections:delete', 'projectSlug' => $project->slug, 'id' => $section->id],
+ 'title' => 'Are you sure?',
+ 'description' => 'This will delete all tasks in this section as well.',
+]);
diff --git a/templates/ProjectSections/edit.php b/templates/ProjectSections/edit.php
new file mode 100644
index 00000000..c9ccae60
--- /dev/null
+++ b/templates/ProjectSections/edit.php
@@ -0,0 +1,39 @@
+setLayout('ajax');
+
+$sectionViewUrl = $this->Url->build([
+ '_name' => 'projectsections:view',
+ 'projectSlug' => $project->slug,
+ 'id' => $section->id,
+]);
+
+echo $this->Form->create($section, [
+ 'class' => 'section-quickform form-inline-rename',
+ 'hx-post' => $this->Url->build([
+ '_name' => 'projectsections:edit',
+ 'projectSlug' => $project->slug,
+ 'id' => $section->id,
+ ]),
+ 'hx-target' => 'main.main',
+]);
+?>
+
+ = $this->Form->text('name') ?>
+
+
+ = $this->Form->button('Save', [
+ 'class' => 'button button-primary',
+ 'data-testid' => 'save-section',
+ ]); ?>
+ = $this->Form->button('Cancel', [
+ 'class' => 'button button-muted',
+ 'hx-get' => $sectionViewUrl,
+ 'hx-target' => "#section-controls-{$section->id}",
+ ]); ?>
+
+= $this->Form->end() ?>
diff --git a/templates/ProjectSections/options.php b/templates/ProjectSections/options.php
new file mode 100644
index 00000000..23df084d
--- /dev/null
+++ b/templates/ProjectSections/options.php
@@ -0,0 +1,32 @@
+combine('id', 'name')->toArray();
+ echo $this->Form->control('section_id', [
+ 'label' => [
+ 'class' => 'form-section-heading icon-week',
+ 'text' => $this->element('icons/directory-symlink16') . 'Section',
+ 'escape' => false,
+ ],
+ 'options' => $options,
+ 'empty' => true,
+ 'value' => $value,
+ ]);
+else :
+ echo $this->Form->control('section_id', [
+ 'label' => [
+ 'class' => 'form-section-heading icon-week',
+ 'text' => $this->element('icons/directory-symlink16') . 'Section',
+ 'escape' => false,
+ ],
+ 'type' => 'text',
+ 'disabled' => 'true',
+ 'placeholder' => 'No Sections',
+ 'empty' => true,
+ ]);
+endif;
diff --git a/templates/ProjectSections/view.php b/templates/ProjectSections/view.php
new file mode 100644
index 00000000..b5b74560
--- /dev/null
+++ b/templates/ProjectSections/view.php
@@ -0,0 +1,12 @@
+setLayout('ajax');
+
+echo $this->element('projectsection_item', [
+ 'project' => $project,
+ 'section' => $section,
+]);
diff --git a/templates/Projects/add.php b/templates/Projects/add.php
new file mode 100644
index 00000000..97ec1093
--- /dev/null
+++ b/templates/Projects/add.php
@@ -0,0 +1,32 @@
+setLayout('sidebar');
+$this->assign('title', 'New Project');
+?>
+New Project
+Form->create(
+ $project,
+ ['class' => 'form-narrow']
+);
+echo $this->Form->hidden('referer', ['value' => $referer]);
+echo $this->Form->control('name');
+echo $this->Form->control('color', [
+ 'type' => 'colorpicker',
+ 'colors' => Configure::read('Colors'),
+]);
+?>
+
+= $this->Form->end() ?>
diff --git a/templates/Projects/archived.php b/templates/Projects/archived.php
new file mode 100644
index 00000000..3cba5df7
--- /dev/null
+++ b/templates/Projects/archived.php
@@ -0,0 +1,21 @@
+setLayout('sidebar');
+$this->assign('title', 'Archived Projects');
+?>
+Archived Projects
+element('project_item', ['project' => $project, 'showMenu' => true]);
+endforeach;
+
+if (empty($projects)) : ?>
+
+
Nothing to see
+
You don't have any archived projects.
+
+
diff --git a/templates/Projects/completed.php b/templates/Projects/completed.php
new file mode 100644
index 00000000..ffa491e5
--- /dev/null
+++ b/templates/Projects/completed.php
@@ -0,0 +1,32 @@
+setLayout('sidebar');
+$this->assign('title', $project->name . ' Completed Tasks');
+
+?>
+
+
+
+
+ = $this->Html->link(
+ $this->element('icons/arrowleft16') . h($project->name),
+ ['_name' => 'projects:view', 'slug' => $project->slug],
+ ['class' => 'heading-back', 'escape' => false]
+ ) ?>
+ / Completed Tasks
+
+
+
+
+
+ element('task_item', ['task' => $task, 'showDueOn' => true]);
+ endforeach;
+ ?>
+
+
diff --git a/templates/Projects/delete_confirm.php b/templates/Projects/delete_confirm.php
new file mode 100644
index 00000000..3fe45448
--- /dev/null
+++ b/templates/Projects/delete_confirm.php
@@ -0,0 +1,16 @@
+set('closable', false);
+$this->set('open', true);
+
+$this->setLayout('modal');
+
+echo $this->element('confirm_dialog', [
+ 'target' => ['_name' => 'projects:delete', 'slug' => $project->slug],
+ 'title' => 'Are you sure?',
+ 'description' => 'This will delete all tasks in this project as well.',
+]);
diff --git a/templates/Projects/edit.php b/templates/Projects/edit.php
new file mode 100644
index 00000000..0d10599d
--- /dev/null
+++ b/templates/Projects/edit.php
@@ -0,0 +1,33 @@
+setLayout('sidebar');
+$this->assign('title', 'Edit Project');
+?>
+Edit = h($project->name) ?> Project
+Form->create($project, ['class' => 'form-narrow']);
+echo $this->Form->hidden('referer', ['value' => $referer]);
+echo $this->Form->control('name');
+echo $this->Form->control('color', [
+ 'type' => 'colorpicker',
+ 'colors' => Configure::read('Colors'),
+]);
+echo $this->Form->control('archived', [
+ 'type' => 'checkbox',
+ 'nestedInput' => false,
+]);
+?>
+
+= $this->Form->end() ?>
diff --git a/templates/Projects/reorder.php b/templates/Projects/reorder.php
new file mode 100644
index 00000000..cf3034b8
--- /dev/null
+++ b/templates/Projects/reorder.php
@@ -0,0 +1,6 @@
+setLayout('ajax');
+
+echo $this->cell('ProjectsMenu', ['identity' => $identity]);
diff --git a/templates/Projects/view.php b/templates/Projects/view.php
new file mode 100644
index 00000000..41a6f7ca
--- /dev/null
+++ b/templates/Projects/view.php
@@ -0,0 +1,87 @@
+setLayout('sidebar');
+$this->assign('title', $project->name . ' Project');
+
+$this->set('showGlobalAdd', true);
+$this->set('globalAddContext', ['project_id' => $project->id]);
+
+$taskAddUrl = $this->Url->build(['_name' => 'tasks:add', '?' => ['project_id' => $project->id]]);
+
+$groupedTasks = [];
+foreach ($tasks as $task) {
+ $groupedTasks[$task->section_id ?? ''][] = $task;
+}
+?>
+
+
+
+
+ archived) :
+ echo $this->element('icons/archive16');
+ endif; ?>
+ = h($project->name) ?>
+
+ archived) : ?>
+ = $this->Html->link(
+ $this->element('icons/plus16'),
+ $taskAddUrl,
+ [
+ 'escape' => false,
+ 'class' => 'button-icon-primary',
+ 'data-testid' => 'add-task',
+ 'hx-get' => $taskAddUrl,
+ 'hx-target' => 'main.main',
+ 'hx-swap' => 'beforeend',
+ ]
+ ) ?>
+
+
+ = $this->element('project_menu', ['project' => $project, 'showDetailed' => true]) ?>
+
+
+
+
+ element('task_item', ['task' => $task, 'showDueOn' => true]);
+ endforeach;
+ ?>
+
+
+
+
+ sections as $section) : ?>
+
+
+ = $this->element('projectsection_item', [
+ 'project' => $project,
+ 'section' => $section,
+ ]) ?>
+
+
+ id] ?? [] as $task) :
+ echo $this->element('task_item', ['task' => $task, 'showDueOn' => true]);
+ endforeach;
+ ?>
+
+
+
+
+
diff --git a/templates/Tasks/add.php b/templates/Tasks/add.php
new file mode 100644
index 00000000..063b537c
--- /dev/null
+++ b/templates/Tasks/add.php
@@ -0,0 +1,36 @@
+request->is('htmx');
+
+$this->setLayout('sidebar');
+if ($isHtmx) {
+ $this->set('closable', true);
+ $this->set('open', true);
+ $this->setLayout('modal');
+}
+
+$this->assign('title', 'New Task');
+
+if ($isHtmx) : ?>
+
+
diff --git a/templates/Tasks/daily.php b/templates/Tasks/daily.php
new file mode 100644
index 00000000..cdea9f24
--- /dev/null
+++ b/templates/Tasks/daily.php
@@ -0,0 +1,128 @@
+setLayout('sidebar');
+$this->assign('title', "Today's Tasks");
+
+$dateStr = $date->format('Y-m-d');
+
+$this->set('showGlobalAdd', true);
+$this->set('globalAddContext', ['due_on' => $dateStr]);
+
+$taskAddUrl = $this->Url->build([
+ '_name' => 'tasks:add',
+ '?' => ['due_on' => $dateStr],
+]);
+$taskAddEveningUrl = $this->Url->build([
+ '_name' => 'tasks:add',
+ '?' => ['due_on' => $dateStr, 'evening' => true],
+]);
+
+$groupedTasks = [];
+foreach ($tasks as $task) {
+ $key = '';
+ if ($task->due_on) {
+ $key = $task->due_on->format('Y-m-d');
+ }
+ if ($task->due_on && $task->due_on->equals($date)) {
+ $key = 'today';
+ }
+ if ($task->evening) {
+ $key = 'evening';
+ }
+ if ($task->due_on && $task->due_on->lessThan($date)) {
+ $key = 'overdue';
+ }
+ $groupedTasks[$key][] = $task;
+}
+
+// Overdue section
+if (!empty($groupedTasks['overdue'])) : ?>
+
+ = $this->element('icons/alert16') ?>
+ Overdue
+
+
+ element('task_item', ['task' => $task, 'showDueOn' => true]);
+ endforeach;
+ ?>
+
+
+
+
+
+ = $this->element('icons/calendar16') ?>
+ Today
+ = $this->Html->link(
+ $this->element('icons/plus16'),
+ $taskAddUrl,
+ [
+ 'escape' => false,
+ 'class' => 'button-icon-primary',
+ 'data-testid' => 'add-task',
+ 'hx-get' => $taskAddUrl,
+ 'hx-target' => 'main.main',
+ 'hx-swap' => 'beforeend',
+ ]
+ ) ?>
+
+element('calendaritems', ['calendarItems' => $calendarItems]);
+endif;
+?>
+
+element('task_item', ['task' => $task]);
+endforeach;
+?>
+
+
+
+
+ = $this->element('icons/moon16') ?>
+ This Evening
+ = $this->Html->link(
+ $this->element('icons/plus16'),
+ $taskAddUrl,
+ [
+ 'escape' => false,
+ 'class' => 'button-icon-primary',
+ 'data-testid' => 'add-task-evening',
+ 'hx-get' => $taskAddEveningUrl,
+ 'hx-target' => 'main.main',
+ 'hx-swap' => 'beforeend',
+ ]
+ ) ?>
+
+
+element('task_item', ['task' => $task]);
+endforeach;
+?>
+
diff --git a/templates/Tasks/delete_confirm.php b/templates/Tasks/delete_confirm.php
new file mode 100644
index 00000000..362315ee
--- /dev/null
+++ b/templates/Tasks/delete_confirm.php
@@ -0,0 +1,16 @@
+set('closable', false);
+$this->set('open', true);
+
+$this->setLayout('modal');
+
+echo $this->element('confirm_dialog', [
+ 'target' => ['_name' => 'tasks:delete', 'id' => $task->id],
+ 'title' => 'Are you sure?',
+ 'description' => 'This will also delete all subtasks this task has.',
+]);
diff --git a/templates/Tasks/delete_ok.php b/templates/Tasks/delete_ok.php
new file mode 100644
index 00000000..090a9c72
--- /dev/null
+++ b/templates/Tasks/delete_ok.php
@@ -0,0 +1,4 @@
+setLayout('ajax');
diff --git a/templates/Tasks/deleted.php b/templates/Tasks/deleted.php
new file mode 100644
index 00000000..e8b836bf
--- /dev/null
+++ b/templates/Tasks/deleted.php
@@ -0,0 +1,18 @@
+assign('title', 'Trash Bin');
+
+$this->setLayout('sidebar');
+?>
+
+ = $this->element('icons/trash16') ?>
+ Trash Bin
+
+Trash tasks will be deleted permanently after 14 days
+
+ = $this->element('task_item_restore', ['task' => $task]) ?>
+
diff --git a/templates/Tasks/editproject.php b/templates/Tasks/editproject.php
new file mode 100644
index 00000000..48b71e02
--- /dev/null
+++ b/templates/Tasks/editproject.php
@@ -0,0 +1,32 @@
+ $projects
+ * @var string $referer
+ */
+$this->setLayout('ajax');
+
+$this->response = $this->response->withHeader('Hx-Trigger-After-Swap', 'reposition');
+
+$taskEditUrl = ['_name' => 'tasks:edit', 'id' => $task->id];
+
+echo $this->Form->create($task, ['url' => $taskEditUrl]);
+// Store the referer for this menu so that we can use it as a redirect
+// at the end of this operation.
+echo $this->Form->hidden('redirect', ['value' => $referer]);
+?>
+
+
+ = $this->Form->input('project_id', [
+ 'type' => 'projectpicker',
+ 'projects' => $projects,
+ 'val' => $task->project_id,
+ // Submit to the task update endpoint and remove the
+ // menu from the dom
+ 'hx-post' => $this->Url->build($taskEditUrl),
+ 'hx-trigger' => 'selected',
+ 'hx-target' => 'main.main',
+ ]) ?>
+
+= $this->Form->end() ?>
diff --git a/templates/Tasks/index.php b/templates/Tasks/index.php
new file mode 100644
index 00000000..ddc166cc
--- /dev/null
+++ b/templates/Tasks/index.php
@@ -0,0 +1,123 @@
+setLayout('sidebar');
+$this->assign('title', 'Upcoming Tasks');
+
+$this->set('showGlobalAdd', true);
+
+$start = FrozenDate::parse($start);
+$nextStart = FrozenDate::parse($nextStart);
+$duration = $nextStart->diffInDays($start);
+
+$groupedTasks = [];
+$current = $start;
+while ($current < $nextStart) :
+ $groupedTasks[$current->format('Y-m-d')] = [];
+ $current = $current->addDays(1);
+endwhile;
+
+foreach ($tasks as $task) :
+ $key = '';
+ if ($task->due_on) :
+ $key = $task->due_on->format('Y-m-d');
+ endif;
+ if ($task->evening) :
+ $key = "evening:{$key}";
+ endif;
+ $groupedTasks[$key][] = $task;
+endforeach;
+
+$groupedCalendarItems = [];
+foreach ($calendarItems as $item) :
+ $key = ($item->start_date ?? $item->start_time ?? $start)->format('Y-m-d');
+ $groupedCalendarItems[$key][] = $item;
+endforeach;
+
+?>
+Upcoming
+
+ $taskGroup) : ?>
+ Url->build([
+ '_name' => 'tasks:add',
+ '?' => ['due_on' => $dateStr],
+ ]);
+ $currentDate = FrozenDate::parse($dateStr);
+ [$heading, $subheading] = $this->Date->formatDateHeading($currentDate);
+
+ ?>
+
+
+
+ = $this->element('icons/moon16') ?>
+ Evening
+
+
+ element('task_item', ['task' => $task]);
+ endforeach;
+ ?>
+
+
+
+ = h($heading) ?>
+
+ = h($subheading) ?>
+
+ = $this->Html->link(
+ $this->element('icons/plus16'),
+ $taskAddUrl,
+ [
+ 'escape' => false,
+ 'class' => 'button-icon-primary',
+ 'data-testid' => 'add-task',
+ 'hx-get' => $taskAddUrl,
+ 'hx-target' => 'main.main',
+ 'hx-swap' => 'beforeend',
+ ]
+ ) ?>
+
+ element('calendaritems', ['calendarItems' => $groupedCalendarItems[$key]]);
+ endif;
+ ?>
+
+ element('task_item', ['task' => $task]);
+ endforeach;
+ ?>
+
+
+
+
+
diff --git a/templates/Tasks/reschedule.php b/templates/Tasks/reschedule.php
new file mode 100644
index 00000000..b9812c60
--- /dev/null
+++ b/templates/Tasks/reschedule.php
@@ -0,0 +1,11 @@
+setLayout('ajax');
+
+$this->response = $this->response->withHeader('Hx-Trigger-After-Swap', 'reposition');
+
+echo $this->element('task_dueon_menu', ['task' => $task, 'referer' => $referer]);
diff --git a/templates/Tasks/view.php b/templates/Tasks/view.php
new file mode 100644
index 00000000..0c64c54f
--- /dev/null
+++ b/templates/Tasks/view.php
@@ -0,0 +1,18 @@
+setLayout('sidebar');
+$this->assign('title', 'Tasks - ' . h($task->title));
+
+echo $this->element('task_form', [
+ 'task' => $task,
+ 'projects' => $projects,
+ 'sections' => $sections,
+ 'referer' => $referer,
+ 'url' => ['_name' => 'tasks:edit', 'id' => $task->id],
+]);
diff --git a/templates/Users/add.php b/templates/Users/add.php
index c58c1348..712b4857 100644
--- a/templates/Users/add.php
+++ b/templates/Users/add.php
@@ -15,22 +15,22 @@
'type' => 'text',
'required' => true,
'templateVars' => [
- 'help' => 'The name used in the site and in emails.
'
- ]
+ 'help' => 'The name used in the site and in emails.
',
+ ],
]) ?>
= $this->Form->control('email', [
'type' => 'email',
'required' => true,
'templateVars' => [
- 'help' => 'Used to email you and to login.
'
- ]
+ 'help' => 'Used to email you and to login.
',
+ ],
]) ?>
= $this->Form->control('password', [
'type' => 'password',
'required' => true,
'templateVars' => [
'help' => 'More than 10 characters long.
',
- ]
+ ],
]) ?>
= $this->Form->control('confirm_password', [
'label' => 'Confirm Password',
diff --git a/templates/Users/edit.php b/templates/Users/edit.php
new file mode 100644
index 00000000..d881f013
--- /dev/null
+++ b/templates/Users/edit.php
@@ -0,0 +1,49 @@
+setLayout('sidebar');
+$this->assign('title', 'Edit Profile');
+
+?>
+Edit Profile
+Form->create($user, ['class' => 'form-standard']);
+echo $this->Form->control('name');
+echo $this->Form->control('unverified_email', [
+ 'label' => 'Email',
+ 'placeholder' => $user->email,
+ 'templateVars' => [
+ 'help' => $user->unverified_email
+ ? 'You have a pending email address change that needs to be verified.
'
+ : 'Until your new email address is verified, you must use the current email to login.
',
+ ],
+]);
+echo $this->Form->control('timezone', [
+ 'type' => 'select',
+ 'options' => FrozenTime::listTimezones(),
+ 'templateVars' => [
+ 'help' => 'This will update on each login, so today and tomorrow are correct.
',
+ ],
+]);
+echo $this->Form->control('theme', [
+ 'type' => 'select',
+ 'options' => [
+ 'system' => 'System',
+ 'light' => 'Light',
+ 'dark' => 'Dark',
+ ],
+ 'templateVars' => [
+ 'help' => 'The "system" theme inherits light/dark from your operating system when possible.
',
+ ],
+]);
+?>
+
+ = $this->Form->submit('Save', ['class' => 'button button-primary']) ?>
+ = $this->Html->link('Cancel', $referer, ['class' => 'button button-muted']) ?>
+
diff --git a/templates/Users/login.php b/templates/Users/login.php
index 594308da..c0b8bac7 100644
--- a/templates/Users/login.php
+++ b/templates/Users/login.php
@@ -8,7 +8,7 @@
= $this->Form->create(null, [
'class' => 'form-narrow',
- 'url' => ['controller' => 'Users', 'action' =>'login']
+ 'url' => ['controller' => 'Users', 'action' => 'login'],
]) ?>
= $this->Form->control('email', ['type' => 'email', 'required' => true]) ?>
= $this->Form->control('password', ['type' => 'password', 'required' => true]) ?>
@@ -27,6 +27,7 @@
= $this->Form->end() ?>
+
+ = $this->Html->scriptStart(['type' => 'module']) ?>
+ (function () {
+ const button = document.getElementById('subtask-add');
+ button.addEventListener('click', function (event) {
+ event.preventDefault();
+ const list = document.getElementById('subtask-list');
+ const input = document.getElementById('subtask-add-text');
+ const index = list.querySelectorAll('li').length;
+
+ let template = document.getElementById('subtask-template').textContent;
+ template = template.replaceAll('{index}', index).replaceAll('{value}', input.value);
+ const item = document.createElement('li');
+ item.classList = 'task-subtask dnd-item';
+ item.innerHTML = template;
+
+ list.appendChild(item);
+ input.value = '';
+ });
+ }());
+ = $this->Html->scriptEnd() ?>
+
+
+
+
+ = $this->Form->button('Save', ['class' => 'button-primary', 'data-testid' => 'save-task']) ?>
+
+= $this->Form->end() ?>
+
diff --git a/templates/element/task_item.php b/templates/element/task_item.php
new file mode 100644
index 00000000..1f91e0c6
--- /dev/null
+++ b/templates/element/task_item.php
@@ -0,0 +1,70 @@
+Url->build(['_name' => 'tasks:view', $task->id]);
+
+$showProject ??= true;
+$showDueOn ??= false;
+$restore ??= false;
+
+$taskCheckboxUrl = $this->Url->build([
+ '_name' => $task->completed ? 'tasks:incomplete' : 'tasks:complete',
+ 'id' => $task->id,
+]);
+$className = 'task-row';
+if ($task->completed) :
+ $className .= ' is-completed';
+endif;
+
+// TODO add/remove `is-completed` class on checkbox change.
+?>
+
+
+
+ = $this->element('task_checkbox', [
+ 'name' => 'completed',
+ 'checked' => $task->completed,
+ // TODO perhaps this should be a POST -> redirect flow so flash messages can be shown.
+ 'attrs' => [
+ 'value' => 1,
+ 'hx-delete' => $taskCheckboxUrl,
+ 'hx-target' => 'closest .dnd-item',
+ 'hx-swap' => 'outerHTML swap:500ms',
+ ],
+ ]) ?>
+
+
+ = h($task->title) ?>
+
+
+
+
+ = $this->element('icons/dot16', ['color' => $task->project->color_hex]) ?>
+ = h($task->project->name) ?>
+
+
+ element('task_due_on', ['task' => $task]);
+ endif;
+ ?>
+ subtask_count > 0) : ?>
+
+ = $this->element('icons/workflow16') ?>
+ = h($task->complete_subtask_count) ?>
+ /
+ = h($task->subtask_count) ?>
+
+
+
+
+ = $this->element('task_menu', ['task' => $task]) ?>
+
+
diff --git a/templates/element/task_item_restore.php b/templates/element/task_item_restore.php
new file mode 100644
index 00000000..569974bd
--- /dev/null
+++ b/templates/element/task_item_restore.php
@@ -0,0 +1,40 @@
+Url->build(['_name' => 'tasks:view', $task->id]);
+$taskRestoreUrl = $this->Url->build(['_name' => 'tasks:undelete', $task->id]);
+
+$showProject ??= true;
+$className = 'task-row';
+?>
+
+
+
+ = h($task->title) ?>
+
+
+
+
+ = $this->element('icons/dot16', ['color' => $task->project->color_hex]) ?>
+ = h($task->project->name) ?>
+
+
+ subtask_count > 1) : ?>
+
+ = $this->element('icons/workflow16') ?>
+ = h($task->complete_subtask_count) ?>
+ /
+ = h($task->subtask_count) ?>
+
+
+
+
+ = $this->Form->postButton('Restore', $taskRestoreUrl, [
+ 'class' => 'button button-secondary',
+ 'hx-post' => $taskRestoreUrl,
+ 'hx-target' => 'main.main',
+ ]) ?>
+
diff --git a/templates/element/task_menu.php b/templates/element/task_menu.php
new file mode 100644
index 00000000..f5b8fd01
--- /dev/null
+++ b/templates/element/task_menu.php
@@ -0,0 +1,69 @@
+ 'tasks:deleteconfirm', 'id' => $task->id];
+$taskEditProjectUrl = ['_name' => 'tasks:viewmode', 'id' => $task->id, 'mode' => 'editproject'];
+$taskRescheduleUrl = ['_name' => 'tasks:viewmode', 'id' => $task->id, 'mode' => 'reschedule'];
+
+// TODO one weakness of the current menu content swapping approach is that
+// if an action is ever aborted, the menu is stuck in its previous state.
+// I don't want to solve this by getting the task menu from the server,
+// but that could be a gross solution.
+// Maybe `DropDown` can have a 'snapshot and restore' flow enabled by an attribute?
+?>
+
+
+
+
diff --git a/templates/email/text/reset_password.php b/templates/email/text/reset_password.php
index ce3266d4..918fc001 100644
--- a/templates/email/text/reset_password.php
+++ b/templates/email/text/reset_password.php
@@ -1,6 +1,6 @@
Hi = $name ?>,
-Someone (hopefully you) has requested a password reset for TODO.
+Someone (hopefully you) has requested a password reset for Docket.
If this was you, follow the URL below to complete the process.
If this wasn't you, don't worry you can ignore this email.
diff --git a/templates/layout/ajax.php b/templates/layout/ajax.php
index cd51169d..8abfcd3f 100644
--- a/templates/layout/ajax.php
+++ b/templates/layout/ajax.php
@@ -13,5 +13,4 @@
* @license https://opensource.org/licenses/mit-license.php MIT License
* @var \App\View\AppView $this
*/
-
echo $this->fetch('content');
diff --git a/templates/layout/card.php b/templates/layout/card.php
index 77aaa50a..4dd031e7 100644
--- a/templates/layout/card.php
+++ b/templates/layout/card.php
@@ -1,4 +1,5 @@
diff --git a/templates/layout/modal.php b/templates/layout/modal.php
new file mode 100644
index 00000000..3c115875
--- /dev/null
+++ b/templates/layout/modal.php
@@ -0,0 +1,6 @@
+
+
+ = $this->fetch('content') ?>
+
diff --git a/templates/layout/sidebar.php b/templates/layout/sidebar.php
new file mode 100644
index 00000000..1683b5e7
--- /dev/null
+++ b/templates/layout/sidebar.php
@@ -0,0 +1,101 @@
+request->is('htmx')) :
+ echo $this->Flash->render();
+else :
+ $this->extend('default');
+endif;
+
+$todayActive = strpos($this->request->getPath(), '/tasks/today') !== false;
+$upcomingActive = strpos($this->request->getPath(), '/tasks/upcoming') !== false;
+
+// TODO make expanded work. Perhaps with an htmx
+// extension that maintains the state?
+?>
+
+
+
+ = $this->fetch('content'); ?>
+
+ = $this->Html->link(
+ $this->element('icons/plus16', ['size' => 64]),
+ ['_name' => 'tasks:add', '?' => $globalAddContext ?? []],
+ [
+ 'escape' => false,
+ 'class' => 'button-global-add button-primary',
+ 'data-testid' => 'global-task-add',
+ 'hx-get' => $this->Url->build(['_name' => 'tasks:add', '?' => $globalAddContext ?? []]),
+ 'hx-target' => 'main.main',
+ 'hx-swap' => 'beforeend',
+ ]
+ ) ?>
+
+
+
+= $this->Html->scriptStart() ?>
+(function () {
+ const button = document.getElementById('sidebar-expander');
+ const sidebar = document.getElementById('sidebar');
+ button.addEventListener('click', function (evt) {
+ evt.preventDefault();
+ const current = sidebar.dataset.expanded;
+ sidebar.dataset.expanded = current === 'false' ? 'true' : 'false';
+ });
+})();
+= $this->Html->scriptEnd() ?>
diff --git a/tests/Acceptance/GlobalCreateTest.php b/tests/Acceptance/GlobalCreateTest.php
index 3cc5eed2..0fe706f3 100644
--- a/tests/Acceptance/GlobalCreateTest.php
+++ b/tests/Acceptance/GlobalCreateTest.php
@@ -7,6 +7,8 @@ class GlobalCreateTest extends AcceptanceTestCase
{
public function testKeyboardTriggerFromToday()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$project = $this->makeProject('Home', 1);
$client = $this->login();
@@ -37,6 +39,8 @@ public function testKeyboardTriggerFromToday()
public function testButtonTriggerFromUpcoming()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$project = $this->makeProject('Home', 1);
$client = $this->login();
diff --git a/tests/Acceptance/KeyboardNavigationTest.php b/tests/Acceptance/KeyboardNavigationTest.php
index 652000cd..1cc11c75 100644
--- a/tests/Acceptance/KeyboardNavigationTest.php
+++ b/tests/Acceptance/KeyboardNavigationTest.php
@@ -20,6 +20,8 @@ protected function waitForTitleChange(Client $client, string $title)
public function testUpcoming()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$this->makeProject('Home', 1);
$client = $this->login();
@@ -35,6 +37,8 @@ public function testUpcoming()
public function testToday()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$this->makeProject('Home', 1);
$client = $this->login();
@@ -49,6 +53,8 @@ public function testToday()
public function testTaskListGotoDetails()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$tomorrow = new FrozenDate('tomorrow');
$project = $this->makeProject('Home', 1);
$this->makeTask('Clean', $project->id, 0, ['due_on' => $tomorrow]);
@@ -71,6 +77,8 @@ public function testTaskListGotoDetails()
public function testTaskListMarkComplete()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$tomorrow = new FrozenDate('tomorrow');
$project = $this->makeProject('Home', 1);
$task = $this->makeTask('Clean', $project->id, 0, ['due_on' => $tomorrow]);
@@ -92,6 +100,8 @@ public function testTaskListMarkComplete()
public function testTaskViewEdit()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$tomorrow = new FrozenDate('tomorrow');
$project = $this->makeProject('Home', 1);
$task = $this->makeTask('Clean', $project->id, 0, ['due_on' => $tomorrow]);
@@ -108,6 +118,8 @@ public function testTaskViewEdit()
public function testGlobalCreate()
{
+ // TODO fix this
+ $this->markTestIncomplete('keybindings for global actions are not complete');
$this->makeProject('Home', 1);
$client = $this->login();
diff --git a/tests/Acceptance/LoginTest.php b/tests/Acceptance/LoginTest.php
index 5fff3f05..2403f507 100644
--- a/tests/Acceptance/LoginTest.php
+++ b/tests/Acceptance/LoginTest.php
@@ -18,6 +18,6 @@ public function testLoginRedirectToToday()
'password' => 'password123',
]);
$client->waitFor('[data-testid="loggedin"]');
- $this->assertTextContains('Today Tasks', $client->getTitle());
+ $this->assertTextContains("Today's Tasks", $client->getTitle());
}
}
diff --git a/tests/Acceptance/ProjectsTest.php b/tests/Acceptance/ProjectsTest.php
index d354d88e..38d23790 100644
--- a/tests/Acceptance/ProjectsTest.php
+++ b/tests/Acceptance/ProjectsTest.php
@@ -3,14 +3,52 @@
namespace App\Test\Acceptance;
-use Cake\ORM\TableRegistry;
+use Symfony\Component\Panther\Client;
class ProjectsTest extends AcceptanceTestCase
{
+ /**
+ * @var \App\Model\Table\ProjectsTable
+ */
+ protected $Projects;
+
public function setUp(): void
{
parent::setUp();
- $this->Projects = TableRegistry::get('Projects');
+ $this->Projects = $this->fetchTable('Projects');
+ }
+
+ protected function openSectionMenu(Client $client)
+ {
+ $crawler = $client->getCrawler();
+
+ // Open the section menu
+ $client->getMouse()->mouseMoveTo('.section-container');
+
+ $sectionMenu = $crawler->filter('.section-container [aria-label="Section actions"]')->first();
+ $sectionMenu->click();
+ $client->waitFor('drop-down-menu');
+ }
+
+ protected function openProjectMenu(Client $client)
+ {
+ $crawler = $client->getCrawler();
+
+ // Open the section menu
+ $client->getMouse()->mouseMoveTo('.heading-actions');
+
+ $sectionMenu = $crawler->filter('.heading-actions [aria-label="Project actions"]')->first();
+ $sectionMenu->click();
+ $client->waitFor('drop-down-menu');
+ }
+
+ protected function confirmDialog(Client $client)
+ {
+ // Click proceed in the modal.
+ $crawler = $client->getCrawler();
+ $client->waitFor('dialog');
+ $button = $crawler->filter('dialog [data-testid="confirm-proceed"]')->first();
+ $button->click();
}
public function testCreate()
@@ -44,15 +82,11 @@ public function testDelete()
// Open the header menu
$headerMenu = $crawler->filter('.heading-actions .button-icon')->first();
$headerMenu->click();
- $client->waitFor('[data-reach-menu-item]');
+ $client->waitFor('drop-down-menu');
// Click delete
- $this->clickWithMouse('.delete[data-reach-menu-item]');
-
- // Click proceed in the modal.
- $client->waitFor('[aria-modal="true"]');
- $button = $crawler->filter('[aria-modal] [data-testid="confirm-proceed"]')->first();
- $button->click();
+ $this->clickWithMouse('drop-down-menu .icon-delete');
+ $this->confirmDialog($client);
$this->assertEquals(0, $this->Projects->find()->count());
}
@@ -90,17 +124,15 @@ public function testAddSection()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- $headerMenu = $crawler->filter('.heading-actions .button-icon')->first();
- // Open the header menu
- $headerMenu->click();
- $client->waitFor('[data-reach-menu-item]');
-
+ $this->openProjectMenu($client);
$this->clickWithMouse('[data-testid="add-section"]');
- $form = $crawler->filter('.section-quickform')->form();
+ $client->waitFor('dialog');
+ $form = $crawler->filter('dialog form')->form();
$form->get('name')->setValue('books to read');
$crawler->filter('[data-testid="save-section"]')->click();
+ /** @var \App\Model\Entity\ProjectSection $section */
$section = $this->Projects->Sections->find()->firstOrFail();
$this->assertEquals('books to read', $section->name);
$this->assertSame($project->id, $section->project_id);
@@ -116,13 +148,10 @@ public function testEditSection()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- // Open the header menu
- $sectionMenu = $crawler->filter('.section-container [aria-label="Section actions"]')->first();
- $sectionMenu->click();
- $client->waitFor('[data-reach-menu-item]');
+ $this->openSectionMenu($client);
// Click the edit action
- $this->clickWithMouse('.edit[data-reach-menu-item]');
+ $this->clickWithMouse('.drop-down-portal .icon-edit');
// Update the section name.
$client->waitFor('.section-quickform');
@@ -130,6 +159,7 @@ public function testEditSection()
$form->get('name')->setValue('books to read');
$crawler->filter('[data-testid="save-section"]')->click();
+ /** @var \App\Model\Entity\ProjectSection $section */
$section = $this->Projects->Sections->find()->firstOrFail();
$this->assertEquals('books to read', $section->name);
$this->assertSame($project->id, $section->project_id);
@@ -143,26 +173,22 @@ public function testDeleteSection()
$client = $this->login();
$client->get('/projects/home');
$client->waitFor('[data-testid="loggedin"]');
- $crawler = $client->getCrawler();
- // Open the header menu
- $sectionMenu = $crawler->filter('.section-container [aria-label="Section actions"]')->first();
- $sectionMenu->click();
- $client->waitFor('[data-reach-menu-item]');
+ $this->openSectionMenu($client);
// Click the delete action
- $this->clickWithMouse('.delete[data-reach-menu-item]');
+ $client->waitFor('.drop-down-portal .icon-delete');
+ $client->clickLink('Delete Section');
- // Click proceed in the modal.
- $client->waitFor('[aria-modal="true"]');
- $button = $crawler->filter('[aria-modal] [data-testid="confirm-proceed"]')->first();
- $button->click();
+ $this->confirmDialog($client);
$this->assertEquals(0, $this->Projects->Sections->find()->count());
}
public function testDragTaskToSection()
{
+ $this->markTestSkipped("Selenium doesn't support html5 drag and drop currently.");
+
$project = $this->makeProject('Home', 1);
$section = $this->makeProjectSection('Books', $project->id);
$one = $this->makeTask('First', $project->id, 0);
@@ -174,13 +200,17 @@ public function testDragTaskToSection()
$crawler = $client->getCrawler();
// Get the last task
- $last = $client->getCrawler()->filter('.task-group .dnd-handle')->getElement(1);
+ $last = $crawler->filter('.task-group .dnd-handle')->getElement(1);
$mouse = $client->getMouse();
// Do a drag from the top to the bottom
+ $position = $last->getCoordinates();
$mouse->mouseDownTo('.task-group .dnd-item:first-child .dnd-handle')
- ->mouseMove($last->getCoordinates(), 0, 20)
- ->mouseUp($last->getCoordinates(), 0, 20);
+ ->mouseMove($position, 0, 20)
+ ->mouseUpTo('.task-group .dnd-item:last-child .dnd-handle');
+
+ // $newPosition = $target->getCoordinates();
+ // $mouse->mouseUpTo($newPosition);
$client->waitFor('.flash-message');
$task = $this->Projects->Tasks->get($one->id);
@@ -198,11 +228,11 @@ public function testAddTaskToSection()
$crawler = $client->getCrawler();
// Click add task in the section.
- $addTask = $crawler->filter('.section-container [data-testid="add-task"]')->first();
+ $addTask = $crawler->filter('[data-testid="section-add-task"]')->first();
$addTask->click();
- $client->waitFor('.task-quickform');
+ $client->waitFor('dialog');
- $title = $crawler->filter('.task-quickform .smart-task-input input');
+ $title = $crawler->filter('.task-title-input');
$title->sendKeys('A new task');
$button = $client->getCrawler()->filter('[data-testid="save-task"]');
diff --git a/tests/Acceptance/TasksTest.php b/tests/Acceptance/TasksTest.php
index 82855016..c0b8032d 100644
--- a/tests/Acceptance/TasksTest.php
+++ b/tests/Acceptance/TasksTest.php
@@ -4,8 +4,8 @@
namespace App\Test\Acceptance;
use Cake\I18n\FrozenDate;
-use Cake\ORM\TableRegistry;
use Facebook\WebDriver\WebDriverKeys;
+use Symfony\Component\Panther\Client;
class TasksTest extends AcceptanceTestCase
{
@@ -18,7 +18,7 @@ public function setUp(): void
{
parent::setUp();
- $this->Tasks = TableRegistry::get('Tasks');
+ $this->Tasks = $this->fetchTable('Tasks');
}
protected function setupTask()
@@ -29,6 +29,13 @@ protected function setupTask()
return $this->makeTask('Do dishes', $project->id, 0, ['due_on' => $tomorrow]);
}
+ protected function openDueOnMenu(Client $client)
+ {
+ $crawler = $client->getCrawler();
+ $crawler->filter('due-on .button-secondary')->click();
+ $client->waitFor('due-on drop-down-menu');
+ }
+
public function testViewMarkComplete()
{
$task = $this->setupTask();
@@ -38,11 +45,14 @@ public function testViewMarkComplete()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- $title = $crawler->filter('.task-view-summary h3')->first();
- $this->assertEquals($task->title, $title->getText());
+ $title = $crawler->filter('.task-title-input')->first();
+ $this->assertEquals($task->title, $title->attr('value'));
$checkbox = $crawler->filter('.task-view-summary .checkbox')->first();
$checkbox->click();
+ $button = $crawler->filter('[data-testid="save-task"]')->first();
+ $button->click();
+
$task = $this->Tasks->get($task->id);
$this->assertNotEmpty($task);
$this->assertTrue($task->completed);
@@ -57,15 +67,9 @@ public function testViewUpdateDueOn()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- // Click the title to get the form.
- $summary = $crawler->filter('.task-view-summary h3')->first();
- $summary->click();
- $client->waitFor('.task-quickform');
-
// Open the date menu, clear the due date
- $crawler->filter('[data-testid="due-on"]')->click();
- $client->waitFor('.due-on-menu');
- $this->clickWithMouse('.due-on-menu [data-testid="not-due"]');
+ $this->openDueOnMenu($client);
+ $this->clickWithMouse('due-on [data-testid="later"]');
// Submit the form
$crawler->filter('[data-testid="save-task"]')->click();
@@ -75,7 +79,7 @@ public function testViewUpdateDueOn()
$this->assertNull($task->due_on);
}
- public function testViewUpdateName()
+ public function testViewUpdateTitleAndBody()
{
$tomorrow = new FrozenDate('tomorrow', 'UTC');
$project = $this->makeProject('Work', 1);
@@ -86,25 +90,27 @@ public function testViewUpdateName()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- // Click the summary to get the form.
- $summary = $crawler->filter('.task-view-summary h3')->first();
- $summary->click();
- $client->waitFor('.task-quickform');
-
// Fill out the form and submit it.
- $title = $crawler->filter('.task-quickform .smart-task-input input');
- $title->sendKeys([WebDriverKeys::CONTROL, 'a']);
- $title->sendKeys('Cut grass');
+
+ $form = $crawler->filter('.task-view form')->form();
+ $form->get('title')->setValue('Cut grass');
+
+ // Show textarea for notes
+ $crawler->filter('.markdown-text-preview .button-muted')->click();
+ $form->get('body')->setValue('Make the grass shorter');
$crawler->filter('[data-testid="save-task"]')->click();
$task = $this->Tasks->get($task->id);
$this->assertNotEmpty($task);
$this->assertEquals('Cut grass', $task->title);
+ $this->assertEquals('Make the grass shorter', $task->body);
}
public function testViewUpdateDueOnMention()
{
+ $this->markTestIncomplete('mentions are not working yet');
+
$project = $this->makeProject('Work', 1);
$task = $this->makeTask('Do dishes', $project->id, 0);
@@ -135,6 +141,8 @@ public function testViewUpdateDueOnMention()
public function testViewUpdateProjectMention()
{
+ $this->markTestIncomplete('mentions are not working yet');
+
$project = $this->makeProject('Home', 1);
$work = $this->makeProject('Work', 1);
$task = $this->makeTask('Do dishes', $project->id, 0);
@@ -173,14 +181,15 @@ public function testViewCreateSubtask()
$client->waitFor('[data-testid="loggedin"]');
$crawler = $client->getCrawler();
- // Click the add subtask button
- $crawler->filter('.add-subtask button')->click();
-
- // Fill out the form and submit it.
+ // Fill out the subtask form and submit it.
$client->waitFor('.subtask-addform');
- $form = $crawler->filter('.subtask-addform')->form();
- $form->get('title')->setValue('Get soap');
- $crawler->filter('[data-testid="save-subtask"]')->click();
+ $form = $crawler->filter('.task-view form')->form();
+ $form->get('_subtaskadd')->setValue('Get soap');
+ $crawler->filter('[data-testid="subtask-add"]')->click();
+ $client->waitFor('.subtask-item');
+
+ // Save task
+ $crawler->filter('[data-testid="save-task"]')->click();
$subtask = $this->Tasks->Subtasks
->find()
@@ -202,7 +211,10 @@ public function testViewMarkSubtaskComplete()
$crawler = $client->getCrawler();
// Complete the subtask
- $crawler->filter('.subtask-row .checkbox')->click();
+ $crawler->filter('.subtask-item .checkbox')->click();
+
+ // Save task
+ $crawler->filter('[data-testid="save-task"]')->click();
$subtask = $this->Tasks->Subtasks->get($subtask->id);
$this->assertTrue($subtask->completed);
@@ -210,6 +222,8 @@ public function testViewMarkSubtaskComplete()
public function testViewReorderSubtasks()
{
+ $this->markTestIncomplete('Cannot test HTML5 drag and drop with selenium');
+
$task = $this->setupTask();
$subtasks = [
$this->makeSubtask('Get soap', $task->id, 0),
diff --git a/tests/Acceptance/TodayTest.php b/tests/Acceptance/TodayTest.php
index f1e3aadf..ae631cc4 100644
--- a/tests/Acceptance/TodayTest.php
+++ b/tests/Acceptance/TodayTest.php
@@ -4,7 +4,6 @@
namespace App\Test\Acceptance;
use Cake\I18n\FrozenDate;
-use Cake\ORM\TableRegistry;
/**
* Tests for the today view
@@ -20,11 +19,13 @@ public function setUp(): void
{
parent::setUp();
- $this->Tasks = TableRegistry::get('Tasks');
+ $this->Tasks = $this->fetchTable('Tasks');
}
public function testTodayOnboarding()
{
+ $this->markTestIncomplete('Onboarding view not complete');
+
$client = $this->login();
$client->get('/tasks/today');
$client->waitFor('[data-testid="loggedin"]');
@@ -74,14 +75,11 @@ public function testCreateInToday()
// Open the add form
$button = $crawler->filter('[data-testid="add-task"]');
$button->click();
- $client->waitFor('.task-quickform');
+ $client->waitFor('dialog');
- $title = $crawler->filter('.task-quickform .smart-task-input input');
- $title->sendKeys('A new task');
+ $form = $crawler->filter('dialog form')->form();
+ $form->get('title')->setValue('A new task');
- // Use the default project value as it is hard to automate with webdriver.
- // Consider https://stackoverflow.com/questions/41991077/testing-react-select-component
- // when needing to automate that component comes up again.
$button = $client->getCrawler()->filter('[data-testid="save-task"]');
$button->click();
@@ -101,12 +99,12 @@ public function testCreateInEvening()
$crawler = $client->getCrawler();
// Open the add form in the evening section.
- $button = $crawler->filter('[data-testid="evening-group"] [data-testid="add-task"]');
+ $button = $crawler->filter('[data-testid="add-task-evening"]');
$button->click();
- $client->waitFor('.task-quickform');
+ $client->waitFor('dialog');
- $title = $crawler->filter('.task-quickform .smart-task-input input');
- $title->sendKeys('evening task');
+ $form = $crawler->filter('dialog form')->form();
+ $form->get('title')->setValue('evening task');
$button = $client->getCrawler()->filter('[data-testid="save-task"]');
$button->click();
@@ -129,23 +127,17 @@ public function testCreateWithSubtasks()
// Open the add form
$button = $crawler->filter('[data-testid="add-task"]');
$button->click();
- $client->waitFor('.task-quickform');
-
- $title = $crawler->filter('.task-quickform .smart-task-input input');
- $title->sendKeys('A new task');
+ $client->waitFor('dialog');
- $crawler->filter('[data-testid="add-subtasks"]')->click();
- $client->waitFor('.task-subtasks');
+ // Fill out the task title
+ $form = $crawler->filter('dialog form')->form();
+ $form->get('title')->setValue('A new task');
// Add a subtask
- $form = $crawler->filter('.task-quickform')->form();
- $form->get('subtask_title')->setValue('First subtask');
- $button = $crawler->filter('[data-testid="save-subtask"]');
+ $form->get('_subtaskadd')->setValue('First subtask');
+ $button = $crawler->filter('[data-testid="subtask-add"]');
$button->click();
- // Use the default project value as it is hard to automate with webdriver.
- // Consider https://stackoverflow.com/questions/41991077/testing-react-select-component
- // when needing to automate that component comes up again.
$button = $client->getCrawler()->filter('[data-testid="save-task"]');
$button->click();
@@ -175,7 +167,9 @@ public function testCompleteTask()
$this->assertEquals($task->title, $title->getText());
$checkbox = $crawler->filter('.task-row .checkbox')->first();
$checkbox->click();
- $client->waitFor('.flash-message');
+
+ // TODO perhaps task completion should have a flash message again?
+ // $client->waitFor('.flash-message');
$task = $this->Tasks->get($task->id);
$this->assertNotEmpty($task);
diff --git a/tests/Acceptance/UpcomingTest.php b/tests/Acceptance/UpcomingTest.php
index 0fec65ab..67ea4fc1 100644
--- a/tests/Acceptance/UpcomingTest.php
+++ b/tests/Acceptance/UpcomingTest.php
@@ -4,7 +4,7 @@
namespace App\Test\Acceptance;
use Cake\I18n\FrozenDate;
-use Cake\ORM\TableRegistry;
+use Symfony\Component\Panther\Client;
/**
* Tests for the upcoming list view.
@@ -20,11 +20,20 @@ public function setUp(): void
{
parent::setUp();
- $this->Tasks = TableRegistry::get('Tasks');
+ $this->Tasks = $this->fetchTable('Tasks');
+ }
+
+ public function hoverRow(Client $client)
+ {
+ // Trigger the hover.
+ $client->getMouse()->mouseMoveTo('.task-row');
+ $client->waitFor('.task-row drop-down');
}
public function testOnboarding()
{
+ $this->markTestIncomplete('No project state is not working');
+
$client = $this->login();
$client->get('/tasks/upcoming');
$client->waitFor('[data-testid="loggedin"]');
@@ -77,7 +86,8 @@ public function testCompleteTask()
$this->assertEquals($task->title, $title->getText());
$checkbox = $crawler->filter('.task-row .checkbox')->first();
$checkbox->click();
- $client->waitFor('.flash-message');
+ // TODO need to add flash message for task completion.
+ // $client->waitFor('.flash-message');
$task = $this->Tasks->get($task->id);
$this->assertNotEmpty($task);
@@ -97,10 +107,10 @@ public function testCreate()
// Open the add form.
$addButton = $crawler->filter('[data-testid="add-task"]')->first();
$addButton->click();
- $client->waitFor('.task-quickform');
+ $client->waitFor('dialog');
- $title = $crawler->filter('.task-quickform .smart-task-input input');
- $title->sendKeys('upcoming task');
+ $form = $crawler->filter('dialog form')->form();
+ $form->get('title')->setValue('upcoming task');
$button = $client->getCrawler()->filter('[data-testid="save-task"]');
$button->click();
@@ -124,18 +134,18 @@ public function testChangeDateWithContextMenu()
// Trigger the hover.
$client->getMouse()->mouseMoveTo('.task-row');
$crawler = $client->getCrawler();
- $client->waitFor('.task-row .actions');
+ $client->waitFor('.task-row drop-down');
// Hover over the due menu
- $crawler = $client->getCrawler();
- $client->getMouse()->mouseMoveTo('.actions [aria-label="Task actions"]');
- $crawler->filter('.actions [aria-label="Task actions"]')->click();
+ $client->getMouse()->mouseMoveTo('drop-down [aria-label="Task actions"]');
+ $crawler->filter('drop-down [aria-label="Task actions"]')->click();
// Open the due menu
$crawler->filter('[data-testid="reschedule"]')->click();
- $client->waitFor('.due-on-menu');
+
// Click today
- $this->clickWithMouse('.due-on-menu [data-testid="today"]');
+ $client->waitFor('[data-testid="today"]');
+ $this->clickWithMouse('[data-testid="today"]');
$client->waitFor('.flash-message');
@@ -156,19 +166,19 @@ public function testChangeDateAndEveningWithContextMenu()
// Trigger the hover.
$client->getMouse()->mouseMoveTo('.task-row');
$crawler = $client->getCrawler();
- $client->waitFor('.task-row .actions');
+ $client->waitFor('.task-row drop-down');
// Hover over the actions menu and click
$crawler = $client->getCrawler();
- $client->getMouse()->mouseMoveTo('.actions [aria-label="Task actions"]');
- $crawler->filter('.actions [aria-label="Task actions"]')->click();
+ $client->getMouse()->mouseMoveTo('drop-down [aria-label="Task actions"]');
+ $crawler->filter('drop-down [aria-label="Task actions"]')->click();
// Open the due menu
$crawler->filter('[data-testid="reschedule"]')->click();
- $client->waitFor('.due-on-menu');
// Click 'this evening'
- $this->clickWithMouse('.due-on-menu [data-testid="evening"]');
+ $client->waitFor('drop-down-menu button.icon-evening');
+ $this->clickWithMouse('drop-down-menu button.icon-evening');
$client->waitFor('.flash-message');
@@ -179,6 +189,7 @@ public function testChangeDateAndEveningWithContextMenu()
public function testChangeAddEveningWithContextMenu()
{
+ $today = new FrozenDate('today', 'UTC');
$tomorrow = new FrozenDate('tomorrow', 'UTC');
$project = $this->makeProject('Work', 1);
$task = $this->makeTask('Do dishes', $project->id, 0, ['due_on' => $tomorrow]);
@@ -187,28 +198,25 @@ public function testChangeAddEveningWithContextMenu()
$client->get('/tasks/upcoming');
$client->waitFor('[data-testid="loggedin"]');
- // Trigger the hover.
- $client->getMouse()->mouseMoveTo('.task-row');
- $crawler = $client->getCrawler();
- $client->waitFor('.task-row .actions');
+ $this->hoverRow($client);
// Hover over the actions menu and click
$crawler = $client->getCrawler();
- $client->getMouse()->mouseMoveTo('.actions [aria-label="Task actions"]');
- $crawler->filter('.actions [aria-label="Task actions"]')->click();
+ $client->getMouse()->mouseMoveTo('drop-down [aria-label="Task actions"]');
+ $crawler->filter('drop-down [aria-label="Task actions"]')->click();
// Open the due menu
$crawler->filter('[data-testid="reschedule"]')->click();
- $client->waitFor('.due-on-menu');
// Click 'this evening'
- $this->clickWithMouse('.due-on-menu [data-testid="add-evening"]');
+ $client->waitFor('drop-down-menu [data-testid="evening"]');
+ $this->clickWithMouse('drop-down-menu [data-testid="evening"]');
$client->waitFor('.flash-message');
$updated = $this->Tasks->get($task->id);
- $this->assertSame($tomorrow->getTimestamp(), $updated->due_on->getTimestamp());
$this->assertTrue($updated->evening);
+ $this->assertSame($today->getTimestamp(), $updated->due_on->getTimestamp());
}
public function testChangeProjectWithContextMenu()
@@ -225,21 +233,22 @@ public function testChangeProjectWithContextMenu()
// Trigger the hover.
$client->getMouse()->mouseMoveTo('.task-row');
$crawler = $client->getCrawler();
- $client->waitFor('.task-row .actions');
+ $client->waitFor('.task-row drop-down');
// Hover over the actions menu
$crawler = $client->getCrawler();
- $client->getMouse()->mouseMoveTo('.actions [aria-label="Task actions"]');
- $crawler->filter('.actions [aria-label="Task actions"]')->click();
+ $client->getMouse()->mouseMoveTo('drop-down [aria-label="Task actions"]');
+ $crawler->filter('drop-down [aria-label="Task actions"]')->click();
// Open the project menu
- $crawler->filter('[data-testid="move"]')->click();
- $client->waitFor('.select__control');
+ $crawler->filter('drop-down-menu [data-testid="move"]')->click();
+ $client->waitFor('drop-down-menu form');
// Choose a new project.
- $this->clickWithMouse('.select__control');
- // TODO Using last-child is a hack. Revisit this and make better selectors.
- $this->clickWithMouse('.select__menu-list > div:last-child');
+ $crawler->filter('drop-down-menu select-box')->click();
+ $client->waitFor('select-box-menu');
+
+ $crawler->filter('select-box-menu select-box-option:last-child')->click();
$client->waitFor('.flash-message');
@@ -249,6 +258,8 @@ public function testChangeProjectWithContextMenu()
public function testDragToNewDate()
{
+ $this->markTestIncomplete('Cannot test html5 dragdrop with selenium.');
+
$project = $this->makeProject('Work', 1);
$tomorrow = new FrozenDate('tomorrow', 'UTC');
$twoDays = new FrozenDate('+2 days', 'UTC');
diff --git a/tests/TestCase/Controller/CalendarProvidersControllerTest.php b/tests/TestCase/Controller/CalendarProvidersControllerTest.php
index 7b9ba56f..ec89fbcd 100644
--- a/tests/TestCase/Controller/CalendarProvidersControllerTest.php
+++ b/tests/TestCase/Controller/CalendarProvidersControllerTest.php
@@ -168,6 +168,7 @@ public function testView(): void
]);
$this->login();
+ $this->requestJson();
$this->get("/calendars/{$ownProvider->id}/view");
$this->assertResponseOk();
$provider = $this->viewVariable('provider');
@@ -186,6 +187,7 @@ public function testViewPermissions(): void
// Owned by a different user.
$provider = $this->makeCalendarProvider(2, 'other@example.com');
$this->login();
+ $this->requestJson();
$this->get("/calendars/{$provider->id}/view");
$this->assertResponseError();
}
@@ -206,6 +208,7 @@ public function testViewBrokenGoogleAuth(): void
]);
$this->login();
+ $this->requestJson();
$this->get("/calendars/{$ownProvider->id}/view");
$this->assertResponseOk();
$provider = $this->viewVariable('provider');
diff --git a/tests/TestCase/Controller/ProjectSectionsControllerTest.php b/tests/TestCase/Controller/ProjectSectionsControllerTest.php
index c0be413d..4fef6ad6 100644
--- a/tests/TestCase/Controller/ProjectSectionsControllerTest.php
+++ b/tests/TestCase/Controller/ProjectSectionsControllerTest.php
@@ -138,71 +138,56 @@ public function testEditValidationFailure()
$this->assertNotEmpty($this->viewVariable('errors'));
}
- public function testEditProjectPermissionError()
+ public function testEditGet()
{
- $other = $this->makeProject('Other Home', 2);
$project = $this->makeProject('Home', 1);
$section = $this->makeProjectSection('Day trips', $project->id);
$this->login();
- $this->enableCsrfToken();
- $this->post("/projects/{$project->slug}/sections/{$section->id}/edit", [
- 'name' => 'Reading list',
- 'project_id' => $other->id,
- ]);
- $this->assertResponseCode(403);
+ $this->get("/projects/{$project->slug}/sections/{$section->id}/edit");
+
+ $this->assertResponseCode(200);
+ $this->assertContentType('text/html');
+ $this->assertNotEmpty($this->viewVariable('project'));
+ $this->assertNotEmpty($this->viewVariable('section'));
}
- public function testArchive()
+ public function testView()
{
$project = $this->makeProject('Home', 1);
$section = $this->makeProjectSection('Day trips', $project->id);
$this->login();
$this->enableCsrfToken();
- $this->post("/projects/{$project->slug}/sections/{$section->id}/archive");
- $this->assertRedirect('/projects/home');
+ $this->get("/projects/{$project->slug}/sections/{$section->id}/view");
- $updated = $this->ProjectSections->get($section->id);
- $this->assertTrue($updated->archived);
+ $this->assertResponseOk();
+ $this->assertNotEmpty($this->viewVariable('project'));
+ $this->assertNotEmpty($this->viewVariable('section'));
}
- public function testArchivePermission()
+ public function testViewPermissions()
{
$project = $this->makeProject('Home', 2);
$section = $this->makeProjectSection('Day trips', $project->id);
$this->login();
$this->enableCsrfToken();
- $this->post("/projects/{$project->slug}/sections/{$section->id}/archive");
+ $this->post("/projects/{$project->slug}/sections/{$section->id}/view");
$this->assertResponseCode(404);
}
- public function testUnarchive()
+ public function testDeleteConfirm()
{
$project = $this->makeProject('Home', 1);
- $section = $this->makeProjectSection('Day trips', $project->id, 0, [
- 'archived' => true,
- ]);
-
- $this->login();
- $this->enableCsrfToken();
- $this->post("/projects/{$project->slug}/sections/{$section->id}/unarchive");
- $this->assertRedirect('/projects/home');
-
- $updated = $this->ProjectSections->get($section->id);
- $this->assertFalse($updated->archived);
- }
-
- public function testUnarchivePermission()
- {
- $project = $this->makeProject('Home', 2);
$section = $this->makeProjectSection('Day trips', $project->id);
$this->login();
- $this->enableCsrfToken();
- $this->post("/projects/{$project->slug}/sections/{$section->id}/unarchive");
- $this->assertResponseCode(404);
+ $this->get("/projects/{$project->slug}/sections/{$section->id}/delete/confirm");
+
+ $this->assertResponseOk();
+ $this->assertNotEmpty($this->viewVariable('project'));
+ $this->assertNotEmpty($this->viewVariable('section'));
}
public function testDelete()
@@ -320,4 +305,27 @@ public function testMoveUp()
$this->assertEquals($id, $results[$i]->id);
}
}
+
+ public function testOptionsNotFound()
+ {
+ $project = $this->makeProject('Home', 1);
+ $this->makeProjectSection('Reading', $project->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->get('/projectsections/options?project_id=999');
+ $this->assertResponseCode(404);
+ }
+
+ public function testOptionsOk()
+ {
+ $project = $this->makeProject('Home', 1);
+ $this->makeProjectSection('Reading', $project->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->get("/projectsections/options?project_id={$project->id}");
+ $this->assertResponseOk();
+ $this->assertResponseContains('Reading');
+ }
}
diff --git a/tests/TestCase/Controller/ProjectsControllerTest.php b/tests/TestCase/Controller/ProjectsControllerTest.php
index b79488eb..621026ce 100644
--- a/tests/TestCase/Controller/ProjectsControllerTest.php
+++ b/tests/TestCase/Controller/ProjectsControllerTest.php
@@ -90,6 +90,22 @@ public function testView(): void
$this->assertCount(1, $this->viewVariable('tasks'));
}
+ public function testViewHtmx(): void
+ {
+ $home = $this->makeProject('Home', 1, 0, ['archived' => true]);
+ $this->makeTask('first post', $home->id, 0);
+
+ $this->login();
+ $this->useHtmx();
+ $this->get("/projects/{$home->slug}");
+
+ $this->assertResponseOk();
+ // Important to close menus like move project and reschedule.
+ $this->assertHeader('Hx-Trigger', 'close');
+ $this->assertSame($home->id, $this->viewVariable('project')->id);
+ $this->assertCount(1, $this->viewVariable('tasks'));
+ }
+
public function testViewApiToken(): void
{
$token = $this->makeApiToken(1);
@@ -134,7 +150,6 @@ public function testViewCompleted(): void
$this->assertResponseOk();
$this->assertSame($home->id, $this->viewVariable('project')->id);
$this->assertCount(1, $this->viewVariable('tasks'));
- $this->assertCount(1, $this->viewVariable('completed'));
}
public function testAddGet(): void
@@ -147,6 +162,7 @@ public function testAddGet(): void
$this->get('/projects/add');
$this->assertResponseOk();
+ $this->assertTemplate('Projects/add');
$this->assertSame('/tasks/today', $this->viewVariable('referer'));
}
@@ -535,4 +551,75 @@ public function testMoveUp()
$this->assertEquals($id, $results[$i]->id);
}
}
+
+ public function testReorderOk()
+ {
+ $home = $this->makeProject('Home', 1, 0);
+ $work = $this->makeProject('Work', 1, 3);
+ $fun = $this->makeProject('Fun', 1, 6);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->post('/projects/reorder', [
+ 'id' => [$fun->id, $work->id, $home->id],
+ ]);
+ $this->assertResponseOk();
+ $this->assertResponseContains('Home');
+ $this->assertResponseContains('Work');
+
+ $results = $this->Projects->find()->orderAsc('ranking')->toArray();
+ $expected = [$fun->id, $work->id, $home->id];
+ $this->assertCount(count($expected), $results);
+ foreach ($expected as $i => $id) {
+ $this->assertEquals($id, $results[$i]->id);
+ }
+ }
+
+ public function testReorderPermissions()
+ {
+ $home = $this->makeProject('Home', 1, 0);
+ $work = $this->makeProject('Work', 1, 3);
+ $nope = $this->makeProject('Other Home', 2, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->post('/projects/reorder', [
+ 'id' => [$nope->id, $work->id, $home->id],
+ ]);
+ $this->assertResponseCode(400);
+
+ $results = $this->Projects->find()
+ ->orderAsc('user_id')
+ ->orderAsc('ranking')
+ ->toArray();
+ $expected = [$home->id, $work->id, $nope->id];
+ $this->assertCount(count($expected), $results);
+ foreach ($expected as $i => $id) {
+ $this->assertEquals($id, $results[$i]->id);
+ }
+ }
+
+ public function testReorderPartialUpdates()
+ {
+ $home = $this->makeProject('Home', 1, 0);
+ $work = $this->makeProject('Work', 1, 3);
+ $other = $this->makeProject('Other', 1, 6);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->post('/projects/reorder', [
+ 'id' => [$other->id, $work->id],
+ ]);
+ $this->assertResponseOk();
+
+ $results = $this->Projects->find()
+ ->orderAsc('ranking')
+ ->orderAsc('name')
+ ->toArray();
+ $expected = [$home->id, $other->id, $work->id];
+ $this->assertCount(count($expected), $results);
+ foreach ($expected as $i => $id) {
+ $this->assertEquals($id, $results[$i]->id);
+ }
+ }
}
diff --git a/tests/TestCase/Controller/TasksControllerTest.php b/tests/TestCase/Controller/TasksControllerTest.php
index d55cfec2..05428996 100644
--- a/tests/TestCase/Controller/TasksControllerTest.php
+++ b/tests/TestCase/Controller/TasksControllerTest.php
@@ -187,7 +187,7 @@ public function testIndexInvalidRange()
*
* @return void
*/
- public function testTodayRoute(): void
+ public function testToday(): void
{
$today = new FrozenDate('today');
$tomorrow = $today->modify('+1 day');
@@ -210,7 +210,7 @@ public function testTodayRoute(): void
$this->assertResponseOk();
$tasks = $this->viewVariable('tasks');
$this->assertCount(2, $tasks);
- $this->assertEquals($today->format('Y-m-d'), $this->viewVariable('date'));
+ $this->assertEquals($today->format('Y-m-d'), $this->viewVariable('date')->format('Y-m-d'));
$ids = collection($tasks)->extract('id')->toList();
$this->assertEquals([$overdue->id, $first->id], $ids);
@@ -304,7 +304,7 @@ public function testDailyParam(): void
$this->assertResponseOk();
$tasks = $this->viewVariable('tasks');
$this->assertCount(1, $tasks);
- $this->assertEquals($today->format('Y-m-d'), $this->viewVariable('date'));
+ $this->assertEquals($today->format('Y-m-d'), $this->viewVariable('date')->format('Y-m-d'));
$ids = collection($tasks)->extract('id')->toList();
$this->assertEquals([$first->id], $ids);
@@ -398,7 +398,6 @@ public function testDailyCalendarItems(): void
]);
$this->login();
- $this->disableErrorHandlerMiddleware();
$this->get("/tasks/day/{$startOfDay->format('Y-m-d')}");
$this->assertResponseOk();
@@ -435,7 +434,6 @@ public function testIndexCalendarItems(): void
]);
$this->login();
- $this->disableErrorHandlerMiddleware();
$this->get('/tasks');
$this->assertResponseOk();
@@ -572,6 +570,24 @@ public function testViewApi()
$this->assertSame($var->title, $first->title);
}
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testViewModeEditProject(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->get("/tasks/{$first->id}/view/editproject");
+ $this->assertResponseOk();
+ $var = $this->viewVariable('task');
+ $this->assertSame($var->title, $first->title);
+ $this->assertTemplate('Tasks/editproject');
+ }
+
public function testAdd(): void
{
$project = $this->makeProject('work', 1);
@@ -593,6 +609,31 @@ public function testAdd(): void
$this->assertEquals(1, $project->incomplete_task_count);
}
+ public function testAddWithDefaultValues(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $section = $this->makeProjectSection('long term', $project->id);
+ $tomorrow = FrozenDate::parse('tomorrow');
+ $tomorrowStr = $tomorrow->format('Y-m-d');
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->get("/tasks/add?title=first+todo&project_id={$project->id}&due_on={$tomorrowStr}");
+ $this->assertResponseOk();
+
+ $task = $this->viewVariable('task');
+ $this->assertSame('first todo', $task->title);
+ $this->assertSame($project->id, $task->project_id);
+ $this->assertEquals($tomorrow, $task->due_on);
+
+ $sections = $this->viewVariable('sections');
+ $this->assertCount(1, $sections);
+ $this->assertEquals($section->id, $sections[0]->id);
+
+ $project = $this->Tasks->Projects->get($project->id);
+ $this->assertEquals(0, $project->incomplete_task_count);
+ }
+
public function testAddApiToken(): void
{
$project = $this->makeProject('work', 1);
@@ -718,7 +759,7 @@ public function testEdit(): void
'title' => 'updated',
'evening' => true,
]);
- $this->assertResponseCode(200);
+ $this->assertRedirect("/tasks/{$first->id}/view");
$this->assertFlashElement('flash/success');
$updated = $this->viewVariable('task');
@@ -728,6 +769,60 @@ public function testEdit(): void
$this->assertSame('work', $updated->project->slug);
}
+ public function testEditDueOnString(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $this->assertNull($first->due_on);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'due_on_string' => 'tomorrow',
+ ]);
+ $this->assertRedirect("/tasks/{$first->id}/view");
+ $this->assertFlashElement('flash/success');
+
+ $updated = $this->viewVariable('task');
+ $this->assertEquals(FrozenDate::parse('tomorrow'), $updated->due_on);
+ }
+
+ public function testEditRedirect(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $this->assertNull($first->due_on);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'due_on_string' => 'tomorrow',
+ 'redirect' => '/tasks/today',
+ ]);
+ $this->assertRedirect('/tasks/today');
+ $this->assertFlashElement('flash/success');
+ }
+
+ public function testEditSubtaskAddRedirect(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $this->assertNull($first->due_on);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'due_on_string' => 'tomorrow',
+ 'subtask_add' => '1',
+ 'redirect' => '/tasks/today',
+ ]);
+ $this->assertRedirect('/tasks/today');
+ $this->assertFlashElement('flash/success');
+ }
+
public function testEditApiToken(): void
{
$token = $this->makeApiToken(1);
@@ -757,6 +852,7 @@ public function testEditProject(): void
$this->useApiToken($token->token);
$this->requestJson();
+
$this->post("/tasks/{$first->id}/edit", [
'project_id' => $home->id,
]);
@@ -767,6 +863,22 @@ public function testEditProject(): void
$this->assertEquals($updated->project->id, $home->id);
}
+ public function testEditHtmx(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $home = $this->makeProject('home', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->useHtmx();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'project_id' => $home->id,
+ 'redirect' => '/projects/home',
+ ]);
+ $this->assertRedirect('/projects/home');
+ }
+
public function testEditValidation(): void
{
$project = $this->makeProject('work', 1);
@@ -799,6 +911,142 @@ public function testEditValidationApiToken(): void
$this->assertResponseContains('errors');
}
+ public function testEditCreateSubtasks(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'title' => 'updated',
+ 'evening' => true,
+ 'subtasks' => [
+ ['title' => 'first step'],
+ ['title' => 'second step'],
+ ],
+ ]);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
+ $this->assertFlashElement('flash/success');
+
+ /** @var \App\Model\Entity\Task $updated */
+ $updated = $this->viewVariable('task');
+ $this->assertCount(2, $updated->subtasks);
+ $this->assertEquals(2, $updated->subtask_count);
+ $this->assertEquals(0, $updated->complete_subtask_count);
+ $this->assertSame('first step', $updated->subtasks[0]->title);
+ $this->assertEquals(1, $updated->subtasks[0]->ranking);
+ $this->assertFalse($updated->subtasks[0]->completed);
+
+ $this->assertSame('second step', $updated->subtasks[1]->title);
+ $this->assertEquals(2, $updated->subtasks[1]->ranking);
+ $this->assertFalse($updated->subtasks[1]->completed);
+ }
+
+ public function testEditCreateSubtasksNoBlank(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'title' => 'updated',
+ 'evening' => true,
+ 'subtasks' => [
+ ['title' => 'first step'],
+ ['title' => ''],
+ ],
+ ]);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
+ $this->assertFlashElement('flash/success');
+
+ $updated = $this->viewVariable('task');
+ $this->assertCount(1, $updated->subtasks);
+ $this->assertSame('first step', $updated->subtasks[0]->title);
+ $this->assertEquals(1, $updated->subtasks[0]->ranking);
+ $this->assertFalse($updated->subtasks[0]->completed);
+ }
+
+ public function testEditUpdateSubtasks(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $sub = $this->makeSubtask('first step', $first->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'title' => 'updated',
+ 'subtasks' => [
+ ['id' => $sub->id, 'title' => 'step one!', 'completed' => true],
+ ['title' => 'step three'],
+ ],
+ ]);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
+ $this->assertFlashElement('flash/success');
+
+ $updated = $this->viewVariable('task');
+ $this->assertCount(2, $updated->subtasks);
+ $this->assertSame('step one!', $updated->subtasks[0]->title);
+ $this->assertTrue($updated->subtasks[0]->completed);
+
+ $this->assertSame('step three', $updated->subtasks[1]->title);
+ $this->assertEquals(1, $updated->subtasks[1]->ranking);
+ $this->assertFalse($updated->subtasks[1]->completed);
+ }
+
+ public function testEditUpdateSubtasksRemove(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $sub = $this->makeSubtask('first step', $first->id, 0);
+ // This subtask isn't part of the update.
+ $this->makeSubtask('second step', $first->id, 1);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->enableRetainFlashMessages();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'title' => 'updated',
+ 'subtasks' => [
+ ['id' => $sub->id, 'title' => $sub->title],
+ ],
+ ]);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
+ $this->assertFlashElement('flash/success');
+
+ $updated = $this->viewVariable('task');
+ $this->assertCount(1, $updated->subtasks);
+ $this->assertEquals(1, $updated->subtask_count);
+ $this->assertSame($sub->title, $updated->subtasks[0]->title);
+ $this->assertFalse($updated->subtasks[0]->completed);
+ }
+
+ public function testEditRemoveSubtaskLast(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+ $this->makeSubtask('first step', $first->id, 0);
+
+ $this->login();
+ $this->enableCsrfToken();
+ $this->post("/tasks/{$first->id}/edit", [
+ 'title' => $first->title,
+ 'subtasks' => [],
+ ]);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
+
+ $todo = $this->Tasks->find()->contain('Subtasks')->firstOrFail();
+ $this->assertSame('first', $todo->title);
+ $this->assertCount(0, $todo->subtasks);
+ $this->assertEquals(0, $todo->subtask_count);
+ $this->assertEquals(0, $todo->complete_subtask_count);
+ }
+
public function testEditPermissions(): void
{
$project = $this->makeProject('work', 2);
@@ -814,7 +1062,7 @@ public function testEditPermissions(): void
public function testEditProjectPermission(): void
{
- $other = $this->makeProject('work', 2);
+ $other = $this->makeProject('other work', 2);
$project = $this->makeProject('work', 1);
$first = $this->makeTask('first', $project->id, 0);
@@ -843,7 +1091,7 @@ public function testEditChangeProjectWithSection(): void
'title' => 'updated',
'project_id' => $other->id,
]);
- $this->assertResponseCode(200);
+ $this->assertRedirectContains("/tasks/{$first->id}/view");
$todo = $this->Tasks->get($first->id);
$this->assertSame('updated', $todo->title);
@@ -904,6 +1152,35 @@ public function testDeletePermission(): void
$this->assertNull($deleted->deleted_at);
}
+ public function testDeleteConfirm(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->get("/tasks/{$first->id}/delete/confirm");
+
+ $this->assertResponseOk();
+ $this->assertResponseContains('Are you sure?');
+
+ $deleted = $this->Tasks->findById($first->id)->firstOrFail();
+ $this->assertNull($deleted->deleted_at);
+ }
+
+ public function testDeleteConfirmPermissions(): void
+ {
+ $project = $this->makeProject('work', 2);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->get("/tasks/{$first->id}/delete/confirm");
+
+ $this->assertResponseCode(403);
+
+ $deleted = $this->Tasks->findById($first->id)->firstOrFail();
+ $this->assertNull($deleted->deleted_at);
+ }
+
public function testUndelete(): void
{
$project = $this->makeProject('work', 1);
@@ -975,6 +1252,24 @@ public function testComplete(): void
$this->assertTrue($todo->completed);
}
+ public function testCompleteHtmx(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0);
+
+ $this->login();
+ $this->configRequest([
+ 'headers' => ['Hx-Request' => 'true'],
+ ]);
+ $this->enableCsrfToken();
+ $this->delete("/tasks/{$first->id}/complete");
+ $this->assertResponseCode(200);
+ $this->assertResponseEquals('');
+
+ $todo = $this->Tasks->get($first->id);
+ $this->assertTrue($todo->completed);
+ }
+
public function testCompleteApiToken(): void
{
$token = $this->makeApiToken(1);
@@ -1018,6 +1313,24 @@ public function testIncomplete(): void
$this->assertFalse($todo->completed);
}
+ public function testIncompleteHtmx(): void
+ {
+ $project = $this->makeProject('work', 1);
+ $first = $this->makeTask('first', $project->id, 0, ['completed' => true]);
+
+ $this->login();
+ $this->configRequest([
+ 'headers' => ['HX-Request' => 'true'],
+ ]);
+ $this->enableCsrfToken();
+ $this->delete("/tasks/{$first->id}/incomplete");
+ $this->assertResponseCode(200);
+ $this->assertResponseEquals('');
+
+ $todo = $this->Tasks->get($first->id);
+ $this->assertFalse($todo->completed);
+ }
+
public function testIncompleteApiToken(): void
{
$token = $this->makeApiToken(1);
diff --git a/tests/TestCase/FactoryTrait.php b/tests/TestCase/FactoryTrait.php
index 81614f1b..0d736cb5 100644
--- a/tests/TestCase/FactoryTrait.php
+++ b/tests/TestCase/FactoryTrait.php
@@ -38,6 +38,9 @@ protected function useApiToken(string $token)
$this->configRequest(['headers' => $headers]);
}
+ /**
+ * Send a request as a JSON api
+ */
protected function requestJson()
{
$headers = $this->_request['headers'] ?? [];
@@ -48,9 +51,20 @@ protected function requestJson()
]);
}
+ /**
+ * Send a request as htmx
+ */
+ protected function useHtmx()
+ {
+ $this->configRequest([
+ 'headers' => ['Hx-Request' => 'true'],
+ ]);
+ }
+
protected function makeApiToken($userId = 1, $props = []): ApiToken
{
$apiTokens = $this->fetchTable('ApiTokens');
+ /** @var \App\Model\Entity\ApiToken $token */
$token = $apiTokens->newEntity(array_merge([
'last_used' => null,
], $props));
@@ -60,9 +74,20 @@ protected function makeApiToken($userId = 1, $props = []): ApiToken
return $apiTokens->saveOrFail($token);
}
+ protected function getUser($email): User
+ {
+ $users = $this->fetchTable('Users');
+
+ /** @var \App\Model\Entity\User $user */
+ $user = $users->findByEmail($email)->firstOrFail();
+
+ return $user;
+ }
+
protected function makeUser($email, $props = []): User
{
$users = $this->fetchTable('Users');
+ /** @var \App\Model\Entity\User $user */
$user = $users->newEntity(array_merge([
'name' => 'Unknown',
'email' => $email,
@@ -82,6 +107,7 @@ protected function makeProject($name, $userId = 1, $ranking = 0, $props = []): P
'color' => 1,
'ranking' => $ranking,
], $props);
+ /** @var \App\Model\Entity\Project $project */
$project = $projects->newEntity($props, ['accessibleFields' => ['*' => true]]);
return $projects->saveOrFail($project);
@@ -95,6 +121,7 @@ protected function makeProjectSection($name, $projectId, $ranking = 0, $props =
'name' => $name,
'ranking' => $ranking,
], $props);
+ /** @var \App\Model\Entity\ProjectSection $section */
$section = $sections->newEntity($props, ['accessibleFields' => ['*' => true]]);
return $sections->saveOrFail($section);
@@ -109,6 +136,7 @@ protected function makeTask($title, $projectId, $order, $props = []): Task
'day_order' => $order,
'child_order' => $order,
], $props);
+ /** @var \App\Model\Entity\Task $task */
$task = $tasks->newEntity($props, ['accessibleFields' => ['*' => true]]);
return $tasks->saveOrFail($task);
@@ -117,6 +145,7 @@ protected function makeTask($title, $projectId, $order, $props = []): Task
protected function makeSubtask($title, $taskId, $ranking, $props = []): Subtask
{
$subtasks = $this->fetchTable('Subtasks');
+ /** @var \App\Model\Entity\Subtask $subtask */
$subtask = $subtasks->newEntity(array_merge([
'task_id' => $taskId,
'title' => $title,
@@ -129,6 +158,7 @@ protected function makeSubtask($title, $taskId, $ranking, $props = []): Subtask
protected function makeCalendarProvider($userId, $identifier, $props = []): CalendarProvider
{
$providers = $this->fetchTable('CalendarProviders');
+ /** @var \App\Model\Entity\CalendarProvider $provider */
$provider = $providers->newEntity(array_merge([
'user_id' => $userId,
'kind' => 'google',
@@ -145,6 +175,7 @@ protected function makeCalendarProvider($userId, $identifier, $props = []): Cale
protected function makeCalendarSource($providerId, $name = 'primary', $props = []): CalendarSource
{
$sources = $this->fetchTable('CalendarSources');
+ /** @var \App\Model\Entity\CalendarSource $source */
$source = $sources->newEntity(array_merge([
'calendar_provider_id' => $providerId,
'provider_id' => $name,
diff --git a/tests/TestCase/View/Cell/ProjectsMenuCellTest.php b/tests/TestCase/View/Cell/ProjectsMenuCellTest.php
new file mode 100644
index 00000000..b0248b00
--- /dev/null
+++ b/tests/TestCase/View/Cell/ProjectsMenuCellTest.php
@@ -0,0 +1,102 @@
+loadRoutes();
+
+ $this->request = new ServerRequest(['url' => '/']);
+ $this->response = new Response();
+ $user = $this->getUser('mark@example.com');
+ // TODO this is nasty.
+ $user->setAuthorization(new AuthorizationService(new OrmResolver()));
+ $this->user = $user;
+
+ $this->ProjectsMenu = new ProjectsMenuCell(
+ $this->request,
+ $this->response,
+ null,
+ ['action' => 'display', 'args' => ['identity' => $this->user]],
+ );
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ protected function tearDown(): void
+ {
+ unset($this->ProjectsMenu);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test display method
+ *
+ * @return void
+ * @uses \App\View\Cell\ProjectsMenuCell::display()
+ */
+ public function testDisplay(): void
+ {
+ $one = $this->makeProject('home', 1, 2);
+ $two = $this->makeProject('hobbies', 1, 2);
+ $archived = $this->makeProject('archived', $this->user->id, 3, ['archived' => 1]);
+ // Different user
+ $other = $this->makeProject('work', 2, 1);
+
+ $content = $this->ProjectsMenu->render('display');
+ $this->assertStringNotContainsString($archived->name, $content);
+ $this->assertStringNotContainsString($other->name, $content);
+ $this->assertStringContainsString($one->name, $content);
+ $this->assertStringContainsString($two->name, $content);
+ }
+}
diff --git a/tests/TestCase/View/Helper/.gitkeep b/tests/TestCase/View/Helper/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/tests/TestCase/View/Helper/DateHelperTest.php b/tests/TestCase/View/Helper/DateHelperTest.php
new file mode 100644
index 00000000..342e35c2
--- /dev/null
+++ b/tests/TestCase/View/Helper/DateHelperTest.php
@@ -0,0 +1,74 @@
+Date = new DateHelper($view);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ protected function tearDown(): void
+ {
+ unset($this->Date);
+
+ parent::tearDown();
+ }
+
+ public static function formatCompactProvider()
+ {
+ $past = new FrozenDate('-93 days');
+ $recent = new FrozenDate('-14 days');
+ $thisweek = new FrozenDate('5 days');
+ $faraway = new FrozenDate('30 days');
+
+ return [
+ // Input, output
+ [new FrozenDate('today'), 'Today'],
+ [new FrozenDate('tomorrow'), 'Tomorrow'],
+ [$past, $past->i18nFormat('MMM d yyyy')],
+ [$recent, $recent->i18nFormat('MMM d')],
+ [$thisweek, $thisweek->i18nFormat('EEEE')],
+ [$faraway, $faraway->i18nFormat('MMM d')],
+ ];
+ }
+
+ /**
+ * @dataProvider formatCompactProvider
+ */
+ public function testFormatCompact($input, $output)
+ {
+ $tomorrow = new FrozenDate('tomorrow');
+ $result = $this->Date->formatCompact($input);
+ $this->assertSame($output, $result);
+ }
+}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index f7ebe98b..be495fda 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -57,7 +57,6 @@
ConnectionManager::alias('test_debug_kit', 'debug_kit');
-// Simple setup for with no plugins
(new Migrator())->run();
// Fixate sessionid early on, as php7.2+
diff --git a/tests/js/spec/components/smartTaskInput.spec.js b/tests/js/spec/components/smartTaskInput.spec.js
deleted file mode 100644
index 4433f543..00000000
--- a/tests/js/spec/components/smartTaskInput.spec.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import React, {useState} from 'react';
-import userEvent from '@testing-library/user-event';
-import {render, screen} from '@testing-library/react';
-
-import SmartTaskInput from 'app/components/smartTaskInput';
-import {makeProject} from '../../fixtures';
-
-function SmartTaskInputWrapper({onChangeTitle, defaultValue, ...props}) {
- const [value, setValue] = useState(defaultValue);
-
- function handleChange(newValue, newPlainValue) {
- setValue(newValue);
- onChangeTitle(newValue, newPlainValue);
- }
-
- return ;
-}
-
-describe('SmartTaskInput', function () {
- const projects = [
- makeProject({id: 1, title: 'Work'}),
- makeProject({id: 2, title: 'Home'}),
- ];
- it('renders current values', function () {
- render(
-
- );
- expect(screen.getByRole('textbox').value).toBe('Initial value');
- });
-
- it('updates plain text value with stripped text', async function () {
- const titleChange = jest.fn();
- render(
-
- );
- const textbox = screen.getByRole('textbox');
- await userEvent.type(textbox, '{selectall}{del}#Work\tafter', {delay: 5});
- expect(titleChange).toHaveBeenLastCalledWith('#Work:1# after', 'after');
- });
-
- it('triggers change on project select', async function () {
- const onChange = jest.fn();
- const titleChange = jest.fn();
- render(
-
- );
- const textbox = screen.getByRole('textbox');
- await userEvent.type(textbox, '{selectall}{del}#Work\tafter', {delay: 5});
- expect(onChange).toHaveBeenCalledWith(projects[0].id);
- expect(titleChange).toHaveBeenLastCalledWith('#Work:1# after', 'after');
- });
-
- it('triggers change on date select', async function () {
- const onChange = jest.fn();
- const titleChange = jest.fn();
- render(
-
- );
- const textbox = screen.getByRole('textbox');
- await userEvent.type(textbox, '{selectall}{del}%Tomorrow\tafter', {delay: 5});
- expect(onChange).toHaveBeenCalledWith(expect.stringMatching(/^\d{4}-\d{2}-\d{2}$/));
- expect(titleChange).toHaveBeenLastCalledWith(expect.anything(), 'after');
- });
-
- it('triggers change on date select for evening', async function () {
- const onChange = jest.fn();
- const eveningChange = jest.fn();
- const titleChange = jest.fn();
- render(
-
- );
- const textbox = screen.getByRole('textbox');
- await userEvent.type(textbox, '{selectall}{del}&Tomorrow\tafter', {delay: 5});
- expect(onChange).toHaveBeenCalledWith(expect.stringMatching(/^\d{4}-\d{2}-\d{2}$/));
- expect(eveningChange).toHaveBeenCalledWith(true);
- expect(titleChange).toHaveBeenLastCalledWith(expect.anything(), 'after');
- });
-});
diff --git a/tests/js/spec/providers/defaultTaskValues.spec.tsx b/tests/js/spec/providers/defaultTaskValues.spec.tsx
deleted file mode 100644
index 2b762c3a..00000000
--- a/tests/js/spec/providers/defaultTaskValues.spec.tsx
+++ /dev/null
@@ -1,223 +0,0 @@
-import {renderHook, act} from '@testing-library/react-hooks';
-import {useDefaultTaskValues} from 'app/providers/defaultTaskValues';
-
-test('item reset overwrite all data', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {project_id: 1, due_on: '2021-10-01'}});
- });
- act(() => {
- result.current[1]({
- type: 'reset',
- data: {project_id: 2, due_on: '2021-10-24', evening: true},
- });
- });
-
- let state = result.current[0];
- expect(state.distilled.project_id).toEqual(2);
- expect(state.distilled.due_on).toEqual('2021-10-24');
- expect(state.items).toHaveLength(1);
-});
-
-test('item add should set project_id', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {project_id: 1}});
- });
-
- let state = result.current[0];
- expect(state.distilled.project_id).toEqual(1);
- expect(state.items).toHaveLength(1);
-
- act(() => {
- result.current[1]({type: 'add', data: {project_id: 2}});
- });
-
- state = result.current[0];
- expect(state.distilled.project_id).toEqual(1);
- expect(state.items).toHaveLength(2);
-});
-
-test('item add keeps lowest due_on', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-09'}});
- });
-
- const state = result.current[0];
- expect(state.distilled.due_on).toBe('2021-09-01');
- expect(state.items).toHaveLength(2);
-});
-
-test('item add overwrites due_on with lower value', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-09'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01'}});
- });
-
- const state = result.current[0];
- expect(state.distilled.due_on).toBe('2021-09-01');
- expect(state.items).toHaveLength(2);
-});
-
-test('item remove moves due_on to lower value', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-02'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-03'}});
- });
- act(() => {
- result.current[1]({type: 'remove', data: {due_on: '2021-09-01'}});
- });
-
- const state = result.current[0];
- expect(state.distilled.due_on).toBe('2021-09-02');
- expect(state.items).toHaveLength(2);
-});
-
-test('item remove moves due_on to lower value', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-02'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-03'}});
- });
- act(() => {
- result.current[1]({type: 'remove', data: {due_on: '2021-09-01'}});
- });
-
- const state = result.current[0];
- expect(state.distilled.due_on).toBe('2021-09-02');
- expect(state.items).toHaveLength(2);
-});
-
-test('item add sets evening', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: false}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: true}});
- });
-
- const state = result.current[0];
- expect(state.distilled.evening).toBe(false);
-});
-
-test('item add sets evening when evening is undefined', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01'}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: true}});
- });
-
- const state = result.current[0];
- expect(state.distilled.evening).toBe(false);
-});
-
-test('item add sets evening, when only one value is present', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: true}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-02', evening: false}});
- });
-
- const state = result.current[0];
- expect(state.distilled.evening).toBe(true);
-});
-
-test('item remove sets evening', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: false}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', evening: true}});
- });
- act(() => {
- result.current[1]({type: 'remove', data: {due_on: '2021-09-01', evening: false}});
- });
-
- const state = result.current[0];
- expect(state.distilled.evening).toBe(true);
-});
-
-test('item add sets section', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 1}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 2}});
- });
-
- const state = result.current[0];
- expect(state.distilled.section_id).toBe(1);
-});
-
-test('item remove retains section', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 1}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 2}});
- });
- act(() => {
- result.current[1]({type: 'remove', data: {due_on: '2021-09-01', section_id: 2}});
- });
-
- const state = result.current[0];
- expect(state.distilled.section_id).toBe(1);
-});
-
-test('item remove updates section', () => {
- const {result} = renderHook(() => useDefaultTaskValues());
-
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 1}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 9}});
- });
- act(() => {
- result.current[1]({type: 'add', data: {due_on: '2021-09-01', section_id: 3}});
- });
- act(() => {
- result.current[1]({type: 'remove', data: {due_on: '2021-09-01', section_id: 1}});
- });
-
- const state = result.current[0];
- expect(state.distilled.section_id).toBe(9);
-});
diff --git a/vite.config.ts b/vite.config.ts
index fe66670e..34ff7883 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,11 +1,10 @@
import {defineConfig} from 'vite';
import path from 'path';
-import reactRefresh from '@vitejs/plugin-react-refresh';
const projectRootDir = path.resolve(__dirname);
export default defineConfig({
- plugins: [reactRefresh()],
+ plugins: [],
build: {
emptyOutDir: false,
outDir: './webroot/',
@@ -27,11 +26,13 @@ export default defineConfig({
},
],
},
- esbuild: {
- // Simulate react17 style jsx usage.
- jsxInject: `import React from 'react';`,
- },
+ esbuild: {},
optimizeDeps: {
- include: ['react', 'axios', '@inertiajs/inertia', '@inertiajs/inertia-react'],
+ include: [],
+ },
+ server: {
+ watch: {
+ ignored: ['**/vendor/**', '**/flutterapp/**'],
+ },
},
});
diff --git a/yarn.lock b/yarn.lock
index 1de64946..971243ce 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,7 +2,7 @@
# Manual changes might be lost - proceed with caution!
__metadata:
- version: 5
+ version: 6
cacheKey: 8
"@aashutoshrathi/word-wrap@npm:^1.2.3":
@@ -47,7 +47,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14, @babel/core@npm:^7.14.8, @babel/core@npm:^7.7.5":
+"@babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14, @babel/core@npm:^7.7.5":
version: 7.22.9
resolution: "@babel/core@npm:7.22.9"
dependencies:
@@ -197,7 +197,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.5":
+"@babel/helper-module-imports@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/helper-module-imports@npm:7.22.5"
dependencies:
@@ -1091,77 +1091,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-react-display-name@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5"
- dependencies:
- "@babel/helper-plugin-utils": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: a12bfd1e4e93055efca3ace3c34722571bda59d9740dca364d225d9c6e3ca874f134694d21715c42cc63d79efd46db9665bd4a022998767f9245f1e29d5d204d
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-react-jsx-development@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5"
- dependencies:
- "@babel/plugin-transform-react-jsx": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 36bc3ff0b96bb0ef4723070a50cfdf2e72cfd903a59eba448f9fe92fea47574d6f22efd99364413719e1f3fb3c51b6c9b2990b87af088f8486a84b2a5f9e4560
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-react-jsx-self@npm:^7.14.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-jsx-self@npm:7.22.5"
- dependencies:
- "@babel/helper-plugin-utils": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 671eebfabd14a0c7d6ae805fff7e289dfdb7ba984bb100ea2ef6dad1d6a665ebbb09199ab2e64fca7bc78bd0fdc80ca897b07996cf215fafc32c67bc564309af
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-react-jsx-source@npm:^7.14.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-jsx-source@npm:7.22.5"
- dependencies:
- "@babel/helper-plugin-utils": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 4ca2bd62ca14f8bbdcda9139f3f799e1c1c1bae504b67c1ca9bca142c53d81926d1a2b811f66a625f20999b2d352131053d886601f1ba3c1e9378c104d884277
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-react-jsx@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5"
- dependencies:
- "@babel/helper-annotate-as-pure": ^7.22.5
- "@babel/helper-module-imports": ^7.22.5
- "@babel/helper-plugin-utils": ^7.22.5
- "@babel/plugin-syntax-jsx": ^7.22.5
- "@babel/types": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: c8f93f29f32cf79683ca2b8958fd62f38155674846ef27a7d4b6fbeb8713c37257418391731b58ff8024ec37b888bed5960e615a3f552e28245d2082e7f2a2df
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5"
- dependencies:
- "@babel/helper-annotate-as-pure": ^7.22.5
- "@babel/helper-plugin-utils": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 092021c4f404e267002099ec20b3f12dd730cb90b0d83c5feed3dc00dbe43b9c42c795a18e7c6c7d7bddea20c7dd56221b146aec81b37f2e7eb5137331c61120
- languageName: node
- linkType: hard
-
"@babel/plugin-transform-regenerator@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/plugin-transform-regenerator@npm:7.22.5"
@@ -1423,22 +1352,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/preset-react@npm:^7.13":
- version: 7.22.5
- resolution: "@babel/preset-react@npm:7.22.5"
- dependencies:
- "@babel/helper-plugin-utils": ^7.22.5
- "@babel/helper-validator-option": ^7.22.5
- "@babel/plugin-transform-react-display-name": ^7.22.5
- "@babel/plugin-transform-react-jsx": ^7.22.5
- "@babel/plugin-transform-react-jsx-development": ^7.22.5
- "@babel/plugin-transform-react-pure-annotations": ^7.22.5
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: b977c7ee83e93f62d77e61929ca3d97e5291e026e2f025a1b8b7ac9186486ed56c7d5bc36f0becabe0c24e8c42a4e4f2243a3cf841384cfafc3204c5d3e6c619
- languageName: node
- linkType: hard
-
"@babel/preset-typescript@npm:^7.13":
version: 7.22.5
resolution: "@babel/preset-typescript@npm:7.22.5"
@@ -1471,16 +1384,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/runtime@npm:7.4.5":
- version: 7.4.5
- resolution: "@babel/runtime@npm:7.4.5"
- dependencies:
- regenerator-runtime: ^0.13.2
- checksum: 05be5b730eb3e42536de5271ab15c41e1e368d4e49c4668a1923b5980d4d0735484f80fa69fe5953bc3988bfdf17bb2c28e31f4499113579489860180bbcbdf9
- languageName: node
- linkType: hard
-
-"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.3.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7":
+"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.8.4":
version: 7.22.6
resolution: "@babel/runtime@npm:7.22.6"
dependencies:
@@ -1559,170 +1463,6 @@ __metadata:
languageName: node
linkType: hard
-"@dnd-kit/accessibility@npm:^1.0.2":
- version: 1.0.2
- resolution: "@dnd-kit/accessibility@npm:1.0.2"
- dependencies:
- tslib: ^2.0.0
- peerDependencies:
- react: ">=16.8.0"
- checksum: b486efbdfd90189380586812685fca4aebe1fa93b55a84d06b7cd309ab61d79d37f8bb24cd7e8b83a3fb5d9080ce907b9ea05074d90630749399c1ccd46c5c9e
- languageName: node
- linkType: hard
-
-"@dnd-kit/core@npm:^1.0.1, @dnd-kit/core@npm:^1.2.0":
- version: 1.2.0
- resolution: "@dnd-kit/core@npm:1.2.0"
- dependencies:
- "@dnd-kit/accessibility": ^1.0.2
- "@dnd-kit/utilities": ^1.0.2
- tslib: ^2.0.0
- peerDependencies:
- react: ">=16.8.0"
- react-dom: ">=16.8.0"
- checksum: 5e153e9cff0747d2d846e7a200611f1586f0c58b4bf69bc37cf9eac17f2cb8d4f2ad5955c074581a009e5d4d1ea014adcc68ff791ecb174cfe0ce0df69905779
- languageName: node
- linkType: hard
-
-"@dnd-kit/sortable@npm:^1.0.1":
- version: 1.1.0
- resolution: "@dnd-kit/sortable@npm:1.1.0"
- dependencies:
- "@dnd-kit/core": ^1.2.0
- "@dnd-kit/utilities": ^1.0.2
- tslib: ^2.0.0
- peerDependencies:
- react: ">=16.8.0"
- checksum: f7d0117c2d73d796ee2abadcd438f916c2e20b83f18cdae777de2491862a9fdd35709741bd8be414264b1d06ab974e5f648fbffb037e61a4eb4124aa4cf74fbe
- languageName: node
- linkType: hard
-
-"@dnd-kit/utilities@npm:^1.0.2":
- version: 1.0.3
- resolution: "@dnd-kit/utilities@npm:1.0.3"
- dependencies:
- tslib: ^2.0.0
- checksum: 2838ab58ead8ce4da848aaefaebfa10e01f43271495eed4f9b61cb22536054d3db246f91e4f0632574807c78c6171b9335147349f8420341fea781c311929442
- languageName: node
- linkType: hard
-
-"@emotion/babel-plugin@npm:^11.11.0":
- version: 11.11.0
- resolution: "@emotion/babel-plugin@npm:11.11.0"
- dependencies:
- "@babel/helper-module-imports": ^7.16.7
- "@babel/runtime": ^7.18.3
- "@emotion/hash": ^0.9.1
- "@emotion/memoize": ^0.8.1
- "@emotion/serialize": ^1.1.2
- babel-plugin-macros: ^3.1.0
- convert-source-map: ^1.5.0
- escape-string-regexp: ^4.0.0
- find-root: ^1.1.0
- source-map: ^0.5.7
- stylis: 4.2.0
- checksum: 6b363edccc10290f7a23242c06f88e451b5feb2ab94152b18bb8883033db5934fb0e421e2d67d09907c13837c21218a3ac28c51707778a54d6cd3706c0c2f3f9
- languageName: node
- linkType: hard
-
-"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.4.0":
- version: 11.11.0
- resolution: "@emotion/cache@npm:11.11.0"
- dependencies:
- "@emotion/memoize": ^0.8.1
- "@emotion/sheet": ^1.2.2
- "@emotion/utils": ^1.2.1
- "@emotion/weak-memoize": ^0.3.1
- stylis: 4.2.0
- checksum: 8eb1dc22beaa20c21a2e04c284d5a2630a018a9d51fb190e52de348c8d27f4e8ca4bbab003d68b4f6cd9cc1c569ca747a997797e0f76d6c734a660dc29decf08
- languageName: node
- linkType: hard
-
-"@emotion/hash@npm:^0.9.1":
- version: 0.9.1
- resolution: "@emotion/hash@npm:0.9.1"
- checksum: 716e17e48bf9047bf9383982c071de49f2615310fb4e986738931776f5a823bc1f29c84501abe0d3df91a3803c80122d24e28b57351bca9e01356ebb33d89876
- languageName: node
- linkType: hard
-
-"@emotion/memoize@npm:^0.8.1":
- version: 0.8.1
- resolution: "@emotion/memoize@npm:0.8.1"
- checksum: a19cc01a29fcc97514948eaab4dc34d8272e934466ed87c07f157887406bc318000c69ae6f813a9001c6a225364df04249842a50e692ef7a9873335fbcc141b0
- languageName: node
- linkType: hard
-
-"@emotion/react@npm:^11.1.1":
- version: 11.11.1
- resolution: "@emotion/react@npm:11.11.1"
- dependencies:
- "@babel/runtime": ^7.18.3
- "@emotion/babel-plugin": ^11.11.0
- "@emotion/cache": ^11.11.0
- "@emotion/serialize": ^1.1.2
- "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1
- "@emotion/utils": ^1.2.1
- "@emotion/weak-memoize": ^0.3.1
- hoist-non-react-statics: ^3.3.1
- peerDependencies:
- react: ">=16.8.0"
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: aec3c36650f5f0d3d4445ff44d73dd88712b1609645b6af3e6d08049cfbc51f1785fe13dea1a1d4ab1b0800d68f2339ab11e459687180362b1ef98863155aae5
- languageName: node
- linkType: hard
-
-"@emotion/serialize@npm:^1.0.0, @emotion/serialize@npm:^1.1.2":
- version: 1.1.2
- resolution: "@emotion/serialize@npm:1.1.2"
- dependencies:
- "@emotion/hash": ^0.9.1
- "@emotion/memoize": ^0.8.1
- "@emotion/unitless": ^0.8.1
- "@emotion/utils": ^1.2.1
- csstype: ^3.0.2
- checksum: 413c352e657f1b5e27ea6437b3ef7dcc3860669b7ae17fd5c18bfbd44e033af1acc56b64d252284a813ca4f3b3e1b0841c42d3fb08e02d2df56fd3cd63d72986
- languageName: node
- linkType: hard
-
-"@emotion/sheet@npm:^1.2.2":
- version: 1.2.2
- resolution: "@emotion/sheet@npm:1.2.2"
- checksum: d973273c9c15f1c291ca2269728bf044bd3e92a67bca87943fa9ec6c3cd2b034f9a6bfe95ef1b5d983351d128c75b547b43ff196a00a3875f7e1d269793cecfe
- languageName: node
- linkType: hard
-
-"@emotion/unitless@npm:^0.8.1":
- version: 0.8.1
- resolution: "@emotion/unitless@npm:0.8.1"
- checksum: 385e21d184d27853bb350999471f00e1429fa4e83182f46cd2c164985999d9b46d558dc8b9cc89975cb337831ce50c31ac2f33b15502e85c299892e67e7b4a88
- languageName: node
- linkType: hard
-
-"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1":
- version: 1.0.1
- resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1"
- peerDependencies:
- react: ">=16.8.0"
- checksum: 700b6e5bbb37a9231f203bb3af11295eed01d73b2293abece0bc2a2237015e944d7b5114d4887ad9a79776504aa51ed2a8b0ddbc117c54495dd01a6b22f93786
- languageName: node
- linkType: hard
-
-"@emotion/utils@npm:^1.2.1":
- version: 1.2.1
- resolution: "@emotion/utils@npm:1.2.1"
- checksum: e0b44be0705b56b079c55faff93952150be69e79b660ae70ddd5b6e09fc40eb1319654315a9f34bb479d7f4ec94be6068c061abbb9e18b9778ae180ad5d97c73
- languageName: node
- linkType: hard
-
-"@emotion/weak-memoize@npm:^0.3.1":
- version: 0.3.1
- resolution: "@emotion/weak-memoize@npm:0.3.1"
- checksum: b2be47caa24a8122622ea18cd2d650dbb4f8ad37b636dc41ed420c2e082f7f1e564ecdea68122b546df7f305b159bf5ab9ffee872abd0f052e687428459af594
- languageName: node
- linkType: hard
-
"@esbuild/linux-loong64@npm:0.14.54":
version: 0.14.54
resolution: "@esbuild/linux-loong64@npm:0.14.54"
@@ -1765,54 +1505,6 @@ __metadata:
languageName: node
linkType: hard
-"@iconify/icons-octicon@npm:^1.1.1":
- version: 1.2.42
- resolution: "@iconify/icons-octicon@npm:1.2.42"
- dependencies:
- "@iconify/types": "*"
- checksum: c1fd8563cd0bffa95bb9bb886fa440114a6902e815942a29c803b7f55ae8aef143fd6aaa842ed196b398556f84c9c7a7c61f468ad8fcffb83d45ee24d7be7e6a
- languageName: node
- linkType: hard
-
-"@iconify/react@npm:2.0.0-rc.2":
- version: 2.0.0-rc.2
- resolution: "@iconify/react@npm:2.0.0-rc.2"
- peerDependencies:
- react: ^16.0.0
- checksum: 2adaa32f0e6b396dc6d48afc146b0d6600dc418fc643bf0a112ad05722b9d24e1a36c0f96baf36a39b82e1dfd7470d1ee197c28e90281d9d2786279f28681797
- languageName: node
- linkType: hard
-
-"@iconify/types@npm:*":
- version: 2.0.0
- resolution: "@iconify/types@npm:2.0.0"
- checksum: 029f58542c160e9d4a746869cf2e475b603424d3adf3994c5cc8d0406c47e6e04a3b898b2707840c1c5b9bd5563a1660a34b110d89fce43923baca5222f4e597
- languageName: node
- linkType: hard
-
-"@inertiajs/inertia-react@npm:^0.7.0":
- version: 0.7.1
- resolution: "@inertiajs/inertia-react@npm:0.7.1"
- dependencies:
- lodash.isequal: ^4.5.0
- peerDependencies:
- "@inertiajs/inertia": ^0.10.0
- react: ^16.9.0 || ^17.0.0
- checksum: 0a3ca7aad0ad87649af5499be4b0822b9b70f8abe6f496182ac00a4f703d22b74caedc188ac9827a19d05317ad11ce1c08b6a98d4869a284e4178e3a551c26e1
- languageName: node
- linkType: hard
-
-"@inertiajs/inertia@npm:^0.10.0":
- version: 0.10.1
- resolution: "@inertiajs/inertia@npm:0.10.1"
- dependencies:
- axios: ^0.21.1
- deepmerge: ^4.0.0
- qs: ^6.9.0
- checksum: 56adea8f127ed003241eb58f0eed950b1ec3236ff246449eff0479c47c3529e4f9fe63256f30728fdaaffbb518900e7d17d4b23048b905ab710cfec496183304
- languageName: node
- linkType: hard
-
"@isaacs/cliui@npm:^8.0.2":
version: 8.0.2
resolution: "@isaacs/cliui@npm:8.0.2"
@@ -2134,245 +1826,6 @@ __metadata:
languageName: node
linkType: hard
-"@reach/alert-dialog@npm:^0.15.0":
- version: 0.15.3
- resolution: "@reach/alert-dialog@npm:0.15.3"
- dependencies:
- "@reach/auto-id": 0.15.3
- "@reach/dialog": 0.15.3
- "@reach/utils": 0.15.3
- invariant: ^2.2.4
- prop-types: ^15.7.2
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 733076848058b92b97314e151cfc95856bbb98ec16be3c0b8a6ded0dadda7a53aa7424aafb31ebe788eced5a5f6c1bdb7f45bf1c3f0ae4ad1208168d59074a19
- languageName: node
- linkType: hard
-
-"@reach/auto-id@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/auto-id@npm:0.13.2"
- dependencies:
- "@reach/utils": 0.13.2
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: bc42f73eaf341510e1460165f1870cda5404fc7d24558aa66111defb5c8f44feb1ef117baed714f7538b5fe1c39a9a091927aa31f03ff768e2c4d4c72dd3a09a
- languageName: node
- linkType: hard
-
-"@reach/auto-id@npm:0.15.3":
- version: 0.15.3
- resolution: "@reach/auto-id@npm:0.15.3"
- dependencies:
- "@reach/utils": 0.15.3
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 52f7915970f8de51b923274964bb18e61adf147845e2cb65ff93f17ebf4179f3cc743d6f791da64801447de5965b10e3a2c48c1debbcb5ab85bb1fd73a5fa61a
- languageName: node
- linkType: hard
-
-"@reach/descendants@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/descendants@npm:0.13.2"
- dependencies:
- "@reach/utils": 0.13.2
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: b5556f79dc36b0b9b134d41fda2f7e27ab9ce717c027170d5d2f6060c68de779872516a40687c54106508d8ba528c98e86123adc4c377bd6d492d0262494bf7f
- languageName: node
- linkType: hard
-
-"@reach/dialog@npm:0.15.3, @reach/dialog@npm:^0.15.0":
- version: 0.15.3
- resolution: "@reach/dialog@npm:0.15.3"
- dependencies:
- "@reach/portal": 0.15.3
- "@reach/utils": 0.15.3
- prop-types: ^15.7.2
- react-focus-lock: ^2.5.1
- react-remove-scroll: ^2.4.2
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: e0b2c7cf0afedb87bec90e862b2ccd5e941f04619659a6dd9ff52625e91d67f9208c8dbdbfdc306feb0f87623bed09a91edad1efb6ec351600021dec6ce7f08c
- languageName: node
- linkType: hard
-
-"@reach/menu-button@npm:^0.13.0":
- version: 0.13.2
- resolution: "@reach/menu-button@npm:0.13.2"
- dependencies:
- "@reach/auto-id": 0.13.2
- "@reach/descendants": 0.13.2
- "@reach/popover": 0.13.2
- "@reach/utils": 0.13.2
- prop-types: ^15.7.2
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 778ec0d186baca6d140d72b9b0f112593d83651b0ef6e3bfffff3a96d38b4fa1a3e26918794321d26c51da535f9c0b514d7c64f0a5bfb2cc173fb82e0ce764da
- languageName: node
- linkType: hard
-
-"@reach/observe-rect@npm:1.2.0":
- version: 1.2.0
- resolution: "@reach/observe-rect@npm:1.2.0"
- checksum: 7dd903eeaad0e22c6d973bd26265d91eadba56ab5134701ceb3e85214db75339fae94aa7e8b88a65e8daa64bc7cf1b915d4ffcdfd324466b561dc6adc3c6e070
- languageName: node
- linkType: hard
-
-"@reach/popover@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/popover@npm:0.13.2"
- dependencies:
- "@reach/portal": 0.13.2
- "@reach/rect": 0.13.2
- "@reach/utils": 0.13.2
- tabbable: ^4.0.0
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 29b5b60e459e698b494c0ffc8d0dcb06d26a458ea2e83f524ed99f6d9b90ef1f0cf8a5ec1670cc8e0e1f53df52537502b48e7643c4badd46a0882f79a6cf4a6b
- languageName: node
- linkType: hard
-
-"@reach/portal@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/portal@npm:0.13.2"
- dependencies:
- "@reach/utils": 0.13.2
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 319e0e9272b7dfbbe23b84188a4d25731d95eb71c424e83140e5c8cf98e0a2c8ad07b2a2d9e28e2f962e27d0c4fc3189891f51894379488fc31be381f455a471
- languageName: node
- linkType: hard
-
-"@reach/portal@npm:0.15.3":
- version: 0.15.3
- resolution: "@reach/portal@npm:0.15.3"
- dependencies:
- "@reach/utils": 0.15.3
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: bdd75ade0cf4ab1ed4d31db294c7901c308d009bdfd2ff2c9a18c854e1cfad3f484c444d8a770af031f19eecb795117be4f0b0361fd3ab15fe3a6a52afea756e
- languageName: node
- linkType: hard
-
-"@reach/rect@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/rect@npm:0.13.2"
- dependencies:
- "@reach/observe-rect": 1.2.0
- "@reach/utils": 0.13.2
- prop-types: ^15.7.2
- tslib: ^2.1.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 4e479ed418dde7e1ab0c820a5d90a334194d39e9e6249f90e798fc5870fea282a6d879f3beaaa0e4bf37f8fac9bccaef8cd3893f81f11a7bf1bfcf9c6eb00dd1
- languageName: node
- linkType: hard
-
-"@reach/rect@npm:0.15.3":
- version: 0.15.3
- resolution: "@reach/rect@npm:0.15.3"
- dependencies:
- "@reach/observe-rect": 1.2.0
- "@reach/utils": 0.15.3
- prop-types: ^15.7.2
- tiny-warning: ^1.0.3
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: dde47da49c88b9db0967a1906daecce6054e569079a5122c5de7601f52750cbeeb7d4eacaeb9042548b3754ddd624c75c7f2a63d57737e33c7d814f532b65f73
- languageName: node
- linkType: hard
-
-"@reach/tooltip@npm:^0.15.0":
- version: 0.15.3
- resolution: "@reach/tooltip@npm:0.15.3"
- dependencies:
- "@reach/auto-id": 0.15.3
- "@reach/portal": 0.15.3
- "@reach/rect": 0.15.3
- "@reach/utils": 0.15.3
- "@reach/visually-hidden": 0.15.2
- prop-types: ^15.7.2
- tiny-warning: ^1.0.3
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 29cb323e2ce779803acf50757ff2234d86a884a4ce653625c8f0842edbcab81fd6db798c76b02d8ca15b156bce878c92bb3a95b5f1e435aa4207d95821087dda
- languageName: node
- linkType: hard
-
-"@reach/utils@npm:0.13.2":
- version: 0.13.2
- resolution: "@reach/utils@npm:0.13.2"
- dependencies:
- "@types/warning": ^3.0.0
- tslib: ^2.1.0
- warning: ^4.0.3
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 63b4f505c53c1043c8566b6c4f648dc84d9e1c33876783c0a5a5c8e51a90dcabdda06df98d1532b657905b24d4590ca51db7f2fd39dc336842c7cf80dbbbc6e2
- languageName: node
- linkType: hard
-
-"@reach/utils@npm:0.15.3":
- version: 0.15.3
- resolution: "@reach/utils@npm:0.15.3"
- dependencies:
- tiny-warning: ^1.0.3
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 387f0ddc5375590ced9d6a90a84d39a30bd11b8d39eaff6cbb005415b44c011861c897111e7734562916172b2ec2114111d3f0952b5795faf43822bc44ae3f14
- languageName: node
- linkType: hard
-
-"@reach/visually-hidden@npm:0.15.2":
- version: 0.15.2
- resolution: "@reach/visually-hidden@npm:0.15.2"
- dependencies:
- prop-types: ^15.7.2
- tslib: ^2.3.0
- peerDependencies:
- react: ^16.8.0 || 17.x
- react-dom: ^16.8.0 || 17.x
- checksum: 081bc53322a9ac4cc360c82e0ade819489041b33ccfd813ddc877a7eca8e0710db4a961bcf1eed816a4a610ae93c806a821c877a4ea104afde7faa77a8acb583
- languageName: node
- linkType: hard
-
-"@rollup/pluginutils@npm:^4.1.1":
- version: 4.2.1
- resolution: "@rollup/pluginutils@npm:4.2.1"
- dependencies:
- estree-walker: ^2.0.1
- picomatch: ^2.2.2
- checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12
- languageName: node
- linkType: hard
-
"@sinonjs/commons@npm:^1.7.0":
version: 1.8.6
resolution: "@sinonjs/commons@npm:1.8.6"
@@ -2391,7 +1844,7 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/dom@npm:^7.28.1, @testing-library/dom@npm:^7.30.0":
+"@testing-library/dom@npm:^7.30.0":
version: 7.31.2
resolution: "@testing-library/dom@npm:7.31.2"
dependencies:
@@ -2407,41 +1860,6 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/react-hooks@npm:^7.0":
- version: 7.0.2
- resolution: "@testing-library/react-hooks@npm:7.0.2"
- dependencies:
- "@babel/runtime": ^7.12.5
- "@types/react": ">=16.9.0"
- "@types/react-dom": ">=16.9.0"
- "@types/react-test-renderer": ">=16.9.0"
- react-error-boundary: ^3.1.0
- peerDependencies:
- react: ">=16.9.0"
- react-dom: ">=16.9.0"
- react-test-renderer: ">=16.9.0"
- peerDependenciesMeta:
- react-dom:
- optional: true
- react-test-renderer:
- optional: true
- checksum: 27c6169b5c9832bd02dcea232e6a0a3cd8d4504e13ecb49d57eb5ab6bea5e2f1bff65f3102068b7e57eec3cbd671326dc0b277335014b0edfbdedf11a1fe6db5
- languageName: node
- linkType: hard
-
-"@testing-library/react@npm:^11.2.3":
- version: 11.2.7
- resolution: "@testing-library/react@npm:11.2.7"
- dependencies:
- "@babel/runtime": ^7.12.5
- "@testing-library/dom": ^7.28.1
- peerDependencies:
- react: "*"
- react-dom: "*"
- checksum: 64e07cb96e40dbdbd3c46a09c47bed14446b30efafaa65a5d4fed5a7553878990cda108578f2b114422a775f31c635d51fd50b752f6163ddd6b8474e0e5fc2ce
- languageName: node
- linkType: hard
-
"@testing-library/user-event@npm:^12.8.3":
version: 12.8.3
resolution: "@testing-library/user-event@npm:12.8.3"
@@ -2501,248 +1919,96 @@ __metadata:
resolution: "@types/babel__template@npm:7.4.1"
dependencies:
"@babel/parser": ^7.1.0
- "@babel/types": ^7.0.0
- checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee
- languageName: node
- linkType: hard
-
-"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.4, @types/babel__traverse@npm:^7.0.6":
- version: 7.20.1
- resolution: "@types/babel__traverse@npm:7.20.1"
- dependencies:
- "@babel/types": ^7.20.7
- checksum: 58341e23c649c0eba134a1682d4f20d027fad290d92e5740faa1279978f6ed476fc467ae51ce17a877e2566d805aeac64eae541168994367761ec883a4150221
- languageName: node
- linkType: hard
-
-"@types/classnames@npm:^2.2.11":
- version: 2.3.1
- resolution: "@types/classnames@npm:2.3.1"
- dependencies:
- classnames: "*"
- checksum: 09a17ea08fcb83380921efdfdac94cfa162f87025cae0bf6f4ba508c2fa5f436459ce7612905a3f968fdddb68c03b8e6ff08e762ed2d0c110c5c4fceb244dc55
- languageName: node
- linkType: hard
-
-"@types/dompurify@npm:^2.2.1":
- version: 2.4.0
- resolution: "@types/dompurify@npm:2.4.0"
- dependencies:
- "@types/trusted-types": "*"
- checksum: b48cd81e997794ebc390c7c5bef1a67ec14a6f2f0521973e07e06af186c7583abe114d94d24868c0632b9573f5bd77131a4b76f3fffdf089ba99a4e53dd46c39
- languageName: node
- linkType: hard
-
-"@types/graceful-fs@npm:^4.1.2":
- version: 4.1.6
- resolution: "@types/graceful-fs@npm:4.1.6"
- dependencies:
- "@types/node": "*"
- checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4
- languageName: node
- linkType: hard
-
-"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
- version: 2.0.4
- resolution: "@types/istanbul-lib-coverage@npm:2.0.4"
- checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7
- languageName: node
- linkType: hard
-
-"@types/istanbul-lib-report@npm:*":
- version: 3.0.0
- resolution: "@types/istanbul-lib-report@npm:3.0.0"
- dependencies:
- "@types/istanbul-lib-coverage": "*"
- checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36
- languageName: node
- linkType: hard
-
-"@types/istanbul-reports@npm:^3.0.0":
- version: 3.0.1
- resolution: "@types/istanbul-reports@npm:3.0.1"
- dependencies:
- "@types/istanbul-lib-report": "*"
- checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903
- languageName: node
- linkType: hard
-
-"@types/jest@npm:^27.0.2":
- version: 27.5.2
- resolution: "@types/jest@npm:27.5.2"
- dependencies:
- jest-matcher-utils: ^27.0.0
- pretty-format: ^27.0.0
- checksum: 7e11c6826aa429ad990dc262e4e4b54aa36573287fddf15773e4137f07d11d3105f0dd9f1baff73252160a057df23f5529bb83b1bf83cd3f45f9460a5ca5c22e
- languageName: node
- linkType: hard
-
-"@types/json-schema@npm:^7.0.7":
- version: 7.0.12
- resolution: "@types/json-schema@npm:7.0.12"
- checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293
- languageName: node
- linkType: hard
-
-"@types/lodash.groupby@npm:^4.0":
- version: 4.6.7
- resolution: "@types/lodash.groupby@npm:4.6.7"
- dependencies:
- "@types/lodash": "*"
- checksum: 2dd7f5c43ca4e2202c73a1217ea550fd54746909c19ef38ababe1a3c851c40b1ba66c027397551f9a6f7acf7217507496e316e6de38f3208f4a1f4548b81933b
- languageName: node
- linkType: hard
-
-"@types/lodash.sortby@npm:^4.0":
- version: 4.7.7
- resolution: "@types/lodash.sortby@npm:4.7.7"
- dependencies:
- "@types/lodash": "*"
- checksum: 94164b49810e37cc3795c133a6375245cdfc0e6804680e34d7039889954e7201c820d658fff89fcda0a1ce68774286f49ce95f83004d8188c4434cdfc2ca55c4
- languageName: node
- linkType: hard
-
-"@types/lodash@npm:*":
- version: 4.14.196
- resolution: "@types/lodash@npm:4.14.196"
- checksum: 201d17c3e62ae02a93c99ec78e024b2be9bd75564dd8fd8c26f6ac51a985ab280d28ce2688c3bcdfe785b0991cd9814edff19ee000234c7b45d9a697f09feb6a
- languageName: node
- linkType: hard
-
-"@types/marked@npm:^2.0.0":
- version: 2.0.5
- resolution: "@types/marked@npm:2.0.5"
- checksum: 7a0b9d18402a0e20c106ec79ec9d4bd2266a4db409cc8b4ec322b68b40afd0bc67497e9b391bfbe953b934ad0810d90a1b88f7e18404ddf8cd6b085b74ba6893
- languageName: node
- linkType: hard
-
-"@types/node@npm:*":
- version: 20.4.5
- resolution: "@types/node@npm:20.4.5"
- checksum: 36a0304a8dc346a1b2d2edac4c4633eecf70875793d61a5274d0df052d7a7af7a8e34f29884eac4fbd094c4f0201477dcb39c0ecd3307ca141688806538d1138
- languageName: node
- linkType: hard
-
-"@types/normalize-package-data@npm:^2.4.0":
- version: 2.4.1
- resolution: "@types/normalize-package-data@npm:2.4.1"
- checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5
- languageName: node
- linkType: hard
-
-"@types/parse-json@npm:^4.0.0":
- version: 4.0.0
- resolution: "@types/parse-json@npm:4.0.0"
- checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b
- languageName: node
- linkType: hard
-
-"@types/prettier@npm:^2.0.0":
- version: 2.7.3
- resolution: "@types/prettier@npm:2.7.3"
- checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83
+ "@babel/types": ^7.0.0
+ checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee
languageName: node
linkType: hard
-"@types/prop-types@npm:*":
- version: 15.7.5
- resolution: "@types/prop-types@npm:15.7.5"
- checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980
+"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.4, @types/babel__traverse@npm:^7.0.6":
+ version: 7.20.1
+ resolution: "@types/babel__traverse@npm:7.20.1"
+ dependencies:
+ "@babel/types": ^7.20.7
+ checksum: 58341e23c649c0eba134a1682d4f20d027fad290d92e5740faa1279978f6ed476fc467ae51ce17a877e2566d805aeac64eae541168994367761ec883a4150221
languageName: node
linkType: hard
-"@types/react-confirm@npm:^0.1.4":
- version: 0.1.4
- resolution: "@types/react-confirm@npm:0.1.4"
+"@types/graceful-fs@npm:^4.1.2":
+ version: 4.1.6
+ resolution: "@types/graceful-fs@npm:4.1.6"
dependencies:
- "@types/react": "*"
- checksum: acee3cfe6b6099655c3eea381189855410b7906bbdd50567cd559d2d257d9a7e5b12c5467b2fc282cd656419ca21ed31ac75571f46d71092455542930a625cc8
+ "@types/node": "*"
+ checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4
languageName: node
linkType: hard
-"@types/react-dom@npm:*, @types/react-dom@npm:>=16.9.0":
- version: 18.2.7
- resolution: "@types/react-dom@npm:18.2.7"
- dependencies:
- "@types/react": "*"
- checksum: e02ea908289a7ad26053308248d2b87f6aeafd73d0e2de2a3d435947bcea0422599016ffd1c3e38ff36c42f5e1c87c7417f05b0a157e48649e4a02f21727d54f
+"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
+ version: 2.0.4
+ resolution: "@types/istanbul-lib-coverage@npm:2.0.4"
+ checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7
languageName: node
linkType: hard
-"@types/react-dom@npm:^17.0":
- version: 17.0.20
- resolution: "@types/react-dom@npm:17.0.20"
+"@types/istanbul-lib-report@npm:*":
+ version: 3.0.0
+ resolution: "@types/istanbul-lib-report@npm:3.0.0"
dependencies:
- "@types/react": ^17
- checksum: 525439fb14a033fc5dbe74711ecc50ec82273a528df9656594066a6219401e975101dafffd15d9a1a57a9442d52ea0c92eaacae09554dde27cd792e773f67467
+ "@types/istanbul-lib-coverage": "*"
+ checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36
languageName: node
linkType: hard
-"@types/react-mentions@npm:^4.1.0":
- version: 4.1.8
- resolution: "@types/react-mentions@npm:4.1.8"
+"@types/istanbul-reports@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "@types/istanbul-reports@npm:3.0.1"
dependencies:
- "@types/react": "*"
- checksum: c96a2ffa27ffce2a8e40168b0da37f80ca6708542dc4429a6c420dd957be5fc09713100629023c507adf0d8e114bf947729b550abc6a191c61bc8a123ded14ef
+ "@types/istanbul-lib-report": "*"
+ checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903
languageName: node
linkType: hard
-"@types/react-select@npm:^4.0.14":
- version: 4.0.18
- resolution: "@types/react-select@npm:4.0.18"
+"@types/jest@npm:^27.0.2":
+ version: 27.5.2
+ resolution: "@types/jest@npm:27.5.2"
dependencies:
- "@emotion/serialize": ^1.0.0
- "@types/react": "*"
- "@types/react-dom": "*"
- "@types/react-transition-group": "*"
- checksum: c247c7fe45cc1d1db1fb0e5a569e288037081ed05d17f377376de82a58a5d334bb7282922ee5eaf3c30957437b028097235be81cb0bed905b3b73f9a5b8c7b58
+ jest-matcher-utils: ^27.0.0
+ pretty-format: ^27.0.0
+ checksum: 7e11c6826aa429ad990dc262e4e4b54aa36573287fddf15773e4137f07d11d3105f0dd9f1baff73252160a057df23f5529bb83b1bf83cd3f45f9460a5ca5c22e
languageName: node
linkType: hard
-"@types/react-test-renderer@npm:>=16.9.0":
- version: 18.0.0
- resolution: "@types/react-test-renderer@npm:18.0.0"
- dependencies:
- "@types/react": "*"
- checksum: 6afc938a1d7618d88ab8793e251f0bd5981bf3f08c1b600f74df3f8800b92589ea534dc6dcb7c8d683893fcc740bf8d7843a42bf2dae59785cfe88f004bd7b0b
+"@types/json-schema@npm:^7.0.7":
+ version: 7.0.12
+ resolution: "@types/json-schema@npm:7.0.12"
+ checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293
languageName: node
linkType: hard
-"@types/react-transition-group@npm:*":
- version: 4.4.6
- resolution: "@types/react-transition-group@npm:4.4.6"
- dependencies:
- "@types/react": "*"
- checksum: 0872143821d7ee20a1d81e965f8b1e837837f11cd2206973f1f98655751992d9390304d58bac192c9cd923eca95bff107d8c9e3364a180240d5c2a6fd70fd7c3
+"@types/node@npm:*":
+ version: 20.4.5
+ resolution: "@types/node@npm:20.4.5"
+ checksum: 36a0304a8dc346a1b2d2edac4c4633eecf70875793d61a5274d0df052d7a7af7a8e34f29884eac4fbd094c4f0201477dcb39c0ecd3307ca141688806538d1138
languageName: node
linkType: hard
-"@types/react@npm:*, @types/react@npm:>=16.9.0":
- version: 18.2.17
- resolution: "@types/react@npm:18.2.17"
- dependencies:
- "@types/prop-types": "*"
- "@types/scheduler": "*"
- csstype: ^3.0.2
- checksum: 150516b31bd98b635e4a56bcf2af007330b35cccb6e35e902f46a47f0e81e30c46cdacc095e91051bdf2f33e4846e7e62fd51b67e064dc7d15c00e15dfa449d5
+"@types/normalize-package-data@npm:^2.4.0":
+ version: 2.4.1
+ resolution: "@types/normalize-package-data@npm:2.4.1"
+ checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5
languageName: node
linkType: hard
-"@types/react@npm:^17, @types/react@npm:^17.0":
- version: 17.0.62
- resolution: "@types/react@npm:17.0.62"
- dependencies:
- "@types/prop-types": "*"
- "@types/scheduler": "*"
- csstype: ^3.0.2
- checksum: 428a5aff44824ef504e9a9259b5894fe44a5db1c344b536990f07e132900ff5b34cbef0be77a84f30f37be1f88fc8b56dce328f568de8d65de3bfe414c05b2e1
+"@types/prettier@npm:^2.0.0":
+ version: 2.7.3
+ resolution: "@types/prettier@npm:2.7.3"
+ checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83
languageName: node
linkType: hard
-"@types/scheduler@npm:*":
- version: 0.16.3
- resolution: "@types/scheduler@npm:0.16.3"
- checksum: 2b0aec39c24268e3ce938c5db2f2e77f5c3dd280e05c262d9c2fe7d890929e4632a6b8e94334017b66b45e4f92a5aa42ba3356640c2a1175fa37bef2f5200767
+"@types/sortablejs@npm:^1.15.3":
+ version: 1.15.3
+ resolution: "@types/sortablejs@npm:1.15.3"
+ checksum: 189cc8b16666e27f0de5894731b95889a8be29d8e68d0afdcbd703e1cd519623b2e42049fe66d25e4ec403dffed594b19bb1d16aab6939d0cdfb4d50e2fb99b6
languageName: node
linkType: hard
@@ -2753,20 +2019,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/trusted-types@npm:*":
- version: 2.0.3
- resolution: "@types/trusted-types@npm:2.0.3"
- checksum: 4794804bc4a4a173d589841b6d26cf455ff5dc4f3e704e847de7d65d215f2e7043d8757e4741ce3a823af3f08260a8d04a1a6e9c5ec9b20b7b04586956a6b005
- languageName: node
- linkType: hard
-
-"@types/warning@npm:^3.0.0":
- version: 3.0.0
- resolution: "@types/warning@npm:3.0.0"
- checksum: 120dcf90600d583c68a60872200061eab9318ae15ea898581f8e9a6dc71b7941095dd81d8324e36d2a6006e5e12b6fc1cf8eda00cc514ee12bb39a912cc4e040
- languageName: node
- linkType: hard
-
"@types/yargs-parser@npm:*":
version: 21.0.0
resolution: "@types/yargs-parser@npm:21.0.0"
@@ -2883,19 +2135,6 @@ __metadata:
languageName: node
linkType: hard
-"@vitejs/plugin-react-refresh@npm:^1.3.1":
- version: 1.3.6
- resolution: "@vitejs/plugin-react-refresh@npm:1.3.6"
- dependencies:
- "@babel/core": ^7.14.8
- "@babel/plugin-transform-react-jsx-self": ^7.14.5
- "@babel/plugin-transform-react-jsx-source": ^7.14.5
- "@rollup/pluginutils": ^4.1.1
- react-refresh: ^0.10.0
- checksum: 013f064abd1b26a483051b80b424848b687b942f01c9e00c3e9065b093d3b32381ff768df8e0c8c446524cce1a3d59df31b26bd2e9d906805f641e3bad5daebe
- languageName: node
- linkType: hard
-
"abab@npm:^2.0.3, abab@npm:^2.0.5":
version: 2.0.6
resolution: "abab@npm:2.0.6"
@@ -3145,29 +2384,6 @@ __metadata:
languageName: node
linkType: hard
-"array-buffer-byte-length@npm:^1.0.0":
- version: 1.0.0
- resolution: "array-buffer-byte-length@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- is-array-buffer: ^3.0.1
- checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3
- languageName: node
- linkType: hard
-
-"array-includes@npm:^3.1.6":
- version: 3.1.6
- resolution: "array-includes@npm:3.1.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- get-intrinsic: ^1.1.3
- is-string: ^1.0.7
- checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5
- languageName: node
- linkType: hard
-
"array-union@npm:^2.1.0":
version: 2.1.0
resolution: "array-union@npm:2.1.0"
@@ -3182,57 +2398,6 @@ __metadata:
languageName: node
linkType: hard
-"array.prototype.flat@npm:^1.3.1":
- version: 1.3.1
- resolution: "array.prototype.flat@npm:1.3.1"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- es-shim-unscopables: ^1.0.0
- checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b
- languageName: node
- linkType: hard
-
-"array.prototype.flatmap@npm:^1.3.1":
- version: 1.3.1
- resolution: "array.prototype.flatmap@npm:1.3.1"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- es-shim-unscopables: ^1.0.0
- checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987
- languageName: node
- linkType: hard
-
-"array.prototype.tosorted@npm:^1.1.1":
- version: 1.1.1
- resolution: "array.prototype.tosorted@npm:1.1.1"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- es-shim-unscopables: ^1.0.0
- get-intrinsic: ^1.1.3
- checksum: 7923324a67e70a2fc0a6e40237405d92395e45ebd76f5cb89c2a5cf1e66b47aca6baacd0cd628ffd88830b90d47fff268071493d09c9ae123645613dac2c2ca3
- languageName: node
- linkType: hard
-
-"arraybuffer.prototype.slice@npm:^1.0.1":
- version: 1.0.1
- resolution: "arraybuffer.prototype.slice@npm:1.0.1"
- dependencies:
- array-buffer-byte-length: ^1.0.0
- call-bind: ^1.0.2
- define-properties: ^1.2.0
- get-intrinsic: ^1.2.1
- is-array-buffer: ^3.0.2
- is-shared-array-buffer: ^1.0.2
- checksum: e3e9b2a3e988ebfeddce4c7e8f69df730c9e48cb04b0d40ff0874ce3d86b3d1339dd520ffde5e39c02610bc172ecfbd4bc93324b1cabd9554c44a56b131ce0ce
- languageName: node
- linkType: hard
-
"assign-symbols@npm:^1.0.0":
version: 1.0.0
resolution: "assign-symbols@npm:1.0.0"
@@ -3263,22 +2428,6 @@ __metadata:
languageName: node
linkType: hard
-"available-typed-arrays@npm:^1.0.5":
- version: 1.0.5
- resolution: "available-typed-arrays@npm:1.0.5"
- checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a
- languageName: node
- linkType: hard
-
-"axios@npm:^0.21.1":
- version: 0.21.4
- resolution: "axios@npm:0.21.4"
- dependencies:
- follow-redirects: ^1.14.0
- checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c
- languageName: node
- linkType: hard
-
"babel-jest@npm:^26.6.3":
version: 26.6.3
resolution: "babel-jest@npm:26.6.3"
@@ -3331,17 +2480,6 @@ __metadata:
languageName: node
linkType: hard
-"babel-plugin-macros@npm:^3.1.0":
- version: 3.1.0
- resolution: "babel-plugin-macros@npm:3.1.0"
- dependencies:
- "@babel/runtime": ^7.12.5
- cosmiconfig: ^7.0.0
- resolve: ^1.19.0
- checksum: 765de4abebd3e4688ebdfbff8571ddc8cd8061f839bb6c3e550b0344a4027b04c60491f843296ce3f3379fb356cc873d57a9ee6694262547eb822c14a25be9a6
- languageName: node
- linkType: hard
-
"babel-plugin-polyfill-corejs2@npm:^0.4.4":
version: 0.4.5
resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5"
@@ -3561,7 +2699,7 @@ __metadata:
languageName: node
linkType: hard
-"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2":
+"call-bind@npm:^1.0.2":
version: 1.0.2
resolution: "call-bind@npm:1.0.2"
dependencies:
@@ -3688,7 +2826,7 @@ __metadata:
languageName: node
linkType: hard
-"classnames@npm:*, classnames@npm:^2.2.6":
+"classnames@npm:^2.2.6":
version: 2.3.2
resolution: "classnames@npm:2.3.2"
checksum: 2c62199789618d95545c872787137262e741f9db13328e216b093eea91c85ef2bfb152c1f9e63027204e2559a006a92eb74147d46c800a9f96297ae1d9f96f4e
@@ -3808,7 +2946,7 @@ __metadata:
languageName: node
linkType: hard
-"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
+"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
version: 1.9.0
resolution: "convert-source-map@npm:1.9.0"
checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8
@@ -3838,19 +2976,6 @@ __metadata:
languageName: node
linkType: hard
-"cosmiconfig@npm:^7.0.0":
- version: 7.1.0
- resolution: "cosmiconfig@npm:7.1.0"
- dependencies:
- "@types/parse-json": ^4.0.0
- import-fresh: ^3.2.1
- parse-json: ^5.0.0
- path-type: ^4.0.0
- yaml: ^1.10.0
- checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f
- languageName: node
- linkType: hard
-
"cross-spawn@npm:^6.0.0":
version: 6.0.5
resolution: "cross-spawn@npm:6.0.5"
@@ -3898,13 +3023,6 @@ __metadata:
languageName: node
linkType: hard
-"csstype@npm:^3.0.2":
- version: 3.1.2
- resolution: "csstype@npm:3.1.2"
- checksum: e1a52e6c25c1314d6beef5168da704ab29c5186b877c07d822bd0806717d9a265e8493a2e35ca7e68d0f5d472d43fac1cdce70fd79fd0853dff81f3028d857b5
- languageName: node
- linkType: hard
-
"data-urls@npm:^2.0.0":
version: 2.0.0
resolution: "data-urls@npm:2.0.0"
@@ -3916,12 +3034,10 @@ __metadata:
languageName: node
linkType: hard
-"date-fns@npm:^2.12.0":
- version: 2.30.0
- resolution: "date-fns@npm:2.30.0"
- dependencies:
- "@babel/runtime": ^7.21.0
- checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4
+"date-fns@npm:2.27.*":
+ version: 2.27.0
+ resolution: "date-fns@npm:2.27.0"
+ checksum: db62036b3816eb0322c9532b353beac7f660a91e1a55dbd21c14893c621ebb8509f21c66ba287844dabd34dee0207edd54a9537bce6bb7cab9383dedc6b8bc90
languageName: node
linkType: hard
@@ -3974,14 +3090,14 @@ __metadata:
languageName: node
linkType: hard
-"deepmerge@npm:^4.0.0, deepmerge@npm:^4.2.2":
+"deepmerge@npm:^4.2.2":
version: 4.3.1
resolution: "deepmerge@npm:4.3.1"
checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052
languageName: node
linkType: hard
-"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0":
+"define-properties@npm:^1.1.4":
version: 1.2.0
resolution: "define-properties@npm:1.2.0"
dependencies:
@@ -4040,13 +3156,6 @@ __metadata:
languageName: node
linkType: hard
-"detect-node-es@npm:^1.1.0":
- version: 1.1.0
- resolution: "detect-node-es@npm:1.1.0"
- checksum: e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449
- languageName: node
- linkType: hard
-
"diff-sequences@npm:^26.6.2":
version: 26.6.2
resolution: "diff-sequences@npm:26.6.2"
@@ -4070,15 +3179,6 @@ __metadata:
languageName: node
linkType: hard
-"doctrine@npm:^2.1.0":
- version: 2.1.0
- resolution: "doctrine@npm:2.1.0"
- dependencies:
- esutils: ^2.0.2
- checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8
- languageName: node
- linkType: hard
-
"doctrine@npm:^3.0.0":
version: 3.0.0
resolution: "doctrine@npm:3.0.0"
@@ -4095,16 +3195,6 @@ __metadata:
languageName: node
linkType: hard
-"dom-helpers@npm:^5.0.1":
- version: 5.2.1
- resolution: "dom-helpers@npm:5.2.1"
- dependencies:
- "@babel/runtime": ^7.8.7
- csstype: ^3.0.2
- checksum: 863ba9e086f7093df3376b43e74ce4422571d404fc9828bf2c56140963d5edf0e56160f9b2f3bb61b282c07f8fc8134f023c98fd684bddcb12daf7b0f14d951c
- languageName: node
- linkType: hard
-
"domexception@npm:^2.0.1":
version: 2.0.1
resolution: "domexception@npm:2.0.1"
@@ -4207,84 +3297,6 @@ __metadata:
languageName: node
linkType: hard
-"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4":
- version: 1.22.1
- resolution: "es-abstract@npm:1.22.1"
- dependencies:
- array-buffer-byte-length: ^1.0.0
- arraybuffer.prototype.slice: ^1.0.1
- available-typed-arrays: ^1.0.5
- call-bind: ^1.0.2
- es-set-tostringtag: ^2.0.1
- es-to-primitive: ^1.2.1
- function.prototype.name: ^1.1.5
- get-intrinsic: ^1.2.1
- get-symbol-description: ^1.0.0
- globalthis: ^1.0.3
- gopd: ^1.0.1
- has: ^1.0.3
- has-property-descriptors: ^1.0.0
- has-proto: ^1.0.1
- has-symbols: ^1.0.3
- internal-slot: ^1.0.5
- is-array-buffer: ^3.0.2
- is-callable: ^1.2.7
- is-negative-zero: ^2.0.2
- is-regex: ^1.1.4
- is-shared-array-buffer: ^1.0.2
- is-string: ^1.0.7
- is-typed-array: ^1.1.10
- is-weakref: ^1.0.2
- object-inspect: ^1.12.3
- object-keys: ^1.1.1
- object.assign: ^4.1.4
- regexp.prototype.flags: ^1.5.0
- safe-array-concat: ^1.0.0
- safe-regex-test: ^1.0.0
- string.prototype.trim: ^1.2.7
- string.prototype.trimend: ^1.0.6
- string.prototype.trimstart: ^1.0.6
- typed-array-buffer: ^1.0.0
- typed-array-byte-length: ^1.0.0
- typed-array-byte-offset: ^1.0.0
- typed-array-length: ^1.0.4
- unbox-primitive: ^1.0.2
- which-typed-array: ^1.1.10
- checksum: 614e2c1c3717cb8d30b6128ef12ea110e06fd7d75ad77091ca1c5dbfb00da130e62e4bbbbbdda190eada098a22b27fe0f99ae5a1171dac2c8663b1e8be8a3a9b
- languageName: node
- linkType: hard
-
-"es-set-tostringtag@npm:^2.0.1":
- version: 2.0.1
- resolution: "es-set-tostringtag@npm:2.0.1"
- dependencies:
- get-intrinsic: ^1.1.3
- has: ^1.0.3
- has-tostringtag: ^1.0.0
- checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884
- languageName: node
- linkType: hard
-
-"es-shim-unscopables@npm:^1.0.0":
- version: 1.0.0
- resolution: "es-shim-unscopables@npm:1.0.0"
- dependencies:
- has: ^1.0.3
- checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1
- languageName: node
- linkType: hard
-
-"es-to-primitive@npm:^1.2.1":
- version: 1.2.1
- resolution: "es-to-primitive@npm:1.2.1"
- dependencies:
- is-callable: ^1.1.4
- is-date-object: ^1.0.1
- is-symbol: ^1.0.2
- checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed
- languageName: node
- linkType: hard
-
"esbuild-android-64@npm:0.14.54":
version: 0.14.54
resolution: "esbuild-android-64@npm:0.14.54"
@@ -4586,31 +3598,6 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-react@npm:^7.22.0":
- version: 7.33.0
- resolution: "eslint-plugin-react@npm:7.33.0"
- dependencies:
- array-includes: ^3.1.6
- array.prototype.flatmap: ^1.3.1
- array.prototype.tosorted: ^1.1.1
- doctrine: ^2.1.0
- estraverse: ^5.3.0
- jsx-ast-utils: ^2.4.1 || ^3.0.0
- minimatch: ^3.1.2
- object.entries: ^1.1.6
- object.fromentries: ^2.0.6
- object.hasown: ^1.1.2
- object.values: ^1.1.6
- prop-types: ^15.8.1
- resolve: ^2.0.0-next.4
- semver: ^6.3.1
- string.prototype.matchall: ^4.0.8
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
- checksum: f3ce2978322efd3c698b802dabfad070109dd1935c4e468545992b82b5fb8257ea3ad56732330bb46643182a09560129a259b436952b3e2aa426947d3abd2b1a
- languageName: node
- linkType: hard
-
"eslint-scope@npm:^5.1.1":
version: 5.1.1
resolution: "eslint-scope@npm:5.1.1"
@@ -4751,20 +3738,13 @@ __metadata:
languageName: node
linkType: hard
-"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0":
+"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0":
version: 5.3.0
resolution: "estraverse@npm:5.3.0"
checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b
languageName: node
linkType: hard
-"estree-walker@npm:^2.0.1":
- version: 2.0.2
- resolution: "estree-walker@npm:2.0.2"
- checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
- languageName: node
- linkType: hard
-
"esutils@npm:^2.0.2":
version: 2.0.3
resolution: "esutils@npm:2.0.3"
@@ -4978,13 +3958,6 @@ __metadata:
languageName: node
linkType: hard
-"find-root@npm:^1.1.0":
- version: 1.1.0
- resolution: "find-root@npm:1.1.0"
- checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf
- languageName: node
- linkType: hard
-
"find-up@npm:^4.0.0, find-up@npm:^4.1.0":
version: 4.1.0
resolution: "find-up@npm:4.1.0"
@@ -5012,34 +3985,6 @@ __metadata:
languageName: node
linkType: hard
-"focus-lock@npm:^0.11.6":
- version: 0.11.6
- resolution: "focus-lock@npm:0.11.6"
- dependencies:
- tslib: ^2.0.3
- checksum: 6a407c4c45f05f8258f92565541fc5f8043f576643a7603eb999e1a790173e08712056766ed034ccd31c6d6deed259dea558002712fa5ef2432fc6930b9c7a05
- languageName: node
- linkType: hard
-
-"follow-redirects@npm:^1.14.0":
- version: 1.15.2
- resolution: "follow-redirects@npm:1.15.2"
- peerDependenciesMeta:
- debug:
- optional: true
- checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190
- languageName: node
- linkType: hard
-
-"for-each@npm:^0.3.3":
- version: 0.3.3
- resolution: "for-each@npm:0.3.3"
- dependencies:
- is-callable: ^1.1.3
- checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28
- languageName: node
- linkType: hard
-
"for-in@npm:^1.0.2":
version: 1.0.2
resolution: "for-in@npm:1.0.2"
@@ -5114,7 +4059,7 @@ __metadata:
"fsevents@patch:fsevents@^2.1.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin":
version: 2.3.2
- resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7"
+ resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1"
dependencies:
node-gyp: latest
conditions: os=darwin
@@ -5128,18 +4073,6 @@ __metadata:
languageName: node
linkType: hard
-"function.prototype.name@npm:^1.1.5":
- version: 1.1.5
- resolution: "function.prototype.name@npm:1.1.5"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.3
- es-abstract: ^1.19.0
- functions-have-names: ^1.2.2
- checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27
- languageName: node
- linkType: hard
-
"functional-red-black-tree@npm:^1.0.1":
version: 1.0.1
resolution: "functional-red-black-tree@npm:1.0.1"
@@ -5147,13 +4080,6 @@ __metadata:
languageName: node
linkType: hard
-"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3":
- version: 1.2.3
- resolution: "functions-have-names@npm:1.2.3"
- checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5
- languageName: node
- linkType: hard
-
"gauge@npm:^4.0.3":
version: 4.0.4
resolution: "gauge@npm:4.0.4"
@@ -5184,7 +4110,7 @@ __metadata:
languageName: node
linkType: hard
-"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1":
+"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1":
version: 1.2.1
resolution: "get-intrinsic@npm:1.2.1"
dependencies:
@@ -5196,13 +4122,6 @@ __metadata:
languageName: node
linkType: hard
-"get-nonce@npm:^1.0.0":
- version: 1.0.1
- resolution: "get-nonce@npm:1.0.1"
- checksum: e2614e43b4694c78277bb61b0f04583d45786881289285c73770b07ded246a98be7e1f78b940c80cbe6f2b07f55f0b724e6db6fd6f1bcbd1e8bdac16521074ed
- languageName: node
- linkType: hard
-
"get-package-type@npm:^0.1.0":
version: 0.1.0
resolution: "get-package-type@npm:0.1.0"
@@ -5228,16 +4147,6 @@ __metadata:
languageName: node
linkType: hard
-"get-symbol-description@npm:^1.0.0":
- version: 1.0.0
- resolution: "get-symbol-description@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- get-intrinsic: ^1.1.1
- checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247
- languageName: node
- linkType: hard
-
"get-value@npm:^2.0.3, get-value@npm:^2.0.6":
version: 2.0.6
resolution: "get-value@npm:2.0.6"
@@ -5299,15 +4208,6 @@ __metadata:
languageName: node
linkType: hard
-"globalthis@npm:^1.0.3":
- version: 1.0.3
- resolution: "globalthis@npm:1.0.3"
- dependencies:
- define-properties: ^1.1.3
- checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998
- languageName: node
- linkType: hard
-
"globby@npm:^11.0.3":
version: 11.1.0
resolution: "globby@npm:11.1.0"
@@ -5322,15 +4222,6 @@ __metadata:
languageName: node
linkType: hard
-"gopd@npm:^1.0.1":
- version: 1.0.1
- resolution: "gopd@npm:1.0.1"
- dependencies:
- get-intrinsic: ^1.1.3
- checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6
- languageName: node
- linkType: hard
-
"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
@@ -5345,13 +4236,6 @@ __metadata:
languageName: node
linkType: hard
-"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2":
- version: 1.0.2
- resolution: "has-bigints@npm:1.0.2"
- checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b
- languageName: node
- linkType: hard
-
"has-flag@npm:^3.0.0":
version: 3.0.0
resolution: "has-flag@npm:3.0.0"
@@ -5382,22 +4266,13 @@ __metadata:
languageName: node
linkType: hard
-"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3":
+"has-symbols@npm:^1.0.3":
version: 1.0.3
resolution: "has-symbols@npm:1.0.3"
checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410
languageName: node
linkType: hard
-"has-tostringtag@npm:^1.0.0":
- version: 1.0.0
- resolution: "has-tostringtag@npm:1.0.0"
- dependencies:
- has-symbols: ^1.0.2
- checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c
- languageName: node
- linkType: hard
-
"has-unicode@npm:^2.0.1":
version: 2.0.1
resolution: "has-unicode@npm:2.0.1"
@@ -5453,15 +4328,6 @@ __metadata:
languageName: node
linkType: hard
-"hoist-non-react-statics@npm:^3.3.1":
- version: 3.3.2
- resolution: "hoist-non-react-statics@npm:3.3.2"
- dependencies:
- react-is: ^16.7.0
- checksum: b1538270429b13901ee586aa44f4cc3ecd8831c061d06cb8322e50ea17b3f5ce4d0e2e66394761e6c8e152cd8c34fb3b4b690116c6ce2bd45b18c746516cb9e8
- languageName: node
- linkType: hard
-
"hosted-git-info@npm:^2.1.4":
version: 2.8.9
resolution: "hosted-git-info@npm:2.8.9"
@@ -5634,28 +4500,8 @@ __metadata:
"inherits@npm:2, inherits@npm:^2.0.3":
version: 2.0.4
- resolution: "inherits@npm:2.0.4"
- checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
- languageName: node
- linkType: hard
-
-"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.5":
- version: 1.0.5
- resolution: "internal-slot@npm:1.0.5"
- dependencies:
- get-intrinsic: ^1.2.0
- has: ^1.0.3
- side-channel: ^1.0.4
- checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a
- languageName: node
- linkType: hard
-
-"invariant@npm:^2.2.4":
- version: 2.2.4
- resolution: "invariant@npm:2.2.4"
- dependencies:
- loose-envify: ^1.0.0
- checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14
+ resolution: "inherits@npm:2.0.4"
+ checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
languageName: node
linkType: hard
@@ -5684,17 +4530,6 @@ __metadata:
languageName: node
linkType: hard
-"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2":
- version: 3.0.2
- resolution: "is-array-buffer@npm:3.0.2"
- dependencies:
- call-bind: ^1.0.2
- get-intrinsic: ^1.2.0
- is-typed-array: ^1.1.10
- checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14
- languageName: node
- linkType: hard
-
"is-arrayish@npm:^0.2.1":
version: 0.2.1
resolution: "is-arrayish@npm:0.2.1"
@@ -5702,15 +4537,6 @@ __metadata:
languageName: node
linkType: hard
-"is-bigint@npm:^1.0.1":
- version: 1.0.4
- resolution: "is-bigint@npm:1.0.4"
- dependencies:
- has-bigints: ^1.0.1
- checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666
- languageName: node
- linkType: hard
-
"is-binary-path@npm:~2.1.0":
version: 2.1.0
resolution: "is-binary-path@npm:2.1.0"
@@ -5720,16 +4546,6 @@ __metadata:
languageName: node
linkType: hard
-"is-boolean-object@npm:^1.1.0":
- version: 1.1.2
- resolution: "is-boolean-object@npm:1.1.2"
- dependencies:
- call-bind: ^1.0.2
- has-tostringtag: ^1.0.0
- checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222
- languageName: node
- linkType: hard
-
"is-buffer@npm:^1.1.5":
version: 1.1.6
resolution: "is-buffer@npm:1.1.6"
@@ -5737,13 +4553,6 @@ __metadata:
languageName: node
linkType: hard
-"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7":
- version: 1.2.7
- resolution: "is-callable@npm:1.2.7"
- checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac
- languageName: node
- linkType: hard
-
"is-ci@npm:^2.0.0":
version: 2.0.0
resolution: "is-ci@npm:2.0.0"
@@ -5755,7 +4564,7 @@ __metadata:
languageName: node
linkType: hard
-"is-core-module@npm:^2.11.0, is-core-module@npm:^2.9.0":
+"is-core-module@npm:^2.11.0":
version: 2.12.1
resolution: "is-core-module@npm:2.12.1"
dependencies:
@@ -5782,15 +4591,6 @@ __metadata:
languageName: node
linkType: hard
-"is-date-object@npm:^1.0.1":
- version: 1.0.5
- resolution: "is-date-object@npm:1.0.5"
- dependencies:
- has-tostringtag: ^1.0.0
- checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc
- languageName: node
- linkType: hard
-
"is-descriptor@npm:^0.1.0":
version: 0.1.6
resolution: "is-descriptor@npm:0.1.6"
@@ -5875,22 +4675,6 @@ __metadata:
languageName: node
linkType: hard
-"is-negative-zero@npm:^2.0.2":
- version: 2.0.2
- resolution: "is-negative-zero@npm:2.0.2"
- checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a
- languageName: node
- linkType: hard
-
-"is-number-object@npm:^1.0.4":
- version: 1.0.7
- resolution: "is-number-object@npm:1.0.7"
- dependencies:
- has-tostringtag: ^1.0.0
- checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7
- languageName: node
- linkType: hard
-
"is-number@npm:^3.0.0":
version: 3.0.0
resolution: "is-number@npm:3.0.0"
@@ -5923,25 +4707,6 @@ __metadata:
languageName: node
linkType: hard
-"is-regex@npm:^1.1.4":
- version: 1.1.4
- resolution: "is-regex@npm:1.1.4"
- dependencies:
- call-bind: ^1.0.2
- has-tostringtag: ^1.0.0
- checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652
- languageName: node
- linkType: hard
-
-"is-shared-array-buffer@npm:^1.0.2":
- version: 1.0.2
- resolution: "is-shared-array-buffer@npm:1.0.2"
- dependencies:
- call-bind: ^1.0.2
- checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a
- languageName: node
- linkType: hard
-
"is-stream@npm:^1.1.0":
version: 1.1.0
resolution: "is-stream@npm:1.1.0"
@@ -5956,33 +4721,6 @@ __metadata:
languageName: node
linkType: hard
-"is-string@npm:^1.0.5, is-string@npm:^1.0.7":
- version: 1.0.7
- resolution: "is-string@npm:1.0.7"
- dependencies:
- has-tostringtag: ^1.0.0
- checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989
- languageName: node
- linkType: hard
-
-"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3":
- version: 1.0.4
- resolution: "is-symbol@npm:1.0.4"
- dependencies:
- has-symbols: ^1.0.2
- checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510
- languageName: node
- linkType: hard
-
-"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9":
- version: 1.1.12
- resolution: "is-typed-array@npm:1.1.12"
- dependencies:
- which-typed-array: ^1.1.11
- checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796
- languageName: node
- linkType: hard
-
"is-typedarray@npm:^1.0.0":
version: 1.0.0
resolution: "is-typedarray@npm:1.0.0"
@@ -5990,15 +4728,6 @@ __metadata:
languageName: node
linkType: hard
-"is-weakref@npm:^1.0.2":
- version: 1.0.2
- resolution: "is-weakref@npm:1.0.2"
- dependencies:
- call-bind: ^1.0.2
- checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de
- languageName: node
- linkType: hard
-
"is-windows@npm:^1.0.2":
version: 1.0.2
resolution: "is-windows@npm:1.0.2"
@@ -6022,13 +4751,6 @@ __metadata:
languageName: node
linkType: hard
-"isarray@npm:^2.0.5":
- version: 2.0.5
- resolution: "isarray@npm:2.0.5"
- checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a
- languageName: node
- linkType: hard
-
"isexe@npm:^2.0.0":
version: 2.0.0
resolution: "isexe@npm:2.0.0"
@@ -6607,7 +5329,7 @@ __metadata:
languageName: node
linkType: hard
-"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0":
+"js-tokens@npm:^4.0.0":
version: 4.0.0
resolution: "js-tokens@npm:4.0.0"
checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
@@ -6721,18 +5443,6 @@ __metadata:
languageName: node
linkType: hard
-"jsx-ast-utils@npm:^2.4.1 || ^3.0.0":
- version: 3.3.5
- resolution: "jsx-ast-utils@npm:3.3.5"
- dependencies:
- array-includes: ^3.1.6
- array.prototype.flat: ^1.3.1
- object.assign: ^4.1.4
- object.values: ^1.1.6
- checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a
- languageName: node
- linkType: hard
-
"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0":
version: 3.2.2
resolution: "kind-of@npm:3.2.2"
@@ -6812,20 +5522,6 @@ __metadata:
languageName: node
linkType: hard
-"lodash.groupby@npm:^4.0":
- version: 4.6.0
- resolution: "lodash.groupby@npm:4.6.0"
- checksum: e2d4d13d12790a1cacab3f5f120b7c072a792224e83b2f403218866d18efde76024b2579996dfebb230a61ce06469332e16639103669a35a605287e19ced6b9b
- languageName: node
- linkType: hard
-
-"lodash.isequal@npm:^4.5.0":
- version: 4.5.0
- resolution: "lodash.isequal@npm:4.5.0"
- checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644
- languageName: node
- linkType: hard
-
"lodash.merge@npm:^4.6.2":
version: 4.6.2
resolution: "lodash.merge@npm:4.6.2"
@@ -6847,17 +5543,6 @@ __metadata:
languageName: node
linkType: hard
-"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
- version: 1.4.0
- resolution: "loose-envify@npm:1.4.0"
- dependencies:
- js-tokens: ^3.0.0 || ^4.0.0
- bin:
- loose-envify: cli.js
- checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
- languageName: node
- linkType: hard
-
"lru-cache@npm:^5.1.1":
version: 5.1.1
resolution: "lru-cache@npm:5.1.1"
@@ -6956,19 +5641,12 @@ __metadata:
languageName: node
linkType: hard
-"marked@npm:^2.0.1":
- version: 2.1.3
- resolution: "marked@npm:2.1.3"
+"marked@npm:^11.0.0":
+ version: 11.1.0
+ resolution: "marked@npm:11.1.0"
bin:
- marked: bin/marked
- checksum: 21a5ecd4941bc760aba21dfd97185853ec3b464cf707ad971e3ddb3aeb2f44d0deeb36b0889932afdb6f734975a994d92f18815dd0fabadbd902bdaff997cc5b
- languageName: node
- linkType: hard
-
-"memoize-one@npm:^5.0.0":
- version: 5.2.1
- resolution: "memoize-one@npm:5.2.1"
- checksum: a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d
+ marked: bin/marked.js
+ checksum: fdc553ebfdc5fc5fe5c5d0d1831f4f8c3ed5fd89af7a428df5e0abce8fceac23da826b762c53027b7a900579b73e6d33908a0cf0c7618d03e0f378e710439d18
languageName: node
linkType: hard
@@ -7040,7 +5718,7 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
+"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
dependencies:
@@ -7363,13 +6041,6 @@ __metadata:
languageName: node
linkType: hard
-"object-assign@npm:^4.1.1":
- version: 4.1.1
- resolution: "object-assign@npm:4.1.1"
- checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
- languageName: node
- linkType: hard
-
"object-copy@npm:^0.1.0":
version: 0.1.0
resolution: "object-copy@npm:0.1.0"
@@ -7381,13 +6052,6 @@ __metadata:
languageName: node
linkType: hard
-"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0":
- version: 1.12.3
- resolution: "object-inspect@npm:1.12.3"
- checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db
- languageName: node
- linkType: hard
-
"object-keys@npm:^1.1.1":
version: 1.1.1
resolution: "object-keys@npm:1.1.1"
@@ -7404,7 +6068,7 @@ __metadata:
languageName: node
linkType: hard
-"object.assign@npm:^4.1.0, object.assign@npm:^4.1.4":
+"object.assign@npm:^4.1.0":
version: 4.1.4
resolution: "object.assign@npm:4.1.4"
dependencies:
@@ -7416,38 +6080,6 @@ __metadata:
languageName: node
linkType: hard
-"object.entries@npm:^1.1.6":
- version: 1.1.6
- resolution: "object.entries@npm:1.1.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28
- languageName: node
- linkType: hard
-
-"object.fromentries@npm:^2.0.6":
- version: 2.0.6
- resolution: "object.fromentries@npm:2.0.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: 453c6d694180c0c30df451b60eaf27a5b9bca3fb43c37908fd2b78af895803dc631242bcf05582173afa40d8d0e9c96e16e8874b39471aa53f3ac1f98a085d85
- languageName: node
- linkType: hard
-
-"object.hasown@npm:^1.1.2":
- version: 1.1.2
- resolution: "object.hasown@npm:1.1.2"
- dependencies:
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: b936572536db0cdf38eb30afd2f1026a8b6f2cc5d2c4497c9d9bbb01eaf3e980dead4fd07580cfdd098e6383e5a9db8212d3ea0c6bdd2b5e68c60aa7e3b45566
- languageName: node
- linkType: hard
-
"object.pick@npm:^1.3.0":
version: 1.3.0
resolution: "object.pick@npm:1.3.0"
@@ -7457,17 +6089,6 @@ __metadata:
languageName: node
linkType: hard
-"object.values@npm:^1.1.6":
- version: 1.1.6
- resolution: "object.values@npm:1.1.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e
- languageName: node
- linkType: hard
-
"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0":
version: 1.4.0
resolution: "once@npm:1.4.0"
@@ -7642,7 +6263,7 @@ __metadata:
languageName: node
linkType: hard
-"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1":
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
version: 2.3.1
resolution: "picomatch@npm:2.3.1"
checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf
@@ -7702,335 +6323,104 @@ __metadata:
"prettier@npm:^2.2.1":
version: 2.8.8
resolution: "prettier@npm:2.8.8"
- bin:
- prettier: bin-prettier.js
- checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8
- languageName: node
- linkType: hard
-
-"pretty-format@npm:^26.6.2":
- version: 26.6.2
- resolution: "pretty-format@npm:26.6.2"
- dependencies:
- "@jest/types": ^26.6.2
- ansi-regex: ^5.0.0
- ansi-styles: ^4.0.0
- react-is: ^17.0.1
- checksum: e3b808404d7e1519f0df1aa1f25cee0054ab475775c6b2b8c5568ff23194a92d54bf93274139b6f584ca70fd773be4eaa754b0e03f12bb0a8d1426b07f079976
- languageName: node
- linkType: hard
-
-"pretty-format@npm:^27.0.0, pretty-format@npm:^27.5.1":
- version: 27.5.1
- resolution: "pretty-format@npm:27.5.1"
- dependencies:
- ansi-regex: ^5.0.1
- ansi-styles: ^5.0.0
- react-is: ^17.0.1
- checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088
- languageName: node
- linkType: hard
-
-"progress@npm:^2.0.0":
- version: 2.0.3
- resolution: "progress@npm:2.0.3"
- checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
- languageName: node
- linkType: hard
-
-"promise-retry@npm:^2.0.1":
- version: 2.0.1
- resolution: "promise-retry@npm:2.0.1"
- dependencies:
- err-code: ^2.0.2
- retry: ^0.12.0
- checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
- languageName: node
- linkType: hard
-
-"prompts@npm:^2.0.1":
- version: 2.4.2
- resolution: "prompts@npm:2.4.2"
- dependencies:
- kleur: ^3.0.3
- sisteransi: ^1.0.5
- checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d
- languageName: node
- linkType: hard
-
-"prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
- version: 15.8.1
- resolution: "prop-types@npm:15.8.1"
- dependencies:
- loose-envify: ^1.4.0
- object-assign: ^4.1.1
- react-is: ^16.13.1
- checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459
- languageName: node
- linkType: hard
-
-"psl@npm:^1.1.33":
- version: 1.9.0
- resolution: "psl@npm:1.9.0"
- checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d
- languageName: node
- linkType: hard
-
-"pump@npm:^3.0.0":
- version: 3.0.0
- resolution: "pump@npm:3.0.0"
- dependencies:
- end-of-stream: ^1.1.0
- once: ^1.3.1
- checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9
- languageName: node
- linkType: hard
-
-"punycode@npm:^2.1.0, punycode@npm:^2.1.1":
- version: 2.3.0
- resolution: "punycode@npm:2.3.0"
- checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200
- languageName: node
- linkType: hard
-
-"qs@npm:^6.9.0":
- version: 6.11.2
- resolution: "qs@npm:6.11.2"
- dependencies:
- side-channel: ^1.0.4
- checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b
- languageName: node
- linkType: hard
-
-"querystringify@npm:^2.1.1":
- version: 2.2.0
- resolution: "querystringify@npm:2.2.0"
- checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15
- languageName: node
- linkType: hard
-
-"queue-microtask@npm:^1.2.2":
- version: 1.2.3
- resolution: "queue-microtask@npm:1.2.3"
- checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
- languageName: node
- linkType: hard
-
-"react-clientside-effect@npm:^1.2.6":
- version: 1.2.6
- resolution: "react-clientside-effect@npm:1.2.6"
- dependencies:
- "@babel/runtime": ^7.12.13
- peerDependencies:
- react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
- checksum: 7db6110027a51458b1a46109d2b63dd822825f483c71afef7c0c0a671f3b1aa155049dbd8651c9d536ffac83601f8823b7c3f8916b4f4ee5c3cb7647a85cce4e
- languageName: node
- linkType: hard
-
-"react-confirm@npm:^0.1.20":
- version: 0.1.27
- resolution: "react-confirm@npm:0.1.27"
- peerDependencies:
- react: ^0.14.7 || 15.x || 16.x || 17.x
- react-dom: ^0.14.7 || 15.x || 16.x || 17.x
- checksum: 5f06d6149b99eda5802c8e9e8ecb35c2bd6bd725467b3a020b1854474d4ce298afaf01b75ccbbdee7b9bb440a5c9a8d427e497843d8c0c9b99485354628c5627
- languageName: node
- linkType: hard
-
-"react-day-picker@npm:^7.4.8":
- version: 7.4.10
- resolution: "react-day-picker@npm:7.4.10"
- dependencies:
- prop-types: ^15.6.2
- peerDependencies:
- react: ~0.13.x || ~0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0
- checksum: 33a4614bb4d457a3e72462d092fa131d3d7ec1ba858ac7e70d65b59e464606ffc039afdd226db37ead1326e248ca9a103007ee0bb829b277cd7297e5f5807ad1
- languageName: node
- linkType: hard
-
-"react-dom@npm:^17.0":
- version: 17.0.2
- resolution: "react-dom@npm:17.0.2"
- dependencies:
- loose-envify: ^1.1.0
- object-assign: ^4.1.1
- scheduler: ^0.20.2
- peerDependencies:
- react: 17.0.2
- checksum: 1c1eaa3bca7c7228d24b70932e3d7c99e70d1d04e13bb0843bbf321582bc25d7961d6b8a6978a58a598af2af496d1cedcfb1bf65f6b0960a0a8161cb8dab743c
- languageName: node
- linkType: hard
-
-"react-error-boundary@npm:^3.1.0":
- version: 3.1.4
- resolution: "react-error-boundary@npm:3.1.4"
- dependencies:
- "@babel/runtime": ^7.12.5
- peerDependencies:
- react: ">=16.13.1"
- checksum: f36270a5d775a25c8920f854c0d91649ceea417b15b5bc51e270a959b0476647bb79abb4da3be7dd9a4597b029214e8fe43ea914a7f16fa7543c91f784977f1b
+ bin:
+ prettier: bin-prettier.js
+ checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8
languageName: node
linkType: hard
-"react-focus-lock@npm:^2.5.1":
- version: 2.9.5
- resolution: "react-focus-lock@npm:2.9.5"
+"pretty-format@npm:^26.6.2":
+ version: 26.6.2
+ resolution: "pretty-format@npm:26.6.2"
dependencies:
- "@babel/runtime": ^7.0.0
- focus-lock: ^0.11.6
- prop-types: ^15.6.2
- react-clientside-effect: ^1.2.6
- use-callback-ref: ^1.3.0
- use-sidecar: ^1.1.2
- peerDependencies:
- "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: 93473a6f0a249487e0f1609ccfe94312ce86265d7bca01f6825c061e15fcc13c78d6adb0555f8d9e7fa1cba3e23958f3ca4d4148c7bea828843c909feb5e10f1
+ "@jest/types": ^26.6.2
+ ansi-regex: ^5.0.0
+ ansi-styles: ^4.0.0
+ react-is: ^17.0.1
+ checksum: e3b808404d7e1519f0df1aa1f25cee0054ab475775c6b2b8c5568ff23194a92d54bf93274139b6f584ca70fd773be4eaa754b0e03f12bb0a8d1426b07f079976
languageName: node
linkType: hard
-"react-input-autosize@npm:^3.0.0":
- version: 3.0.0
- resolution: "react-input-autosize@npm:3.0.0"
+"pretty-format@npm:^27.0.0, pretty-format@npm:^27.5.1":
+ version: 27.5.1
+ resolution: "pretty-format@npm:27.5.1"
dependencies:
- prop-types: ^15.5.8
- peerDependencies:
- react: ^16.3.0 || ^17.0.0
- checksum: cc3309ddc87446ade742c7d0e88ef089dd8b6981f21506a2bb27daf01a8803ac697f64157c4ffc7e81dfcf3892b54a4072dbc3652fd9addcf6d22dd0b87ab723
- languageName: node
- linkType: hard
-
-"react-is@npm:^16.13.1, react-is@npm:^16.7.0":
- version: 16.13.1
- resolution: "react-is@npm:16.13.1"
- checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f
+ ansi-regex: ^5.0.1
+ ansi-styles: ^5.0.0
+ react-is: ^17.0.1
+ checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088
languageName: node
linkType: hard
-"react-is@npm:^17.0.1":
- version: 17.0.2
- resolution: "react-is@npm:17.0.2"
- checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
+"progress@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "progress@npm:2.0.3"
+ checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
languageName: node
linkType: hard
-"react-mentions@npm:^4.1.1":
- version: 4.4.10
- resolution: "react-mentions@npm:4.4.10"
+"promise-retry@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "promise-retry@npm:2.0.1"
dependencies:
- "@babel/runtime": 7.4.5
- invariant: ^2.2.4
- prop-types: ^15.5.8
- substyle: ^9.1.0
- peerDependencies:
- react: ">=16.8.3"
- react-dom: ">=16.8.3"
- checksum: 66f3ba6e27ea5b2aea354faa664b64f1f89459c70c0f78c4845418d85c1cae2ca9d20800dc39c1ee1a9c10271c85123376c97808be393b2bf6e12ec9f79e4ae4
+ err-code: ^2.0.2
+ retry: ^0.12.0
+ checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
languageName: node
linkType: hard
-"react-refresh@npm:^0.10.0":
- version: 0.10.0
- resolution: "react-refresh@npm:0.10.0"
- checksum: 089b8ea9ad8038046c0467a2476595eedab9e30620f50daa50e844c81d626de43a44a6a628256ae58e68885d5fe1d7e05074ddfd99ece3808b013d043f0c6030
+"prompts@npm:^2.0.1":
+ version: 2.4.2
+ resolution: "prompts@npm:2.4.2"
+ dependencies:
+ kleur: ^3.0.3
+ sisteransi: ^1.0.5
+ checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d
languageName: node
linkType: hard
-"react-remove-scroll-bar@npm:^2.3.4":
- version: 2.3.4
- resolution: "react-remove-scroll-bar@npm:2.3.4"
- dependencies:
- react-style-singleton: ^2.2.1
- tslib: ^2.0.0
- peerDependencies:
- "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: b5ce5f2f98d65c97a3e975823ae4043a4ba2a3b63b5ba284b887e7853f051b5cd6afb74abde6d57b421931c52f2e1fdbb625dc858b1cb5a32c27c14ab85649d4
+"psl@npm:^1.1.33":
+ version: 1.9.0
+ resolution: "psl@npm:1.9.0"
+ checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d
languageName: node
linkType: hard
-"react-remove-scroll@npm:^2.4.2":
- version: 2.5.6
- resolution: "react-remove-scroll@npm:2.5.6"
+"pump@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "pump@npm:3.0.0"
dependencies:
- react-remove-scroll-bar: ^2.3.4
- react-style-singleton: ^2.2.1
- tslib: ^2.1.0
- use-callback-ref: ^1.3.0
- use-sidecar: ^1.1.2
- peerDependencies:
- "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: 0a31f822136f4d4cde0c34264b68dd3a0432d36e2ca5162cd2df0f205980debb9a5e107843120220a599275af02df7805f0d5f44e54f2bd8b0c39a7fdd304036
+ end-of-stream: ^1.1.0
+ once: ^1.3.1
+ checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9
languageName: node
linkType: hard
-"react-select@npm:^4.3.0":
- version: 4.3.1
- resolution: "react-select@npm:4.3.1"
- dependencies:
- "@babel/runtime": ^7.12.0
- "@emotion/cache": ^11.4.0
- "@emotion/react": ^11.1.1
- memoize-one: ^5.0.0
- prop-types: ^15.6.0
- react-input-autosize: ^3.0.0
- react-transition-group: ^4.3.0
- peerDependencies:
- react: ^16.8.0 || ^17.0.0
- react-dom: ^16.8.0 || ^17.0.0
- checksum: e87e0b42a662ddce7957a69a3029ea769b22264c197cbd1d8bde1ce631e49c5c5f42414773364674a7a6a8431340e1ede49220583bf1dcd966b63e9bd25cfc12
+"punycode@npm:^2.1.0, punycode@npm:^2.1.1":
+ version: 2.3.0
+ resolution: "punycode@npm:2.3.0"
+ checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200
languageName: node
linkType: hard
-"react-style-singleton@npm:^2.2.1":
- version: 2.2.1
- resolution: "react-style-singleton@npm:2.2.1"
- dependencies:
- get-nonce: ^1.0.0
- invariant: ^2.2.4
- tslib: ^2.0.0
- peerDependencies:
- "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: 7ee8ef3aab74c7ae1d70ff34a27643d11ba1a8d62d072c767827d9ff9a520905223e567002e0bf6c772929d8ea1c781a3ba0cc4a563e92b1e3dc2eaa817ecbe8
+"querystringify@npm:^2.1.1":
+ version: 2.2.0
+ resolution: "querystringify@npm:2.2.0"
+ checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15
languageName: node
linkType: hard
-"react-transition-group@npm:^4.3.0":
- version: 4.4.5
- resolution: "react-transition-group@npm:4.4.5"
- dependencies:
- "@babel/runtime": ^7.5.5
- dom-helpers: ^5.0.1
- loose-envify: ^1.4.0
- prop-types: ^15.6.2
- peerDependencies:
- react: ">=16.6.0"
- react-dom: ">=16.6.0"
- checksum: 75602840106aa9c6545149d6d7ae1502fb7b7abadcce70a6954c4b64a438ff1cd16fc77a0a1e5197cdd72da398f39eb929ea06f9005c45b132ed34e056ebdeb1
+"queue-microtask@npm:^1.2.2":
+ version: 1.2.3
+ resolution: "queue-microtask@npm:1.2.3"
+ checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
languageName: node
linkType: hard
-"react@npm:^17.0":
+"react-is@npm:^17.0.1":
version: 17.0.2
- resolution: "react@npm:17.0.2"
- dependencies:
- loose-envify: ^1.1.0
- object-assign: ^4.1.1
- checksum: b254cc17ce3011788330f7bbf383ab653c6848902d7936a87b09d835d091e3f295f7e9dd1597c6daac5dc80f90e778c8230218ba8ad599f74adcc11e33b9d61b
+ resolution: "react-is@npm:17.0.2"
+ checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
languageName: node
linkType: hard
@@ -8093,7 +6483,7 @@ __metadata:
languageName: node
linkType: hard
-"regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.2":
+"regenerator-runtime@npm:^0.13.11":
version: 0.13.11
resolution: "regenerator-runtime@npm:0.13.11"
checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4
@@ -8119,17 +6509,6 @@ __metadata:
languageName: node
linkType: hard
-"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0":
- version: 1.5.0
- resolution: "regexp.prototype.flags@npm:1.5.0"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.2.0
- functions-have-names: ^1.2.3
- checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4
- languageName: node
- linkType: hard
-
"regexpp@npm:^3.1.0":
version: 3.2.0
resolution: "regexpp@npm:3.2.0"
@@ -8241,7 +6620,7 @@ __metadata:
languageName: node
linkType: hard
-"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.18.1, resolve@npm:^1.19.0, resolve@npm:^1.22.0":
+"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.18.1, resolve@npm:^1.22.0":
version: 1.22.2
resolution: "resolve@npm:1.22.2"
dependencies:
@@ -8254,22 +6633,9 @@ __metadata:
languageName: node
linkType: hard
-"resolve@npm:^2.0.0-next.4":
- version: 2.0.0-next.4
- resolution: "resolve@npm:2.0.0-next.4"
- dependencies:
- is-core-module: ^2.9.0
- path-parse: ^1.0.7
- supports-preserve-symlinks-flag: ^1.0.0
- bin:
- resolve: bin/resolve
- checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3
- languageName: node
- linkType: hard
-
-"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.18.1#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
+"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.18.1#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
version: 1.22.2
- resolution: "resolve@patch:resolve@npm%3A1.22.2#~builtin::version=1.22.2&hash=07638b"
+ resolution: "resolve@patch:resolve@npm%3A1.22.2#~builtin::version=1.22.2&hash=c3c19d"
dependencies:
is-core-module: ^2.11.0
path-parse: ^1.0.7
@@ -8280,19 +6646,6 @@ __metadata:
languageName: node
linkType: hard
-"resolve@patch:resolve@^2.0.0-next.4#~builtin":
- version: 2.0.0-next.4
- resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b"
- dependencies:
- is-core-module: ^2.9.0
- path-parse: ^1.0.7
- supports-preserve-symlinks-flag: ^1.0.0
- bin:
- resolve: bin/resolve
- checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011
- languageName: node
- linkType: hard
-
"ret@npm:~0.1.10":
version: 0.1.15
resolution: "ret@npm:0.1.15"
@@ -8346,57 +6699,27 @@ __metadata:
"@babel/core": ^7.14
"@babel/plugin-transform-runtime": ^7.14
"@babel/preset-env": ^7.14
- "@babel/preset-react": ^7.13
"@babel/preset-typescript": ^7.13
- "@dnd-kit/core": ^1.0.1
- "@dnd-kit/sortable": ^1.0.1
- "@iconify/icons-octicon": ^1.1.1
- "@iconify/react": 2.0.0-rc.2
- "@inertiajs/inertia": ^0.10.0
- "@inertiajs/inertia-react": ^0.7.0
- "@reach/alert-dialog": ^0.15.0
- "@reach/dialog": ^0.15.0
- "@reach/menu-button": ^0.13.0
- "@reach/tooltip": ^0.15.0
"@testing-library/dom": ^7.30.0
- "@testing-library/react": ^11.2.3
- "@testing-library/react-hooks": ^7.0
"@testing-library/user-event": ^12.8.3
- "@types/classnames": ^2.2.11
- "@types/dompurify": ^2.2.1
"@types/jest": ^27.0.2
- "@types/lodash.groupby": ^4.0
- "@types/lodash.sortby": ^4.0
- "@types/marked": ^2.0.0
- "@types/react": ^17.0
- "@types/react-confirm": ^0.1.4
- "@types/react-dom": ^17.0
- "@types/react-mentions": ^4.1.0
- "@types/react-select": ^4.0.14
+ "@types/sortablejs": ^1.15.3
"@typescript-eslint/eslint-plugin": ^4.14.1
"@typescript-eslint/parser": ^4.14.1
- "@vitejs/plugin-react-refresh": ^1.3.1
babel-plugin-dynamic-import-node: 2.3.3
classnames: ^2.2.6
- date-fns: ^2.12.0
+ date-fns: 2.27.*
dompurify: ^2.2.6
eslint: ^7.18.0
eslint-config-prettier: ^7.2.0
eslint-plugin-jest: ^24.3.1
eslint-plugin-prettier: ^3.3.1
- eslint-plugin-react: ^7.22.0
htmx.org: ^1.9.6
jest: ^26.6.3
- lodash.groupby: ^4.0
- marked: ^2.0.1
+ marked: ^11.0.0
prettier: ^2.2.1
- react: ^17.0
- react-confirm: ^0.1.20
- react-day-picker: ^7.4.8
- react-dom: ^17.0
- react-mentions: ^4.1.1
- react-select: ^4.3.0
sass: ^1.15.2
+ sortablejs: ^1.15.0
typescript: ^4.2.0
vite: ^2.3.3
languageName: unknown
@@ -8418,18 +6741,6 @@ __metadata:
languageName: node
linkType: hard
-"safe-array-concat@npm:^1.0.0":
- version: 1.0.0
- resolution: "safe-array-concat@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- get-intrinsic: ^1.2.0
- has-symbols: ^1.0.3
- isarray: ^2.0.5
- checksum: f43cb98fe3b566327d0c09284de2b15fb85ae964a89495c1b1a5d50c7c8ed484190f4e5e71aacc167e16231940079b326f2c0807aea633d47cc7322f40a6b57f
- languageName: node
- linkType: hard
-
"safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
@@ -8437,17 +6748,6 @@ __metadata:
languageName: node
linkType: hard
-"safe-regex-test@npm:^1.0.0":
- version: 1.0.0
- resolution: "safe-regex-test@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- get-intrinsic: ^1.1.3
- is-regex: ^1.1.4
- checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34
- languageName: node
- linkType: hard
-
"safe-regex@npm:^1.1.0":
version: 1.1.0
resolution: "safe-regex@npm:1.1.0"
@@ -8505,16 +6805,6 @@ __metadata:
languageName: node
linkType: hard
-"scheduler@npm:^0.20.2":
- version: 0.20.2
- resolution: "scheduler@npm:0.20.2"
- dependencies:
- loose-envify: ^1.1.0
- object-assign: ^4.1.1
- checksum: c4b35cf967c8f0d3e65753252d0f260271f81a81e427241295c5a7b783abf4ea9e905f22f815ab66676f5313be0a25f47be582254db8f9241b259213e999b8fc
- languageName: node
- linkType: hard
-
"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0":
version: 5.7.2
resolution: "semver@npm:5.7.2"
@@ -8602,17 +6892,6 @@ __metadata:
languageName: node
linkType: hard
-"side-channel@npm:^1.0.4":
- version: 1.0.4
- resolution: "side-channel@npm:1.0.4"
- dependencies:
- call-bind: ^1.0.0
- get-intrinsic: ^1.0.2
- object-inspect: ^1.9.0
- checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245
- languageName: node
- linkType: hard
-
"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
@@ -8716,6 +6995,13 @@ __metadata:
languageName: node
linkType: hard
+"sortablejs@npm:^1.15.0":
+ version: 1.15.0
+ resolution: "sortablejs@npm:1.15.0"
+ checksum: bb82223a663484640d317cad510ac987f26b7a443631040407224de1be069afcc6c39048b6d8527f10f269e33595e8128d7de2fac23517c8260470f77f932d55
+ languageName: node
+ linkType: hard
+
"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2":
version: 1.0.2
resolution: "source-map-js@npm:1.0.2"
@@ -8753,7 +7039,7 @@ __metadata:
languageName: node
linkType: hard
-"source-map@npm:^0.5.6, source-map@npm:^0.5.7":
+"source-map@npm:^0.5.6":
version: 0.5.7
resolution: "source-map@npm:0.5.7"
checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d
@@ -8884,55 +7170,6 @@ __metadata:
languageName: node
linkType: hard
-"string.prototype.matchall@npm:^4.0.8":
- version: 4.0.8
- resolution: "string.prototype.matchall@npm:4.0.8"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- get-intrinsic: ^1.1.3
- has-symbols: ^1.0.3
- internal-slot: ^1.0.3
- regexp.prototype.flags: ^1.4.3
- side-channel: ^1.0.4
- checksum: 952da3a818de42ad1c10b576140a5e05b4de7b34b8d9dbf00c3ac8c1293e9c0f533613a39c5cda53e0a8221f2e710bc2150e730b1c2278d60004a8a35726efb6
- languageName: node
- linkType: hard
-
-"string.prototype.trim@npm:^1.2.7":
- version: 1.2.7
- resolution: "string.prototype.trim@npm:1.2.7"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09
- languageName: node
- linkType: hard
-
-"string.prototype.trimend@npm:^1.0.6":
- version: 1.0.6
- resolution: "string.prototype.trimend@npm:1.0.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e
- languageName: node
- linkType: hard
-
-"string.prototype.trimstart@npm:^1.0.6":
- version: 1.0.6
- resolution: "string.prototype.trimstart@npm:1.0.6"
- dependencies:
- call-bind: ^1.0.2
- define-properties: ^1.1.4
- es-abstract: ^1.20.4
- checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41
- languageName: node
- linkType: hard
-
"string_decoder@npm:^1.1.1":
version: 1.3.0
resolution: "string_decoder@npm:1.3.0"
@@ -8988,25 +7225,6 @@ __metadata:
languageName: node
linkType: hard
-"stylis@npm:4.2.0":
- version: 4.2.0
- resolution: "stylis@npm:4.2.0"
- checksum: 0eb6cc1b866dc17a6037d0a82ac7fa877eba6a757443e79e7c4f35bacedbf6421fadcab4363b39667b43355cbaaa570a3cde850f776498e5450f32ed2f9b7584
- languageName: node
- linkType: hard
-
-"substyle@npm:^9.1.0":
- version: 9.4.1
- resolution: "substyle@npm:9.4.1"
- dependencies:
- "@babel/runtime": ^7.3.4
- invariant: ^2.2.4
- peerDependencies:
- react: ">=16.8.3"
- checksum: 30df7cde7d20943073c072dabcf99cbd95bc06136e7abf302fa0e2fdaa0912f1880d0a9424a1ff0012173e42e8ff03a43a717252c4e930cb41e739c29fccdea5
- languageName: node
- linkType: hard
-
"supports-color@npm:^5.3.0":
version: 5.5.0
resolution: "supports-color@npm:5.5.0"
@@ -9049,13 +7267,6 @@ __metadata:
languageName: node
linkType: hard
-"tabbable@npm:^4.0.0":
- version: 4.0.0
- resolution: "tabbable@npm:4.0.0"
- checksum: cbe1acbdabbe0744ae0088cf5133c3c36a9ebca0b670e00c1e117afaeb209d4f141368811973337b914ad1486a3b71a1ed781b698496cb4844e1804cb062baa9
- languageName: node
- linkType: hard
-
"table@npm:^6.0.9":
version: 6.8.1
resolution: "table@npm:6.8.1"
@@ -9118,13 +7329,6 @@ __metadata:
languageName: node
linkType: hard
-"tiny-warning@npm:^1.0.3":
- version: 1.0.3
- resolution: "tiny-warning@npm:1.0.3"
- checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71
- languageName: node
- linkType: hard
-
"tmpl@npm:1.0.5":
version: 1.0.5
resolution: "tmpl@npm:1.0.5"
@@ -9207,13 +7411,6 @@ __metadata:
languageName: node
linkType: hard
-"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0":
- version: 2.6.1
- resolution: "tslib@npm:2.6.1"
- checksum: b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe
- languageName: node
- linkType: hard
-
"tsutils@npm:^3.21.0":
version: 3.21.0
resolution: "tsutils@npm:3.21.0"
@@ -9269,53 +7466,6 @@ __metadata:
languageName: node
linkType: hard
-"typed-array-buffer@npm:^1.0.0":
- version: 1.0.0
- resolution: "typed-array-buffer@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- get-intrinsic: ^1.2.1
- is-typed-array: ^1.1.10
- checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3
- languageName: node
- linkType: hard
-
-"typed-array-byte-length@npm:^1.0.0":
- version: 1.0.0
- resolution: "typed-array-byte-length@npm:1.0.0"
- dependencies:
- call-bind: ^1.0.2
- for-each: ^0.3.3
- has-proto: ^1.0.1
- is-typed-array: ^1.1.10
- checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94
- languageName: node
- linkType: hard
-
-"typed-array-byte-offset@npm:^1.0.0":
- version: 1.0.0
- resolution: "typed-array-byte-offset@npm:1.0.0"
- dependencies:
- available-typed-arrays: ^1.0.5
- call-bind: ^1.0.2
- for-each: ^0.3.3
- has-proto: ^1.0.1
- is-typed-array: ^1.1.10
- checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b
- languageName: node
- linkType: hard
-
-"typed-array-length@npm:^1.0.4":
- version: 1.0.4
- resolution: "typed-array-length@npm:1.0.4"
- dependencies:
- call-bind: ^1.0.2
- for-each: ^0.3.3
- is-typed-array: ^1.1.9
- checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956
- languageName: node
- linkType: hard
-
"typedarray-to-buffer@npm:^3.1.5":
version: 3.1.5
resolution: "typedarray-to-buffer@npm:3.1.5"
@@ -9337,23 +7487,11 @@ __metadata:
"typescript@patch:typescript@^4.2.0#~builtin":
version: 4.9.5
- resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=493e53"
+ resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20
- languageName: node
- linkType: hard
-
-"unbox-primitive@npm:^1.0.2":
- version: 1.0.2
- resolution: "unbox-primitive@npm:1.0.2"
- dependencies:
- call-bind: ^1.0.2
- has-bigints: ^1.0.2
- has-symbols: ^1.0.3
- which-boxed-primitive: ^1.0.2
- checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9
+ checksum: 1f8f3b6aaea19f0f67cba79057674ba580438a7db55057eb89cc06950483c5d632115c14077f6663ea76fd09fce3c190e6414bb98582ec80aa5a4eaf345d5b68
languageName: node
linkType: hard
@@ -9475,37 +7613,6 @@ __metadata:
languageName: node
linkType: hard
-"use-callback-ref@npm:^1.3.0":
- version: 1.3.0
- resolution: "use-callback-ref@npm:1.3.0"
- dependencies:
- tslib: ^2.0.0
- peerDependencies:
- "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: 7913df383a5a6fcb399212eedefaac2e0c6f843555202d4e3010bac3848afe38ecaa3d0d6500ad1d936fbeffd637e6c517e68edb024af5e6beca7f27f3ce7b21
- languageName: node
- linkType: hard
-
-"use-sidecar@npm:^1.1.2":
- version: 1.1.2
- resolution: "use-sidecar@npm:1.1.2"
- dependencies:
- detect-node-es: ^1.1.0
- tslib: ^2.0.0
- peerDependencies:
- "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- "@types/react":
- optional: true
- checksum: 925d1922f9853e516eaad526b6fed1be38008073067274f0ecc3f56b17bb8ab63480140dd7c271f94150027c996cea4efe83d3e3525e8f3eda22055f6a39220b
- languageName: node
- linkType: hard
-
"use@npm:^3.1.0":
version: 3.1.1
resolution: "use@npm:3.1.1"
@@ -9613,15 +7720,6 @@ __metadata:
languageName: node
linkType: hard
-"warning@npm:^4.0.3":
- version: 4.0.3
- resolution: "warning@npm:4.0.3"
- dependencies:
- loose-envify: ^1.0.0
- checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c
- languageName: node
- linkType: hard
-
"webidl-conversions@npm:^5.0.0":
version: 5.0.0
resolution: "webidl-conversions@npm:5.0.0"
@@ -9663,19 +7761,6 @@ __metadata:
languageName: node
linkType: hard
-"which-boxed-primitive@npm:^1.0.2":
- version: 1.0.2
- resolution: "which-boxed-primitive@npm:1.0.2"
- dependencies:
- is-bigint: ^1.0.1
- is-boolean-object: ^1.1.0
- is-number-object: ^1.0.4
- is-string: ^1.0.5
- is-symbol: ^1.0.3
- checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e
- languageName: node
- linkType: hard
-
"which-module@npm:^2.0.0":
version: 2.0.1
resolution: "which-module@npm:2.0.1"
@@ -9683,19 +7768,6 @@ __metadata:
languageName: node
linkType: hard
-"which-typed-array@npm:^1.1.10, which-typed-array@npm:^1.1.11":
- version: 1.1.11
- resolution: "which-typed-array@npm:1.1.11"
- dependencies:
- available-typed-arrays: ^1.0.5
- call-bind: ^1.0.2
- for-each: ^0.3.3
- gopd: ^1.0.1
- has-tostringtag: ^1.0.0
- checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206
- languageName: node
- linkType: hard
-
"which@npm:^1.2.9":
version: 1.3.1
resolution: "which@npm:1.3.1"
@@ -9829,13 +7901,6 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:^1.10.0":
- version: 1.10.2
- resolution: "yaml@npm:1.10.2"
- checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f
- languageName: node
- linkType: hard
-
"yargs-parser@npm:^18.1.2":
version: 18.1.3
resolution: "yargs-parser@npm:18.1.3"