@tequila99/githuman 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/db/migrations.js +33 -4
- package/dist/server/repositories/comment.repo.js +3 -2
- package/dist/server/repositories/review-file.repo.js +17 -0
- package/dist/server/repositories/review.repo.js +53 -6
- package/dist/server/routes/comments.js +1 -0
- package/dist/server/routes/reviews.js +24 -3
- package/dist/server/services/comment.service.js +1 -0
- package/dist/server/services/review.service.js +117 -18
- package/dist/web/assets/AppPage-VD8mwL62.js +1 -0
- package/dist/web/assets/CreateReviewFabButton-B4Ut5O1Z.js +1 -0
- package/dist/web/assets/CreateReviewFabButton-BqWdgfEf.css +1 -0
- package/dist/web/assets/ErrorNotFound-DMYc7a3H.js +1 -0
- package/dist/web/assets/IndexPage-BQ0T9rLY.css +1 -0
- package/dist/web/assets/IndexPage-_YmeSrRQ.js +1 -0
- package/dist/web/assets/MainLayout-D2-McXhW.js +1 -0
- package/dist/web/assets/Platform-CEDL_PgC.js +1 -0
- package/dist/web/assets/QBtn-Cf6WtiKt.js +1 -0
- package/dist/web/assets/QItemSection-DA4jtl1i.js +1 -0
- package/dist/web/assets/QList-BeOKfebe.js +1 -0
- package/dist/web/assets/QTooltip-DAb5vBzv.js +1 -0
- package/dist/web/assets/ReviewDetailPage-BlTGnC8d.js +1 -0
- package/dist/web/assets/ReviewDetailPage-DJHzinT1.css +1 -0
- package/dist/web/assets/ReviewsPage-Cu0NzNHQ.js +1 -0
- package/dist/web/assets/ReviewsPage-D9TFy2OP.css +1 -0
- package/dist/web/assets/StatusSwitcher-BQBbWZPW.js +3 -0
- package/dist/web/assets/StatusSwitcher-CZVJtHnr.css +1 -0
- package/dist/web/assets/client-De34x_P_.js +1 -0
- package/dist/web/assets/event-BQt_DXaR.js +1 -0
- package/dist/web/assets/format-B_1hRYcb.js +1 -0
- package/dist/web/assets/i18n-D0uDA2bL.js +1 -0
- package/dist/web/assets/index-Dl3zmXcR.js +2 -0
- package/dist/web/assets/{index-Fo431P2N.css → index-JAYe_SFI.css} +1 -1
- package/dist/web/assets/init-app-DDJ8U-8D.js +1 -0
- package/dist/web/assets/pinia-C3vnQv9G.js +1 -0
- package/dist/web/assets/pinia-DK4OjQ7o.js +1 -0
- package/dist/web/assets/repository-store-CBxek7MZ.js +1 -0
- package/dist/web/assets/runtime-core.esm-bundler-Wxr8ezGp.js +1 -0
- package/dist/web/assets/theme-CQChVMvK.js +1 -0
- package/dist/web/assets/{use-app-theme-DrR0AvTg.js → use-app-theme-DvzGyhQd.js} +1 -1
- package/dist/web/assets/{vue-i18n.runtime-nPdXRlNg.js → vue-i18n.runtime-DSeWNwrW.js} +2 -2
- package/dist/web/index.html +6 -4
- package/package.json +1 -1
- package/dist/web/assets/ErrorNotFound-C0A8n_dh.js +0 -1
- package/dist/web/assets/IndexPage-Ca7Xb-lc.js +0 -3
- package/dist/web/assets/IndexPage-Dn15ye8s.css +0 -1
- package/dist/web/assets/MainLayout-DHuQjMOV.js +0 -1
- package/dist/web/assets/QPage-DLIDrL1Z.js +0 -1
- package/dist/web/assets/ReviewsPage-f8fJEuU9.js +0 -1
- package/dist/web/assets/client-TNhDHmkt.js +0 -1
- package/dist/web/assets/create-C46qMo0y.js +0 -1
- package/dist/web/assets/format-SW_H2PBI.js +0 -1
- package/dist/web/assets/i18n-RyrLuvXU.js +0 -1
- package/dist/web/assets/index-CRwZKCt6.js +0 -2
- package/dist/web/assets/init-app-DSQzny_G.js +0 -1
- package/dist/web/assets/pinia-BDCzxZ18.js +0 -1
- package/dist/web/assets/pinia-BJouyyXU.js +0 -1
- package/dist/web/assets/repository-store-DqnwJIJW.js +0 -1
- package/dist/web/assets/runtime-core.esm-bundler-oS9U9Vp7.js +0 -1
- package/dist/web/assets/theme-DUV6mF_4.js +0 -1
|
@@ -22,13 +22,42 @@ export function applyMigrations(db) {
|
|
|
22
22
|
created_at TEXT NOT NULL,
|
|
23
23
|
updated_at TEXT NOT NULL
|
|
24
24
|
);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE IF NOT EXISTS review_files (
|
|
27
|
+
review_id TEXT NOT NULL REFERENCES reviews(id),
|
|
28
|
+
file_path TEXT NOT NULL
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS review_files_file_path_idx
|
|
32
|
+
ON review_files(file_path);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS review_files_review_id_idx
|
|
34
|
+
ON review_files(review_id);
|
|
25
35
|
`);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
const commentColumns = db
|
|
37
|
+
.prepare('PRAGMA table_info(comments)')
|
|
38
|
+
.all();
|
|
39
|
+
const commentColumnNames = new Set(commentColumns.map(c => c.name));
|
|
40
|
+
if (!commentColumnNames.has('resolved')) {
|
|
29
41
|
db.exec('ALTER TABLE comments ADD COLUMN resolved INTEGER NOT NULL DEFAULT 0');
|
|
30
42
|
}
|
|
31
|
-
if (!
|
|
43
|
+
if (!commentColumnNames.has('suggestion')) {
|
|
32
44
|
db.exec('ALTER TABLE comments ADD COLUMN suggestion TEXT');
|
|
33
45
|
}
|
|
46
|
+
if (!commentColumnNames.has('line_number_end')) {
|
|
47
|
+
db.exec('ALTER TABLE comments ADD COLUMN line_number_end INTEGER');
|
|
48
|
+
}
|
|
49
|
+
const reviewColumns = db
|
|
50
|
+
.prepare('PRAGMA table_info(reviews)')
|
|
51
|
+
.all();
|
|
52
|
+
const reviewColumnNames = new Set(reviewColumns.map(c => c.name));
|
|
53
|
+
if (!reviewColumnNames.has('name')) {
|
|
54
|
+
db.exec('ALTER TABLE reviews ADD COLUMN name TEXT');
|
|
55
|
+
}
|
|
56
|
+
if (!reviewColumnNames.has('branch')) {
|
|
57
|
+
db.exec('ALTER TABLE reviews ADD COLUMN branch TEXT');
|
|
58
|
+
}
|
|
59
|
+
// NULL is never considered equal to NULL by SQLite's UNIQUE constraint,
|
|
60
|
+
// so pre-existing reviews with name/branch = NULL don't collide with
|
|
61
|
+
// each other or block this index from being created (see ADR 0017).
|
|
62
|
+
db.exec('CREATE UNIQUE INDEX IF NOT EXISTS reviews_name_branch_uq ON reviews(name, branch)');
|
|
34
63
|
}
|
|
@@ -4,6 +4,7 @@ function rowToComment(row) {
|
|
|
4
4
|
reviewId: row.review_id,
|
|
5
5
|
filePath: row.file_path,
|
|
6
6
|
lineNumber: row.line_number,
|
|
7
|
+
lineNumberEnd: row.line_number_end,
|
|
7
8
|
lineType: row.line_type,
|
|
8
9
|
content: row.content,
|
|
9
10
|
createdAt: row.created_at,
|
|
@@ -17,8 +18,8 @@ export function findCommentById(db, id) {
|
|
|
17
18
|
return row ? rowToComment(row) : null;
|
|
18
19
|
}
|
|
19
20
|
export function createComment(db, comment) {
|
|
20
|
-
db.prepare(`INSERT INTO comments (id, review_id, file_path, line_number, line_type, content, created_at, updated_at, suggestion)
|
|
21
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(comment.id, comment.reviewId, comment.filePath, comment.lineNumber, comment.lineType, comment.content, comment.createdAt, comment.updatedAt, comment.suggestion ?? null);
|
|
21
|
+
db.prepare(`INSERT INTO comments (id, review_id, file_path, line_number, line_number_end, line_type, content, created_at, updated_at, suggestion)
|
|
22
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(comment.id, comment.reviewId, comment.filePath, comment.lineNumber, comment.lineNumberEnd, comment.lineType, comment.content, comment.createdAt, comment.updatedAt, comment.suggestion ?? null);
|
|
22
23
|
return findCommentById(db, comment.id);
|
|
23
24
|
}
|
|
24
25
|
export function listCommentsByReview(db, reviewId) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Denormalized index of file paths touched by a review's snapshot, used only
|
|
3
|
+
* to filter the review list by file (see ADR 0017). Not a source of truth —
|
|
4
|
+
* `reviews.snapshot_data` remains the only source of truth for diff rendering.
|
|
5
|
+
*/
|
|
6
|
+
export function insertReviewFiles(db, reviewId, filePaths) {
|
|
7
|
+
if (filePaths.length === 0) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const stmt = db.prepare('INSERT INTO review_files (review_id, file_path) VALUES (?, ?)');
|
|
11
|
+
for (const filePath of filePaths) {
|
|
12
|
+
stmt.run(reviewId, filePath);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function deleteReviewFiles(db, reviewId) {
|
|
16
|
+
db.prepare('DELETE FROM review_files WHERE review_id = ?').run(reviewId);
|
|
17
|
+
}
|
|
@@ -7,24 +7,71 @@ function rowToReview(row) {
|
|
|
7
7
|
sourceRef: row.source_ref,
|
|
8
8
|
snapshotData: row.snapshot_data,
|
|
9
9
|
status: row.status,
|
|
10
|
+
name: row.name,
|
|
11
|
+
branch: row.branch,
|
|
10
12
|
createdAt: row.created_at,
|
|
11
13
|
updatedAt: row.updated_at
|
|
12
14
|
};
|
|
13
15
|
}
|
|
16
|
+
/** Thrown by `createReview` when `(name, branch)` collides with an existing review — see ADR 0017. */
|
|
17
|
+
export class UniqueNameError extends Error {
|
|
18
|
+
}
|
|
14
19
|
export function createReview(db, review) {
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
try {
|
|
21
|
+
db.prepare(`INSERT INTO reviews (id, repository_path, base_ref, source_type, source_ref, snapshot_data, status, name, branch, created_at, updated_at)
|
|
22
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(review.id, review.repositoryPath, review.baseRef, review.sourceType, review.sourceRef, review.snapshotData, review.status, review.name, review.branch, review.createdAt, review.updatedAt);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof Error &&
|
|
26
|
+
/UNIQUE constraint failed: reviews\.name, reviews\.branch/.test(error.message)) {
|
|
27
|
+
throw new UniqueNameError(`A review named "${review.name}" already exists on branch "${review.branch}"`);
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
17
31
|
return review;
|
|
18
32
|
}
|
|
19
33
|
export function findReviewById(db, id) {
|
|
20
34
|
const row = db.prepare('SELECT * FROM reviews WHERE id = ?').get(id);
|
|
21
35
|
return row ? rowToReview(row) : null;
|
|
22
36
|
}
|
|
23
|
-
export function listReviews(db) {
|
|
37
|
+
export function listReviews(db, filters = {}) {
|
|
38
|
+
const { branch, search, createdFrom, createdTo, filePaths } = filters;
|
|
39
|
+
const conditions = [];
|
|
40
|
+
const params = [];
|
|
41
|
+
const joins = [];
|
|
42
|
+
if (branch !== undefined) {
|
|
43
|
+
conditions.push('reviews.branch = ?');
|
|
44
|
+
params.push(branch);
|
|
45
|
+
}
|
|
46
|
+
if (createdFrom) {
|
|
47
|
+
conditions.push('reviews.created_at >= ?');
|
|
48
|
+
params.push(createdFrom);
|
|
49
|
+
}
|
|
50
|
+
if (createdTo) {
|
|
51
|
+
conditions.push('reviews.created_at <= ?');
|
|
52
|
+
params.push(createdTo);
|
|
53
|
+
}
|
|
54
|
+
if (filePaths && filePaths.length > 0) {
|
|
55
|
+
joins.push('JOIN review_files ON review_files.review_id = reviews.id');
|
|
56
|
+
conditions.push(`review_files.file_path IN (${filePaths.map(() => '?').join(', ')})`);
|
|
57
|
+
params.push(...filePaths);
|
|
58
|
+
}
|
|
59
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
24
60
|
const rows = db
|
|
25
|
-
.prepare(
|
|
26
|
-
|
|
27
|
-
|
|
61
|
+
.prepare(`SELECT DISTINCT reviews.* FROM reviews
|
|
62
|
+
${joins.join(' ')}
|
|
63
|
+
${whereClause}
|
|
64
|
+
ORDER BY reviews.created_at DESC`)
|
|
65
|
+
.all(...params);
|
|
66
|
+
const reviews = rows.map(rowToReview);
|
|
67
|
+
// Done in JS, not SQL `LOWER()`/`NOCASE` (ASCII-only in SQLite without the
|
|
68
|
+
// ICU extension) — `String.prototype.toLowerCase()` handles Cyrillic and
|
|
69
|
+
// other non-ASCII scripts correctly (see ADR 0017).
|
|
70
|
+
if (!search) {
|
|
71
|
+
return reviews;
|
|
72
|
+
}
|
|
73
|
+
const needle = search.toLowerCase();
|
|
74
|
+
return reviews.filter(review => review.name?.toLowerCase().includes(needle));
|
|
28
75
|
}
|
|
29
76
|
export function deleteReview(db, id) {
|
|
30
77
|
db.prepare('DELETE FROM reviews WHERE id = ?').run(id);
|
|
@@ -4,6 +4,7 @@ import { createComment, getComments, editComment, removeComment, resolveComment,
|
|
|
4
4
|
const CreateCommentBody = Type.Object({
|
|
5
5
|
filePath: Type.String({ minLength: 1 }),
|
|
6
6
|
lineNumber: Type.Optional(Type.Union([Type.Integer(), Type.Null()])),
|
|
7
|
+
lineNumberEnd: Type.Optional(Type.Union([Type.Integer(), Type.Null()])),
|
|
7
8
|
lineType: Type.Optional(Type.Union([
|
|
8
9
|
Type.Literal('added'),
|
|
9
10
|
Type.Literal('removed'),
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { Type } from '@sinclair/typebox';
|
|
2
2
|
import { createReview, getReview, getReviews, setReviewStatus, removeReview, ValidationError } from "../services/review.service.js";
|
|
3
|
+
import { getRepositoryInfo } from "../services/git.service.js";
|
|
3
4
|
const CreateReviewBody = Type.Object({
|
|
4
5
|
sourceType: Type.Optional(Type.Union([
|
|
6
|
+
Type.Literal('local'),
|
|
5
7
|
Type.Literal('staged'),
|
|
6
8
|
Type.Literal('unstaged'),
|
|
7
9
|
Type.Literal('branch'),
|
|
8
10
|
Type.Literal('commits')
|
|
9
11
|
])),
|
|
10
12
|
sourceRef: Type.Optional(Type.String()),
|
|
11
|
-
baseRef: Type.Optional(Type.String())
|
|
13
|
+
baseRef: Type.Optional(Type.String()),
|
|
14
|
+
name: Type.Optional(Type.String())
|
|
15
|
+
});
|
|
16
|
+
const ReviewsQuery = Type.Object({
|
|
17
|
+
branch: Type.Optional(Type.String()),
|
|
18
|
+
search: Type.Optional(Type.String()),
|
|
19
|
+
createdFrom: Type.Optional(Type.String()),
|
|
20
|
+
createdTo: Type.Optional(Type.String()),
|
|
21
|
+
/** Comma-separated file paths — reviews matching any of them are returned. */
|
|
22
|
+
files: Type.Optional(Type.String())
|
|
12
23
|
});
|
|
13
24
|
const UpdateReviewBody = Type.Object({
|
|
14
25
|
status: Type.Optional(Type.Union([
|
|
@@ -39,8 +50,18 @@ export async function reviewRoutes(app, opts) {
|
|
|
39
50
|
throw error;
|
|
40
51
|
}
|
|
41
52
|
});
|
|
42
|
-
typedApp.get('/api/reviews', async () => {
|
|
43
|
-
|
|
53
|
+
typedApp.get('/api/reviews', { schema: { querystring: ReviewsQuery } }, async (request) => {
|
|
54
|
+
const { branch, search, createdFrom, createdTo, files } = request.query;
|
|
55
|
+
const resolvedBranch = branch ?? (await getRepositoryInfo(repositoryPath)).branch;
|
|
56
|
+
return getReviews(db, {
|
|
57
|
+
branch: resolvedBranch,
|
|
58
|
+
search,
|
|
59
|
+
createdFrom,
|
|
60
|
+
createdTo,
|
|
61
|
+
filePaths: files
|
|
62
|
+
? files.split(',').filter(path => path.length > 0)
|
|
63
|
+
: undefined
|
|
64
|
+
});
|
|
44
65
|
});
|
|
45
66
|
typedApp.get('/api/reviews/:id', { schema: { params: ReviewIdParams } }, async (request, reply) => {
|
|
46
67
|
const review = getReview(db, request.params.id);
|
|
@@ -11,6 +11,7 @@ export function createComment(db, reviewId, input, eventBus) {
|
|
|
11
11
|
reviewId,
|
|
12
12
|
filePath: input.filePath,
|
|
13
13
|
lineNumber: input.lineNumber ?? null,
|
|
14
|
+
lineNumberEnd: input.lineNumberEnd ?? input.lineNumber ?? null,
|
|
14
15
|
lineType: input.lineType ?? null,
|
|
15
16
|
content: input.content,
|
|
16
17
|
createdAt: now,
|
|
@@ -1,14 +1,75 @@
|
|
|
1
|
-
import { createReview as insertReview, findReviewById, listReviews, updateReviewStatus as updateReviewStatusRepo, deleteReview as deleteReviewRepo } from "../repositories/review.repo.js";
|
|
1
|
+
import { createReview as insertReview, findReviewById, listReviews, updateReviewStatus as updateReviewStatusRepo, deleteReview as deleteReviewRepo, UniqueNameError } from "../repositories/review.repo.js";
|
|
2
2
|
import { listCommentsByReview, deleteComment } from "../repositories/comment.repo.js";
|
|
3
|
+
import { insertReviewFiles, deleteReviewFiles } from "../repositories/review-file.repo.js";
|
|
3
4
|
import { getStagedDiff, getUnstagedDiff, getBranchDiff, getCommitsDiff } from "./diff.service.js";
|
|
5
|
+
import { getRepositoryInfo } from "./git.service.js";
|
|
4
6
|
export class ValidationError extends Error {
|
|
5
7
|
}
|
|
8
|
+
const REVIEW_NAME_MONTHS_RU = [
|
|
9
|
+
'янв',
|
|
10
|
+
'февр',
|
|
11
|
+
'мар',
|
|
12
|
+
'апр',
|
|
13
|
+
'мая',
|
|
14
|
+
'июн',
|
|
15
|
+
'июл',
|
|
16
|
+
'авг',
|
|
17
|
+
'сент',
|
|
18
|
+
'окт',
|
|
19
|
+
'нояб',
|
|
20
|
+
'дек'
|
|
21
|
+
];
|
|
22
|
+
function formatReviewDate(date) {
|
|
23
|
+
const day = date.getDate();
|
|
24
|
+
const month = REVIEW_NAME_MONTHS_RU[date.getMonth()];
|
|
25
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
26
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
27
|
+
return `${day} ${month}, ${hours}:${minutes}`;
|
|
28
|
+
}
|
|
29
|
+
function reviewSourceLabel(sourceType, sourceRef, baseRef) {
|
|
30
|
+
if (sourceType === 'local') {
|
|
31
|
+
return 'Local changes';
|
|
32
|
+
}
|
|
33
|
+
if (sourceType === 'staged') {
|
|
34
|
+
return 'Staged';
|
|
35
|
+
}
|
|
36
|
+
if (sourceType === 'unstaged') {
|
|
37
|
+
return 'Unstaged';
|
|
38
|
+
}
|
|
39
|
+
if (sourceType === 'branch') {
|
|
40
|
+
return sourceRef ?? baseRef ?? 'Branch';
|
|
41
|
+
}
|
|
42
|
+
if (sourceRef) {
|
|
43
|
+
const commits = sourceRef.split(',');
|
|
44
|
+
return commits.length === 1
|
|
45
|
+
? `Commit ${commits[0].slice(0, 8)}`
|
|
46
|
+
: `${commits.length} commits`;
|
|
47
|
+
}
|
|
48
|
+
return 'Review';
|
|
49
|
+
}
|
|
50
|
+
/** Auto-generated name shown when the user doesn't provide one — "source + date/time" (see ADR 0017). */
|
|
51
|
+
function generateReviewName(sourceType, sourceRef, baseRef, now) {
|
|
52
|
+
return `${reviewSourceLabel(sourceType, sourceRef, baseRef)} — ${formatReviewDate(now)}`;
|
|
53
|
+
}
|
|
54
|
+
function extractFilePaths(snapshot) {
|
|
55
|
+
return snapshot.map(file => file.newPath || file.oldPath);
|
|
56
|
+
}
|
|
6
57
|
export async function createReview(db, repositoryPath, input, eventBus) {
|
|
7
|
-
const sourceType = input.sourceType ?? '
|
|
58
|
+
const sourceType = input.sourceType ?? 'local';
|
|
8
59
|
let snapshot;
|
|
9
60
|
let baseRef = null;
|
|
10
61
|
let sourceRef = null;
|
|
11
|
-
if (sourceType === '
|
|
62
|
+
if (sourceType === 'local') {
|
|
63
|
+
// Both diffs together — a review's comments apply regardless of which
|
|
64
|
+
// tab they were left on, so its snapshot (read-only /reviews/:id view,
|
|
65
|
+
// and the file-path filter in the reviews list) needs both too.
|
|
66
|
+
const [staged, unstaged] = await Promise.all([
|
|
67
|
+
getStagedDiff(repositoryPath),
|
|
68
|
+
getUnstagedDiff(repositoryPath)
|
|
69
|
+
]);
|
|
70
|
+
snapshot = [...staged, ...unstaged];
|
|
71
|
+
}
|
|
72
|
+
else if (sourceType === 'staged') {
|
|
12
73
|
snapshot = await getStagedDiff(repositoryPath);
|
|
13
74
|
}
|
|
14
75
|
else if (sourceType === 'unstaged') {
|
|
@@ -33,27 +94,64 @@ export async function createReview(db, repositoryPath, input, eventBus) {
|
|
|
33
94
|
else {
|
|
34
95
|
throw new ValidationError(`Unknown sourceType: "${String(sourceType)}"`);
|
|
35
96
|
}
|
|
36
|
-
const now = new Date()
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const nowIso = now.toISOString();
|
|
99
|
+
const { branch } = await getRepositoryInfo(repositoryPath);
|
|
100
|
+
const userProvidedName = input.name?.trim();
|
|
101
|
+
const baseName = userProvidedName || generateReviewName(sourceType, sourceRef, baseRef, now);
|
|
102
|
+
const filePaths = extractFilePaths(snapshot);
|
|
103
|
+
const id = crypto.randomUUID();
|
|
104
|
+
// A user-chosen name that collides is surfaced as a ValidationError — the
|
|
105
|
+
// user decides what to do. An auto-generated name (e.g. two "Staged"
|
|
106
|
+
// reviews created within the same minute) collides on nothing the user
|
|
107
|
+
// chose, so it's disambiguated automatically instead (see ADR 0017).
|
|
108
|
+
const maxAttempts = userProvidedName ? 1 : 20;
|
|
109
|
+
let created;
|
|
110
|
+
let lastError;
|
|
111
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
112
|
+
const name = attempt === 0 ? baseName : `${baseName} (${attempt + 1})`;
|
|
113
|
+
const review = {
|
|
114
|
+
id,
|
|
115
|
+
repositoryPath,
|
|
116
|
+
baseRef,
|
|
117
|
+
sourceType,
|
|
118
|
+
sourceRef,
|
|
119
|
+
snapshotData: JSON.stringify(snapshot),
|
|
120
|
+
status: 'in_progress',
|
|
121
|
+
name,
|
|
122
|
+
branch,
|
|
123
|
+
createdAt: nowIso,
|
|
124
|
+
updatedAt: nowIso
|
|
125
|
+
};
|
|
126
|
+
db.exec('BEGIN');
|
|
127
|
+
try {
|
|
128
|
+
created = insertReview(db, review);
|
|
129
|
+
insertReviewFiles(db, id, filePaths);
|
|
130
|
+
db.exec('COMMIT');
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
db.exec('ROLLBACK');
|
|
135
|
+
if (!(error instanceof UniqueNameError)) {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
lastError = error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!created) {
|
|
142
|
+
if (userProvidedName) {
|
|
143
|
+
throw new ValidationError(lastError.message);
|
|
144
|
+
}
|
|
145
|
+
throw lastError;
|
|
146
|
+
}
|
|
49
147
|
eventBus?.publish({ type: 'review:created', reviewId: created.id });
|
|
50
148
|
return created;
|
|
51
149
|
}
|
|
52
150
|
export function getReview(db, id) {
|
|
53
151
|
return findReviewById(db, id);
|
|
54
152
|
}
|
|
55
|
-
export function getReviews(db) {
|
|
56
|
-
return listReviews(db);
|
|
153
|
+
export function getReviews(db, filters = {}) {
|
|
154
|
+
return listReviews(db, filters);
|
|
57
155
|
}
|
|
58
156
|
export function setReviewStatus(db, id, status, eventBus) {
|
|
59
157
|
const updated = updateReviewStatusRepo(db, id, status);
|
|
@@ -66,6 +164,7 @@ export function removeReview(db, id, eventBus) {
|
|
|
66
164
|
for (const comment of listCommentsByReview(db, id)) {
|
|
67
165
|
deleteComment(db, comment.id);
|
|
68
166
|
}
|
|
167
|
+
deleteReviewFiles(db, id);
|
|
69
168
|
deleteReviewRepo(db, id);
|
|
70
169
|
eventBus?.publish({ type: 'review:deleted', reviewId: id });
|
|
71
170
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,E as t,F as n,H as r,M as i,O as a,S as o,U as s,V as c,Z as l,b as u,g as d,h as f,l as p,rt as m,s as h,v as g,w as _}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{D as v,S as y,f as b,m as x,t as S,w as C}from"./QBtn-Cf6WtiKt.js";import{d as w}from"./event-BQt_DXaR.js";import{I as T,L as E,_ as D,ot as O,v as k}from"./index-Dl3zmXcR.js";import{n as A}from"./vue-i18n.runtime-DSeWNwrW.js";import{h as j,m as M,r as N,t as P}from"./format-B_1hRYcb.js";function F(e){if(e.length<2||e[0]!==`"`||e[e.length-1]!==`"`)return e;let t=e.slice(1,-1),n=[];for(let e=0;e<t.length;e++){let r=t[e];r===`\\`&&/^[0-7]{3}$/.test(t.slice(e+1,e+4))?(n.push(parseInt(t.slice(e+1,e+4),8)),e+=3):r===`\\`&&t[e+1]===`"`?(n.push(34),e+=1):r===`\\`&&t[e+1]===`\\`?(n.push(92),e+=1):n.push((r??``).charCodeAt(0))}return new TextDecoder(`utf-8`).decode(new Uint8Array(n))}function I(e,t){let n=new EventSource(`/api/events`);for(let r of e)n.addEventListener(r,()=>t());return n.addEventListener(`open`,()=>t()),{close:()=>n.close()}}var L=w({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(e){return()=>[g(`div`,{class:e.store.scroll.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onVerticalMousedown}),g(`div`,{class:e.store.scroll.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onHorizontalMousedown}),s(g(`div`,{ref:e.store.scroll.vertical.ref,class:e.store.scroll.vertical.thumbClass.value,style:e.store.scroll.vertical.style.value,"aria-hidden":`true`}),e.store.thumbVertDir),s(g(`div`,{ref:e.store.scroll.horizontal.ref,class:e.store.scroll.horizontal.thumbClass.value,style:e.store.scroll.horizontal.style.value,"aria-hidden":`true`}),e.store.thumbHorizDir)]}}),R=[`vertical`,`horizontal`],z={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},B={prevent:!0,mouse:!0,mouseAllDir:!0},V=e=>e>=250?50:Math.ceil(e/5),H=(e,t)=>t?-e:e;function U(e,t){return R.includes(e)?!0:(console.error(`[QScrollArea]: wrong first param of ${t} (vertical/horizontal)`),!1)}var W=w({name:`QScrollArea`,props:{...k,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:()=>[0,0]},horizontalOffset:{type:Array,default:()=>[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(n,{slots:r,emit:i}){let o=l(!1),s=l(!1),u=l(!1),f={vertical:l(0),horizontal:l(0)},p={vertical:{ref:e(null),position:l(0),size:l(0)},horizontal:{ref:e(null),position:l(0),size:l(0)}},{proxy:m}=d(),v=y(),x=D(n,v),S=null,C,w=e(null),k=h(()=>`q-scrollarea`+(x()?` q-scrollarea--dark`:``));Object.assign(f,{verticalInner:h(()=>f.vertical.value-n.verticalOffset[0]-n.verticalOffset[1]),horizontalInner:h(()=>f.horizontal.value-n.horizontalOffset[0]-n.horizontalOffset[1])}),p.vertical.percentage=h(()=>{let e=p.vertical.size.value-f.vertical.value;if(e<=0)return 0;let t=P(p.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),p.vertical.thumbHidden=h(()=>!(n.visible===null?u.value:n.visible)&&!o.value&&!s.value||p.vertical.size.value<=f.vertical.value+1),p.vertical.thumbStart=h(()=>n.verticalOffset[0]+p.vertical.percentage.value*(f.verticalInner.value-p.vertical.thumbSize.value)),p.vertical.thumbSize=h(()=>Math.round(P(f.verticalInner.value*f.verticalInner.value/p.vertical.size.value,V(f.verticalInner.value),f.verticalInner.value))),p.vertical.style=h(()=>({...n.thumbStyle,...n.verticalThumbStyle,top:`${p.vertical.thumbStart.value}px`,height:`${p.vertical.thumbSize.value}px`,[v.lang.rtl?`left`:`right`]:`${n.horizontalOffset[+!v.lang.rtl]}px`})),p.vertical.thumbClass=h(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(p.vertical.thumbHidden.value?` q-scrollarea__thumb--invisible`:``)),p.vertical.barClass=h(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(p.vertical.thumbHidden.value?` q-scrollarea__bar--invisible`:``)),p.horizontal.percentage=h(()=>{let e=p.horizontal.size.value-f.horizontal.value;if(e<=0)return 0;let t=P(H(p.horizontal.position.value,v.lang.rtl)/e,0,1);return Math.round(t*1e4)/1e4}),p.horizontal.thumbHidden=h(()=>!(n.visible===null?u.value:n.visible)&&!o.value&&!s.value||p.horizontal.size.value<=f.horizontal.value+1),p.horizontal.thumbStart=h(()=>n.horizontalOffset[+!!v.lang.rtl]+p.horizontal.percentage.value*(f.horizontalInner.value-p.horizontal.thumbSize.value)),p.horizontal.thumbSize=h(()=>Math.round(P(f.horizontalInner.value*f.horizontalInner.value/p.horizontal.size.value,V(f.horizontalInner.value),f.horizontalInner.value))),p.horizontal.style=h(()=>({...n.thumbStyle,...n.horizontalThumbStyle,[v.lang.rtl?`right`:`left`]:`${p.horizontal.thumbStart.value}px`,width:`${p.horizontal.thumbSize.value}px`,bottom:`${n.verticalOffset[1]}px`})),p.horizontal.thumbClass=h(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(p.horizontal.thumbHidden.value?` q-scrollarea__thumb--invisible`:``)),p.horizontal.barClass=h(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(p.horizontal.thumbHidden.value?` q-scrollarea__bar--invisible`:``));let A=h(()=>n.tabindex===void 0?p.vertical.size.value>f.vertical.value+1||p.horizontal.size.value>f.horizontal.value+1?0:void 0:n.tabindex),F=h(()=>p.vertical.thumbHidden.value&&p.horizontal.thumbHidden.value?n.contentStyle:n.contentActiveStyle);function I(){return{verticalPosition:p.vertical.position.value,verticalPercentage:p.vertical.percentage.value,verticalSize:p.vertical.size.value,verticalContainerSize:f.vertical.value,verticalContainerInnerSize:f.verticalInner.value,horizontalPosition:p.horizontal.position.value,horizontalPercentage:p.horizontal.percentage.value,horizontalSize:p.horizontal.size.value,horizontalContainerSize:f.horizontal.value,horizontalContainerInnerSize:f.horizontalInner.value}}let R=O(()=>{let e=I();e.ref=m,i(`scroll`,e)},0);function W(e,t,n){U(e,`setScrollPosition`)&&(e===`vertical`?E:T)(w.value,t,n)}function G({height:e,width:t}){let n=!1;f.vertical.value!==e&&(f.vertical.value=e,n=!0),f.horizontal.value!==t&&(f.horizontal.value=t,n=!0),n&&X()}function K({position:e}){let t=!1;p.vertical.position.value!==e.top&&(p.vertical.position.value=e.top,t=!0),p.horizontal.position.value!==e.left&&(p.horizontal.position.value=e.left,t=!0),t&&X()}function q({height:e,width:t}){p.horizontal.size.value!==t&&(p.horizontal.size.value=t,X()),p.vertical.size.value!==e&&(p.vertical.size.value=e,X())}function J(e,t){let n=p[t];if(e.isFirst){if(n.thumbHidden.value)return;C=t===`horizontal`?H(n.position.value,v.lang.rtl):n.position.value,s.value=!0}else if(!s.value)return;e.isFinal&&(s.value=!1);let r=z[t],i=(n.size.value-f[t].value)/(f[t+`Inner`].value-n.thumbSize.value),a=e.distance[r.dist],o=(e.direction===r.dir?1:-1)*(t===`horizontal`&&v.lang.rtl?-1:1),c=C+o*a*i;Z(t===`horizontal`?H(c,v.lang.rtl):c,t)}function Y(e,t){let r=p[t];if(!r.thumbHidden.value){let i=t===`horizontal`&&v.lang.rtl,a=t===`vertical`?n.verticalOffset[0]:n.horizontalOffset[+!!i],o=(i?f.horizontal.value-e.offsetX:e[z[t].offset])-a,s=r.thumbStart.value-a;if(o<s||o>s+r.thumbSize.value){let e=o-r.thumbSize.value/2,n=P(e/(f[t+`Inner`].value-r.thumbSize.value),0,1);Z(i?H(n*Math.max(0,r.size.value-f[t].value),v.lang.rtl):n*Math.max(0,r.size.value-f[t].value),t)}r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function X(){o.value=!0,S!==null&&clearTimeout(S),S=setTimeout(()=>{S=null,o.value=!1},n.delay),n.onScroll!==void 0&&R()}function Z(e,t){w.value[z[t].scroll]=e}let Q=null;function ee(){Q!==null&&clearTimeout(Q),Q=setTimeout(()=>{Q=null,u.value=!0},v.platform.is.ios?50:0)}function te(){Q!==null&&(clearTimeout(Q),Q=null),u.value=!1}let $=null;c(()=>v.lang.rtl,(e,t)=>{w.value!==null&&T(w.value,H(H(p.horizontal.position.value,t),e))}),a(()=>{$={top:p.vertical.position.value,left:p.horizontal.position.value}}),_(()=>{if($===null)return;let e=w.value;e!==null&&(T(e,$.left),E(e,$.top))}),t(R.cancel),Object.assign(m,{getScrollTarget:()=>w.value,getScroll:I,getScrollPosition:()=>({top:p.vertical.position.value,left:p.horizontal.position.value}),getScrollPercentage:()=>({top:p.vertical.percentage.value,left:p.horizontal.percentage.value}),setScrollPosition:W,setScrollPercentage(e,t,n){if(!U(e,`setScrollPercentage`))return;let r=t*(p[e].size.value-f[e].value);W(e,e===`horizontal`?H(r,v.lang.rtl):r,n)}});let ne={scroll:p,thumbVertDir:[[N,e=>{J(e,`vertical`)},void 0,{vertical:!0,...B}]],thumbHorizDir:[[N,e=>{J(e,`horizontal`)},void 0,{horizontal:!0,...B}]],onVerticalMousedown(e){Y(e,`vertical`)},onHorizontalMousedown(e){Y(e,`horizontal`)}};return()=>g(`div`,{class:k.value,onMouseenter:ee,onMouseleave:te},[g(`div`,{ref:w,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:A.value},[g(`div`,{class:`q-scrollarea__content absolute`,style:F.value},b(r.default,[g(M,{debounce:0,onResize:q})])),g(j,{axis:`both`,onScroll:K})]),g(M,{debounce:0,onResize:G}),g(L,{store:ne,barStyle:n.barStyle,verticalBarStyle:n.verticalBarStyle,horizontalBarStyle:n.horizontalBarStyle})])}}),G=f({__name:`CancelButton`,setup(e){let{t}=A();return(e,n)=>(i(),p(S,o({padding:`2px 8px`},e.$attrs,{dense:``,flat:``,color:`warning`,label:m(t)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),K=f({__name:`CreateButton`,setup(e){let{t}=A();return(e,n)=>(i(),p(S,o({padding:`2px 8px`,label:m(t)(`reviews.create.submit`)},e.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}}),q=w({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(e,{slots:t}){let n=y(),r=u(v,C);if(r===C)return console.error(`QPage needs to be a deep child of QLayout`),C;if(u(`_q_pc_`,C)===C)return console.error(`QPage needs to be child of QPageContainer`),C;let i=h(()=>{let t=(r.header.space?r.header.size:0)+(r.footer.space?r.footer.size:0);if(typeof e.styleFn==`function`){let i=r.isContainer.value?r.containerHeight.value:n.screen.height;return e.styleFn(t,i)}return{minHeight:r.isContainer.value?r.containerHeight.value-t+`px`:n.screen.height===0?t===0?`100vh`:`calc(100vh - ${t}px)`:n.screen.height-t+`px`}}),a=h(()=>`q-page${e.padding?` q-layout-padding`:``}`);return()=>g(`main`,{class:a.value,style:i.value},x(t.default))}}),J=f({__name:`AppPage`,setup(e){function t(e,t){return{height:`${t-e}px`}}return(e,a)=>(i(),p(q,{"style-fn":t},{default:r(()=>[n(e.$slots,`default`)]),_:3}))}});export{I as a,W as i,K as n,F as o,G as r,J as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,H as n,M as r,N as i,S as a,U as o,V as s,Z as c,b as l,c as u,d,g as f,h as p,k as m,l as h,m as g,r as _,rt as v,s as y,v as b,x,yt as S,z as C}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{C as w,D as T,L as E,S as D,T as ee,c as O,f as te,j as k,m as A,t as j,w as M}from"./QBtn-Cf6WtiKt.js";import{d as N,f as P}from"./event-BQt_DXaR.js";import{H as F,J as ne,K as re,V as ie,Z as ae,d as oe,g as se,h as I,m as ce,n as L,q as le,y as ue}from"./index-Dl3zmXcR.js";import{n as de}from"./vue-i18n.runtime-DSeWNwrW.js";import{n as R,r as z}from"./pinia-DK4OjQ7o.js";import{a as B,i as V,n as fe,r as H,t as pe}from"./client-De34x_P_.js";import{r as me}from"./format-B_1hRYcb.js";import{a as he,n as ge,o as U,r as _e}from"./AppPage-VD8mwL62.js";function W(e){return{...e,oldPath:U(e.oldPath),newPath:U(e.newPath)}}function G(e,t){let n=new Map(e.map(e=>[e.newPath||e.oldPath,e]));return t.map(e=>{let t=n.get(e.newPath||e.oldPath);return t&&JSON.stringify(t)===JSON.stringify(e)?t:e})}var ve=R(`diff`,()=>{let e=c([]),t=c([]),n=c(!1),r=c(null),i=y(()=>[...e.value,...t.value].map(e=>e.newPath||e.oldPath));async function a(){n.value=!0,r.value=null;try{let[n,r]=await Promise.all([H(`/api/diff/staged`),H(`/api/diff/unstaged`)]);e.value=G(e.value,n.map(W)),t.value=G(t.value,r.map(W))}catch(n){e.value=[],t.value=[],r.value=n instanceof Error?n.message:String(n)}finally{n.value=!1}}return{stagedFiles:e,unstagedFiles:t,loading:n,error:r,changedPaths:i,fetchDiff:a}}),K=R(`active-review`,()=>{let e=c(null),t=c([]),n=c(!1),r=y(()=>{let e=new Map;for(let n of t.value){let t=e.get(n.filePath);t?t.push(n):e.set(n.filePath,[n])}return e});async function i(){n.value=!0;try{let n=(await H(`/api/reviews`)).filter(e=>e.status===`in_progress`).sort((e,t)=>t.createdAt.localeCompare(e.createdAt));e.value=n[0]??null,t.value=e.value?await H(`/api/reviews/${e.value.id}/comments`):[]}finally{n.value=!1}}function a(n){e.value=n,t.value=[]}async function o(t){e.value&&(await V(`/api/reviews/${e.value.id}`,{status:t}),await i())}async function s(n){if(!e.value)throw Error(`No active review`);let r=await B(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function l(e,n){let r=await V(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function u(e){await fe(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function d(e){let n=await V(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function f(e){let n=await V(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:n,commentsByFile:r,refresh:i,setActiveReview:a,setStatus:o,createComment:s,editComment:l,deleteComment:u,resolveComment:d,unresolveComment:f}}),ye=p({__name:`SearchInput`,props:{modelValue:{},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=C(e,`modelValue`);return(e,i)=>(r(),h(L,a({modelValue:t.value,"onUpdate:modelValue":i[0]||=e=>t.value=e},e.$attrs,{dense:``,outlined:``,clearable:``}),{prepend:n(()=>[g(O,{name:`search`,size:`xs`})]),_:1},16,[`modelValue`]))}}),be=N({name:`QItemLabel`,props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(e,{slots:t}){let n=y(()=>Number.parseInt(e.lines,10)),r=y(()=>`q-item__label`+(e.overline?` q-item__label--overline text-overline`:``)+(e.caption?` q-item__label--caption text-caption`:``)+(e.header?` q-item__label--header`:``)+(n.value===1?` ellipsis`:``)),i=y(()=>e.lines!==void 0&&n.value>1?{overflow:`hidden`,display:`-webkit-box`,"-webkit-box-orient":`vertical`,"-webkit-line-clamp":n.value}:null);return()=>b(`div`,{style:i.value,class:r.value},A(t.default))}}),xe=[`top`,`right`,`bottom`,`left`],q={type:{type:String,default:`a`},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:``},labelPosition:{type:String,default:`right`,validator:e=>xe.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]},Se=[`label`],Ce=Object.keys(q).filter(e=>!Se.includes(e)&&j.props[e]!==void 0);function we(e){let t={};for(let n of Ce)t[n]=e[n];return t}function Te(e,t){return{formClass:y(()=>`q-fab--form-${e.square?`square`:`rounded`}`),stacked:y(()=>!e.externalLabel&&[`top`,`bottom`].includes(e.labelPosition)),labelProps:y(()=>{if(e.externalLabel){let n=e.hideLabel===null?!t.value:e.hideLabel;return{action:`push`,data:{class:[e.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${e.labelPosition}`+(n?` q-fab__label--external-hidden`:``)],style:e.labelStyle}}}return{action:[`left`,`top`].includes(e.labelPosition)?`unshift`:`push`,data:{class:[e.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${e.labelPosition}`+(e.hideLabel?` q-fab__label--internal-hidden`:``)],style:e.labelStyle}}})}}var J={hover:Boolean,hoverDelay:{type:Number,default:0},hoverHideDelay:{type:Number,default:150}};function Y({props:e,canShow:t,show:n,canHide:r,hide:i}){let{removeTimeout:a,registerTimeout:o}=ae();function s(r){e.hover===!0&&r.pointerType!==`touch`&&(a(),t(r)&&(e.hoverDelay>0?o(()=>{n(r)},e.hoverDelay):n(r)))}function c(t){a(),r(t)&&o(()=>{i(t)},e.hoverHideDelay)}function l(t){e.hover===!0&&t.pointerType!==`touch`&&c(t)}function u(e){e.pointerType!==`touch`&&a()}return{clearHoverTimer:a,hoverShow:s,hoverHide:l,scheduleHoverHide:c,onHoverContentEnter:u}}var Ee=[`up`,`right`,`down`,`left`],De=[`left`,`center`,`right`],Oe=180,ke=N({name:`QFab`,props:{...q,...ne,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...q.hideLabel,default:null},direction:{type:String,default:`right`,validator:e=>Ee.includes(e)},...J,persistent:Boolean,stagger:{type:Number,default:40},verticalActionsAlign:{type:String,default:`center`,validator:e=>De.includes(e)}},emits:le,setup(t,{slots:n}){let r=e(null),a=c(t.modelValue===!0),o=oe(),l=D(),{formClass:u,stacked:d,labelProps:f}=Te(t,a),p=y(()=>!t.persistent),{show:m,hide:h,toggle:g}=re({showing:a,hideOnRouteChange:p}),_=0,{clearHoverTimer:v,hoverShow:x,hoverHide:S}=Y({props:t,canShow:()=>!a.value,show:e=>{_=Date.now(),m(e)},canHide:()=>a.value,hide:h});s(a,v);function C(e){a.value&&Date.now()-_<Oe||g(e)}let w=y(()=>({opened:a.value})),T=y(()=>`q-fab z-fab row inline justify-center q-fab--align-${t.verticalActionsAlign} ${u.value}`+(a.value?` q-fab--opened`:` q-fab--closed`)),E=y(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${t.direction} q-fab__actions--${a.value?`opened`:`closed`}`),k=y(()=>t.hover?{onPointerenter:x,onPointerleave:S}:{}),M=y(()=>{let e={id:o.value,style:`--q-fab-stagger: ${t.stagger}ms`};return a.value||(e[`aria-hidden`]=`true`),e}),N=y(()=>`q-fab__icon-holder q-fab__icon-holder--${a.value?`opened`:`closed`}`);function P(e,r){let i=n[e],a=`q-fab__${e} absolute-full`;return i===void 0?b(O,{class:a,name:t[r]||l.iconSet.fab[r]}):b(`div`,{class:a},i(w.value))}function F(){let e=[];return t.hideIcon||e.push(b(`div`,{class:N.value},[P(`icon`,`icon`),P(`active-icon`,`activeIcon`)])),(t.label!==``||n.label!==void 0)&&e[f.value.action](b(`div`,f.value.data,n.label===void 0?[t.label]:n.label(w.value))),te(n.tooltip,e)}return i(ee,{showing:a,onChildClick(e){h(e),e?.qAvoidFocus!==!0&&r.value?.$el.focus()}}),()=>b(`div`,{class:T.value,...k.value},[b(j,{ref:r,class:u.value,...we(t),noWrap:!0,stack:d.value,noCaps:!0,fab:!0,"aria-expanded":a.value?`true`:`false`,"aria-controls":o.value,onClick:C},F),b(`div`,{class:E.value,...M.value},A(n.default))])}}),Ae={position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function je(){let{props:e}=f(),t=D(),n=l(T,M);if(n===M)return console.error(`QPageSticky needs to be child of QLayout`),M;let r=y(()=>{let t=e.position;return{top:t.includes(`top`),right:t.includes(`right`),bottom:t.includes(`bottom`),left:t.includes(`left`),vertical:t===`top`||t===`bottom`,horizontal:t===`left`||t===`right`}}),i=y(()=>n.header.offset),a=y(()=>n.right.offset),o=y(()=>n.footer.offset),s=y(()=>n.left.offset),c=y(()=>{let n=0,c=0,l=r.value,u=t.lang.rtl?-1:1;l.top&&i.value!==0?c=`${i.value}px`:l.bottom&&o.value!==0&&(c=`${-o.value}px`),l.left&&s.value!==0?n=`${u*s.value}px`:l.right&&a.value!==0&&(n=`${-u*a.value}px`);let d={transform:`translate(${n}, ${c})`};return e.offset&&(d.margin=`${e.offset[1]}px ${e.offset[0]}px`),l.vertical?(s.value!==0&&(d[t.lang.rtl?`right`:`left`]=`${s.value}px`),a.value!==0&&(d[t.lang.rtl?`left`:`right`]=`${a.value}px`)):l.horizontal&&(i.value!==0&&(d.top=`${i.value}px`),o.value!==0&&(d.bottom=`${o.value}px`)),d}),u=y(()=>`q-page-sticky row flex-center fixed-${e.position} q-page-sticky--${e.expand?`expand`:`shrink`}`);function d(t){let n=A(t.default);return b(`div`,{class:u.value,style:c.value},e.expand?n:[b(`div`,n)])}return{$layout:n,getStickyContent:d}}var Me=N({name:`QPageSticky`,props:Ae,setup(e,{slots:t}){let{getStickyContent:n}=je();return()=>n(t)}});function X(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}function Z(e){let t=e.currentTarget,n=t.__qclosepopup;n!==0&&setTimeout(()=>{let r=F(t);r!==void 0&&ie(r,e,n)},0)}function Q(e){k(e,13)&&Z(e)}var Ne=P({name:`close-popup`,beforeMount(e,{value:t}){e.__qclosepopup=X(t),e.addEventListener(`click`,Z),e.addEventListener(`keyup`,Q)},updated(e,{value:t,oldValue:n}){t!==n&&e.__qclosepopup!==void 0&&(e.__qclosepopup=X(t))},beforeUnmount(e){e.__qclosepopup!==void 0&&(e.removeEventListener(`click`,Z),e.removeEventListener(`keyup`,Q),e.__qclosepopup=void 0)}});function Pe(e){let t=new URLSearchParams;e.search&&t.set(`search`,e.search),e.createdFrom&&t.set(`createdFrom`,e.createdFrom),e.createdTo&&t.set(`createdTo`,e.createdTo),e.files&&e.files.length>0&&t.set(`files`,e.files.join(`,`));let n=t.toString();return n?`?${n}`:``}var $=R(`reviews`,()=>{let e=c([]),t=c(!1),n=c(null);async function r(r={}){t.value=!0,n.value=null;try{e.value=await H(`/api/reviews${Pe(r)}`)}catch(t){e.value=[],n.value=t instanceof Error?t.message:String(t)}finally{t.value=!1}}async function i(t){let n=await B(`/api/reviews`,t);return e.value=[n,...e.value],n}return{reviews:e,loading:t,error:n,fetchReviews:r,createReview:i}}),Fe={class:`text-h6`},Ie=w(p({__name:`ReviewCreateDialog`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:x([`created`,`hide`],[`update:modelValue`]),setup(e,{emit:t}){let i=C(e,`modelValue`),a=t,{t:s}=de(),l=$(),d=c(``),f=c(!1),p=c(null);function m(){d.value=``,f.value=!1,p.value=null}async function _(){f.value=!0,p.value=null;try{let e=d.value.trim(),t=await l.createReview(e?{name:e}:{});i.value=!1,m(),a(`created`,t)}catch(e){p.value=e instanceof pe||e instanceof Error?e.message:String(e)}finally{f.value=!1}}function y(){m(),a(`hide`)}return(e,t)=>(r(),h(ue,{modelValue:i.value,"onUpdate:modelValue":t[1]||=e=>i.value=e,onHide:y},{default:n(()=>[g(se,{class:`review-create-dialog`},{default:n(()=>[g(I,null,{default:n(()=>[u(`div`,Fe,S(v(s)(`reviews.create.title`)),1)]),_:1}),g(I,{class:`q-gutter-y-md`},{default:n(()=>[g(L,{modelValue:d.value,"onUpdate:modelValue":t[0]||=e=>d.value=e,dense:``,outlined:``,label:v(s)(`reviews.create.nameLabel`),hint:v(s)(`reviews.create.nameHint`),error:!!p.value,"error-message":p.value??void 0,onKeyup:E(_,[`enter`])},null,8,[`modelValue`,`label`,`hint`,`error`,`error-message`])]),_:1}),g(ce,{align:`right`},{default:n(()=>[o(g(_e,null,null,512),[[Ne]]),g(ge,{loading:f.value,onClick:_},null,8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-c9b736c2`]]),Le=p({__name:`CreateReviewFabButton`,emits:[`created`],setup(e,{emit:i}){let a=i,s=K(),l=ve(),{activeReview:u}=z(s),{changedPaths:f}=z(l),p=c(!1),h=c(!1),v=c([18,18]),b=c(!1),x=y(()=>f.value.length===0||u.value!==null);function S(){l.fetchDiff(),s.refresh()}m(S);let C=he([`files:changed`,`review:created`,`review:updated`,`review:deleted`],S);t(()=>C.close());function w(e){b.value=e.isFirst!==!0&&e.isFinal!==!0,v.value=[v.value[0]-(e.delta?.x??0),v.value[1]-(e.delta?.y??0)]}function T(e){s.setActiveReview(e),a(`created`,e)}return(e,t)=>(r(),d(_,null,[g(Me,{position:`bottom-right`,offset:v.value},{default:n(()=>[o(g(ke,{modelValue:h.value,"onUpdate:modelValue":t[0]||=e=>h.value=e,icon:`add`,color:`accent`,disable:x.value||b.value,onClick:t[1]||=e=>p.value=!0},null,8,[`modelValue`,`disable`]),[[me,w,void 0,{prevent:!0,mouse:!0}]])]),_:1},8,[`offset`]),g(Ie,{modelValue:p.value,"onUpdate:modelValue":t[2]||=e=>p.value=e,onCreated:T,onHide:t[3]||=e=>h.value=!1},null,8,[`modelValue`])],64))}});export{be as a,ve as c,J as i,$ as n,ye as o,Y as r,K as s,Le as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.review-create-dialog[data-v-c9b736c2]{width:420px;max-width:90vw}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as e,c as t,d as n,m as r}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{C as i,t as a}from"./QBtn-Cf6WtiKt.js";var o={},s={class:`fullscreen bg-blue text-white text-center q-pa-md flex flex-center`};function c(i,o){return e(),n(`div`,s,[t(`div`,null,[o[0]||=t(`div`,{style:{"font-size":`30vh`}},`404`,-1),o[1]||=t(`div`,{class:`text-h2`,style:{opacity:`0.4`}},`Oops. Nothing here...`,-1),r(a,{class:`q-mt-xl`,color:`white`,"text-color":`blue`,unelevated:``,to:`/`,label:`Go Home`,"no-caps":``})])])}var l=i(o,[[`render`,c]]);export{l as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.file-explorer[data-v-1ce1b104]{height:100%}[data-v-1ce1b104] .file-explorer__panel{flex-direction:column;flex-shrink:0;min-width:0;height:100%;display:flex}[data-v-1ce1b104] .file-explorer__content{flex-direction:column;flex-wrap:no-wrap;display:flex}.file-tree-node__icon-section[data-v-43168dd7]{min-width:0!important;padding-right:6px!important}.file-tree-node__label[data-v-43168dd7]{width:100%;min-width:0}.file-tree-node__chevron[data-v-43168dd7]{transition:transform .15s}.file-tree-node__chevron--expanded[data-v-43168dd7]{transform:rotate(90deg)}.file-tree-node--selected[data-v-43168dd7]{font-weight:500}.file-list-item__icon-section[data-v-77d2a0e7]{min-width:0!important;padding-right:6px!important}.file-list-item__path-label[data-v-77d2a0e7]{width:100%;min-width:0}.file-list-item--selected[data-v-77d2a0e7],[data-v-77d2a0e7] .file-list-item--selected{font-weight:500}.file-list-item__actions[data-v-77d2a0e7]{gap:2px;flex-direction:row!important;padding:0 0 0 6px!important}.file-list-item__stats[data-v-77d2a0e7]{padding-right:0!important}.file-list-panel__scroll[data-v-704ed3e1] .q-scrollarea__content{width:100%}.active-review-bar[data-v-725a73f5]{min-height:36px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,F as i,H as a,I as o,M as s,N as c,O as l,P as u,U as d,V as f,Z as p,_t as m,b as h,c as g,d as _,g as v,h as y,k as b,l as x,m as S,p as C,q as w,r as T,rt as E,s as D,u as O,v as k,vt as A,w as ee,x as j,yt as M,z as N}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{A as te,C as P,N as ne,R as re,S as F,c as I,f as ie,j as ae,m as oe,o as L,s as R,t as z,w as B}from"./QBtn-Cf6WtiKt.js";import{d as V,u as se}from"./event-BQt_DXaR.js";import{Y as ce,Z as le,_ as H,d as U,f as ue,it as de,p as W,t as G,v as fe}from"./index-Dl3zmXcR.js";import{n as K}from"./vue-i18n.runtime-DSeWNwrW.js";import{n as pe,r as q}from"./pinia-DK4OjQ7o.js";import{a as me,r as he}from"./client-De34x_P_.js";import{i as J,m as ge,p as _e,r as ve}from"./format-B_1hRYcb.js";import{n as ye,t as Y}from"./QTooltip-DAb5vBzv.js";import{t as X}from"./QItemSection-DA4jtl1i.js";import{a as be,i as Z,o as xe,t as Se}from"./AppPage-VD8mwL62.js";import{a as Ce,c as we,o as Te,s as Ee,t as De}from"./CreateReviewFabButton-B4Ut5O1Z.js";import{a as Oe,i as ke,n as Ae,o as Q,r as je,s as Me,t as Ne}from"./StatusSwitcher-BQBbWZPW.js";function Pe(e){return e.toSorted((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1).map(e=>({...e,children:e.children?Pe(e.children):void 0}))}function Fe(e,t){let n=[];for(let r of e){let e=r.split(`/`),i=n;for(let n=0;n<e.length;n++){let a=e[n];if(!a)continue;let o=n===e.length-1,s=e.slice(0,n+1).join(`/`),c=i.find(e=>e.name===a);c||(c={name:a,path:s,type:o?`file`:`directory`,isChanged:o?t.has(r):!1,children:o?void 0:[]},i.push(c)),!o&&c.children&&(i=c.children)}}return Pe(n)}function Ie(e,t){if(!t.trim())return e;let n=t.toLowerCase(),r=e=>{if(e.type===`file`)return e.path.toLowerCase().includes(n)?e:null;let t=e.children?.map(r).filter(e=>e!==null);return t&&t.length>0?{...e,children:t}:e.name.toLowerCase().includes(n)?e:null};return e.map(r).filter(e=>e!==null)}function Le(){let e=p([]),t=p(!1),n=p(null);async function r(r,i=[]){t.value=!0,n.value=null;try{let t=await he(`/api/git/tree/${encodeURIComponent(r)}`);e.value=Fe(t.files.map(xe),new Set(i))}catch(t){n.value=t instanceof Error?t.message:String(t),e.value=[]}finally{t.value=!1}}return{tree:e,loading:t,error:n,fetchTree:r}}function Re(e){return e.type===`file`?e.isChanged:e.children?.some(Re)??!1}var $=pe(`file-explorer`,()=>{let e=we(),{tree:t,loading:r,fetchTree:i}=Le(),{lines:a,isBinary:o,loading:s,fetchContent:c,reset:l}=Me(),u=p(`staged`),d=p(!1),m=p(``),h=p(null),g=p(new Set),_=p(new Set),v=D(()=>u.value===`staged`?e.stagedFiles:e.unstagedFiles),y=D(()=>{let e=(m.value??``).trim().toLowerCase();return e?v.value.filter(t=>Q(t).toLowerCase().includes(e)):v.value}),b=D(()=>Ie(t.value,m.value??``)),x=D(()=>{let e=0,n=t=>{for(let r of t)r.type===`file`?e++:r.children&&n(r.children)};return n(t.value),e});f(t,e=>{let t=new Set,n=e=>{for(let r of e)r.type===`directory`&&r.children&&(Re(r)&&t.add(r.path),n(r.children))};n(e),g.value=t},{immediate:!0}),f(d,t=>{m.value=``,h.value=null,t&&i(`WORKTREE`,e.changedPaths)}),f(u,()=>{h.value=null,_.value=new Set}),f(h,e=>{if(d.value){if(!e){l();return}c(e,`WORKTREE`)}});function S(e){let t=new Set(g.value);t.has(e)?t.delete(e):t.add(e),g.value=t}function C(e){let t=new Set(_.value);t.has(e)?t.delete(e):t.add(e),_.value=t}function w(e){h.value=e,C(e)}function T(e){h.value=e,_.value.has(e)||(_.value=new Set(_.value).add(e))}function E(){_.value=new Set(v.value.map(Q))}function O(){_.value=new Set}function k(e){h.value=e,!d.value&&(_.value.has(e)||(_.value=new Set(_.value).add(e)),n(()=>{document.getElementById(`diff-file-${e}`)?.scrollIntoView({block:`nearest`})}))}let A=null,ee=0;function j(){return A??=(async()=>{await e.fetchDiff(),d.value&&(await i(`WORKTREE`,e.changedPaths),h.value&&await c(h.value,`WORKTREE`))})().finally(()=>{A=null})}async function M(){ee=Date.now(),await j()}async function N(){Date.now()-ee<400||await j()}return{source:u,browseMode:d,filter:m,selectedPath:h,expandedFolders:g,expandedFiles:_,tree:t,treeLoading:r,browseFileLines:a,browseFileIsBinary:o,browseFileLoading:s,diffFiles:v,filteredDiffFiles:y,filteredTree:b,totalTreeFiles:x,toggleFolder:S,toggleFileCard:C,handleCardToggle:w,expandFile:T,expandAllFiles:E,collapseAllFiles:O,selectFile:k,refresh:M,refreshFromServerEvent:N}}),ze=V({name:`QSplitter`,props:{...fe,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:`%`,validator:e=>[`%`,`px`].includes(e)},limits:{type:Array,validator:e=>e.length!==2||typeof e[0]!=`number`||typeof e[1]!=`number`?!1:e[0]>=0&&e[0]<=e[1]},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object],separatorAriaLabel:String},emits:[`update:modelValue`],setup(t,{slots:r,emit:i}){let a=F(),o=H(t,a),s=e(null),c={before:e(null),after:e(null)},l=U(),u=D(()=>`q-splitter no-wrap ${t.horizontal?`q-splitter--horizontal column`:`q-splitter--vertical row`} q-splitter--${t.disable?`disabled`:`workable`}`+(o()?` q-splitter--dark`:``)),p=D(()=>t.horizontal?`height`:`width`),m=D(()=>t.reverse?`after`:`before`),h=D(()=>t.limits===void 0?t.unit===`%`?[10,90]:[50,1/0]:t.limits);function g(e){return(t.unit===`%`?e:Math.round(e))+t.unit}let _=D(()=>({[m.value]:{[p.value]:g(t.modelValue)}})),v,y,b,x,S;function C(e){if(e.isFirst){let e=s.value.getBoundingClientRect()[p.value];v=t.horizontal?`up`:`left`,y=t.unit===`%`?100:e,b=Math.min(y,h.value[1],Math.max(h.value[0],t.modelValue)),x=(t.reverse?-1:1)*(t.horizontal?1:a.lang.rtl?-1:1)*(t.unit===`%`?e===0?0:100/e:1),s.value.classList.add(`q-splitter--active`);return}if(e.isFinal){S!==t.modelValue&&i(`update:modelValue`,S),s.value.classList.remove(`q-splitter--active`);return}let n=b+x*(e.direction===v?-1:1)*e.distance[t.horizontal?`y`:`x`];S=Math.min(y,h.value[1],Math.max(h.value[0],n)),c[m.value].value.style[p.value]=g(S),t.emitImmediately&&t.modelValue!==S&&i(`update:modelValue`,S)}let w=D(()=>[[ve,t.disable?void 0:C,void 0,{[t.horizontal?`vertical`:`horizontal`]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]),T=D(()=>{let e={role:`separator`,"aria-orientation":t.horizontal?`horizontal`:`vertical`,"aria-label":t.separatorAriaLabel||a.lang.label.resize};if(t.disable)e[`aria-disabled`]=`true`;else{let n=h.value;e.tabindex=0,e[`aria-controls`]=l.value,e[`aria-valuemin`]=n[0],n[1]!==1/0&&(e[`aria-valuemax`]=n[1]),e[`aria-valuenow`]=Math.round(t.modelValue*100)/100}return e}),E=null;function O(e){let{keyCode:n}=e,r=t.horizontal?[38,40]:[37,39];if(n!==13&&n!==36&&n!==35&&!r.includes(n))return;se(e);let o=h.value,c=t.unit===`%`?100:s.value.getBoundingClientRect()[p.value],l;if(n===13)t.modelValue===o[0]?l=E===null?t.modelValue:E:(E=t.modelValue,l=o[0]);else if(n===36)l=o[0];else if(n===35)l=o[1];else{let e=(n===r[0]?-1:1)*(t.reverse?-1:1)*(t.horizontal?1:a.lang.rtl?-1:1);l=t.modelValue+e*(t.unit===`%`?1:10)}let u=Math.min(c,o[1],Math.max(o[0],l));u!==t.modelValue&&i(`update:modelValue`,u)}function A(e,t){e<t[0]?i(`update:modelValue`,t[0]):e>t[1]&&i(`update:modelValue`,t[1])}return f(()=>t.modelValue,e=>{A(e,h.value)}),f(()=>t.limits,()=>{n(()=>{A(t.modelValue,h.value)})}),()=>{let e=[k(`div`,{ref:c.before,id:m.value===`before`?l.value:void 0,class:[`q-splitter__panel q-splitter__before`+(t.reverse?` col`:``),t.beforeClass],style:_.value.before},oe(r.before)),k(`div`,{class:[`q-splitter__separator`,t.separatorClass],style:t.separatorStyle,...T.value,onKeydown:t.disable?void 0:O},[d(k(`div`,{class:`q-splitter__separator-area absolute-full`},oe(r.separator)),w.value)]),k(`div`,{ref:c.after,id:m.value===`after`?l.value:void 0,class:[`q-splitter__panel q-splitter__after`+(t.reverse?``:` col`),t.afterClass],style:_.value.after},oe(r.after))];return k(`div`,{class:u.value,ref:s},ie(r.default,e))}}}),Be=260,Ve=220,He=600,Ue=P(y({__name:`PanelResize`,setup(e){let t=p(Be),n=D(()=>[Ve,He]);return(e,r)=>(s(),x(ze,{modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e,limits:n.value,unit:`px`,class:`file-explorer`,"before-class":`file-explorer__panel`,"after-class":`file-explorer__content`},{before:a(()=>[i(e.$slots,`panel`,{},void 0,!0)]),after:a(()=>[i(e.$slots,`content`,{},void 0,!0)]),_:3},8,[`modelValue`,`limits`]))}}),[[`__scopeId`,`data-v-1ce1b104`]]),We=0,Ge=[`click`,`keydown`],Ke={icon:String,label:[Number,String],alert:[Boolean,String],alertIcon:String,name:{type:[Number,String],default:()=>`t_${We++}`},noCaps:Boolean,tabindex:[String,Number],disable:Boolean,contentClass:String,ripple:{type:[Boolean,Object],default:!0}},qe=[13,32];function Je(t,n,i,a){let o=h(te,B);if(o===B)return console.error(`QTab/QRouteTab component needs to be child of QTabs`),B;let{proxy:s}=v(),c=e(null),l=e(null),u=e(null);function f(){return t.disable||t.ripple===!1?!1:{keyCodes:qe,early:!0,...t.ripple===!0?{}:t.ripple}}function p(e){let n=o.tabProps.value;return`q-tab relative-position self-stretch flex flex-center text-center`+(e?` q-tab--active`+(n.activeClass?` `+n.activeClass:``)+(n.activeColor?` text-${n.activeColor}`:``)+(n.activeBgColor?` bg-${n.activeBgColor}`:``):` q-tab--inactive`)+(t.icon&&t.label&&!n.inlineLabel?` q-tab--full`:``)+(t.noCaps||n.noCaps?` q-tab--no-caps`:``)+(t.disable?` disabled`:` q-focusable q-hoverable cursor-pointer`)+(a===void 0?``:a.linkClass.value)}function m(){return`q-tab__content self-stretch flex-center relative-position q-anchor--skip non-selectable `+(o.tabProps.value.inlineLabel?`row no-wrap q-tab__content--inline`:`column`)+(t.contentClass===void 0?``:` ${t.contentClass}`)}let g=D(()=>o.currentModel.value===t.name),_=D(()=>{if(t.disable||o.hasFocus.value)return-1;let e=o.tabStopName.value;return e===null||e===t.name?t.tabindex||0:-1});function y(e,n){if(!n&&!e?.qAvoidFocus&&c.value?.focus({preventScroll:!0}),t.disable){a?.hasRouterLink.value===!0&&se(e);return}if(a===void 0){o.updateModel({name:t.name}),i(`click`,e);return}if(a.hasRouterLink.value){let n=(n={})=>{let r,i=n.to===void 0||de(n.to,t.to)?o.avoidRouteWatcher=ue():null;return a.navigateToRouterLink(e,{...n,returnRouterError:!0}).catch(e=>{r=e}).then(e=>{if(i===o.avoidRouteWatcher&&(o.avoidRouteWatcher=!1,r===void 0&&(e===void 0||e.message?.startsWith(`Avoided redundant navigation`)===!0)&&o.updateModel({name:t.name})),n.returnRouterError)return r===void 0?e:Promise.reject(r)})};i(`click`,e,n),e.defaultPrevented||n();return}i(`click`,e)}function x(e){i(`keydown`,e),!e.defaultPrevented&&(ae(e,[13,32])?y(e,!0):e.keyCode>=35&&e.keyCode<=40&&!e.altKey&&!e.metaKey&&!ne(e)&&o.onKbdNavigate(e.keyCode,s.$el)&&se(e))}function S(){let e=o.tabProps.value,r=e.narrowIndicator,i=[],a=k(`div`,{ref:u,class:[`q-tab__indicator`,e.indicatorClass]});t.icon!==void 0&&i.push(k(I,{class:`q-tab__icon`,name:t.icon})),t.label!==void 0&&i.push(k(`div`,{class:`q-tab__label`},t.label)),t.alert&&i.push(t.alertIcon===void 0?k(`div`,{class:`q-tab__alert`+(t.alert===!0?``:` text-${t.alert}`)}):k(I,{class:`q-tab__alert-icon`,color:t.alert===!0?void 0:t.alert,name:t.alertIcon})),r&&i.push(a);let s=[k(`div`,{class:`q-focus-helper`,tabindex:-1,ref:c}),k(`div`,{class:m()},ie(n.default,i))];return r||s.push(a),s}let C={name:D(()=>t.name),disable:D(()=>t.disable),rootRef:l,tabIndicatorRef:u,routeData:a};r(()=>{o.unregisterTab(C)}),b(()=>{o.registerTab(C)});function w(e,n){let r={ref:l,class:p(g.value),tabindex:_.value,role:`tab`,"aria-selected":g.value?`true`:`false`,"aria-disabled":t.disable?`true`:void 0,onClick:y,onKeydown:x,...n};return d(k(e,r,S()),[[L,f()]])}return{renderTab:w,$tabs:o}}var Ye=V({name:`QTab`,props:Ke,emits:Ge,setup(e,{slots:t,emit:n}){let{renderTab:r}=Je(e,t,n);return()=>r(`div`)}});function Xe(e,t,n){let r=n?[`left`,`right`]:[`top`,`bottom`];return`absolute-${t?r[0]:r[1]}${e?` text-${e}`:``}`}function Ze(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}var Qe=[`left`,`center`,`right`,`justify`],$e=V({name:`QTabs`,props:{modelValue:[Number,String],align:{type:String,default:`center`,validator:e=>Qe.includes(e)},breakpoint:{type:[String,Number],default:600},vertical:Boolean,shrink:Boolean,stretch:Boolean,activeClass:String,activeColor:String,activeBgColor:String,indicatorColor:String,leftIcon:String,rightIcon:String,outsideArrows:Boolean,mobileArrows:Boolean,switchIndicator:Boolean,narrowIndicator:Boolean,inlineLabel:Boolean,noCaps:Boolean,dense:Boolean,contentClass:String,"onUpdate:modelValue":[Function,Array]},setup(t,{slots:n,emit:i}){let{proxy:a}=v(),o=F(),{registerTick:s}=ce(),{registerTick:u}=ce(),{registerTick:d}=ce(),{registerTimeout:m,removeTimeout:h}=le(),{registerTimeout:g,removeTimeout:_}=le(),y=e(null),b=e(null),x=p(t.modelValue),S=p(!1),C=p(!0),w=p(!1),T=p(!1),E=[],O=p(0),A=p(!1),j=null,M=null,N,P=D(()=>({activeClass:t.activeClass,activeColor:t.activeColor,activeBgColor:t.activeBgColor,indicatorClass:Xe(t.indicatorColor,t.switchIndicator,t.vertical),narrowIndicator:t.narrowIndicator,inlineLabel:t.inlineLabel,noCaps:t.noCaps})),ne=D(()=>{let e=O.value,t=x.value,n=null;for(let r=0;r<e;r++){let e=E[r];if(!e.disable.value){if(e.name.value===t)return t;n===null&&(n=e.name.value)}}return n}),re=D(()=>`q-tabs__content--align-${S.value?`left`:T.value?`justify`:t.align}`),ie=D(()=>`q-tabs row no-wrap items-center q-tabs--${S.value?``:`not-`}scrollable q-tabs--${t.vertical?`vertical`:`horizontal`} q-tabs__arrows--${t.outsideArrows?`outside`:`inside`} q-tabs--mobile-with${t.mobileArrows?``:`out`}-arrows`+(t.dense?` q-tabs--dense`:``)+(t.shrink?` col-shrink`:``)+(t.stretch?` self-stretch`:``)),ae=D(()=>`q-tabs__content row no-wrap items-center self-stretch hide-scrollbar relative-position `+re.value+(t.contentClass===void 0?``:` ${t.contentClass}`)),L=D(()=>t.vertical?`height`:`width`),R=D(()=>!t.vertical&&o.lang.rtl===!0);f(R,U),f(()=>t.modelValue,e=>{z({name:e,setCurrent:!0,skipEmit:!0})}),f(()=>t.outsideArrows,B);function z({name:e,setCurrent:n,skipEmit:r}){x.value!==e&&(!r&&t[`onUpdate:modelValue`]!==void 0&&i(`update:modelValue`,e),(n||t[`onUpdate:modelValue`]===void 0)&&(se(x.value,e),x.value=e))}function B(){s(()=>{y.value&&V({width:y.value.offsetWidth,height:y.value.offsetHeight})})}function V(e){if(b.value===null)return;let n=e[L.value],r=Array.prototype.reduce.call(b.value.children,(e,t)=>e+t.getBoundingClientRect()[L.value],0),i=n>0&&r-n>1;S.value=i,i&&u(U),T.value=n<Number.parseInt(t.breakpoint,10)}function se(e,n){let r=e!=null&&e!==``?E.find(t=>t.name.value===e):null,i=n!=null&&n!==``?E.find(e=>e.name.value===n):null;if(Z)Z=!1;else if(r&&i){let e=r.tabIndicatorRef.value,n=i.tabIndicatorRef.value;j!==null&&(clearTimeout(j),j=null),e.style.transition=`none`,e.style.transform=`none`,n.style.transition=`none`,n.style.transform=`none`;let a=e.getBoundingClientRect(),o=n.getBoundingClientRect();n.style.transform=t.vertical?`translate3d(0,${a.top-o.top}px,0) scale3d(1,${o.height?a.height/o.height:1},1)`:`translate3d(${a.left-o.left}px,0,0) scale3d(${o.width?a.width/o.width:1},1,1)`,d(()=>{j=setTimeout(()=>{j=null,n.style.transition=`transform .25s cubic-bezier(.4, 0, .2, 1)`,n.style.transform=`none`},70)})}i&&S.value&&H(i.rootRef.value)}function H(e){let{left:n,width:r,top:i,height:a}=b.value.getBoundingClientRect(),o=e.getBoundingClientRect(),s=t.vertical?o.top-i:o.left-n;if(s<0){b.value[t.vertical?`scrollTop`:`scrollLeft`]+=Math.floor(s),U();return}s+=t.vertical?o.height-a:o.width-r,s>0&&(b.value[t.vertical?`scrollTop`:`scrollLeft`]+=Math.ceil(s),U())}function U(){let e=b.value;if(e===null)return;let n=e.getBoundingClientRect(),r=t.vertical?e.scrollTop:Math.abs(e.scrollLeft);R.value?(C.value=Math.ceil(r+n.width)<e.scrollWidth-1,w.value=r>0):(C.value=r>0,w.value=t.vertical?Math.ceil(r+n.height)<e.scrollHeight:Math.ceil(r+n.width)<e.scrollWidth)}function ue(e){M!==null&&clearInterval(M),M=setInterval(()=>{pe(e)&&G()},5)}function de(){ue(R.value?2**53-1:0)}function W(){ue(R.value?0:2**53-1)}function G(){M!==null&&(clearInterval(M),M=null)}function fe(e,n){let r=Array.prototype.filter.call(b.value.children,e=>e===n||e.matches?.(`.q-tab.q-focusable`)),i=r.length;if(i===0)return;if(e===36)return H(r[0]),r[0].focus(),!0;if(e===35)return H(r[i-1]),r[i-1].focus(),!0;let a=e===(t.vertical?38:37),o=e===(t.vertical?40:39),s=a?-1:o?1:void 0;if(s!==void 0){let e=t.vertical!==!0&&R.value?-1:1,a=(r.indexOf(n)+s*e+i)%i;return H(r[a]),r[a].focus({preventScroll:!0}),!0}}let K=D(()=>R.value?{get:e=>Math.abs(e.scrollLeft),set:(e,t)=>{e.scrollLeft=-t}}:t.vertical?{get:e=>e.scrollTop,set:(e,t)=>{e.scrollTop=t}}:{get:e=>e.scrollLeft,set:(e,t)=>{e.scrollLeft=t}});function pe(e){let t=b.value,{get:n,set:r}=K.value,i=!1,a=n(t),o=e<a?-1:1;return a+=o*5,a<0?(i=!0,a=0):(o===-1&&a<=e||o===1&&a>=e)&&(i=!0,a=e),r(t,a),U(),i}function q(){let e=null,t={matchedLen:0,queryDiff:9999,hrefLen:0},n=E.filter(e=>e.routeData?.hasRouterLink.value===!0),{hash:r,query:i}=a.$route,o=Object.keys(i).length;for(let a of n){let n=a.routeData.exact.value===!0;if(!a.routeData[n?`linkIsExactActive`:`linkIsActive`].value)continue;let{hash:s,query:c,matched:l,href:u}=a.routeData.resolvedLink.value,d=Object.keys(c).length;if(n){if(s!==r||d!==o||!Ze(i,c))continue;e=a.name.value;break}if(s!==``&&s!==r||d!==0&&!Ze(c,i))continue;let f={matchedLen:l.length,queryDiff:o-d,hrefLen:u.length-s.length};if(f.matchedLen>t.matchedLen){e=a.name.value,t=f;continue}if(f.matchedLen===t.matchedLen){if(f.queryDiff<t.queryDiff)e=a.name.value,t=f;else if(f.queryDiff!==t.queryDiff)continue;f.hrefLen>t.hrefLen&&(e=a.name.value,t=f)}}if(e===null&&E.some(e=>e.routeData===void 0&&e.name.value===x.value)){Z=!1;return}z({name:e,setCurrent:!0})}function me(e){if(h(),!A.value&&y.value!==null&&e.target&&typeof e.target.closest==`function`){let t=e.target.closest(`.q-tab`);t&&y.value.contains(t)&&(A.value=!0,S.value&&H(t))}}function he(){m(()=>{A.value=!1},30)}function J(){Y.avoidRouteWatcher===!1?g(q):_()}function _e(){if(N===void 0){let e=f(()=>a.$route.fullPath,J);N=()=>{e(),N=void 0}}}function ve(e){E.push(e),O.value++,B(),e.routeData===void 0||a.$route===void 0?g(()=>{if(S.value){let e=x.value,t=e!=null&&e!==``?E.find(t=>t.name.value===e):null;t&&H(t.rootRef.value)}}):(_e(),e.routeData.hasRouterLink.value&&J())}function ye(e){E.splice(E.indexOf(e),1),O.value--,B(),N!==void 0&&e.routeData!==void 0&&(E.every(e=>e.routeData===void 0)&&N(),J())}let Y={currentModel:x,tabProps:P,hasFocus:A,tabStopName:ne,registerTab:ve,unregisterTab:ye,verifyRouteModel:J,updateModel:z,onKbdNavigate:fe,avoidRouteWatcher:!1};c(te,Y);function X(){j!==null&&clearTimeout(j),G(),N?.()}let be=!1,Z=!1;return r(X),l(()=>{be=N!==void 0,X()}),ee(()=>{be&&(_e(),Z=!0,J()),B()}),()=>k(`div`,{ref:y,class:ie.value,role:`tablist`,"aria-orientation":t.vertical?`vertical`:`horizontal`,onFocusin:me,onFocusout:he},[k(ge,{onResize:V}),k(`div`,{ref:b,class:ae.value,onScroll:U},oe(n.default)),k(I,{class:`q-tabs__arrow q-tabs__arrow--left absolute q-tab__icon`+(C.value?``:` q-tabs__arrow--faded`),name:t.leftIcon||o.iconSet.tabs[t.vertical?`up`:`left`],onMousedownPassive:de,onTouchstartPassive:de,onMouseupPassive:G,onMouseleavePassive:G,onTouchendPassive:G}),k(I,{class:`q-tabs__arrow q-tabs__arrow--right absolute q-tab__icon`+(w.value?``:` q-tabs__arrow--faded`),name:t.rightIcon||o.iconSet.tabs[t.vertical?`down`:`right`],onMousedownPassive:W,onTouchstartPassive:W,onMouseupPassive:G,onMouseleavePassive:G,onTouchendPassive:G})])}}),et={class:`row items-center no-wrap q-gutter-x-xs`},tt={class:`row items-center no-wrap q-gutter-x-xs`},nt=y({__name:`FileExplorerTabs`,props:j({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`staged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=N(e,`modelValue`),{t:n}=K();return(r,i)=>(s(),x($e,{modelValue:t.value,"onUpdate:modelValue":i[0]||=e=>t.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:a(()=>[S(Ye,{name:`staged`},{default:a(()=>[g(`div`,et,[g(`span`,null,M(E(n)(`changes.staged`)),1),S(_e,{color:`positive`,rounded:``},{default:a(()=>[C(M(e.stagedFilesLength),1)]),_:1})])]),_:1}),S(Ye,{name:`unstaged`},{default:a(()=>[g(`div`,tt,[g(`span`,null,M(E(n)(`changes.unstaged`)),1),S(_e,{color:`warning`,rounded:``},{default:a(()=>[C(M(e.unstagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),rt={class:`file-tree-node`},it={class:`row items-center no-wrap q-gutter-x-xs`},at={class:`ellipsis file-tree-node__label`},ot={class:`ellipsis file-tree-node__label`},st={key:2},ct=P(y({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(e,{emit:t}){let n=e,r=t,i=8+n.level*12;return(t,n)=>{let c=o(`FileTreeNode`,!0);return s(),_(`div`,rt,[e.node.type===`directory`?d((s(),x(J,{key:0,clickable:``,dense:``,style:A({paddingLeft:`${i}px`}),onClick:n[0]||=t=>r(`toggle-folder`,e.node.path)},{default:a(()=>[S(X,{avatar:``,class:`file-tree-node__icon-section`},{default:a(()=>[g(`div`,it,[S(I,{name:`chevron_right`,size:`xs`,class:m([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":e.expandedFolders.has(e.node.path)}])},null,8,[`class`]),S(I,{name:e.expandedFolders.has(e.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),S(X,{class:`text-mono`},{default:a(()=>[g(`div`,at,[C(M(e.node.name)+` `,1),S(Y,{anchor:`top middle`,self:`bottom middle`},{default:a(()=>[C(M(e.node.path),1)]),_:1})])]),_:1}),e.node.children?(s(),x(X,{key:0,side:``,class:`text-caption text-grey-6`},{default:a(()=>[C(M(e.node.children.length),1)]),_:1})):O(``,!0)]),_:1},8,[`style`])),[[L]]):d((s(),x(J,{key:1,clickable:``,dense:``,active:e.node.path===e.selectedPath,"active-class":`file-tree-node--selected`,style:A({paddingLeft:`${i+20}px`}),onClick:n[1]||=t=>r(`file-select`,e.node.path)},{default:a(()=>[S(X,{avatar:``,class:`file-tree-node__icon-section`},{default:a(()=>[S(I,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),S(X,{class:`text-mono`},{default:a(()=>[g(`div`,ot,[C(M(e.node.name)+` `,1),S(Y,{anchor:`top middle`,self:`bottom middle`},{default:a(()=>[C(M(e.node.path),1)]),_:1})])]),_:1}),e.node.isChanged?(s(),x(X,{key:0,side:``},{default:a(()=>[S(I,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):O(``,!0)]),_:1},8,[`active`,`style`])),[[L]]),e.node.type===`directory`&&e.expandedFolders.has(e.node.path)&&e.node.children?(s(),_(`div`,st,[(s(!0),_(T,null,u(e.node.children,t=>(s(),x(c,{key:t.path,node:t,"selected-path":e.selectedPath,"expanded-folders":e.expandedFolders,level:e.level+1,onToggleFolder:n[2]||=e=>r(`toggle-folder`,e),onFileSelect:n[3]||=e=>r(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):O(``,!0)])}}}),[[`__scopeId`,`data-v-43168dd7`]]);function lt(){let e=F(),{t}=K(),n=$();async function r(r,i,a){try{await me(i,{paths:[r]}),await n.refresh()}catch(n){e.notify({type:`negative`,message:t(a),caption:n instanceof Error?n.message:String(n)})}}function i(e){return r(e,`/api/git/stage`,`changes.actions.stageError`)}function a(e){return r(e,`/api/git/unstage`,`changes.actions.unstageError`)}function o(n){e.dialog({title:t(`changes.actions.discardConfirmTitle`),message:t(`changes.actions.discardConfirmMessage`,{path:n}),persistent:!0,ok:{label:t(`changes.actions.discardConfirmOk`),color:`negative`,flat:!0},cancel:{label:t(`changes.actions.discardConfirmCancel`),flat:!0}}).onOk(()=>{r(n,`/api/git/discard`,`changes.actions.discardError`)})}return{stage:i,unstage:a,discard:o}}var ut={class:`ellipsis file-list-item__path-label`},dt={class:`text-caption`},ft={class:`text-positive`},pt={class:`text-negative q-ml-xs`},mt=P(y({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{}},emits:[`click`],setup(e){let{t}=K(),{stage:n,unstage:r,discard:i}=lt(),o={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},c={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`};return(l,u)=>d((s(),x(J,{clickable:``,dense:``,active:e.selected,"active-class":`file-list-item--selected`,onClick:u[3]||=e=>l.$emit(`click`)},{default:a(()=>[S(X,{avatar:``,class:`file-list-item__icon-section`},{default:a(()=>[g(`span`,{class:m([`text-caption text-weight-bold text-mono`,`text-${c[e.file.status]}`])},M(o[e.file.status]),3)]),_:1}),S(X,{class:`text-mono`},{default:a(()=>[g(`div`,ut,[C(M(E(Q)(e.file))+` `,1),S(Y,{anchor:`top middle`,self:`bottom middle`},{default:a(()=>[C(M(E(Q)(e.file)),1)]),_:1})])]),_:1}),S(X,{side:``,class:`file-list-item__stats`},{default:a(()=>[g(`span`,dt,[g(`span`,ft,`+`+M(e.file.additions),1),g(`span`,pt,`-`+M(e.file.deletions),1)])]),_:1}),S(X,{side:``,class:`file-list-item__actions`},{default:a(()=>[e.source===`unstaged`?(s(),_(T,{key:0},[d((s(),x(z,{flat:``,dense:``,round:``,size:`sm`,icon:`undo`,"aria-label":E(t)(`changes.actions.discard`),onClick:u[0]||=re(t=>E(i)(E(Q)(e.file)),[`stop`])},{default:a(()=>[S(Y,null,{default:a(()=>[C(M(E(t)(`changes.actions.discard`)),1)]),_:1})]),_:1},8,[`aria-label`])),[[L]]),d((s(),x(z,{flat:``,dense:``,round:``,size:`sm`,icon:`add`,"aria-label":E(t)(`changes.actions.stage`),onClick:u[1]||=re(t=>E(n)(E(Q)(e.file)),[`stop`])},{default:a(()=>[S(Y,null,{default:a(()=>[C(M(E(t)(`changes.actions.stage`)),1)]),_:1})]),_:1},8,[`aria-label`])),[[L]])],64)):d((s(),x(z,{key:1,flat:``,dense:``,round:``,size:`sm`,icon:`remove`,"aria-label":E(t)(`changes.actions.unstage`),onClick:u[2]||=re(t=>E(r)(E(Q)(e.file)),[`stop`])},{default:a(()=>[S(Y,null,{default:a(()=>[C(M(E(t)(`changes.actions.unstage`)),1)]),_:1})]),_:1},8,[`aria-label`])),[[L]])]),_:1})]),_:1},8,[`active`])),[[L]])}}),[[`__scopeId`,`data-v-77d2a0e7`]]),ht=y({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=N(e,`modelValue`),{t:n}=K();return(e,r)=>(s(),x(J,null,{default:a(()=>[S(X,null,{default:a(()=>[S(Ce,null,{default:a(()=>[C(M(E(n)(`browse.toggle`)),1)]),_:1})]),_:1}),S(X,{side:``},{default:a(()=>[S(G,{modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),gt={class:`file-list-panel__header q-pa-sm`},_t={key:1,class:`text-subtitle2 q-mb-sm`},vt={class:`text-primary`},yt={key:0,class:`row justify-center q-pa-lg`},bt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},xt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},St=P(y({__name:`FileListPanel`,setup(e){let{t}=K(),{stagedFiles:n,unstagedFiles:r,loading:i}=q(we()),o=$(),{source:c,browseMode:l,filter:d,selectedPath:f,expandedFolders:p,treeLoading:m,filteredDiffFiles:h,filteredTree:v,totalTreeFiles:y}=q(o);return(e,b)=>(s(),_(T,null,[g(`div`,gt,[E(l)?(s(),_(`div`,_t,[C(M(E(t)(`browse.allFiles`))+` `,1),g(`span`,vt,`(`+M(E(y))+`)`,1)])):(s(),x(nt,{key:0,modelValue:E(c),"onUpdate:modelValue":b[0]||=e=>w(c)?c.value=e:null,"staged-files-length":E(n).length,"unstaged-files-length":E(r).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),S(Te,{modelValue:E(d),"onUpdate:modelValue":b[1]||=e=>w(d)?d.value=e:null,placeholder:E(l)?E(t)(`browse.searchPlaceholder`):E(t)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`])]),S(W),S(Z,{class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:a(()=>[(E(l)?E(m):E(i))?(s(),_(`div`,yt,[S(R,{color:`primary`,size:`2em`})])):E(l)?(s(),_(T,{key:1},[E(v).length===0?(s(),_(`p`,bt,M(E(d)?E(t)(`browse.noMatchingFiles`):E(t)(`browse.noFiles`)),1)):O(``,!0),(s(!0),_(T,null,u(E(v),e=>(s(),x(ct,{key:e.path,node:e,"selected-path":E(f),"expanded-folders":E(p),level:0,onToggleFolder:E(o).toggleFolder,onFileSelect:E(o).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(s(),_(T,{key:2},[E(h).length===0?(s(),_(`p`,xt,M(E(d)?E(t)(`browse.noMatchingFiles`):E(t)(`changes.emptyFileList`)),1)):O(``,!0),(s(!0),_(T,null,u(E(h),e=>(s(),x(mt,{key:E(Q)(e),file:e,selected:E(f)===E(Q)(e),source:E(c),onClick:t=>E(o).selectFile(E(Q)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))),128))],64))]),_:1}),S(W),S(ht,{modelValue:E(l),"onUpdate:modelValue":b[2]||=e=>w(l)?l.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-704ed3e1`]]),Ct={class:`diff-status-bar row items-center q-gutter-x-md q-pa-sm text-body2`},wt={class:`text-weight-medium`},Tt={class:`text-positive`},Et={class:`text-negative`},Dt={key:0,class:`text-grey-6`},Ot={key:1,class:`text-grey-6`},kt={key:2,class:`text-grey-6`},At={key:3,class:`text-grey-6`},jt=y({__name:`DiffStatusBar`,props:{files:{}},emits:[`expand-all`,`collapse-all`],setup(e,{emit:t}){let n=e,r=t,{t:i}=K(),a=D(()=>{let e=n.files.reduce((e,t)=>e+t.additions,0),t=n.files.reduce((e,t)=>e+t.deletions,0),r=n.files.filter(e=>e.status===`added`).length,i=n.files.filter(e=>e.status===`modified`).length,a=n.files.filter(e=>e.status===`deleted`).length,o=n.files.filter(e=>e.status===`renamed`).length;return{total:n.files.length,additions:e,deletions:t,added:r,modified:i,deleted:a,renamed:o}});return(e,t)=>(s(),_(`div`,Ct,[g(`span`,wt,M(E(i)(`changes.filesChanged`,{count:a.value.total})),1),g(`span`,Tt,` +`+M(a.value.additions)+` `+M(E(i)(`changes.additions`)),1),g(`span`,Et,` -`+M(a.value.deletions)+` `+M(E(i)(`changes.deletions`)),1),a.value.added?(s(),_(`span`,Dt,M(a.value.added)+` `+M(E(i)(`changes.added`)),1)):O(``,!0),a.value.modified?(s(),_(`span`,Ot,M(a.value.modified)+` `+M(E(i)(`changes.modified`)),1)):O(``,!0),a.value.deleted?(s(),_(`span`,kt,M(a.value.deleted)+` `+M(E(i)(`changes.deletedPlural`)),1)):O(``,!0),a.value.renamed?(s(),_(`span`,At,M(a.value.renamed)+` `+M(E(i)(`changes.renamed`)),1)):O(``,!0),S(ye),S(z,{dense:``,flat:``,"no-caps":``,size:`sm`,icon:`unfold_more`,label:E(i)(`changes.expandAll`),onClick:t[0]||=e=>r(`expand-all`)},null,8,[`label`]),S(z,{dense:``,flat:``,"no-caps":``,size:`sm`,icon:`unfold_less`,label:E(i)(`changes.collapseAll`),onClick:t[1]||=e=>r(`collapse-all`)},null,8,[`label`])]))}}),Mt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Nt={class:`text-body2 ellipsis`},Pt=P(y({__name:`ActiveReviewBar`,setup(e){let{t}=K(),n=F(),r=Ee(),{activeReview:i}=q(r);function a(e){r.setStatus(e).catch(e=>{n.notify({type:`negative`,message:t(`reviews.comments.error`),caption:e instanceof Error?e.message:String(e)})})}return(e,n)=>E(i)?(s(),_(`div`,Mt,[S(I,{name:`rate_review`,size:`18px`,color:`primary`}),g(`span`,Nt,M(E(i).name??E(t)(`reviews.list.unnamed`)),1),S(ye),S(Ne,{status:E(i).status,onChange:a},null,8,[`status`])])):O(``,!0)}}),[[`__scopeId`,`data-v-725a73f5`]]),Ft={key:0,class:`q-pa-md text-grey-6`},It=y({__name:`DiffPanel`,setup(e){let{t}=K(),n=F(),r=$(),i=Ee(),{source:o,diffFiles:c,expandedFiles:l}=q(r),{activeReview:d,commentsByFile:f}=q(i);async function p(e){try{await e()}catch(e){n.notify({type:`negative`,message:t(`reviews.comments.error`),caption:e instanceof Error?e.message:String(e)})}}function m(e){p(()=>i.createComment(e))}function h(e,t){p(()=>i.editComment(e,t))}function g(e){p(()=>i.deleteComment(e))}function v(e){p(()=>i.resolveComment(e))}function y(e){p(()=>i.unresolveComment(e))}return(e,n)=>(s(),_(T,null,[E(c).length===0?(s(),_(`div`,Ft,M(E(t)(`changes.emptyDiffPanel`)),1)):(s(),_(T,{key:1},[S(Pt),E(d)?(s(),x(W,{key:0})):O(``,!0),S(jt,{files:E(c),onExpandAll:E(r).expandAllFiles,onCollapseAll:E(r).collapseAllFiles},null,8,[`files`,`onExpandAll`,`onCollapseAll`]),S(W),S(Z,{class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:a(()=>[(s(!0),_(T,null,u(E(c),e=>(s(),x(Ae,{key:E(Q)(e),file:e,source:E(o),expanded:E(l).has(E(Q)(e)),commentable:!!E(d),"comments-editable":!!E(d),comments:E(f).get(E(Q)(e))??[],onToggle:t=>E(r).handleCardToggle(E(Q)(e)),onExpand:t=>E(r).expandFile(E(Q)(e)),onCreateComment:m,onEditComment:h,onDeleteComment:g,onResolveComment:v,onUnresolveComment:y},null,8,[`file`,`source`,`expanded`,`commentable`,`comments-editable`,`comments`,`onToggle`,`onExpand`]))),128))]),_:1})],64)),!E(d)&&E(c).length>0?(s(),x(De,{key:2})):O(``,!0)],64))}}),Lt={key:0,class:`q-pa-md text-grey-6`},Rt={key:0,class:`row justify-center q-pa-lg`},zt={key:1,class:`q-pa-md text-grey-6`},Bt=y({__name:`FileContentPanel`,setup(e){let{t}=K(),n=$(),{selectedPath:r,browseFileLines:i,browseFileIsBinary:o,browseFileLoading:c}=q(n);return(e,n)=>E(r)?(s(),x(ke,{key:1,class:`col`},{header:a(()=>[S(je,{path:E(r)},null,8,[`path`])]),default:a(()=>[E(c)?(s(),_(`div`,Rt,[S(R,{color:`primary`,size:`2em`})])):E(o)?(s(),_(`div`,zt,M(E(t)(`changes.binaryFile`)),1)):(s(),x(Z,{key:2,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:a(()=>[S(Oe,{path:E(r),lines:E(i)},null,8,[`path`,`lines`])]),_:1}))]),_:1})):(s(),_(`div`,Lt,M(E(t)(`browse.selectFile`)),1))}}),Vt=y({__name:`FileExplorer`,setup(e){let n=$(),r=Ee(),{browseMode:i}=q(n);b(()=>{n.refresh(),r.refresh()});let o=be([`files:changed`],()=>void n.refreshFromServerEvent());t(()=>o.close());let c=be([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void r.refresh());return t(()=>c.close()),(e,t)=>(s(),x(Ue,null,{panel:a(()=>[S(St)]),content:a(()=>[E(i)?(s(),x(Bt,{key:0})):(s(),x(It,{key:1}))]),_:1}))}}),Ht=y({__name:`IndexPage`,setup(e){return(e,t)=>(s(),x(Se,null,{default:a(()=>[S(Vt)]),_:1}))}});export{Ht as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,H as i,I as a,M as o,N as s,U as c,V as l,X as u,Z as d,_t as f,b as p,c as m,d as h,g as ee,h as g,k as te,l as _,m as v,p as y,r as b,rt as x,s as S,u as C,v as w,yt as T,z as E}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{C as D,D as ne,S as re,c as O,f as k,h as ie,k as ae,m as A,o as j,t as M,w as N}from"./QBtn-Cf6WtiKt.js";import{d as P}from"./event-BQt_DXaR.js";import{r as oe}from"./Platform-CEDL_PgC.js";import{A as se,D as ce,E as le,J as F,K as ue,N as I,O as de,Q as fe,Z as pe,_ as me,k as L,q as R,v as z}from"./index-Dl3zmXcR.js";import{n as B}from"./vue-i18n.runtime-DSeWNwrW.js";import{r as V}from"./pinia-DK4OjQ7o.js";import{t as H}from"./repository-store-CBxek7MZ.js";import{n as U}from"./use-app-theme-DvzGyhQd.js";import{h as W,i as G,m as K,p as he,r as ge,t as q}from"./format-B_1hRYcb.js";import{n as _e,t as ve}from"./QTooltip-DAb5vBzv.js";import{t as J}from"./QItemSection-DA4jtl1i.js";import{t as ye}from"./QList-BeOKfebe.js";var be=P({name:`QPageContainer`,setup(e,{slots:t}){let n=re(),r=p(ne,N);if(r===N)return console.error(`QPageContainer needs to be child of QLayout`),N;s(ae,!0);let i=S(()=>{let e={};return r.header.space&&(e.paddingTop=`${r.header.size}px`),r.right.space&&(e[`padding${n.lang.rtl?`Left`:`Right`}`]=`${r.right.size}px`),r.footer.space&&(e.paddingBottom=`${r.footer.size}px`),r.left.space&&(e[`padding${n.lang.rtl?`Right`:`Left`}`]=`${r.left.size}px`),e});return()=>w(`div`,{class:`q-page-container`,style:i.value},A(t.default))}}),xe=/^(h|l)h(h|r) lpr (f|l)f(f|r)$/,Se=P({name:`QLayout`,props:{container:Boolean,view:{type:String,default:`hhh lpr fff`,validator:e=>xe.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(n,{slots:r,emit:i}){let a=re(),o=e(null),c=d(a.screen.height),f=d(n.container?0:a.screen.width),p=d({position:0,direction:`down`,inflectionPoint:0}),m=d(0),h=d(oe.value?0:I()),ee=S(()=>`q-layout q-layout--`+(n.container?`containerized`:`standard`)),g=S(()=>n.container?null:{minHeight:a.screen.height+`px`}),te=S(()=>h.value===0?null:{[a.lang.rtl?`left`:`right`]:`${h.value}px`}),_=S(()=>h.value===0?null:{[a.lang.rtl?`right`:`left`]:0,[a.lang.rtl?`left`:`right`]:`-${h.value}px`,width:`calc(100% + ${h.value}px)`}),v=null;function y(e){let t={position:e.position.top,direction:e.direction,directionChanged:e.directionChanged,inflectionPoint:e.inflectionPoint.top,delta:e.delta.top};n.container||!document.qScrollPrevented?(v=null,b(t)):v=t}function b(e){p.value=e,n.onScroll!==void 0&&i(`scroll`,e)}function x(e){let{height:t,width:r}=e,a=!1;c.value!==t&&(a=!0,c.value=t,n.onScrollHeight!==void 0&&i(`scrollHeight`,t),T()),f.value!==r&&(a=!0,f.value=r),a&&n.onResize!==void 0&&i(`resize`,e)}function C({height:e}){m.value!==e&&(m.value=e,T())}function T(){if(n.container){let e=c.value>m.value?I():0;h.value!==e&&(h.value=e)}}let E=null,D={instances:{},view:S(()=>n.view),isContainer:S(()=>n.container),rootRef:o,height:c,containerHeight:m,scrollbarWidth:h,totalWidth:S(()=>n.container?f.value+h.value:a.screen.width),rows:S(()=>{let e=n.view.toLowerCase().split(` `);return{top:[...e[0]],middle:[...e[1]],bottom:[...e[2]]}}),header:u({size:0,offset:0,space:!1}),right:u({size:300,offset:0,space:!1}),footer:u({size:0,offset:0,space:!1}),left:u({size:300,offset:0,space:!1}),scroll:p,animate(){E===null?document.body.classList.add(`q-body--layout-animate`):clearTimeout(E),E=setTimeout(()=>{E=null,document.body.classList.remove(`q-body--layout-animate`)},155)},update(e,t,n){D[e][t]=n}};s(ne,D);{let e=()=>{if(v!==null){let e=v;v=null,b(e)}};L(e),t(()=>{se(e)})}if(I()>0){let e=null,r=document.documentElement,i=()=>{e=null,r.classList.remove(`hide-scrollbar`)},o=()=>{if(e===null){if(r.scrollHeight>a.screen.height)return;r.classList.add(`hide-scrollbar`)}else clearTimeout(e);e=setTimeout(i,300)},s=t=>{e!==null&&t===`remove`&&(clearTimeout(e),i()),window[`${t}EventListener`](`resize`,o)};l(()=>n.container?`remove`:`add`,s),n.container||s(`add`),t(()=>{s(`remove`)})}return()=>{let e=k(r.default,[w(W,{onScroll:y}),w(K,{onResize:x})]),t=w(`div`,{class:ee.value,style:g.value,ref:n.container?void 0:o,tabindex:-1},e);return n.container?w(`div`,{class:`q-layout-container overflow-hidden`,ref:o},[w(K,{onResize:C}),w(`div`,{class:`absolute-full`,style:te.value},[w(`div`,{class:`scroll`,style:_.value},[t])])]):t}}}),Ce=P({name:`QToolbarTitle`,props:{shrink:Boolean},setup(e,{slots:t}){return()=>w(`div`,{class:`q-toolbar__title ellipsis`+(e.shrink?` col-shrink`:``)},A(t.default))}}),we=P({name:`QToolbar`,props:{inset:Boolean},setup(e,{slots:t}){let n=S(()=>`q-toolbar row no-wrap items-center`+(e.inset?` q-toolbar--inset`:``));return()=>w(`div`,{class:n.value,role:`toolbar`},A(t.default))}});function Y(e,t){e.value!==t&&(e.value=t)}var X=P({name:`QHeader`,props:{modelValue:{type:Boolean,default:!0},reveal:Boolean,revealOffset:{type:Number,default:250},bordered:Boolean,elevated:Boolean,heightHint:{type:[String,Number],default:50}},emits:[`reveal`,`focusin`],setup(e,{slots:t,emit:n}){let i=re(),a=p(ne,N);if(a===N)return console.error(`QHeader needs to be child of QLayout`),N;let o=d(Number.parseInt(e.heightHint,10)),s=d(!0),c=S(()=>e.reveal||a.view.value.includes(`H`)||i.platform.is.ios&&a.isContainer.value),u=S(()=>{if(!e.modelValue)return 0;if(c.value)return s.value?o.value:0;let t=o.value-a.scroll.value.position;return Math.max(t,0)}),f=S(()=>!e.modelValue||c.value&&!s.value),m=S(()=>e.modelValue&&f.value&&e.reveal),h=S(()=>`q-header q-layout__section--marginal `+(c.value?`fixed`:`absolute`)+`-top`+(e.bordered?` q-header--bordered`:``)+(f.value?` q-header--hidden`:``)+(e.modelValue?``:` q-layout--prevent-focus`)),ee=S(()=>{let e=a.rows.value.top,t={};return e[0]===`l`&&a.left.space&&(t[i.lang.rtl?`right`:`left`]=`${a.left.size}px`),e[2]===`r`&&a.right.space&&(t[i.lang.rtl?`left`:`right`]=`${a.right.size}px`),t});function g(e,t){a.update(`header`,e,t)}function te({height:e}){Y(o,e),g(`size`,e)}function _(e){m.value&&Y(s,!0),n(`focusin`,e)}l(()=>e.modelValue,e=>{g(`space`,e),Y(s,!0),a.animate()}),l(u,e=>{g(`offset`,e)}),l(()=>e.reveal,t=>{t||Y(s,e.modelValue)}),l(s,e=>{a.animate(),n(`reveal`,e)}),l(a.scroll,t=>{e.reveal&&Y(s,t.direction===`up`||t.position<=e.revealOffset||t.position-t.inflectionPoint<100)});let v={};return a.instances.header=v,e.modelValue&&g(`size`,o.value),g(`space`,e.modelValue),g(`offset`,u.value),r(()=>{a.instances.header===v&&(a.instances.header=void 0,g(`size`,0),g(`offset`,0),g(`space`,!1))}),()=>{let n=ie(t.default,[]);return e.elevated&&n.push(w(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),n.push(w(K,{debounce:0,onResize:te})),w(`header`,{class:h.value,style:ee.value,onFocusin:_},n)}}}),Z={class:`text-weight-medium`},Q={class:`row items-center gt-sm`},Te=D(g({__name:`MainHeader`,emits:[`toggle-drawer`],setup(e,{emit:t}){let n=t,{t:r}=B(),{info:a}=V(H()),{isDark:s,toggleTheme:l}=U();return(e,t)=>(o(),_(X,{class:f(x(s)?`bg-dark text-white`:`bg-white text-dark`),bordered:``},{default:i(()=>[v(we,null,{default:i(()=>[c(v(M,{flat:``,dense:``,round:``,icon:`menu`,"aria-label":x(r)(`nav.menu`),class:`q-mr-sm`,onClick:t[0]||=e=>n(`toggle-drawer`)},null,8,[`aria-label`]),[[j]]),v(Ce,{shrink:``,class:`text-weight-bold gt-xs`},{default:i(()=>[y(T(x(r)(`app.title`)),1)]),_:1}),x(a)?(o(),h(`div`,{key:0,class:f([`row items-center q-gutter-x-sm text-body2 q-ml-md gt-sm repo-info`,x(s)?`text-grey-5`:`text-grey-7`])},[m(`span`,Z,T(x(a).name),1),x(a).branch?(o(),h(b,{key:0},[t[1]||=m(`span`,null,`/`,-1),v(he,{outline:``,class:`text-body2 text-primary`,rounded:``},{default:i(()=>[y(T(x(a).branch),1)]),_:1})],64)):C(``,!0)],2)):C(``,!0),v(_e),m(`div`,Q,[v(M,{to:{path:`/`},flat:``,"no-caps":``,label:x(r)(`nav.changes`)},null,8,[`label`]),v(M,{to:{path:`/reviews`},flat:``,"no-caps":``,label:x(r)(`nav.reviews`)},null,8,[`label`])]),c((o(),_(M,{flat:``,round:``,dense:``,size:`sm`,icon:x(s)?`light_mode`:`dark_mode`,"aria-label":x(s)?x(r)(`theme.switchToLight`):x(r)(`theme.switchToDark`),class:`q-ml-xs gt-xs`,onClick:x(l)},{default:i(()=>[v(ve,null,{default:i(()=>[y(T(x(s)?x(r)(`theme.switchToLight`):x(r)(`theme.switchToDark`)),1)]),_:1})]),_:1},8,[`icon`,`aria-label`,`onClick`])),[[j]])]),_:1})]),_:1},8,[`class`]))}}),[[`__scopeId`,`data-v-bce37a65`]]),Ee=150;function De(e,t){e.value!==t&&(e.value=t)}var Oe=P({name:`QDrawer`,inheritAttrs:!1,props:{...F,...z,side:{type:String,default:`left`,validator:e=>[`left`,`right`].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>[`default`,`desktop`,`mobile`].includes(e),default:`default`},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...R,`onLayout`,`miniState`,`escapeKey`],setup(e,{slots:t,emit:i,attrs:a}){let o=ee(),s=re(),u=me(e,s),{preventBodyScroll:f}=de(),{registerTimeout:m,removeTimeout:h}=pe(),g=p(ne,N);if(g===N)return console.error(`QDrawer needs to be child of QLayout`),N;let _,v=null,y,b=d(e.behavior===`mobile`||e.behavior!==`desktop`&&g.totalWidth.value<=e.breakpoint),x=S(()=>e.mini&&!b.value),C=S(()=>x.value?e.miniWidth:e.width),T=S(()=>e.overlay||e.miniToOverlay||g.view.value.includes(R.value?`R`:`L`)||s.platform.is.ios&&g.isContainer.value),E=d(e.showIfAbove&&!b.value||e.modelValue===!0),D=S(()=>!e.overlay&&E.value&&!b.value),O=S(()=>e.overlay&&E.value&&!b.value),k=S(()=>!e.persistent&&(b.value||O.value));function ie(e,t){if(P(),e!==!1&&g.animate(),X(0),b.value){let e=g.instances[W.value];e?.belowBreakpoint.value&&e.hide(!1),Z(1),g.isContainer.value||f(!0)}else Z(0),e!==!1&&Q(!1);m(()=>{e!==!1&&Q(!0),t||i(`show`,e)},Ee)}function ae(e,t){oe(),e!==!1&&g.animate(),Z(0),X(z.value*C.value),Ae(),t?h():m(()=>{i(`hide`,e)},Ee)}let{show:j,hide:M}=ue({showing:E,hideOnRouteChange:k,handleShow:ie,handleHide:ae}),{addToHistory:P,removeFromHistory:oe}=fe(E,M,k),se=S(()=>E.value&&k.value);function F(e){i(`escapeKey`),M(e)}function I(e){e?le(F):ce(F)}let L={belowBreakpoint:b,hide:M},R=S(()=>e.side===`right`),z=S(()=>(s.lang.rtl?-1:1)*(R.value?1:-1)),B=d(0),V=d(!1),H=d(!1),U=d(C.value*z.value),W=S(()=>R.value?`left`:`right`),G=S(()=>E.value&&!b.value&&!e.overlay?e.miniToOverlay?e.miniWidth:C.value:0),K=S(()=>`fullscreen q-drawer__backdrop`+(!E.value&&!V.value?` hidden`:``)),he=S(()=>({backgroundColor:`rgba(0,0,0,${B.value*.4})`})),_e=S(()=>R.value?g.rows.value.top[2]===`r`:g.rows.value.top[0]===`l`),ve=S(()=>R.value?g.rows.value.bottom[2]===`r`:g.rows.value.bottom[0]===`l`),J=S(()=>{let e={};return g.header.space&&!_e.value&&(T.value?e.top=`${g.header.offset}px`:g.header.space&&(e.top=`${g.header.size}px`)),g.footer.space&&!ve.value&&(T.value?e.bottom=`${g.footer.offset}px`:g.footer.space&&(e.bottom=`${g.footer.size}px`)),e}),ye=S(()=>{let e={width:`${C.value}px`,transform:`translateX(${U.value}px)`};return b.value?e:Object.assign(e,J.value)}),be=S(()=>`q-drawer__content fit `+(g.isContainer.value?`overflow-auto`:`scroll`)),xe=S(()=>`q-drawer q-drawer--${e.side}`+(H.value?` q-drawer--mini-animate`:``)+(e.bordered?` q-drawer--bordered`:``)+(u()?` q-drawer--dark q-dark`:``)+(V.value?` no-transition`:E.value?``:` q-layout--prevent-focus`)+(b.value?` fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding`:` q-drawer--${x.value?`mini`:`standard`}`+(T.value||!D.value?` fixed`:``)+(e.overlay||e.miniToOverlay?` q-drawer--on-top`:``)+(_e.value?` q-drawer--top-padding`:``))),Se=S(()=>{let t=s.lang.rtl?e.side:W.value;return[[ge,Oe,void 0,{[t]:!0,mouse:!0}]]}),Ce=S(()=>{let t=s.lang.rtl?W.value:e.side;return[[ge,b.value&&!e.noSwipeClose?ke:void 0,void 0,{[t]:!0,mouse:!0}]]}),we=S(()=>{let t=s.lang.rtl?W.value:e.side;return[[ge,E.value&&!e.noSwipeBackdrop?ke:void 0,void 0,{[t]:!0,mouse:!0,mouseAllDir:!0}]]});function Y(){De(b,e.behavior===`mobile`||e.behavior!==`desktop`&&g.totalWidth.value<=e.breakpoint)}l(b,t=>{t?(_=E.value,E.value&&M(!1)):E.value?(X(0),Z(0),Ae()):!e.overlay&&e.behavior!==`mobile`&&_!==!1&&j(!1)}),l(()=>e.side,(e,t)=>{g.instances[t]===L&&(g.instances[t]=void 0,g[t].space=!1,g[t].offset=0),g.instances[e]=L,g[e].size=C.value,g[e].space=D.value,g[e].offset=G.value}),l(g.totalWidth,()=>{(g.isContainer.value||!document.qScrollPrevented)&&Y()}),l(()=>e.behavior+e.breakpoint,Y),l(g.isContainer,e=>{E.value&&f(!e),e&&Y()}),l(g.scrollbarWidth,()=>{X(E.value?0:void 0)}),l(G,e=>{$(`offset`,e)}),l(D,e=>{i(`onLayout`,e),$(`space`,e)}),l(R,()=>{X()}),l(C,t=>{X(),je(e.miniToOverlay,t)}),l(()=>e.miniToOverlay,e=>{je(e,C.value)}),l(()=>s.lang.rtl,()=>{X()}),l(()=>e.mini,()=>{e.noMiniAnimation||e.modelValue&&(Te(),g.animate())}),l(x,e=>{i(`miniState`,e)});function X(e){e===void 0?n(()=>{e=E.value?0:C.value,X(z.value*e)}):(g.isContainer.value&&R.value&&(b.value||Math.abs(e)===C.value)&&(e+=z.value*g.scrollbarWidth.value),U.value=e)}function Z(e){B.value=e}function Q(e){let t=e?`remove`:g.isContainer.value?``:`add`;t!==``&&document.body.classList[t](`q-body--drawer-toggle`)}function Te(){v!==null&&clearTimeout(v),o.proxy&&o.proxy.$el&&o.proxy.$el.classList.add(`q-drawer--mini-animate`),H.value=!0,v=setTimeout(()=>{v=null,H.value=!1,o?.proxy?.$el?.classList.remove(`q-drawer--mini-animate`)},150)}function Oe(e){if(E.value)return;let t=C.value,n=q(e.distance.x,0,t);if(e.isFinal){n>=Math.min(75,t)?j():(g.animate(),Z(0),X(z.value*t)),V.value=!1;return}X((s.lang.rtl?!R.value:R.value)?Math.max(t-n,0):Math.min(0,n-t)),Z(q(n/t,0,1)),e.isFirst&&(V.value=!0)}function ke(t){if(!E.value)return;let n=C.value,r=t.direction===e.side,i=(s.lang.rtl?!r:r)?q(t.distance.x,0,n):0;if(t.isFinal){Math.abs(i)<Math.min(75,n)?(g.animate(),Z(1),X(0)):M(),V.value=!1;return}X(z.value*i),Z(q(1-i/n,0,1)),t.isFirst&&(V.value=!0)}function Ae(){f(!1),Q(!0)}function $(t,n){g.update(e.side,t,n)}function je(t,n){$(`size`,t?e.miniWidth:n)}return g.instances[e.side]=L,je(e.miniToOverlay,C.value),$(`space`,D.value),$(`offset`,G.value),e.showIfAbove&&!e.modelValue&&E.value&&e[`onUpdate:modelValue`]!==void 0&&i(`update:modelValue`,!0),te(()=>{i(`onLayout`,D.value),i(`miniState`,x.value),l(se,I,{immediate:!0}),_=e.showIfAbove;let t=()=>{(E.value?ie:ae)(!1,!0)};if(g.totalWidth.value!==0){n(t);return}y=l(g.totalWidth,()=>{y(),y=void 0,!E.value&&e.showIfAbove&&!b.value?j(!1):t()})}),r(()=>{y?.(),ce(F),v!==null&&(clearTimeout(v),v=null),E.value&&Ae(),g.instances[e.side]===L&&(g.instances[e.side]=void 0,$(`size`,0),$(`offset`,0),$(`space`,!1))}),()=>{let n=[];b.value&&(e.noSwipeOpen||n.push(c(w(`div`,{key:`open`,class:`q-drawer__opener fixed-${e.side}`,"aria-hidden":`true`}),Se.value)),n.push(c(w(`div`,{ref:`backdrop`,class:K.value,style:he.value,"aria-hidden":`true`,onClick:M}),we.value)));let r={},i={};for(let e in a)e===`role`||e.startsWith(`aria-`)?r[e]=a[e]:i[e]=a[e];let o=x.value&&t.mini!==void 0,s=[w(`div`,{...i,key:String(o),class:[be.value,a.class]},o?t.mini():A(t.default))];return e.elevated&&E.value&&s.push(w(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),n.push(c(w(`aside`,{ref:`content`,class:xe.value,style:ye.value,...r},s),Ce.value)),w(`div`,{class:`q-drawer-container`},n)}}}),ke={class:`fit column no-wrap`},Ae=g({__name:`MainMenu`,props:{modelValue:{type:[Boolean,null],required:!0},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=E(e,`modelValue`),{t:n}=B(),{isDark:r,toggleTheme:a}=U();return(e,s)=>(o(),_(Oe,{modelValue:t.value,"onUpdate:modelValue":s[0]||=e=>t.value=e,"show-if-above":``,bordered:``,width:220,dark:x(r)},{default:i(()=>[m(`div`,ke,[v(ye,{class:`col scroll`},{default:i(()=>[c((o(),_(G,{clickable:``,to:{path:`/`}},{default:i(()=>[v(J,{avatar:``},{default:i(()=>[v(O,{name:`compare_arrows`})]),_:1}),v(J,null,{default:i(()=>[y(T(x(n)(`nav.changes`)),1)]),_:1})]),_:1})),[[j]]),c((o(),_(G,{clickable:``,to:{path:`/reviews`}},{default:i(()=>[v(J,{avatar:``},{default:i(()=>[v(O,{name:`rate_review`})]),_:1}),v(J,null,{default:i(()=>[y(T(x(n)(`nav.reviews`)),1)]),_:1})]),_:1})),[[j]])]),_:1}),v(ye,{bordered:``,dark:x(r)},{default:i(()=>[c((o(),_(G,{clickable:``,onClick:x(a)},{default:i(()=>[v(J,{avatar:``},{default:i(()=>[v(O,{name:x(r)?`light_mode`:`dark_mode`},null,8,[`name`])]),_:1}),v(J,null,{default:i(()=>[y(T(x(r)?x(n)(`theme.switchToLight`):x(n)(`theme.switchToDark`)),1)]),_:1})]),_:1},8,[`onClick`])),[[j]])]),_:1},8,[`dark`])])]),_:1},8,[`modelValue`,`dark`]))}}),$=g({__name:`MainLayout`,setup(e){let t=d(!1);function n(){t.value=!t.value}return(e,r)=>{let s=a(`router-view`);return o(),_(Se,{view:`hHh lpr fFf`},{default:i(()=>[v(Te,{onToggleDrawer:n}),v(Ae,{modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e},null,8,[`modelValue`]),v(be,null,{default:i(()=>[v(s)]),_:1})]),_:1})}}});export{$ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{X as e,Z as t}from"./runtime-core.esm-bundler-Wxr8ezGp.js";import{m as n}from"./event-BQt_DXaR.js";var r=t(!1),i,a=512;function o(e){return typeof e==`string`?e.slice(0,a).toLowerCase():``}var s=/(?:^|\s)version\/([\w.]+)/,c=/(?:^|\s)applewebkit\/[\w.]+/,l=/(?:^|\s)safari\/[\w.]+/;function u(e){let t=s.exec(e);return t!==null&&c.test(e)&&l.test(e)?{browser:`safari`,version:t[1]}:null}var d=/(edg|edga|edgios)\/([\w.]+)/,f=/(opr)[\/]([\w.]+)/,p=/(vivaldi)[\/]([\w.]+)/,m=/(chrome|crios)[\/]([\w.]+)/,h=/(firefox|fxios)[\/]([\w.]+)/,g=/(webkit)[\/]([\w.]+)/;function _(e,t){let n=d.exec(e)||f.exec(e)||p.exec(e)||m.exec(e);if(n===null){let r=u(e);if(r!==null)return{...r,platform:t[0]||``};n=h.exec(e)||g.exec(e)||[]}return{browser:n[5]||n[3]||n[1]||``,version:n[4]||n[2]||`0`,platform:t[0]||``}}var v=/(ipad)/,y=/(ipod)/,b=/(iphone)/,x=/(android)/,S=/(win)/,C=/(mac)/,w=/(linux)/,T=/(cros)/;function E(e){return v.exec(e)||y.exec(e)||b.exec(e)||x.exec(e)||S.exec(e)||C.exec(e)||w.exec(e)||T.exec(e)||[]}var D=`ontouchstart`in window||window.navigator.maxTouchPoints>0;function O(e){let t=o(e),n=_(t,E(t)),a={mobile:!1,desktop:!1,cordova:!1,capacitor:!1,nativeMobile:!1,electron:!1,bex:!1,linux:!1,mac:!1,win:!1,cros:!1,chrome:!1,firefox:!1,opera:!1,safari:!1,vivaldi:!1,edge:!1,webkit:!1,android:!1,ios:!1,ipad:!1,iphone:!1,ipod:!1};n.browser&&(a[n.browser]=!0,a.version=n.version,a.versionNumber=Number.parseInt(n.version,10)),n.platform&&(a[n.platform]=!0);let s=a.android||a.ios||a.ipad||a.iphone||a.ipod;if(s===!0||t.includes(`mobile`)?a.mobile=!0:a.desktop=!0,a.edga||a.edgios||a.edg?(a.edge=!0,n.browser=`edge`):a.crios?(a.chrome=!0,n.browser=`chrome`):a.fxios&&(a.firefox=!0,n.browser=`firefox`),(a.ipod||a.ipad||a.iphone)&&(a.ios=!0),a.vivaldi&&=(n.browser=`vivaldi`,!0),(a.chrome||a.opr||a.safari||a.vivaldi||a.mobile&&!a.ios&&!s)&&(a.webkit=!0),a.opr&&(n.browser=`opera`,a.opera=!0),a.name=n.browser,a.platform=n.platform,t.includes(`electron`))a.electron=!0;else if(document.location.href.includes(`-extension://`))a.bex=!0;else{if(window.Capacitor===void 0?(window._cordovaNative!==void 0||window.cordova!==void 0)&&(a.cordova=!0,a.nativeMobile=!0,a.nativeMobileWrapper=`cordova`):(a.capacitor=!0,a.nativeMobile=!0,a.nativeMobileWrapper=`capacitor`),r.value&&(i={is:{...a}}),D&&a.mac&&(a.desktop&&a.safari||a.nativeMobile&&!a.android&&!a.ios&&!a.ipad)){delete a.mac,delete a.desktop;let e=Math.min(window.innerHeight,window.innerWidth)>414?`ipad`:`iphone`;Object.assign(a,{mobile:!0,ios:!0,platform:e,[e]:!0})}!a.mobile&&window.navigator.userAgentData&&window.navigator.userAgentData.mobile&&(delete a.desktop,a.mobile=!0)}return a}var k=navigator.userAgent,A={has:{touch:!1,webStorage:!1},within:{iframe:!1}},j={userAgent:k,is:O(k),has:{touch:D},within:{iframe:window.self!==window.top}},M={install(t){let{$q:n}=t;r.value?(t.onSSRHydrated.push(()=>{Object.assign(n.platform,j),r.value=!1}),n.platform=e(this)):n.platform=this}};{let e;n(j.has,`webStorage`,()=>{if(e!==void 0)return e;try{if(window.localStorage)return e=!0,!0}catch{}return e=!1,!1}),Object.assign(M,j),r.value&&(Object.assign(M,i,A),i=null)}export{j as n,r,M as t};
|