Учёт DEPO в мастере: четыре вопроса по порядку, скрипт собирается сам из ответов
СУБД → сервер, порт и имя базы → где запускать обработку обмена → логин администратора или скрипт. Выбор плитками, под ним — поля выбранного способа и своя кнопка. Скрипт показывается сразу и пересобирается при любой правке выше (без кнопки «Обновить»), собирается и до адреса сервера (без адреса не сохраняется). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -494,4 +494,23 @@ func TestDepoScriptView(t *testing.T) {
|
||||
if w := post(form); w.Code != http.StatusBadRequest || !strings.Contains(w.Body.String(), "8 знаков") {
|
||||
t.Fatalf("короткий пароль: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
// экран пересобирает скрипт на ходу — и до того, как вписан адрес сервера; без адреса ничего не сохраняется
|
||||
form.Set("bj_password", "Other123x")
|
||||
form.Set("server", "")
|
||||
if w := post(form); w.Code != http.StatusOK || !strings.Contains(w.Body.String(), "N'Other123x';") {
|
||||
t.Fatalf("скрипт без адреса сервера: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
if f := rc.Snapshot().Fancy; f.Server != "10.0.0.5" || f.Password != "Secret123x" {
|
||||
t.Fatalf("без адреса сервера настройки не должны меняться: %q", f.Server)
|
||||
}
|
||||
// PostgreSQL — свой скрипт; без имени базы — понятная причина вместо скрипта
|
||||
form.Set("db_type", "postgres")
|
||||
form.Set("depo_database", "")
|
||||
if w := post(form); w.Code != http.StatusBadRequest || !strings.Contains(w.Body.String(), "имя базы") {
|
||||
t.Fatalf("PostgreSQL без базы: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
form.Set("depo_database", "depo")
|
||||
if w := post(form); w.Code != http.StatusOK || !strings.Contains(w.Body.String(), "PostgreSQL") {
|
||||
t.Fatalf("PostgreSQL: %d %s", w.Code, w.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,37 @@
|
||||
.wiz-row-l { color:var(--muted); font-weight:400; font-size:14.5px; min-width:170px; margin:0; }
|
||||
.wiz-opt { display:flex; gap:8px; align-items:flex-start; font-weight:400; margin:0 0 6px; }
|
||||
.wiz-opt .muted { font-size:13px; }
|
||||
/* Учёт DEPO: вопросы по порядку (номер — счётчиком), выбор — плитками, под ними — панель выбранного способа */
|
||||
.dq { counter-reset:dq; }
|
||||
.dq-s { padding:18px 0 20px; border-top:1px solid var(--border); }
|
||||
.dq-s:first-child { border-top:0; padding-top:2px; }
|
||||
.dq-h { display:flex; align-items:center; gap:10px; font-size:15.5px; font-weight:650; margin:0 0 12px; }
|
||||
.dq-h::before { counter-increment:dq; content:counter(dq); flex:none; width:22px; height:22px; border-radius:50%; background:var(--accent-weak); color:var(--accent); display:grid; place-items:center; font-size:12px; font-weight:700; }
|
||||
.dq-tiles { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
|
||||
.dq-tile { display:flex; gap:10px; align-items:flex-start; padding:12px 14px; border:1px solid var(--border); border-radius:12px; cursor:pointer; font-weight:400; margin:0; transition:border-color .15s var(--ease), background .15s var(--ease); }
|
||||
.dq-tile:hover { border-color:var(--border-strong); }
|
||||
.dq-tile:has(input:checked) { border-color:var(--accent); background:var(--accent-weak); }
|
||||
.dq-tile b { display:block; font-weight:600; font-size:14.5px; }
|
||||
.dq-tile small { display:block; color:var(--muted); font-size:13px; line-height:1.4; margin-top:3px; }
|
||||
.dq-alt { display:inline-flex; gap:8px; align-items:flex-start; margin:12px 0 0; font-weight:400; font-size:13.5px; color:var(--text-2); cursor:pointer; }
|
||||
.dq-grid { display:grid; gap:10px 12px; }
|
||||
.dq-grid label { display:block; margin:0; font-size:13.5px; font-weight:500; color:var(--text-2); }
|
||||
.dq-grid input, .dq-grid select { display:block; width:100%; box-sizing:border-box; margin-top:5px; }
|
||||
.dq-srv { grid-template-columns:minmax(0,1.5fr) minmax(0,.55fr) minmax(0,1.25fr); }
|
||||
.dq-2 { grid-template-columns:repeat(2,minmax(0,1fr)); }
|
||||
.dq-opt { color:var(--muted); font-weight:400; }
|
||||
.dq-note { color:var(--muted); font-size:13px; margin:8px 0 0; }
|
||||
.dq-panel { margin-top:18px; }
|
||||
.wiz-card .dq-go { margin-top:16px; border-radius:999px; padding:10px 22px; font-size:14.5px; font-weight:600; }
|
||||
.wiz-card .dq-mono { font-family:var(--mono); }
|
||||
.dq-sql { margin-top:14px; }
|
||||
.dq-sql-head { display:flex; align-items:center; gap:8px; margin:0 0 6px; justify-content:flex-start; }
|
||||
.dq-sql-st { flex:1; font-size:12.5px; color:var(--muted); }
|
||||
.dq-sql-st.bad { color:var(--warn); }
|
||||
.dq-sql pre { max-height:380px; min-height:140px; font-size:12px; margin:0; transition:opacity .2s; }
|
||||
.dq-sql pre.dq-busy { opacity:.5; }
|
||||
.dq.is-pg [data-ms], .dq:not(.is-pg) [data-pg] { display:none !important; }
|
||||
@media (max-width:600px) { .dq-tiles, .dq-srv, .dq-2 { grid-template-columns:minmax(0,1fr); } .dq-sql-head { flex-wrap:wrap; } .dq-sql-st { flex-basis:100%; } }
|
||||
.tooltip { display:inline-block; background:var(--border); color:var(--muted); border-radius:50%; width:16px; height:16px; line-height:16px; text-align:center; font-size:11px; cursor:help; margin-left:4px; }
|
||||
.help-block { background:var(--accent-weak); padding:10px 14px; margin:10px 0; font-size:13px; border-radius:10px; }
|
||||
.help-block strong { color:var(--accent); }
|
||||
@@ -132,70 +163,113 @@
|
||||
{{else}}
|
||||
{{$sub := .Sub}}
|
||||
{{if eq $sub "setup"}}
|
||||
<p>bj сверяет каждый перевод с учётом DEPO и сам создаёт в нём поручения. Укажите сервер DEPO; имя базы можно не писать — bj найдёт её по учётным таблицам.</p>
|
||||
{{$mode := .Settings.Fancy.DepoJobMode}}
|
||||
<form method="post" action="/admin/setup/wizard-depo/setup" id="wiz-depo" style="display:grid;gap:12px">
|
||||
<div style="display:grid;grid-template-columns:2.2fr .8fr 1.1fr;gap:8px">
|
||||
<label style="margin:0">Сервер DEPO<input type="text" name="server" value="{{.Settings.Fancy.Server}}" placeholder="адрес или имя\экземпляр" required autofocus style="width:100%;margin-top:4px"></label>
|
||||
<label style="margin:0">Порт<input type="text" name="port" value="{{if .Settings.Fancy.Port}}{{.Settings.Fancy.Port}}{{else if eq .Settings.Fancy.DBType "postgres"}}5432{{else}}1433{{end}}" inputmode="numeric" style="width:100%;margin-top:4px"></label>
|
||||
<label style="margin:0">СУБД<select name="db_type" onchange="wizDepo()" style="width:100%;margin-top:4px"><option value="mssql" {{if ne .Settings.Fancy.DBType "postgres"}}selected{{end}}>SQL Server</option><option value="postgres" {{if eq .Settings.Fancy.DBType "postgres"}}selected{{end}}>PostgreSQL</option></select></label>
|
||||
</div>
|
||||
{{if .DepoCands}}<label style="margin:0">База DEPO <span class="muted" style="font-weight:400">— на сервере их несколько, выберите нужную</span><select name="depo_database" style="width:100%;max-width:420px;display:block;margin-top:4px">{{range .DepoCands}}<option>{{.}}</option>{{end}}</select></label>
|
||||
{{else}}<label style="margin:0">База DEPO <span class="muted" style="font-weight:400" id="wiz-depo-dbhint">— необязательно</span><input type="text" name="depo_database" value="{{.Settings.Fancy.DepoDatabase}}" placeholder="bj найдёт сам" pattern="[A-Za-z][A-Za-z0-9_]*" title="латинские буквы, цифры и _, начинается с буквы" style="width:100%;max-width:420px;display:block;margin-top:4px"></label>{{end}}
|
||||
<p>bj сверяет каждый перевод с учётом DEPO и сам создаёт в нём поручения. Четыре вопроса по порядку — из ответов bj соберёт подготовку базы.</p>
|
||||
{{$job := .Settings.Fancy.DepoJobMode}}{{$pg := eq .Settings.Fancy.DBType "postgres"}}
|
||||
<form method="post" action="/admin/setup/wizard-depo/setup" id="wiz-depo" class="dq{{if $pg}} is-pg{{end}}">
|
||||
<section class="dq-s">
|
||||
<h3 class="dq-h">Какая СУБД у DEPO</h3>
|
||||
<div class="dq-tiles">
|
||||
<label class="dq-tile"><input type="radio" name="db_type" value="mssql" {{if not $pg}}checked{{end}}><span><b>Microsoft SQL Server</b></span></label>
|
||||
<label class="dq-tile"><input type="radio" name="db_type" value="postgres" {{if $pg}}checked{{end}}><span><b>PostgreSQL</b></span></label>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div style="border-top:1px solid var(--border);padding-top:10px"><div style="font-weight:600;margin-bottom:6px">Как подготовить базу</div>
|
||||
<label class="wiz-opt"><input type="radio" name="mode" value="auto" {{if ne .DepoMode "script"}}checked{{end}} onchange="wizDepo()"> <span><b>bj сделает всё сам</b> <span class="muted">— нужен логин администратора SQL на один раз, bj его не сохраняет</span></span></label>
|
||||
<div id="wiz-depo-auto" style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:0 0 8px 26px">
|
||||
<input type="text" name="admin_user" autocomplete="off" placeholder="логин администратора, например sa" style="width:100%">
|
||||
<input type="password" name="admin_password" autocomplete="new-password" placeholder="пароль" style="width:100%">
|
||||
<section class="dq-s">
|
||||
<h3 class="dq-h">Где база DEPO</h3>
|
||||
<div class="dq-grid dq-srv">
|
||||
<label>Адрес сервера<input type="text" name="server" value="{{.Settings.Fancy.Server}}" placeholder="IP-адрес или имя\экземпляр" required autofocus spellcheck="false"></label>
|
||||
<label>Порт<input type="text" name="port" value="{{if .Settings.Fancy.Port}}{{.Settings.Fancy.Port}}{{else if $pg}}5432{{else}}1433{{end}}" inputmode="numeric"></label>
|
||||
{{if .DepoCands}}<label>Имя базы <span class="dq-opt">— выберите</span><select name="depo_database">{{range .DepoCands}}<option>{{.}}</option>{{end}}</select></label>
|
||||
{{else}}<label>Имя базы <span class="dq-opt" data-ms>— необязательно</span><input type="text" name="depo_database" value="{{.Settings.Fancy.DepoDatabase}}" placeholder="bj найдёт сам" pattern="[A-Za-z][A-Za-z0-9_]*" title="латинские буквы, цифры и _, начинается с буквы" spellcheck="false" {{if $pg}}required{{end}}></label>{{end}}
|
||||
</div>
|
||||
<label class="wiz-opt"><input type="radio" name="mode" value="script" {{if eq .DepoMode "script"}}checked{{end}} onchange="wizDepo()"> <span><b>Отдать скрипт администратору</b> <span class="muted">— если логин администратора не дают: один скрипт сделает то же самое</span></span></label>
|
||||
<div id="wiz-depo-script" style="display:none;margin:0 0 8px 26px">
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px">
|
||||
<label style="margin:0">Логин bj<input type="text" name="bj_user" value="{{.DepoUser}}" autocomplete="off" spellcheck="false" style="width:100%;margin-top:4px"></label>
|
||||
<label style="margin:0">Пароль bj<input type="text" name="bj_password" value="{{.DepoPass}}" autocomplete="off" spellcheck="false" style="width:100%;margin-top:4px;font-family:var(--mono)"></label>
|
||||
<p class="dq-note">{{if .DepoCands}}Логину bj видны несколько баз DEPO — выберите нужную.{{else}}<span data-ms>Не знаете имя базы — оставьте пустым: bj найдёт её сам по учётным таблицам OD_FACES и OD_RESTS.</span><span data-pg>Для PostgreSQL имя базы нужно указать.</span>{{end}}</p>
|
||||
</section>
|
||||
|
||||
<section class="dq-s">
|
||||
<h3 class="dq-h">Где запускать обработку обмена</h3>
|
||||
<div class="dq-tiles" data-ms>
|
||||
<label class="dq-tile"><input type="radio" name="depo_job" value="agent" {{if ne $job "bj"}}checked{{end}}><span><b>На SQL Server</b><small>Задание SQL Server Agent. Рекомендуется: работает, даже когда bj выключен.</small></span></label>
|
||||
<label class="dq-tile"><input type="radio" name="depo_job" value="bj" {{if eq $job "bj"}}checked{{end}}><span><b>На сервере bj</b><small>Если SQL Server Agent нет — например, SQL Server Express.</small></span></label>
|
||||
</div>
|
||||
<p class="dq-note" data-pg>Для PostgreSQL обработку запускает сервер bj — выбирать не нужно.</p>
|
||||
</section>
|
||||
|
||||
<section class="dq-s">
|
||||
<h3 class="dq-h">Как подготовить базу</h3>
|
||||
<div class="dq-tiles">
|
||||
<label class="dq-tile"><input type="radio" name="mode" value="auto" {{if ne .DepoMode "script"}}checked{{end}}><span><b>Дать логин администратора</b><small>bj сделает всё сам. Логин нужен один раз — bj его не сохраняет.</small></span></label>
|
||||
<label class="dq-tile"><input type="radio" name="mode" value="script" {{if eq .DepoMode "script"}}checked{{end}}><span><b>Получить скрипт</b><small>Если логин администратора не дают: администратор выполнит один скрипт.</small></span></label>
|
||||
</div>
|
||||
<label class="dq-alt"><input type="radio" name="mode" value="existing"> База уже подготовлена раньше — у bj есть свой логин</label>
|
||||
|
||||
<div class="dq-panel" id="wiz-depo-auto">
|
||||
<div class="dq-grid dq-2">
|
||||
<label>Логин администратора<input type="text" name="admin_user" autocomplete="off" spellcheck="false" placeholder="{{if $pg}}postgres{{else}}sa{{end}}"></label>
|
||||
<label>Пароль<input type="password" name="admin_password" autocomplete="new-password"></label>
|
||||
</div>
|
||||
<p class="muted" style="font-size:12.5px;margin:6px 0 10px">Скрипт создаст этот логин на сервере DEPO — bj будет входить с ним. Пароль bj придумал сам, можно вписать свой. База DEPO и пароль стоят в начале скрипта — администратор может их поправить.</p>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||||
<button type="button" class="btn" id="wiz-depo-show">Показать скрипт</button>
|
||||
<button type="submit" class="btn" formaction="/admin/setup/wizard-depo/script.sql" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Скачать файлом</button>
|
||||
<p class="dq-note">bj создаст свой логин, таблицы обмена<span data-ms> и задание обработки</span>, выдаст права и проверит подключение.</p>
|
||||
<button type="submit" class="btn dq-go">Подготовить</button>
|
||||
</div>
|
||||
|
||||
<div class="dq-panel" id="wiz-depo-script">
|
||||
<div class="dq-grid dq-2">
|
||||
<label>Логин bj<input type="text" name="bj_user" value="{{.DepoUser}}" autocomplete="off" spellcheck="false"></label>
|
||||
<label>Пароль bj<input type="text" name="bj_password" value="{{.DepoPass}}" autocomplete="off" spellcheck="false" class="dq-mono"></label>
|
||||
</div>
|
||||
<div id="wiz-depo-sqlbox" hidden style="margin-top:10px"><pre class="copyable" id="wiz-depo-sql" style="max-height:380px;font-size:12px"></pre></div>
|
||||
<p class="muted" style="font-size:12.5px;margin:8px 0 0">Администратор выполняет скрипт в SSMS под логином с правами sysadmin — потом нажмите «Проверить подключение».</p>
|
||||
<p class="dq-note">Скрипт создаст этот логин — с ним bj будет входить в базу DEPO. Пароль придумал bj, можно вписать свой.</p>
|
||||
<div class="dq-sql">
|
||||
<div class="dq-sql-head copy-bar">
|
||||
<span class="dq-sql-st" id="wiz-depo-st">Скрипт собирается из ответов выше и обновляется сам.</span>
|
||||
<button type="button" id="wiz-depo-copy">Скопировать</button>
|
||||
<button type="submit" formaction="/admin/setup/wizard-depo/script.sql" formnovalidate>Скачать файлом</button>
|
||||
</div>
|
||||
<pre class="copyable" id="wiz-depo-sql"></pre>
|
||||
</div>
|
||||
<p class="dq-note"><span data-ms>Администратор выполняет скрипт в SSMS или sqlcmd под логином с правами sysadmin.</span><span data-pg>Администратор выполняет скрипт в psql суперпользователем (postgres).</span> Когда выполнит — нажмите «Проверить подключение».</p>
|
||||
{{template "letterCard" (letter "dba")}}
|
||||
<button type="submit" class="btn dq-go">Проверить подключение</button>
|
||||
</div>
|
||||
<label class="wiz-opt"><input type="radio" name="mode" value="existing" onchange="wizDepo()"> <span><b>Логин для bj уже есть</b> <span class="muted">— база подготовлена раньше, только проверить</span></span></label>
|
||||
<div id="wiz-depo-existing" style="display:none;grid-template-columns:1fr 1fr;gap:8px;margin:0 0 8px 26px">
|
||||
<input type="text" name="user" value="{{.Settings.Fancy.User}}" autocomplete="off" placeholder="логин bj" style="width:100%">
|
||||
<input type="password" name="password" autocomplete="new-password" placeholder="{{if .Settings.Fancy.Password}}пароль (пусто — прежний){{else}}пароль{{end}}" style="width:100%">
|
||||
|
||||
<div class="dq-panel" id="wiz-depo-existing">
|
||||
<div class="dq-grid dq-2">
|
||||
<label>Логин bj<input type="text" name="user" value="{{.Settings.Fancy.User}}" autocomplete="off" spellcheck="false"></label>
|
||||
<label>Пароль<input type="password" name="password" autocomplete="new-password" placeholder="{{if .Settings.Fancy.Password}}пусто — прежний{{end}}"></label>
|
||||
</div>
|
||||
<button type="submit" class="btn dq-go">Проверить подключение</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="wiz-depo-job" style="border-top:1px solid var(--border);padding-top:10px"><div style="font-weight:600;margin-bottom:6px">Кто запускает обработку обмена</div>
|
||||
<label class="wiz-opt"><input type="radio" name="depo_job" value="agent" {{if ne $mode "bj"}}checked{{end}}> <span><b>SQL Server Agent</b> <span class="muted">— рекомендуется: работает, даже когда bj выключен</span></span></label>
|
||||
<label class="wiz-opt"><input type="radio" name="depo_job" value="bj" {{if eq $mode "bj"}}checked{{end}}> <span><b>Сервер bj</b> <span class="muted">— если Agent нет (например, SQL Server Express)</span></span></label>
|
||||
</div>
|
||||
<div><button type="submit" class="btn" id="wiz-depo-btn">Подготовить и проверить</button></div>
|
||||
</section>
|
||||
</form>
|
||||
<script>function wizDepo(){var f=document.getElementById('wiz-depo'),pg=f.db_type.value==='postgres',m=f.mode.value;
|
||||
var db=f.querySelector('input[name=depo_database]'), hint=document.getElementById('wiz-depo-dbhint');
|
||||
if(db){ db.required=pg; db.placeholder=pg?'имя базы DEPO':'bj найдёт сам'; if(hint) hint.textContent=pg?'— для PostgreSQL обязательно':'— необязательно'; }
|
||||
if(pg&&f.port.value==='1433') f.port.value='5432'; else if(!pg&&f.port.value==='5432') f.port.value='1433';
|
||||
document.getElementById('wiz-depo-job').style.display=pg?'none':'block';
|
||||
document.getElementById('wiz-depo-auto').style.display=m==='auto'?'grid':'none';
|
||||
document.getElementById('wiz-depo-script').style.display=m==='script'?'block':'none';
|
||||
document.getElementById('wiz-depo-existing').style.display=m==='existing'?'grid':'none';
|
||||
document.getElementById('wiz-depo-btn').textContent=m==='auto'?'Подготовить и проверить':'Проверить подключение';}
|
||||
wizDepo();
|
||||
document.getElementById('wiz-depo-show').onclick=function(){ // скрипт — прямо на странице, с текущими полями
|
||||
var f=document.getElementById('wiz-depo'), box=document.getElementById('wiz-depo-sqlbox'), pre=document.getElementById('wiz-depo-sql'), b=this;
|
||||
if(!f.reportValidity()) return;
|
||||
var fd=new FormData(f); fd.set('view','1'); b.disabled=true;
|
||||
fetch('/admin/setup/wizard-depo/script.sql',{method:'POST',body:new URLSearchParams(fd),cache:'no-store'})
|
||||
<script>(function(){
|
||||
var f=document.getElementById('wiz-depo'), pre=document.getElementById('wiz-depo-sql'), st=document.getElementById('wiz-depo-st');
|
||||
var timer=0, seq=0, last='';
|
||||
function sync(){ // СУБД меняет подсказки, порт и обязательность имени базы; способ — какую панель показать
|
||||
var pg=f.db_type.value==='postgres', m=f.mode.value, db=f.querySelector('input[name=depo_database]');
|
||||
f.classList.toggle('is-pg', pg);
|
||||
if(pg&&f.port.value==='1433') f.port.value='5432'; else if(!pg&&f.port.value==='5432') f.port.value='1433';
|
||||
if(db){ db.required=pg; db.placeholder=pg?'обязательно':'bj найдёт сам'; }
|
||||
f.admin_user.placeholder=pg?'postgres':'sa';
|
||||
['auto','script','existing'].forEach(function(k){ document.getElementById('wiz-depo-'+k).hidden=m!==k; });
|
||||
}
|
||||
function load(){ // скрипт — из текущих ответов; устаревший ответ (пока печатали дальше) не показываем
|
||||
if(f.mode.value!=='script') return;
|
||||
var fd=new FormData(f); fd.set('view','1'); fd.delete('admin_password'); fd.delete('password');
|
||||
var body=new URLSearchParams(fd).toString();
|
||||
if(body===last) return; last=body;
|
||||
var my=++seq; pre.classList.add('dq-busy');
|
||||
fetch('/admin/setup/wizard-depo/script.sql',{method:'POST',body:body,headers:{'Content-Type':'application/x-www-form-urlencoded'},cache:'no-store'})
|
||||
.then(function(r){return r.text().then(function(t){return {ok:r.ok,t:t}})})
|
||||
.then(function(x){ pre.textContent=x.ok?x.t:('✗ '+x.t.trim()); box.hidden=false; b.textContent='Обновить скрипт'; })
|
||||
.catch(function(){ pre.textContent='✗ Не получилось — обновите страницу и попробуйте ещё раз.'; box.hidden=false; })
|
||||
.then(function(){ b.disabled=false; });
|
||||
};</script>
|
||||
.then(function(x){ if(my!==seq) return; pre.classList.remove('dq-busy');
|
||||
if(x.ok){ pre.textContent=x.t; st.textContent='Скрипт собирается из ответов выше и обновляется сам.'; st.classList.remove('bad'); }
|
||||
else { st.textContent=x.t.trim().replace(/^./,function(c){return c.toUpperCase()})+' — скрипт обновится, когда поправите.'; st.classList.add('bad'); } })
|
||||
.catch(function(){ if(my!==seq) return; last=''; pre.classList.remove('dq-busy'); st.textContent='Не получилось собрать скрипт — обновите страницу.'; st.classList.add('bad'); });
|
||||
}
|
||||
function changed(){ sync(); clearTimeout(timer); timer=setTimeout(load, 350); }
|
||||
f.addEventListener('input', changed); f.addEventListener('change', changed);
|
||||
document.getElementById('wiz-depo-copy').onclick=function(){ var b=this;
|
||||
window.bjCopy(pre.textContent).then(function(ok){ b.textContent=ok?'Скопировано ✓':'Выделите и скопируйте вручную'; b.classList.toggle('done',!!ok);
|
||||
setTimeout(function(){ b.textContent='Скопировать'; b.classList.remove('done'); }, 2000); }); };
|
||||
sync(); load();
|
||||
})();</script>
|
||||
|
||||
{{else if eq $sub "done"}}
|
||||
<table style="margin:6px 0 10px">
|
||||
|
||||
@@ -236,7 +236,8 @@ func (h *setupHandlers) wizardDepoRecheck(w http.ResponseWriter, r *http.Request
|
||||
wizDepoGo(w, r, "done", "всё перепроверено", true)
|
||||
}
|
||||
|
||||
// depoSetupForm — сервер DEPO и способ обработки из формы экрана «Подготовка базы» (логин bj не трогается).
|
||||
// depoSetupForm — сервер DEPO и способ обработки из формы экрана «Подготовка базы» (логин bj не трогается;
|
||||
// пустой адрес сервера не ошибка — скрипту он не нужен, подключению проверяют вызывающие).
|
||||
func (h *setupHandlers) depoSetupForm(r *http.Request) (FancyMSSQLSettings, string, bool, string) {
|
||||
s := h.rc.Snapshot().Fancy
|
||||
dbType := "mssql"
|
||||
@@ -271,9 +272,6 @@ func (h *setupHandlers) depoSetupForm(r *http.Request) (FancyMSSQLSettings, stri
|
||||
if dbType == "postgres" && db == "" {
|
||||
return s, "", agent, "для PostgreSQL укажите имя базы DEPO"
|
||||
}
|
||||
if server == "" {
|
||||
return s, db, agent, "укажите адрес сервера DEPO"
|
||||
}
|
||||
return s, db, agent, ""
|
||||
}
|
||||
|
||||
@@ -307,7 +305,7 @@ func depoScriptCreds(r *http.Request, s *FancyMSSQLSettings) string {
|
||||
}
|
||||
|
||||
// wizardDepoScript — POST /admin/setup/wizard-depo/script.sql: один скрипт подготовки базы файлом
|
||||
// (view=1 — текстом для показа на странице).
|
||||
// (view=1 — текстом для показа на странице: экран пересобирает его при каждой правке ответов).
|
||||
func (h *setupHandlers) wizardDepoScript(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost || !requireDepo(w, r) {
|
||||
return
|
||||
@@ -330,9 +328,11 @@ func (h *setupHandlers) wizardDepoScript(w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
depoEnsureLogin(&s)
|
||||
s.DepoTablesMode = "script"
|
||||
if err := h.rc.UpdateFancy(s); err != nil {
|
||||
fail("не сохранилось: " + err.Error())
|
||||
return
|
||||
if s.Server != "" { // скрипт собирается и до адреса сервера (экран обновляет его на ходу) — без адреса не сохраняем
|
||||
if err := h.rc.UpdateFancy(s); err != nil {
|
||||
fail("не сохранилось: " + err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
body := depoSetupScript(s, db, s.User, s.Password, agent)
|
||||
w.Header().Set("Cache-Control", "no-store")
|
||||
@@ -356,6 +356,9 @@ func (h *setupHandlers) wizardDepoSetup(w http.ResponseWriter, r *http.Request)
|
||||
return
|
||||
}
|
||||
s, db, agent, bad := h.depoSetupForm(r)
|
||||
if bad == "" && s.Server == "" {
|
||||
bad = "укажите адрес сервера DEPO"
|
||||
}
|
||||
if bad != "" {
|
||||
wizDepoGo(w, r, "setup", bad, false)
|
||||
return
|
||||
@@ -417,7 +420,7 @@ func (h *setupHandlers) wizardDepoSetup(w http.ResponseWriter, r *http.Request)
|
||||
found, err := depoDiscover(ctx, s)
|
||||
switch {
|
||||
case err != nil || len(found) == 0:
|
||||
wizDepoGo(w, r, "setup", "логину "+s.User+" не видна ни одна база DEPO — выполнен ли скрипт? Можно указать базу вручную («Дополнительно»)", false)
|
||||
wizDepoGo(w, r, "setup", "логину "+s.User+" не видна ни одна база DEPO — выполнен ли скрипт? Можно вписать имя базы в поле «Имя базы»", false)
|
||||
return
|
||||
case len(found) > 1:
|
||||
http.Redirect(w, r, "/admin/wizard?step=3&sub=setup&cands="+url.QueryEscape(strings.Join(found, ","))+
|
||||
|
||||
Reference in New Issue
Block a user