fix: make Todo reminders and selects usable
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env node
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const root = path.resolve(__dirname, '..');
|
||||
const checks = [
|
||||
['plugins/todo/frontend/src/index.js', '.todo-select'],
|
||||
['plugins/files/frontend/src/index.js', '.files-sort'],
|
||||
['plugins/notes/frontend/src/index.js', '.notes-sort'],
|
||||
['plugins/browser-inbox/frontend/src/index.js', '.browser-inbox-select'],
|
||||
['plugins/trash/frontend/src/index.js', '.trash-select'],
|
||||
['plugins/secrets/frontend/src/index.js', '.secrets-select'],
|
||||
];
|
||||
|
||||
function escapeRegExp(value) {
|
||||
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
}
|
||||
|
||||
let failed = false;
|
||||
for (const [relativePath, selector] of checks) {
|
||||
const source = fs.readFileSync(path.join(root, relativePath), 'utf8');
|
||||
const escaped = escapeRegExp(selector);
|
||||
if (!new RegExp(`${escaped}\\{[^}]*appearance:none`).test(source)) {
|
||||
console.error(`${relativePath}: ${selector} must hide the native select arrow`);
|
||||
failed = true;
|
||||
}
|
||||
if (!new RegExp(`${escaped} option\\{[^}]*background`).test(source)) {
|
||||
console.error(`${relativePath}: ${selector} options must use the application surface`);
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) process.exit(1);
|
||||
console.log('official plugin select styles are complete');
|
||||
@@ -89,6 +89,18 @@ else
|
||||
echo " ⚠️ node not available — skipping localization catalog validation"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "[select styles]"
|
||||
if command -v node &>/dev/null; then
|
||||
set +e
|
||||
node "$ROOT/scripts/check-select-styles.js"
|
||||
STATUS=$?
|
||||
set -e
|
||||
report "selects use application styles" "$STATUS"
|
||||
else
|
||||
echo " ⚠️ node not available — skipping select style validation"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
# Guard official plugins against bypassing the v2 plugin API for note features.
|
||||
echo "[frontend API boundary]"
|
||||
|
||||
@@ -231,8 +231,13 @@ async function mountWithApi(apiState, props, emittedEvents = [], document = make
|
||||
byData(container, 'data-todo-input', 'title').value = 'Prepare project review';
|
||||
byData(container, 'data-todo-input', 'description').value = 'Collect factual review notes.';
|
||||
byData(container, 'data-todo-input', 'priority').value = 'high';
|
||||
byData(container, 'data-todo-input', 'dueAt').value = '2000-01-01';
|
||||
byData(container, 'data-todo-input', 'reminderAt').value = '2000-01-01T09:00';
|
||||
byData(container, 'data-todo-input', 'dueAt').value = '01/02/2000';
|
||||
const reminderDate = byData(container, 'data-todo-input', 'reminderDate');
|
||||
const reminderTime = byData(container, 'data-todo-input', 'reminderTime');
|
||||
if (!reminderDate || reminderDate.getAttribute('type') !== 'date') throw new Error('Todo reminder date input was not rendered');
|
||||
if (!reminderTime || reminderTime.getAttribute('type') !== 'time') throw new Error('Todo reminder time input was not rendered');
|
||||
reminderDate.value = '01/02/2000';
|
||||
reminderTime.value = '09:00';
|
||||
byData(container, 'data-todo-action', 'save').click();
|
||||
await flush();
|
||||
|
||||
@@ -241,7 +246,7 @@ async function mountWithApi(apiState, props, emittedEvents = [], document = make
|
||||
const createdTodo = storedAfterCreate[0];
|
||||
if (createdTodo.workspaceRootPath !== 'Project') throw new Error('workspace Todo did not keep the Project root path');
|
||||
if (createdTodo.status !== 'open' || createdTodo.priority !== 'high') throw new Error('Todo status or priority was not stored');
|
||||
if (createdTodo.dueAt !== '2000-01-01' || createdTodo.reminderAt !== '2000-01-01T09:00') throw new Error('Todo due/reminder metadata was not stored');
|
||||
if (createdTodo.dueAt !== '2000-01-02' || createdTodo.reminderAt !== '2000-01-02T09:00') throw new Error('Todo due/reminder metadata was not stored');
|
||||
if (!container.textContent.includes('Overdue') || !container.textContent.includes('Reminder due')) throw new Error('due/reminder indicators were not rendered');
|
||||
const scheduledAfterCreate = apiState.notificationCalls.at(-1) || [];
|
||||
if (scheduledAfterCreate.length !== 1
|
||||
|
||||
Reference in New Issue
Block a user