UI for release mgmt in lite cloud
This commit is contained in:
Родитель
097e0e9621
Коммит
bee32e41fa
14
ast/help.ts
14
ast/help.ts
|
@ -228,6 +228,20 @@ module TDev {
|
||||||
ispositive: boolean;
|
ispositive: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface JsonRelease extends JsonPublication
|
||||||
|
{
|
||||||
|
releaseid:string;
|
||||||
|
labels:JsonReleaseLabel[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface JsonReleaseLabel
|
||||||
|
{
|
||||||
|
name: string;
|
||||||
|
userid: string;
|
||||||
|
time: number;
|
||||||
|
releaseid: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface JsonEtag
|
export interface JsonEtag
|
||||||
{
|
{
|
||||||
id:string;
|
id:string;
|
||||||
|
|
|
@ -4193,6 +4193,7 @@ module TDev
|
||||||
(dbg ? HTML.mkButtonTick(lf("manage showcase"), Ticks.hubShowcaseMgmt, () => { this.hide(); Browser.TheHost.showList("showcase-mgmt", null); }) : null),
|
(dbg ? HTML.mkButtonTick(lf("manage showcase"), Ticks.hubShowcaseMgmt, () => { this.hide(); Browser.TheHost.showList("showcase-mgmt", null); }) : null),
|
||||||
(Util.localTranslationTracking ? HTML.mkButtonTick(lf("translations"), Ticks.hubShowcaseMgmt, () => { ModalDialog.showText(Util.dumpTranslationFreqs()) }) : null),
|
(Util.localTranslationTracking ? HTML.mkButtonTick(lf("translations"), Ticks.hubShowcaseMgmt, () => { ModalDialog.showText(Util.dumpTranslationFreqs()) }) : null),
|
||||||
(dbg ? HTML.mkButton(lf("show internal icons"), () => { ScriptProperties.showIcons(); }) : null),
|
(dbg ? HTML.mkButton(lf("show internal icons"), () => { ScriptProperties.showIcons(); }) : null),
|
||||||
|
(Cloud.lite && dbg ? HTML.mkButton(lf("show releases"), () => { Util.setHash("#list:releases") }) : null),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
m.add(div("wall-dialog-buttons", HTML.mkButton(lf("close"), () => m.dismiss())));
|
m.add(div("wall-dialog-buttons", HTML.mkButton(lf("close"), () => m.dismiss())));
|
||||||
|
|
|
@ -1210,6 +1210,7 @@ module TDev { export module Browser {
|
||||||
else if (e.kind == "art") return this.getArtInfoById(e.id);
|
else if (e.kind == "art") return this.getArtInfoById(e.id);
|
||||||
else if (e.kind == "group") return this.getGroupInfoById(e.id);
|
else if (e.kind == "group") return this.getGroupInfoById(e.id);
|
||||||
else if (e.kind == "document") return this.getDocumentInfo(e);
|
else if (e.kind == "document") return this.getDocumentInfo(e);
|
||||||
|
else if (e.kind == "release") return this.getReleaseInfoById(e.id);
|
||||||
else return null;
|
else return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1373,6 +1374,10 @@ module TDev { export module Browser {
|
||||||
if (Cloud.getUserId()) path = Cloud.getUserId() + "/groups";
|
if (Cloud.getUserId()) path = Cloud.getUserId() + "/groups";
|
||||||
else path = null;
|
else path = null;
|
||||||
break;
|
break;
|
||||||
|
case "releases":
|
||||||
|
tick(Ticks.browseListReleases)
|
||||||
|
header = lf("releases");
|
||||||
|
break;
|
||||||
case "showcase-mgmt":
|
case "showcase-mgmt":
|
||||||
header = "show-mgmt";
|
header = "show-mgmt";
|
||||||
break;
|
break;
|
||||||
|
@ -1727,6 +1732,17 @@ module TDev { export module Browser {
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getReleaseInfoById(id:string)
|
||||||
|
{
|
||||||
|
var si = <ReleaseInfo>this.getLocation(id);
|
||||||
|
if (!si) {
|
||||||
|
si = new ReleaseInfo(this);
|
||||||
|
si.loadFromWeb(id);
|
||||||
|
this.saveLocation(si);
|
||||||
|
}
|
||||||
|
return si;
|
||||||
|
}
|
||||||
|
|
||||||
public getArtInfoById(id:string)
|
public getArtInfoById(id:string)
|
||||||
{
|
{
|
||||||
var si = <ArtInfo>this.getLocation(id);
|
var si = <ArtInfo>this.getLocation(id);
|
||||||
|
@ -2303,11 +2319,18 @@ module TDev { export module Browser {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public invalidate(path:string)
|
public invalidate(path:string, rec = false)
|
||||||
{
|
{
|
||||||
this.forEachEntry((e) => {
|
this.forEachEntry((e) => {
|
||||||
if (Util.startsWith(e.path, path))
|
if (Util.startsWith(e.path, path)) {
|
||||||
|
if (rec && e.currentData && e.currentData.etags) {
|
||||||
|
e.currentData.etags.forEach(i => {
|
||||||
|
var ee = this.entriesByPath[i.id]
|
||||||
|
if (ee) ee.invalidate()
|
||||||
|
})
|
||||||
|
}
|
||||||
e.invalidate()
|
e.invalidate()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8478,5 +8501,104 @@ module TDev { export module Browser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class ReleaseInfo
|
||||||
|
extends BrowserPage {
|
||||||
|
private name: string;
|
||||||
|
public description: string;
|
||||||
|
public userid:string;
|
||||||
|
|
||||||
|
constructor(par: Host) {
|
||||||
|
super(par)
|
||||||
|
}
|
||||||
|
public persistentId() { return "release:" + this.publicId; }
|
||||||
|
public getTitle() { return this.name || super.getTitle(); }
|
||||||
|
|
||||||
|
public getName() { return lf("settings"); }
|
||||||
|
public getId() { return "settings"; }
|
||||||
|
public isMine() { return this.userid == Cloud.getUserId(); }
|
||||||
|
|
||||||
|
public loadFromWeb(id: string) {
|
||||||
|
Util.assert(!!id)
|
||||||
|
this.publicId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public mkBoxCore(big: boolean) {
|
||||||
|
var icon = div("sdIcon", HTML.mkImg("svg:fa-upload,white"));
|
||||||
|
icon.style.background = "#1731B8";
|
||||||
|
var nameBlock = div("sdName");
|
||||||
|
var hd = div("sdNameBlock", nameBlock);
|
||||||
|
|
||||||
|
var numbers = div("sdNumbers");
|
||||||
|
var author = div("sdAuthorInner");
|
||||||
|
|
||||||
|
var addInfoInner = div("sdAddInfoInner", "/" + this.publicId);
|
||||||
|
var pubId = div("sdAddInfoOuter", addInfoInner);
|
||||||
|
|
||||||
|
var res = div("sdHeaderOuter",
|
||||||
|
div("sdHeader", icon,
|
||||||
|
div("sdHeaderInner", hd, pubId, div("sdAuthor", author), numbers
|
||||||
|
)));
|
||||||
|
|
||||||
|
if (big)
|
||||||
|
res.className += " sdBigHeader";
|
||||||
|
|
||||||
|
|
||||||
|
return this.withUpdate(res, (u:JsonRelease) => {
|
||||||
|
var nm = u.releaseid.replace(/^\d\d\d\d\d\d\d+-[^\-]+-/, "")
|
||||||
|
var labs = u.labels.map(l => l.name).join(", ")
|
||||||
|
if (labs) nm += " (" + labs + ")"
|
||||||
|
nameBlock.setChildren([ nm ])
|
||||||
|
author.setChildren([u.username]);
|
||||||
|
addInfoInner.setChildren(["/" + this.publicId + ", " + Util.timeSince(u.time)]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public mkTabsCore(): BrowserTab[] {
|
||||||
|
var tabs: BrowserTab[] = [
|
||||||
|
this
|
||||||
|
];
|
||||||
|
return tabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public initTab() {
|
||||||
|
this.withUpdate(this.tabContent, (u:JsonRelease) => {
|
||||||
|
var ch = ["current", "beta", "cloud"].map(n => HTML.mkButton("make " + n, () => {
|
||||||
|
var doit = () =>
|
||||||
|
Cloud.postPrivateApiAsync(this.publicId + "/label", { name: n })
|
||||||
|
.done(r => this.reload())
|
||||||
|
if (n == "current") ModalDialog.ask(lf("are you sure?"), lf("move {0} label", n), doit)
|
||||||
|
else doit()
|
||||||
|
}))
|
||||||
|
|
||||||
|
ch.unshift(div(null,
|
||||||
|
HTML.mkButtonElt("sdBigButton sdBigButtonFull", div("sdBigButtonIcon", HTML.mkImg("svg:fa-rocket,white")),
|
||||||
|
div("sdBigButtonDesc", lf("launch")))
|
||||||
|
.withClick(() =>
|
||||||
|
Util.navigateInWindow(Cloud.getServiceUrl() + "/app/?r=" + this.publicId))
|
||||||
|
));
|
||||||
|
|
||||||
|
ch.push(div("sdHeading", u.labels.length ? "labels" : "no labels"))
|
||||||
|
u.labels.forEach(l => {
|
||||||
|
ch.push(div(null, "label: " + l.name + " by /" + l.userid + " on " + Util.timeSince(l.time)))
|
||||||
|
})
|
||||||
|
|
||||||
|
this.tabContent.setChildren(ch)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private reload()
|
||||||
|
{
|
||||||
|
this.invalidateCaches();
|
||||||
|
TheEditor.historyMgr.reload(HistoryMgr.windowHash());
|
||||||
|
}
|
||||||
|
|
||||||
|
private invalidateCaches() {
|
||||||
|
TheApiCacheMgr.invalidate("releases", true);
|
||||||
|
TheApiCacheMgr.invalidate(Cloud.getUserId() + "/releases");
|
||||||
|
TheApiCacheMgr.invalidate(this.publicId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
|
@ -423,6 +423,7 @@ module TDev {
|
||||||
browseSendPullRequest,
|
browseSendPullRequest,
|
||||||
browsePublicationNotes,
|
browsePublicationNotes,
|
||||||
browseListBugs,
|
browseListBugs,
|
||||||
|
browseListReleases,
|
||||||
browseShare,
|
browseShare,
|
||||||
browseListMyScripts,
|
browseListMyScripts,
|
||||||
browseListNew,
|
browseListNew,
|
||||||
|
|
|
@ -3577,6 +3577,23 @@ function tdupload(args:string[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setlabel(args:string[])
|
||||||
|
{
|
||||||
|
var mm = /^(http.*)(\?access_token=.*)/.exec(args[0])
|
||||||
|
|
||||||
|
if (!mm || !args[2]) return
|
||||||
|
|
||||||
|
var liteUrl = mm[1]
|
||||||
|
var key = mm[2]
|
||||||
|
|
||||||
|
var liteId = args[1]
|
||||||
|
var channel = args[2]
|
||||||
|
|
||||||
|
tdevGet(liteUrl + "api/" + liteId + "/label" + key, resp => {
|
||||||
|
console.log("channel: " + resp)
|
||||||
|
}, 1, { name: channel })
|
||||||
|
}
|
||||||
|
|
||||||
var cmds = {
|
var cmds = {
|
||||||
"deps": { f: deps, a: "<script-file>", h: "compute and output script dependencies" },
|
"deps": { f: deps, a: "<script-file>", h: "compute and output script dependencies" },
|
||||||
"parse": { f: parse, a: "<script-file>", h: "parse given file; will look for deps in the same directory" },
|
"parse": { f: parse, a: "<script-file>", h: "parse given file; will look for deps in the same directory" },
|
||||||
|
@ -3627,6 +3644,7 @@ var cmds = {
|
||||||
"tdupload": { f:tdupload, a:'KEY LABEL FILE...', h:'upload a release'},
|
"tdupload": { f:tdupload, a:'KEY LABEL FILE...', h:'upload a release'},
|
||||||
"uploadfile": { f:uploadfile, a:'KEY FILE...', h:'upload a file'},
|
"uploadfile": { f:uploadfile, a:'KEY FILE...', h:'upload a file'},
|
||||||
"dlpubs": { f:dlpubs, a:'FILE...', h:'download based on tdpublogger output'},
|
"dlpubs": { f:dlpubs, a:'FILE...', h:'download based on tdpublogger output'},
|
||||||
|
"setlabel": { f:setlabel, a:'KEY RELID LABEL', h:'set release label'},
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ScriptTemplate {
|
export interface ScriptTemplate {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче