Compare commits

..

970 Commits

Author SHA1 Message Date
imacat 97748bea60 Fix JSDoc errors: remove unsupported @constant tags and correct @param names
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:20:05 +08:00
imacat 093eabaea3 Add TypeDoc for API documentation generation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:18:07 +08:00
imacat 5020d91277 Rewrite README with project overview, tech stack, and usage guide
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 10:10:28 +08:00
imacat fe8a1e8a00 Replace hard-coded test passwords with crypto.randomUUID() (S2068)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:51:34 +08:00
imacat 30ea7711ce Remove outdated doc directory with stale project structure snapshot
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:40:28 +08:00
imacat ced1ff617a Replace void with expect().toBeDefined() for getter side-effect access (S3735)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:30:45 +08:00
imacat af69b6695c Use defineOptions for beforeRouteEnter, eliminating dual script block (S3863)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:25:00 +08:00
imacat dcb497d64b Use void operator for getter side-effect access in tests (S1481)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:11:19 +08:00
imacat 289d4213e2 Refactor MainContainer to use onBeforeRouteUpdate Composition API, eliminating dual script block (S3863)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:10:27 +08:00
imacat bbca475bbe Replace async IIFE with onMounted for page initialization (S7785)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 08:47:34 +08:00
imacat e9e588385b Replace JSON.parse(JSON.stringify()) with lodash-es cloneDeep for deep cloning Vue reactive data (S7784)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 08:34:31 +08:00
imacat 2374363484 Refactor mapPathStore: extract helpers, use for-of, remove unnecessary await, collapse else-if (S3776, S4138, S4123, S6660)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:38:11 +08:00
imacat 67a26ae726 Remove TODO comment from conformanceInput store (S1135)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:38:06 +08:00
imacat fad0b6f50e Assign getter access to variable to avoid bare expression statements (S905)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:38:02 +08:00
imacat cb22ce72c1 Collapse if-only-in-else to else-if (S6660)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:37:57 +08:00
imacat 4cd61aed0d Use childNode.remove() instead of parentNode.removeChild() (S7762)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:37:50 +08:00
imacat 75adbd9c6b Use Math.min to simplify ternary clamping expressions (S7766)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:37:46 +08:00
imacat 731649ed0a Use throw instead of return Promise.reject in async error handlers (S7746)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:37:42 +08:00
imacat a54b4cc7bb Use globalThis instead of window for global object access (S7764)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 07:37:37 +08:00
imacat 81df955845 Reduce cognitive complexity by extracting helper functions (S3776)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:03:44 +08:00
imacat 201f94e133 Use String.raw for backslash-escaped CSS selectors in Cypress tests (S7780)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:02:33 +08:00
imacat e522bd0796 Move functions to outer scope for clarity (S7721)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:01:29 +08:00
imacat 5942c9ff51 Handle caught exceptions properly in catch blocks (S2486)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:00:32 +08:00
imacat 804d78837b Flip negated conditions to positive for readability (S7735)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:59:37 +08:00
imacat 5a936cad97 Use nullish coalescing operator (S6606) and fix duplicate id (S7930)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:55:19 +08:00
imacat ad53494f26 Use optional chaining instead of repeated access (S6582)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:53:48 +08:00
imacat d4429571d5 Revert "Use structuredClone instead of JSON.parse(JSON.stringify()) (S7784)"
This reverts commit 2b0dadedd4.
2026-03-10 00:50:31 +08:00
imacat f0065db295 Remove conditional that returns the same value on both branches (S3923)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:32:50 +08:00
imacat 4e5129ca13 Use Set with .has() instead of Array with .includes() (S7776)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:32:30 +08:00
imacat 1df984c567 Use default parameter instead of reassignment (S7760)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:31:57 +08:00
imacat 468fa63201 Remove zero fractions from number literals (S7748)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:31:40 +08:00
imacat 94e200bded Use codePointAt/fromCodePoint instead of charCodeAt/fromCharCode (S7758)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:31:21 +08:00
imacat 1c8ac09184 Compare with undefined directly instead of using typeof (S7741)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:30:58 +08:00
imacat 5d143d4cc3 Use globalThis instead of window (S7764)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:30:33 +08:00
imacat ebd198e28d Use String.replaceAll() instead of String.replace() with /g flag (S7781)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:29:28 +08:00
imacat 2b0dadedd4 Use structuredClone instead of JSON.parse(JSON.stringify()) (S7784)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:28:30 +08:00
imacat 3768c6e5ec Use Number.parseInt/parseFloat/isNaN/isFinite instead of globals (S7773)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:26:59 +08:00
imacat 12068281e9 Remove unused imports and variables (S1128, S1481, S1854)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:18:03 +08:00
imacat 6d13bc9eb8 Replace deprecated PrimeVue components with their successors (S1874)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:14:01 +08:00
imacat 716edb33b7 Initialize result to null and remove redundant await in MoreModal switchCaseData
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:38:13 +08:00
imacat 1258829c01 Add null guard for infiniteData.length in MoreModal handleScroll
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:37:34 +08:00
imacat a9a4b89111 Lower z-index from 2^31 overflow to reasonable 1100
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:23:54 +08:00
imacat 2b1d60b3d1 Add null guard before spreading fetchData result in MoreModal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:23:25 +08:00
imacat 2f0728280c Reset loading and scroll state in fetchData catch blocks to prevent stuck UI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:23:05 +08:00
imacat dd5096b10b Add radix parameter to parseInt calls in DurationInput
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:46:20 +08:00
imacat 2b5938738e Fix isSafeTagId regex to allow hyphens, matching PerformancePage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:45:53 +08:00
imacat bbcbdf542a Add try-catch-finally to switchCaseData to prevent loading stuck on error
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:45:30 +08:00
imacat e155c0114f Add explicit return values in store catch blocks to prevent undefined crashes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:45:02 +08:00
imacat e5b40605ec Add null guards for ref(null) stat data in SidebarStates template and show handler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:23:09 +08:00
imacat 1f3a198a6d Add null guard before spreading error.response.data.detail in uploadLog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:22:31 +08:00
imacat 533b78a37f Use col.field instead of array index as v-for key on Column components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:06:50 +08:00
imacat 242c96f978 Add null checks for DOM queries in resizeLeftMask/resizeRightMask
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:06:17 +08:00
imacat 68806aa29e Add early return guard for undefined uploadFile before accessing .size
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:05:53 +08:00
imacat d47d03c3be Fix timeLabel regex to match decimal values like "45.5 sec"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:05:27 +08:00
imacat d0da9e875e Remove orphaned emitter.emit calls with no matching listener
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:54:10 +08:00
imacat f04da6e278 Fix memory leaks from Cytoscape instances not returned/destroyed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:53:25 +08:00
imacat 9aa60414e7 Remove unnecessary async from 9 functions that have no await
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:44:37 +08:00
imacat a5e0e59e0b Add division by zero guards in setLoopData and setIssueData
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:43:52 +08:00
imacat ddec851276 Add consistent en-US locale to toLocaleString() calls
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:22:49 +08:00
imacat 333685fb99 Initialize maxTotal/minTotal from props via watchers in DurationInput
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:22:02 +08:00
imacat a669c8e98e Return empty array instead of undefined in mapTimestampToAxisTicksByFormat
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:39:43 +08:00
imacat 35d5b07b07 Remove unnecessary await on non-Promise values in FunnelFilter
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:38:58 +08:00
imacat 542b941efb Add missing padStart when clamping to min value in DurationInput
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:48:45 +08:00
imacat 674afd769c Replace loose equality (==) with strict equality (===) for ID comparisons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:48:28 +08:00
imacat e5e7b8b7b6 Add division by zero guards in TraceFilter traceList and caseTotalPercent
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:47:47 +08:00
imacat 1f603af1a9 Add division by zero guard in SidebarTraces traceList computed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:47:20 +08:00
imacat e52a53615f Remove unnecessary async from closeModal()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:41:46 +08:00
imacat 0728c9b6b5 Remove unnecessary await on toast.success() and modalStore.closeModal()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:41:30 +08:00
imacat 1c70c9b3af Return false instead of undefined in depthFirstSearchMatchTwoPaths bounds checks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:40:54 +08:00
imacat 7a1b996877 Await fetchAllFiles() in FilesPage onMounted to fix premature loading reset
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:40:27 +08:00
imacat 07dd30dc50 Add optional chaining for uploadDetail.value.columns in submit()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:33:34 +08:00
imacat ba360120de Return null instead of undefined on 404 in conformance trace detail methods
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:33:17 +08:00
imacat f69eb6ac15 Remove no-op circular watch on isSubmittedData in ConformanceSidebar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:32:56 +08:00
imacat 9641fd1e0e Add null/bounds guards for curButton and curPath in mapPathStore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:25:49 +08:00
imacat 52dab387dc Add missing return [] in filterAttrs getter when allFilterAttrs is null
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:25:21 +08:00
imacat e6651f27ba Add null guard for valueData in AttributesFilter computed properties
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:12:46 +08:00
imacat 75b3a9c782 Remove unused myPiniaPlugin.ts with debug console.log calls
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:05:08 +08:00
imacat 86e08b7146 Fix .toFixed() string-to-number comparison by wrapping with Number()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:05:01 +08:00
imacat b6499020c6 Add division by zero guards in traceList computed and conformance rate
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:04:51 +08:00
imacat d3bba9d1a2 Add emitter.off cleanup in onBeforeUnmount for 10 components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:04:43 +08:00
imacat b023d28b74 Add array bounds check in compareSubmit before accessing drag data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:04:33 +08:00
imacat 8747421901 Replace toLocaleLowerCase with toLowerCase for ASCII comparisons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:51:46 +08:00
imacat 7e09b21f2e Add fallback for undefined ratio in TraceFilter chart config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:51:45 +08:00
imacat 2349554a26 Track and clear setTimeout in ConformanceSidebar watch on unmount
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:51:44 +08:00
imacat 957f875377 Destroy Chart.js instance on unmount in TimeframesFilter
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:51:43 +08:00
imacat 0f09a723a2 Clean up emitter listeners and destroy Cytoscape instance on unmount
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:51:41 +08:00
imacat e5ddd8c0bd Remove unnecessary try-catch re-throw in refreshToken
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:23:34 +08:00
imacat 904749d1fa Remove duplicate sidebarState assignments in sidebar watchers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:23:33 +08:00
imacat 2e914aa853 Fix setTimeout losing this context by using arrow function
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:23:32 +08:00
imacat 08d7402918 Add null guards for getElementById and uploadDetail in UploadPage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:23:31 +08:00
imacat 3ad898aaab Add null coalescing for facets and attributes access in MoreModal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:17 +08:00
imacat d546cc9619 Add optional chaining for i.loc array access in uploadFailedSecond
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:16 +08:00
imacat b10fcc057e Add null guard for querySelector and fix days using raw input value
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:15 +08:00
imacat b3e5554133 Add optional chaining for response.data.log.id access in getFilterDetail
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:13 +08:00
imacat 91c6f5e54c Add optional chaining for response.data.roles access in getUserDetail
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:12 +08:00
imacat 4c2a79a514 Add null guards for querySelector results and division by zero in AttributesFilter
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:11 +08:00
imacat 008339a23d Fix computed ref passed without .value to setCurrentGraphId
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:10:09 +08:00
imacat 01385d798d Return null for unknown type in getStateData to prevent empty URL request
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:29 +08:00
imacat 5bb89a631d Add early return in yTimeRange when yAmount <= 1 to prevent division by zero
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:29 +08:00
imacat 14c112cec5 Add bounds checks in highlightClickedPath to prevent undefined access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:27 +08:00
imacat a6d32672bc Add array length guard in TimeframesFilter timeFrameData computed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:26 +08:00
imacat 89dc327044 Add empty data guard in MoreModal columnData computed property
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:25 +08:00
imacat f5ade65939 Fix 12-hour format (hh) to 24-hour format (HH) in PerformancePage charts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:23 +08:00
imacat 07b28c628d Add bounds checks and fix 12-hour format in CompareDashboard chart functions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:31:22 +08:00
imacat 9a3d19f53c Replace Math.trunc integer check with Number.isInteger
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:22 +08:00
imacat 57214586a8 Return empty string instead of undefined from getFileName on not-found
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:21 +08:00
imacat a7e3a2cdce Remove dead v-show=false error block from MyAccount
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:20 +08:00
imacat b46ab4112a Fix falsy check on newUsername to use explicit null comparison
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:13 +08:00
imacat 210364a255 Reset infiniteFinish flag on error in MoreModal fetchData
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:12 +08:00
imacat adbb90eeea Fix division by zero in timeRange when amount is 1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:05 +08:00
imacat 8a4b6539b9 Add bounds check in highlightMostFrequentPath before array access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:20:05 +08:00
imacat 4f660ff08c Add optional chaining for file.parent access across 5 files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:19:50 +08:00
imacat a8984a5de5 Add optional chaining for file.parent access in ConformancePage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:39 +08:00
imacat 7bf38b0d07 Add error handling to async calls in AcctMenu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:37 +08:00
imacat 387993da92 Add response structure validation in auth token refresh
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:36 +08:00
imacat b5dfae9835 Fix unsafe property access and stale await in DurationInput, ModalAccountInfo, FilesPage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:35 +08:00
imacat 5f597961c6 Fix cytoscapeStore: preserve positions, guard access, remove redundant write
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:27 +08:00
imacat 8e6ba876e3 Fix null from match() on empty string in formatNumberWithCommas
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:26 +08:00
imacat 36613d255b Guard setCurrentViewingUser against undefined from find()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:24 +08:00
imacat 1ac3d7cd5b Fix sort() mutating state in getter by copying array first
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:18 +08:00
imacat 63fa11c44e Wrap localStorage JSON.parse in try-catch in cytoscapeMap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:17 +08:00
imacat 2a2eeabac7 Fix XSS in uploadFailedSecond default case with escapeHtml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:16 +08:00
imacat b58659295b Fix null from match() crash in formatMaxTwo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:14 +08:00
imacat c6d073e119 Fix getYTicksByIndex truncating integers by using toFixed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:09 +08:00
imacat 4dbed9fe56 Fix .trim() on null in conformance cases getter and add fallback returns
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:10:08 +08:00
imacat 19a39bbbff Clean up dead code, typos, and minor style issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:00:31 +08:00
imacat 932275e4d4 Remove abandoned confirm-password feature hidden with v-show=false
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:00:26 +08:00
imacat 69d31c6c8b Remove dead refs and empty focus handlers from LoginPage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:00:24 +08:00
imacat 2710910829 Remove dead imports and constants from mapCompareStore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:00:19 +08:00
imacat 6141e70235 Fix missing bounds checks, unsafe JSON.parse, and cleanup issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:56:47 +08:00
imacat 48784010ad Fix chart data issues: 24-hour format, Y-axis bounds, rounding modes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:55:45 +08:00
imacat 881dccc1ab Fix memory leaks from Tippy.js instances and unremoved event listeners
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:54:38 +08:00
imacat 9acd722929 Fix splice(-1,1) removing last user when logged-in user not found
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:52:08 +08:00
imacat 3db725e52c Fix static destructuring from reactive source in MyAccount and ModalAccountInfo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:51:23 +08:00
imacat 8f610f1244 Fix array destructuring bug in moveJustCreateUserToFirstRow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:50:18 +08:00
imacat ac4405068f Fix HTML injection risks in FilesPage and UploadPage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:48:23 +08:00
imacat ca75a06612 Update .gitignore 2026-03-09 13:19:16 +08:00
imacat 89fae2cda7 Update MainContainer module documentation to match current route-guard responsibilities
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:41:46 +08:00
imacat 6e3aaca3b1 Extract reusable auth guard decision logic and test router auth behavior against it
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:39:10 +08:00
imacat 28fd83242c Use UTF-8 safe return-to encoding and decoding across router and login
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:35:40 +08:00
imacat 28464214bc Remove refreshToken navigation side effects and let callers handle redirects
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:32:06 +08:00
imacat 1670054356 Clear all auth cookies when API token refresh fails before redirecting to login
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:29:04 +08:00
imacat b53f58cb0c Clear refresh token cookie during logout to enforce full session termination
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:25:53 +08:00
imacat cf45a43a37 Remove obsolete uncaught-exception policy helper and its unit test
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:16:50 +08:00
imacat 955e9ceda9 Move auth-entry checks to router guard and simplify MainContainer route logic
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:14:20 +08:00
imacat f3d11ebbcb Refactor MainContainer child routes to consistent relative-path nesting
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:10:52 +08:00
imacat b3f4ace13f Enforce requiresAuth routes in global router guard with login return-to redirects
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:07:56 +08:00
imacat 90cc6689c8 Guard Vite API proxy setup behind VUE_APP_API_URL and reuse it in preview
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:04:13 +08:00
imacat a8cd590a11 Require access token presence in MainContainer auth gate before route entry
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 19:01:03 +08:00
imacat 0948a82eb5 Align compare navbar state mapping with MAP and PERFORMANCE tabs
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 18:58:01 +08:00
imacat f567e86898 Remove global Cypress uncaught-exception handler to keep default fail-fast behavior
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 18:46:09 +08:00
imacat 7d368bf0c3 Remove per-spec uncaught-exception swallowing in Cypress E2E tests
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 18:32:48 +08:00
imacat 7309c97502 Remove redundant self-assignment watcher in navbar state
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 14:14:11 +08:00
imacat 2927037bbe Separate lint check and auto-fix scripts to avoid side effects
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 13:55:33 +08:00
imacat 2721aed928 Handle invalid return-to payloads without misclassifying login as failed
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 13:52:47 +08:00
imacat d5464ebc2d Restrict Cypress uncaught exception suppression to known benign errors
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 13:49:51 +08:00
imacat fc43ca67ca Rename single-word Vue files to multi-word names and update references
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 13:26:12 +08:00
imacat ae03b9cedd Enable multi-word Vue component names with explicit naming
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 13:01:16 +08:00
imacat d03041c2e3 Enable vue/no-side-effects-in-computed-properties and refactor computed state sync
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:45:39 +08:00
imacat c88646eba3 Enable vue/return-in-computed-property and add explicit fallback returns
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:39:11 +08:00
imacat 1bf8355092 Enable vue/no-unused-vars and fix template loop variable
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:34:27 +08:00
imacat 2a2948fd24 Re-enable key Vue lint rules and fix resulting violations
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:30:17 +08:00
imacat 52a36e3a7c Resolve remaining lint violations and stabilize ESLint config
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:24:45 +08:00
imacat 847904c49b Apply repository-wide ESLint auto-fix formatting pass
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 12:11:57 +08:00
imacat 7c48faaa3d Translate Cypress support comments and add command JSDoc
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 11:57:58 +08:00
imacat ef9cf2de8c Migrate router type augmentation to Vue 3 runtime core
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 11:55:06 +08:00
imacat 28c861ab0e Align Cypress base URL and redirect test port
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 11:52:34 +08:00
imacat 08c1adba37 Fix unit test script to run repository test suite
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 11:50:00 +08:00
imacat 1ad94358e4 Remove unsupported ignore-path option from lint script
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 11:47:28 +08:00
imacat d7caf08d1f Fix design file metadata mapping in files store
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 10:47:49 +08:00
imacat 8acb1b50de Persist relative return-to path for post-login redirect
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 10:44:53 +08:00
imacat e275e79a63 Sanitize Cytoscape tooltip labels to prevent XSS
Co-Authored-By: Codex <codex@openai.com>
2026-03-08 10:41:48 +08:00
imacat 1d621bf304 Translate all Chinese comments and strings to English
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:03:19 +08:00
imacat 7d5918837b Add try-catch to async IIFEs to prevent unhandled rejections
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 18:11:27 +08:00
imacat ede7becb3a Remove await on non-promise values
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 18:06:29 +08:00
imacat 1b5f97dc9a Remove unnecessary persist:true from acctMgmt store
The store only holds transient data (user list refetched from API,
hover/menu UI states) that should not survive page reload.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:58:39 +08:00
imacat 07a2518e76 Remove unused $moment and $emitter from globalProperties
These were set for Options API (this.$moment, this.$emitter) but all
components now use <script setup> with direct imports.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:53:00 +08:00
imacat 5b3130ea9c Compute refresh token expiry fresh on each sign-in
The expiry date was computed once at store init time and went stale
in long-running SPA sessions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:49:14 +08:00
imacat ba7c1c7cd0 Rename allUserAccoutList to allUserAccountList (fix typo)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:43:12 +08:00
imacat fe4738b04c Add encodeURIComponent for username in API URL paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 16:58:30 +08:00
imacat 984eaa96b7 Remove duplicate getUserData call in moveCurrentLoginUserToFirstRow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 09:25:10 +08:00
imacat 9a8b45b151 Deduplicate refreshToken by delegating to auth.js refreshTokenAndGetNew
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 09:21:25 +08:00
imacat cd71815c97 Remove artificial delay from apiError, show toast immediately
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:59:52 +08:00
imacat 589783d481 Fix typos in error messages, constants, and UI labels
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:55:33 +08:00
imacat 3693446d1b Add event listener cleanup to prevent memory leaks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:50:19 +08:00
imacat b2b00c4542 Add optional chaining for querySelector result in Files.vue
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:45:27 +08:00
imacat 564ead23bf Add null guard for performanceData before accessing time properties
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:45:06 +08:00
imacat ac00183096 Initialize nodePositions structure before nested access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:44:54 +08:00
imacat c602848ad7 Add null check before tip.hide() on mouseout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:44:42 +08:00
imacat 5058400d72 Fix filterTaskData computed property referencing itself
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:39:14 +08:00
imacat ac9f958bef Remove meaningless return statements inside forEach callbacks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:27:12 +08:00
imacat d7df6a2615 Fix setTimeChartData called with yMax twice instead of yMax and yMin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:26:58 +08:00
imacat eea79c852b Fix open redirect vulnerability in return-to URL after login
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 08:13:12 +08:00
imacat ddab7b3fe9 Add missing path=/ to setCookieWithoutExpiration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:59:40 +08:00
imacat 2a4aa9db00 Add optional chaining to error.response.status in catch blocks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:55:49 +08:00
imacat eeea16be38 Fix getters mutating state on repeated access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:31:59 +08:00
imacat ef8ce0d778 Fix showCancelButton using string instead of boolean in renameModal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:23:45 +08:00
imacat 4b7c08e2f9 Fix moment format using month token MM instead of minute mm
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:17:09 +08:00
imacat 3f1f8fb680 Fix BaseInfiniteFirstCases getter using wrong case for state property
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:10:26 +08:00
imacat 702d508d37 Fix incorrect hour/minute calculation in simpleTimeLabel()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 07:05:41 +08:00
imacat f4fbae8a5c Extract duplicate API path logic into helper function in allMapData store
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 21:22:19 +08:00
imacat ec0035a182 Extract duplicate API path logic into helper functions in conformance and files stores
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 21:16:26 +08:00
imacat c3d0add548 Rename createAccont.cy.js to createAccount.cy.js to fix typo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 21:09:18 +08:00
imacat d7db387edf Clean up i18n: translate 404 page Chinese text and remove placeholder German locale
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 21:02:33 +08:00
imacat 8d358516b8 Translate remaining Chinese JSDoc and CSS comments to English
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 20:53:00 +08:00
imacat d16cc46604 Delete yarn.lock 2026-03-06 20:09:02 +08:00
imacat c782a3b079 Add file header and VITE_CACHE_DIR to .env
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 19:47:47 +08:00
imacat 9c6a51029b Support VITE_CACHE_DIR environment variable for custom cache directory
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 19:40:18 +08:00
imacat 7fec6cb63f Add JSDoc documentation and file headers to all source files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 18:57:58 +08:00
imacat 3b7b6ae859 Migrate all Vue components from Options API to <script setup>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 18:57:58 +08:00
imacat a619be7881 Convert all store files from JavaScript to TypeScript
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 14:47:57 +08:00
imacat 90048d0505 Standardize store exports to named useXxxStore convention
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 13:25:00 +08:00
imacat 147b16ca34 Add centralized API client with axios interceptors, remove vue-axios
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:44:33 +08:00
imacat 6af7253d08 Upgrade vue-router from 4 to 5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:17:06 +08:00
imacat 1f5673040f Upgrade ESLint from 9 to 10 and add @eslint/js as explicit dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:12:00 +08:00
imacat ab8bbb086b Upgrade @types/node from 20 to 25 and chartjs-plugin-dragdata from 1 to 2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:01:39 +08:00
imacat ec61bcd701 Fix E2E tests for PrimeVue 4 CSS class rename (p-dropdown to p-select)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:47:25 +08:00
imacat 8e480ed669 Upgrade Vitest from 3 to 4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:39:17 +08:00
imacat a950f254ad Upgrade Vite from 6 to 7 and @vitejs/plugin-vue from 5 to 6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:35:01 +08:00
imacat 4e22643999 Upgrade Tailwind CSS from 3 to 4 with CSS-first config migration
Migrate tailwind.config.js to @theme in CSS, replace PostCSS plugins
with @tailwindcss/postcss, add @reference to 12 Vue scoped styles using
@apply, and remove autoprefixer (now built into Tailwind 4).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:29:03 +08:00
imacat 08688793ac Upgrade Pinia from 2 to 3 and pinia-plugin-persistedstate from 3 to 4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:17:13 +08:00
imacat 941f1e1dbe Upgrade ESLint from 8 to 9 with flat config migration
Replace .eslintrc.cjs with eslint.config.mjs, upgrade eslint-plugin-vue
to 10, eslint-plugin-cypress to 6, @vue/eslint-config-prettier to 10,
and remove @rushstack/eslint-patch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:12:17 +08:00
imacat de92a723a2 Upgrade Cypress from 13 to 15
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:03:23 +08:00
imacat f958efb38b Upgrade i18next from 23 to 25 and cytoscape-popper from 2 to 4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:53:09 +08:00
imacat c182b297c9 Upgrade Prettier from 2 to 3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:41:27 +08:00
imacat e656b3ce99 Upgrade vue-router, vue-toast-notification, @types/node, and eslint-plugin-cypress
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:36:42 +08:00
imacat b988037968 Remove incorrect @types/vue and @types/vue-router Vue 2 type packages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:36:01 +08:00
imacat bcb318b8f6 Upgrade jsdom from 20 to 28 and eslint-plugin-vue to 9.33
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:35:27 +08:00
imacat 85225c1e30 Upgrade PrimeVue from 3 to 4 with Aura theme preset
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:32:34 +08:00
imacat 1d047786af Upgrade Tailwind CSS from 3.2 to 3.4 (4.x deferred due to breaking config changes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:16:41 +08:00
imacat d30b31091f Upgrade Vitest from 0.25 to 3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:13:32 +08:00
imacat eaf2a1d2e7 Upgrade Vite from 4 to 6 and @vitejs/plugin-vue from 4 to 5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:12:53 +08:00
imacat 9ea9752440 Upgrade Cypress from 12 to 13
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:11:46 +08:00
imacat 735df448a2 Upgrade minor and patch dependencies (axios, chart.js, cytoscape, typescript, sass, etc.)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:09:12 +08:00
imacat aa86d4a3f9 Upgrade Pinia from 2.0 to 2.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:06:09 +08:00
imacat 3521593f41 Upgrade Vue from 3.2 to 3.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:05:39 +08:00
imacat 5d6d6310be Remove unused PrimeVue PickList and Button global registrations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:58:46 +08:00
imacat b259f23799 Replace date-fns with chartjs-adapter-moment to eliminate duplicate date libraries
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:51:13 +08:00
imacat 1d0d938193 Replace let with const where variable is never reassigned in Vue files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:38:40 +08:00
imacat 64372c7043 Replace loose equality (== null, != null) with strict equality
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:22:36 +08:00
imacat 3eec131ae0 Fix typos: createfilterId, sidevarFilterRef, selecteName, namber
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:15:35 +08:00
imacat 802a5e51fd Replace let with const where variable is never reassigned
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:57:36 +08:00
imacat 04841d84f2 Remove dead code and incorrect unused comments
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:54:51 +08:00
imacat 523515459b Remove .ts extension from import paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:50:01 +08:00
imacat dfd5706bcf Replace .map() with .forEach() where return value is unused
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:46:01 +08:00
imacat 79811435de Fix typos: updataFilter, updataConformance, setPrevioiusPage, reallyDeldet, tooken, pageAdimin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:43:09 +08:00
imacat 6cb08df2e4 Remove npx, i, and npm packages that should not be in dependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:36:30 +08:00
imacat 12c06e9eee Remove duplicate autoprefixer, postcss, tailwindcss from dependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:35:53 +08:00
imacat ee920c0806 Move vue-router from devDependencies to dependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:35:20 +08:00
imacat 6dbef06124 Remove html-webpack-plugin from devDependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:31:41 +08:00
imacat 3763b36e62 Remove webpack-env type reference from tsconfig.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:29:30 +08:00
imacat ffa45e2f07 Fix Vite config: replace Webpack devServer with Vite server, remove invalid envDir and transpileDependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:28:46 +08:00
imacat b07f1274e8 Fix TypeScript errors: missing closing brace in vue.d.ts and undefined NodePosition type
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:19:21 +08:00
imacat bd2b4ce5db Fix CYTOSCAPE_NODE_POSTITION typo to CYTOSCAPE_NODE_POSITION
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:18:54 +08:00
imacat 2fb88e8458 Fix Navbar route name typos 'Performanc' to 'Performance'
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:18:36 +08:00
imacat c7aa32ef6d Guard baseResponse.data access when baseLogId is falsy in getAllTrace
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:14:07 +08:00
imacat 833427b224 Fix deleteFile undefined $toast and reversed delete/fetch order
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:09:37 +08:00
imacat 6178f09cfe Fix abbreviateNumber result.trim() return value not assigned back
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:08:43 +08:00
imacat 2141f514c5 Fix pageAdmin setPrevioiusPageUsingActivePage writing to wrong property
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:08:00 +08:00
imacat eac33d4888 Add mapPathStore tests with mock Cytoscape objects
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 08:02:13 +08:00
imacat 9eb8881c57 Fix module-level store init in files.js, apiError.js, cytoscapeMap.js and add files store tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:59:30 +08:00
imacat 5be29ddd51 Add escapeHtml utility and apply to all user-controllable SweetAlert2 html
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:52:26 +08:00
imacat 954b41b555 Add Secure and SameSite=Lax flags to all cookie operations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:51:14 +08:00
imacat 64832bb5f9 Fix router guard broken cookie check to use isLuciaLoggedIn cookie
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:45:04 +08:00
imacat fba2efe21e Fix MainContainer beforeRouteEnter missing try-catch and next() call
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:43:17 +08:00
imacat 2768b5d052 Fix refreshToken() undefined config, wrong axios.defaults, and missing re-throw
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:40:48 +08:00
imacat 43283aab95 Fix expired calculation to be 6 months from now instead of setting to June
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 07:39:52 +08:00
imacat 905f546227 Rewrite old E2E tests to use fixture-based API mocking, eliminating need for real credentials
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 00:31:16 +08:00
imacat dc0a98f819 Remove sensitive data from tracked files before BFG history cleanup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:00:58 +08:00
imacat c91d278f1b Add Files to Discover entry flow E2E tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 22:27:38 +08:00
imacat 6dd182b5e9 Add Discover tab navigation and 404 page E2E tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 21:56:40 +08:00
imacat 584a73b90c Add Discover page E2E tests with real API fixture data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 21:38:20 +08:00
imacat 0ab037dac0 Add edge case tests and SweetAlert2 modal interaction tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 21:06:35 +08:00
imacat 6641bc1f8f Add E2E tests for my-account, account info modal, and compare tab
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:52:38 +08:00
imacat 1a4062487e Add E2E tests for logout, account CRUD, and file operations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:40:46 +08:00
imacat 733bfd7509 Add Cypress E2E tests with fixture-based API mocking for UI regression protection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:10:04 +08:00
imacat 676b70caa0 Add component tests for ModalHeader, IconChecked, and Conformance result components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:45:30 +08:00
imacat fa58e665d5 Add component tests for presentational components and Login
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:32:57 +08:00
imacat 529e9a4aa1 Add store tests with mocked axios and apiError
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:30:33 +08:00
imacat 83c2db7582 Add unit tests for utils and module pure functions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:14:13 +08:00
imacat e596bcd18e Update .gitignore 2026-03-05 18:59:28 +08:00
Cindy Chang 5b3c0050b9 fix: dotted solid edge style bug 2024-09-05 17:49:01 +08:00
Cindy Chang 8635c8d3e2 refine last commit 2024-09-05 14:58:26 +08:00
Cindy Chang 322f05de14 separately save vertical and horizontal node positions 2024-09-05 14:55:14 +08:00
Cindy Chang b467b82474 Merge branch 'main' of github.com:dspim/lucia-frontend 2024-09-03 16:09:59 +08:00
Cindy Chang 11d5109164 basic compare map routing 2024-09-03 15:33:25 +08:00
Cindy Chang 276950a739 Merge branch 'hotfix' 2024-09-03 14:37:47 +08:00
Cindy Chang 364d2a58b4 hotfix: vertical view switching 2024-09-03 14:26:51 +08:00
Cindy Chang d16f7a264e save button effect 2024-09-03 09:27:46 +08:00
Cindy Chang 35c7ac355e fix vertical path bug by not handling TB case 2024-09-02 13:12:12 +08:00
Cindy Chang 7b7b722efb button with border done 2024-08-30 16:59:03 +08:00
Cindy Chang 725cc76ac2 refine default highlight for all six views 2024-08-30 11:16:03 +08:00
Cindy Chang 700b701984 my account page without component button 2024-08-30 09:41:28 +08:00
Cindy Chang 9cf10f5108 my account cancel button added 2024-08-29 16:04:07 +08:00
Cindy Chang 3a44b74bbc responsive name 2024-08-29 14:41:41 +08:00
Cindy Chang 1883818b8b persist installed. MyAccount in progress 2024-08-29 14:19:27 +08:00
Cindy Chang 495fcf7b03 new glowing capsule images 2024-08-29 11:01:12 +08:00
Cindy Chang ad568e57ad self-loop control-point-step-size 2024-08-29 10:33:19 +08:00
Cindy Chang b76c432386 WIP my account page 2024-08-28 15:52:12 +08:00
Cindy Chang 4b56130278 1. highlight last edge. 2. padEnd() to left align capsule label 2024-08-28 14:09:32 +08:00
Cindy Chang f3b9f7cd41 refactor create paths method and highlight path method 2024-08-28 11:46:54 +08:00
Cindy Chang 5164313082 refine "password" layout for both cases 2024-08-28 09:21:14 +08:00
Cindy Chang 63743280f6 fix first index of mapGraphPathToInsight nested object 2024-08-27 16:32:52 +08:00
Cindy Chang 554411ace1 sometimes highlightMostFrequentPath works 2024-08-27 16:03:01 +08:00
Cindy Chang 3f993741c8 default highlight most freq trace 2024-08-27 14:51:26 +08:00
Cindy Chang 56096a01de WIP My Account. 2024-08-27 14:25:20 +08:00
Cindy Chang 49b8233909 fix BPMN multiple selection bug 2024-08-27 11:14:13 +08:00
Cindy Chang b72d87fb52 BPMN view: remove radio buttons 2024-08-27 11:05:07 +08:00
Cindy Chang 09237a0759 MyAccount page prototype 2024-08-27 09:32:06 +08:00
Cindy Chang 7243100d9c refine isConfirmDisabled 2024-08-26 13:59:02 +08:00
Cindy Chang f938eae2fc Merge branch 'acct_mgmt' 2024-08-26 13:54:13 +08:00
Cindy Chang ff8179404b consider the situation when reset section is not open. consider the situation when password is not sent to backend 2024-08-26 13:53:49 +08:00
Cindy Chang 97e01c93fd new version of password edit. Reset button added 2024-08-26 13:40:33 +08:00
Cindy Chang 247a4dbef8 mousedown mouseup eye button 2024-08-26 11:50:13 +08:00
Cindy Chang 26295d5b55 reset map trace button 2024-08-26 09:42:55 +08:00
Cindy Chang b5d5b1456d force-directed layout 2024-08-23 11:19:46 +08:00
Cindy Chang ab15087c2d refine: glow width 2024-08-21 16:38:27 +08:00
Cindy Chang 23a21f1b0a refine nodes 2024-08-21 15:33:55 +08:00
Cindy Chang 85b8536f3a dualonNodeClickHighlightEdges and onEdgeClickHighlightNodes 2024-08-21 15:10:50 +08:00
Cindy Chang c3c2861a8f highlight node and edge 2024-08-21 14:45:59 +08:00
Cindy Chang d56ea98780 highlight path 2024-08-21 14:25:34 +08:00
Cindy Chang 4ab0d4765b WIP: depthFirstSearchMatchTwoPaths can have one true 2024-08-21 12:22:33 +08:00
Cindy Chang fbed897d52 WIP: matchGraphPathWithInsightsPath 2024-08-21 10:00:05 +08:00
Cindy Chang 9b7b382962 WIP: DFS 2024-08-19 17:07:56 +08:00
Cindy Chang 2de9a2b3e6 WIP: createAllPaths 2024-08-19 16:19:12 +08:00
Cindy Chang 27d11997bd insight path blue radio button 2024-08-19 14:29:43 +08:00
Cindy Chang 1191d87f93 WIP: insight path tabs 2024-08-19 13:32:50 +08:00
Cindy Chang 0950214f19 separate cases for text-margin-x 2024-08-19 11:53:14 +08:00
Cindy Chang aebf25a271 WIP: blue overlay edge for cytoscape 2024-08-19 11:16:56 +08:00
Cindy Chang 975b8340b8 fix: #316 cancel and close hover effect 2024-08-16 16:58:13 +08:00
Cindy Chang 6fcd7efbfc WIP: cytoscape edge text can be highlighted 2024-08-16 16:05:00 +08:00
Cindy Chang 3c6644bc63 WIP: #316 close modal 2024-08-16 14:32:30 +08:00
Cindy Chang 9842bf678f fix: #336 add name at info 2024-08-16 13:40:20 +08:00
Cindy Chang fe3c44659c fix: #325 autocomplete="off" 2024-08-16 12:45:35 +08:00
Cindy Chang 2342ed1b8a overwrite primevue style 2024-08-16 11:22:55 +08:00
Cindy Chang 83bcf17364 almost all summary are done 2024-08-16 11:10:20 +08:00
Cindy Chang 43cbfb0529 Map filename added 2024-08-16 10:47:17 +08:00
Cindy Chang 772302d079 fix: use filter to replace find 2024-08-15 14:36:59 +08:00
Cindy Chang 305771ce5a WIP: level capsule. However, one capsule is failed 2024-08-15 14:26:08 +08:00
Cindy Chang 9a7442b4ef WIP: map with transparent default bg 2024-08-15 13:46:33 +08:00
Cindy Chang fb335f996d Map. dagre and spread algorithm 2024-08-15 10:54:04 +08:00
Cindy Chang ffe97ed63f sonar fix 3 issues and now 0 left 2024-08-14 15:45:10 +08:00
Cindy Chang b3049dafe0 delete gamunu.vscode-yarn 2024-08-14 15:41:42 +08:00
Cindy Chang 1dbe7e716f fix: #330 mouseout effect for edit and delete button 2024-08-14 11:31:57 +08:00
Cindy Chang 840d81da9f fix: #333 hover blue. fix: #332 v-if replacing v-show 2024-08-14 11:14:35 +08:00
Cindy Chang 2ec7029887 fix: #319 only allow confirm button when all the fields are filled in 2024-08-14 10:44:04 +08:00
Cindy Chang df341c26ab fix: #329 text ellipsis. Sonar 2024-08-14 09:59:09 +08:00
Cindy Chang 2a188c34ec fix: #332 not sure if vue2 way is really fixing the vue3 way 2024-08-13 16:41:40 +08:00
Cindy Chang 2c0d5fe8ee sonar 1 left. all regex fixed 2024-08-13 13:52:05 +08:00
Cindy Chang db8f8eefd6 sonar 4 left. cookie regex 2024-08-13 13:37:11 +08:00
Cindy Chang 471d8273c1 sonnar 8 left. random number fixed 2024-08-13 13:24:05 +08:00
Cindy Chang 699d7a4f6b sonar 11 left. super-linear fixed 2024-08-13 11:45:01 +08:00
Cindy Chang 1e0796e56e sonar 12 left. XSS on Performance page 2024-08-13 10:44:11 +08:00
Cindy Chang 58646ff91a sonar scanner 14 left. XSS fixed 2024-08-13 10:40:43 +08:00
Cindy Chang 8c58f53d4f sonar security hotspots 2024-08-12 11:30:08 +08:00
Cindy Chang d8c1e84622 fix: #327 add needed await keyword 2024-08-09 16:07:08 +08:00
Cindy Chang 17e51ca98a fix #324 add error message for length < 6 2024-08-09 15:26:57 +08:00
Cindy Chang 6204361b43 SonarQube done 2024-08-09 15:01:05 +08:00
Cindy Chang 6c38ada281 sonar 1 left 2024-08-09 14:54:22 +08:00
Cindy Chang 995b09cc02 sonar 2 left 2024-08-09 14:41:30 +08:00
Cindy Chang 972b92640f fix: #331 add hover effect for self (logged in user) 2024-08-09 14:25:57 +08:00
Cindy Chang 5ef681eea8 fix: #313 fix again. Don't know why sonar-qube causes this 2024-08-09 14:16:28 +08:00
Cindy Chang 62cc0eeb52 Merge branch 'main' into sonar 2024-08-09 13:52:13 +08:00
Cindy Chang 3fc9bb9659 sonar 3 left 2024-08-09 13:49:19 +08:00
Cindy Chang 39096126c5 feature and sonar-qube: add missing delete API 2024-08-09 13:38:36 +08:00
Cindy Chang 3f29ce9acb v-if for AcctMenu 2024-08-09 11:35:56 +08:00
Cindy Chang 3037299fd6 mark ids 2024-08-09 11:28:44 +08:00
Cindy Chang a29f3c6406 fix: #325 move moveCurrentLoginUserToFirstRow to store 2024-08-09 09:45:00 +08:00
Cindy Chang c37e46cff4 WIP #325 2024-08-08 16:37:03 +08:00
Cindy Chang b46a6ab995 sonar 9 left; Resolved as much as possible 2024-08-08 11:40:29 +08:00
Cindy Chang 335b52cc70 sonar 10 left 2024-08-08 10:51:07 +08:00
Cindy Chang e313b92521 sonar 12 left 2024-08-08 10:15:16 +08:00
Cindy Chang 85151884fe sonar 2024-08-08 09:50:41 +08:00
Cindy Chang 8ff8f93b2a sonnar 2024-08-08 09:33:12 +08:00
Cindy Chang 8acd6e4a87 fix: #326 suspended should be !is_active 2024-08-08 09:02:22 +08:00
Cindy Chang 8fa1a7b8b3 #334 fixed v-if=isAdmin 2024-08-07 16:29:15 +08:00
Cindy Chang caa1b9cc70 Merge branch 'sonar' 2024-08-05 09:32:20 +08:00
Cindy Chang 4ba7961a5a sonar 2024-08-02 13:24:15 +08:00
Cindy Chang 86cfb409c3 sonar 41 left 2024-08-02 11:15:15 +08:00
Cindy Chang a33eaa3a41 sonar 58 left 2024-08-01 16:06:30 +08:00
Cindy Chang a426f22db0 sonar medium 65 left 2024-08-01 15:49:03 +08:00
Cindy Chang 405dd7f992 sonar 2024-08-01 15:13:05 +08:00
Cindy Chang 1eda4dfb80 sonar medium 83 left 2024-08-01 13:38:19 +08:00
Cindy Chang e8e8179c05 sonar 2024-08-01 12:52:31 +08:00
Cindy Chang 719501dc4b sonar medium 2024-08-01 11:35:18 +08:00
Cindy Chang 311c98f57f sonar 2024-07-29 14:47:23 +08:00
Cindy Chang 09e38dc3c4 sonar medium 2024-07-29 11:11:00 +08:00
Cindy Chang 2150a4ac79 sonar medium 2024-07-29 10:58:53 +08:00
Cindy Chang 81315167aa sonar medium 2024-07-29 09:27:25 +08:00
Cindy Chang c85ee86f08 sonar medium 2024-07-26 11:39:02 +08:00
Cindy Chang 83c87746e9 sonar low all done 2024-07-26 11:18:52 +08:00
Cindy Chang 47da80b424 sonar low 2024-07-26 11:16:05 +08:00
Cindy Chang a5f271ccc8 sonar low 2024-07-26 10:48:38 +08:00
Cindy Chang 2ca4fdd0c6 sonar low 2024-07-26 10:40:45 +08:00
Cindy Chang 71b58af96d add needed break 2024-07-26 09:51:47 +08:00
Cindy Chang 15805b4dc5 refactor on actRadioData 2024-07-26 09:49:39 +08:00
Cindy Chang 54f0d29c99 refactor ConformanceTimeRrange created 2024-07-22 15:31:46 +08:00
Cindy Chang 5230a3a99b refactor submitConformance 2024-07-22 15:20:31 +08:00
Cindy Chang 28cdf9822d refactor setTaskByCategoryOnRadioEmitting 2024-07-22 14:59:24 +08:00
Cindy Chang 9f48c1d2b0 refactor duration.js 2024-07-22 14:52:52 +08:00
Cindy Chang 486baa6e54 fix: prev refactor 2024-07-22 14:29:13 +08:00
Cindy Chang 3ef1540f8c refactor setChartData - slope calculation 2024-07-22 14:25:38 +08:00
Cindy Chang e5b15957cc sonar qube 2024-07-22 14:14:57 +08:00
Cindy Chang 3c81356fa2 sonar qube 2024-07-22 13:58:23 +08:00
Cindy Chang adcdb2bdc0 refactor NavBar.vue 2024-07-22 13:52:48 +08:00
Cindy Chang 258a25972a reduce cognitive complexity at ConformanceSidebar.vue 2024-07-22 13:36:19 +08:00
Cindy Chang 5407a4e2aa sonar 2024-07-22 13:20:19 +08:00
Cindy Chang 56c94f1d80 sonarqube 2024-07-22 11:16:16 +08:00
Cindy Chang 07d6e75a6a sonar qube; ternary if 2024-07-16 15:42:30 +08:00
Cindy Chang 6a689e419c sonar qube; getCookie refactored 2024-07-16 15:18:31 +08:00
Cindy Chang fd5b65a3b6 sonar qube 2024-07-16 13:46:30 +08:00
Cindy Chang d2e92b367f sonar qube - 'If' statement should not be the only statement in 'else' block 2024-07-16 13:20:04 +08:00
Cindy Chang 3f5f710336 WIP: sonar qube 2024-07-16 09:25:34 +08:00
Cindy Chang 1836ef5fbf fix: sonar qube 2024-07-16 09:16:15 +08:00
Cindy Chang 2517fb07af fix: sonar qube - Add an "alt" attribute to this image. 2024-07-16 09:11:13 +08:00
Cindy Chang f6c130f46d fix: sonar qube - Add an "alt" attribute to this image. 2024-07-16 09:07:27 +08:00
Cindy Chang d0a433754a fix: sonar qube - Multiline support is limited to browsers supporting ES5 only. 2024-07-16 09:05:30 +08:00
Cindy Chang 01555d71b0 fix: #318 enable confirm button when newPwd or newConfirmPwd is changed 2024-07-15 15:44:40 +08:00
Cindy Chang cab484ac00 fix: acct_mgmt_button 2024-07-15 15:39:59 +08:00
Cindy Chang 4c9633a395 Revert "fix: #316 modal closing too slow bug"
This reverts commit 6b7778fe9f.
2024-07-10 11:06:07 +08:00
Cindy Chang 6b7778fe9f fixed: modal closing too slow bug 2024-07-10 10:58:38 +08:00
Cindy Chang bba7f24672 fix: #319 add watch of inputConfirmPwd inside onMounted 2024-07-10 10:53:48 +08:00
Cindy Chang b70f241ab5 save 2024-07-10 10:39:15 +08:00
Cindy 0d9bfaa40d refine close modal time 2024-07-10 10:26:42 +08:00
Cindy 423499b77c fixed: #319 put watch of all input fieds function inside "onMounted" function 2024-07-10 10:18:30 +08:00
Cindy 58cfd3f31f test add local develop environment 2024-07-10 09:45:15 +08:00
Cindy Chang 74bc22b736 fixed: #313 use index [ ] instead of splice function to prevent removal 2024-07-09 15:08:55 +08:00
Cindy Chang a2703bef6e app.$http = axios; Can LOGIN now 2024-07-09 14:53:21 +08:00
Cindy Chang 8b99a230d7 TypeScript bugs fixed 2024-07-09 13:53:20 +08:00
Cindy Chang 5c46fd6ce7 WIP: TypeScript bugs 2024-07-09 13:46:15 +08:00
Cindy Chang af5ab081de 1. npm install --save-dev @types/axios @types/vue @types/vue-router
2. create file vue-router.d.ts
2. pinia use my plugin
3. npm i --save-dev @types/cytoscape. npm i --save-dev @types/cytoscape-dagre. npm i --save-dev @types/cytoscape-popper.
4. add apiError.d.ts npm install --save-dev @types/vue-router.
5. add vue-axios.d.ts
2024-07-09 12:00:34 +08:00
Cindy Chang ca4d6d0127 change account-admin url 2024-07-04 15:21:07 +08:00
Cindy Chang 19f7ae5f38 delete console 2024-07-04 11:15:32 +08:00
Cindy Chang fc37d5d37d delete console 2024-07-04 11:09:41 +08:00
Cindy Chang d8d70f01f3 fix: #310 keep loading animation bug is related to cytoscape undefined bug. And cytoscape node position remembering feature is not actually finished correctly yet before. Now remembering feature is done. 2024-07-04 11:07:25 +08:00
Cindy Chang 8a77df285b feature: keypress of search bar 2024-07-03 15:42:09 +08:00
Cindy Chang 7f1efba2b3 fix: need to intentionally click sort button when Cypress editAccount. Change "visible" to "exist". 2024-07-03 15:28:13 +08:00
Cindy Chang 880cac23a4 Cypress: edit account and see success message 2024-07-03 14:57:46 +08:00
Cindy Chang 6e39f8be99 Cypress: account duplication check 2024-07-03 14:19:07 +08:00
Cindy Chang ba6450d4a0 Cypress: confirm password message 2024-07-03 14:06:05 +08:00
Cindy Chang 405cc6ea82 Cypress: delete an account 000000 2024-07-03 13:55:49 +08:00
Cindy Chang b6fa0b375c acctMgmt.ts by ChatGPT 2024-07-03 13:15:38 +08:00
Cindy Chang 1991b4df63 feature: TypeScript 2024-07-03 12:08:16 +08:00
Cindy Chang ba4f70213d fix: file name of cypress file 2024-07-03 11:41:51 +08:00
Cindy Chang 18959f213b automation test: create account positive case. 2024-07-02 12:16:23 +08:00
Cindy Chang c33f387c82 refine confirm disable status of account page 2024-07-02 11:09:31 +08:00
Cindy Chang da557fdd32 fix: use push instead of wrong ... operator 2024-07-01 10:41:53 +08:00
Cindy Chang 24ccdd47ae feature: remember node positions after refreshing pages 2024-07-01 10:39:53 +08:00
Cindy Chang 69a3f27cb2 fix: #306. At MainContainer, use cookie to determine instead of using pinia state 2024-07-01 08:52:38 +08:00
Cindy Chang 2a8826c962 hide account 2024-06-28 16:45:19 +08:00
Cindy Chang 2110388a2d feature: cytoscape node positions are remembered 2024-06-28 16:20:41 +08:00
Cindy Chang b890df9de6 Merge branch 'acct_mgmt' of github.com:dspim/lucia-frontend into acct_mgmt 2024-06-28 13:54:02 +08:00
Cindy Chang 8054bf89cd fix: #178. refresh token. if not logged in then refresh token; else redirect to login page. 2024-06-28 13:53:47 +08:00
Cindy Chang a4aab21b98 feature: refresh token. if not logged in then refresh token; else redirect to login page. 2024-06-28 12:10:19 +08:00
Cindy Chang 9b2bab9124 feature: admin role edit API 2024-06-27 14:21:27 +08:00
Cindy Chang 65fdb2a945 fix: #258 YYYY/MM/DD 2024-06-27 13:48:57 +08:00
Cindy Chang 4418930d41 fix: #258. format precision YYYYMMDD 2024-06-27 13:45:16 +08:00
Cindy Chang 3fe427fcc3 update single account pinia state 2024-06-27 11:39:44 +08:00
Cindy Chang 21fb6f616a feature: set is active API 2024-06-27 10:36:19 +08:00
Cindy Chang b12d026f0e editable status control 2024-06-27 08:58:40 +08:00
Cindy Chang b2c084657d edit account and logout feature 2024-06-26 15:35:51 +08:00
Cindy Chang 14783654a5 feature: search bar works. Beautiful two return code. 2024-06-26 12:40:49 +08:00
Cindy Chang 965aaeb097 feature: just create badge. Important thing is the await keyword 2024-06-26 11:46:53 +08:00
Cindy Chang 353eecad81 refine infinite scroll - infiniteStart is a ref variable and infiniteAcctData is a computed one. 2024-06-25 16:28:36 +08:00
Cindy Chang 877c6acfb1 fix: #216. setHighlightedNavItemOnLanding 2024-06-25 15:00:11 +08:00
Cindy Chang 5d5730fc29 visit API, is_admin badge API, is_active badge API, 2024-06-25 12:53:50 +08:00
Cindy Chang 6d11849dae duplicate account check 2024-06-25 12:08:53 +08:00
Cindy Chang 38b268e8c5 Merge branch 'main' into acct_mgmt 2024-06-25 09:04:22 +08:00
Cindy Chang 963645f071 fix: performance page linechart tooltip time display with time unit 2024-06-25 09:03:18 +08:00
Cindy Chang 00d086ff1d delete account and later on modal closing effect. 2024-06-24 10:09:39 +08:00
Cindy Chang b55cc0a6d6 vue3 infinite scroll 2024-06-24 09:07:11 +08:00
Cindy Chang 9b0d54bf5e feature: create POST api done. 2024-06-21 15:21:24 +08:00
Cindy Chang 0fb0d8b529 WIP: delete alert modal prototype. 2024-06-21 14:20:52 +08:00
Cindy Chang ad8c555632 feature: acct list can hover pencil btn 2024-06-21 13:17:24 +08:00
Cindy Chang 1b8c8629a9 WIP: can hover icon-delete. can have self on the first row on list.
API get all users done
2024-06-21 11:14:49 +08:00
Cindy Chang 193bc315ca WIP: create feature checkboxes layout 2024-06-20 16:54:37 +08:00
Cindy Chang 05caf819bb WIP: validate confirm password and show error message 2024-06-20 15:54:14 +08:00
Cindy Chang 26441d3979 WIP: account info modal prototype with a little bit of pinia state mgmt. 2024-06-20 12:13:39 +08:00
Cindy Chang d6a79687da WIP: account edit modal layout done (now: without password rows) 2024-06-20 10:56:03 +08:00
Cindy Chang b7862ab164 WIP account mgmt data-table prototype and modal prototype. 2024-06-19 15:55:02 +08:00
Cindy Chang 50c98892c4 fix: #304. Compare page, shift digit of percentage value 2024-06-19 13:36:16 +08:00
Cindy Chang 69835ad05b WIP: acct mgmt search bar and data grid header. 2024-06-19 11:35:16 +08:00
Cindy Chang 96ee2eb7fb fix: #303 of cycle eff tooltip. Change background chart grid lines. 2024-06-19 11:00:03 +08:00
Cindy Chang b10e135fee fix: make legend disappear by not declaring plugins twice 2024-06-19 10:21:15 +08:00
Cindy Chang 80529b85fe WIP: acct mgmt search bar 2024-06-19 10:12:16 +08:00
Cindy Chang 341fd61d07 WIP: account management menu can be toggled by head button now. 2024-06-18 16:38:02 +08:00
Cindy Chang 5d33b6481c fix: #299 Cycle efficiency X axis should only display to YYYYMM. 2024-06-18 10:47:58 +08:00
Cindy Chang adb2ab29af refine use ticks[ticks.length - 1].value 2024-06-18 09:52:43 +08:00
Cindy Chang 6c9322d1bc fix: #258 2024-06-18 09:25:13 +08:00
Cindy Chang 94dbe1dee6 WIP: #258 Compare page 2024-06-18 09:12:18 +08:00
Cindy Chang 9b88de4c3f fix: #302. Shouldn't use mod and shouldn't double divide. 2024-06-17 23:03:46 +08:00
Cindy Chang cee61dbd93 fix: #287 Compare page 2024-06-17 22:46:32 +08:00
Cindy Chang 7750f913a8 ticks.length solves the Y axis bug. 2024-06-17 22:32:57 +08:00
Cindy Chang 541c0080aa import moment and declare primevue option 2024-06-17 21:51:19 +08:00
Cindy Chang 9f121eb5d4 WIP: explicit declare primevue option of one of the chart and the bug is somewhat solved 2024-06-17 21:31:41 +08:00
Cindy Chang 3ce17fc436 clean console 2024-06-17 20:54:00 +08:00
Cindy Chang 4c18dfd8d6 shouldn't use mod(%) operator.
shouldn't divide hour and then divide day again.
should use substring.
should split into 8 instead of 6.
2024-06-17 20:53:49 +08:00
Cindy Chang 452c9358c9 should not be ms but s 2024-06-17 11:34:13 +08:00
Cindy Chang 03806dad3c fix: #290 fileInput.value = '' 2024-06-17 11:12:28 +08:00
Cindy Chang 1665e51301 fix #296 "DASHBOARD" --> "PERFORMANCE" 2024-06-17 09:36:45 +08:00
Cindy Chang 505aebebb0 fix #292 remove "i" icon 2024-06-17 09:34:12 +08:00
Cindy Chang 3edac09881 fix #289 locale 2024-06-17 09:26:06 +08:00
Cindy Chang d0d6c482ee fix #216 with cookie mgmt. 2024-06-14 16:44:17 +08:00
Cindy Chang 5bf98a1b74 WIP #216. The timing is not good. After user password is confirmed, the isLoggedIn boolean is still false, and thus causing the website to stay at the login page 2024-06-14 16:17:20 +08:00
Cindy Chang 8d34b80b5c fix #299 by setting y.reverse 2024-06-14 15:01:12 +08:00
Cindy Chang 8c09e8ae40 fix #258 reopen data_with_log_小兒(日) 2024-06-14 14:00:29 +08:00
Cindy Chang d47b17f575 fix #301 should push to "/files" 2024-06-14 11:30:43 +08:00
Cindy Chang 13bc3882ed fix #300 handle compare page by handling data[0], data[1] 2024-06-14 10:57:31 +08:00
Cindy Chang 0689e79013 WIP #300 Performance page done. Use ref() instead of reactive() in independant Vue3 component. 2024-06-13 15:40:51 +08:00
Cindy Chang f6989c4759 WIP same as the previoius commit. Tried to extract out an independent vue component to prevent shared primevue option.
X axis is with bug now.
2024-06-13 13:35:58 +08:00
Cindy Chang 310c416fd7 WIP #300 Tried to extract out an independent vue component to prevent shared primevue option 2024-06-13 09:48:19 +08:00
Cindy Chang c016e2aa41 WIP about deep cloning and Y axis and object sharing bug 2024-06-12 16:06:17 +08:00
Cindy Chang 339657879a fix #287 by using simple division 2024-06-12 12:27:51 +08:00
Cindy Chang 235504a3fb fix #293. stay at MAP page. Remove calling of copyPending....... 2024-06-12 10:43:48 +08:00
Cindy Chang d117adf54e fix #287, 261 by removing Math.floor() 2024-06-12 09:05:46 +08:00
Cindy Chang f1cabe2035 fix: #294 by adding next param 2024-06-11 16:01:29 +08:00
Cindy Chang ba418abbef minor fix of typo 2024-06-11 15:31:12 +08:00
Cindy Chang 82fe104291 WIP #216. QA mentioned that bugs remained, so we keep working on it. 2024-06-11 13:55:00 +08:00
Cindy Chang 314670eafd fix #216. Add base5
encode. Also add cypress.
2024-06-11 12:23:17 +08:00
Cindy Chang aa1dbfabf2 #216 done by using return-to URL mechanism 2024-06-11 11:57:33 +08:00
Cindy Chang 444b7d6975 WIP: not sure what is aaa and bbb meaning in /rule/log/aaa/conformance/bbb 2024-06-11 09:15:16 +08:00
Cindy Chang d6cb329a5c fix #258. Compare page and Performance pages are featured with formatted x ticks.
The author supposes this issue is not a bug but a feature.
2024-06-07 15:55:51 +08:00
Cindy Chang 7e362d8740 fix #217; this time finally found the root cause.
If user didn't click any start-end radio button this time,
the start, end value might be null as their initial values are.
So we need to use the earliest value stored in pinia. (In ActRadio.vue created phase)
2024-06-07 15:31:53 +08:00
Cindy Chang 88082c3b8a #217 fix. The bug is solved without finding root cause. Maybe it's just because the author force the website to print out the variable (this.selectCfmPtPSEStart) 2024-06-07 11:56:41 +08:00
Cindy Chang e16304df45 WIP #217 don't know why it seems to work though 2024-06-07 11:39:53 +08:00
Cindy Chang fc99bac449 WIP customizing x tick according to time difference 2024-06-07 10:37:28 +08:00
Cindy Chang 92160fab54 typo fix 2024-06-07 08:55:39 +08:00
Cindy Chang 29675af82b add setTimeStringFormatBaseOnTimeDifference 2024-06-07 08:54:21 +08:00
Cindy Chang c0c455c55c refine performance code layout 2024-06-06 15:16:43 +08:00
Cindy Chang 9539237c3d refactor (slight, although many files) 2024-06-06 09:25:26 +08:00
Cindy Chang 0df045c218 fix #294 by handling navItem string with function mapPageNameToCapitalUnifiedName() 2024-06-05 14:42:24 +08:00
Cindy Chang 5f0e12ef1a pageAdmin add setActivePageComputedByRoute function 2024-06-05 13:08:52 +08:00
Cindy Chang 427b9b6aed refactor: rename isSubmit --> isAlreadySubmit 2024-06-05 11:05:55 +08:00
Cindy Chang 205b75450c refactor conformance related code 2024-06-05 10:50:37 +08:00
Cindy Chang 499ad33d57 locale of Conformance page 2024-06-05 09:46:20 +08:00
Cindy Chang e2d420b4bd add unused getYAxisTickMark(); this is written by ChatGPT 2024-06-05 09:04:23 +08:00
Cindy Chang 5418a6e7c0 solving toUpperCase bug 2024-06-04 09:17:55 +08:00
Cindy Chang 265680ae45 WIP: refactoring Compare page 2024-06-03 16:48:22 +08:00
Cindy Chang 55aaab3672 compare page locale continue 2024-06-03 15:10:17 +08:00
Cindy Chang 90eba51a38 compare page locale 2024-06-03 14:50:49 +08:00
Cindy Chang cf7c9025ac feature: i18next first sentence done 2024-06-03 12:45:15 +08:00
Cindy Chang dfd3199d4c WIP i18next 2024-06-03 12:41:30 +08:00
Cindy Chang 9a5dd2d786 refine only layout of code 2024-06-03 12:04:35 +08:00
Cindy Chang cc3fa5df8d unused cypress file; why unused? because cypress doesn't support canvas element 2024-06-03 10:15:43 +08:00
Cindy Chang 38e1aa9446 refine and clean console.log 2024-05-31 16:07:52 +08:00
Cindy Chang 2142399f8c fix #295 include both save and cancel cases of popup modal; however, for cases when conformance page acting as starting point, bugs are still there 2024-05-31 16:04:52 +08:00
Cindy Chang 0a1eefbaa7 original bug is fixed but save modal is not handle (nav-item bg color is not correctly painted) 2024-05-31 14:36:51 +08:00
Cindy Chang 69f6a2048a WIP #295 not yet keep previous page 2024-05-31 12:03:09 +08:00
Cindy Chang 83f399b746 cypress: #288 add missed chart 2024-05-30 14:16:31 +08:00
Cindy Chang 6ff09920c6 fix #288 missed "cycle time & efficiency" chart on Compare page 2024-05-30 11:07:29 +08:00
chiayin f2bdfe0cec release: Update to v1.0.0 2024-03-29 15:51:35 +08:00
chiayin e391c9a237 docs: Update all files JSDoc. 2024-03-29 15:49:05 +08:00
chiayin 4ba71d1193 docs: Update the Github's README. 2024-03-29 11:22:21 +08:00
chiayin 683c407c6e docs: structure tree update. 2024-03-29 10:31:30 +08:00
chiayin 301d49bd08 fix: Issues #218 done. 2024-03-28 16:34:06 +08:00
chiayin c608b1cc52 fix: Issues #278 done. 2024-03-27 11:20:54 +08:00
chiayin 394b535118 fix: Issues #218, Time value Change done. 2024-03-26 17:08:51 +08:00
chiayin ef3bab3592 fix: Issues #217, Time Picker Change done. 2024-03-26 12:54:47 +08:00
chiayin 5acbabfa1c fix: Issues #217, start & end done. 2024-03-25 17:19:12 +08:00
chiayin c26693f933 fix: Issues #262 done. 2024-03-25 12:03:23 +08:00
chiayin 83cca58fe2 fix: Issues #261 done. 2024-03-25 11:36:06 +08:00
chiayin dfc0d9a7a6 fix: Issues #230 done. 2024-03-22 15:42:20 +08:00
chiayin af2e9c75e3 fix: Issues #243 change timer to 3 sec done. 2024-03-21 15:57:14 +08:00
chiayin 3cd8cbc973 fix: Issues #243 uploadFailedSecond done. 2024-03-21 15:51:38 +08:00
chiayin 2de6089f61 fix: Issues #276 done. 2024-03-21 12:15:00 +08:00
chiayin 30b8b45b1f fix: Issues #274 done. 2024-03-21 11:40:44 +08:00
chiayin 41ae85c12e fix: Issues #270 done. 2024-03-21 11:39:06 +08:00
chiayin d009459747 fix: Issues #273 done. 2024-03-21 11:37:51 +08:00
chiayin b9ddd7ee66 fix: Issues #275 done. 2024-03-21 11:33:38 +08:00
chiayin 5d6b0c8253 fix: Issues #277 Compare page done. 2024-03-21 11:27:21 +08:00
chiayin 456078141a fix: Issues #277 Performance page done. 2024-03-21 11:25:37 +08:00
chiayin 68c9e1569c fix: UPLOAD page UI done. 2024-03-20 12:15:35 +08:00
chiayin dac4f5bb8c fix: Issues #213 done. 2024-03-20 11:05:58 +08:00
chiayin 483f6a026d refactor: Discover Router Save done. 2024-03-19 16:29:29 +08:00
chiayin 6663b48159 refactor: Discover Router done. 2024-03-19 15:57:12 +08:00
chiayin bc3e20abd0 refactor: Conformance Router - FILES page to Confomance page router refresh the page done. 2024-03-15 18:10:25 +08:00
chiayin 49b0e462a1 refactor: Conformance Router - FILES page to Confomance page router done. 2024-03-15 16:52:43 +08:00
chiayin 1b813584c0 fix: Issues #246 done. 2024-03-14 16:42:39 +08:00
chiayin fd49c8a414 fix: Issues #211 done. 2024-03-13 17:09:12 +08:00
chiayin 6162155997 fix: Issues #252 done. 2024-03-13 16:24:03 +08:00
chiayin dfb5aee761 fix: Issues #259 done. 2024-03-13 15:38:42 +08:00
chiayin 4cea216337 fix: Issues #261 done. 2024-03-13 12:16:10 +08:00
chiayin 2c5eb7bcea fix: Issues #252 remove table-fixed done. 2024-03-12 17:33:40 +08:00
chiayin 8605f80c79 fix: Issues #258 Compare Line Chart done. 2024-03-12 16:55:24 +08:00
chiayin 689e792cbc fix: Issues #258 Performance Line Chart done. 2024-03-12 16:54:24 +08:00
chiayin 0cfbb33fc8 fix: Issues #256 done. 2024-03-12 16:19:52 +08:00
chiayin e581bdcfe4 fix: Issues #256 fix Compare Line Chart Y unit to 'Count' done. 2024-03-12 16:16:02 +08:00
chiayin 64ae986384 fix: Issues #256 fix Performance Line Chart Y unit to 'Count' done. 2024-03-12 15:47:15 +08:00
chiayin 2c6a45232d fix: Issues #256 fix Compare Horizontal Bar Chart X unit to 'Count' done. 2024-03-12 14:09:28 +08:00
chiayin fa0376ec5f fix: Issues #256 fix Horizontal Bar Chart X unit to 'Count' done. 2024-03-12 12:10:49 +08:00
chiayin 14cd3bd986 fix: Issues #253 fixed Compare titel font-size done. 2024-03-12 11:14:10 +08:00
chiayin 557f0812c7 fix: Issues #253 fixed Performancce titel font-size done. 2024-03-12 11:11:22 +08:00
chiayin e28aaf9cce fix: Issues #222 done. 2024-03-07 17:34:19 +08:00
chiayin e8dc258c12 fix: Issues #138 files page thead sticky and only tbody have scrollbar done. 2024-03-07 14:59:54 +08:00
chiayin c0ad84169a fix: Issues #138 files page thead sticky and only tbody have scrollbar done. 2024-03-07 12:29:08 +08:00
chiayin 5b62799efb fix: Issues #221 impge import src done. 2024-03-06 16:19:55 +08:00
chiayin e6e99ab78b fix: Issues #209 done. 2024-03-06 15:36:54 +08:00
chiayin 91e46448b0 fix: Issues #60 done. 2024-03-06 12:17:36 +08:00
chiayin 5df24139bd fix: Issues #250 done. 2024-03-05 17:06:23 +08:00
chiayin 0b0bc3aa54 fix: Issues #249 done. 2024-03-05 16:56:18 +08:00
chiayin d333453578 fix: Issues #242 done. 2024-03-05 16:07:22 +08:00
chiayin 50ff27f377 fix: Issues #241 done. 2024-03-05 15:22:37 +08:00
chiayin e622f1b6fe fix: Issues #240 done. 2024-03-05 15:21:24 +08:00
chiayin 0503da4a3d fix: Issues #238 done. 2024-03-05 14:21:20 +08:00
chiayin 529282c2a4 fix: Issues #228 done. 2024-03-05 12:46:25 +08:00
chiayin b37e452a73 fix: Issues #225 done. 2024-03-05 11:02:36 +08:00
chiayin e8af9f93ec fix: Issues #223 done. 2024-03-04 17:19:17 +08:00
chiayin aad3e998f6 fix: Issues #187 done. 2024-03-04 16:48:00 +08:00
chiayin 0ce02f7587 fix: Issues #47 done. 2024-03-04 11:01:59 +08:00
chiayin deeee05647 fix: Issues #220 done. 2024-03-04 10:51:34 +08:00
chiayin 647d9ff59d fix: Issues #237 done. 2024-03-01 17:03:52 +08:00
chiayin 0d12c50a1b fix: Issues #234 done. 2024-03-01 17:01:18 +08:00
chiayin 734ab15f68 fix: Issues #231 content done. 2024-03-01 16:55:03 +08:00
chiayin 68cf73f4e5 fix: Issues #231 done. 2024-03-01 16:53:30 +08:00
chiayin 20bfa0b2ef fix: Issues #221 done. 2024-03-01 16:41:49 +08:00
chiayin 62e1d37f37 fix: Issues #224 done. 2024-03-01 16:18:07 +08:00
chiayin 4704b0deef fix: Issues #149 thead to text-center done. 2024-03-01 10:49:30 +08:00
chiayin 2a8548170b fix: Issues #149 tr to text-center done. 2024-03-01 10:45:23 +08:00
chiayin 14c3a2b05c fix: Issues #47 info icon done. 2024-02-29 17:18:55 +08:00
chiayin b01937e491 fix: Issues #30 done. 2024-02-29 11:57:36 +08:00
chiayin bec8184620 fix: router beforeEach done. 2024-02-29 10:53:42 +08:00
chiayin 695bd767c8 fix: Issues #201 done. 2024-02-26 16:40:36 +08:00
chiayin d416e2d8de fix: Issues #197 done. 2024-02-26 16:32:53 +08:00
chiayin c590aa3531 fix: Issues #194 done. 2024-02-26 16:29:26 +08:00
chiayin c5a28cb161 fix: Issues #51 done. 2024-02-26 15:27:37 +08:00
chiayin fcf640cc5b fix: Issues #33 done. 2024-02-26 15:04:40 +08:00
chiayin 1ab59a859b fix: 404 page back router done. 2024-02-23 17:11:19 +08:00
chiayin ffd13ad1f7 tag: v0.99.9 2024-02-23 16:41:59 +08:00
chiayin 9f9437f303 feat: Compare no wait time layout done. 2024-02-23 16:40:52 +08:00
chiayin 0f7945c6fe test: Compare dropdown sort done. 2024-02-23 15:24:25 +08:00
chiayin cec820258b fix: Compare SidebarStates File Name line-hight done. 2024-02-22 16:59:20 +08:00
chiayin b6bd1e878e test: Enter Compare & Anchor done. 2024-02-22 16:51:49 +08:00
chiayin f7c76fd1f7 feat: Performance not show SAVE button done. 2024-02-22 10:42:40 +08:00
chiayin d18673acc8 fix: file grid card line-height done. 2024-02-22 10:38:07 +08:00
chiayin d921d9fa75 feat: Compare not show SAVE button done. 2024-02-22 10:26:03 +08:00
chiayin d852d7be06 feat: Compare file sort Dropdown done. 2024-02-22 10:12:45 +08:00
chiayin f429d21584 fix: Primevue css update to fix google font icon text-size done. 2024-02-22 10:08:40 +08:00
chiayin df7ac38397 fix: Primevue css update done. 2024-02-21 18:29:52 +08:00
chiayin a6a007abd2 feat: Compare SidebarStates API done. 2024-02-20 17:40:19 +08:00
chiayin 1eadcdd506 feat: Compare & Performance add function information done. 2024-02-20 12:58:08 +08:00
chiayin 795480ee89 feat: Compare Dashboard API done. 2024-02-20 12:44:30 +08:00
chiayin 01b8a95485 feat: Compare Grid Sort done. 2024-02-19 17:26:18 +08:00
chiayin 66a6f7806d feat: Compare sidebar layout done. 2024-02-16 11:35:10 +08:00
chiayin ac8a3b0b27 feat: Compare bar layout done. 2024-02-15 13:00:01 +08:00
chiayin f3dd456b3a test: Performance Anchor done. 2024-02-07 12:27:02 +08:00
chiayin 88de9cfa53 test: Performance Enter Rule done. 2024-02-07 11:41:00 +08:00
chiayin 8ce668f471 feat: Performance conformance page to performance page done. 2024-02-07 11:37:53 +08:00
chiayin 2258f0e7b0 test: Performance Enter Log and Enter Filter done. 2024-02-07 11:21:52 +08:00
chiayin ac9e13d067 feat: Performance done. 2024-02-06 16:47:54 +08:00
chiayin c811baefa6 feat: Performance all chart done. 2024-02-05 15:50:33 +08:00
chiayin 5063d49794 feat: Performance Title font normal done. 2024-02-05 13:15:33 +08:00
chiayin 70d2031d61 feat: Performance activity ellipsis done. 2024-02-05 13:13:46 +08:00
chiayin 85d604fc38 feat: Performance Horizontal Bar Height done. 2024-02-05 11:30:12 +08:00
chiayin c86ce2d6f0 feat: Performance tooltip done. 2024-02-02 16:14:09 +08:00
chiayin 7c959e7cd9 feat: Performance dateLabel done. 2024-02-02 15:00:45 +08:00
chiayin d89c5ff4d8 feat: Performance timeLabel done. 2024-02-01 12:33:11 +08:00
chiayin bddc1d3a7a feat: Performance aside done. 2024-01-26 17:08:34 +08:00
chiayin 329e1035ad feat: Performance API done. 2024-01-26 10:38:42 +08:00
chiayin 8ebfb151c7 feat: Performance router done. 2024-01-25 15:35:23 +08:00
chiayin fefb3f325d test: fileUploadEtc testing done. 2024-01-25 11:31:45 +08:00
chiayin 3d58133a04 test: Donwload file. Done. 2024-01-25 11:30:22 +08:00
chiayin 6d6c4cc4ac test: Delete file. Done. 2024-01-25 10:48:40 +08:00
chiayin 56408e8b85 test: Right file upload. Done. 2024-01-24 17:12:35 +08:00
chiayin be5a7d0c4a test: Phase two worng file upload. Done. 2024-01-24 16:26:59 +08:00
chiayin 04dec3bbd3 test: Upload Page, rename, reset, back to page. Done. 2024-01-24 12:29:35 +08:00
chiayin a93ee122d0 feat: Refresh Token in processes. 2024-01-22 10:46:24 +08:00
chiayin c64ba68135 fix: Remove my-account API in main page. 2024-01-18 15:34:17 +08:00
chiayin 003c638d21 feat: Files uploadFailedSecond error text done. 2024-01-18 14:54:18 +08:00
chiayin e61c458d92 feat: Files delete modal error text done. 2024-01-18 14:44:35 +08:00
chiayin b23d89bc38 feat: Files uploadFailedSecond error text done. 2024-01-17 16:59:57 +08:00
chiayin a9f991a715 feat: Files uploadFailedFirst size > 80MB text done. 2024-01-17 11:20:36 +08:00
chiayin 75bbcd07ab feat: Files Delete File done. 2024-01-17 10:46:07 +08:00
chiayin 30a97b2a3b fix: API Error Message text done. 2024-01-16 11:42:25 +08:00
chiayin 5bc9139fc5 fix: Files Upload API & Rename API done. 2024-01-16 11:40:03 +08:00
chiayin 02deb591a1 feat: Refresh Token in progress. 2024-01-16 11:07:59 +08:00
chiayin 9753ed535d feat: File download done. 2024-01-15 17:18:45 +08:00
chiayin c64d243de2 feat: File list hover rename done. 2024-01-15 13:03:22 +08:00
chiayin 2df2dc718f feat: File table change Collapse style done. 2024-01-15 12:44:25 +08:00
chiayin d7b372f620 feat: File list hover layout done. 2024-01-15 12:01:22 +08:00
chiayin d4f0801ca1 feat: File rename API done. 2024-01-11 12:26:40 +08:00
chiayin 01d712e487 feat: Upload no uploadId need to next to files page. 2024-01-08 12:56:34 +08:00
chiayin 080eb6ae95 feat: Upload Navbar done. 2024-01-08 09:12:32 +08:00
chiayin 0535cb5a91 feat: Upload Navbar done. 2024-01-05 17:01:44 +08:00
chiayin fe5731ae15 feat: Upload failde Second Modal done. 2024-01-05 16:39:09 +08:00
chiayin 68981e98f5 fix: ToastPlugin duratio 5000 done. 2024-01-05 15:24:18 +08:00
chiayin 3fb18d4a17 feat: upload Rename Input done. 2024-01-05 14:24:12 +08:00
chiayin 65c42312ee feat: upload contentEditable done. 2024-01-03 17:45:46 +08:00
chiayin 16d9547305 fix: inform judgment add blank text. 2023-12-29 16:55:26 +08:00
chiayin 96263567e6 fix: tooltipUpload add opacity. 2023-12-29 16:39:03 +08:00
chiayin 9ef441ee83 feat: upload done. 2023-12-29 16:05:27 +08:00
chiayin cd2ab42125 test: update E2E testing. 2023-12-15 12:26:32 +08:00
chiayin 90610c173f feat: Upload doing. 2023-12-15 11:32:48 +08:00
chiayin 911abc2139 refactor: Issues #177 change files API done. 2023-12-14 15:36:50 +08:00
chiayin 9c7fd4a202 feat: Upload layout done. 2023-12-14 09:34:35 +08:00
chiayin 67b0ee47df feat: Upload Alert done. 2023-12-12 11:56:21 +08:00
chiayin 7ed6f97857 release: tag v0.99.7 2023-12-08 14:57:43 +08:00
chiayin 8615834d2a test: E2E-conformance Waiting time and Cycle time done. 2023-12-08 12:57:40 +08:00
chiayin 24212f9a3a test: E2E-conformance rule Processing time All done. 2023-12-08 12:28:58 +08:00
chiayin 9d52db406d test: E2E-conformance rule Processing time E2E All done. 2023-12-07 17:26:44 +08:00
chiayin 44fe8acc8f test: E2E-conformance rule Activity duration done. 2023-12-07 17:16:58 +08:00
chiayin 75d1d43738 test: E2E-conformance rule Activity duration done. 2023-12-07 17:13:09 +08:00
chiayin 2403024d33 test: E2E-conformance rule Activity sequence done. 2023-12-07 16:25:31 +08:00
chiayin 7a98f549b6 test: E2E-conformance rule Have activity. 2023-12-06 17:26:55 +08:00
chiayin 31c9143aa6 test: E2E-conformance no save done. 2023-12-06 15:57:49 +08:00
chiayin a745015442 test: E2E-conformance save log and filter done. 2023-12-06 12:52:50 +08:00
chiayin 71f0926eb9 fix: Conformance Save Sequence radio done. 2023-12-04 15:01:08 +08:00
chiayin 8ae4082a47 feat: Conformance Save leaved page done. 2023-12-04 14:11:29 +08:00
chiayin 8b502e67f4 feat: Conformance Save Logout done. 2023-12-01 14:24:05 +08:00
chiayin c26a1dfee7 feat: Conformance Save switchNavItem done. 2023-11-30 12:19:46 +08:00
chiayin 95c429ef00 feat: Conformance Save Filter Done. 2023-11-30 11:26:01 +08:00
chiayin 1f0a6aa900 feat: Conformance Save Log Done. 2023-11-29 16:47:25 +08:00
chiayin f1666a0bd1 fix: Issues #208 done. 2023-11-23 13:43:15 +08:00
chiayin ec596ef3ed fix: Issues #192 done. 2023-11-22 17:16:48 +08:00
chiayin 081ab794aa fix: Issues #108 done. 2023-11-22 13:00:22 +08:00
chiayin c3d9a3d9e4 fix: Issues #198 done. 2023-11-22 11:40:28 +08:00
chiayin 8949476e60 fix: Issues #203 done. 2023-11-21 11:43:13 +08:00
chiayin 5c25b37d51 Merge branch 'main' of github.com:dspim/lucia-frontend 2023-11-21 10:22:51 +08:00
chiayin b0b1c32932 fix: Issues #200 done. 2023-11-21 10:21:22 +08:00
chiayin 3254a24740 fix: Issues #203 done. 2023-11-20 15:01:06 +08:00
chiayin 1aba349a76 Tag: add v0.99.6 2023-11-13 13:58:42 +08:00
chiayin c323fbb28e Issues #161: done. 2023-11-13 13:57:13 +08:00
chiayin b92ddbc83b Issues #162: done. 2023-11-13 13:34:51 +08:00
chiayin 918de38fcc Tag: add v0.99.5 2023-11-13 13:04:47 +08:00
chiayin 00a1931189 Issues #191: done. 2023-11-13 13:02:06 +08:00
chiayin dd7057c2b1 Issues #139: done. 2023-11-13 09:52:26 +08:00
chiayin 6c81eff7a5 Issues #142: done. 2023-11-13 09:45:48 +08:00
chiayin 0254209053 Issues #172: done. 2023-11-13 09:30:47 +08:00
chiayin 91045c0706 Issues #188: done. 2023-11-13 09:10:15 +08:00
chiayin 79385c2e3c Tag: add v0.99.4 2023-11-10 16:44:53 +08:00
chiayin ec841511be Issues #11: done. 2023-11-10 15:51:52 +08:00
chiayin 7f5f8a10be Issues #36: done. 2023-11-10 14:56:52 +08:00
chiayin 6f9d57baba Issues #108: done. 2023-11-10 14:51:42 +08:00
chiayin 4ee566d7ad Issues #141: done. 2023-11-10 14:47:50 +08:00
chiayin 0e6bbd2e20 Issues #152: done. 2023-11-10 14:44:58 +08:00
chiayin 99e30a1adc Issues #153: done. 2023-11-10 14:43:42 +08:00
chiayin 66372e4d93 Issues #153: done. 2023-11-10 14:41:57 +08:00
chiayin 9118497f09 Issues #182: done. 2023-11-10 14:19:43 +08:00
chiayin 03cacd5a9b Issues #183: done. 2023-11-10 11:51:15 +08:00
chiayin edd56aa001 Issues #190: done. 2023-11-10 10:47:31 +08:00
chiayin e7c041d5f1 Merge branch 'main' of github.com:dspim/lucia-frontend 2023-11-09 16:58:23 +08:00
chiayin 3fe92de61e Issues #183: done. 2023-11-09 16:57:12 +08:00
chiayin 4f8e6dc260 Issues #186: done. 2023-11-09 16:50:52 +08:00
chiayin d288c8f68e Issues #186: fix, The sidevar needs to close when the button is pressed. 2023-11-06 16:12:18 +08:00
chiayin 5d958f672f Issues #186: done. 2023-11-06 15:50:26 +08:00
chiayin d21d4ed16b Issues #182: done. 2023-11-06 14:49:25 +08:00
chiayin 672d93b821 Issues #179: done. 2023-11-03 17:12:57 +08:00
chiayin 59f59e6280 Fix: add Attributes boolean type freq. 2023-11-03 13:14:23 +08:00
chiayin cbb1f7c446 Issues #171: add filter sort done. 2023-11-02 18:00:01 +08:00
chiayin 0be3bcfdd0 Issues #174: done. 2023-11-02 17:42:43 +08:00
chiayin 89f0ef9a5a Issues #171: done. 2023-11-01 11:23:52 +08:00
chiayin 4089b1c7b8 Issues #170: done. 2023-11-01 11:17:45 +08:00
chiayin 1896b8d8cf Issues #175: done. 2023-10-31 17:17:17 +08:00
chiayin a4ea3bff5d Map Attributes: fix allMapData.js. 2023-10-31 16:38:54 +08:00
chiayin 64fad0a8fe Map Attributes: fix allMapData.js. 2023-10-31 16:37:25 +08:00
chiayin 19c536a4f2 Map Timeframe: fix not mask.style error. 2023-10-31 16:06:00 +08:00
chiayin 9d7f390343 Map Timeframe: fix second Apply need to disabled. 2023-10-31 15:35:12 +08:00
chiayin 2ac112dbbd Map Attributes: Apply, Clear done. 2023-10-31 15:29:18 +08:00
chiayin fdba0abc37 Map Attributes: API Format converter. 2023-10-30 16:10:37 +08:00
chiayin 03442f1934 Map Attributes: value type int and float done. 2023-10-30 10:06:54 +08:00
chiayin bca9978fad Map Attributes: value type int and float Chart.js done. 2023-10-26 12:50:59 +08:00
chiayin 7eb9b1c63d Map Attributes: value type Calendar done, but have event bubbling error. 2023-10-25 17:34:14 +08:00
chiayin 7700d60546 Map Attributes: value type Slider done. 2023-10-25 11:13:37 +08:00
chiayin 937c1459d7 Map Attributes: type 'string' layout done. 2023-10-23 15:40:36 +08:00
chiayin e55cbc013c Map Attributes: type 'boolean' layout done. 2023-10-23 13:31:33 +08:00
chiayin 6c032ca94a Issue #169: Done. 2023-10-19 14:11:40 +08:00
chiayin b32e1b3b61 Conformance Filter: done. 2023-10-19 11:01:21 +08:00
chiayin 1fd019d276 Oauth: add grant_type. 2023-10-19 10:12:36 +08:00
chiayin 06531d0acf Conformance Filter: fetch filter doning 50%. 2023-10-19 10:12:18 +08:00
chiayin 830f4d30a9 Conformance Filter: fetch filter params API done. 2023-10-18 12:40:51 +08:00
chiayin 85d1f9a487 Issue #151: Done. 2023-10-17 15:52:38 +08:00
chiayin c85b7f2d71 Issue #148: Done. 2023-10-17 09:59:09 +08:00
chiayin 4c46347127 Issue #148: Done. 2023-10-16 18:53:48 +08:00
chiayin 946fabfa93 Issue #140: 2023-10-16 18:38:20 +08:00
chiayin e751aed3eb Issue #112: Done. 2023-10-13 18:33:49 +08:00
chiayin cf3d799ed7 Issue #140: Done. 2023-10-13 17:58:47 +08:00
chiayin 1cfbddf510 Issue #165: Done. 2023-10-11 18:50:46 +08:00
chiayin 6e0d5b15fe Issue #168: Done. 2023-10-06 15:39:16 +08:00
chiayin 6ffd676182 Issue #132: Done. 2023-10-06 12:31:26 +08:00
chiayin 6bd92dfef3 Issue #160: Done. 2023-10-06 11:57:36 +08:00
chiayin a7f51e3444 Issue #144: Done. 2023-10-05 17:20:35 +08:00
chiayin 897f8d0a41 Issue #45: fix all conformance, not show Not-conformance Issues title Done. 2023-10-05 16:22:14 +08:00
chiayin a93fca36f5 Issue #166: Done. 2023-10-04 16:54:19 +08:00
chiayin 8a9f6ecd2e Issue #154: Done. 2023-10-04 15:27:43 +08:00
chiayin 8fda975228 Issue #8: Done. 2023-10-04 15:17:54 +08:00
chiayin b5f6c9785a Issue #7: Done. 2023-10-04 15:14:15 +08:00
chiayin 40b339a235 Issue #3: Done. 2023-10-04 15:04:51 +08:00
chiayin c845d0674a Issue #2: Done. 2023-10-04 15:00:42 +08:00
chiayin a41a43e688 Issue #9: Done. 2023-10-04 14:26:16 +08:00
chiayin 3ef7b2502e Issue #10: Done. 2023-10-04 14:07:41 +08:00
chiayin 2b07f965cf Issue #12: Done. 2023-10-04 14:06:24 +08:00
chiayin 240f68a73e Issue #14: Done. 2023-10-04 14:04:45 +08:00
chiayin a25290f4db Issue #17: Done. 2023-10-04 14:02:00 +08:00
chiayin c7e706dd5b Issue #22: Done. 2023-10-04 13:55:11 +08:00
chiayin ddd8df9daa Issue #31: Done. 2023-10-04 13:46:51 +08:00
chiayin 803782d5a9 Issue #34: Done. 2023-10-04 11:01:17 +08:00
chiayin bee668a3f7 Issue #104: Done. 2023-10-03 16:57:21 +08:00
chiayin 112c4d1cdf Issue #107: Done. 2023-10-03 16:01:21 +08:00
chiayin 285fb43aa3 Issue #114: Done. 2023-10-03 12:32:27 +08:00
chiayin 436586d6e9 Issue #124: Done. 2023-10-02 17:19:30 +08:00
chiayin f9738bbed9 Issue #122: Done. 2023-10-02 15:18:48 +08:00
chiayin 20c7e4316b Issue #123: Done. 2023-09-28 14:38:32 +08:00
chiayin 64c8aec657 Issue #145: Add padding-bottom: 5rem; 2023-09-28 13:01:53 +08:00
chiayin ed4314e6c0 Issue #164: Done. 2023-09-28 12:57:20 +08:00
chiayin 18f376c734 Issue #158: Done. 2023-09-28 12:49:32 +08:00
chiayin 5ea268cc77 Issue #94: Second Done. 2023-09-28 12:37:31 +08:00
chiayin a8f47f7593 Issue #148: Done. 2023-09-27 16:25:04 +08:00
chiayin e14ec4bef2 Issue #151: Done. 2023-09-27 15:42:08 +08:00
chiayin aa176f4c4c Issue #150: Done. 2023-09-27 14:57:23 +08:00
chiayin 1a533d1376 Issue #156: Done. 2023-09-27 11:37:47 +08:00
chiayin acc89bf301 Issue #155: Done. 2023-09-27 11:36:42 +08:00
chiayin 3a50b9ba8f Issue #130: Done. 2023-09-27 10:27:38 +08:00
chiayin cb117979a2 Merge branch 'main' of github.com:dspim/lucia-frontend 2023-09-27 10:21:47 +08:00
chiayin 7617af8159 Issue #68: Second point done. 2023-09-27 10:17:50 +08:00
chiayin 56a808c581 tag: V0.99.1.01 2023-09-26 13:48:09 +08:00
chiayin 442a7168b6 Issue #93: Done. 2023-09-26 13:40:51 +08:00
chiayin 349e565696 Issue #80: Done. 2023-09-25 18:26:30 +08:00
依瑪貓 453219f569 Renamed "conformance checker" to "conformance check". 2023-09-23 22:53:32 +08:00
chiayin add059f1e1 Issue #39: change Rule cleared. 2023-09-23 17:17:10 +08:00
chiayin 76c5c71f0d Issue #62: change Rule cleared. 2023-09-23 17:08:07 +08:00
chiayin 8f46878ade Issue #59: Done. 2023-09-23 17:06:47 +08:00
chiayin 9cb9b5cb71 Issue #41: Done. 2023-09-22 16:50:05 +08:00
chiayin b6a11f5ff9 Issue #49: Delete sortable. 2023-09-22 11:02:34 +08:00
chiayin 9a4b3c4180 Issue #137: Delete sortable. 2023-09-22 10:57:42 +08:00
chiayin 9693496011 Issue #62: Done. 2023-09-21 17:56:29 +08:00
chiayin 9338226c0a Issue #64: Done. 2023-09-21 17:54:59 +08:00
chiayin 013a459fed Issue #79: Done. 2023-09-21 17:52:06 +08:00
chiayin c73ef5d4ba Issue #136: Done. 2023-09-21 17:19:27 +08:00
chiayin 040e8b707a Issue #133: Done. 2023-09-21 15:10:29 +08:00
chiayin 0d930238dd Issue #97: Done. 2023-09-21 12:04:58 +08:00
chiayin bcda6345c6 Issue #98: Done. 2023-09-20 16:16:44 +08:00
chiayin 28d94db141 Issue #116: Done. 2023-09-20 16:12:44 +08:00
chiayin d1d0585269 Issue #117: Done. 2023-09-19 17:53:24 +08:00
chiayin f73979d263 Issue #135: Done. 2023-09-19 17:03:40 +08:00
chiayin 5740241bef Issue #118: Done. 2023-09-19 14:40:40 +08:00
chiayin c4373ac248 Issue #119: Done. 2023-09-19 14:35:09 +08:00
chiayin b528e36a8f Issue #121: Done. 2023-09-19 14:26:46 +08:00
chiayin 53ed4938c6 Issue #125: Done. 2023-09-19 14:01:24 +08:00
chiayin 1d20c53f05 Issue #128: Done. 2023-09-19 13:57:30 +08:00
chiayin 9d43e1178f Issue #130: Done. 2023-09-19 13:33:32 +08:00
chiayin 728d99d84e Issue #134: Done. 2023-09-19 13:30:20 +08:00
chiayin 29b434e672 Issue #134: Done. 2023-09-19 13:29:15 +08:00
chiayin 6c2783cd5d Issue #77: fix show test. 2023-09-19 12:46:32 +08:00
chiayin 53e23b9475 Issue #77: done. 2023-09-18 17:28:58 +08:00
chiayin e1a9e57468 Issue #76: done. 2023-09-15 14:58:40 +08:00
chiayin c00123ddcb Issue #53: done. 2023-09-14 21:01:09 +08:00
chiayin 47ca3d8f21 Issue #68: done. 2023-09-13 17:40:51 +08:00
chiayin 86940d6887 Conformance: fix ActSeqDrag double click feature. 2023-09-13 16:02:44 +08:00
chiayin 712ccb647e Issue #45: done. 2023-09-13 12:02:15 +08:00
chiayin 4b0cf87414 Issue #102: done. 2023-09-13 11:47:09 +08:00
chiayin 7e48007e4e Issue #89: done. 2023-09-12 17:43:31 +08:00
chiayin ce49422a86 Issue #94: done. 2023-09-12 16:59:20 +08:00
chiayin 83a6f072b4 Issues #71: Short loop(s)、Self loop(s), ALL, Done. 2023-09-12 14:59:47 +08:00
chiayin 11eb320c55 Issues #83: done. 2023-09-12 11:48:32 +08:00
chiayin 35a494b99e Issues #71: Short loop(s)、Self loop(s) done. 2023-09-11 16:53:48 +08:00
chiayin 3a7d5429a7 Issues #65: done. 2023-09-11 11:54:08 +08:00
chiayin 5cea9b209b Issues #58: done. 2023-09-11 11:36:26 +08:00
chiayin 53a1febeeb Conformance: delete results test object. 2023-09-11 11:21:25 +08:00
chiayin a2591db2ab Conformance: Change backend API float-list to duration-list done. 2023-09-11 11:03:19 +08:00
chiayin c2592a6bc4 Issues #44: done. 2023-09-11 09:53:45 +08:00
chiayin 81b1bd905b Fix: Have activity && Activity sequence not show Time Range. 2023-09-05 16:43:06 +08:00
chiayin 8351a33f90 Fix Issues: #42 Case Duration Value done. 2023-09-05 16:25:49 +08:00
chiayin f98b1b570e Conformance: done. 2023-09-05 15:37:45 +08:00
chiayin ef6c475782 Conformance: fix Time Durationjs max Val and totalVal. 2023-09-05 15:36:26 +08:00
chiayin 72ec78ab0e Conformance: Time Range show after Apply time done. 2023-09-05 14:59:30 +08:00
chiayin e3b8153a8e Conformance: add ConformanceTimeRange.vue 2023-09-05 14:06:46 +08:00
chiayin 5219636eb8 Conformance: PT & WT & CT show after Apply Activity Selector tasks done. 2023-09-04 17:19:20 +08:00
chiayin a587e0aaa6 Conformance: PT & WT & CT show after Apply List tasks done. 2023-09-04 16:54:11 +08:00
chiayin 9c53e298be Conformance: fix ConformanceResults show or not Time Trend. 2023-09-04 12:26:16 +08:00
chiayin 60182c3148 Conformance: fix Time Trend conformance chart blue color done. 2023-09-04 11:32:25 +08:00
chiayin f68eafca71 Conformance: fix Time Trend xVal data done. 2023-09-04 10:47:44 +08:00
chiayin a0c2d84639 Conformance: fix Time Trend chart done. 2023-09-04 10:41:57 +08:00
chiayin 3f0d1b9e05 Conformance: Time Trend chart done. 2023-09-04 10:22:06 +08:00
chiayin 5f16c4ac58 Conformance: Have activity & Activity sequence done. 2023-09-01 12:15:46 +08:00
chiayin 49230c1b51 Conformance: Time Trend Chart incomplete. 2023-09-01 11:33:38 +08:00
chiayin 7ee1dac5b1 Conformance: Time Trend Chart Scales-y Option done. 2023-08-31 15:15:08 +08:00
chiayin b7c04c9382 Conformance: fix Activity sequence Sequence Mode rules. 2023-08-30 14:57:00 +08:00
chiayin 187ce7afcc Conformance: Activity sequence Start & End linkage done. 2023-08-30 14:19:20 +08:00
chiayin 1e49e11a1b Conformance: Time Range done. 2023-08-29 15:47:31 +08:00
chiayin 2b90c02a8c Conformance: time duration component add a comment. 2023-08-29 14:47:53 +08:00
chiayin 89aa346b8f Conformance: time duration component done. 2023-08-29 12:56:22 +08:00
chiayin b897b163aa Conformance: time duration component fix bug. 2023-08-28 17:01:26 +08:00
chiayin 83485fa8aa Conformance: processing time, waiting time, cycle time, add show activity selector not done. 2023-08-28 09:30:08 +08:00
chiayin 45e7d5a0a1 Conformance: processing time, waiting time, cycle time, add not select show toast done. 2023-08-24 16:25:05 +08:00
chiayin 0850aa0771 Conformance: processing time, waiting time, cycle time, get apply report don. 2023-08-24 15:13:14 +08:00
chiayin 70b4193275 Conformance: processing time, waiting time, cycle time, update all tiem range. 2023-08-23 18:01:37 +08:00
chiayin ca359436e4 Conformance: processing time, waiting time, cycle time, change radio done. 2023-08-23 16:34:19 +08:00
chiayin c5de7f17bc Conformance: processing time, waiting time, cycle time, show time Range done. 2023-08-23 10:27:02 +08:00
chiayin bdbd506734 Conformance: processing time, waiting time, cycle time, showbox list done. 2023-08-22 12:48:58 +08:00
chiayin 66e09aa85c compontent time duration 交互影響, 關聯性待修. 2023-08-21 10:16:24 +08:00
chiayin c5441475a9 Conformance: Activity duration feature apply done. 2023-08-15 17:37:41 +08:00
chiayin 654e74859a Conformance: fix close modal. 2023-08-15 12:32:45 +08:00
chiayin c6088cf2ea Conformance: feature update Issues list color. 2023-08-15 11:28:40 +08:00
chiayin 59bbe77fa0 Conformance: feature update ratio Percentage calculation formula. 2023-08-15 10:55:35 +08:00
chiayin 0f10ac6626 Conformance: feature update Conformance Rate Percentage calculation formula. 2023-08-15 10:43:50 +08:00
chiayin a2473a9ff1 Conformance: Activity sequence Self loop(s) done. 2023-08-15 10:36:53 +08:00
chiayin 82f18ee5e4 Conformance: Activity sequence Short loop(s) done. 2023-08-15 10:31:55 +08:00
chiayin 8f1711de99 featurn: time duration layout done. 2023-08-14 09:32:43 +08:00
chiayin 13e9f7787b featurn: time duration maxValue and minValue done. 2023-08-10 09:44:44 +08:00
chiayin b84fe38609 Conformance: feature task clear but after apply need to trued in Activity Selector. 2023-08-07 16:25:25 +08:00
chiayin 19da6195ec Conformance: feature task clear but after apply need to trued. 2023-08-04 16:57:54 +08:00
chiayin 34aa0f28c2 Conformance: Activity sequence, Sequence, Directly follows done. 2023-08-02 14:38:08 +08:00
chiayin 86e1c52585 Conformance: fix scrollTop error & Have activity done. 2023-07-28 12:42:28 +08:00
chiayin 864b7bf0ae Conformance: infinite scroll done. 2023-07-28 12:11:31 +08:00
chiayin 765278bada Conformance: backend update Conformance checker API, fix issues section layout. 2023-07-27 11:13:15 +08:00
chiayin a70a7a96f7 Conformance: backend update Conformance issue API, Conformance report API, fix more model trace table. 2023-07-27 10:29:08 +08:00
chiayin 53038ab2c0 Conformance: Have activity fix chart Date. 2023-07-26 11:41:07 +08:00
chiayin f2df01e855 Conformance: Have activity More done. 2023-07-25 16:12:46 +08:00
chiayin dc4ede1d62 Conformance: Have activity Log Results chart, Effect done. 2023-07-20 15:45:22 +08:00
chiayin 97ac9535f9 Conformance: StatusSidebar Have activity Clear button done. 2023-07-13 09:42:58 +08:00
chiayin 6955f376ca Conformance: StatusBar done. 2023-07-12 15:52:03 +08:00
chiayin 9db7b73d2c Conformance: layout done.(not time range) 2023-07-12 09:56:23 +08:00
chiayin 466c6ea867 Scrollbar: change color 2023-06-30 10:37:51 +08:00
chiayin d976bc529d Conformance: Have activity Layout done. 2023-06-29 15:45:34 +08:00
chiayin 147c9b16cf Conformance: StatusBar done. 2023-06-20 11:51:41 +08:00
chiayin a6fa85938b fix E2E. 2023-06-17 13:52:42 +08:00
chiayin af1f8f3016 Router: change /Discover to /Discover/map/type/filterId 2023-06-16 17:13:59 +08:00
chiayin 07b35fcce0 Discover: sidebarFilter Sequence Sequence fix dblclick no need to hide arrow. Update v0.99.1 2023-06-14 12:56:09 +08:00
chiayin 79ab329d87 Discover: sidebarFilter Sequence Sequence add actList sort and add TODO. Update v0.99.1 2023-06-14 12:30:16 +08:00
chiayin 6083bb7988 Organized into a Discover Map version V0.99.1 2023-06-13 18:13:27 +08:00
chiayin 490a2442d8 Radio design done. 2023-06-13 17:54:48 +08:00
chiayin 115626da65 Hide features that don't yet want to do. 2023-06-13 16:17:26 +08:00
chiayin 257eb17ff6 Discover: sidebarFilter - Squence design Drag & Drop UI. 2023-06-13 15:51:37 +08:00
chiayin faa68d4822 Discover: sidebarFilter - Timeframes fix selectArea bug done. 2023-06-12 12:33:25 +08:00
chiayin 0b2104f41b Cypress: filterFunnel - testing done. 2023-06-12 09:59:02 +08:00
chiayin 77d6c6c56b Cypress: filterFunnel - Sequence Sequence testing done. 2023-06-12 09:53:54 +08:00
chiayin d9b43b9f4e Discover: sidebarFilter - Sequence -> Sequnce add dblclick teature done. 2023-06-12 09:30:52 +08:00
chiayin 6b3251e9eb Cypress: filterFunnel - Ttmeframes testing done. 2023-06-08 16:38:57 +08:00
chiayin 34f64784a8 Discover: sidebarFilter - fix Timeframes Clear button. 2023-06-08 16:01:53 +08:00
chiayin a84d123b95 Cypress: filterFunnel - Trace testing done. 2023-06-08 15:17:08 +08:00
chiayin 5600cb074b Cypress: filterFunnel - Start & End testing done. 2023-06-07 17:38:19 +08:00
chiayin 836c3249d9 Discover: sidebarFilter - fix Filter select. 2023-06-07 16:50:57 +08:00
chiayin cbc330ec5d Cypress: filterFunnel - End testing done. 2023-06-07 16:45:21 +08:00
chiayin 1c364fb15e Cypress: filterFunnel - Have activity & Start testing done. 2023-06-07 16:33:02 +08:00
chiayin 8912ce6e8b Discover: SidebarFilter Timeframes fix startDate & endDate. 2023-06-07 12:19:03 +08:00
chiayin 9a403cce71 Discover: SidebarFilter Timeframes Apply and create Map done. 2023-06-06 14:39:25 +08:00
chiayin 90a5b7532a Discover: SidebarFilter Timeframes div & slider done. 2023-06-01 14:54:39 +08:00
chiayin 9927d34099 Discover: SidebarFilter Timeframes div & slider done. 2023-05-31 17:36:46 +08:00
chiayin 0e510e8270 Discover: SidebarFilter Timeframes fix chart y max value and min value. 2023-05-24 12:49:19 +08:00
chiayin a9c7723e6e Discover: SidebarFilter delete Containment Trim. 2023-05-24 12:43:31 +08:00
chiayin 6ca0601db7 Discover: SidebarFilter Timeframes slider control to line chart done. 2023-05-23 19:07:11 +08:00
chiayin f1f2f56d8c Discover: SidebarFilter Trace fix BarChart Option. 2023-05-18 11:55:41 +08:00
chiayin b37b9638b2 Discover: SidebarFilter Timeframes LineChart Option done. 2023-05-18 11:52:16 +08:00
chiayin 09e5ebf2b2 Discover: SidebarFilter Sequence fix hight. 2023-05-17 11:01:46 +08:00
chiayin d7e88f6407 Discover: SidebarFilter Trace done. But backend need to check creat Map. 2023-05-17 10:43:50 +08:00
chiayin 64da286748 Discover: SidebarFilter Trace button Clear done. 2023-05-16 18:10:52 +08:00
chiayin da8a1109be Discover: SidebarFilter Trace button Apply done. 2023-05-16 17:59:45 +08:00
chiayin 895d1bb9b7 Discover: Remove unnecessary code. 2023-05-16 15:47:55 +08:00
chiayin 85514681b7 Discover: SidebarFilter Trace fix traceList trace.ratio value & Trace done. 2023-05-16 15:09:29 +08:00
chiayin 85ed1f84b7 Discover: SidebarFilter Trace Slider control to table and chart done. 2023-05-16 11:17:08 +08:00
chiayin 518842e112 Discover: SidebarFilter Trace table done. 2023-05-15 17:03:28 +08:00
chiayin 0c7765674c Discover: sidebarfilter slider control to chart done. 2023-05-15 16:08:00 +08:00
chiayin bd18b2c41d Discover: sideFilter Trace Slider done. 2023-05-12 11:13:35 +08:00
chiayin 9fd74b3858 Discover: sideFilter Funnel fix done. 2023-05-08 15:06:28 +08:00
chiayin ce5e5951b8 cypress-saveLogAndFilter: save filter & no save done. 2023-05-08 14:42:37 +08:00
chiayin 028c58c8ab cypress-saveLogAndFilter: save log done. 2023-05-08 12:51:36 +08:00
chiayin 7daac78bea cypress-saveLogAndFilter: select Activity & checked all event done. 2023-05-04 18:01:28 +08:00
chiayin 739718f3d5 cypress-saveLogAndFilter: post logine api done. 2023-05-04 14:56:45 +08:00
chiayin 162af24a2a Discover: fix filter's save done. 2023-05-03 13:25:18 +08:00
chiayin 51b56c0ccb fix Navbar. 2023-05-02 17:29:48 +08:00
chiayin c1df89fefb Discover: Filters Save done. 2023-05-02 17:02:05 +08:00
chiayin 378d6ea550 Discover: add Filter Funnel. 2023-04-28 19:57:26 +08:00
chiayin bf63d0aca4 Files: Filter files can enter Discover. 2023-04-28 11:29:21 +08:00
chiayin e142787832 Files: change file's icon come from Google front icon. 2023-04-28 09:27:28 +08:00
chiayin ab8708a597 Discover: Save button done. 2023-04-27 18:40:14 +08:00
chiayin b1161a82a7 Files: fix accessed_at. 2023-04-27 11:16:33 +08:00
chiayin cbde7b2d4c Discover: Fix SidebarFilter Funnel. 2023-04-25 10:47:59 +08:00
chiayin 280da0731d Discover: Fix SidebarFilter Funnel. 2023-04-24 17:48:29 +08:00
chiayin 0cff786e9a Discover: sidebarFilter toggle button done. 2023-04-24 12:30:29 +08:00
chiayin 3d5dba4c42 Discover: sidebarFilter Funnel button ApplyAll done. 2023-04-19 16:18:20 +08:00
chiayin 8f68e47c25 set vue-toast-notification css 2023-04-18 18:10:14 +08:00
290 changed files with 45199 additions and 9111 deletions
+15
View File
@@ -0,0 +1,15 @@
# The Lucia project.
# Copyright 2023-2026 DSP, inc. All rights reserved.
# Authors:
# chiayin.kuo@dsp.im (chiayin), 2023/1/31
# imacat.yang@dsp.im (imacat), 2026/3/6
#
# Default environment variables.
# Override in .env.local for local development.
# Backend API URL for the dev server proxy.
VUE_APP_API_URL = ""
# Custom Vite cache directory (default: node_modules/.vite).
# Set to /tmp/vite-cache for systemd deployment with PrivateTmp.
VITE_CACHE_DIR = ""
-20
View File
@@ -1,20 +0,0 @@
/* eslint-env node */
require("@rushstack/eslint-patch/modern-module-resolution");
module.exports = {
root: true,
extends: [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/eslint-config-prettier",
],
overrides: [
{
files: ["cypress/e2e/**/*.{cy,spec}.{js,ts,jsx,tsx}"],
extends: ["plugin:cypress/recommended"],
},
],
parserOptions: {
ecmaVersion: "latest",
},
};
+6 -1
View File
@@ -32,11 +32,16 @@ vscode
*.njsproj
*.sln
*.sw?
.claude
# local env files
.env.demo
.env.local
.env.*.local
# TypeDoc generated documentation
/docs
.scannerwork
sonar-project.properties
excludes
+145 -28
View File
@@ -1,57 +1,174 @@
# frontend
# The Lucia Project Frontend
This template should help get you started developing with Vue 3 in Vite.
The frontend of the Lucia project, a process mining platform for
analyzing, discovering, and comparing business process workflows.
## Recommended IDE Setup
Built with [Vue 3][vue], [Vite][vite], [Pinia][pinia],
and [Tailwind CSS][tailwind].
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
## Customize configuration
## Features
See [Vite Configuration Reference](https://vitejs.dev/config/).
- **Files** -- Upload, browse, and manage event log files (CSV).
- **Discover** -- Visualize process maps ([Cytoscape.js][cytoscape]),
analyze performance metrics ([Chart.js][chartjs]), and run
conformance checking against user-defined rules.
- **Compare** -- Side-by-side comparison of process maps and
dashboards.
- **Account Management** -- User account CRUD with role-based
access control.
## Project Setup
## Tech Stack
| Category | Technologies |
|----------|-------------|
| Framework | Vue 3.5, Vue Router 5, Pinia 3 |
| Build | Vite 7, TypeScript 5, Tailwind CSS 4 |
| UI | PrimeVue 4, PrimeIcons, SweetAlert2 |
| Visualization | Cytoscape.js (process maps), Chart.js (charts) |
| HTTP | Axios with JWT refresh token handling |
| Testing | Vitest 4 (unit/component), Cypress 15 (E2E) |
| Linting | ESLint, Prettier |
## Prerequisites
- [Node.js][nodejs] (v18 or later)
- npm
## Getting Started
### Install dependencies
```sh
npm install
npm ci
```
### Compile and Hot-Reload for Development
### Configure environment
Copy `.env` to `.env.local` and set the backend API URL:
```sh
cp .env .env.local
```
```dotenv
# .env.local
VUE_APP_API_URL = "http://localhost:8000"
```
The dev server proxies `/api` requests to this URL.
### Start development server
```sh
npm run dev
```
### Compile and Minify for Production
The app will be available at `http://localhost:58249`.
## Testing
### Run unit and component tests
```sh
npm run build
npx vitest run
```
### Run Unit Tests with [Vitest](https://vitest.dev/)
### Run E2E tests
```sh
npm run test:unit
```
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
```sh
npm run test:e2e:dev
```
This runs the end-to-end tests against the Vite development server.
It is much faster than the production build.
But it's still recommended to test the production build with `test:e2e` before deploying (e.g. in CI environments):
Build first, then run [Cypress][cypress] against the preview
server:
```sh
npm run build
npm run test:e2e
```
### Lint with [ESLint](https://eslint.org/)
For interactive E2E development with the Vite dev server:
```sh
npm run lint
npm run test:e2e:dev
```
## Documentation
Generate API documentation with [TypeDoc][typedoc]:
```sh
npm run docs
```
Output is in the `docs/` directory. Open `docs/index.html` in a
browser to view.
## Build for Production
```sh
npm run build
```
Output is in the `dist/` directory. Preview locally with:
```sh
npm run preview
```
## Project Structure
```
src/
├── api/ # Axios client with JWT interceptors
├── assets/ # CSS (Tailwind), static assets
├── components/ # Reusable Vue components
│ ├── Discover/ # Map, Conformance, Performance
│ ├── Compare/ # Comparison sidebar
│ └── File/ # Upload modal
├── module/ # Business logic (alerts, charts, sorting)
├── router/ # Vue Router configuration
├── stores/ # Pinia stores (state management)
├── utils/ # Utility functions (emitter, escaping)
└── views/ # Page-level route components
├── Discover/ # Map, Performance, Conformance
├── Compare/ # Dashboard, MapCompare
├── Files/ # File browser
├── Upload/ # File upload
└── Login/ # Authentication
```
## Copyright
Copyright 2022-2026 DSP, inc. All rights reserved.
This software is proprietary. You may obtain, use, copy, edit or
update this software with written agreements from DSP, inc.
## Authors
- Chia-Yin Kuo (chiayin.kuo@dsp.im)
- imacat (imacat.yang@dsp.im)
## Acknowledgments
Code quality improvements assisted by [Claude Code][claude-code].
[vue]: https://vuejs.org/
[vite]: https://vitejs.dev/
[pinia]: https://pinia.vuejs.org/
[tailwind]: https://tailwindcss.com/
[cytoscape]: https://js.cytoscape.org/
[chartjs]: https://www.chartjs.org/
[nodejs]: https://nodejs.org/
[cypress]: https://www.cypress.io/
[typedoc]: https://typedoc.org/
[claude-code]: https://claude.ai/claude-code
+18 -1
View File
@@ -1,8 +1,25 @@
/* eslint-env node */
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/1/31
// cindy.chang@dsp.im (Cindy Chang), 2024/8/12
// imacat.yang@dsp.im (imacat), 2026/3/5
/**
* @module cypress.config
* Cypress E2E test configuration with viewport
* settings and base URL.
*/
const { defineConfig } = require("cypress");
module.exports = defineConfig({
defaultCommandTimeout: 6000,
viewportWidth: 1280,
viewportHeight: 720,
e2e: {
baseUrl: "http://localhost:4173",
specPattern: "cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}",
},
includeShadowDom: true,
env: {},
});
+34
View File
@@ -0,0 +1,34 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Account Management", () => {
beforeEach(() => {
loginWithFixtures();
});
it("displays user list on account admin page", () => {
cy.visit("/account-admin");
cy.wait("@getUsers");
// Should display users from fixture
cy.contains("Test Admin").should("exist");
cy.contains("Alice Wang").should("exist");
cy.contains("Bob Chen").should("exist");
});
it("shows active/inactive status badges", () => {
cy.visit("/account-admin");
cy.wait("@getUsers");
// The user list should show status indicators
cy.contains("testadmin").should("exist");
});
it("navigates to my-account page", () => {
cy.visit("/my-account");
cy.wait("@getMyAccount");
cy.url().should("include", "/my-account");
});
});
@@ -0,0 +1,64 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/07/03
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../../support/intercept";
const MSG_ACCOUNT_NOT_UNIQUE = "Account has already been registered.";
describe("Account duplication check.", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("When an account already exists, show error message on confirm.", () => {
const testAccountName = "000000";
// First creation: account doesn't exist yet
cy.intercept("GET", "/api/users/000000", {
statusCode: 404,
body: { detail: "Not found" },
}).as("checkNewUser");
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type(testAccountName);
cy.get("#input_name_field").type(testAccountName);
cy.get("#input_first_pwd").type(testAccountName);
cy.get(".checkbox-and-text").first().find("div").first().click();
cy.contains("button", "Confirm")
.should("be.visible")
.and("be.enabled")
.click();
cy.wait("@postUser");
cy.contains("Account added").should("be.visible");
// Second creation: now account exists — override to return 200
cy.intercept("GET", "/api/users/000000", {
statusCode: 200,
body: {
username: "000000",
name: "000000",
is_admin: false,
is_active: true,
roles: [],
},
}).as("checkExistingUser");
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type(testAccountName);
cy.get("#input_name_field").type(testAccountName);
cy.get("#input_first_pwd").type(testAccountName);
cy.get(".checkbox-and-text").first().find("div").first().click();
cy.contains("button", "Confirm")
.should("be.visible")
.and("be.enabled")
.click();
cy.contains(MSG_ACCOUNT_NOT_UNIQUE).should("be.visible");
});
});
@@ -0,0 +1,36 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/07/02
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../../support/intercept";
describe("Password validation on create account.", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("When password is too short, confirm button stays disabled.", () => {
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type("unit-test-0001");
cy.get("#input_name_field").type("unit-test-0001");
// Password shorter than 6 characters
cy.get("#input_first_pwd").type("aaa");
cy.contains("button", "Confirm").should("be.disabled");
});
it("When password meets minimum length, confirm button enables.", () => {
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type("unit-test-0001");
cy.get("#input_name_field").type("unit-test-0001");
cy.get("#input_first_pwd").type("aaaaaa");
cy.contains("button", "Confirm").should("be.enabled");
});
});
@@ -0,0 +1,42 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/07/02
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../../support/intercept";
describe("Create an Account", () => {
beforeEach(() => {
loginWithFixtures();
// Override: new usernames should return 404 (account doesn't exist yet)
cy.intercept("GET", "/api/users/unit-test-*", {
statusCode: 404,
body: { detail: "Not found" },
}).as("checkNewUser");
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("Create a new account with admin role; should show saved message.", () => {
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type("unit-test-0001");
cy.get("#input_name_field").type("unit-test-0001");
cy.get("#input_first_pwd").type("aaaaaa");
cy.get(".checkbox-and-text").first().find("div").first().click();
cy.contains("button", "Confirm")
.should("be.visible")
.and("be.enabled")
.click();
cy.wait("@postUser");
cy.contains("Account added").should("be.visible");
});
it("Confirm button is disabled when required fields are empty.", () => {
cy.contains("button", "Create New").should("be.visible").click();
cy.get("#input_account_field").type("test");
cy.contains("button", "Confirm").should("be.disabled");
});
});
@@ -0,0 +1,30 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/07/03
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../../support/intercept";
describe("Delete an Account", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("Delete button opens confirmation modal and deletes on confirm.", () => {
cy.get("img.delete-account").first().click();
cy.contains("ARE YOU SURE TO DELETE").should("be.visible");
cy.get("#sure_to_delete_acct_btn").click();
cy.wait("@deleteUser");
cy.contains("Account deleted").should("be.visible");
});
it("Cancel button closes the delete confirmation modal.", () => {
cy.get("img.delete-account").first().click();
cy.contains("ARE YOU SURE TO DELETE").should("be.visible");
cy.get("#calcel_delete_acct_btn").click();
cy.contains("ARE YOU SURE TO DELETE").should("not.exist");
});
});
@@ -0,0 +1,32 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/07/03
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../../support/intercept";
const MODAL_TITLE_ACCOUNT_EDIT = "Account Edit";
const MSG_ACCOUNT_EDITED = "Saved";
describe("Edit an account", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("Edit an account; modify name and see saved message.", () => {
cy.get(".btn-edit").first().click();
cy.wait("@getUserDetail");
cy.contains("h1", MODAL_TITLE_ACCOUNT_EDIT).should("exist");
cy.get("#input_name_field").clear();
cy.get("#input_name_field").type("Updated Name");
cy.contains("button", "Confirm").should("be.visible").and("be.enabled");
cy.contains("button", "Confirm").click();
cy.wait("@putUser");
cy.contains(MSG_ACCOUNT_EDITED).should("be.visible");
});
});
+96
View File
@@ -0,0 +1,96 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Account Management CRUD", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("shows Create New button", () => {
cy.get("#create_new_acct_btn").should("exist");
cy.get("#create_new_acct_btn").should("contain", "Create New");
});
it("opens create new account modal", () => {
cy.get("#create_new_acct_btn").click();
cy.get("#modal_container").should("be.visible");
cy.get("#modal_account_edit_or_create_new").should("be.visible");
// Should show account, name, password fields
cy.get("#input_account_field").should("exist");
cy.get("#input_name_field").should("exist");
cy.get("#input_first_pwd").should("exist");
});
it("create account confirm is disabled when fields are empty", () => {
cy.get("#create_new_acct_btn").click();
cy.get(".confirm-btn").should("be.disabled");
});
it("create account confirm enables when fields are filled", () => {
cy.get("#create_new_acct_btn").click();
cy.get("#input_account_field").type("newuser");
cy.get("#input_name_field").type("New User");
cy.get("#input_first_pwd").type("password1234");
cy.get(".confirm-btn").should("not.be.disabled");
});
it("cancel button closes the modal", () => {
cy.get("#create_new_acct_btn").click();
cy.get("#modal_container").should("be.visible");
cy.get(".cancel-btn").click();
cy.get("#modal_container").should("not.exist");
});
it("close (X) button closes the modal", () => {
cy.get("#create_new_acct_btn").click();
cy.get("#modal_container").should("be.visible");
cy.get('img[alt="X"]').click();
cy.get("#modal_container").should("not.exist");
});
it("double-click username opens account info modal", () => {
// Double-click on the first account username
cy.get(".account-cell").first().dblclick();
cy.get("#modal_container").should("be.visible");
});
it("delete button opens delete confirmation modal", () => {
// Click the delete icon for a non-current user
cy.get(".delete-account").first().click();
cy.get("#modal_container").should("be.visible");
cy.get("#modal_delete_acct_alert").should("be.visible");
});
it("delete modal has Yes and No buttons", () => {
cy.get(".delete-account").first().click();
cy.get("#calcel_delete_acct_btn").should("exist");
cy.get("#sure_to_delete_acct_btn").should("exist");
});
it("delete modal No button closes the modal", () => {
cy.get(".delete-account").first().click();
cy.get("#calcel_delete_acct_btn").click();
cy.get("#modal_container").should("not.exist");
});
it("shows checkboxes for Set as Admin and Activate in create modal", () => {
cy.get("#create_new_acct_btn").click();
cy.get("#account_create_checkboxes_section").should("be.visible");
cy.contains("Set as admin.").should("exist");
cy.contains("Activate now.").should("exist");
});
it("search bar filters user list", () => {
// Search filters by username, not display name
cy.get("#input_search").type("user1");
cy.get('img[alt="search"]').click();
// Should only show user1 (Alice Wang)
cy.contains("user1").should("exist");
});
});
+40
View File
@@ -0,0 +1,40 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Account Info Modal", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("double-click username opens info modal with user data", () => {
cy.get(".account-cell").first().dblclick();
cy.get("#modal_container").should("be.visible");
cy.get("#acct_info_user_name").should("exist");
});
it("info modal shows Account Information header", () => {
cy.get(".account-cell").first().dblclick();
cy.get("#modal_container").should("be.visible");
cy.contains("Account Information").should("exist");
});
it("info modal shows account visit info", () => {
cy.get(".account-cell").first().dblclick();
cy.get("#modal_container").should("be.visible");
cy.get("#account_visit_info").should("exist");
cy.get("#account_visit_info").should("contain", "Account:");
});
it("info modal can be closed via X button", () => {
cy.get(".account-cell").first().dblclick();
cy.get("#modal_container").should("be.visible");
cy.get('img[alt="X"]').click();
cy.get("#modal_container").should("not.exist");
});
});
+90
View File
@@ -0,0 +1,90 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2024/02/22
// cindy.chang@dsp.im (Cindy Chang), 2024/05/30
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Compare", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
cy.contains("li", "COMPARE").click();
});
it("Compare dropdown sorting options", () => {
const expectedOptions = [
"By File Name (A to Z)",
"By File Name (Z to A)",
"By Dependency (A to Z)",
"By Dependency (Z to A)",
"By File Type (A to Z)",
"By File Type (Z to A)",
"By Last Update (A to Z)",
"By Last Update (Z to A)",
];
cy.get(".p-select").click();
cy.get(".p-select-list")
.find(".p-select-option")
.then(($options) => {
const actualOptions = $options
.map((index, elem) =>
Cypress.$(elem).find(".p-select-option-label").text(),
)
.get();
expect(actualOptions).to.deep.equal(expectedOptions);
});
});
it("Grid cards are rendered for compare file selection", () => {
cy.get("#compareGridCards").find("li").should("have.length.greaterThan", 0);
});
it("Compare button is disabled until two files are dragged", () => {
cy.contains("button", "Compare").should("be.disabled");
cy.get("#compareFile0").drag("#primaryDragCard");
cy.get("#compareFile1").drag("#secondaryDragCard");
cy.contains("button", "Compare").should("be.enabled");
});
it("Enter Compare dashboard and see charts", () => {
cy.get("#compareFile0").drag("#primaryDragCard");
cy.get("#compareFile1").drag("#secondaryDragCard");
cy.contains("button", "Compare").click();
cy.wait("@getCompare");
cy.url().should("include", "compare");
// Assert chart title spans are visible
cy.contains("span", "Average Cycle Time").should("exist");
cy.contains("span", "Cycle Efficiency").should("exist");
cy.contains("span", "Average Processing Time").should("exist");
cy.contains("span", "Average Processing Time by Activity").should("exist");
cy.contains("span", "Average Waiting Time").should("exist");
cy.contains("span", "Average Waiting Time between Activity").should(
"exist",
);
});
it("Compare State button exists on dashboard", () => {
cy.get("#compareFile0").drag("#primaryDragCard");
cy.get("#compareFile1").drag("#secondaryDragCard");
cy.contains("button", "Compare").click();
cy.wait("@getCompare");
cy.get("#compareState").should("exist").and("be.visible");
});
it("Sidebar shows time usage and frequency sections", () => {
cy.get("#compareFile0").drag("#primaryDragCard");
cy.get("#compareFile1").drag("#secondaryDragCard");
cy.contains("button", "Compare").click();
cy.wait("@getCompare");
cy.get("aside").should("exist");
cy.get("aside li").should("have.length.greaterThan", 0);
});
});
+55
View File
@@ -0,0 +1,55 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Discover Conformance Page", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/discover/log/297310264/conformance");
cy.wait("@getLogCheckParams");
});
it("page loads and loading overlay disappears", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
});
it("displays Rule Settings sidebar", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Rule Settings").should("be.visible");
});
it("displays Conformance Checking Results heading", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Conformance Checking Results").should("be.visible");
});
it("displays rule type radio options", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Have activity").should("be.visible");
cy.contains("Activity sequence").should("be.visible");
cy.contains("Activity duration").should("be.visible");
cy.contains("Processing time").should("be.visible");
cy.contains("Waiting time").should("be.visible");
cy.contains("Cycle time").should("be.visible");
});
it("displays Clear and Apply buttons", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("button", "Clear").should("be.visible");
cy.contains("button", "Apply").should("exist");
});
it("displays Activity list area", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Activity list").should("be.visible");
});
it("displays default placeholder values in results", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Conformance Rate").should("be.visible");
cy.contains("Cases").should("be.visible");
});
});
+55
View File
@@ -0,0 +1,55 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Discover Map Page", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/discover/log/297310264/map");
cy.wait("@getDiscover");
});
it("page loads and cytoscape container exists", () => {
cy.get("#cy").should("exist");
});
it("displays left sidebar buttons", () => {
// Visualization Setting, Filter, Traces buttons
cy.get(".material-symbols-outlined")
.contains("track_changes")
.should("exist");
cy.get(".material-symbols-outlined").contains("tornado").should("exist");
cy.get(".material-symbols-outlined").contains("rebase").should("exist");
});
it("displays right sidebar Summary button", () => {
cy.get("#sidebar_state").should("exist");
cy.get("#iconState").should("exist");
});
it("clicking Visualization Setting button toggles sidebar", () => {
// Click the track_changes icon (Visualization Setting)
cy.contains("span.material-symbols-outlined", "track_changes")
.parent("li")
.click();
// SidebarView should open
cy.contains("Visualization Setting").should("be.visible");
});
it("clicking Summary button toggles sidebar", () => {
cy.get("#iconState").click();
// SidebarState should open with insights/stats
cy.contains("Summary").should("be.visible");
});
it("clicking Traces button toggles sidebar", () => {
cy.contains("span.material-symbols-outlined", "rebase")
.parent("li")
.click();
// SidebarTraces should open
cy.contains("Traces").should("be.visible");
});
});
+66
View File
@@ -0,0 +1,66 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Discover Performance Page", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/discover/log/297310264/performance");
cy.wait("@getPerformance");
});
it("page loads and loading overlay disappears", () => {
// Loading overlay should not be visible after data loads
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
});
it("displays Time Usage sidebar section", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Time Usage").should("be.visible");
});
it("displays Frequency sidebar section", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Frequency").should("be.visible");
});
it("displays sidebar navigation items", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Cycle Time & Efficiency").should("be.visible");
cy.contains("Processing Time").should("be.visible");
cy.contains("Waiting Time").should("be.visible");
cy.contains("Number of Cases").should("be.visible");
});
it("displays chart titles", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Average Cycle Time").should("be.visible");
cy.contains("Cycle Efficiency").should("be.visible");
cy.contains("Average Processing Time").should("be.visible");
cy.contains("Average Processing Time by Activity").should("be.visible");
cy.contains("Average Waiting Time").should("be.visible");
});
it("displays frequency chart titles", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("New Cases").should("be.visible");
cy.contains("Number of Cases by Activity").should("be.visible");
});
it("renders canvas elements for charts", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
// Chart.js renders into canvas elements
cy.get("canvas").should("have.length.at.least", 5);
});
it("sidebar navigation scrolls to section", () => {
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
// Click on "Waiting Time" in sidebar
cy.contains("li", "Waiting Time").click();
// The Waiting Time section should be in view
cy.get("#waitingTime").should("exist");
});
});
+94
View File
@@ -0,0 +1,94 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Discover Tab Navigation", () => {
beforeEach(() => {
loginWithFixtures();
});
describe("navigating from Map page", () => {
beforeEach(() => {
cy.visit("/discover/log/297310264/map");
cy.wait("@getDiscover");
});
it("shows DISCOVER heading and MAP/CONFORMANCE/PERFORMANCE tabs", () => {
cy.get("#nav_bar").contains("DISCOVER").should("be.visible");
cy.get(".nav-item").should("have.length", 3);
cy.get(".nav-item").eq(0).should("contain", "MAP");
cy.get(".nav-item").eq(1).should("contain", "CONFORMANCE");
cy.get(".nav-item").eq(2).should("contain", "PERFORMANCE");
});
it("clicking PERFORMANCE tab navigates to performance page", () => {
cy.get(".nav-item").contains("PERFORMANCE").click();
cy.url().should("include", "/performance");
cy.wait("@getPerformance");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Time Usage").should("be.visible");
});
it("clicking CONFORMANCE tab navigates to conformance page", () => {
cy.get(".nav-item").contains("CONFORMANCE").click();
cy.url().should("include", "/conformance");
cy.wait("@getLogCheckParams");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Rule Settings").should("be.visible");
});
it("shows back arrow to return to Files", () => {
cy.get("#backPage").should("exist");
cy.get("#backPage").should("have.attr", "href", "/files");
});
});
describe("navigating from Performance page", () => {
beforeEach(() => {
cy.visit("/discover/log/297310264/performance");
cy.wait("@getPerformance");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
});
it("clicking MAP tab navigates to map page", () => {
cy.get(".nav-item").contains("MAP").click();
cy.url().should("include", "/map");
cy.wait("@getDiscover");
cy.get("#cy").should("exist");
});
it("clicking CONFORMANCE tab navigates to conformance page", () => {
cy.get(".nav-item").contains("CONFORMANCE").click();
cy.url().should("include", "/conformance");
cy.wait("@getLogCheckParams");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Rule Settings").should("be.visible");
});
});
describe("navigating from Conformance page", () => {
beforeEach(() => {
cy.visit("/discover/log/297310264/conformance");
cy.wait("@getLogCheckParams");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
});
it("clicking MAP tab navigates to map page", () => {
cy.get(".nav-item").contains("MAP").click();
cy.url().should("include", "/map");
cy.wait("@getDiscover");
cy.get("#cy").should("exist");
});
it("clicking PERFORMANCE tab navigates to performance page", () => {
cy.get(".nav-item").contains("PERFORMANCE").click();
cy.url().should("include", "/performance");
cy.wait("@getPerformance");
cy.get(String.raw`.z-\[9999\]`, { timeout: 10000 }).should("not.exist");
cy.contains("Time Usage").should("be.visible");
});
});
});
+94
View File
@@ -0,0 +1,94 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Edge Cases", () => {
describe("Empty states", () => {
it("files page handles empty file list", () => {
loginWithFixtures();
// Override files intercept with empty array
cy.intercept("GET", "/api/files", {
statusCode: 200,
body: [],
}).as("getEmptyFiles");
cy.visit("/files");
cy.wait("@getEmptyFiles");
// Table should exist but have no file data
cy.get("table").should("exist");
cy.contains("sample-process.xes").should("not.exist");
});
it("account admin handles empty user list", () => {
loginWithFixtures();
cy.intercept("GET", "/api/users", {
statusCode: 200,
body: [],
}).as("getEmptyUsers");
cy.visit("/account-admin");
cy.wait("@getEmptyUsers");
// Create New button should still work
cy.get("#create_new_acct_btn").should("exist");
});
});
describe("Authentication guard", () => {
it("unauthenticated user is redirected to login", () => {
// No loginWithFixtures - not logged in
cy.visit("/files");
cy.url().should("include", "/login");
});
it("unauthenticated user cannot access account-admin", () => {
cy.visit("/account-admin");
cy.url().should("include", "/login");
});
it("unauthenticated user cannot access my-account", () => {
cy.visit("/my-account");
cy.url().should("include", "/login");
});
});
describe("Login validation", () => {
it("shows error on failed login", () => {
cy.intercept("POST", "/api/oauth/token", {
statusCode: 401,
body: { detail: "Invalid credentials" },
}).as("failedLogin");
cy.visit("/login");
cy.get("#account").type("wrong");
cy.get("#password").type("wrong");
cy.get("form").submit();
cy.wait("@failedLogin");
// Should stay on login page
cy.url().should("include", "/login");
});
});
describe("Account creation validation", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
cy.get("#create_new_acct_btn").click();
});
it("confirm stays disabled with only account field filled", () => {
cy.get("#input_account_field").type("newuser");
cy.get(".confirm-btn").should("be.disabled");
});
it("confirm stays disabled with only name field filled", () => {
cy.get("#input_name_field").type("New User");
cy.get(".confirm-btn").should("be.disabled");
});
it("confirm stays disabled with only password field filled", () => {
cy.get("#input_first_pwd").type("password1234");
cy.get(".confirm-btn").should("be.disabled");
});
});
});
+74
View File
@@ -0,0 +1,74 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("File Operations", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
});
it("file list table has sortable columns", () => {
// Check that table headers exist with expected columns
cy.get("table").within(() => {
cy.contains("th", "Name").should("exist");
cy.contains("th", "Dependency").should("exist");
cy.contains("th", "File Type").should("exist");
cy.contains("th", "Owner").should("exist");
cy.contains("th", "Last Update").should("exist");
});
});
it("clicking column header sorts the table", () => {
// Click "Name" header to sort
cy.contains("th", "Name").click();
// After sorting, table should still have data
cy.get("table tbody tr").should("have.length.greaterThan", 0);
});
it("table rows show file data from fixture", () => {
cy.get("table tbody").within(() => {
cy.contains("sample-process.xes").should("exist");
cy.contains("filtered-sample").should("exist");
cy.contains("production-log.csv").should("exist");
});
});
it("table shows owner names", () => {
cy.get("table tbody").within(() => {
cy.contains("Test Admin").should("exist");
cy.contains("Alice Wang").should("exist");
});
});
it("table shows file types", () => {
cy.get("table tbody").within(() => {
cy.contains("log").should("exist");
});
});
it("right-click on file row shows context menu", () => {
// PrimeVue DataTable with contextmenu
cy.get("table tbody tr").first().rightclick();
// Context menu behavior depends on implementation
// Just verify the right-click doesn't break anything
cy.get("table tbody tr").should("have.length.greaterThan", 0);
});
it("grid view shows file cards", () => {
// Switch to grid view
cy.get("svg").parent("li.cursor-pointer").last().click();
// Grid cards should be visible
cy.get("li[title]").should("have.length.greaterThan", 0);
});
it("Import button opens upload modal", () => {
cy.get("#import_btn").click();
// Upload modal should appear
cy.get("#import_btn").should("exist");
});
});
+60
View File
@@ -0,0 +1,60 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Files Page", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
});
it("displays the file list after login", () => {
cy.wait("@getFiles");
cy.contains("h2", "All Files").should("exist");
// Should display file names from fixture
cy.contains("sample-process.xes").should("exist");
cy.contains("filtered-sample").should("exist");
cy.contains("production-log.csv").should("exist");
});
it("shows Recently Used section", () => {
cy.wait("@getFiles");
cy.contains("h2", "Recently Used").should("exist");
});
it("switches to DISCOVER tab", () => {
cy.wait("@getFiles");
cy.contains(".nav-item", "DISCOVER").click();
// DISCOVER tab shows filtered file types
cy.contains("h2", "All Files").should("exist");
});
it("switches to COMPARE tab and shows drag zones", () => {
cy.wait("@getFiles");
cy.contains(".nav-item", "COMPARE").click();
cy.contains("Performance Comparison").should("exist");
cy.contains("Drag and drop a file here").should("exist");
});
it("shows Import button on FILES tab", () => {
cy.wait("@getFiles");
cy.get("#import_btn").should("contain", "Import");
});
it("can switch between list and grid view", () => {
cy.wait("@getFiles");
// DataTable (list view) should be visible by default
cy.get("table").should("exist");
});
it("double-click file navigates to discover page", () => {
cy.wait("@getFiles");
// Double-click the first file row in the table
// The actual route depends on file type (log→map, log-check→conformance, etc.)
cy.get("table tbody tr").first().dblclick();
cy.url().should("include", "/discover");
});
});
+49
View File
@@ -0,0 +1,49 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Files Page - COMPARE Tab", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
// Switch to COMPARE tab
cy.contains("li", "COMPARE").click();
});
it("shows Performance Comparison heading", () => {
cy.contains("h2", "Performance Comparison").should("be.visible");
});
it("shows two drag-and-drop slots", () => {
cy.get("#primaryDragCard").should("exist");
cy.get("#secondaryDragCard").should("exist");
});
it("drag slots show placeholder text", () => {
cy.get("#primaryDragCard").should("contain", "Drag and drop a file here");
cy.get("#secondaryDragCard").should("contain", "Drag and drop a file here");
});
it("Compare button is disabled when no files are dragged", () => {
cy.contains("button", "Compare").should("be.disabled");
});
it("shows sorting dropdown", () => {
cy.get(".p-select").should("exist");
});
it("grid cards display file names", () => {
cy.get("#compareGridCards").should("exist");
cy.get("#compareGridCards li").should("have.length.greaterThan", 0);
});
it("clicking sorting dropdown shows sort options", () => {
cy.get(".p-select").click();
cy.get(".p-select-list").should("be.visible");
cy.contains(".p-select-option", "By File Name").should("exist");
});
});
+72
View File
@@ -0,0 +1,72 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Files to Discover Entry Flow", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
});
describe("double-click table row to enter Discover", () => {
it("double-click log file navigates to Map page", () => {
// Target the Name column (has class .fileName) to avoid matching Dependency column
cy.contains("td.fileName", "sample-process.xes").parent("tr").dblclick();
cy.url().should("include", "/discover/log/1/map");
cy.wait("@getDiscover");
cy.get("#cy").should("exist");
});
it("double-click filter file navigates to Map page", () => {
cy.contains("td.fileName", "filtered-sample").parent("tr").dblclick();
cy.url().should("include", "/discover/filter/10/map");
cy.wait("@getFilterDiscover");
cy.get("#cy").should("exist");
});
});
describe("double-click grid card to enter Discover", () => {
beforeEach(() => {
// Switch to grid view
cy.get("svg").parent("li.cursor-pointer").last().click();
});
it("double-click log file grid card navigates to Map page", () => {
// Use last() to target the All Files grid section (not Recently Used)
cy.get('li[title="sample-process.xes"]').last().dblclick();
cy.url().should("include", "/discover/log/1/map");
cy.wait("@getDiscover");
cy.get("#cy").should("exist");
});
});
describe("DISCOVER tab filters files", () => {
it("clicking DISCOVER tab shows only Log, Filter, and Rule files", () => {
cy.get(".nav-item").contains("DISCOVER").click();
cy.contains("td.fileName", "sample-process.xes").should("exist");
cy.contains("td.fileName", "filtered-sample").should("exist");
cy.contains("td.fileName", "conformance-check-1").should("exist");
});
});
describe("Navbar state after entering Discover", () => {
it("shows DISCOVER heading and tabs after entering from Files", () => {
cy.contains("td.fileName", "sample-process.xes").parent("tr").dblclick();
cy.url().should("include", "/discover/");
cy.get("#nav_bar").contains("DISCOVER").should("be.visible");
cy.get(".nav-item").contains("MAP").should("exist");
cy.get(".nav-item").contains("CONFORMANCE").should("exist");
cy.get(".nav-item").contains("PERFORMANCE").should("exist");
});
it("shows back arrow pointing to /files", () => {
cy.contains("td.fileName", "sample-process.xes").parent("tr").dblclick();
cy.url().should("include", "/discover/");
cy.get("#backPage").should("have.attr", "href", "/files");
});
});
});
+6 -1
View File
@@ -4,5 +4,10 @@
"lib": ["es5", "dom"],
"types": ["cypress"]
},
"include": ["./**/*", "../support/**/*"]
"include": [
"./**/*",
"../support/**/*",
"/node_modules/cypress",
"cypress/**/*.js",],
"experimentalShadowDomSupport": true
}
+76
View File
@@ -0,0 +1,76 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { setupApiIntercepts } from "../support/intercept";
describe("Login Flow", () => {
beforeEach(() => {
setupApiIntercepts();
});
it("renders the login form", () => {
cy.visit("/login");
cy.get("h2").should("contain", "LOGIN");
cy.get("#account").should("exist");
cy.get("#password").should("exist");
cy.get("#login_btn_main_btn").should("be.disabled");
});
it("login button is disabled when fields are empty", () => {
cy.visit("/login");
cy.get("#login_btn_main_btn").should("be.disabled");
// Only username filled — still disabled
cy.get("#account").type("testuser");
cy.get("#login_btn_main_btn").should("be.disabled");
});
it("login button enables when both fields are filled", () => {
cy.visit("/login");
cy.get("#account").type("testadmin");
cy.get("#password").type("password123");
cy.get("#login_btn_main_btn").should("not.be.disabled");
});
it("successful login redirects to /files", () => {
cy.visit("/login");
cy.get("#account").type("testadmin");
cy.get("#password").type("password123");
cy.get("#login_btn_main_btn").click();
cy.wait("@postToken");
cy.url().should("include", "/files");
});
it("failed login shows error message", () => {
// Override the token intercept to return 401
cy.intercept("POST", "/api/oauth/token", {
statusCode: 401,
body: { detail: "Incorrect username or password" },
}).as("postTokenFail");
cy.visit("/login");
cy.get("#account").type("wronguser");
cy.get("#password").type("wrongpass");
cy.get("#login_btn_main_btn").click();
cy.wait("@postTokenFail");
cy.contains("Incorrect account or password").should("be.visible");
});
it("toggles password visibility", () => {
cy.visit("/login");
cy.get("#password").type("secret123");
cy.get("#password").should("have.attr", "type", "password");
// Click the eye icon to show password
cy.get('label[for="passwordt"] span.cursor-pointer').click();
cy.get("#password").should("have.attr", "type", "text");
// Click again to hide
cy.get('label[for="passwordt"] span.cursor-pointer').click();
cy.get("#password").should("have.attr", "type", "password");
});
});
-44
View File
@@ -1,44 +0,0 @@
// 之後要優化: 每一個測試步驟要分開寫,不寫在同一個 it 裡面、將測試寫成 report 輸出成 html(嘗試)、功能模組化
const baseUrl = Cypress.env('baseUrl');
describe("Login to Logout", () => {
before(() => {
cy.visit(baseUrl); // 測試可否進入網站
cy.contains("h2", "LOGIN"); // 是否轉址到 /login 並顯示畫面
cy.url().should('include', 'login') // url path 要有 'Login',確定進入 login page
})
it("test login success and error", () => {
// 驗證帳密是否刪除前後空白、錯誤帳密是否顯示驗證、Button display
cy.fixture('users/id-not-exists').then(({username, password}) => {
cy.get('.btn-lg').should('be.disabled');
cy.get('#account').should('have.focus').type(username);
cy.get('.btn-lg').should('be.disabled');
cy.get('#password').type(password);
cy.get('.btn-lg').click();
cy.get('#account').should('have.value', 'test');
cy.get('#password').should('have.value', 'test');
cy.get('form').submit();
cy.contains("p", "Incorrect account or password.");
cy.url().should('include', 'login');
});
// 正確帳密登入
cy.get('#account').clear().type(` ${Cypress.env('user').username} `);
cy.get('#password').clear().type(` ${Cypress.env('user').password} `);
cy.get('.btn-lg').click();
cy.get('#account').should('have.value', Cypress.env('user').username);
cy.get('#password').should('have.value', Cypress.env('user').password);
cy.get('form').submit(); // 選取 form 表單並發送
// 轉址到 files 頁
cy.url().should('include', 'files');
cy.get('a #iconMember').scrollIntoView().click();
// 轉址到會員頁
cy.url().should('include', 'member-area');
// 登出
cy.get('.btn-sm').contains('log out').click();
});
});
+67
View File
@@ -0,0 +1,67 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Logout Flow", () => {
beforeEach(() => {
loginWithFixtures();
});
it("shows account menu when head icon is clicked", () => {
cy.visit("/files");
cy.wait("@getFiles");
// Click the head icon to open account menu
cy.get("#acct_mgmt_button").click();
cy.get("#account_menu").should("be.visible");
cy.get("#greeting").should("contain", "Test Admin");
});
it("account menu shows admin management link for admin user", () => {
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#acct_mgmt_button").click();
cy.get("#account_menu").should("be.visible");
// Admin user should see account management option
cy.get("#btn_acct_mgmt").should("exist");
});
it("account menu has logout button", () => {
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#acct_mgmt_button").click();
cy.get("#btn_logout_in_menu").should("exist");
});
it("clicking My Account navigates to /my-account", () => {
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#acct_mgmt_button").click();
cy.get("#btn_mang_ur_acct").click();
cy.url().should("include", "/my-account");
});
it("clicking Account Management navigates to /account-admin", () => {
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#acct_mgmt_button").click();
cy.get("#btn_acct_mgmt").click();
cy.url().should("include", "/account-admin");
});
it("logout redirects to login page", () => {
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#acct_mgmt_button").click();
cy.get("#btn_logout_in_menu").click();
cy.url().should("include", "/login");
});
});
+73
View File
@@ -0,0 +1,73 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("My Account Page", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/my-account");
cy.wait("@getUserDetail");
});
it("displays user name heading", () => {
cy.get("#general_acct_info_user_name").should("exist");
cy.get("#general_acct_info_user_name").should("contain", "Test Admin");
});
it("shows Admin badge for admin user", () => {
cy.contains("Admin").should("exist");
});
it("shows visit count info", () => {
cy.get("#general_account_visit_info").should("exist");
cy.get("#general_account_visit_info").should("contain", "Total visits");
});
it("displays account username (read-only)", () => {
cy.contains("Test Admin").should("exist");
});
it("shows Edit button for name field", () => {
cy.contains("button", "Edit").should("exist");
});
it("clicking Edit shows input field and Save/Cancel buttons", () => {
cy.contains("button", "Edit").first().click();
cy.get("#input_name_field").should("exist");
cy.contains("button", "Save").should("exist");
cy.contains("button", "Cancel").should("exist");
});
it("clicking Cancel reverts name field to read-only", () => {
cy.contains("button", "Edit").first().click();
cy.get("#input_name_field").should("exist");
cy.contains("button", "Cancel").click();
cy.get("#input_name_field").should("not.exist");
});
it("shows Reset button for password field", () => {
cy.contains("button", "Reset").should("exist");
});
it("clicking Reset shows password input and Save/Cancel", () => {
cy.contains("button", "Reset").click();
cy.get('input[type="password"]').should("exist");
cy.contains("button", "Save").should("exist");
cy.contains("button", "Cancel").should("exist");
});
it("clicking Cancel on password field hides the input", () => {
cy.contains("button", "Reset").click();
cy.get('input[type="password"]').should("exist");
// The Cancel button for password is the second one
cy.get(".cancel-btn").click();
cy.get('input[type="password"]').should("not.exist");
});
it("shows Session section", () => {
cy.contains("Session").should("exist");
});
});
+62
View File
@@ -0,0 +1,62 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures, setupApiIntercepts } from "../support/intercept";
describe("Navigation and Routing", () => {
it("redirects / to /files when logged in", () => {
loginWithFixtures();
cy.visit("/");
cy.url().should("include", "/files");
});
it("shows 404 page for unknown routes", () => {
loginWithFixtures();
cy.visit("/nonexistent-page");
cy.contains("404").should("exist");
});
it("navbar shows correct view name", () => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
cy.get("#nav_bar").should("exist");
cy.get("#nav_bar h2").should("contain", "FILES");
});
it("navbar shows back arrow on non-files pages", () => {
loginWithFixtures();
cy.visit("/discover/log/1/map");
// Back arrow should be visible on discover pages
cy.get("#backPage").should("exist");
});
it("navbar tabs are clickable on discover page", () => {
loginWithFixtures();
cy.visit("/discover/log/1/map");
// Discover navbar should show MAP, CONFORMANCE, PERFORMANCE tabs
cy.contains(".nav-item", "MAP").should("exist");
cy.contains(".nav-item", "CONFORMANCE").should("exist");
cy.contains(".nav-item", "PERFORMANCE").should("exist");
// Click CONFORMANCE tab
cy.contains(".nav-item", "CONFORMANCE").click();
cy.url().should("include", "/conformance");
// Click PERFORMANCE tab
cy.contains(".nav-item", "PERFORMANCE").click();
cy.url().should("include", "/performance");
// Click MAP tab to go back
cy.contains(".nav-item", "MAP").click();
cy.url().should("include", "/map");
});
it("login page is accessible at /login", () => {
setupApiIntercepts();
cy.visit("/login");
cy.get("h2").should("contain", "LOGIN");
});
});
+36
View File
@@ -0,0 +1,36 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("404 Not Found Page", () => {
it("displays 404 page for non-existent route", () => {
loginWithFixtures();
cy.visit("/this-page-does-not-exist");
cy.contains("404").should("be.visible");
cy.contains("The page you are looking for does not exist.").should(
"be.visible",
);
});
it("has a link back to Files page", () => {
loginWithFixtures();
cy.visit("/some/random/path");
cy.contains("a", "Go to Files")
.should("be.visible")
.should("have.attr", "href", "/files");
});
it("displays 404 for unauthenticated user on invalid route", () => {
cy.visit("/not-a-real-page");
cy.url().then((url) => {
if (url.includes("/login")) {
cy.url().should("include", "/login");
} else {
cy.contains("404").should("be.visible");
}
});
});
});
+38
View File
@@ -0,0 +1,38 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/06/03
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("Discover page navigation tabs", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
});
it("Double-clicking a log file enters the MAP page.", () => {
cy.contains("td.fileName", "sample-process.xes").dblclick();
cy.url().should("include", "map");
// MAP tab should exist in the navbar
cy.contains(".nav-item", "MAP").should("exist");
});
it("Clicking CONFORMANCE tab switches active page.", () => {
cy.contains("td.fileName", "sample-process.xes").dblclick();
cy.url().should("include", "map");
cy.contains(".nav-item", "CONFORMANCE").click();
cy.url().should("include", "conformance");
cy.contains(".nav-item", "CONFORMANCE").should("have.class", "active");
});
it("Clicking PERFORMANCE tab switches active page.", () => {
cy.contains("td.fileName", "sample-process.xes").dblclick();
cy.url().should("include", "map");
cy.contains(".nav-item", "PERFORMANCE").click();
cy.url().should("include", "performance");
cy.contains(".nav-item", "PERFORMANCE").should("have.class", "active");
});
});
+58
View File
@@ -0,0 +1,58 @@
// The Lucia project.
// Copyright 2024-2026 DSP, inc. All rights reserved.
// Authors:
// cindy.chang@dsp.im (Cindy Chang), 2024/06/11
// imacat.yang@dsp.im (imacat), 2026/03/05
import { setupApiIntercepts } from "../support/intercept";
describe("Paste URL login redirect", () => {
it("After login with return-to param, redirects to the remembered page", () => {
setupApiIntercepts();
// Visit login page with a return-to query param (base64-encoded URL)
const targetUrl =
"http://localhost:4173/discover/conformance/log/1/conformance";
const encodedUrl = btoa(targetUrl);
cy.visit(`/login?return-to=${encodedUrl}`);
// Fill in login form
cy.get("#account").type("testadmin");
cy.get("#password").type("password123");
cy.get("form").submit();
cy.wait("@postToken");
// After login, the app should attempt to redirect to the return-to URL.
// Since window.location.href is used (not router.push), we verify the
// login form disappears and the token cookie is set.
cy.getCookie("luciaToken").should("exist");
});
it("Login without return-to param redirects to /files", () => {
setupApiIntercepts();
cy.visit("/login");
cy.get("#account").type("testadmin");
cy.get("#password").type("password123");
cy.get("form").submit();
cy.wait("@postToken");
cy.url().should("include", "/files");
});
it("Unauthenticated user cannot access inner pages", () => {
setupApiIntercepts();
// Override my-account to return 401 (simulate logged-out state)
cy.intercept("GET", "/api/my-account", {
statusCode: 401,
body: { detail: "Not authenticated" },
}).as("getMyAccountUnauth");
cy.visit("/files");
// Should be redirected to login page
cy.url().should("include", "/login");
cy.get("#account").should("exist");
cy.get("#password").should("exist");
});
});
+116
View File
@@ -0,0 +1,116 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
import { loginWithFixtures } from "../support/intercept";
describe("SweetAlert2 Modals", () => {
describe("File Context Menu - Rename", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
});
it("right-click on table row shows context menu with Rename", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Rename").should("be.visible");
});
it("right-click context menu shows Download option", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Download").should("be.visible");
});
it("right-click context menu shows Delete option", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Delete").should("be.visible");
});
it("clicking Rename opens SweetAlert rename dialog", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Rename").click();
// SweetAlert popup should appear with RENAME title
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-title").should("contain", "RENAME");
cy.get(".swal2-input").should("exist");
});
it("rename dialog has pre-filled file name", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Rename").click();
cy.get(".swal2-input").should("not.have.value", "");
});
it("rename dialog can be cancelled", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Rename").click();
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-cancel").click();
cy.get(".swal2-popup").should("not.exist");
});
it("clicking Delete opens SweetAlert delete confirmation", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Delete").click();
// SweetAlert popup should appear with CONFIRM DELETION
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-title").should("contain", "CONFIRM DELETION");
});
it("delete confirmation shows file name", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Delete").click();
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-html-container").should("contain", "delete");
});
it("delete confirmation can be cancelled", () => {
cy.get("table tbody tr").first().rightclick();
cy.contains("Delete").click();
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-cancel").click();
cy.get(".swal2-popup").should("not.exist");
});
});
describe("File Context Menu on Grid View", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/files");
cy.wait("@getFiles");
// Switch to grid view
cy.get("svg").parent("li.cursor-pointer").last().click();
});
it("right-click on grid card shows context menu", () => {
cy.get("li[title]").first().rightclick();
cy.contains("Rename").should("be.visible");
cy.contains("Delete").should("be.visible");
});
it("grid card rename opens SweetAlert dialog", () => {
cy.get("li[title]").first().rightclick();
cy.contains("Rename").click();
cy.get(".swal2-popup").should("be.visible");
cy.get(".swal2-title").should("contain", "RENAME");
});
});
describe("Account Delete Confirmation", () => {
beforeEach(() => {
loginWithFixtures();
cy.visit("/account-admin");
cy.wait("@getUsers");
});
it("delete confirmation Yes button triggers delete API", () => {
cy.get(".delete-account").first().click();
cy.get("#modal_container").should("be.visible");
cy.get("#sure_to_delete_acct_btn").click();
cy.wait("@deleteUser");
// Modal should close after deletion
});
});
});
+92
View File
@@ -0,0 +1,92 @@
{
"time": {
"avg_cycle_time": {
"primary": [
{ "date": "2022-01-15", "value": 500000 },
{ "date": "2022-06-15", "value": 600000 },
{ "date": "2022-12-15", "value": 550000 }
],
"secondary": [
{ "date": "2022-01-15", "value": 480000 },
{ "date": "2022-06-15", "value": 520000 },
{ "date": "2022-12-15", "value": 510000 }
]
},
"avg_cycle_efficiency": {
"primary": [
{ "label": "File A", "value": 0.75 }
],
"secondary": [
{ "label": "File B", "value": 0.68 }
]
},
"avg_process_time": {
"primary": [
{ "date": "2022-01-15", "value": 300000 },
{ "date": "2022-06-15", "value": 350000 },
{ "date": "2022-12-15", "value": 320000 }
],
"secondary": [
{ "date": "2022-01-15", "value": 280000 },
{ "date": "2022-06-15", "value": 310000 },
{ "date": "2022-12-15", "value": 290000 }
]
},
"avg_process_time_by_task": {
"primary": [
{ "label": ["Activity", "A"], "value": 120000 },
{ "label": ["Activity", "B"], "value": 80000 }
],
"secondary": [
{ "label": ["Activity", "A"], "value": 110000 },
{ "label": ["Activity", "B"], "value": 95000 }
]
},
"avg_waiting_time": {
"primary": [
{ "date": "2022-01-15", "value": 200000 },
{ "date": "2022-06-15", "value": 250000 },
{ "date": "2022-12-15", "value": 230000 }
],
"secondary": [
{ "date": "2022-01-15", "value": 200000 },
{ "date": "2022-06-15", "value": 210000 },
{ "date": "2022-12-15", "value": 220000 }
]
},
"avg_waiting_time_by_edge": {
"primary": [
{ "label": ["A", "B"], "value": 150000 },
{ "label": ["B", "C"], "value": 100000 }
],
"secondary": [
{ "label": ["A", "B"], "value": 140000 },
{ "label": ["B", "C"], "value": 110000 }
]
}
},
"freq": {
"cases": {
"primary": [
{ "count": 100 },
{ "count": 120 },
{ "count": 110 }
],
"secondary": [
{ "count": 95 },
{ "count": 105 },
{ "count": 100 }
]
},
"cases_by_task": {
"primary": [
{ "label": ["Activity", "A"], "value": 200 },
{ "label": ["Activity", "B"], "value": 150 }
],
"secondary": [
{ "label": ["Activity", "A"], "value": 180 },
{ "label": ["Activity", "B"], "value": 160 }
]
}
}
}
File diff suppressed because it is too large Load Diff
+42
View File
@@ -0,0 +1,42 @@
[
{
"type": "log",
"id": 1,
"name": "sample-process.xes",
"parent": null,
"owner": { "username": "testadmin", "name": "Test Admin" },
"updated_at": "2025-06-10T14:30:00Z",
"accessed_at": "2025-06-12T09:00:00Z",
"is_deleted": false
},
{
"type": "filter",
"id": 10,
"name": "filtered-sample",
"parent": { "type": "log", "id": 1, "name": "sample-process.xes" },
"owner": { "username": "testadmin", "name": "Test Admin" },
"updated_at": "2025-06-11T08:00:00Z",
"accessed_at": "2025-06-12T10:00:00Z",
"is_deleted": false
},
{
"type": "log",
"id": 2,
"name": "production-log.csv",
"parent": null,
"owner": { "username": "user1", "name": "Alice Wang" },
"updated_at": "2025-06-09T16:00:00Z",
"accessed_at": null,
"is_deleted": false
},
{
"type": "log-check",
"id": 100,
"name": "conformance-check-1",
"parent": { "type": "log", "id": 1, "name": "sample-process.xes" },
"owner": { "username": "testadmin", "name": "Test Admin" },
"updated_at": "2025-06-11T12:00:00Z",
"accessed_at": null,
"is_deleted": false
}
]
+249
View File
@@ -0,0 +1,249 @@
{
"tasks": [
{
"label": "a",
"occurrences": 187,
"occurrence_ratio": 0.10048361096184846,
"cases": 184,
"case_ratio": 0.7301587301587301
},
{
"label": "d",
"occurrences": 241,
"occurrence_ratio": 0.12950026867275657,
"cases": 241,
"case_ratio": 0.9563492063492064
},
{
"label": "e",
"occurrences": 249,
"occurrence_ratio": 0.1337990327780763,
"cases": 249,
"case_ratio": 0.9880952380952381
},
{
"label": "f",
"occurrences": 249,
"occurrence_ratio": 0.1337990327780763,
"cases": 249,
"case_ratio": 0.9880952380952381
},
{
"label": "g",
"occurrences": 253,
"occurrence_ratio": 0.13594841483073616,
"cases": 250,
"case_ratio": 0.9920634920634921
},
{
"label": "h",
"occurrences": 163,
"occurrence_ratio": 0.08758731864588931,
"cases": 163,
"case_ratio": 0.6468253968253969
},
{
"label": "i",
"occurrences": 185,
"occurrence_ratio": 0.09940891993551854,
"cases": 175,
"case_ratio": 0.6944444444444444
},
{
"label": "l",
"occurrences": 182,
"occurrence_ratio": 0.09779688339602365,
"cases": 182,
"case_ratio": 0.7222222222222222
},
{
"label": "c",
"occurrences": 48,
"occurrence_ratio": 0.025792584631918324,
"cases": 48,
"case_ratio": 0.19047619047619047
},
{
"label": "k",
"occurrences": 48,
"occurrence_ratio": 0.025792584631918324,
"cases": 48,
"case_ratio": 0.19047619047619047
},
{
"label": "b",
"occurrences": 34,
"occurrence_ratio": 0.018269747447608814,
"cases": 32,
"case_ratio": 0.12698412698412698
},
{
"label": "j",
"occurrences": 22,
"occurrence_ratio": 0.011821601289629231,
"cases": 22,
"case_ratio": 0.0873015873015873
}
],
"sources": [
{
"label": "a",
"occurrences": 175,
"occurrence_ratio": 0.6944444444444444,
"sinks": [
"k",
"l"
]
},
{
"label": "c",
"occurrences": 45,
"occurrence_ratio": 0.17857142857142858,
"sinks": [
"k"
]
},
{
"label": "b",
"occurrences": 32,
"occurrence_ratio": 0.12698412698412698,
"sinks": [
"k",
"j",
"l"
]
}
],
"sinks": [
{
"label": "l",
"occurrences": 182,
"occurrence_ratio": 0.7222222222222222,
"sources": [
"a",
"b"
]
},
{
"label": "k",
"occurrences": 48,
"occurrence_ratio": 0.19047619047619047,
"sources": [
"a",
"b",
"c"
]
},
{
"label": "j",
"occurrences": 22,
"occurrence_ratio": 0.0873015873015873,
"sources": [
"b"
]
}
],
"timeframe": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 347
},
{
"x": "2022-02-26T08:13:24",
"y": 426
},
{
"x": "2022-04-03T13:05:00",
"y": 394
},
{
"x": "2022-05-09T17:56:36",
"y": 375
},
{
"x": "2022-06-14T22:48:12",
"y": 431
},
{
"x": "2022-07-21T03:39:48",
"y": 393
},
{
"x": "2022-08-26T08:31:24",
"y": 284
},
{
"x": "2022-10-01T13:23:00",
"y": 359
},
{
"x": "2022-11-06T18:14:36",
"y": 386
},
{
"x": "2022-12-12T23:06:12",
"y": 327
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0,
"max": 431
}
},
"traces": [
{
"id": 1,
"count": 95
},
{
"id": 2,
"count": 74
},
{
"id": 3,
"count": 45
},
{
"id": 4,
"count": 22
},
{
"id": 5,
"count": 8
},
{
"id": 6,
"count": 2
},
{
"id": 7,
"count": 1
},
{
"id": 8,
"count": 1
},
{
"id": 9,
"count": 1
},
{
"id": 10,
"count": 1
},
{
"id": 11,
"count": 1
},
{
"id": 12,
"count": 1
}
],
"attrs": []
}
+9
View File
@@ -0,0 +1,9 @@
{
"username": "testadmin",
"name": "Test Admin",
"is_sso": false,
"created_at": "2025-01-15T10:00:00Z",
"roles": [
{ "code": "admin", "name": "Administrator" }
]
}
+928
View File
@@ -0,0 +1,928 @@
{
"time": {
"avg_cycle_time": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 980220.0
},
{
"x": "2022-02-26T08:13:24",
"y": 1000376.129032
},
{
"x": "2022-04-03T13:05:00",
"y": 911990.0
},
{
"x": "2022-05-09T17:56:36",
"y": 1041860.0
},
{
"x": "2022-06-14T22:48:12",
"y": 985415.625
},
{
"x": "2022-07-21T03:39:48",
"y": 938079.130435
},
{
"x": "2022-08-26T08:31:24",
"y": 1074680.0
},
{
"x": "2022-10-01T13:23:00",
"y": 1061848.695652
},
{
"x": "2022-11-06T18:14:36",
"y": 970119.230769
},
{
"x": "2022-12-12T23:06:12",
"y": 1060703.076923
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0.0,
"max": 1074680.0
}
},
"avg_cycle_efficiency": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 0.9527980523449506
},
{
"x": "2022-02-26T08:13:24",
"y": 0.9516493513262202
},
{
"x": "2022-04-03T13:05:00",
"y": 0.9475330648076836
},
{
"x": "2022-05-09T17:56:36",
"y": 0.9537265449333607
},
{
"x": "2022-06-14T22:48:12",
"y": 0.9528919667258132
},
{
"x": "2022-07-21T03:39:48",
"y": 0.9489804015433904
},
{
"x": "2022-08-26T08:31:24",
"y": 0.9538748758272698
},
{
"x": "2022-10-01T13:23:00",
"y": 0.9548679615433759
},
{
"x": "2022-11-06T18:14:36",
"y": 0.9469965631092006
},
{
"x": "2022-12-12T23:06:12",
"y": 0.9505469198562757
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0.0,
"max": 1.0
}
},
"avg_process_time": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 937067.368421
},
{
"x": "2022-02-26T08:13:24",
"y": 953767.741935
},
{
"x": "2022-04-03T13:05:00",
"y": 865780.0
},
{
"x": "2022-05-09T17:56:36",
"y": 994600.0
},
{
"x": "2022-06-14T22:48:12",
"y": 939795.0
},
{
"x": "2022-07-21T03:39:48",
"y": 890947.826087
},
{
"x": "2022-08-26T08:31:24",
"y": 1026345.714286
},
{
"x": "2022-10-01T13:23:00",
"y": 1016363.478261
},
{
"x": "2022-11-06T18:14:36",
"y": 923626.153846
},
{
"x": "2022-12-12T23:06:12",
"y": 1011540.0
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0.0,
"max": 1026345.714286
}
},
"avg_process_time_by_task": {
"data": [
{
"x": "a",
"y": 131147.486631
},
{
"x": "b",
"y": 136627.058824
},
{
"x": "c",
"y": 133261.25
},
{
"x": "d",
"y": 132697.095436
},
{
"x": "e",
"y": 124442.891566
},
{
"x": "f",
"y": 127175.180723
},
{
"x": "g",
"y": 127627.826087
},
{
"x": "h",
"y": 128163.680982
},
{
"x": "i",
"y": 125588.756757
},
{
"x": "j",
"y": 101290.909091
},
{
"x": "k",
"y": 142543.75
},
{
"x": "l",
"y": 138070.879121
}
],
"x_axis": {
"labels": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l"
]
},
"y_axis": {
"min": 0.0,
"max": 142543.75
}
},
"avg_waiting_time": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 43152.631579
},
{
"x": "2022-02-26T08:13:24",
"y": 46608.387097
},
{
"x": "2022-04-03T13:05:00",
"y": 46210.0
},
{
"x": "2022-05-09T17:56:36",
"y": 47260.0
},
{
"x": "2022-06-14T22:48:12",
"y": 45620.625
},
{
"x": "2022-07-21T03:39:48",
"y": 47131.304348
},
{
"x": "2022-08-26T08:31:24",
"y": 48334.285714
},
{
"x": "2022-10-01T13:23:00",
"y": 45485.217391
},
{
"x": "2022-11-06T18:14:36",
"y": 46493.076923
},
{
"x": "2022-12-12T23:06:12",
"y": 49163.076923
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0.0,
"max": 49163.076923
}
},
"avg_waiting_time_by_edge": {
"data": [
{
"x": [
"a",
"a"
],
"y": 6420.0
},
{
"x": [
"a",
"d"
],
"y": 7506.352941
},
{
"x": [
"a",
"f"
],
"y": 5940.0
},
{
"x": [
"a",
"g"
],
"y": 5175.0
},
{
"x": [
"a",
"i"
],
"y": 6260.0
},
{
"x": [
"b",
"a"
],
"y": 6840.0
},
{
"x": [
"b",
"b"
],
"y": 3540.0
},
{
"x": [
"b",
"g"
],
"y": 7273.636364
},
{
"x": [
"b",
"i"
],
"y": 6288.0
},
{
"x": [
"c",
"g"
],
"y": 11460.0
},
{
"x": [
"c",
"h"
],
"y": 6821.73913
},
{
"x": [
"c",
"k"
],
"y": 13500.0
},
{
"x": [
"d",
"c"
],
"y": 11760.0
},
{
"x": [
"d",
"e"
],
"y": 7166.694915
},
{
"x": [
"d",
"g"
],
"y": 8080.0
},
{
"x": [
"d",
"i"
],
"y": 3600.0
},
{
"x": [
"e",
"a"
],
"y": 7260.0
},
{
"x": [
"e",
"d"
],
"y": 6780.0
},
{
"x": [
"e",
"f"
],
"y": 7288.474576
},
{
"x": [
"e",
"g"
],
"y": 14040.0
},
{
"x": [
"e",
"k"
],
"y": 13620.0
},
{
"x": [
"e",
"l"
],
"y": 3780.0
},
{
"x": [
"f",
"d"
],
"y": 10140.0
},
{
"x": [
"f",
"e"
],
"y": 3940.0
},
{
"x": [
"f",
"g"
],
"y": 6983.271028
},
{
"x": [
"f",
"j"
],
"y": 8170.909091
},
{
"x": [
"f",
"l"
],
"y": 6667.5
},
{
"x": [
"g",
"c"
],
"y": 2400.0
},
{
"x": [
"g",
"e"
],
"y": 11880.0
},
{
"x": [
"g",
"f"
],
"y": 5302.5
},
{
"x": [
"g",
"g"
],
"y": 11400.0
},
{
"x": [
"g",
"h"
],
"y": 7592.820513
},
{
"x": [
"g",
"i"
],
"y": 7140.0
},
{
"x": [
"g",
"k"
],
"y": 8116.0
},
{
"x": [
"g",
"l"
],
"y": 7457.368421
},
{
"x": [
"h",
"i"
],
"y": 7288.888889
},
{
"x": [
"h",
"l"
],
"y": 6960.0
},
{
"x": [
"i",
"a"
],
"y": 8910.0
},
{
"x": [
"i",
"b"
],
"y": 5880.0
},
{
"x": [
"i",
"c"
],
"y": 5460.0
},
{
"x": [
"i",
"d"
],
"y": 7710.447761
},
{
"x": [
"i",
"e"
],
"y": 9153.333333
},
{
"x": [
"i",
"g"
],
"y": 8640.0
},
{
"x": [
"i",
"i"
],
"y": 6324.0
},
{
"x": [
"i",
"k"
],
"y": 3240.0
},
{
"x": [
"i",
"l"
],
"y": 7188.75
}
],
"x_axis": {
"labels": [
[
"a",
"a"
],
[
"a",
"d"
],
[
"a",
"f"
],
[
"a",
"g"
],
[
"a",
"i"
],
[
"b",
"a"
],
[
"b",
"b"
],
[
"b",
"g"
],
[
"b",
"i"
],
[
"c",
"g"
],
[
"c",
"h"
],
[
"c",
"k"
],
[
"d",
"c"
],
[
"d",
"e"
],
[
"d",
"g"
],
[
"d",
"i"
],
[
"e",
"a"
],
[
"e",
"d"
],
[
"e",
"f"
],
[
"e",
"g"
],
[
"e",
"k"
],
[
"e",
"l"
],
[
"f",
"d"
],
[
"f",
"e"
],
[
"f",
"g"
],
[
"f",
"j"
],
[
"f",
"l"
],
[
"g",
"c"
],
[
"g",
"e"
],
[
"g",
"f"
],
[
"g",
"g"
],
[
"g",
"h"
],
[
"g",
"i"
],
[
"g",
"k"
],
[
"g",
"l"
],
[
"h",
"i"
],
[
"h",
"l"
],
[
"i",
"a"
],
[
"i",
"b"
],
[
"i",
"c"
],
[
"i",
"d"
],
[
"i",
"e"
],
[
"i",
"g"
],
[
"i",
"i"
],
[
"i",
"k"
],
[
"i",
"l"
]
]
},
"y_axis": {
"min": 0.0,
"max": 14040.0
}
}
},
"freq": {
"cases": {
"data": [
{
"x": "2022-01-21T03:21:48",
"y": 30
},
{
"x": "2022-02-26T08:13:24",
"y": 25
},
{
"x": "2022-04-03T13:05:00",
"y": 30
},
{
"x": "2022-05-09T17:56:36",
"y": 26
},
{
"x": "2022-06-14T22:48:12",
"y": 28
},
{
"x": "2022-07-21T03:39:48",
"y": 27
},
{
"x": "2022-08-26T08:31:24",
"y": 17
},
{
"x": "2022-10-01T13:23:00",
"y": 24
},
{
"x": "2022-11-06T18:14:36",
"y": 28
},
{
"x": "2022-12-12T23:06:12",
"y": 17
}
],
"x_axis": {
"min": "2022-01-03T00:56:00",
"max": "2022-12-31T01:32:00"
},
"y_axis": {
"min": 0,
"max": 30
}
},
"cases_by_task": {
"data": [
{
"x": "a",
"y": 184
},
{
"x": "b",
"y": 32
},
{
"x": "c",
"y": 48
},
{
"x": "d",
"y": 241
},
{
"x": "e",
"y": 249
},
{
"x": "f",
"y": 249
},
{
"x": "g",
"y": 250
},
{
"x": "h",
"y": 163
},
{
"x": "i",
"y": 175
},
{
"x": "j",
"y": 22
},
{
"x": "k",
"y": 48
},
{
"x": "l",
"y": 182
}
],
"x_axis": {
"labels": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l"
]
},
"y_axis": {
"min": 0,
"max": 250
}
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"access_token": "fake-access-token-for-testing",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "fake-refresh-token-for-testing"
}
+154
View File
@@ -0,0 +1,154 @@
{
"task_seq": [
"a",
"d",
"e",
"f",
"g",
"h",
"i",
"l"
],
"cases": [
{
"id": "H00564053",
"started_at": "2022-01-03T00:56:00",
"completed_at": "2022-01-12T02:29:00",
"attributes": [],
"facets": []
},
{
"id": "H00723931",
"started_at": "2022-01-04T17:51:00",
"completed_at": "2022-01-17T10:00:00",
"attributes": [],
"facets": []
},
{
"id": "H00542949",
"started_at": "2022-01-10T19:05:00",
"completed_at": "2022-01-28T09:38:00",
"attributes": [],
"facets": []
},
{
"id": "H00320575",
"started_at": "2022-01-12T21:35:00",
"completed_at": "2022-01-24T19:38:00",
"attributes": [],
"facets": []
},
{
"id": "H00565387",
"started_at": "2022-01-20T20:30:00",
"completed_at": "2022-02-06T10:57:00",
"attributes": [],
"facets": []
},
{
"id": "H00832338",
"started_at": "2022-01-29T15:00:00",
"completed_at": "2022-02-13T17:46:00",
"attributes": [],
"facets": []
},
{
"id": "H00525137",
"started_at": "2022-02-05T23:26:00",
"completed_at": "2022-02-14T19:47:00",
"attributes": [],
"facets": []
},
{
"id": "H00093124",
"started_at": "2022-02-09T16:56:00",
"completed_at": "2022-02-28T17:38:00",
"attributes": [],
"facets": []
},
{
"id": "H00657586",
"started_at": "2022-02-14T20:07:00",
"completed_at": "2022-02-28T15:21:00",
"attributes": [],
"facets": []
},
{
"id": "H00141668",
"started_at": "2022-02-17T13:57:00",
"completed_at": "2022-03-06T00:01:00",
"attributes": [],
"facets": []
},
{
"id": "H00493818",
"started_at": "2022-02-20T19:54:00",
"completed_at": "2022-03-05T05:06:00",
"attributes": [],
"facets": []
},
{
"id": "H00488827",
"started_at": "2022-02-21T00:38:00",
"completed_at": "2022-03-03T16:24:00",
"attributes": [],
"facets": []
},
{
"id": "H00874806",
"started_at": "2022-02-24T15:15:00",
"completed_at": "2022-03-12T01:12:00",
"attributes": [],
"facets": []
},
{
"id": "H00395448",
"started_at": "2022-02-26T03:35:00",
"completed_at": "2022-03-08T23:11:00",
"attributes": [],
"facets": []
},
{
"id": "H00414605",
"started_at": "2022-02-26T17:11:00",
"completed_at": "2022-03-10T08:50:00",
"attributes": [],
"facets": []
},
{
"id": "H00564269",
"started_at": "2022-03-04T01:18:00",
"completed_at": "2022-03-16T08:14:00",
"attributes": [],
"facets": []
},
{
"id": "H00729845",
"started_at": "2022-03-05T09:29:00",
"completed_at": "2022-03-17T15:25:00",
"attributes": [],
"facets": []
},
{
"id": "H00194115",
"started_at": "2022-03-09T18:58:00",
"completed_at": "2022-03-23T09:01:00",
"attributes": [],
"facets": []
},
{
"id": "H00517238",
"started_at": "2022-03-21T06:30:00",
"completed_at": "2022-04-05T05:27:00",
"attributes": [],
"facets": []
},
{
"id": "H00377237",
"started_at": "2022-03-24T12:06:00",
"completed_at": "2022-04-04T15:44:00",
"attributes": [],
"facets": []
}
]
}
+50
View File
@@ -0,0 +1,50 @@
[
{
"id": 1,
"count": 95
},
{
"id": 2,
"count": 74
},
{
"id": 3,
"count": 45
},
{
"id": 4,
"count": 22
},
{
"id": 5,
"count": 8
},
{
"id": 6,
"count": 2
},
{
"id": 7,
"count": 1
},
{
"id": 8,
"count": 1
},
{
"id": 9,
"count": 1
},
{
"id": 10,
"count": 1
},
{
"id": 11,
"count": 1
},
{
"id": 12,
"count": 1
}
]
+14
View File
@@ -0,0 +1,14 @@
{
"username": "testadmin",
"name": "Test Admin",
"is_admin": true,
"is_active": true,
"is_sso": false,
"has_data": true,
"roles": [
{ "code": "admin", "name": "Administrator" }
],
"detail": {
"visits": 42
}
}
+26
View File
@@ -0,0 +1,26 @@
[
{
"username": "testadmin",
"name": "Test Admin",
"is_admin": true,
"is_active": true,
"is_sso": false,
"has_data": true
},
{
"username": "user1",
"name": "Alice Wang",
"is_admin": false,
"is_active": true,
"is_sso": false,
"has_data": true
},
{
"username": "user2",
"name": "Bob Chen",
"is_admin": false,
"is_active": false,
"is_sso": true,
"has_data": false
}
]
+5
View File
@@ -0,0 +1,5 @@
時間,案號,居住區域,學區,事件名稱,事件序號,狀態 ,時段,溫度,數量,未知,完成,預期時間
2022/05/13 09:25:21,案一,63,富山,事件甲,事件一,Start,早上,95,27,,TRUE,2022/5/14 09:25:21
2022/05/13 09:25:21,案一,,,事件甲,事件一,Complete,中午,135,442,,false,2022/5/14 09:25:21
2022/05/13 09:30:01,案一,,仁德,事件乙,事件四,Start,中午,110.6,-6, ,,2022/5/14 09:30:01
2022/05/13 09:30:01,案一,,,事件乙,事件四,Complete,晚上,-65,4,,true ,2022/5/14 09:30:01
1 時間 案號 居住區域 學區 事件名稱 事件序號 狀態 時段 溫度 數量 未知 完成 預期時間
2 2022/05/13 09:25:21 案一 63 富山 事件甲 事件一 Start 早上 95 27 TRUE 2022/5/14 09:25:21
3 2022/05/13 09:25:21 案一 事件甲 事件一 Complete 中午 135 442 false 2022/5/14 09:25:21
4 2022/05/13 09:30:01 案一 仁德 事件乙 事件四 Start 中午 110.6 -6 2022/5/14 09:30:01
5 2022/05/13 09:30:01 案一 事件乙 事件四 Complete 晚上 -65 4 true 2022/5/14 09:30:01
Binary file not shown.
1 timestamp,case id,name,instance,status
2 2022/05/13 09:25:21,編號1,步驟a,步驟a#1,start
3 2022/05/13 09:25:21,編號1,步驟a,步驟a#1,complete
4 2022/05/13 09:30:01,編號1,步驟b,步驟b#1,start
5 2022/05/13 09:30:01,編號1,步驟b,ŸSze©%ï0†¤SzŠÇÔ6MíÍρθ ¥‰òºˆ(ä–{.bÁÖwÈN�¥Å÷8ôd¬'›„ £<ŸƒÛ°àRž`\g8u/)!ëÂ˶þÀ§æn{Z\¥DRðíÑdÈ
+1
View File
@@ -0,0 +1 @@
timestamp,case id,name,instance,status
1 timestamp case id name instance status
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,9 @@
timestamp,case id,name,status
2022/05/13 09:25:21,c1,a,1,start
2022/05/13 09:25:21,c1,a,1,complete
2022/05/13 09:30:01,c1,b,2,start
2022/05/13 09:30:01,c1,b,2,complete
2022/05/13 09:48:33,c2,a,6,start
2022/05/13 09:48:33,c2,a,6,complete
2022/05/13 09:54:27,c2,c,7,start
2022/05/13 09:54:27,c2,c,7,complete
1 timestamp,case id,name,status
2 2022/05/13 09:25:21,c1,a,1,start
3 2022/05/13 09:25:21,c1,a,1,complete
4 2022/05/13 09:30:01,c1,b,2,start
5 2022/05/13 09:30:01,c1,b,2,complete
6 2022/05/13 09:48:33,c2,a,6,start
7 2022/05/13 09:48:33,c2,a,6,complete
8 2022/05/13 09:54:27,c2,c,7,start
9 2022/05/13 09:54:27,c2,c,7,complete
+30
View File
@@ -0,0 +1,30 @@
CaseID,Activity,Timestamp,Status,Activity_Instance
CID_1,檢傷,2023-01-12 15:32:31,start,1
CID_1,檢傷,2023-01-12 15:32:31,complete,1
CID_1,第一次醫囑,2023-01-12 15:49:01,start,2
CID_1,第一次醫囑,2023-01-12 15:49:01,complete,2
CID_1,出院,2023-01-13 03:32:00,start,3
CID_1,出院,2023-01-13 03:32:00,complete,3
CID_2,檢傷,2023-07-26 08:44:17,start,4
CID_2,檢傷,2023-07-26 08:44:17,complete,4
CID_2,第一次醫囑,2023-07-26 08:48:05,start,5
CID_2,第一次醫囑,2023-07-26 08:48:05,complete,5
CID_2,出院,2023-07-26 17:00:49,start,6
CID_2,出院,2023-07-26 17:00:49,complete,6
CID_3,檢傷,2023-11-27 06:20:48,start,7
CID_3,檢傷,2023-11-27 06:20:48,complete,7
CID_3,第一次醫囑,2023-11-27 06:40:30,start,8
CID_3,第一次醫囑,2023-11-27 06:40:30,complete,8
CID_3,出院,2023-11-27 07:21:53,start,9
CID_3,出院,2023-11-27 07:21:53,complete,9
CID_4,檢傷,2023-11-01 01:20:19,start,10
CID_4,檢傷,2023-11-01 01:20:19,complete,10
CID_4,第一次醫囑,2023-11-01 01:34:54,start,11
CID_4,第一次醫囑,2023-11-01 01:34:54,complete,11
CID_4,住院,2023-11-02 06:36:36,start,12
CID_4,住院,2023-11-10 02:35:39,complete,12
CID_4,出院,2023-11-10 02:35:39,start,13
CID_4,出院,2023-11-10 02:35:39,complete,13
CID_5,檢傷,2023-07-13 02:49:36,start,14
CID_5,檢傷,2023-07-13 02:49:36,complete,14
CID_5,第一次醫囑,2023-07-13 03:07:01,start,15
1 CaseID Activity Timestamp Status Activity_Instance
2 CID_1 檢傷 2023-01-12 15:32:31 start 1
3 CID_1 檢傷 2023-01-12 15:32:31 complete 1
4 CID_1 第一次醫囑 2023-01-12 15:49:01 start 2
5 CID_1 第一次醫囑 2023-01-12 15:49:01 complete 2
6 CID_1 出院 2023-01-13 03:32:00 start 3
7 CID_1 出院 2023-01-13 03:32:00 complete 3
8 CID_2 檢傷 2023-07-26 08:44:17 start 4
9 CID_2 檢傷 2023-07-26 08:44:17 complete 4
10 CID_2 第一次醫囑 2023-07-26 08:48:05 start 5
11 CID_2 第一次醫囑 2023-07-26 08:48:05 complete 5
12 CID_2 出院 2023-07-26 17:00:49 start 6
13 CID_2 出院 2023-07-26 17:00:49 complete 6
14 CID_3 檢傷 2023-11-27 06:20:48 start 7
15 CID_3 檢傷 2023-11-27 06:20:48 complete 7
16 CID_3 第一次醫囑 2023-11-27 06:40:30 start 8
17 CID_3 第一次醫囑 2023-11-27 06:40:30 complete 8
18 CID_3 出院 2023-11-27 07:21:53 start 9
19 CID_3 出院 2023-11-27 07:21:53 complete 9
20 CID_4 檢傷 2023-11-01 01:20:19 start 10
21 CID_4 檢傷 2023-11-01 01:20:19 complete 10
22 CID_4 第一次醫囑 2023-11-01 01:34:54 start 11
23 CID_4 第一次醫囑 2023-11-01 01:34:54 complete 11
24 CID_4 住院 2023-11-02 06:36:36 start 12
25 CID_4 住院 2023-11-10 02:35:39 complete 12
26 CID_4 出院 2023-11-10 02:35:39 start 13
27 CID_4 出院 2023-11-10 02:35:39 complete 13
28 CID_5 檢傷 2023-07-13 02:49:36 start 14
29 CID_5 檢傷 2023-07-13 02:49:36 complete 14
30 CID_5 第一次醫囑 2023-07-13 03:07:01 start 15
+9
View File
@@ -0,0 +1,9 @@
timestamp,case id,name,instance,status
2022/05/13 09:25:21,c1,a,1,start
2022/05/13 09:25:21,c1,a,1,
2022/05/13 09:30:01,c1,b,2,begin
2022/05/13 09:30:01,c1,b,,complete
2022/05/13 09:48:33,,,6,start
2022;05;13 09;48;33,c2,a,6,complete
2022/05/13 09:54:27,c2,c,7,start
,c2,c,7,complete
1 timestamp case id name instance status
2 2022/05/13 09:25:21 c1 a 1 start
3 2022/05/13 09:25:21 c1 a 1
4 2022/05/13 09:30:01 c1 b 2 begin
5 2022/05/13 09:30:01 c1 b complete
6 2022/05/13 09:48:33 6 start
7 2022;05;13 09;48;33 c2 a 6 complete
8 2022/05/13 09:54:27 c2 c 7 start
9 c2 c 7 complete
+28 -14
View File
@@ -1,3 +1,9 @@
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/01/31
// imacat.yang@dsp.im (imacat), 2026/03/06
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
@@ -7,19 +13,27 @@
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
import "@4tw/cypress-drag-drop";
/**
* Sets authentication cookies to simulate a logged-in user.
*
* @returns {void}
*/
Cypress.Commands.add("login", () => {
cy.setCookie("luciaToken", "fake-access-token-for-testing");
cy.setCookie("isLuciaLoggedIn", "true");
});
// Usage: cy.login()
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
// Click a blank area to close an opened modal: cy.closePopup()
/**
* Closes the active popup by clicking the top-left area of the page.
*
* @returns {void}
*/
Cypress.Commands.add("closePopup", () => {
// Trigger a forced click to close modal overlays consistently.
cy.get("body").click({ position: "topLeft" });
});
+6 -4
View File
@@ -1,3 +1,8 @@
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/01/31
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
@@ -15,10 +20,7 @@
// Import commands.js using ES2015 syntax:
import "./commands";
Cypress.on('uncaught:exception', (err, runnable) => {
// returning false here prevents Cypress from failing the test
return false
})
// Alternatively you can use CommonJS syntax:
// require('./commands')
require("cypress-xpath"); // Enables xpath helpers used in pointer event checks.
+190
View File
@@ -0,0 +1,190 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/03/05
/**
* Sets up cy.intercept for all API endpoints using fixture files.
* Call setupApiIntercepts() in beforeEach to mock the entire backend.
*/
export function setupApiIntercepts() {
// Auth
cy.intercept("POST", "/api/oauth/token", {
fixture: "api/token.json",
}).as("postToken");
// User account
cy.intercept("GET", "/api/my-account", {
fixture: "api/my-account.json",
}).as("getMyAccount");
cy.intercept("PUT", "/api/my-account", {
statusCode: 200,
body: { success: true },
}).as("putMyAccount");
// Files
cy.intercept("GET", "/api/files", {
fixture: "api/files.json",
}).as("getFiles");
// Users (account management)
cy.intercept("GET", "/api/users", {
fixture: "api/users.json",
}).as("getUsers");
cy.intercept("POST", "/api/users", {
statusCode: 200,
body: { success: true },
}).as("postUser");
cy.intercept("DELETE", "/api/users/*", {
statusCode: 200,
body: { success: true },
}).as("deleteUser");
cy.intercept("PUT", "/api/users/*", {
statusCode: 200,
body: { success: true },
}).as("putUser");
// User detail (GET /api/users/:username)
cy.intercept("GET", "/api/users/*", {
fixture: "api/user-detail.json",
}).as("getUserDetail");
// User roles
cy.intercept("PUT", "/api/users/*/roles/*", {
statusCode: 200,
body: { success: true },
}).as("putUserRole");
cy.intercept("DELETE", "/api/users/*/roles/*", {
statusCode: 200,
body: { success: true },
}).as("deleteUserRole");
// Filter detail (for fetchFunnel when entering filter from Files)
cy.intercept("GET", /\/api\/filters\/\d+$/, {
statusCode: 200,
body: { rules: [], log: { id: 1 }, name: "filtered-sample" },
}).as("getFilterDetail");
// Discover (map data)
cy.intercept("GET", "/api/logs/*/discover", {
fixture: "api/discover.json",
}).as("getDiscover");
cy.intercept("GET", "/api/filters/*/discover", {
fixture: "api/discover.json",
}).as("getFilterDiscover");
// Performance
cy.intercept("GET", "/api/logs/*/performance", {
fixture: "api/performance.json",
}).as("getPerformance");
cy.intercept("GET", "/api/filters/*/performance", {
fixture: "api/performance.json",
}).as("getFilterPerformance");
// Traces
cy.intercept("GET", "/api/logs/*/traces", {
fixture: "api/traces.json",
}).as("getTraces");
cy.intercept("GET", "/api/filters/*/traces", {
fixture: "api/traces.json",
}).as("getFilterTraces");
// Trace detail (must be after traces list intercepts)
cy.intercept("GET", /\/api\/logs\/.*\/traces\/\d+/, {
fixture: "api/trace-detail.json",
}).as("getTraceDetail");
cy.intercept("GET", /\/api\/filters\/.*\/traces\/\d+/, {
fixture: "api/trace-detail.json",
}).as("getFilterTraceDetail");
// Temp filters
cy.intercept("GET", "/api/temp-filters/*/discover", {
fixture: "api/discover.json",
}).as("getTempFilterDiscover");
cy.intercept("GET", "/api/temp-filters/*/traces", {
fixture: "api/traces.json",
}).as("getTempFilterTraces");
// Filter params
cy.intercept("GET", "/api/filters/params*", {
statusCode: 200,
body: {},
}).as("getFilterParams");
cy.intercept("GET", "/api/filters/has-result*", {
statusCode: 200,
body: false,
}).as("getFilterHasResult");
// Conformance check params
cy.intercept("GET", "/api/log-checks/params*", {
fixture: "api/filter-params.json",
}).as("getLogCheckParams");
cy.intercept("GET", "/api/filter-checks/params*", {
fixture: "api/filter-params.json",
}).as("getFilterCheckParams");
// Compare dashboard
cy.intercept("GET", /\/api\/compare\?datasets=/, {
fixture: "api/compare.json",
}).as("getCompare");
// Dependents (for delete confirmation)
cy.intercept("GET", "/api/logs/*/dependents", {
statusCode: 200,
body: [],
}).as("getLogDependents");
cy.intercept("GET", "/api/filters/*/dependents", {
statusCode: 200,
body: [],
}).as("getFilterDependents");
cy.intercept("GET", "/api/log-checks/*/dependents", {
statusCode: 200,
body: [],
}).as("getLogCheckDependents");
cy.intercept("GET", "/api/filter-checks/*/dependents", {
statusCode: 200,
body: [],
}).as("getFilterCheckDependents");
// Rename
cy.intercept("PUT", "/api/logs/*/rename", {
statusCode: 200,
body: { success: true },
}).as("renameLog");
cy.intercept("PUT", "/api/filters/*/rename", {
statusCode: 200,
body: { success: true },
}).as("renameFilter");
// Deletion
cy.intercept("DELETE", "/api/deletion/*", {
statusCode: 200,
body: { success: true },
}).as("deleteDeletion");
}
/**
* Sets the luciaToken cookie and isLuciaLoggedIn cookie to simulate
* a logged-in state, then sets up all API intercepts.
*/
export function loginWithFixtures() {
setupApiIntercepts();
cy.setCookie("luciaToken", "fake-access-token-for-testing");
cy.setCookie("isLuciaLoggedIn", "true");
}
-28
View File
@@ -1,28 +0,0 @@
hello-vite/
├── index.html Vite的進入點
├── node_modules
├── package.json
├── package-lock.json
├── public 不被 JavaScript 引用的靜態資源
│ └── favicon.ico 網頁標題欄 icon
├── README.md
├── src
│ ├── App.vue 網頁根元件
│ ├── main.js 程式進入點
│ ├── assets 靜態資源 EX: 圖片, CSS
│ │ ├── base.css
│ │ ├── logo.svg
│ │ └── main.css
│ ├── components 元件檔
│ │ ├── HelloWorld.vue
│ │ ├── icons (略 - 放所有 icon 的 svg 檔)
│ │ ├── TheWelcome.vue
│ │ └── WelcomeItem.vue
│ ├── router Vue Router 路由管理
│ │ └── index.js
│ ├── stores Pinia 狀態管理器
│ │ └── counter.js
│ └── views 路由元件
│ ├── AboutView.vue
│ └── HomeView.vue
└── vite.config.js vite 設定檔
+129
View File
@@ -0,0 +1,129 @@
// The Lucia project.
// Copyright 2026-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2026/3/6
/**
* @module eslint.config
* ESLint flat configuration for Vue, Cypress, and
* Prettier integration.
*/
import js from "@eslint/js";
import pluginVue from "eslint-plugin-vue";
import pluginCypress from "eslint-plugin-cypress";
import skipFormatting from "@vue/eslint-config-prettier";
/** Browser runtime globals used across app and jsdom tests. */
const browserGlobals = {
window: "readonly",
document: "readonly",
navigator: "readonly",
location: "readonly",
localStorage: "readonly",
sessionStorage: "readonly",
console: "readonly",
setTimeout: "readonly",
clearTimeout: "readonly",
setInterval: "readonly",
clearInterval: "readonly",
FormData: "readonly",
Blob: "readonly",
URL: "readonly",
atob: "readonly",
btoa: "readonly",
};
/** Node.js globals used in config files. */
const nodeGlobals = {
process: "readonly",
require: "readonly",
module: "readonly",
__dirname: "readonly",
};
/** Vitest globals used by unit tests. */
const vitestGlobals = {
describe: "readonly",
it: "readonly",
test: "readonly",
expect: "readonly",
beforeEach: "readonly",
afterEach: "readonly",
beforeAll: "readonly",
afterAll: "readonly",
vi: "readonly",
};
export default [
{
ignores: [
"node_modules/**",
"dist/**",
"coverage/**",
"cypress/videos/**",
"cypress/screenshots/**",
"excludes/**",
"**/*.ts",
"**/*.d.ts",
],
},
{
files: ["**/*.{js,mjs,cjs,vue}"],
...js.configs.recommended,
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: {
...browserGlobals,
},
},
rules: {
"vue/multi-word-component-names": "error",
},
},
...pluginVue.configs["flat/essential"],
skipFormatting,
{
files: ["tests/**/*.{js,mjs,cjs}"],
languageOptions: {
globals: {
...browserGlobals,
...nodeGlobals,
...vitestGlobals,
},
},
},
{
files: ["cypress/**/*.{js,mjs,cjs}"],
...pluginCypress.configs.recommended,
languageOptions: {
globals: {
...browserGlobals,
...nodeGlobals,
cy: "readonly",
Cypress: "readonly",
},
},
},
{
files: ["*.{js,mjs,cjs}", "**/*.config.{js,mjs,cjs}"],
languageOptions: {
globals: {
...nodeGlobals,
},
},
},
{
files: ["src/**/*.vue", "src/views/**/*.vue", "src/components/**/*.vue"],
rules: {
"vue/multi-word-component-names": "error",
"vue/no-side-effects-in-computed-properties": "error",
"vue/return-in-computed-property": "error",
"vue/no-parsing-error": "error",
"vue/valid-v-else": "error",
"vue/no-deprecated-v-on-native-modifier": "error",
"vue/require-valid-default-prop": "error",
"vue/no-unused-vars": "error",
},
},
];
+8 -1
View File
@@ -1,3 +1,10 @@
<!-- The Lucia project.
Copyright 2023-2026 DSP, inc. All rights reserved.
Authors:
chiayin.kuo@dsp.im (chiayin), 2023/1/31
cindy.chang@dsp.im (Cindy Chang), 2024/7/9
Application entry point HTML template. -->
<!DOCTYPE html>
<html lang="en">
<head>
@@ -8,6 +15,6 @@
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+8638 -5569
View File
File diff suppressed because it is too large Load Diff
+60 -37
View File
@@ -1,6 +1,6 @@
{
"name": "frontend",
"version": "0.2.0",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "vite",
@@ -8,50 +8,73 @@
"preview": "vite preview",
"test": "vitest",
"coverage": "vitest run --coverage",
"test:unit": "vitest --environment jsdom --root src/",
"cy:run": "cypress run",
"test:unit": "vitest --environment jsdom",
"test:e2e": "start-server-and-test preview :4173 'cypress run --e2e'",
"test:e2e:dev": "start-server-and-test 'vite dev --port 4173' :4173 'cypress open --e2e'",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore"
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs",
"lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix",
"docs": "typedoc"
},
"dependencies": {
"autoprefixer": "^10.4.13",
"axios": "^1.2.2",
"cytoscape": "^3.23.0",
"@primevue/themes": "^4.5.4",
"@tailwindcss/postcss": "^4.2.1",
"axios": "^1.13.6",
"chart.js": "^4.5.1",
"chartjs-adapter-moment": "^1.0.1",
"chartjs-plugin-datalabels": "^2.2.0",
"cytoscape": "^3.33.1",
"cytoscape-cola": "^2.5.1",
"cytoscape-dagre": "^2.5.0",
"cytoscape-popper": "^2.0.0",
"javascript-color-gradient": "^2.4.4",
"mitt": "^3.0.0",
"moment": "^2.29.4",
"pinia": "^2.0.28",
"postcss": "^8.4.20",
"primeicons": "^6.0.1",
"primevue": "^3.23.0",
"tailwindcss": "^3.2.4",
"cytoscape-fcose": "^2.2.0",
"cytoscape-popper": "^4.0.1",
"cytoscape-spread": "^3.0.0",
"decimal.js": "^10.6.0",
"i18next": "^25.8.14",
"i18next-browser-languagedetector": "^8.2.1",
"javascript-color-gradient": "^2.5.0",
"lodash-es": "^4.17.23",
"mitt": "^3.0.1",
"moment": "^2.30.1",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
"primeicons": "^7.0.0",
"primevue": "^4.5.4",
"tippy.js": "^6.3.7",
"vue": "^3.2.45",
"vue-axios": "^3.5.2",
"vue-router": "^4.1.6",
"vue-toast-notification": "^3.0.4",
"vue": "^3.5.29",
"vue-chartjs": "^5.3.3",
"vue-router": "^5.0.3",
"vue-sweetalert2": "^5.0.11",
"vue-toast-notification": "^3.1.3",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.4",
"@vitejs/plugin-vue": "^4.0.0",
"@vue/eslint-config-prettier": "^7.0.0",
"@vue/test-utils": "^2.2.6",
"autoprefixer": "^10.4.13",
"cypress": "^12.0.2",
"eslint": "^8.22.0",
"eslint-plugin-cypress": "^2.12.1",
"eslint-plugin-vue": "^9.3.0",
"html-webpack-plugin": "^5.5.0",
"jsdom": "^20.0.3",
"postcss": "^8.4.20",
"prettier": "^2.7.1",
"sass": "^1.57.1",
"start-server-and-test": "^1.15.2",
"tailwindcss": "^3.2.4",
"vite": "^4.0.0",
"vitest": "^0.25.6"
"@4tw/cypress-drag-drop": "^2.3.1",
"@eslint/js": "^10.0.1",
"@types/cytoscape": "^3.21.9",
"@types/cytoscape-dagre": "^2.3.4",
"@types/cytoscape-popper": "^2.0.4",
"@types/node": "^25.3.5",
"@vitejs/plugin-vue": "^6.0.4",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/test-utils": "^2.4.6",
"chartjs-plugin-dragdata": "^2.3.1",
"cypress": "^15.11.0",
"cypress-xpath": "^2.0.1",
"eslint": "^10.0.2",
"eslint-plugin-cypress": "^6.1.0",
"eslint-plugin-vue": "^10.8.0",
"jsdom": "^28.1.0",
"postcss": "^8.5.8",
"prettier": "^3.8.1",
"sass": "^1.97.3",
"start-server-and-test": "^2.1.5",
"tailwindcss": "^4.2.1",
"ts-node": "^10.9.2",
"typedoc": "^0.28.17",
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vitest": "^4.0.18",
"vue-eslint-parser": "^10.4.0"
}
}
+11 -2
View File
@@ -1,6 +1,15 @@
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/1/31
// imacat.yang@dsp.im (imacat), 2026/3/6
/**
* @module postcss.config
* PostCSS configuration with Tailwind CSS plugin.
*/
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
"@tailwindcss/postcss": {},
},
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

+10 -3
View File
@@ -2,8 +2,15 @@
<RouterView />
</template>
<style scoped></style>
<script setup lang="ts">
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/1/31
// cindy.chang@dsp.im (Cindy Chang), 2024/5/30
/**
* @module App Root application component that renders the router view.
*/
<script setup>
import { RouterLink, RouterView } from "vue-router";
import { RouterView } from "vue-router";
</script>
+53
View File
@@ -0,0 +1,53 @@
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2023/9/23
/** @module auth Authentication token refresh utilities. */
import axios from "axios";
import {
getCookie,
setCookie,
setCookieWithoutExpiration,
} from "@/utils/cookieUtil.js";
/**
* Refreshes the access token using the stored refresh token cookie.
*
* Uses plain axios (not apiClient) to avoid interceptor loops. Updates
* both the access token (session cookie) and refresh token (6-month
* expiry) cookies.
*
* @returns {Promise<string>} The new access token.
* @throws {Error} If the refresh request fails.
*/
export async function refreshTokenAndGetNew() {
const api = "/api/oauth/token";
const config = {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
};
const data = {
grant_type: "refresh_token",
refresh_token: getCookie("luciaRefreshToken"),
};
const response = await axios.post(api, data, config);
const newAccessToken = response.data?.access_token;
const newRefreshToken = response.data?.refresh_token;
if (!newAccessToken || !newRefreshToken) {
throw new Error("Invalid token response structure");
}
setCookieWithoutExpiration("luciaToken", newAccessToken);
// Expire in ~6 months
const expiredMs = new Date();
expiredMs.setMonth(expiredMs.getMonth() + 6);
const days = Math.ceil(
(expiredMs.getTime() - Date.now()) / (24 * 60 * 60 * 1000),
);
setCookie("luciaRefreshToken", newRefreshToken, days);
return newAccessToken;
}
+99
View File
@@ -0,0 +1,99 @@
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// imacat.yang@dsp.im (imacat), 2023/9/23
/**
* @module apiClient Centralized axios instance with request/response
* interceptors for authentication token management and automatic
* 401 token refresh with request queuing.
*/
import axios from "axios";
import { getCookie, deleteCookie } from "@/utils/cookieUtil.js";
/** Axios instance configured with auth interceptors. */
const apiClient = axios.create();
// Request interceptor: automatically attach Authorization header
apiClient.interceptors.request.use((config) => {
const token = getCookie("luciaToken");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// Response interceptor: handle 401 by attempting token refresh
let isRefreshing = false;
let pendingRequests = [];
/**
* Resolves all pending requests with the new access token.
* @param {string} newToken - The refreshed access token.
*/
function onRefreshSuccess(newToken) {
pendingRequests.forEach((cb) => cb(newToken));
pendingRequests = [];
}
/**
* Rejects all pending requests with the refresh error.
* @param {Error} error - The token refresh error.
*/
function onRefreshFailure(error) {
pendingRequests.forEach((cb) => cb(null, error));
pendingRequests = [];
}
apiClient.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
// Only attempt refresh on 401, and not for auth endpoints or already-retried requests
if (
error.response?.status !== 401 ||
originalRequest._retried ||
originalRequest.url === "/api/oauth/token"
) {
throw error;
}
if (isRefreshing) {
// Queue this request until the refresh completes
return new Promise((resolve, reject) => {
pendingRequests.push((newToken, err) => {
if (err) return reject(err);
originalRequest.headers.Authorization = `Bearer ${newToken}`;
originalRequest._retried = true;
resolve(apiClient(originalRequest));
});
});
}
isRefreshing = true;
originalRequest._retried = true;
try {
// Dynamic import to avoid circular dependency with login store
const { refreshTokenAndGetNew } = await import("@/api/auth.js");
const newToken = await refreshTokenAndGetNew();
isRefreshing = false;
onRefreshSuccess(newToken);
originalRequest.headers.Authorization = `Bearer ${newToken}`;
return apiClient(originalRequest);
} catch (refreshError) {
isRefreshing = false;
onRefreshFailure(refreshError);
// Refresh failed: clear auth and redirect to login
deleteCookie("luciaToken");
deleteCookie("luciaRefreshToken");
deleteCookie("isLuciaLoggedIn");
globalThis.location.href = "/login";
throw refreshError;
}
},
);
export default apiClient;
+20 -1
View File
@@ -1,4 +1,13 @@
/* 全域字型 */
/* The Lucia project.
Copyright 2023-2026 DSP, inc. All rights reserved.
Authors:
chiayin.kuo@dsp.im (chiayin), 2023/4/18
cindy.chang@dsp.im (Cindy Chang), 2024/8/16
Base CSS layer with global font, validation, height,
and PrimeVue sidebar overrides. */
/* Global font */
@layer base {
html {
font-family: 'Roboto', sans-serif, system-ui;
@@ -18,3 +27,13 @@
.h-screen-main {
height: calc(100vh - 104px);
}
/* button */
.disable-hover {
@apply pointer-events-none
}
/* Map i panel ; overwrite primevue style */
.p-sidebar .p-sidebar-header {
padding: 8px;
}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#0099FF"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#BFE5FF"/>
</svg>

After

Width:  |  Height:  |  Size: 382 B

+6
View File
@@ -0,0 +1,6 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#64748B"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#BFE5FF"/>
</svg>

After

Width:  |  Height:  |  Size: 382 B

+7
View File
@@ -0,0 +1,7 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#0099FF"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#BFE5FF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#80CCFF"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

+7
View File
@@ -0,0 +1,7 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#64748B"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#BFE5FF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#80CCFF"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

+8
View File
@@ -0,0 +1,8 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#0099FF"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="9" y="9" width="30" height="30" rx="15" fill="#BFE5FF"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#80CCFF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 516 B

+8
View File
@@ -0,0 +1,8 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#64748B"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="white"/>
<rect x="9" y="9" width="30" height="30" rx="15" fill="#BFE5FF"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#80CCFF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 516 B

+8
View File
@@ -0,0 +1,8 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#0099FF"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="#BFE5FF"/>
<rect x="9" y="9" width="30" height="30" rx="15" fill="#80CCFF"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#0099FF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#0073BF"/>
</svg>

After

Width:  |  Height:  |  Size: 518 B

+8
View File
@@ -0,0 +1,8 @@
<svg width="216" height="48" viewBox="0 0 216 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" fill="white"/>
<rect x="0.5" y="0.5" width="215" height="47" rx="23.5" stroke="#64748B"/>
<rect x="4" y="4" width="40" height="40" rx="20" fill="#BFE5FF"/>
<rect x="9" y="9" width="30" height="30" rx="15" fill="#80CCFF"/>
<rect x="14" y="14" width="20" height="20" rx="10" fill="#0099FF"/>
<rect x="19" y="19" width="10" height="10" rx="5" fill="#0073BF"/>
</svg>

After

Width:  |  Height:  |  Size: 518 B

+36 -58
View File
@@ -1,3 +1,11 @@
/* The Lucia project.
Copyright 2023-2026 DSP, inc. All rights reserved.
Authors:
chiayin.kuo@dsp.im (chiayin), 2023/2/17
Reusable component styles including loaders, scrollbar,
buttons, and toggle buttons. */
/* loading */
.loader {
width: 64px;
@@ -30,62 +38,29 @@
transform: rotate(360deg)
}
}
/* loaderBar */
/* <span class="loaderBar"></span> */
.loaderBar {
width: 80%;
height: 16px;
display: inline-block;
background-color: #0099FF;
border: 1px solid #0099FF;
border-radius: 4px;
background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.25) 50%, rgba(0, 0, 0, 0.25) 75%, transparent 75%, transparent);
font-size: 30px;
background-size: 1em 1em;
box-sizing: border-box;
animation: barStripe 1s linear infinite;
}
/* toggle */
/* <div class="toggle">
<input type="checkbox"/>
<label></label>
</div> */
.toggle {
position: relative;
}
.toggle input[type="checkbox"] {
position: absolute;
left: 0;
top: 0;
z-index: 10;
width: 100%;
height: 100%;
cursor: pointer;
opacity: 0;
}
.toggle label {
position: relative;
display: flex;
align-items: center;
}
.toggle label:before {
content: '';
border: 5px solid #bbb;
height: 35px;
width: 70px;
position: relative;
display: inline-block;
border-radius: 46px;
transition: 0.2s ease-in;
}
.toggle label:after {
content: '';
position: absolute;
background: #555;
width: 28px;
height: 28px;
left: 8px;
top: 8px;
border-radius: 50%;
z-index: 2;
box-shadow: 0 0 5px #0002;
transition: 0.2s ease-in;
}
.toggle input[type="checkbox"]:hover + label:after {
box-shadow: 0 2px 15px 0 #0002, 0 3px 8px 0 #0001;
}
.toggle input[type="checkbox"]:checked + label:before {
border-color: #77C2BB;
}
.toggle input[type="checkbox"]:checked + label:after {
background: #009688;
left: 44px;
@keyframes barStripe {
0% {
background-position: 0 0;
}
100% {
background-position: 1em 0;
}
}
/* components */
@@ -100,11 +75,11 @@
}
.scrollbar::-webkit-scrollbar-thumb {
@apply bg-primary rounded-full
@apply bg-neutral-300 rounded-full
}
.scrollbar::-webkit-scrollbar-thumb:hover {
@apply bg-primary
@apply bg-neutral-400
}
}
@@ -119,7 +94,10 @@
@apply px-4 py-2.5
}
.btn-c-primary {
@apply text-neutral-50 bg-primary border border-primary hover:bg-neutral-50 hover:text-primary hover:border hover:border-primary active:border active:ring focus:outline-none focus:border-primary focus:ring
@apply hover:text-neutral-50 hover:bg-primary border border-primary bg-neutral-50 text-primary active:ring focus:outline-none active:ring-primary/50 focus:ring focus:ring-primary/50
}
.btn-cfm-secondary {
@apply border border-cfm-secondary bg-neutral-50 text-cfm-secondary hover:text-neutral-50 hover:bg-cfm-secondary active:ring focus:outline-none active:ring-cfm-secondary/50 focus:ring focus:ring-cfm-secondary/50
}
.btn-disable {
@apply border border-neutral-200 bg-neutral-50 text-neutral-200
+3
View File
@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.78415 2.03878C9.62269 1.72766 9.36953 1.46508 9.05382 1.28129C8.73812 1.09751 8.37272 1 7.99974 1C7.62675 1 7.26135 1.09751 6.94565 1.28129C6.62994 1.46508 6.37678 1.72766 6.21532 2.03878L0.520353 12.4048C-0.160994 13.6423 0.699988 15.2857 2.30407 15.2857H13.6947C15.2995 15.2857 16.1591 13.643 15.4791 12.4048L9.78415 2.03878ZM7.99974 5.54628C8.18584 5.54628 8.36432 5.61468 8.49591 5.73645C8.6275 5.85822 8.70143 6.02337 8.70143 6.19557V9.44205C8.70143 9.61425 8.6275 9.77941 8.49591 9.90117C8.36432 10.0229 8.18584 10.0913 7.99974 10.0913C7.81363 10.0913 7.63516 10.0229 7.50356 9.90117C7.37197 9.77941 7.29804 9.61425 7.29804 9.44205V6.19557C7.29804 6.02337 7.37197 5.85822 7.50356 5.73645C7.63516 5.61468 7.81363 5.54628 7.99974 5.54628ZM7.99974 11.0653C8.18584 11.0653 8.36432 11.1337 8.49591 11.2555C8.6275 11.3772 8.70143 11.5424 8.70143 11.7146V12.0392C8.70143 12.2114 8.6275 12.3766 8.49591 12.4984C8.36432 12.6201 8.18584 12.6885 7.99974 12.6885C7.81363 12.6885 7.63516 12.6201 7.50356 12.4984C7.37197 12.3766 7.29804 12.2114 7.29804 12.0392V11.7146C7.29804 11.5424 7.37197 11.3772 7.50356 11.2555C7.63516 11.1337 7.81363 11.0653 7.99974 11.0653Z" fill="#FF3366"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="16" height="16" rx="2" fill="white" stroke="#0099FF" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 200 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 10.4999L0 5.53988L1.59 3.99988L5 7.34988L12.41 -0.00012207L14 1.57988L5 10.4999Z" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 214 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="16" height="16" rx="2" fill="white" stroke="#CBD5E1" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 200 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="22" height="17" viewBox="0 0 22 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.3782 3.89078C21.1637 3.7117 20.9032 3.59652 20.6263 3.5584C20.3495 3.52027 20.0675 3.56073 19.8126 3.67515L15.0688 5.78453L12.3126 0.815776C12.1809 0.583799 11.99 0.390881 11.7594 0.256672C11.5289 0.122463 11.2669 0.0517578 11.0001 0.0517578C10.7333 0.0517578 10.4713 0.122463 10.2408 0.256672C10.0102 0.390881 9.81934 0.583799 9.6876 0.815776L6.93135 5.78453L2.1876 3.67515C1.93214 3.5609 1.64981 3.52039 1.37252 3.5582C1.09524 3.59601 0.834067 3.71064 0.618523 3.88912C0.402979 4.0676 0.241662 4.30282 0.15281 4.56819C0.0639569 4.83356 0.0511114 5.11849 0.115725 5.39078L2.49697 15.5439C2.54251 15.7405 2.62747 15.9257 2.74672 16.0885C2.86597 16.2513 3.01702 16.3881 3.19072 16.4908C3.42589 16.6315 3.69477 16.7061 3.96885 16.7064C4.10208 16.7062 4.23462 16.6872 4.3626 16.6502C8.70306 15.4501 13.2878 15.4501 17.6282 16.6502C18.0245 16.7543 18.446 16.697 18.8001 16.4908C18.9749 16.3894 19.1267 16.253 19.2461 16.09C19.3655 15.927 19.4499 15.7411 19.4938 15.5439L21.8845 5.39078C21.9484 5.11841 21.9348 4.83361 21.8454 4.56855C21.7559 4.30349 21.5941 4.06872 21.3782 3.89078ZM18.0313 15.2064C13.4274 13.9314 8.56346 13.9314 3.95948 15.2064L1.57823 5.05328L6.32197 7.15328C6.66236 7.30802 7.04868 7.32831 7.4034 7.21007C7.75813 7.09182 8.05501 6.8438 8.23447 6.51578L11.0001 1.54703L13.7657 6.51578C13.9452 6.8438 14.2421 7.09182 14.5968 7.21007C14.9515 7.32831 15.3378 7.30802 15.6782 7.15328L20.422 5.05328L18.0313 15.2064ZM14.7501 12.2345C14.7294 12.4194 14.6417 12.5902 14.5034 12.7146C14.3652 12.839 14.1861 12.9084 14.0001 12.9095H13.9251C11.9801 12.7126 10.0201 12.7126 8.0751 12.9095C7.87745 12.9305 7.67955 12.8722 7.52486 12.7474C7.37017 12.6226 7.27135 12.4415 7.2501 12.2439C7.23172 12.0453 7.29222 11.8474 7.41852 11.6931C7.54482 11.5387 7.72679 11.4402 7.9251 11.4189C9.96943 11.2033 12.0308 11.2033 14.0751 11.4189C14.2716 11.4402 14.4521 11.5374 14.5782 11.6897C14.7042 11.842 14.7659 12.0375 14.7501 12.2345Z" fill="#0F172A"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.5559 5.07692H16.667V4.30769C16.6644 3.69643 16.4178 3.11093 15.9807 2.6787C15.5437 2.24647 14.9517 2.00253 14.3337 2H9.66699C9.04894 2.00253 8.45694 2.24647 8.0199 2.6787C7.58287 3.11093 7.33622 3.69643 7.33366 4.30769V5.07692H3.44477C3.23849 5.07692 3.04066 5.15797 2.8948 5.30223C2.74894 5.44648 2.66699 5.64214 2.66699 5.84615C2.66699 6.05017 2.74894 6.24582 2.8948 6.39008C3.04066 6.53434 3.23849 6.61538 3.44477 6.61538H4.22255V20.4615C4.22255 20.8696 4.38644 21.2609 4.67816 21.5494C4.96988 21.8379 5.36554 22 5.7781 22H18.2225C18.6351 22 19.0308 21.8379 19.3225 21.5494C19.6142 21.2609 19.7781 20.8696 19.7781 20.4615V6.61538H20.5559C20.7622 6.61538 20.96 6.53434 21.1059 6.39008C21.2517 6.24582 21.3337 6.05017 21.3337 5.84615C21.3337 5.64214 21.2517 5.44648 21.1059 5.30223C20.96 5.15797 20.7622 5.07692 20.5559 5.07692ZM8.88921 4.30769C8.88921 4.10368 8.97116 3.90802 9.11702 3.76376C9.26288 3.61951 9.46071 3.53846 9.66699 3.53846H14.3337C14.5399 3.53846 14.7378 3.61951 14.8836 3.76376C15.0295 3.90802 15.1114 4.10368 15.1114 4.30769V5.07692H8.88921V4.30769ZM18.2225 20.4615H5.7781V6.61538H18.2225V20.4615ZM10.4448 10.4615V16.6154C10.4448 16.8194 10.3628 17.0151 10.217 17.1593C10.0711 17.3036 9.87327 17.3846 9.66699 17.3846C9.46071 17.3846 9.26288 17.3036 9.11702 17.1593C8.97116 17.0151 8.88921 16.8194 8.88921 16.6154V10.4615C8.88921 10.2575 8.97116 10.0619 9.11702 9.91761C9.26288 9.77335 9.46071 9.69231 9.66699 9.69231C9.87327 9.69231 10.0711 9.77335 10.217 9.91761C10.3628 10.0619 10.4448 10.2575 10.4448 10.4615ZM15.1114 10.4615V16.6154C15.1114 16.8194 15.0295 17.0151 14.8836 17.1593C14.7378 17.3036 14.5399 17.3846 14.3337 17.3846C14.1274 17.3846 13.9295 17.3036 13.7837 17.1593C13.6378 17.0151 13.5559 16.8194 13.5559 16.6154V10.4615C13.5559 10.2575 13.6378 10.0619 13.7837 9.91761C13.9295 9.77335 14.1274 9.69231 14.3337 9.69231C14.5399 9.69231 14.7378 9.77335 14.8836 9.91761C15.0295 10.0619 15.1114 10.2575 15.1114 10.4615Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.5559 5.07692H16.667V4.30769C16.6644 3.69643 16.4178 3.11093 15.9807 2.6787C15.5437 2.24647 14.9517 2.00253 14.3337 2H9.66699C9.04894 2.00253 8.45694 2.24647 8.0199 2.6787C7.58287 3.11093 7.33622 3.69643 7.33366 4.30769V5.07692H3.44477C3.23849 5.07692 3.04066 5.15797 2.8948 5.30223C2.74894 5.44648 2.66699 5.64214 2.66699 5.84615C2.66699 6.05017 2.74894 6.24582 2.8948 6.39008C3.04066 6.53434 3.23849 6.61538 3.44477 6.61538H4.22255V20.4615C4.22255 20.8696 4.38644 21.2609 4.67816 21.5494C4.96988 21.8379 5.36554 22 5.7781 22H18.2225C18.6351 22 19.0308 21.8379 19.3225 21.5494C19.6142 21.2609 19.7781 20.8696 19.7781 20.4615V6.61538H20.5559C20.7622 6.61538 20.96 6.53434 21.1059 6.39008C21.2517 6.24582 21.3337 6.05017 21.3337 5.84615C21.3337 5.64214 21.2517 5.44648 21.1059 5.30223C20.96 5.15797 20.7622 5.07692 20.5559 5.07692ZM8.88921 4.30769C8.88921 4.10368 8.97116 3.90802 9.11702 3.76376C9.26288 3.61951 9.46071 3.53846 9.66699 3.53846H14.3337C14.5399 3.53846 14.7378 3.61951 14.8836 3.76376C15.0295 3.90802 15.1114 4.10368 15.1114 4.30769V5.07692H8.88921V4.30769ZM18.2225 20.4615H5.7781V6.61538H18.2225V20.4615ZM10.4448 10.4615V16.6154C10.4448 16.8194 10.3628 17.0151 10.217 17.1593C10.0711 17.3036 9.87327 17.3846 9.66699 17.3846C9.46071 17.3846 9.26288 17.3036 9.11702 17.1593C8.97116 17.0151 8.88921 16.8194 8.88921 16.6154V10.4615C8.88921 10.2575 8.97116 10.0619 9.11702 9.91761C9.26288 9.77335 9.46071 9.69231 9.66699 9.69231C9.87327 9.69231 10.0711 9.77335 10.217 9.91761C10.3628 10.0619 10.4448 10.2575 10.4448 10.4615ZM15.1114 10.4615V16.6154C15.1114 16.8194 15.0295 17.0151 14.8836 17.1593C14.7378 17.3036 14.5399 17.3846 14.3337 17.3846C14.1274 17.3846 13.9295 17.3036 13.7837 17.1593C13.6378 17.0151 13.5559 16.8194 13.5559 16.6154V10.4615C13.5559 10.2575 13.6378 10.0619 13.7837 9.91761C13.9295 9.77335 14.1274 9.69231 14.3337 9.69231C14.5399 9.69231 14.7378 9.77335 14.8836 9.91761C15.0295 10.0619 15.1114 10.2575 15.1114 10.4615Z" fill="#FF3366"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.75 10.5C18.75 10.6989 18.671 10.8897 18.5303 11.0303C18.3897 11.171 18.1989 11.25 18 11.25H14.25C14.0511 11.25 13.8603 11.171 13.7197 11.0303C13.579 10.8897 13.5 10.6989 13.5 10.5C13.5 10.3011 13.579 10.1103 13.7197 9.96967C13.8603 9.82902 14.0511 9.75 14.25 9.75H18C18.1989 9.75 18.3897 9.82902 18.5303 9.96967C18.671 10.1103 18.75 10.3011 18.75 10.5ZM18 12.75H14.25C14.0511 12.75 13.8603 12.829 13.7197 12.9697C13.579 13.1103 13.5 13.3011 13.5 13.5C13.5 13.6989 13.579 13.8897 13.7197 14.0303C13.8603 14.171 14.0511 14.25 14.25 14.25H18C18.1989 14.25 18.3897 14.171 18.5303 14.0303C18.671 13.8897 18.75 13.6989 18.75 13.5C18.75 13.3011 18.671 13.1103 18.5303 12.9697C18.3897 12.829 18.1989 12.75 18 12.75ZM12.2625 15.5625C12.2878 15.6573 12.2941 15.7562 12.2809 15.8535C12.2677 15.9507 12.2353 16.0444 12.1855 16.129C12.1358 16.2136 12.0698 16.2875 11.9912 16.3463C11.9127 16.4052 11.8233 16.4479 11.7281 16.4719C11.6327 16.4973 11.5332 16.5037 11.4353 16.4906C11.3374 16.4775 11.2431 16.4452 11.1578 16.3955C11.0724 16.3459 10.9977 16.2799 10.9379 16.2013C10.8781 16.1227 10.8344 16.033 10.8094 15.9375C10.6823 15.4576 10.4 15.0333 10.0067 14.7305C9.61326 14.4278 9.13079 14.2636 8.63437 14.2636C8.13796 14.2636 7.65549 14.4278 7.26209 14.7305C6.8687 15.0333 6.58648 15.4576 6.45938 15.9375C6.41615 16.0985 6.32112 16.2409 6.18896 16.3425C6.0568 16.4442 5.89486 16.4995 5.72812 16.5L5.54062 16.4719C5.44547 16.4479 5.35603 16.4052 5.2775 16.3463C5.19898 16.2875 5.13294 16.2136 5.08322 16.129C5.0335 16.0444 5.00109 15.9507 4.98788 15.8535C4.97466 15.7562 4.98091 15.6573 5.00625 15.5625C5.23456 14.676 5.77774 13.9028 6.53437 13.3875C6.10882 12.9704 5.81713 12.436 5.69649 11.8524C5.57586 11.2688 5.63175 10.6626 5.85703 10.1109C6.08232 9.55922 6.46679 9.08714 6.96143 8.75484C7.45608 8.42254 8.03848 8.24507 8.63437 8.24507C9.23027 8.24507 9.81267 8.42254 10.3073 8.75484C10.802 9.08714 11.1864 9.55922 11.4117 10.1109C11.637 10.6626 11.6929 11.2688 11.5723 11.8524C11.4516 12.436 11.1599 12.9704 10.7344 13.3875C11.491 13.9028 12.0342 14.676 12.2625 15.5625ZM8.63437 12.75C8.93105 12.75 9.22106 12.662 9.46773 12.4972C9.7144 12.3324 9.90666 12.0981 10.0202 11.824C10.1337 11.5499 10.1634 11.2483 10.1056 10.9574C10.0477 10.6664 9.90481 10.3991 9.69504 10.1893C9.48526 9.97956 9.21798 9.8367 8.92701 9.77882C8.63604 9.72094 8.33444 9.75065 8.06035 9.86418C7.78626 9.97771 7.55199 10.17 7.38717 10.4166C7.22235 10.6633 7.13438 10.9533 7.13437 11.25C7.13437 11.6478 7.29241 12.0294 7.57372 12.3107C7.85502 12.592 8.23655 12.75 8.63437 12.75ZM21.75 5.25V18.75C21.75 19.1478 21.592 19.5294 21.3107 19.8107C21.0294 20.092 20.6478 20.25 20.25 20.25H3.75C3.35218 20.25 2.97064 20.092 2.68934 19.8107C2.40804 19.5294 2.25 19.1478 2.25 18.75V5.25C2.25 4.85218 2.40804 4.47064 2.68934 4.18934C2.97064 3.90804 3.35218 3.75 3.75 3.75H20.25C20.6478 3.75 21.0294 3.90804 21.3107 4.18934C21.592 4.47064 21.75 4.85218 21.75 5.25ZM20.25 18.75V5.25H3.75V18.75H20.25Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.75 10.5C18.75 10.6989 18.671 10.8897 18.5303 11.0303C18.3897 11.171 18.1989 11.25 18 11.25H14.25C14.0511 11.25 13.8603 11.171 13.7197 11.0303C13.579 10.8897 13.5 10.6989 13.5 10.5C13.5 10.3011 13.579 10.1103 13.7197 9.96967C13.8603 9.82902 14.0511 9.75 14.25 9.75H18C18.1989 9.75 18.3897 9.82902 18.5303 9.96967C18.671 10.1103 18.75 10.3011 18.75 10.5ZM18 12.75H14.25C14.0511 12.75 13.8603 12.829 13.7197 12.9697C13.579 13.1103 13.5 13.3011 13.5 13.5C13.5 13.6989 13.579 13.8897 13.7197 14.0303C13.8603 14.171 14.0511 14.25 14.25 14.25H18C18.1989 14.25 18.3897 14.171 18.5303 14.0303C18.671 13.8897 18.75 13.6989 18.75 13.5C18.75 13.3011 18.671 13.1103 18.5303 12.9697C18.3897 12.829 18.1989 12.75 18 12.75ZM12.2625 15.5625C12.2878 15.6573 12.2941 15.7562 12.2809 15.8535C12.2677 15.9507 12.2353 16.0444 12.1855 16.129C12.1358 16.2136 12.0698 16.2875 11.9912 16.3463C11.9127 16.4052 11.8233 16.4479 11.7281 16.4719C11.6327 16.4973 11.5332 16.5037 11.4353 16.4906C11.3374 16.4775 11.2431 16.4452 11.1578 16.3955C11.0724 16.3459 10.9977 16.2799 10.9379 16.2013C10.8781 16.1227 10.8344 16.033 10.8094 15.9375C10.6823 15.4576 10.4 15.0333 10.0067 14.7305C9.61326 14.4278 9.13079 14.2636 8.63437 14.2636C8.13796 14.2636 7.65549 14.4278 7.26209 14.7305C6.8687 15.0333 6.58648 15.4576 6.45938 15.9375C6.41615 16.0985 6.32112 16.2409 6.18896 16.3425C6.0568 16.4442 5.89486 16.4995 5.72812 16.5L5.54062 16.4719C5.44547 16.4479 5.35603 16.4052 5.2775 16.3463C5.19898 16.2875 5.13294 16.2136 5.08322 16.129C5.0335 16.0444 5.00109 15.9507 4.98788 15.8535C4.97466 15.7562 4.98091 15.6573 5.00625 15.5625C5.23456 14.676 5.77774 13.9028 6.53437 13.3875C6.10882 12.9704 5.81713 12.436 5.69649 11.8524C5.57586 11.2688 5.63175 10.6626 5.85703 10.1109C6.08232 9.55922 6.46679 9.08714 6.96143 8.75484C7.45608 8.42254 8.03848 8.24507 8.63437 8.24507C9.23027 8.24507 9.81267 8.42254 10.3073 8.75484C10.802 9.08714 11.1864 9.55922 11.4117 10.1109C11.637 10.6626 11.6929 11.2688 11.5723 11.8524C11.4516 12.436 11.1599 12.9704 10.7344 13.3875C11.491 13.9028 12.0342 14.676 12.2625 15.5625ZM8.63437 12.75C8.93105 12.75 9.22106 12.662 9.46773 12.4972C9.7144 12.3324 9.90666 12.0981 10.0202 11.824C10.1337 11.5499 10.1634 11.2483 10.1056 10.9574C10.0477 10.6664 9.90481 10.3991 9.69504 10.1893C9.48526 9.97956 9.21798 9.8367 8.92701 9.77882C8.63604 9.72094 8.33444 9.75065 8.06035 9.86418C7.78626 9.97771 7.55199 10.17 7.38717 10.4166C7.22235 10.6633 7.13438 10.9533 7.13437 11.25C7.13437 11.6478 7.29241 12.0294 7.57372 12.3107C7.85502 12.592 8.23655 12.75 8.63437 12.75ZM21.75 5.25V18.75C21.75 19.1478 21.592 19.5294 21.3107 19.8107C21.0294 20.092 20.6478 20.25 20.25 20.25H3.75C3.35218 20.25 2.97064 20.092 2.68934 19.8107C2.40804 19.5294 2.25 19.1478 2.25 18.75V5.25C2.25 4.85218 2.40804 4.47064 2.68934 4.18934C2.97064 3.90804 3.35218 3.75 3.75 3.75H20.25C20.6478 3.75 21.0294 3.90804 21.3107 4.18934C21.592 4.47064 21.75 4.85218 21.75 5.25ZM20.25 18.75V5.25H3.75V18.75H20.25Z" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 19H6.4L15.025 10.375L13.625 8.975L5 17.6V19ZM19.3 8.925L15.05 4.725L16.45 3.325C16.8333 2.94167 17.3043 2.75 17.863 2.75C18.421 2.75 18.8917 2.94167 19.275 3.325L20.675 4.725C21.0583 5.10833 21.2583 5.571 21.275 6.113C21.2917 6.65433 21.1083 7.11667 20.725 7.5L19.3 8.925ZM4 21C3.71667 21 3.47933 20.904 3.288 20.712C3.096 20.5207 3 20.2833 3 20V17.175C3 17.0417 3.025 16.9127 3.075 16.788C3.125 16.6627 3.2 16.55 3.3 16.45L13.6 6.15L17.85 10.4L7.55 20.7C7.45 20.8 7.33767 20.875 7.213 20.925C7.08767 20.975 6.95833 21 6.825 21H4ZM14.325 9.675L13.625 8.975L15.025 10.375L14.325 9.675Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 718 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 19H6.4L15.025 10.375L13.625 8.975L5 17.6V19ZM19.3 8.925L15.05 4.725L16.45 3.325C16.8333 2.94167 17.3043 2.75 17.863 2.75C18.421 2.75 18.8917 2.94167 19.275 3.325L20.675 4.725C21.0583 5.10833 21.2583 5.571 21.275 6.113C21.2917 6.65433 21.1083 7.11667 20.725 7.5L19.3 8.925ZM4 21C3.71667 21 3.47933 20.904 3.288 20.712C3.096 20.5207 3 20.2833 3 20V17.175C3 17.0417 3.025 16.9127 3.075 16.788C3.125 16.6627 3.2 16.55 3.3 16.45L13.6 6.15L17.85 10.4L7.55 20.7C7.45 20.8 7.33767 20.875 7.213 20.925C7.08767 20.975 6.95833 21 6.825 21H4ZM14.325 9.675L13.625 8.975L15.025 10.375L14.325 9.675Z" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 718 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 5.27L3.28 4L20 20.72L18.73 22L15.65 18.92C14.5 19.3 13.28 19.5 12 19.5C7 19.5 2.73 16.39 1 12C1.69 10.24 2.79 8.69 4.19 7.46L2 5.27ZM12 9C12.7956 9 13.5587 9.31607 14.1213 9.87868C14.6839 10.4413 15 11.2044 15 12C15.0005 12.3406 14.943 12.6787 14.83 13L11 9.17C11.3213 9.05698 11.6594 8.99949 12 9ZM12 4.5C17 4.5 21.27 7.61 23 12C22.1839 14.0732 20.7969 15.8727 19 17.19L17.58 15.76C18.9629 14.8034 20.0782 13.5091 20.82 12C20.0116 10.3499 18.7564 8.95977 17.1973 7.9875C15.6381 7.01524 13.8375 6.49988 12 6.5C10.91 6.5 9.84 6.68 8.84 7L7.3 5.47C8.74 4.85 10.33 4.5 12 4.5ZM3.18 12C3.98844 13.6501 5.24357 15.0402 6.80273 16.0125C8.36189 16.9848 10.1625 17.5001 12 17.5C12.69 17.5 13.37 17.43 14 17.29L11.72 15C11.0242 14.9254 10.3748 14.6149 9.87997 14.12C9.38512 13.6252 9.07458 12.9758 9 12.28L5.6 8.87C4.61 9.72 3.78 10.78 3.18 12Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 969 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 9C12.7956 9 13.5587 9.31607 14.1213 9.87868C14.6839 10.4413 15 11.2044 15 12C15 12.7956 14.6839 13.5587 14.1213 14.1213C13.5587 14.6839 12.7956 15 12 15C11.2044 15 10.4413 14.6839 9.87868 14.1213C9.31607 13.5587 9 12.7956 9 12C9 11.2044 9.31607 10.4413 9.87868 9.87868C10.4413 9.31607 11.2044 9 12 9ZM12 4.5C17 4.5 21.27 7.61 23 12C21.27 16.39 17 19.5 12 19.5C7 19.5 2.73 16.39 1 12C2.73 7.61 7 4.5 12 4.5ZM3.18 12C3.98825 13.6503 5.24331 15.0407 6.80248 16.0133C8.36165 16.9858 10.1624 17.5013 12 17.5013C13.8376 17.5013 15.6383 16.9858 17.1975 16.0133C18.7567 15.0407 20.0117 13.6503 20.82 12C20.0117 10.3497 18.7567 8.95925 17.1975 7.98675C15.6383 7.01424 13.8376 6.49868 12 6.49868C10.1624 6.49868 8.36165 7.01424 6.80248 7.98675C5.24331 8.95925 3.98825 10.3497 3.18 12Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 909 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 10.0009C20.0001 8.33719 19.5851 6.69976 18.7926 5.23693C18.0002 3.7741 16.8554 2.5321 15.4618 1.62342C14.0683 0.714739 12.47 0.168101 10.8119 0.0330203C9.15382 -0.10206 7.48821 0.178686 5.96597 0.849826C4.44374 1.52097 3.11298 2.5613 2.09425 3.87657C1.07552 5.19185 0.401001 6.74052 0.131798 8.38229C-0.137405 10.0241 0.00721324 11.7071 0.552553 13.2788C1.09789 14.8506 2.02672 16.2615 3.2549 17.3837L3.37255 17.4817C5.19907 19.104 7.55712 20 10 20C12.4429 20 14.8009 19.104 16.6275 17.4817L16.7451 17.3837C17.7716 16.4474 18.5913 15.3071 19.1518 14.0359C19.7123 12.7646 20.0012 11.3903 20 10.0009ZM1.17647 10.0009C1.1745 8.56033 1.52523 7.1412 2.19802 5.86743C2.87081 4.59365 3.84521 3.50398 5.03612 2.69356C6.22703 1.88315 7.59822 1.37664 9.02997 1.21827C10.4617 1.0599 11.9104 1.25448 13.2497 1.78503C14.5889 2.31558 15.7779 3.16596 16.7127 4.26191C17.6476 5.35785 18.3 6.66602 18.6129 8.07219C18.9258 9.47835 18.8896 10.9397 18.5076 12.3287C18.1257 13.7177 17.4095 14.992 16.4216 16.0404C15.495 14.6071 14.114 13.5264 12.5 12.9716C13.3057 12.435 13.9174 11.6532 14.2445 10.7421C14.5716 9.83088 14.5969 8.83861 14.3166 7.91195C14.0362 6.9853 13.4652 6.17346 12.6878 5.59646C11.9105 5.01945 10.9681 4.70792 10 4.70792C9.03193 4.70792 8.08954 5.01945 7.31218 5.59646C6.53483 6.17346 5.96377 6.9853 5.68343 7.91195C5.40309 8.83861 5.42836 9.83088 5.7555 10.7421C6.08264 11.6532 6.69429 12.435 7.5 12.9716C5.88597 13.5264 4.50496 14.6071 3.57843 16.0404C2.03426 14.409 1.17458 12.2473 1.17647 10.0009ZM6.66667 9.21653C6.66667 8.55722 6.86217 7.91271 7.22844 7.36452C7.59471 6.81632 8.1153 6.38906 8.72439 6.13675C9.33348 5.88444 10.0037 5.81843 10.6503 5.94705C11.2969 6.07568 11.8909 6.39317 12.357 6.85937C12.8232 7.32557 13.1407 7.91955 13.2693 8.56619C13.3979 9.21283 13.3319 9.88309 13.0796 10.4922C12.8273 11.1013 12.4001 11.622 11.8519 11.9883C11.3037 12.3545 10.6593 12.5501 10 12.5501C9.11674 12.5475 8.2704 12.1954 7.64584 11.5708C7.02128 10.9462 6.66926 10.0998 6.66667 9.21653ZM4.45098 16.864C5.02766 15.908 5.84156 15.1171 6.81377 14.5681C7.78598 14.0191 8.88352 13.7307 10 13.7307C11.1165 13.7307 12.214 14.0191 13.1862 14.5681C14.1584 15.1171 14.9723 15.908 15.549 16.864C13.9778 18.1327 12.0194 18.8246 10 18.8246C7.98061 18.8246 6.02219 18.1327 4.45098 16.864Z" fill="#0F172A"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M32 16.0014C32.0001 13.3395 31.3361 10.7196 30.0682 8.37909C28.8003 6.03856 26.9685 4.05135 24.7389 2.59747C22.5092 1.14358 19.9521 0.268961 17.2991 0.0528324C14.6461 -0.163296 11.9811 0.285897 9.54556 1.35972C7.10998 2.43355 4.98077 4.09807 3.3508 6.20252C1.72083 8.30696 0.641601 10.7848 0.210876 13.4117C-0.219849 16.0385 0.0115412 18.7313 0.884085 21.2461C1.75663 23.761 3.24275 26.0184 5.20784 27.8139L5.39608 27.9707C8.31851 30.5664 12.0914 32 16 32C19.9086 32 23.6815 30.5664 26.6039 27.9707L26.7922 27.8139C28.4345 26.3158 29.7461 24.4914 30.6428 22.4574C31.5396 20.4233 32.0019 18.2244 32 16.0014ZM1.88236 16.0014C1.8792 13.6965 2.44036 11.4259 3.51683 9.38788C4.5933 7.34985 6.15233 5.60636 8.05779 4.3097C9.96324 3.01303 12.1572 2.20262 14.4479 1.94922C16.7387 1.69583 19.0567 2.00717 21.1995 2.85605C23.3422 3.70493 25.2446 5.06554 26.7404 6.81905C28.2362 8.57255 29.28 10.6656 29.7806 12.9155C30.2812 15.1654 30.2234 17.5036 29.6122 19.7259C29.0011 21.9483 27.8551 23.9873 26.2745 25.6647C24.7921 23.3713 22.5825 21.6422 20 20.7546C21.2891 19.8959 22.2678 18.6452 22.7912 17.1873C23.3146 15.7294 23.3551 14.1418 22.9065 12.6591C22.458 11.1765 21.5443 9.87753 20.3005 8.95433C19.0567 8.03112 17.5489 7.53267 16 7.53267C14.4511 7.53267 12.9433 8.03112 11.6995 8.95433C10.4557 9.87753 9.54202 11.1765 9.09348 12.6591C8.64494 14.1418 8.68537 15.7294 9.2088 17.1873C9.73222 18.6452 10.7109 19.8959 12 20.7546C9.41754 21.6422 7.20793 23.3713 5.72549 25.6647C3.25482 23.0543 1.87932 19.5957 1.88236 16.0014ZM10.6667 14.7464C10.6667 13.6915 10.9795 12.6603 11.5655 11.7832C12.1515 10.9061 12.9845 10.2225 13.959 9.8188C14.9336 9.41511 16.0059 9.30948 17.0405 9.51528C18.075 9.72108 19.0254 10.2291 19.7712 10.975C20.5171 11.7209 21.0251 12.6713 21.2309 13.7059C21.4366 14.7405 21.331 15.8129 20.9274 16.7875C20.5237 17.7621 19.8401 18.5951 18.963 19.1812C18.086 19.7673 17.0548 20.0801 16 20.0801C14.5868 20.0759 13.2326 19.5127 12.2333 18.5133C11.234 17.514 10.6708 16.1597 10.6667 14.7464ZM7.12157 26.9824C8.04426 25.4527 9.34649 24.1873 10.902 23.309C12.4576 22.4306 14.2136 21.9691 16 21.9691C17.7864 21.9691 19.5424 22.4306 21.098 23.309C22.6535 24.1873 23.9557 25.4527 24.8784 26.9824C22.3645 29.0122 19.231 30.1194 16 30.1194C12.769 30.1194 9.6355 29.0122 7.12157 26.9824Z" fill="#0099FF"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.1386 8.155C38.4927 6.91052 37.4801 5.8602 36.2172 5.12506C34.9544 4.38992 33.4928 3.99988 32.0009 3.99988C30.509 3.99988 29.0474 4.38992 27.7846 5.12506C26.5217 5.8602 25.5091 6.91052 24.8632 8.155L2.08337 49.619C-0.642023 54.5693 2.8019 61.1427 9.21822 61.1427H54.7808C61.1999 61.1427 64.6382 54.5719 61.9184 49.619L39.1386 8.155ZM32.0009 22.185C32.7453 22.185 33.4592 22.4586 33.9856 22.9457C34.512 23.4327 34.8077 24.0933 34.8077 24.7822V37.7681C34.8077 38.4569 34.512 39.1175 33.9856 39.6046C33.4592 40.0916 32.7453 40.3653 32.0009 40.3653C31.2565 40.3653 30.5426 40.0916 30.0162 39.6046C29.4898 39.1175 29.1941 38.4569 29.1941 37.7681V24.7822C29.1941 24.0933 29.4898 23.4327 30.0162 22.9457C30.5426 22.4586 31.2565 22.185 32.0009 22.185ZM32.0009 44.261C32.7453 44.261 33.4592 44.5347 33.9856 45.0217C34.512 45.5088 34.8077 46.1694 34.8077 46.8582V48.1568C34.8077 48.8456 34.512 49.5062 33.9856 49.9933C33.4592 50.4804 32.7453 50.754 32.0009 50.754C31.2565 50.754 30.5426 50.4804 30.0162 49.9933C29.4898 49.5062 29.1941 48.8456 29.1941 48.1568V46.8582C29.1941 46.1694 29.4898 45.5088 30.0162 45.0217C30.5426 44.5347 31.2565 44.261 32.0009 44.261Z" fill="#FF3366"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 13L19 9M19 9L15 5M19 9H5M11 13V14C11 14.7956 10.6839 15.5587 10.1213 16.1213C9.55871 16.6839 8.79565 17 8 17H4C3.20435 17 2.44129 16.6839 1.87868 16.1213C1.31607 15.5587 1 14.7956 1 14V4C1 3.20435 1.31607 2.44129 1.87868 1.87868C2.44129 1.31607 3.20435 1 4 1H8C8.79565 1 9.55871 1.31607 10.1213 1.87868C10.6839 2.44129 11 3.20435 11 4V5" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 539 B

+4
View File
@@ -0,0 +1,4 @@
<svg width="35" height="16" viewBox="0 0 35 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.11 14.49L30.19 7.87L34.07 1.52C34.1621 1.36868 34.2124 1.1956 34.2157 1.01848C34.2189 0.841351 34.1751 0.666534 34.0886 0.511912C34.0022 0.35729 33.8762 0.228414 33.7236 0.138469C33.5709 0.0485231 33.3972 0.000737145 33.22 0H2C1.46957 0 0.960859 0.210714 0.585786 0.585787C0.210714 0.96086 0 1.46957 0 2L0 14C0 14.5304 0.210714 15.0391 0.585786 15.4142C0.960859 15.7893 1.46957 16 2 16H33.25C33.4265 16 33.5999 15.9532 33.7524 15.8645C33.905 15.7758 34.0314 15.6483 34.1188 15.4949C34.2061 15.3415 34.2513 15.1678 34.2498 14.9913C34.2482 14.8148 34.2 14.6418 34.11 14.49ZM10.51 11.18H9.39L6.13 6.84V11.19H5V5H6.13L9.4 9.35V5H10.52L10.51 11.18ZM16.84 6H13.31V7.49H16.51V8.49H13.31V10.1H16.84V11.1H12.18V5H16.83L16.84 6ZM25.13 11.16H24L22.45 6.57L20.9 11.18H19.78L17.78 5H19L20.32 9.43L21.84 5H23.06L24.52 9.43L25.85 5H27.08L25.13 11.16Z" fill="#FFCC44"/>
<path d="M34.11 14.49L30.19 7.87L34.07 1.52C34.1621 1.36868 34.2124 1.1956 34.2157 1.01848C34.2189 0.841351 34.1751 0.666534 34.0886 0.511912C34.0022 0.35729 33.8762 0.228414 33.7236 0.138469C33.5709 0.0485231 33.3972 0.000737145 33.22 0H2C1.46957 0 0.960859 0.210714 0.585786 0.585787C0.210714 0.96086 0 1.46957 0 2L0 14C0 14.5304 0.210714 15.0391 0.585786 15.4142C0.960859 15.7893 1.46957 16 2 16H33.25C33.4265 16 33.5999 15.9532 33.7524 15.8645C33.905 15.7758 34.0314 15.6483 34.1188 15.4949C34.2061 15.3415 34.2513 15.1678 34.2498 14.9913C34.2482 14.8148 34.2 14.6418 34.11 14.49ZM10.51 11.18H9.39L6.13 6.84V11.19H5V5H6.13L9.4 9.35V5H10.52L10.51 11.18ZM16.84 6H13.31V7.49H16.51V8.49H13.31V10.1H16.84V11.1H12.18V5H16.83L16.84 6ZM25.13 11.16H24L22.45 6.57L20.9 11.18H19.78L17.78 5H19L20.32 9.43L21.84 5H23.06L24.52 9.43L25.85 5H27.08L25.13 11.16Z" fill="#FFAA44"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.5 19C15.1944 19 19 15.1944 19 10.5C19 5.80558 15.1944 2 10.5 2C5.80558 2 2 5.80558 2 10.5C2 15.1944 5.80558 19 10.5 19Z" stroke="#4E5969" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21 21L17 17" stroke="#4E5969" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 430 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.7081 18.2926C19.801 18.3855 19.8747 18.4958 19.9249 18.6172C19.9752 18.7386 20.0011 18.8687 20.0011 19.0001C20.0011 19.1315 19.9752 19.2616 19.9249 19.383C19.8747 19.5044 19.801 19.6147 19.7081 19.7076C19.6151 19.8005 19.5048 19.8742 19.3835 19.9245C19.2621 19.9747 19.132 20.0006 19.0006 20.0006C18.8692 20.0006 18.7391 19.9747 18.6177 19.9245C18.4963 19.8742 18.386 19.8005 18.2931 19.7076L10.0006 11.4138L1.70806 19.7076C1.52042 19.8952 1.26592 20.0006 1.00056 20.0006C0.735192 20.0006 0.480697 19.8952 0.293056 19.7076C0.105415 19.5199 5.23096e-09 19.2654 0 19.0001C-5.23096e-09 18.7347 0.105415 18.4802 0.293056 18.2926L8.58681 10.0001L0.293056 1.70757C0.105415 1.51993 -1.97712e-09 1.26543 0 1.00007C1.97712e-09 0.734704 0.105415 0.480208 0.293056 0.292568C0.480697 0.104927 0.735192 -0.000488279 1.00056 -0.000488281C1.26592 -0.000488283 1.52042 0.104927 1.70806 0.292568L10.0006 8.58632L18.2931 0.292568C18.4807 0.104927 18.7352 -0.000488286 19.0006 -0.000488281C19.2659 -0.000488276 19.5204 0.104927 19.7081 0.292568C19.8957 0.480208 20.0011 0.734704 20.0011 1.00007C20.0011 1.26543 19.8957 1.51993 19.7081 1.70757L11.4143 10.0001L19.7081 18.2926Z" fill="#64748B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+11 -1
View File
@@ -1,6 +1,16 @@
/* The Lucia project.
Copyright 2023-2026 DSP, inc. All rights reserved.
Authors:
chiayin.kuo@dsp.im (chiayin), 2023/4/18
Layout styles for navbar and heading elements. */
/* Navbar */
nav ul>li {
@apply px-2 py-3.5 duration-300 hover:bg-neutral-900 hover:text-neutral-10 active:bg-neutral-900 active:text-neutral-10;
@apply px-2 py-3.5 duration-300 hover:bg-neutral-900 hover:text-neutral-10 ;
}
nav ul>li.active {
@apply bg-neutral-900 text-neutral-10 duration-300;
}
/* Header */
+9
View File
@@ -1,5 +1,14 @@
/* The Lucia project.
Copyright 2023-2026 DSP, inc. All rights reserved.
Authors:
chiayin.kuo@dsp.im (chiayin), 2023/1/31
cindy.chang@dsp.im (Cindy Chang), 2024/6/18
Main CSS entry point that imports all stylesheet modules. */
@import './tailwind.css';
@import './base.css';
@import './components.css';
@import './layout.css';
@import './vendors.css';
@import './zindex.css';
+23
View File
@@ -0,0 +1,23 @@
<svg width="40" height="24" viewBox="0 0 40 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3442_4283)">
<rect width="40" height="24" rx="12" fill="#C9CDD4"/>
<g filter="url(#filter0_d_3442_4283)">
<circle cx="12" cy="12" r="10" fill="white"/>
</g>
</g>
<rect x="1" y="1" width="38" height="22" rx="11" stroke="#64748B" stroke-width="2"/>
<defs>
<filter id="filter0_d_3442_4283" x="0" y="2" width="24" height="24" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3442_4283"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3442_4283" result="shape"/>
</filter>
<clipPath id="clip0_3442_4283">
<rect width="40" height="24" rx="12" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More