Project edit

master
alexey 1 month ago
parent f88ef52d87
commit e0d169e679

@ -536,6 +536,7 @@ get "/prjgitf/:id/:git_id" do
end
@files_list = [{ :file => "..", :isdir => true, :fname => fn }] + @files_list
end
@page_name = "#{prj_info[:projname]} информация из репозитория #{git_info[:reponame]}"
@proj_info = prj_info
@proj_git_name = git_info
@file_name = filepath
@ -553,6 +554,88 @@ get "/gitbld/:id/:git_id" do
end
get "/prjcfg/:id" do
unless session[:prjcfg_modal_text].nil?
@modal_info = session[:prjcfg_modal_info]
@modal_text = session[:prjcfg_modal_text]
session[:prjcfg_modal_info] = nil
session[:prjcfg_modal_text] = nil
end
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
@page_name = "#{prj_info[:projname]} редактирование конфигурации сборки"
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
project_cfg = prj.get_project_config(params["id"])
@project_cfg_tmpl = File.basename(project_cfg)
@file_content = File.readlines(project_cfg).join("")
@proj_id = prj_info[:id]
erb :prjcfged
end
end
end
post "/prjcfg/:id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
pp params
unless params["cancel"].nil?
redirect "/prjedit/#{params["id"]}"
else
if params["cfginfo"].nil? || params["cfginfo"].strip == ""
session[:prjcfg_modal_info] = "Ошибка сохранения файла"
session[:prjcfg_modal_text] = "Содержимое файла не может быть пустым"
redirect "/prjcfg/#{params["id"]}"
else
project_cfg = prj.get_project_config(params["id"])
File.open(project_cfg, "w") { |f| f.write(params["cfginfo"]) }
redirect "/prjcfg/#{params["id"]}"
end
end
end
end
end
get "/gitspec/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
@spec_file = db.get_project_repo_spec(params["id"], params["git_id"])
@page_name = "#{prj_info[:projname]} редактирование spec для git проекта #{git_info[:reponame]}"
@proj_id = prj_info[:id]
@git_id = git_info[:id]
git_path = prj.get_project_path_git(prj_info[:id], git_info[:reponame])
@files_list = get_spec_files_in_dir(git_path)
current_spec_data = db.get_project_repo_spec(prj_info[:id], git_info[:id])
@current_spec = nil
unless current_spec_data.nil?
@current_spec = current_spec_data[:spec_name]
end
erb :prjspec
end
end
end
end
not_found do

@ -18,6 +18,9 @@ end
class ReposProjects < Sequel::Model(:repos_projects)
end
class ProjectsReposSpec < Sequel::Model(:projects_repos_spec)
end
class DBase
attr :error, :last_id
@ -34,7 +37,7 @@ class DBase
end
def get_repo_info_by_name(repo_name)
Repos.where(reponame: repo_name)
Repos.where(reponame: repo_name).first
end
def get_repo_info_by_id(id)
@ -159,4 +162,8 @@ class DBase
@last_id = id
end
end
def get_project_repo_spec(prj_id, git_id)
ProjectsReposSpec.where(proj_id: prj_id.to_i, repo_id: git_id.to_i).first
end
end

@ -65,13 +65,11 @@ class GitRepo
repo_name = File.basename(fl, ".git")
db_info = @db.get_repo_info_by_name(repo_name)
unless db_info.nil?
db_info = db_info.first
repos_data << { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :id => db_info.id }
else
result = create_git_db_only(repo_name)
if result.nil?
db_info = @db.get_repo_info_by_name(repo_name)
db_info = db_info.first
repos_data << { :reponame => db_info.reponame, :descr => db_info.descr, :public => db_info.public, :id => db_info.id }
end
end

@ -59,6 +59,19 @@ class ProjectsActions
fname
end
def get_project_config(id)
@error = nil
fname = nil
prj = @db.proj(id)
if prj.nil?
@error = "Проекта с id = #{id} не существует"
else
fname = File.expand_path("#{prj[:projname]}.prj", @path)
fname = File.join(fname, PROJECTS_STRUCTURE[:CONFIGS], "#{prj[:projname]}.cfg")
end
fname
end
def get_project_path_git(id, gitname)
proj_path = get_project_path(id)
File.join(proj_path, PROJECTS_STRUCTURE[:SRC], gitname)

@ -30,3 +30,7 @@ def check_safe_path(filename)
home_dir = Dir.home
filename.start_with?("/etc/mock") || filename.start_with?(current_dir) || filename.start_with?(home_dir)
end
def get_spec_files_in_dir(directory)
Dir.glob(File.join(directory, "**", "*")).reject { |f| File.directory?(f) }.select { |f| File.extname(f) == ".spec" }.map { |f| f.delete_prefix(directory + "/") }
end

@ -63,5 +63,18 @@ Sequel.migration do
foreign_key :rpm_id, :rpms, :key => :id
primary_key [:build_id, :rpm_id]
end
create_table(:projects_projects) do
foreign_key :proj_id, :projects, :key => :id
foreign_key :proj_id_repository, :projects, :key => :id
primary_key [:proj_id, :proj_id_repository]
end
create_table(:projects_repos_spec) do
foreign_key :proj_id, :projects, :key => :id
foreign_key :repo_id, :repos, :key => :id
String :spec_name, :null => false, text: true
primary_key [:proj_id, :repo_id]
end
end
end

@ -1,5 +1,5 @@
function EAL() {
var t = this; t.version = "0.8.2"; date = new Date(); t.start_time = date.getTime(); t.win = "loading"; t.error = false; t.baseURL = ""; t.template = ""; t.lang = {}; t.load_syntax = {}; t.syntax = {}; t.loadedFiles = []; t.waiting_loading = {}; t.scripts_to_load = []; t.sub_scripts_to_load = []; t.syntax_display_name = { 'basic': 'Basic', 'brainfuck': 'Brainfuck', 'c': 'C', 'coldfusion': 'Coldfusion', 'cpp': 'CPP', 'css': 'CSS', 'html': 'HTML', 'java': 'Java', 'js': 'Javascript', 'pas': 'Pascal', 'perl': 'Perl', 'php': 'Php', 'python': 'Python', 'robotstxt': 'Robots txt', 'ruby': 'Ruby', 'sql': 'SQL', 'tsql': 'T-SQL', 'vb': 'Visual Basic', 'xml': 'XML', 'bash': 'Bash' }; t.resize = []; t.hidden = {}; t.default_settings = { debug: false, smooth_selection: true, font_size: "10", font_family: "monospace", start_highlight: false, toolbar: "search,go_to_line,fullscreen,|,undo,redo,|,select_font,|,change_smooth_selection,highlight,reset_highlight,word_wrap,|,help", begin_toolbar: "", end_toolbar: "", is_multi_files: false, allow_resize: "both", show_line_colors: false, min_width: 400, min_height: 125, replace_tab_by_spaces: false, allow_toggle: true, language: "en", syntax: "", syntax_selection_allow: "basic,brainfuck,c,coldfusion,cpp,css,html,java,js,pas,perl,php,python,ruby,robotstxt,sql,tsql,vb,xml,bash", display: "onload", max_undo: 30, browsers: "known", plugins: "", gecko_spellcheck: false, fullscreen: false, is_editable: true, cursor_position: "begin", word_wrap: false, autocompletion: false, load_callback: "", save_callback: "", change_callback: "", submit_callback: "", EA_init_callback: "", EA_delete_callback: "", EA_load_callback: "", EA_unload_callback: "", EA_toggle_on_callback: "", EA_toggle_off_callback: "", EA_file_switch_on_callback: "", EA_file_switch_off_callback: "", EA_file_close_callback: "" }; t.advanced_buttons = [['new_document', 'newdocument.gif', 'new_document', false], ['search', 'search.gif', 'show_search', false], ['go_to_line', 'go_to_line.gif', 'go_to_line', false], ['undo', 'undo.gif', 'undo', true], ['redo', 'redo.gif', 'redo', true], ['change_smooth_selection', 'smooth_selection.gif', 'change_smooth_selection_mode', true], ['reset_highlight', 'reset_highlight.gif', 'resync_highlight', true], ['highlight', 'highlight.gif', 'change_highlight', true], ['help', 'help.gif', 'show_help', false], ['save', 'save.gif', 'save', false], ['load', 'load.gif', 'load', false], ['fullscreen', 'fullscreen.gif', 'toggle_full_screen', false], ['word_wrap', 'word_wrap.gif', 'toggle_word_wrap', true], ['autocompletion', 'autocompletion.gif', 'toggle_autocompletion', true]]; t.set_browser_infos(t); if (t.isIE >= 6 || t.isGecko || (t.isWebKit && !t.isSafari < 3) || t.isOpera >= 9 || t.isCamino) t.isValidBrowser = true;
var t = this; t.version = "0.8.2"; date = new Date(); t.start_time = date.getTime(); t.win = "loading"; t.error = false; t.baseURL = ""; t.template = ""; t.lang = {}; t.load_syntax = {}; t.syntax = {}; t.loadedFiles = []; t.waiting_loading = {}; t.scripts_to_load = []; t.sub_scripts_to_load = []; t.syntax_display_name = { 'basic': 'Basic', 'brainfuck': 'Brainfuck', 'c': 'C', 'coldfusion': 'Coldfusion', 'cpp': 'CPP', 'css': 'CSS', 'html': 'HTML', 'java': 'Java', 'js': 'Javascript', 'pas': 'Pascal', 'perl': 'Perl', 'php': 'Php', 'python': 'Python', 'robotstxt': 'Robots txt', 'ruby': 'Ruby', 'sql': 'SQL', 'tsql': 'T-SQL', 'vb': 'Visual Basic', 'xml': 'XML', 'bash': 'Bash', 'mock': 'Mock' }; t.resize = []; t.hidden = {}; t.default_settings = { debug: false, smooth_selection: true, font_size: "10", font_family: "monospace", start_highlight: false, toolbar: "search,go_to_line,fullscreen,|,undo,redo,|,select_font,|,change_smooth_selection,highlight,reset_highlight,word_wrap,|,help", begin_toolbar: "", end_toolbar: "", is_multi_files: false, allow_resize: "both", show_line_colors: false, min_width: 400, min_height: 125, replace_tab_by_spaces: false, allow_toggle: true, language: "en", syntax: "", syntax_selection_allow: "basic,brainfuck,c,coldfusion,cpp,css,html,java,js,pas,perl,php,python,ruby,robotstxt,sql,tsql,vb,xml,bash, mock", display: "onload", max_undo: 30, browsers: "known", plugins: "", gecko_spellcheck: false, fullscreen: false, is_editable: true, cursor_position: "begin", word_wrap: false, autocompletion: false, load_callback: "", save_callback: "", change_callback: "", submit_callback: "", EA_init_callback: "", EA_delete_callback: "", EA_load_callback: "", EA_unload_callback: "", EA_toggle_on_callback: "", EA_toggle_off_callback: "", EA_file_switch_on_callback: "", EA_file_switch_off_callback: "", EA_file_close_callback: "" }; t.advanced_buttons = [['new_document', 'newdocument.gif', 'new_document', false], ['search', 'search.gif', 'show_search', false], ['go_to_line', 'go_to_line.gif', 'go_to_line', false], ['undo', 'undo.gif', 'undo', true], ['redo', 'redo.gif', 'redo', true], ['change_smooth_selection', 'smooth_selection.gif', 'change_smooth_selection_mode', true], ['reset_highlight', 'reset_highlight.gif', 'resync_highlight', true], ['highlight', 'highlight.gif', 'change_highlight', true], ['help', 'help.gif', 'show_help', false], ['save', 'save.gif', 'save', false], ['load', 'load.gif', 'load', false], ['fullscreen', 'fullscreen.gif', 'toggle_full_screen', false], ['word_wrap', 'word_wrap.gif', 'toggle_word_wrap', true], ['autocompletion', 'autocompletion.gif', 'toggle_autocompletion', true]]; t.set_browser_infos(t); if (t.isIE >= 6 || t.isGecko || (t.isWebKit && !t.isSafari < 3) || t.isOpera >= 9 || t.isCamino) t.isValidBrowser = true;
else t.isValidBrowser = false; t.set_base_url(); for (var i = 0; i < t.scripts_to_load.length; i++) { setTimeout("eAL.load_script('" + t.baseURL + t.scripts_to_load[i] + ".js');", 1); t.waiting_loading[t.scripts_to_load[i] + ".js"] = false; } t.add_event(window, "load", EAL.prototype.window_loaded);
}; EAL.prototype = {
has_error: function () { this.error = true; for (var i in EAL.prototype) { EAL.prototype[i] = function () { }; } }, set_browser_infos: function (o) { ua = navigator.userAgent; o.isWebKit = /WebKit/.test(ua); o.isGecko = !o.isWebKit && /Gecko/.test(ua); o.isMac = /Mac/.test(ua); o.isIE = (navigator.appName == "Microsoft Internet Explorer"); if (o.isIE) { o.isIE = ua.replace(/^.*?MSIE\s+([0-9\.]+).*$/, "$1"); if (o.isIE < 6) o.has_error(); } if (o.isOpera = (ua.indexOf('Opera') != -1)) { o.isOpera = ua.replace(/^.*?Opera.*?([0-9\.]+).*$/i, "$1"); if (o.isOpera < 9) o.has_error(); o.isIE = false; } if (o.isFirefox = (ua.indexOf('Firefox') != -1)) o.isFirefox = ua.replace(/^.*?Firefox.*?([0-9\.]+).*$/i, "$1"); if (ua.indexOf('Iceweasel') != -1) o.isFirefox = ua.replace(/^.*?Iceweasel.*?([0-9\.]+).*$/i, "$1"); if (ua.indexOf('GranParadiso') != -1) o.isFirefox = ua.replace(/^.*?GranParadiso.*?([0-9\.]+).*$/i, "$1"); if (ua.indexOf('BonEcho') != -1) o.isFirefox = ua.replace(/^.*?BonEcho.*?([0-9\.]+).*$/i, "$1"); if (ua.indexOf('SeaMonkey') != -1) o.isFirefox = (ua.replace(/^.*?SeaMonkey.*?([0-9\.]+).*$/i, "$1")) + 1; if (o.isCamino = (ua.indexOf('Camino') != -1)) o.isCamino = ua.replace(/^.*?Camino.*?([0-9\.]+).*$/i, "$1"); if (o.isSafari = (ua.indexOf('Safari') != -1)) o.isSafari = ua.replace(/^.*?Version\/([0-9]+\.[0-9]+).*$/i, "$1"); if (o.isChrome = (ua.indexOf('Chrome') != -1)) { o.isChrome = ua.replace(/^.*?Chrome.*?([0-9\.]+).*$/i, "$1"); o.isSafari = false; } }, window_loaded: function () { eAL.win = "loaded"; if (document.forms) { for (var i = 0; i < document.forms.length; i++) { var form = document.forms[i]; form.edit_area_replaced_submit = null; try { form.edit_area_replaced_submit = form.onsubmit; form.onsubmit = ""; } catch (e) { } eAL.add_event(form, "submit", EAL.prototype.submit); eAL.add_event(form, "reset", EAL.prototype.reset); } } eAL.add_event(window, "unload", function () { for (var i in eAs) { eAL.delete_instance(i); } }); }, init_ie_textarea: function (id) { var a = document.getElementById(id); try { if (a && typeof (a.focused) == "undefined") { a.focus(); a.focused = true; a.selectionStart = a.selectionEnd = 0; get_IE_selection(a); eAL.add_event(a, "focus", IE_textarea_focus); eAL.add_event(a, "blur", IE_textarea_blur); } } catch (ex) { } }, init: function (settings) { var t = this, s = settings, i; if (!s["id"]) t.has_error(); if (t.error) return; if (eAs[s["id"]]) t.delete_instance(s["id"]); for (i in t.default_settings) { if (typeof (s[i]) == "undefined") s[i] = t.default_settings[i]; } if (s["browsers"] == "known" && t.isValidBrowser == false) { return; } if (s["begin_toolbar"].length > 0) s["toolbar"] = s["begin_toolbar"] + "," + s["toolbar"]; if (s["end_toolbar"].length > 0) s["toolbar"] = s["toolbar"] + "," + s["end_toolbar"]; s["tab_toolbar"] = s["toolbar"].replace(/ /g, "").split(","); s["plugins"] = s["plugins"].replace(/ /g, "").split(","); for (i = 0; i < s["plugins"].length; i++) { if (s["plugins"][i].length == 0) s["plugins"].splice(i, 1); } t.get_template(); t.load_script(t.baseURL + "langs/" + s["language"] + ".js"); if (s["syntax"].length > 0) { s["syntax"] = s["syntax"].toLowerCase(); t.load_script(t.baseURL + "reg_syntax/" + s["syntax"] + ".js"); } eAs[s["id"]] = { "settings": s }; eAs[s["id"]]["displayed"] = false; eAs[s["id"]]["hidden"] = false; t.start(s["id"]); }, delete_instance: function (id) { var d = document, fs = window.frames, span, iframe; eAL.execCommand(id, "EA_delete"); if (fs["frame_" + id] && fs["frame_" + id].editArea) { if (eAs[id]["displayed"]) eAL.toggle(id, "off"); fs["frame_" + id].editArea.execCommand("EA_unload"); } span = d.getElementById("EditAreaArroundInfos_" + id); if (span) span.parentNode.removeChild(span); iframe = d.getElementById("frame_" + id); if (iframe) { iframe.parentNode.removeChild(iframe); try { delete fs["frame_" + id]; } catch (e) { } } delete eAs[id]; }, start: function (id) {

@ -0,0 +1,58 @@
/**
* Bash syntax v 1.0
*
**/
editAreaLoader.load_syntax["mock"] = {
'DISPLAY_NAME': 'Mock'
, 'COMMENT_SINGLE': { 1: '#' }
, 'COMMENT_MULTI': {}
, 'QUOTEMARKS': { 1: "'" }
, 'KEYWORD_CASE_SENSITIVE': true
, 'KEYWORDS': {
'reserved': [
'config_opts', 'include', 'skip_if_unavailable', 'enabled', 'gpgcheck', 'gpgkey',
'metalink', 'baseurl', 'name', 'cost', 'keepcache', 'debuglevel', 'reposdir',
'logfile', 'retries', 'obsoletes', 'assumeyes', 'syslog_ident', 'syslog_device'
]
}
, 'OPERATORS': [
'=',
]
, 'DELIMITERS': [
]
, 'REGEXPS': {
'constants': {
'search': '()({%.*%})()'
, 'class': 'constants'
, 'modifiers': 'g'
, 'execute': 'before'
}
, 'numbers': {
'search': '()({.*})()'
, 'class': 'numbers'
, 'modifiers': 'g'
, 'execute': 'before'
}
, 'symbols': {
'search': '()(:\\w+)()'
, 'class': 'symbols'
, 'modifiers': 'g'
, 'execute': 'before'
}
}
, 'STYLES': {
'COMMENTS': 'color: #AAAAAA;'
, 'QUOTESMARKS': 'color: #660066;'
, 'KEYWORDS': {
'reserved': 'font-weight: bold; color: #0000FF;'
}
, 'OPERATORS': 'color: #993300;'
, 'DELIMITERS': 'color: #993300;'
, 'REGEXPS': {
'variables': 'color: #E0BD54;'
, 'numbers': 'color: green;'
, 'constants': 'color: #00AA00;'
, 'symbols': 'color: #879EFA;'
}
}
};

@ -0,0 +1,64 @@
<%= erb :header %>
<script src="/js/edit_area_full.js"></script>
<script language="javascript" type="text/javascript">
editAreaLoader.init({
id: "cfginfo",
syntax: "mock",
start_highlight: true,
language: "ru",
toolbar: "search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, highlight, reset_highlight, word_wrap, |, syntax_selection"
});
</script>
<script src="/js/jquery.dropdown.min.js"></script>
<div class="container">
<% unless @modal_text.nil? %>
<div class="modal fade" id="modalData" aria-hidden="true" aria-labelledby="modalDataLabel"
tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="modalDataLabel"><%= @modal_info %></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
</div>
<div class="modal-body">
<%= @modal_text %>
</div>
<div class="modal-footer">
<button class="btn btn-primary" data-bs-dismiss="modal">Закрыть</button>
</div>
</div>
</div>
</div>
<% end %>
<div class="row">
<div class="col-4">
<h3 class="bg-secondary-subtle text-center border-bottom border-primary-subtle rounded-1 pb-1 mb-2">
<a href="/prjedit/<%= ERB::Util.url_encode(@proj_id) %>"><%= @proj_name %></a>
</h3>
<div class="pb-2"><%= @proj_descr %></div>
</div>
<div class="col-8">
<div class="mb-2 p-2 bg-success-subtle rounded-2 text-sm-start"><%= @project_cfg_tmpl %></div>
<div class="container">
<form action="/prjcfg/<%= ERB::Util.url_encode(@proj_id) %>" method="post" id="sbmt">
<div class="mb-3">
<label for="cfginfo" class="form-label">Содержимое файла конфигурации</label>
<textarea class="form-control" id="cfginfo" name="cfginfo" rows="20"><%= @file_content %></textarea>
</div>
<div class="mb-3 text-center">
<button type="submit" class="btn btn-primary" name="save" value="1">Сохранить</button>
<button type="submit" class="btn btn-danger" name="cancel" valeu ="2">Отменить</button>
</div>
</form>
</div>
</div>
</div>
</div>
<% unless @modal_text.nil? %>
<script type="text/javascript">
$(window).on('load', function () {
$('#modalData').modal('show');
});
</script>
<% end %>
<%= erb :footer %>

@ -30,6 +30,8 @@
<a href="/prjcfg/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
class="bi bi-pen"></i><span class="ms-2">Редактировать
конфигурацию сборки</span></a>
<a href="/prjaddrepo/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
class="bi bi-archive"></i><span class="ms-2">Добавить внутренний репозиторий из другого проекта</span></a>
<a href="/prjrpm/<%= ERB::Util.url_encode(@proj_id) %>" class="list-group-item list-group-item-action list-group-item-dark icon-link"><i
class="bi bi-box"></i><span class="ms-2">Список всех
пакетов</span></a>
@ -64,7 +66,11 @@
<div class="p-2 border border-primary rounded-2">
<% @proj_repo.each do |item| %>
<div class="row justify-content-between border-bottom border-light-subtle m-2">
<% unless item[:is_repo_synced] %>
<div class="col-9">
<% else %>
<div class="col-8">
<% end %>
<a href="/prjgitf/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><%= item[:reponame] %></a>
</div>
<div class="col-1">
@ -78,6 +84,9 @@
<div class="col-1">
<a href="/gitbld/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><i class="bi bi-play-fill"></i></a>
</div>
<div class="col-1">
<a href="/gitspec/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(item[:id]) %>" class="p-2"><i class="bi bi-arrow-down-right-square"></i></a>
</div>
</div>
<% end %>
</div>

@ -0,0 +1,35 @@
<%= erb :header %>
<script src="js/jquery.dropdown.min.js"></script>
<div class="container">
<form action="/gitspec/<%= ERB::Util.url_encode(@proj_id) %>/<%= ERB::Util.url_encode(@git_id) %>" method="post">
<div class="mb-3">
<label for="projname" class="form-label">Установить имя spec файла для гит проекта</label>
<input type="text" class="form-control" id="speccustom" name="speccustom" value="<%= @spec_file %>">
</div>
<div class="mb-3">
<label for="description" class="form-label">Доступные spec файлы</label>
<div class="filelist">
<select class="form-control" id="filelst" name="filelst">
<% @files_list.each do |item| %>
<% if !@spec_file.nil? && item.include?(@spec_file) %>
<option value="<%= item %>" selected><%= item %></option>
<% else %>
<option value="<%= item %>"><%= item %></option>
<% end %>
<% end %>
</select>
</div>
</div>
<div class="mb-3 text-center">
<button type="submit" class="btn btn-primary" name="save" value="1">Сохранить</button>
<button type="submit" class="btn btn-danger" name="delete" value="2">Удалить установленный spec</button>
<button type="submit" class="btn btn-secondary" name="delete" value="2">Отмена</button>
</div>
</form>
</div>
<script>
$('.filelist').dropdown({
searchNoData: '<li style="color:#ddd">Нет данных</li>',
});
</script>
<%= erb :footer %>
Loading…
Cancel
Save