estela 0.3.3 → 0.4.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/README.md +97 -0
- package/dist/billing/assign.d.ts +11 -1
- package/dist/billing/assign.js +59 -1
- package/dist/billing/sessionize.d.ts +6 -0
- package/dist/billing/sessionize.js +24 -5
- package/dist/cli.js +1084 -8
- package/dist/db/schema.js +100 -0
- package/dist/db/store.d.ts +46 -0
- package/dist/db/store.js +179 -5
- package/dist/delivery/clients.d.ts +52 -0
- package/dist/delivery/clients.js +94 -0
- package/dist/delivery/github.d.ts +21 -0
- package/dist/delivery/github.js +123 -0
- package/dist/delivery/report.d.ts +55 -0
- package/dist/delivery/report.js +124 -0
- package/dist/delivery/source.d.ts +68 -0
- package/dist/delivery/source.js +3 -0
- package/dist/export/csv.d.ts +14 -0
- package/dist/export/csv.js +78 -0
- package/dist/export/finance.d.ts +79 -0
- package/dist/export/finance.js +208 -0
- package/dist/i18n/en.js +171 -0
- package/dist/metrics/spend.d.ts +83 -0
- package/dist/metrics/spend.js +167 -0
- package/dist/metrics/undelivered.d.ts +104 -0
- package/dist/metrics/undelivered.js +199 -0
- package/dist/server.js +68 -8
- package/dist/setup.js +1 -1
- package/dist/watchers/git.d.ts +40 -0
- package/dist/watchers/git.js +87 -0
- package/node_modules/@estela/shared/dist/money.d.ts +2 -0
- package/node_modules/@estela/shared/dist/money.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/money.js +7 -7
- package/node_modules/@estela/shared/dist/money.js.map +1 -1
- package/node_modules/@estela/shared/dist/types.d.ts +7 -0
- package/node_modules/@estela/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/types.js.map +1 -1
- package/node_modules/@estela/shared/dist/workitems.d.ts +10 -0
- package/node_modules/@estela/shared/dist/workitems.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/workitems.js.map +1 -1
- package/package.json +1 -1
- package/web/app.css +4 -0
- package/web/app.js +67 -0
- package/web/i18n.js +24 -0
package/dist/watchers/git.d.ts
CHANGED
|
@@ -4,6 +4,41 @@ export declare function readCommits(repoPath: string, options?: {
|
|
|
4
4
|
authorEmail?: string;
|
|
5
5
|
authorEmails?: readonly string[];
|
|
6
6
|
}): Promise<CommitRecord[]>;
|
|
7
|
+
/** Un commit de merge: qué rama se integró y, si lo dice, con qué PR. */
|
|
8
|
+
export interface MergeRecord {
|
|
9
|
+
readonly repoPath: string;
|
|
10
|
+
readonly hash: string;
|
|
11
|
+
readonly at: Date;
|
|
12
|
+
readonly sourceBranch: string | null;
|
|
13
|
+
/** `github:12` o `gitlab:45`. `null` en un merge local sin PR. */
|
|
14
|
+
readonly ref: string | null;
|
|
15
|
+
readonly subject: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Commits de merge de todas las ramas.
|
|
19
|
+
*
|
|
20
|
+
* Es lo único en git que une una rama con su PR sin preguntar a GitHub: el
|
|
21
|
+
* mensaje lo escribe la plataforma con un formato fijo. Un squash no deja
|
|
22
|
+
* merge (solo "Título (#12)" en la rama principal), así que de él no se sabe
|
|
23
|
+
* qué rama fue.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readMerges(repoPath: string, options?: {
|
|
26
|
+
since?: Date;
|
|
27
|
+
}): Promise<MergeRecord[]>;
|
|
28
|
+
/**
|
|
29
|
+
* La rama y el PR de un mensaje de merge, con los formatos que escriben las
|
|
30
|
+
* plataformas y git:
|
|
31
|
+
*
|
|
32
|
+
* Merge pull request #12 from ana/feat/login (GitHub)
|
|
33
|
+
* Merge branch 'feat/login' into 'main' + "See merge request grupo/app!45" (GitLab)
|
|
34
|
+
* Merge branch 'feat/login' [into main] (git, sin PR)
|
|
35
|
+
*
|
|
36
|
+
* Cualquier otro mensaje (alguien lo reescribió) no se adivina.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseMergeMessage(subject: string, body?: string): {
|
|
39
|
+
sourceBranch: string | null;
|
|
40
|
+
ref: string | null;
|
|
41
|
+
};
|
|
7
42
|
/**
|
|
8
43
|
* Raíz del repositorio.
|
|
9
44
|
*
|
|
@@ -32,6 +67,11 @@ export declare function rootCommitFingerprint(path: string): Promise<string | nu
|
|
|
32
67
|
* otros en `develop`— y equivocarse la marcaría todo como abierto.
|
|
33
68
|
*/
|
|
34
69
|
export declare function mergedBranches(path: string): Promise<Set<string>>;
|
|
70
|
+
/**
|
|
71
|
+
* Ramas que existen hoy, locales y remotas, sin el prefijo del remoto. `null`
|
|
72
|
+
* si el repositorio no se puede leer (se borró o se movió): entonces no se sabe.
|
|
73
|
+
*/
|
|
74
|
+
export declare function branchNames(path: string): Promise<Set<string> | null>;
|
|
35
75
|
/** Rama donde el equipo integra. `develop` gana a `main` si existe. */
|
|
36
76
|
export declare function integrationBranch(root: string): Promise<string | null>;
|
|
37
77
|
/** Rama activa del repositorio. Ya no se usa para etiquetar commits. */
|
package/dist/watchers/git.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readCommits = readCommits;
|
|
4
|
+
exports.readMerges = readMerges;
|
|
5
|
+
exports.parseMergeMessage = parseMergeMessage;
|
|
4
6
|
exports.repoRoot = repoRoot;
|
|
5
7
|
exports.rootCommitFingerprint = rootCommitFingerprint;
|
|
6
8
|
exports.mergedBranches = mergedBranches;
|
|
9
|
+
exports.branchNames = branchNames;
|
|
7
10
|
exports.integrationBranch = integrationBranch;
|
|
8
11
|
exports.currentBranch = currentBranch;
|
|
9
12
|
exports.repoAuthors = repoAuthors;
|
|
@@ -102,6 +105,68 @@ async function readCommits(repoPath, options = {}) {
|
|
|
102
105
|
}
|
|
103
106
|
return commits;
|
|
104
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Commits de merge de todas las ramas.
|
|
110
|
+
*
|
|
111
|
+
* Es lo único en git que une una rama con su PR sin preguntar a GitHub: el
|
|
112
|
+
* mensaje lo escribe la plataforma con un formato fijo. Un squash no deja
|
|
113
|
+
* merge (solo "Título (#12)" en la rama principal), así que de él no se sabe
|
|
114
|
+
* qué rama fue.
|
|
115
|
+
*/
|
|
116
|
+
async function readMerges(repoPath, options = {}) {
|
|
117
|
+
const root = await repoRoot(repoPath);
|
|
118
|
+
if (!root)
|
|
119
|
+
return [];
|
|
120
|
+
const format = RECORD + ["%H", "%aI", "%s", "%b"].join(SEP);
|
|
121
|
+
const args = ["log", "--all", "--merges", `--pretty=format:${format}`];
|
|
122
|
+
if (options.since)
|
|
123
|
+
args.push(`--since=${options.since.toISOString()}`);
|
|
124
|
+
let stdout;
|
|
125
|
+
try {
|
|
126
|
+
({ stdout } = await run("git", args, { cwd: root, maxBuffer: 64 * 1024 * 1024 }));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const merges = [];
|
|
132
|
+
for (const chunk of stdout.split(RECORD)) {
|
|
133
|
+
const [hash, iso, subject = "", body = ""] = chunk.split(SEP);
|
|
134
|
+
if (!hash || !iso)
|
|
135
|
+
continue;
|
|
136
|
+
const at = new Date(iso);
|
|
137
|
+
if (Number.isNaN(at.getTime()))
|
|
138
|
+
continue;
|
|
139
|
+
const { sourceBranch, ref } = parseMergeMessage(subject.trim(), body);
|
|
140
|
+
merges.push({ repoPath: root, hash: hash.trim(), at, sourceBranch, ref, subject: subject.trim() });
|
|
141
|
+
}
|
|
142
|
+
return merges;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* La rama y el PR de un mensaje de merge, con los formatos que escriben las
|
|
146
|
+
* plataformas y git:
|
|
147
|
+
*
|
|
148
|
+
* Merge pull request #12 from ana/feat/login (GitHub)
|
|
149
|
+
* Merge branch 'feat/login' into 'main' + "See merge request grupo/app!45" (GitLab)
|
|
150
|
+
* Merge branch 'feat/login' [into main] (git, sin PR)
|
|
151
|
+
*
|
|
152
|
+
* Cualquier otro mensaje (alguien lo reescribió) no se adivina.
|
|
153
|
+
*/
|
|
154
|
+
function parseMergeMessage(subject, body = "") {
|
|
155
|
+
const github = /^Merge pull request #(\d+) from (\S+)/.exec(subject);
|
|
156
|
+
if (github) {
|
|
157
|
+
// "from <dueño>/<rama>": la rama puede llevar barras, el dueño no.
|
|
158
|
+
const from = github[2];
|
|
159
|
+
const slash = from.indexOf("/");
|
|
160
|
+
return { sourceBranch: slash === -1 ? from : from.slice(slash + 1), ref: `github:${github[1]}` };
|
|
161
|
+
}
|
|
162
|
+
const branch = /^Merge (?:remote-tracking )?branch '([^']+)'/.exec(subject);
|
|
163
|
+
if (branch) {
|
|
164
|
+
const gitlab = /See merge request \S*!(\d+)/.exec(body);
|
|
165
|
+
const name = branch[1].replace(/^origin\//, "");
|
|
166
|
+
return { sourceBranch: name, ref: gitlab ? `gitlab:${gitlab[1]}` : null };
|
|
167
|
+
}
|
|
168
|
+
return { sourceBranch: null, ref: null };
|
|
169
|
+
}
|
|
105
170
|
/**
|
|
106
171
|
* Raíz del repositorio.
|
|
107
172
|
*
|
|
@@ -174,6 +239,28 @@ async function mergedBranches(path) {
|
|
|
174
239
|
}
|
|
175
240
|
return merged;
|
|
176
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Ramas que existen hoy, locales y remotas, sin el prefijo del remoto. `null`
|
|
244
|
+
* si el repositorio no se puede leer (se borró o se movió): entonces no se sabe.
|
|
245
|
+
*/
|
|
246
|
+
async function branchNames(path) {
|
|
247
|
+
const root = await repoRoot(path);
|
|
248
|
+
if (!root)
|
|
249
|
+
return null;
|
|
250
|
+
try {
|
|
251
|
+
const { stdout } = await run("git", ["for-each-ref", "--format=%(refname)", "refs/heads", "refs/remotes"], { cwd: root });
|
|
252
|
+
const names = new Set();
|
|
253
|
+
for (const line of stdout.split("\n")) {
|
|
254
|
+
const name = line.trim().replace(/^refs\/(heads|remotes\/[^/]+)\//, "");
|
|
255
|
+
if (name && name !== "HEAD")
|
|
256
|
+
names.add(name);
|
|
257
|
+
}
|
|
258
|
+
return names;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
177
264
|
/** Rama donde el equipo integra. `develop` gana a `main` si existe. */
|
|
178
265
|
async function integrationBranch(root) {
|
|
179
266
|
for (const candidate of ["develop", "main", "master"]) {
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* perdería entero.
|
|
12
12
|
*/
|
|
13
13
|
export type Currency = "EUR" | "USD" | "GBP" | "MXN" | "COP" | "ARS" | "CLP" | "PEN" | "BRL";
|
|
14
|
+
/** Decimales de la unidad menor por moneda (ISO 4217). */
|
|
15
|
+
export declare const MINOR_UNIT_DIGITS: Record<Currency, number>;
|
|
14
16
|
/** Importe facturable. `amount` son unidades menores enteras de `currency`. */
|
|
15
17
|
export interface Money {
|
|
16
18
|
readonly amount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE7F,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAEtD,CAAC;AAEF,+EAA+E;AAC/E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,6EAA6E;AAC7E,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,MAAwB,CAAC;AAEpD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAK/D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAenE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAGlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAS3E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1D;AAQD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAQ3E;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAEhF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG,KAAK,CAGxE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAI9E;AAaD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAiC;AAErF,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,SAAqB,GAAG,MAAM,CAQzE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAIjD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAG5C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* perdería entero.
|
|
13
13
|
*/
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.ZERO_AI_COST = void 0;
|
|
15
|
+
exports.ZERO_AI_COST = exports.MINOR_UNIT_DIGITS = void 0;
|
|
16
16
|
exports.money = money;
|
|
17
17
|
exports.parseMoney = parseMoney;
|
|
18
18
|
exports.addMoney = addMoney;
|
|
@@ -30,7 +30,7 @@ exports.formatAiCost = formatAiCost;
|
|
|
30
30
|
exports.localDate = localDate;
|
|
31
31
|
exports.formatDuration = formatDuration;
|
|
32
32
|
/** Decimales de la unidad menor por moneda (ISO 4217). */
|
|
33
|
-
|
|
33
|
+
exports.MINOR_UNIT_DIGITS = {
|
|
34
34
|
EUR: 2, USD: 2, GBP: 2, MXN: 2, COP: 2, ARS: 2, CLP: 0, PEN: 2, BRL: 2,
|
|
35
35
|
};
|
|
36
36
|
exports.ZERO_AI_COST = { microUsd: 0 };
|
|
@@ -46,7 +46,7 @@ function parseMoney(input, currency) {
|
|
|
46
46
|
if (!/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
47
47
|
throw new TypeError(`Importe no reconocido: "${input}"`);
|
|
48
48
|
}
|
|
49
|
-
const digits = MINOR_UNIT_DIGITS[currency];
|
|
49
|
+
const digits = exports.MINOR_UNIT_DIGITS[currency];
|
|
50
50
|
const [whole = "0", frac = ""] = trimmed.split(".");
|
|
51
51
|
const negative = whole.startsWith("-");
|
|
52
52
|
const wholeDigits = negative ? whole.slice(1) : whole;
|
|
@@ -96,8 +96,8 @@ function convertMoney(from, to, rate) {
|
|
|
96
96
|
if (!(rate > 0) || !Number.isFinite(rate)) {
|
|
97
97
|
throw new TypeError(`Tipo de cambio inválido: ${rate}`);
|
|
98
98
|
}
|
|
99
|
-
const fromDigits = MINOR_UNIT_DIGITS[from.currency];
|
|
100
|
-
const toDigits = MINOR_UNIT_DIGITS[to];
|
|
99
|
+
const fromDigits = exports.MINOR_UNIT_DIGITS[from.currency];
|
|
100
|
+
const toDigits = exports.MINOR_UNIT_DIGITS[to];
|
|
101
101
|
const major = from.amount / 10 ** fromDigits;
|
|
102
102
|
return { amount: Math.round(major * rate * 10 ** toDigits), currency: to };
|
|
103
103
|
}
|
|
@@ -138,7 +138,7 @@ const SYMBOLS = {
|
|
|
138
138
|
let defaultMoneyLocale = "es-EC";
|
|
139
139
|
function setMoneyLocale(locale) { defaultMoneyLocale = locale; }
|
|
140
140
|
function formatMoney(m, locale = defaultMoneyLocale) {
|
|
141
|
-
const digits = MINOR_UNIT_DIGITS[m.currency];
|
|
141
|
+
const digits = exports.MINOR_UNIT_DIGITS[m.currency];
|
|
142
142
|
const value = (m.amount / 10 ** digits).toLocaleString(locale, {
|
|
143
143
|
minimumFractionDigits: digits,
|
|
144
144
|
maximumFractionDigits: digits,
|
|
@@ -152,7 +152,7 @@ function formatMoney(m, locale = defaultMoneyLocale) {
|
|
|
152
152
|
* ticket), donde los céntimos solo estorban.
|
|
153
153
|
*/
|
|
154
154
|
function formatMoneyWhole(m) {
|
|
155
|
-
const value = Math.round(m.amount / 10 ** MINOR_UNIT_DIGITS[m.currency]).toLocaleString("en-US");
|
|
155
|
+
const value = Math.round(m.amount / 10 ** exports.MINOR_UNIT_DIGITS[m.currency]).toLocaleString("en-US");
|
|
156
156
|
const symbol = SYMBOLS[m.currency];
|
|
157
157
|
return symbol ? `${symbol}${value}` : `${value} ${m.currency}`;
|
|
158
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAsBH,sBAKC;AAGD,gCAeC;AAED,4BAGC;AAED,4BASC;AAED,8BAEC;AAED,8BAEC;AAiBD,oCAQC;AAGD,sCAEC;AASD,wCAGC;AAMD,oCAIC;AAaD,wCAAqF;AAErF,kCAQC;AAOD,4CAIC;AAGD,oCAIC;AAYD,8BAGC;AAED,wCAQC;AAvLD,0DAA0D;
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"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"}
|
|
@@ -211,6 +211,11 @@ export interface Project {
|
|
|
211
211
|
* — `estela doctor` avisa en vez de tragárselo en silencio.
|
|
212
212
|
*/
|
|
213
213
|
readonly closedAt: Date | null;
|
|
214
|
+
/**
|
|
215
|
+
* Cuándo se archivó, o `null`/ausente si está activo. A diferencia de cerrar,
|
|
216
|
+
* archivar lo quita del panel y deja de captar horas. Se puede restaurar.
|
|
217
|
+
*/
|
|
218
|
+
readonly archivedAt?: Date | null;
|
|
214
219
|
/**
|
|
215
220
|
* El gestor de tareas del proyecto (Jira, Azure Boards, GitHub...), para
|
|
216
221
|
* reconocer sus tickets en ramas y commits. Sin él solo se reconoce lo
|
|
@@ -281,6 +286,8 @@ export interface TimeEntry {
|
|
|
281
286
|
* base siempre viene, aunque sea vacío.
|
|
282
287
|
*/
|
|
283
288
|
readonly workItems?: readonly string[];
|
|
289
|
+
/** Si los tickets se pusieron a mano (`estela entry link`). Solo al leer de la base. */
|
|
290
|
+
readonly workItemsManual?: boolean;
|
|
284
291
|
}
|
|
285
292
|
export interface InvoiceLine {
|
|
286
293
|
readonly description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEtF;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,WAAW,EAAE,UAEzB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,uFAAuF;IACvF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAMD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;AAE9C,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAI3D,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CACnC;AAED;;;;;GAKG;AACH;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAE3D,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,SAAS,GACT,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,OAAO,CAAC;AAEZ,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQrD,CAAC;AAEF,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA+Ca,QAAA,WAAW,GAAe;IACrC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;CACpE,CAAC;AAuKW,QAAA,mBAAmB,GAAgC;IAC9D,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,SAAS;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA+Ca,QAAA,WAAW,GAAe;IACrC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;CACpE,CAAC;AAuKW,QAAA,mBAAmB,GAAgC;IAC9D,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAmEW,QAAA,mBAAmB,GAAgC;IAC9D,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,gBAAgB;CAC7E,CAAC;AAmBW,QAAA,gBAAgB,GAA6B;IACxD,WAAW,EAAE,YAAY;IACzB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,MAAM;CACd,CAAC"}
|
|
@@ -21,6 +21,16 @@ export interface WorkItemTracker {
|
|
|
21
21
|
* nada que no empiece así se confunde con un ticket.
|
|
22
22
|
*/
|
|
23
23
|
readonly prefixes: readonly string[];
|
|
24
|
+
/**
|
|
25
|
+
* La etiqueta que marca lo planificado (`estela delivery`). Sin ella, el
|
|
26
|
+
* informe solo enseña lo entregado.
|
|
27
|
+
*/
|
|
28
|
+
readonly planLabel?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Prefijo de las etiquetas que dicen qué cliente pidió algo (`cliente:acme`).
|
|
31
|
+
* Sin configurar se usa `cliente:`.
|
|
32
|
+
*/
|
|
33
|
+
readonly clientLabel?: string;
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
26
36
|
* Claves normalizadas (`jira:PROJ-12`, `azure:1234`, `github:12`), primero las
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workitems.d.ts","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA0C,CAAC;AAE/F,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"workitems.d.ts","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA0C,CAAC;AAE/F,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAWD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,GAC/B,MAAM,EAAE,CAqBV;AA0CD,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAS3F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workitems.js","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;
|
|
1
|
+
{"version":3,"file":"workitems.js","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "estela",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Time tracking you never fill in: rebuilds your billable hours from Claude Code, Codex and GitHub Copilot sessions and your Git history, and splits what the AI cost per project.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"time-tracking",
|
package/web/app.css
CHANGED
|
@@ -639,6 +639,10 @@ main.wide { max-width: 1180px; }
|
|
|
639
639
|
font-variant-numeric: tabular-nums; white-space: nowrap;
|
|
640
640
|
}
|
|
641
641
|
.pcard-warn { font-size: .85rem; color: var(--amber); margin-top: 10px; }
|
|
642
|
+
.pcard-actions { display: flex; justify-content: flex-end; margin-top: 10px; }
|
|
643
|
+
.archived { margin: 16px 0; }
|
|
644
|
+
.archived summary { cursor: pointer; color: var(--muted, inherit); }
|
|
645
|
+
.archived-row { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 10px; padding: 10px 0; }
|
|
642
646
|
.repos { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
|
|
643
647
|
.repos code {
|
|
644
648
|
font-family: ui-monospace, Menlo, monospace; font-size: .76rem; color: var(--ink-3);
|
package/web/app.js
CHANGED
|
@@ -1010,6 +1010,10 @@ function renderProjects(data, orphans) {
|
|
|
1010
1010
|
<input type="date" class="rate-from" value="${localToday()}">
|
|
1011
1011
|
<button type="submit" class="chip">${tr("common.save")}</button>
|
|
1012
1012
|
</form>
|
|
1013
|
+
<div class="pcard-actions">
|
|
1014
|
+
<button type="button" class="chip project-archive" data-project="${esc(p.id)}"
|
|
1015
|
+
data-name="${esc(p.name)}" data-unbilled="${p.unbilledSeconds}">${tr("projects.archive")}</button>
|
|
1016
|
+
</div>
|
|
1013
1017
|
</div>`);
|
|
1014
1018
|
}
|
|
1015
1019
|
|
|
@@ -1018,6 +1022,27 @@ function renderProjects(data, orphans) {
|
|
|
1018
1022
|
<p>${tr("projects.empty.body")}</p></div>`);
|
|
1019
1023
|
}
|
|
1020
1024
|
|
|
1025
|
+
// Lo archivado queda a mano y plegado: no estorba, pero se puede recuperar.
|
|
1026
|
+
if ((data.archived || []).length) {
|
|
1027
|
+
parts.push(`<details class="archived">
|
|
1028
|
+
<summary>${tr("projects.archived.title", { n: data.archived.length })}</summary>
|
|
1029
|
+
${data.archived.map((p) => `<div class="archived-row">
|
|
1030
|
+
<div>
|
|
1031
|
+
<div class="pcard-name">${esc(p.name)}</div>
|
|
1032
|
+
<div class="pcard-meta">${tr("projects.meta", {
|
|
1033
|
+
client: esc(p.clientName), duration: fmtDuration(p.seconds), blocks: tr("blocks", { n: p.blocks }),
|
|
1034
|
+
})}</div>
|
|
1035
|
+
${p.deleteBlocker ? `<div class="addform-hint">${tr(`projects.delete.blocked.${p.deleteBlocker}`)}</div>` : ""}
|
|
1036
|
+
</div>
|
|
1037
|
+
<div class="row-inline">
|
|
1038
|
+
<button type="button" class="chip project-restore" data-project="${esc(p.id)}">${tr("projects.restore")}</button>
|
|
1039
|
+
${p.deleteBlocker ? "" : `<button type="button" class="chip project-delete" data-project="${esc(p.id)}"
|
|
1040
|
+
data-name="${esc(p.name)}" data-blocks="${p.blocks}" data-seconds="${p.seconds}">${tr("projects.delete")}</button>`}
|
|
1041
|
+
</div>
|
|
1042
|
+
</div>`).join("")}
|
|
1043
|
+
</details>`);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1021
1046
|
// Repos con trabajo capturado que no pertenecen a nadie. Es la lista más
|
|
1022
1047
|
// útil de la pantalla: son horas que ya tienes pero no puedes facturar.
|
|
1023
1048
|
// Se presentan como tarjetas y no como un desplegable porque rellenar un
|
|
@@ -1153,6 +1178,48 @@ function wireProjects() {
|
|
|
1153
1178
|
});
|
|
1154
1179
|
|
|
1155
1180
|
// Copiar el enlace, sin salir de aquí.
|
|
1181
|
+
document.querySelectorAll(".project-archive").forEach((btn) => {
|
|
1182
|
+
btn.addEventListener("click", async () => {
|
|
1183
|
+
const unbilled = Number(btn.dataset.unbilled);
|
|
1184
|
+
const aviso = unbilled > 0 ? tr("projects.archive.unbilled", { duration: fmtDuration(unbilled) }) : "";
|
|
1185
|
+
if (!window.confirm(tr("projects.archive.confirm", { name: btn.dataset.name }) + aviso)) return;
|
|
1186
|
+
try {
|
|
1187
|
+
await api("/api/project-archive", { method: "POST", body: JSON.stringify({ projectId: btn.dataset.project }) });
|
|
1188
|
+
await loadProjects();
|
|
1189
|
+
toast(tr("toast.projectArchived"));
|
|
1190
|
+
} catch (error) { toast(error.message); }
|
|
1191
|
+
});
|
|
1192
|
+
});
|
|
1193
|
+
|
|
1194
|
+
document.querySelectorAll(".project-restore").forEach((btn) => {
|
|
1195
|
+
btn.addEventListener("click", async () => {
|
|
1196
|
+
btn.disabled = true;
|
|
1197
|
+
try {
|
|
1198
|
+
await api("/api/project-restore", { method: "POST", body: JSON.stringify({ projectId: btn.dataset.project }) });
|
|
1199
|
+
await loadProjects();
|
|
1200
|
+
toast(tr("toast.projectRestored"));
|
|
1201
|
+
} catch (error) { toast(error.message); btn.disabled = false; }
|
|
1202
|
+
});
|
|
1203
|
+
});
|
|
1204
|
+
|
|
1205
|
+
// Eliminar no tiene vuelta atrás: se escribe el nombre, como en cualquier
|
|
1206
|
+
// herramienta donde un clic de más cuesta datos.
|
|
1207
|
+
document.querySelectorAll(".project-delete").forEach((btn) => {
|
|
1208
|
+
btn.addEventListener("click", async () => {
|
|
1209
|
+
const escrito = window.prompt(tr("projects.delete.confirm", {
|
|
1210
|
+
name: btn.dataset.name, duration: fmtDuration(Number(btn.dataset.seconds)),
|
|
1211
|
+
blocks: tr("blocks", { n: Number(btn.dataset.blocks) }),
|
|
1212
|
+
}));
|
|
1213
|
+
if (escrito === null) return;
|
|
1214
|
+
try {
|
|
1215
|
+
await api("/api/project-delete", { method: "POST",
|
|
1216
|
+
body: JSON.stringify({ projectId: btn.dataset.project, confirmName: escrito }) });
|
|
1217
|
+
await loadProjects();
|
|
1218
|
+
toast(tr("toast.projectDeleted"));
|
|
1219
|
+
} catch (error) { toast(error.message); }
|
|
1220
|
+
});
|
|
1221
|
+
});
|
|
1222
|
+
|
|
1156
1223
|
// Vincular un repositorio ya detectado a un proyecto que existe. Es lo que
|
|
1157
1224
|
// le faltaba a quien acepta una invitación: el proyecto queda creado pero
|
|
1158
1225
|
// vacío, y la única salida era la terminal.
|
package/web/i18n.js
CHANGED
|
@@ -226,6 +226,18 @@
|
|
|
226
226
|
"projects.noRepo": "Sin repositorio: no se le imputa nada todavía.",
|
|
227
227
|
"projects.orphanOption": "{name} — {turns} turnos, hasta {last}",
|
|
228
228
|
"projects.link": "Vincular",
|
|
229
|
+
"projects.archive": "Archivar",
|
|
230
|
+
"projects.archive.confirm": "¿Archivar \"{name}\"? Saldrá del panel y dejará de captar horas. No se borra nada y puedes restaurarlo.",
|
|
231
|
+
"projects.archive.unbilled": "\n\nTiene {duration} sin facturar: se conservan, pero no podrás facturarlas hasta restaurarlo.",
|
|
232
|
+
"projects.archived.title": "Archivados ({n})",
|
|
233
|
+
"projects.restore": "Restaurar",
|
|
234
|
+
"projects.delete": "Eliminar",
|
|
235
|
+
"projects.delete.confirm": "Se eliminarán \"{name}\" y sus {blocks} ({duration}), y no se puede deshacer. Las sesiones y los commits se conservan.\n\nEscribe el nombre del proyecto para confirmar:",
|
|
236
|
+
"projects.delete.blocked.invoiced": "Tiene horas facturadas: no se puede eliminar.",
|
|
237
|
+
"projects.delete.blocked.shared": "Está publicado o sincronizado: no se puede eliminar.",
|
|
238
|
+
"toast.projectArchived": "Proyecto archivado",
|
|
239
|
+
"toast.projectRestored": "Proyecto restaurado",
|
|
240
|
+
"toast.projectDeleted": "Proyecto eliminado",
|
|
229
241
|
"projects.noOrphans": "No hemos detectado ningún repositorio sin asignar. Trabaja un rato con tu agente y vuelve, o vincúlalo con <code>estela team repo --project {id} --add <ruta></code>.",
|
|
230
242
|
"projects.empty.title": "Todavía no hay proyectos",
|
|
231
243
|
"projects.empty.body": "Crea el primero abajo y asígnale el repositorio donde trabajas.",
|
|
@@ -532,6 +544,18 @@
|
|
|
532
544
|
"projects.noRepo": "No repository: nothing is assigned to it yet.",
|
|
533
545
|
"projects.orphanOption": "{name} — {turns} turns, until {last}",
|
|
534
546
|
"projects.link": "Link",
|
|
547
|
+
"projects.archive": "Archive",
|
|
548
|
+
"projects.archive.confirm": "Archive \"{name}\"? It will leave the panel and stop capturing hours. Nothing is deleted and you can restore it.",
|
|
549
|
+
"projects.archive.unbilled": "\n\nIt has {duration} not invoiced: they're kept, but you can't invoice them until you restore it.",
|
|
550
|
+
"projects.archived.title": "Archived ({n})",
|
|
551
|
+
"projects.restore": "Restore",
|
|
552
|
+
"projects.delete": "Delete",
|
|
553
|
+
"projects.delete.confirm": "This deletes \"{name}\" and its {blocks} ({duration}), and can't be undone. Sessions and commits are kept.\n\nType the project name to confirm:",
|
|
554
|
+
"projects.delete.blocked.invoiced": "It has invoiced hours: it can't be deleted.",
|
|
555
|
+
"projects.delete.blocked.shared": "It's published or synced: it can't be deleted.",
|
|
556
|
+
"toast.projectArchived": "Project archived",
|
|
557
|
+
"toast.projectRestored": "Project restored",
|
|
558
|
+
"toast.projectDeleted": "Project deleted",
|
|
535
559
|
"projects.noOrphans": "We haven't detected any unassigned repository. Work with your agent for a while and come back, or link it with <code>estela team repo --project {id} --add <path></code>.",
|
|
536
560
|
"projects.empty.title": "No projects yet",
|
|
537
561
|
"projects.empty.body": "Create the first one below and assign it the repository you work in.",
|