1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690 |
- {% extends "repo_master.html" %}
- {% from "_formhelper.html" import show_comment, show_pr_initial_comment, render_bootstrap_field %}
- {% from "_repo_renderdiff.html" import repo_renderdiff %}
- {% block title %}
- {%- if pull_request -%}
- PR#{{ requestid }}: {{ pull_request.title | noJS(ignore="img") | safe }}
- {%- endif
- %} - {{ repo.url_path }}
- {% endblock %}
- {% set tag = "home" %}
- {% block header %}
- <link type="text/css" rel="stylesheet" nonce="{{ g.nonce }}" href="{{
- url_for('static', filename='vendor/emojione/emojione.sprites.css') }}?version={{ g.version}}"/>
- <link type="text/css" rel="stylesheet" nonce="{{ g.nonce }}" href="{{
- url_for('static', filename='vendor/selectize/selectize.bootstrap3.css') }}?version={{ g.version}}"/>
- <link type="text/css" rel="stylesheet" nonce="{{ g.nonce }}" href="{{
- url_for('static', filename='vendor/jquery.atwho/jquery.atwho.css') }}?version={{ g.version}}"/>
- {% endblock %}
- {% block repo %}
- <div class="d-flex align-items-start">
- <h4 class="ml-1">
- <div>
- {% if pull_request.status == 'Open' %}
- <span class="fa fa-fw text-success fa-arrow-circle-down pt-1"></span>
- <span class="text-success font-weight-bold">#{{requestid}}</span>
- {% elif pull_request.status == 'Merged' %}
- <span class="fa fa-fw text-info fa-arrow-circle-down pt-1"></span>
- <span class="text-info font-weight-bold">#{{requestid}}</span>
- {% elif pull_request.status == 'Closed' %}
- <span class="fa fa-fw text-danger fa-arrow-circle-down pt-1"></span>
- <span class="text-danger font-weight-bold">#{{requestid}}</span>
- {% endif %}
- <span class="font-weight-bold">
- {{ pull_request.title | noJS(ignore="img") | safe}}
- </span>
- {% if g.authenticated and (g.fas_user.username == pull_request.user.username
- or g.repo_committer) and pull_request.status == 'Open'%}
- <a class="btn btn-sm btn-outline-secondary border-0"
- href="{{ url_for(
- 'ui_ns.request_pull_edit',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid) }}"
- title="Update title"><i class="fa fa-pencil"></i></a>
- {% endif %}
- </div>
- <div>
- <small>
- {% if pull_request.status == 'Open' %}
- <span data-toggle="tooltip" title="{{pull_request.date_created | format_datetime}}">
- <span class="text-success font-weight-bold">Opened</span> {{ pull_request.date_created |humanize }}
- </span>
- <span title="{{ pull_request.user.html_title }}"> by {{ pull_request.user.user }}.</span>
- <span class="text-muted" data-toggle="tooltip" title="{{pull_request.updated_on | format_datetime}}">
- Modified {{ pull_request.updated_on |humanize }}
- </span>
- {% elif pull_request.status == 'Merged' %}
- <span data-toggle="tooltip" title="{{pull_request.closed_at | format_datetime}}">
- <span class="text-info font-weight-bold">Merged</span> {{ pull_request.closed_at |humanize }}
- </span>
- by
- <span title="{{ pull_request.closed_by.html_title }}">{{ pull_request.closed_by.user }}.</span>
- <span class="text-muted" data-toggle="tooltip" title="{{pull_request.date_created | format_datetime}}">
- <span class="font-weight-bold">Opened</span> {{ pull_request.date_created |humanize }}
- </span>
- <span class="text-muted" title="{{ pull_request.user.html_title }}">by {{ pull_request.user.user }}.</span>
- {% elif pull_request.status == 'Closed' %}
- <span data-toggle="tooltip" title="{{pull_request.closed_at | format_datetime}}">
- <span class="text-danger font-weight-bold">Closed</span> {{ pull_request.closed_at |humanize }}
- </span>
- by
- <span title="{{ pull_request.closed_by.html_title }}">{{ pull_request.closed_by.user }}.</span>
- <span class="text-muted" data-toggle="tooltip" title="{{pull_request.date_created | format_datetime}}">
- <span class="font-weight-bold">Opened</span> {{ pull_request.date_created |humanize }}
- </span>
- <span class="text-muted" title="{{ pull_request.user.html_title }}">by {{ pull_request.user.user }}.</span>
- {% endif %}
- </small>
- </div>
- <div class="mt-2">
- <small>
- {% if pull_request.remote_git or pull_request.project_from.is_fork %}
- <span class="badge badge-light badge-pill border border-secondary font-1em">
- {% if pull_request.remote_git %}
- <i class="fa fa-globe"></i>
- {{pull_request.remote_git}}
- {% elif pull_request.project_from.is_fork %}
- <i class="fa fa-code-fork"></i>
- {% if pull_request.project_from.namespace %}
- {{pull_request.project_from.namespace}}/
- {% endif %}
- {% if pull_request.project_from.is_fork -%}
- {{ pull_request.project_from.user.user }}/
- {%- endif -%}
- {{pull_request.project_from.name}}
- {% endif %}
- </span>
- {% endif %}
- <a href="{{ url_for('ui_ns.view_tree',
- repo=pull_request.project_from.name,
- username=pull_request.project_from.user.user
- if pull_request.project_from.is_fork else None,
- namespace=repo.namespace,
- identifier=pull_request.branch_from)
- }}"
- class="badge badge-secondary badge-pill border border-secondary font-1em">
- <span class="fa fa-random"></span>
- {{ pull_request.branch_from }}
- </a>
- into
- <a href="{{ url_for('ui_ns.view_tree',
- repo=pull_request.project.name,
- username=pull_request.project.user.user
- if pull_request.project.is_fork else None,
- namespace=repo.namespace,
- identifier=pull_request.branch)
- }}"
- class="badge badge-secondary badge-pill border border-secondary font-1em">
- <i class="fa fa-random"></i>
- {{ pull_request.branch }}
- </a>
- </small>
- </div>
- </h4>
- <div class="ml-auto d-flex">
- {% if g.authenticated and (g.fas_user.username == pull_request.user.username
- or g.repo_committer) and pull_request.status == 'Open'%}
- {% if pull_request.status == 'Open' and g.authenticated and
- (g.repo_committer or g.fas_user.username == pull_request.user.username) %}
- {% if mergeform and pull_request.remote %}
- <form class="inline" action="{{ url_for(
- 'ui_ns.refresh_request_pull',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- repo=repo.name, requestid=requestid) }}" method="POST">
- <button type="submit" value="Refresh" id="refresh_pr"
- class="btn btn-outline-primary btn-sm" title="Refresh the remote pull request">
- <span class="fa fa-refresh"></span> Refresh
- </button>
- {{ mergeform.csrf_token }}
- </form>
- {% endif %}
- <form class="inline" action="{{ url_for(
- 'ui_ns.close_request_pull',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- repo=repo.name, requestid=requestid) }}" method="POST">
- {% endif %}
- {% if pull_request.status == 'Open' and g.authenticated and
- (g.repo_committer or g.fas_user.username == pull_request.user.username) %}
- {{ mergeform.csrf_token }}
- <button type="submit" value="Close" id="close_pr"
- class="btn btn-outline-danger btn-sm" title="Close PR without merging it" data-toggle="tooltip">
- <span class="fa fa-times"></span> Close
- </button>
- {% endif %}
- {% if pull_request.status == 'Open' and g.authenticated and
- (g.repo_committer or g.fas_user.username == pull_request.user.username) %}
- </form>
- {% endif %}
- {% endif %}
- {% if pull_request.status == 'Open' %}
- <div class="dropdown float-right ml-1">
- <span class="dropdown dropdown-btn">
- <a href="#" id="merge_dropdown_btn"
- class="btn btn-outline-secondary btn-sm disabled dropdown-toggle" data-toggle="dropdown">
- <span class="fa fa-circle-o-notch fa-spin fa-fw"></span> <span id="merge-status-text">Merge</span>
- </a>
- <div id="merge-alert" class="text-xs-center dropdown-menu dropdown-menu-right p-0">
- <div class="alert text-center mb-0">
- {% if pull_request.status == 'Open' and g.repo_committer and pull_request.allow_rebase %}
- <small id="merge-alert-message"></small>
- <form action="{{ url_for('ui_ns.merge_request_pull',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid)
- }}" method="POST" id="merge_pr_form">
- {{ mergeform.csrf_token }}
- <button id="merge_btn" type="submit"
- class="btn btn-block my-2">Merge</button>
- {% if can_delete_branch %}
- <div class="small">
- {{ mergeform.delete_branch }} {{ mergeform.delete_branch.label }}
- </div>
- {% endif %}
- </form>
- <button id="rebase_btn" type="submit"
- class="btn btn-block my-2">Rebase</button>
- {% else %}
- <small id="merge-alert-message"></small>
- {% endif %}
- </div>
- </div>
- </span>
- {% if g.authenticated and trigger_ci %}
- <span class="dropdown dropdown-btn">
- <a href="#" id="ci_dropdown_btn"
- class="btn btn-outline-primary btn-sm btn-info dropdown-toggle" data-toggle="dropdown">
- Rerun CI
- </a>
- <div class="text-xs-center dropdown-menu dropdown-menu-right p-0">
- <form action="{{ url_for('ui_ns.ci_trigger_request_pull',
- repo=repo.name,
- username=repo.username if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid)
- }}" method="POST" id="ci_pr_trigger_form">
- {{ trigger_ci_pr_form.csrf_token }}
- {{ trigger_ci_pr_form.comment(id="ci_pr_comment", hidden=True) }}
- {% for comment, meta in trigger_ci|dictsort %}
- <a class="dropdown-item trigger-ci-btn" href="#" title="{{ meta["description"] }}"
- data-comment="{{ comment }}">{{ meta["name"] }}</a>
- {% endfor %}
- </form>
- </div>
- </span>
- {% endif %}
- </div>
- {% endif %}
- {% if pull_request.status == 'Closed' and g.authenticated and
- (g.repo_committer or g.fas_user.username == pull_request.user.username) %}
- <form action="{{ url_for(
- 'ui_ns.reopen_request_pull',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- repo=repo.name, requestid=requestid) }}" method="POST">
- {{ mergeform.csrf_token }}
- <button type="submit" value="Reopen" id="reopen_pr"
- class="btn btn-sm btn-outline-danger" title="Reopen PR">
- Reopen Pull Request
- </button>
- </form>
- {% endif %}
- </div>
- </div>
- <div class="row" id="pr-wrapper">
- <div class="col-md-12">
- <ul class="nav nav-tabs nav-small my-4 border-bottom" role="tablist" id="pr-tabs">
- <li class="nav-item">
- <a class="nav-link active" data-toggle="tab" role="tab" href="#comments">
- Comments
- </a>
- </li>
- <li class="nav-item">
- <a class="nav-link {% if not pull_request %}active{%
- endif %}" data-toggle="tab" role="tab" href="#request_diff">
- <span>Files Changed </span>
- <span class="badge badge-secondary badge-pill">
- {{ diff|length if diff else 0}}
- </span>
- </a>
- </li>
- <li class="nav-item">
- <a class="nav-link" data-toggle="tab" role="tab" href="#commit_list">
- <span>Commits </span>
- <span class="badge badge-secondary badge-pill">
- {{ diff_commits|length }}
- </span>
- </a>
- </li>
- <li class="nav-item ml-auto">
- <a class="nav-link" href="{{ url_for(
- 'ui_ns.request_pull_patch',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid) }}">
- <span class="hidden-sm-down">Patch</span>
- </a>
- </li>
- </ul>
- <div class="tab-content">
- <div class="tab-pane" role="tabpanel" id="commit_list">
- <div class="list-group">
- {% for commit in diff_commits %}
- {% if pull_request.status and pull_request.project_from.is_fork %}
- {% set commit_link = url_for(
- 'ui_ns.view_commit',
- repo=pull_request.project_from.name,
- username=pull_request.project_from.user.user,
- namespace=repo.namespace,
- commitid=commit.oid.hex)%}
- {% set tree_link = url_for(
- 'ui_ns.view_tree', username=pull_request.project_from.user.user, namespace=repo.namespace,
- repo=repo.name, identifier=commit.hex) %}
- {% elif pull_request.remote %}
- {% set commit_link = None %}
- {% else %}
- {% set commit_link = url_for('ui_ns.view_commit',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- commitid=commit.oid.hex) %}
- {% set tree_link = url_for(
- 'ui_ns.view_tree',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- repo=repo.name, identifier=commit.hex) %}
- {% endif %}
- <div class="list-group-item">
- <div class="row align-items-center">
- <div class="col">
- {% if commit_link %}
- <a class="notblue" href="{{commit_link}}">
- {% endif %}
- <strong>{{ commit.message.strip().split('\n')[0] }}</strong>
- {% if commit_link %}
- </a>
- {% endif %}
- <div>
- {{commit.author|author2user_commits(
- link=url_for('ui_ns.view_commits',
- repo=repo.name,
- branchname=branchname,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- author=commit.author.email),
- cssclass="notblue")|safe}}
- <span class="commitdate"
- title="{{ commit.commit_time|format_ts }}"> •
- {{ commit.commit_time|humanize }}</span>
- </div>
- </div>
- <div class="col-xs-auto pr-3 text-right">
- <div class="btn-group">
- <a href="{{ commit_link }}"
- class="btn btn-outline-primary font-weight-bold {{'disabled' if not commit_link}}">
- <code>{{ commit.hex|short }}</code>
- </a>
- <a class="btn btn-outline-primary font-weight-bold {{'disabled' if not commit_link}}" href="{{tree_link}}"><span class="fa fa-file-code-o fa-fw"></span></a>
- </div>
- </div>
- </div>
- </div>
- {% else %}
- <p class="error"> No commits found </p>
- {% endfor %}
- </div>
- </div>
- <div class="tab-pane" role="tabpanel" id="request_diff">
- {% if g.authenticated %}
- <form action="{{ url_for('ui_ns.pull_request_drop_comment',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid)
- }}" method="post" class="icon form_pr_drop_comment">
- {% endif %}
- {{repo_renderdiff(diff=diff,
- diff_commits=diff_commits,
- pull_request=pull_request,
- repo=repo,
- username=username,
- namespace=namespace)}}
- {% if g.authenticated %}
- {{ mergeform.csrf_token }}
- </form>
- {% endif %}
- </div>
- <div class="tab-pane active" role="tabpanel" id="comments">
- <div class="row">
- <div class="col-md-8">
- {{ show_pr_initial_comment(pull_request, repo, form, username) }}
- <section class="request_comment" >
- <form action="{{ url_for('ui_ns.pull_request_drop_comment',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid)
- }}" method="post" id="request_comment" class="form_pr_drop_comment">
- {% if pull_request.comments %}
- {% for comment in pull_request.comments %}
- {% if comment.commit_id %}
- {{ show_comment(comment, comment.id, repo, username,
- requestid, form, PRinline=True) }}
- {% elif comment.notification %}
- <div class="d-flex align-items-center px-3 py-2 mb-3">
- <div class="">
- {{ comment.user.default_email | avatar(24) | safe }}
- </div>
- <span class="font-size-09 autogenerated-comment pl-4">{{ comment.comment | markdown | noJS | safe }}</span>
- <div class="text-muted ml-auto">
- <span title="{{ comment.date_created | format_datetime }}">{{
- comment.date_created | humanize }}</span>
- </div>
- </div>
- {% else %}
- {{ show_comment(comment, comment.id, repo, username,
- requestid, form) }}
- {% endif %}
- {% endfor %}
- {{ mergeform.csrf_token }}
- {% endif %}
- </form>
- </section>
- {% if g.authenticated and mergeform %}
- <div class="card mt-5">
- {% if g.authenticated %}
- <div class="card-header pb-0 pt-1 bg-light">
- <div class="row">
- <div class="col align-self-center">
- <span><strong>Add new comment</strong></span>
- </div>
- <div class="col">
- <ul class="nav nav-tabs float-right">
- <li class="nav-item">
- <a class="nav-link pointer" id="previewinmarkdown">Preview</a>
- </li>
- <li class="nav-item">
- <a class="nav-link active pointer" id="editinmarkdown">Edit</a>
- </li>
- </ul>
- {% if repo.quick_replies %}
- {% include "quick_reply.html" %}
- {% endif %}
- </div>
- </div>
- </div>
- <form action="{{ url_for(
- 'ui_ns.pull_request_add_comment',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid) }}"
- method="post" class="form_pr_add_comment">
- {{ mergeform.csrf_token }}
- <div class="card-body">
- <textarea class="form-control" rows=8 id="comment" name="comment"
- placeholder="Enter your comment here" tabindex=1></textarea>
- <div id="preview" class="p-1">
- </div>
- </div>
- <div class="d-flex align-items-center card-footer bg-light">
- <small>Comments use <a href="https://docs.pagure.org/pagure/usage/markdown.html"
- target="_blank" rel="noopener noreferrer" class="notblue">Markdown Syntax</a></small>
- <div class="ml-auto">
- <input type="submit" class="btn btn-primary"
- value="Submit Comment" tabindex=2 />
- </div>
- </div>
- </form>
- {% endif %}
- </div>
- <div class="small">
- <p>
- Pull this pull-request locally
- <a href="#" id="local_pull_info_btn">
- <span class="fa fa-arrow-circle-down fa-fw fa-1x">
- </span>
- </a>
- </p>
- <pre id="local_pull_info" class="hidden">git fetch {{ config.get('GIT_URL_GIT') }}{{ repo.fullname }}.git refs/pull/{{ pull_request.id }}/head:pr{{ pull_request.id }}</pre>
- </div>
- {% endif %}
- </div>
- <div class="col-md-4">
- <div>
- <div class="mb-4">
- <h5 class="d-flex align-items-center font-weight-bold border-bottom">
- <div class="py-2 text-uppercase font-size-09">Metadata</div>
- {% if g.authenticated and mergeform
- and (g.repo_user
- or g.fas_user.username == pull_request.user.user) %}
- <div class="ml-auto">
- <a class="btn btn-outline-primary border-0 btn-sm issue-metadata-display editmetadatatoggle pointer" ><i class="fa fa-fw fa-pencil"></i></a>
- <a class="btn btn-outline-secondary border-0 btn-sm issue-metadata-form hidden editmetadatatoggle pointer" ><i class="fa fa-fw fa-times"></i></a>
- </div>
- {% endif %}
- </h5>
- {% if g.authenticated and mergeform and g.repo_user %}
- <form method="POST" action="{{ url_for('ui_ns.update_pull_requests',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid) }}">
- <fieldset class="form-group issue-metadata-form hidden">
- <label><strong>Assignee</strong></label>
- <div>
- <input value="{{ pull_request.assignee.username or '' }}"
- name="user" id="assignee" placeholder="username" >
- {{ mergeform.csrf_token }}
- </div>
- </fieldset>
- {% endif %}
- <fieldset class="form-group issue-metadata-display ml-1">
- <label class="mb-1 pl-1"> <i class="fa fa-fw fa-user-plus"></i> <strong>Assignee</strong></label>
- <div id="assignee_plain">
- <div class="ml-2" title="{{ pull_request.assignee.html_title if pull_request.assignee else '' }}">
- {% if pull_request.assignee.username %}
- <div class="mt-1">{{pull_request.assignee.username| avatar(size=24) | safe}}
- <a href="{{ url_for(
- 'ui_ns.request_pulls',
- repo=repo.name,
- username=username,
- namespace=repo.namespace,
- assignee=pull_request.assignee.username)
- }}" title="{{ pull_request.assignee.html_title }}">
- {{ pull_request.assignee.username }}
- </a>
- {% if g.authenticated and (pull_request.assignee.username == g.fas_user.username) %}
- — <a class="pointer" id="drop-btn"
- title="drop the assignment of this pull-request">
- Drop
- </a>
- {% endif %}
- </div>
- {% else %}
- <div class="text-muted">
- <span class="text-muted">None</span>
- {% if g.authenticated and (g.repo_user or g.fas_user.username == pull_request.user.user) and pull_request.status|lower == 'open'
- and (not pull_request.assignee or pull_request.assignee.username != g.fas_user.username)
- and not repo.settings.get('pull_request_tracker_read_only', False) %}
- — <a class="pointer" id="take-btn"
- title="assign this pull_request to you"> Take </a>
- {% endif %}
- </div>
- {% endif %}
- </div>
- </div>
- </fieldset>
- {% if g.authenticated and (
- g.repo_user
- or g.fas_user.username == pull_request.user.user) %}
- <fieldset class="form-group issue-metadata-form hidden">
- <label class="mb-1"><i class="fa fa-fw fa-tag"></i> <strong>Tags</strong></label>
- <input id="tag" type="text" placeholder="tag1, tag2" name="tag"
- title="comma separated list of tags"
- value="{{ pull_request.tags_text | join(',') }}" />
- </fieldset>
- {% endif%}
- <fieldset class="form-group issue-metadata-display ml-1">
- <label class="mb-0"><strong>Tags</strong></label>
- {% if pull_request.tags %}
- <h4 id="taglist" class="ml-2">
- {% for tag in pull_request.tags %}
- <a id="tag-{{ tag.tag }}" title="{{ tag.tag_description }}"
- data-bg-color="{{ tag.tag_color }}"
- class="badge badge-primary text-left my-1 p-2 badge-tag"
- href="{{ url_for('ui_ns.request_pulls',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- tags=tag.tag) }}">
- {{ tag.tag }}
- </a>
- {% endfor %}
- </h4>
- {% else %}
- <div class="text-muted">No Tags</div>
- {% endif %}
- </fieldset>
- {% if g.authenticated and mergeform
- and (g.repo_user
- or g.fas_user.username == pull_request.user.user) %}
- <input type="submit" class="btn btn-primary issue-metadata-form hidden" value="Update">
- </form>
- {% endif %}
- </div>
- {% if pull_request.flags %}
- <div class="mb-4">
- <h5 class="d-flex align-items-center font-weight-bold border-bottom">
- <div class="py-2 text-uppercase font-size-09">Flags</div>
- </h5>
- <div class="list-group list-group-flush">
- {% for flag in pull_request.flags %}
- <a href="{{ flag.url }}" class="list-group-item list-group-item-action border-0 pl-2 pr-2">
- <div>
- <span class="font-weight-bold">
- {{ flag.username }}
- </span>
- <div class="float-right">
- <span class="badge {{ flag | flag2label }} font-size-09">
- {{ flag.status }}
- {%- if flag.percent %} ({{ flag.percent }}%) {%- endif %}
- </span>
- </div>
- </div>
- <small><div class="clearfix">
- <span>{{ flag.comment }}</span>
- <div title="{% if
- flag.date_created == flag.date_updated -%}
- Created at {% else -%} Updated at {% endif -%}
- {{ flag.date_updated }}" class="float-right">
- {{ flag.date_updated | humanize }}</div>
- </div>
- </small>
- </a>
- {% endfor%}
- </div>
- </div>
- {% endif %}
- {% if g.authenticated %}
- <div class="mt-3">
- <h5 class="d-flex align-items-center font-weight-bold border-bottom">
- <div class="py-2 text-uppercase font-size-09">
- Subscribers
- <span class="badge badge-secondary badge-pill font-size-09 ml-1" id="subscribers-count">{{subscribers|count}}</span>
- </div>
- <div class="ml-auto">
- <a href="#" class="btn btn-sm btn-link" id="subcribe-btn"
- {% if g.fas_user.username in subscribers -%}
- title="Unsubscribe from this pull-request">Unsubscribe
- {%- else -%}
- title="Subscribe to this pull-request">Subscribe
- {%- endif -%}
- </a>
- </div>
- </h5>
- {% if subscribers %}
- <div id="subscribers_list" class="p-2">
- {% for subscriber in subscribers %}
- <a href="{{ url_for('ui_ns.view_user', username=subscriber)
- }}" title="{{ subscriber }}" id="sub-avatar-{{subscriber}}">{{
- subscriber |avatar(size=30, css_class="pb-1") | safe
- }}</a>
- {% endfor %}
- </div>
- {% endif %}
- </div>
- {% endif %}
- </div>
- {% if diff %}
- <div class="mt-3">
- <h5 class="d-flex align-items-center font-weight-bold border-bottom">
- <div class="py-2 text-uppercase font-size-09">
- Changes Summary
- <span class="badge badge-secondary badge-pill font-size-09 ml-1">{{ diff|length if diff else 0}}</span>
- </div>
- </h5>
- {% macro changeschangedfile(filepath, added, removed, diffanchor) -%}
- <a href="#_{{diffanchor}}" class="list-group-item list-group-item-action pl-2 pr-2 border-0">
- <div class="clearfix">
- <div class="float-right">
- <span class="font-size-09 badge badge-success">+{{added}}</span>
- <span class="font-size-09 badge badge-danger">-{{removed}}</span>
- </div>
- <div class="pull-xs-left pr-changes-description">
- <strong>file <span class="text-muted">changed</span></strong>
- </div>
- </div>
- <div class="ellipsis pr-changes-description">
- <small>{{filepath}}</small>
- </div>
- </a>
- {%- endmacro %}
- {% macro changesrenamedfile(oldfilepath, newfilepath, added, removed, diffanchor) -%}
- <a href="#_{{diffanchor}}" class="list-group-item list-group-item-action pl-2 pr-2 border-0">
- <div class="clearfix">
- <div class="float-right"><span class="font-size-09 badge badge-success">+{{added}}</span> <span class="font-size-09 badge badge-danger">-{{removed}}</span></div>
- <div class="pull-xs-left pr-changes-description"><strong>file <span class="text-warning">renamed</span></strong></div>
- </div>
- <div class="ellipsis pr-changes-description">
- <strike class="text-muted">{{oldfilepath}}</strike> <br/>
- <small>{{newfilepath}}</small>
- </div>
- </a>
- {%- endmacro %}
- {% macro changesdeletedfile(filepath, added, removed, diffanchor) -%}
- <a href="#_{{diffanchor}}" class="list-group-item list-group-item-action pl-2 pr-2 border-0">
- <div class="clearfix">
- <div class="float-right"><span class="font-size-09 badge badge-danger">-{{removed}}</span></div>
- <div class="pull-xs-left pr-changes-description"><strong>file <span class="text-danger">removed</span></strong></div>
- </div>
- <div class="ellipsis pr-changes-description">
- <small>{{filepath}}</small>
- </div>
- </a>
- {%- endmacro %}
- {% macro changesaddedfile(filepath, added, removed, diffanchor) -%}
- <a href="#_{{diffanchor}}" class="list-group-item list-group-item-action pl-2 pr-2 border-0">
- <div class="clearfix">
- <div class="float-right"><span class="font-size-09 badge badge-success">+{{added}}</span></div>
- <div class="pull-xs-left pr-changes-description"><strong>file <span class="text-success">added</span></strong></div>
- </div>
- <div class="ellipsis pr-changes-description">
- <small>{{ filepath | unicode }}</small>
- </div>
- </a>
- {%- endmacro %}
- <div class="list-group list-group-flush">
- {% for patch in diff %}
- {% set patchstats = (patch | patch_stats) %}
- {%- if patchstats["status"] == 'D' -%}
- {{ changesdeletedfile(patchstats["new_path"], patchstats["lines_added"], patchstats["lines_removed"], loop.index) }}
- {%-elif patchstats["status"] == 'A' -%}
- {{ changesaddedfile(patchstats["new_path"], patchstats["lines_added"], patchstats["lines_removed"], loop.index) }}
- {%-elif patchstats["status"] == 'M' -%}
- {{ changeschangedfile(patchstats["new_path"], patchstats["lines_added"], patchstats["lines_removed"], loop.index) }}
- {%- else -%}
- {{changesrenamedfile(patchstats["old_path"], patchstats["new_path"], patchstats["lines_added"], patchstats["lines_removed"], loop.index) }}
- {%-endif-%}
- {% endfor %}
- </div>
- </div>
- {% endif %}
- </div>
- </div>
- </div>
- </div> <!-- tab content-->
- </div>
- </div>
- {% endblock %}
- {% block jscripts %}
- {{ super() }}
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='vendor/jquery.textcomplete/jquery.textcomplete.min.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='vendor/emojione/emojione.min.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='emoji/emojicomplete.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='vendor/selectize/selectize.min.js') }}?version={{ g.version}}"> </script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='vendor/jquery.caret/jquery.caret.min.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='vendor/jquery.atwho/jquery.atwho.min.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}" src="{{
- url_for('static', filename='request_ev.js') }}?version={{ g.version}}"></script>
- <script type="text/javascript" nonce="{{ g.nonce }}">
- function cancel_edit_btn() {
- $(".cancel").unbind();
- $(".cancel").click(
- function() {
- var item = $(this).closest('section');
- $(item.parent().find('.issue_comment')).show();
- $(item.parent().find('.issue_actions')).show();
- var form = item.find('.pr_comment_form');
- {# regular comments have the .pr_comment_form within the closest section #}
- if (form.length){
- $(form).remove();
- } else {
- {# inline comments have the section within the .pr_comment_form #}
- var form = $(this).closest('.pr_comment_form').parent();
- $(form).remove();
- }
- return false;
- }
- );
- };
- function setup_edit_btns() {
- $(".edit_btn").unbind();
- $(".edit_btn").click(function() {
- var commentid = $( this ).attr('data-comment');
- var _url = '{{ request.base_url }}' + '/comment/' + commentid + '/edit';
- $.ajax({
- url: _url + '?js=1',
- type: 'GET',
- dataType: 'html',
- success: function(res) {
- var el = $('#comment-' + commentid);
- var sec = el.parent().find('.issue_comment');
- $(sec).hide();
- el.parent().find('.issue_actions').hide();
- $(sec).after(res);
- cancel_edit_btn();
- },
- error: function() {
- alert('Could not make edit work');
- }
- });
- return false;
- });
- };
- function setup_reply_btns() {
- $(".reply").unbind();
- $( ".reply" ).click(
- function() {
- var _section = $(this).closest('.card');
- var _comment = _section.find('.comment_body');
- var _text = _comment.text().split("\n");
- var _output = new Array();
- for (var cnt=0; cnt < _text.length; cnt++) {
- _output[cnt] = '> ' + _text[cnt];
- }
- var _prev = $.trim($( "#comment" ).val());
- if (_prev.length > 0){
- _prev += "\n\n";
- }
- $( "#comment" ).val(_prev + _output.join("\n"));
- }
- );
- };
- function showTab(){
- $('#pr-tabs a[href="#request_diff"]').tab('show')
- }
- {% if pull_request %}
- function show_merge_status(){
- function process_response(res) {
- $('#spinner').hide();
- $('#merge_dropdown_btn').removeClass("disabled");
- $('#merge_dropdown_btn span.fa').removeClass("fa-spin");
- if (res.code == 'FFORWARD'){
- $('#merge_dropdown_btn').toggleClass("btn-outline-secondary btn-success");
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-check");
- $('#merge_btn').addClass("btn-success");
- $('#merge-alert .alert').addClass("alert-success");
- $('#merge-alert-message').text(res.message);
- $('#merge-alert #rebase_btn').hide();
- $('#merge-alert div.small').show();
- $('#merge_btn').show();
- }
- else if (res.code == 'MERGE') {
- $('#merge_dropdown_btn').toggleClass("btn-outline-secondary btn-warning");
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-check");
- $('#merge_btn').addClass("btn-warning");
- $('#merge-alert .alert').addClass("alert-warning");
- $('#merge-alert-message').text(res.message);
- $('#merge-alert div.small').show();
- $('#merge_btn').show();
- }
- else if (res.code == 'NEEDSREBASE') {
- $('#merge_dropdown_btn').toggleClass("btn-outline-secondary btn-warning");
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-times");
- $('#merge_btn').hide();
- $('#merge-alert .alert').addClass("alert-warning");
- $('#merge-alert-message').text(res.message);
- $('#merge-alert div.small').hide();
- }
- else if (res.code == 'CONFLICTS') {
- $('#merge_dropdown_btn').toggleClass("btn-outline-secondary btn-danger");
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-times");
- $('#merge_btn').hide();
- $('#merge-alert .alert').addClass("alert-danger");
- $('#merge-alert-message').text(res.message);
- $('#merge-alert div.small').hide();
- $('#merge-alert #rebase_btn').hide();
- }
- else if (res.code == 'NO_CHANGE') {
- $('#merge_btn').hide();
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-times");
- $('#merge-alert .alert').addClass("alert-secondary");
- $('#merge-alert-message').text(res.message);
- $('#merge-alert div.small').hide();
- $('#merge-alert #rebase_btn').hide();
- }
- };
- $('#spinner').show();
- function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
- $.ajax({
- url: '{{ url_for("internal_ns.mergeable_request_pull") }}' ,
- beforeSend: function(){sleep(8000); return true;},
- type: 'POST',
- data: {
- requestid: "{{ pull_request.uid }}",
- csrf_token: "{{ mergeform.csrf_token.current_token }}",
- },
- dataType: 'json',
- success: function(res) {
- process_response(res)
- },
- error: function(res) {
- process_response(res.responseJSON);
- $('#merge_btn').attr("disabled", "disabled");
- }
- });
- return false;
- }
- {% endif %}
- $(document).ready(function() {
- $('#merge_btn').click(function() {
- return confirm('Confirm merging this pull-request');
- });
- $('.trigger-ci-btn').click(function() {
- $('#ci_pr_comment').val($(this).attr("data-comment"));
- $('#ci_pr_trigger_form').submit();
- });
- $('.inline_comment_link_btn').click(function() { showTab() });
- $('.delete_comment_btn').click(function() {
- return confirm('Do you really want to remove this comment?');
- });
- $('#rebase_btn').click(function(){
- var _conf = confirm('Confirm rebasing this pull-request');
- if (_conf === false){
- return false;
- }
- $('#merge_dropdown_btn span.fa').removeClass(
- "fa-circle-o-notch fa-times fa-check").addClass(
- "fa-circle-o-notch fa-fw");
- $('#merge_btn').removeClass("btn-success btn-warning btn-danger");
- $('#merge-alert .alert').removeClass("alert-success alert-warning alert-danger");
- $('#merge_dropdown_btn').addClass("disabled");
- $('#merge_dropdown_btn').removeClass(
- "btn-outline-secondary btn-danger btn-warning btn-success").addClass(
- "btn btn-outline-secondary btn-sm disabled dropdown-toggle");
- $('#merge_dropdown_btn span.fa').addClass("fa-spin");
- $.ajax({
- url: '{{ url_for('api_ns.api_pull_request_rebase',
- repo=repo.name,
- username=username,
- namespace=repo.namespace,
- requestid=requestid)
- }}' ,
- type: 'POST',
- data: {
- csrf_token: "{{ mergeform.csrf_token.current_token }}",
- },
- dataType: 'json',
- success: function(res) {
- show_merge_status()
- },
- error: function(res) {
- $('#merge_dropdown_btn').removeClass("disabled");
- $('#merge_dropdown_btn span.fa').removeClass("fa-spin");
- $('#merge_dropdown_btn').toggleClass("btn-outline-secondary btn-danger");
- $('#merge_dropdown_btn span.fa').toggleClass("fa-circle-o-notch fa-times");
- $('#merge_btn').hide();
- $('#merge-alert #rebase_btn').hide();
- $('#merge-alert .alert').addClass("alert-danger");
- $('#merge-alert-message').text('Failed to rebase this PR');
- $('#merge-alert div.small').hide();
- }
- });
- });
- $( ".commit_msg_txt" ).hide();
- $( ".commit_msg_btn" ).click(function() {
- var msgid = $( this ).attr('data-id');
- $( '#commit_msg_' + msgid).toggle();
- });
- var folder = '{{url_for("static", filename="emoji/png/") }}?version={{ g.version}}';
- var json_url = '{{ url_for("static", filename="vendor/emojione/emoji_strategy.json") }}?version={{ g.version}}';
- var branchselect = $('#branch_select').selectize({
- create: false,
- sortField: 'text',
- allowEmptyOption: false,
- onChange: function(value) {
- if (value != ""){
- var sel = $('#branch_select');
- var final_url = "{{ url_for('ui_ns.new_request_pull',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace, repo=repo.name,
- branch_from=branch_from, branch_to='--', project_to=project_to) }}";
- final_url = final_url.replace('--', sel.val());
- window.location.href = final_url;
- }
- }
- });
- var branchselect = $('#branch_from_select').selectize({
- create: false,
- sortField: 'text',
- allowEmptyOption: false,
- onChange: function(value) {
- if (value != ""){
- var sel = $('#branch_from_select');
- var final_url = "{{ url_for('ui_ns.new_request_pull',
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace, repo=repo.name,
- branch_from='--', branch_to=branch_to, project_to=project_to) }}";
- final_url = final_url.replace('--', sel.val());
- console.log(final_url);
- //return false;
- window.location.href = final_url;
- }
- }
- });
- $('.form_pr_drop_comment').submit(function() {
- return try_async_comment(this, null);
- });
- $('.form_pr_add_comment').submit(function() {
- return try_async_comment($this, false);
- })
- {% if pull_request %}
- {# These lines are only for existing pull-requests, not new ones #}
- emoji_complete(json_url, folder);
- $('#local_pull_info_btn').click(function(){
- var _el = $('#local_pull_info');
- if (! _el.is(':visible')){
- _el.show();
- $('#local_pull_info_btn').html('<span class="fa fa-arrow-circle-up fa-fw fa-1x">');
- } else {
- _el.hide();
- $('#local_pull_info_btn').html('<span class="fa fa-arrow-circle-down fa-fw fa-1x">');
- }
- return false;
- });
- $('#close_pr').click(function(){
- return window.confirm("Are you sure you want to close this requested pull?");
- });
- $('#reopen_pr').click(function(){
- return window.confirm("Are you sure you want to reopen this requested pull?");
- });
- {% if g.authenticated %}
- $( ".code_table tr" ).hover(
- function() {
- $( this ).find( ".prc_img" ).show().width(13);
- }, function() {
- $( this ).find( ".prc_img" ).hide();
- }
- );
- $( ".prc" ).click(
- function() {
- var disabled = $('.prc').attr('disabled');
- if (disabled === true || disabled == "disabled") {
- return false;
- }
- $(".prc").attr("disabled","disabled");
- var row = $( this ).attr('data-row');
- var commit = $( this ).attr('data-commit');
- var filename = $( this ).attr('data-filename');
- var tree_id = $( this ).attr('data-tree');
- var url = "{{ url_for(
- 'ui_ns.pull_request_add_comment',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=requestid, commit='', filename='', row='') }}".slice(0, -2);
- url = url + commit + '/' + filename + '/' + row
- if (tree_id) {
- url += '?tree_id=' + tree_id;
- }
- var rowid = $(this).prev().find('a').attr('id');
- var table = $( this ).parent().parent();
- var nextid = rowid.replace('_' + row, '_' + (Number(row) + 1));
- var next_row = table.find('#' + nextid).parent().parent();
- {# If we're at the last row, we won't be able to find the next_row
- therefore we need to add it manually #}
- if (next_row.length == 0) {
- table.find("tr:last").after(
- '<tr><td><a id="' + nextid + '"></a></td></tr>');
- next_row = table.find('#' + nextid).parent().parent();
- }
- if (next_row.prev().find('.pr_comment_form').length == 0){
- $.get( url , function( data ) {
- next_row.before(
- '<tr><td></td><td colspan="2" class="pr_comment_form"> \
- <div class="card m-x-1"><div class="card-block">'
- + data + '</div></div></td></tr>' );
- cancel_edit_btn();
- $(".prc").removeAttr("disabled");
- emoji_complete(json_url, folder);
- });
- } else {
- next_row.prev().find('.pr_comment_form').parent().remove();
- $(".prc").removeAttr("disabled");
- }
- }
- );
- setup_edit_btns();
- setup_reply_btns();
- $(".comment_body").each(function(ind, obj) {
- var source = $(obj).html();
- var preview = emojione.toImage(source);
- $(obj).html(preview);
- });
- $(".pr_comment").each(function(ind, obj) {
- var source = $(obj).html();
- var preview = emojione.toImage(source);
- $(obj).html(preview);
- });
- {% endif %}
- {% if pull_request.status == 'Open' %}
- show_merge_status()
- {% endif %}
- {% endif %}
- });
- {% if g.authenticated and pull_request %}
- $('#assignee').selectize({
- valueField: 'user',
- labelField: 'user',
- searchField: 'user',
- maxItems: 1,
- create: false,
- load: function(query, callback) {
- if (!query.length) return callback();
- $.getJSON(
- "{{ url_for('api_ns.api_users') }}", {
- pattern: "*"+query+"*"
- },
- function( data ) {
- callback( data.users.map(function(x) { return { user: x }; }) );
- }
- );
- }
- });
- $( ".editmetadatatoggle" ).click(
- function() {
- $( ".issue-metadata-form" ).toggle();
- $( ".issue-metadata-display" ).toggle();
- }
- );
- function set_ui_for_comment(setting){
- if (setting == false) {
- $(document.body).find('input[type="submit"]').removeAttr("disabled");
- document.body.style.cursor = 'default';
- } else {
- $(document.body).find('input[type="submit"]').attr("disabled", "disabled");
- document.body.style.cursor = 'wait';
- }
- }
- $("#merge_pr_form").submit( function() {
- set_ui_for_comment(true);
- var _c = $("#comment");
- if (_c.val()) {
- $('<input />').attr('type', 'hidden')
- .attr('name', "comment")
- .attr('value', _c.val())
- .appendTo(this);
- }
- return true;
- });
- function try_async_comment(form, inline) {
- set_ui_for_comment(true);
- var _data = $(form).serialize();
- var btn = $(document.activeElement);
- if (btn[0].name == 'drop_comment'){
- _data += '&drop_comment=' + btn[0].value;
- set_ui_for_comment(false);
- return true;
- }
- var _url = form.action;
- if (_url.indexOf('?') != -1){
- _url += "&js=1";
- } else {
- _url += "?js=1";
- }
- /* Keep some variable in memory before sending them in case the SSE is down */
- var _update = false;
- var _comment = inline ? $(form).find('#inline-comment').val() : $(form).find('#comment').val();
- var _comment_id = null;
- if (!_comment && form.update_comment) {
- _update = true;
- _comment_id = $(form.edit_comment).val();
- _comment = $(form).find('#update_comment').val();
- }
- var _commit_id = null;
- var _line = null;
- var _token = "{{ mergeform.csrf_token.current_token }}";
- var _base_url = _url.split('?')[0];
- if (!_base_url.match(/comment$/)){
- _commit_id = _url.split('/comment/')[1];
- _commit_id = _commit_id.split('/')[0];
- items = _url.split('/');
- _line = items[items.length -1];
- }
- $.post( _url, $(form).serialize() )
- .done(function(data) {
- if(data == 'ok') {
- $('#comment').val('');
- $('#preview').html('');
- $('#previewinmarkdown').addClass('inactive');
- $('#previewinmarkdown').removeClass('active');
- $('#preview').hide();
- $('#comment').show();
- /* We have submitted the comment correctly */
- var item = $('.pr_comment_form').closest('tr');
- if (!$(item.parent().children()[1]).is(':visible')){
- $(item.parent().children()[1]).show()
- }
- item.remove();
- if (!sse) {
- if (!_comment){
- // Make the browser submit the form sync
- form.submit();
- }
- console.log('no sse, adding the comment manually');
- $.ajax({
- url: "{{ url_for('ui_ns.markdown_preview') }}" ,
- type: 'POST',
- data: {
- content: _comment,
- csrf_token: _token,
- },
- dataType: 'html',
- success: function(res) {
- var _comment = emojione.toImage(res);
- if (_update) {
- var data = {
- comment_updated: _comment,
- comment_user: "{{ g.fas_user.username }}",
- comment_date: Date.now(),
- comment_id: _comment_id,
- avatar_url: "{{ g.fas_user.email | avatar_url(16) }}",
- }
- } else {
- var data = {
- comment_added: _comment,
- comment_user: "{{ g.fas_user.username }}",
- comment_date: Date.now(),
- avatar_url: "{{ g.fas_user.email | avatar_url(16) }}",
- commit_id: _commit_id,
- line: _line,
- }
- }
- process_event(
- data,
- "{{ request.uid }}",
- "{{ g.fas_user.username if g.authenticated or '' }}");
- set_ui_for_comment(false);
- setup_reply_btns()
- return false;
- }
- });
- return false;
- } else {
- set_ui_for_comment(false);
- }
- } else {
- // Make the browser submit the form sync
- form.submit();
- }
- })
- .fail(function() {
- // Make the browser submit the form sync
- form.submit();
- })
- return false;
- };
- $(".add_comment_form").submit(function(event) {
- return try_async_comment(this, true);
- })
- {% endif %}
- </script>
- <script type="text/javascript" nonce="{{ g.nonce }}">
- var cur_hash = null;
- function color_tags() {
- $(".badge-tag").each(function(ind, obj) {
- $(obj).css('background-color', $(obj).attr('data-bg-color'));
- });
- }
- function highlight_comment() {
- var _hash = window.location.hash;
- if (_hash != cur_hash) {
- $( cur_hash ).css(
- "background", "linear-gradient(to bottom, #ededed 0%, #fff 100%)"
- );
- };
- cur_hash = _hash;
- if ( _hash ) {
- $( _hash ).css(
- "background", "linear-gradient(to bottom, #eded98 0%, #fff 100%)"
- );
- };
- return false;
- };
- function updateHighlight(onload) {
- var cls = "highlighted-line";
- $('.' + cls).removeClass(cls)
- if (location.hash === '') {
- // Display comments when the hash is removed.
- $('#pr-tabs .nav-item a.nav-link, #pr-wrapper .tab-pane').removeClass('active');
- $('#comments, [href="#comments"]').addClass('active');
- return
- }
- if (location.hash.indexOf("comment-") > -1) {
- highlight_comment();
- } else {
- if (onload) {
- // Hide all tabs, and then show the one pointed to by the hash.
- // This is neccessary to handle 'Back' button presses in the browser,
- // which otherwise break the tabs view .
- $('#pr-tabs .nav-item a.nav-link').removeClass('active');
- $('#pr-wrapper .tab-pane').removeClass('active');
- // When the hash points to 'Files Changed' tab, or a highlight.
- if (location.hash.indexOf("request_diff") > -1 ||
- location.hash.indexOf("_") === 1 ||
- location.hash.indexOf("c-") === 1) {
- $('[href="#request_diff"]').addClass('active');
- $('#request_diff').addClass('active');
- }
- // When the hash points to 'Commits' tab.
- else if (location.hash.indexOf("commit_list") > -1) {
- $('[href="#commit_list"]').addClass('active');
- $('#commit_list').addClass('active');
- }
- // If neither, then show the 'Comments' tab by default.
- else {
- $('#comments').addClass('active');
- $('[href="#comments"]').addClass('active');
- }
- }
- var file = parseInt(location.hash.substr(2).split('__')[0], 10);
- var lines = location.hash.split('__')[1].split('-').map(function (x) { return parseInt(x, 10) });
- for (var i = lines[lines.length - 1]; i >= lines[0]; i--) {
- $('#' + '_' + file + '__' + i).closest('tr').addClass(cls);
- }
- }
- }
- $(document).ready(function () {
- color_tags();
- {% if g.authenticated and pull_request %}
- function set_up_subcribed() {
- $("#subcribe-btn").click(function(){
- var _url = "{{ url_for(
- 'api_ns.api_subscribe_pull_request',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- requestid=pull_request.id
- ) }}";
- var _btn = $("#subcribe-btn");
- var _data = {};
- if (_btn.text() == 'Unsubscribe'){
- _data.status = false;
- } else {
- _data.status = true;
- }
- console.log(_data);
- $.post( _url, _data ).done(
- function(data) {
- var _btn = $("#subcribe-btn");
- var _countlabel = $("#subscribers-count")
- var _count = parseInt(_countlabel.text())
- if (_btn.text() == 'Subscribe'){
- _btn.text('Unsubscribe');
- _countlabel.text(_count+1)
- var _html = '<a href="/user/' + data.user + '"'
- + 'title="'+data.user+'" id="sub-avatar-'+data.user+'">'
- + '<img src="'+data.avatar_url+'" class="pb-1"></a>';
- $('#subscribers_list').prepend(_html);
- } else {
- _btn.text('Subscribe');
- _countlabel.text(_count-1);
- $('#sub-avatar-'+data.user).remove();
- }
- return false;
- }
- )
- return false;
- });
- };
- set_up_subcribed();
- {% endif %}
- updateHighlight(true)
- {% if form or pull_request %}
- $( "#preview" ).hide();
- $( "#previewinmarkdown" ).click(
- function(event, ui) {
- {% if form %}
- var _el = $( "#initial_comment" );
- var _token = "{{ form.csrf_token.current_token }}";
- {% else %}
- var _el = $( "#comment" );
- var _token = "{{ mergeform.csrf_token.current_token }}";
- {% endif %}
- var _text = _el.val();
- var _url = "{{ url_for('ui_ns.markdown_preview') }}";
- $.ajax({
- url: _url ,
- type: 'POST',
- data: {
- content: _text,
- csrf_token: _token,
- },
- dataType: 'html',
- success: function(res) {
- var preview = emojione.toImage(res);
- $( "#preview" ).html(preview);
- $( "#previewinmarkdown" ).addClass("active");
- $( "#editinmarkdown" ).removeClass("active");
- _el.hide();
- $( "#preview" ).show();
- },
- error: function() {
- alert('Unable to generate preview!'+error);
- }
- });
- return false;
- }
- );
- $( "#editinmarkdown" ).click(
- function(event, ui) {
- {% if form %}
- var _el = $( "#initial_comment" );
- var _token = "{{ form.csrf_token.current_token }}";
- {% else %}
- var _el = $( "#comment" );
- var _token = "{{ mergeform.csrf_token.current_token }}";
- {% endif %}
- $( "#editinmarkdown" ).addClass("active");
- $( "#previewinmarkdown" ).removeClass("active");
- _el.show();
- $( "#preview" ).hide();
- }
- );
- {% endif %}
- $.get("{{ url_for('api_ns.api_users') }}", {
- pattern: '*'
- }).done(function(resp) {
- var userConfig = {
- at: '@',
- data: resp['mention'],
- insertTpl: '@${username}',
- displayTpl: "<li><img src=\"${image}\"> ${username} <small>${name}</small></li>",
- searchKey: "username"
- }
- $("#comment").atwho(userConfig);
- $("#initial_comment").atwho(userConfig);
- });
- $.when(
- {%- if g.issues_enabled %}
- $.get("{{ url_for('api_ns.api_view_issues',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- status='all') }}"),
- {%- else %}
- {},
- {%- endif %}
- {%- if repo.settings.get('pull_requests', True) %}
- $.get("{{ url_for('api_ns.api_pull_request_views',
- repo=repo.name,
- username=repo.user.user if repo.is_fork else None,
- namespace=repo.namespace,
- status='all') }}")
- {%- else %}
- {}
- {%- endif %}
- ).done(function(issuesResp, prResp) {
- // 0 is the api response
- var issuesAndPrs = [];
- if (typeof issuesResp[0] !== 'undefined') {
- issuesAndPrs = issuesAndPrs.concat(issuesResp[0]['issues']);
- }
- if (typeof prResp[0] !== 'undefined') {
- issuesAndPrs = issuesAndPrs.concat(prResp[0]['requests']);
- }
- var data = $.map(issuesAndPrs, function(ticket, idx) {
- return {
- name: ticket.id.toString(),
- title: $('<div>').text(ticket.title).html()
- }
- });
- var issueAndPrConfig = {
- at: '#',
- data: data,
- insertTpl: '#${name}',
- displayTpl: "<li>#${name}<small> ${title}</small></li>",
- }
- $("#comment").atwho(issueAndPrConfig);
- $("#initial_comment").atwho(issueAndPrConfig);
- });
- var available_tags = [];
- {%for tog in tag_list %}
- available_tags.push("{{tog.tag}}");
- {%endfor%}
- var items = available_tags.map(function(x) { return { item: x }; });
- $('#tag').selectize({
- delimiter: ',',
- options: items,
- persist: false,
- create: false,
- labelField: "item",
- valueField: "item",
- searchField: ["item"],
- });
- } );
- $(window).on('hashchange', updateHighlight);
- var selected = [];
- $("[data-line-number]").click(function (ev) {
- var line = $(this).attr('data-line-number');
- var file = $(this).attr('data-file-number');
- if (ev.shiftKey) {
- selected = selected.slice(-1).concat(line);
- } else {
- selected = [line];
- }
- var hash = '_' + file + '__' + selected[0];
- if (selected.length === 2) {
- hash = '_' + file + '__' + Math.min(selected[0], selected[1]) + '-' + Math.max(selected[0], selected[1]);
- }
- window.location.hash = hash;
- return false;
- });
- // Update hash links in the addressbar according to which tab is clicked
- // on the PR page.
- $(document).on('click', '#pr-tabs a', function() {
- if ($(this).text().trim() == 'Comments' || $(this).text().trim() == 'Patch'){
- window.location.hash = '';
- } else {
- window.location.hash = $(this).attr('href');
- }
- });
- // Show an icon to open the changed file, when the user hovers over the
- // @@ -x,y +x,y @@ line in the diff. Clicking this icon opens the file (at the
- // relevant line number) in a new tab.
- $(document).on("mouseenter", "td.cell2", function(){
- $(this).find("a.open_changed_file_icon_wrap").css('visibility', 'visible');
- });
- $(document).on("mouseleave", "td.cell2", function() {
- $(this).find("a.open_changed_file_icon_wrap").css('visibility', 'hidden');
- });
- {% if g.authenticated and (g.repo_user or pull_request.user.user == g.fas_user.username or open_access) %}
- function take_issue(){
- var _url = "{{ url_for('api_ns.api_pull_request_assign',
- repo=repo.name, namespace=repo.namespace, username=username,
- requestid=requestid) }}";
- var _data = {assignee: "{{ g.fas_user.username }}"};
- $.post (_url, _data ).done(
- function(data) {
- var _user_url = '\n<div class="ml-2"><div class="mt-1">{{g.fas_user.username| avatar(size=24) | safe}} '
- + '<a href="{{ url_for("ui_ns.request_pulls", repo=repo.name, username=username, namespace=repo.namespace) }}'
- + '?assignee={{ g.fas_user.username }}">'
- + '{{ g.fas_user.username }}</a>'
- + ' — <a class="pointer" id="drop-btn" title="drop the assignment of this pull-request">Drop</a></div></div>';
- $('#assignee_plain').html(_user_url);
- $('#assignee').val("{{ g.fas_user.username }}");
- setup_btn_take_drop();
- }
- ).fail(function() {
- alert( "An error occured, could not assign this pull-request to you." );
- })
- return false;
- }
- {% endif %}
- {% if g.authenticated and (
- g.repo_user
- or pull_request.user.user == g.fas_user.username
- or pull_request.assignee.user == g.fas_user.username) %}
- function drop_issue(){
- var _url = "{{ url_for('api_ns.api_pull_request_assign',
- repo=repo.name, namespace=repo.namespace, username=username,
- requestid=requestid) }}";
- var _data = {assignee: ""};
- $.post( _url, _data ).done(
- function(data) {
- var _user_url = '<div class="ml-2">\n<span class="text-muted">None</span>'
- + ' — <a class="pointer" id="take-btn" title="assign this pull-request to you">Take</a></div>';
- $('#assignee_plain').html(_user_url);
- $('#assignee').val("");
- setup_btn_take_drop();
- }
- ).fail(function() {
- alert( "An error occured, could not drop the current assignee." );
- })
- return false;
- }
- {% endif %}
- function setup_btn_take_drop(){
- {% if g.authenticated and g.repo_user %}
- $("#take-btn").click(take_issue)
- {% endif %}
- {% if g.authenticated and (
- g.repo_user
- or pull_request.user.user == g.fas_user.username
- or pull_request.assignee.user == g.fas_user.username) %}
- $("#drop-btn").click(drop_issue);
- {% endif %}
- }
- {% if g.authenticated and (
- g.repo_user
- or pull_request.user.user == g.fas_user.username
- or pull_request.assignee.user == g.fas_user.username) %}
- setup_btn_take_drop();
- {% endif %}
- </script>
- <script type="text/javascript" nonce="{{ g.nonce }}">
- var source = null;
- var sse = true;
- {% if config['EVENTSOURCE_SOURCE'] and pull_request %}
- if (!!window.EventSource) {
- source = new EventSource('{{ config["EVENTSOURCE_SOURCE"]
- + request.script_root + request.path }}');
- source.addEventListener('error', function(e) {
- sse = false;
- }, false);
- }
- window.onbeforeunload = function() {
- source.close()
- };
- source.addEventListener('message', function(e) {
- console.log(e.data);
- var data = $.parseJSON(e.data);
- process_event(
- data,
- "{{ request.uid }}",
- "{{ g.fas_user.username if g.authenticated or '' }}");
- setup_edit_btns();
- setup_reply_btns();
- }, false);
- {% else %}
- sse = false;
- {% endif %}
- </script>
- {% if repo.quick_replies %}
- <script type="text/javascript" src="{{ url_for('static', filename='quick_reply.js') }}?version={{ g.version}}"></script>
- {% endif %}
- <script type="text/javascript" src="{{ url_for('static', filename='reactions.js') }}?version={{ g.version}}"></script>
- {% endblock %}
|