Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 168 additions & 0 deletions .task-state.json
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,70 @@
"cargo test, cargo check, cargo clippy pass"
],
"fetched_body": true
},
{
"number": 306,
"priority": "medium",
"title": "[FEATURE] Frontend WebSocket Sync Service",
"status": "completed",
"depends_on": [],
"blocks": [],
"acceptance_summary": [
"SyncService with connect/disconnect/pushChange methods created",
"SyncStatusComponent page showing connection status, last sync, pending changes",
"WebSocket connection with ping/keepalive",
"rxjs Observable for receiving sync changes"
],
"fetched_body": true
},
{
"number": 287,
"priority": "medium",
"title": "[FEATURE] Template Engine for Daily Notes",
"status": "completed",
"depends_on": [],
"blocks": [],
"acceptance_summary": [
"NoteTemplate struct with name, content, variables fields",
"render_template() with {{variable}}, {{date:format}}, {{time:format}} support",
"list_templates/save_template/delete_template/get_template functions",
"create_daily_note() generating daily/YYYY-MM-DD notes from templates",
"REST endpoints: GET /templates, PUT /templates/{name}, DELETE /templates/{name}, POST /notes/daily"
],
"fetched_body": true
},
{
"number": 288,
"priority": "medium",
"title": "[FEATURE] Frontmatter Validation",
"status": "completed",
"depends_on": [],
"blocks": [],
"acceptance_summary": [
"FrontmatterSchema struct with required_fields, field_types, allowed_tags, max_tags",
"FieldType enum: String, Number, Date, TagList, StringList",
"validate_frontmatter() returning list of validation errors",
"get_default_schema() with title required and date/tag types",
"Default schema registered on server startup",
"Schema persistence: save_schema/load_schema/list_schemas/delete_schema"
],
"fetched_body": true
},
{
"number": 308,
"priority": "low",
"title": "[FEATURE] Frontend Testing Infrastructure",
"status": "completed",
"depends_on": [],
"blocks": [],
"acceptance_summary": [
"karma.conf.js configured with ChromeHeadless, jasmine, coverage",
"test.ts entry point for Angular testing environment",
"tsconfig.spec.json for test compilation",
"Sample specs for ApexStoreService (5 test cases)",
"Sample specs for ToastService (12 test cases covering all methods)"
],
"fetched_body": true
}
],
"todos": [
Expand Down Expand Up @@ -1099,6 +1163,110 @@
"files": [],
"depends_on": ["T268_1", "T268_2"],
"notes": "cargo test --all-features -- core::engine::transaction: 15 passed, 0 failed. cargo clippy --all-targets --all-features -- -D warnings: passes. cargo fmt --all: passes."
},
{
"id": "T306_1",
"description": "Issue #306: Create SyncService with connect/disconnect/pushChange and Observable",
"status": "done",
"files": ["frontend/src/app/services/sync.service.ts"],
"depends_on": [],
"notes": "Created SyncService with WebSocket management, ping keepalive, status/change Observables"
},
{
"id": "T306_2",
"description": "Issue #306: Create SyncStatusComponent page with status display",
"status": "done",
"files": ["frontend/src/app/pages/sync-status/sync-status.component.ts"],
"depends_on": ["T306_1"],
"notes": "Created SyncStatusComponent showing connection status, last sync time, pending changes count"
},
{
"id": "T306_3",
"description": "Issue #306: Register sync-status route in app.routes.ts",
"status": "done",
"files": ["frontend/src/app/app.routes.ts"],
"depends_on": ["T306_2"],
"notes": "Added route for /sync-status pointing to SyncStatusComponent"
},
{
"id": "T287_1",
"description": "Issue #287: Create template.rs with NoteTemplate, render_template, template CRUD, daily notes",
"status": "done",
"files": ["src/notes/template.rs"],
"depends_on": [],
"notes": "Created template module with render_template (variable/date/time substitution), list/save/get/delete template, create_daily_note"
},
{
"id": "T287_2",
"description": "Issue #287: Add pub mod template; to src/notes/mod.rs and re-exports",
"status": "done",
"files": ["src/notes/mod.rs"],
"depends_on": ["T287_1"],
"notes": "Added pub mod template; and pub use template::{render_template, NoteTemplate};"
},
{
"id": "T287_3",
"description": "Issue #287: Add REST endpoints for templates and daily notes",
"status": "done",
"files": ["src/api/notes.rs"],
"depends_on": ["T287_2"],
"notes": "Added GET /templates, PUT /templates/{name}, DELETE /templates/{name}, POST /notes/daily handlers"
},
{
"id": "T288_1",
"description": "Issue #288: Create validate.rs with FrontmatterSchema, validate_frontmatter, schema CRUD",
"status": "done",
"files": ["src/notes/validate.rs"],
"depends_on": [],
"notes": "Created validate module with FrontmatterSchema, FieldType enum, validate_frontmatter, get_default_schema, schema persistence"
},
{
"id": "T288_2",
"description": "Issue #288: Add pub mod validate; to src/notes/mod.rs",
"status": "done",
"files": ["src/notes/mod.rs"],
"depends_on": ["T288_1"],
"notes": "Added pub mod validate; and pub use validate::FrontmatterSchema;"
},
{
"id": "T288_3",
"description": "Issue #288: Register default frontmatter schema on server startup",
"status": "done",
"files": ["src/bin/server.rs"],
"depends_on": ["T288_2"],
"notes": "Added register_default_schema() call in server.rs after engine initialization"
},
{
"id": "T308_1",
"description": "Issue #308: Create karma.conf.js for Angular testing",
"status": "done",
"files": ["frontend/karma.conf.js"],
"depends_on": [],
"notes": "Created karma config with ChromeHeadless, jasmine, coverage, kjhtml reporter"
},
{
"id": "T308_2",
"description": "Issue #308: Create test.ts entry point and tsconfig.spec.json",
"status": "done",
"files": ["frontend/src/test.ts", "frontend/tsconfig.spec.json"],
"depends_on": ["T308_1"],
"notes": "Created test.ts with Angular testing environment init, tsconfig.spec.json with jasmine types"
},
{
"id": "T308_3",
"description": "Issue #308: Add test builder to angular.json",
"status": "done",
"files": ["frontend/angular.json"],
"depends_on": ["T308_2"],
"notes": "Added karma test builder configuration to angular.json"
},
{
"id": "T308_4",
"description": "Issue #308: Create sample specs for ApexStoreService and ToastService",
"status": "done",
"files": ["frontend/src/app/services/apex-store.service.spec.ts", "frontend/src/app/services/toast.service.spec.ts"],
"depends_on": ["T308_1"],
"notes": "Created 5 spec cases for ApexStoreService (put, get, delete, listKeys, getStats) and 12 spec cases for ToastService"
}
]
}
15 changes: 15 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ reqwest = { version = "0.12", default-features = false, features = ["json", "rus
ureq = "2.12"
sqlparser = "0.45"
jsonschema = "0.18"
actix-ws = "0.3"

[dev-dependencies]
tempfile = "3.24"
Expand Down
9 changes: 9 additions & 0 deletions frontend/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@
"development": { "buildTarget": "apexstore-frontend:build:development" }
},
"defaultConfiguration": "development"
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"polyfills": ["zone.js", "zone.js/testing"],
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"scripts": []
}
}
}
}
Expand Down
40 changes: 40 additions & 0 deletions frontend/karma.conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Karma configuration file for ApexStore frontend
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma'),
],
client: {
jasmine: {
random: true,
seed: null, // use constant seed for reproducible runs
},
},
jasmineHtmlReporter: {
suppressAll: true,
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/apexstore-frontend'),
subdir: '.',
reporters: [
{ type: 'html' },
{ type: 'text-summary' },
{ type: 'lcovonly' },
],
},
reporters: ['progress', 'kjhtml'],
browsers: ['ChromeHeadless'],
restartOnFileChange: true,
singleRun: false,
failOnEmptyTestSuite: false,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
});
};
6 changes: 6 additions & 0 deletions frontend/src/app/app.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@
</span>
<span>GitHub</span>
</a>
<button class="nav-item theme-toggle" (click)="toggleTheme()" title="Toggle theme">
<span class="nav-icon">
<hugeicons-icon [icon]="theme() === 'dark' ? SunIcon : MoonIcon" [size]="17" [strokeWidth]="1.5" />
</span>
<span>{{ theme() === 'dark' ? 'Light Mode' : 'Dark Mode' }}</span>
</button>
</div>
</aside>

Expand Down
8 changes: 8 additions & 0 deletions frontend/src/app/app.component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@
margin-top: 12px;
}

.theme-toggle {
background: none;
border: none;
cursor: pointer;
width: 100%;
font-family: var(--font-sans);
}

.main-content {
flex: 1;
overflow-y: auto;
Expand Down
Loading
Loading