openapi-gui
Version:
GUI / visual editor for creating and editing OpenApi / Swagger definitions
447 lines (424 loc) • 26 kB
HTML
<div class="accordion-group box">
<div class='accordion-heading'>
<a class="icon" data-toggle="collapse" data-balloon="Toggle operation" :data-target="hashUid" v-on:click="toggleBody()">
<i class="fa fa-reorder accordion-handle method-handle"></i>
</a>
<span><b>Operation:</b>
<span class="control">
<a class="icon" data-balloon="Add operation" v-on:click="addOperation()"><i class="fa fa-fw fa-plus"></i></a>
</span>
<a class='icon' data-balloon="Duplicate operation" v-on:click="duplicateOperation(method)"><i class="fa fa-fw fa-copy"></i></a>
<a class='icon is-danger' data-balloon="Remove operation" v-on:click="removeOperation(index)"><i class="fa fa-fw fa-trash"></i></a>
<a class="accordion-toggle" data-balloon="Toggle operation" data-toggle="collapse" :data-target="hashUid" v-on:click="toggleBody()">
<span class='methodNameSpan'>{{httpMethod}} {{method.operationId}}</span>
</a>
</span>
<div class="accordion-buttons">
<div class="block-container">
</div>
</div>
</div>
<div class="accordion-body collapse method-body" :id="_uid">
<div v-if="visible" class="accordion-inner">
<ul id="method-tabs" class='tabs is-boxed tab-container'>
<li class="tabItem method-tab is-active tabItem-method-main">
<a class="tabSelect" href="#" v-on:click="selectTab('main',$event)">
<span class="icon is-small"><i class="fa fa-cog"></i></span>
<span>Main</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-description">
<a class="tabSelect" href="#" v-on:click="selectTab('description',$event)">
<span class="icon is-small"><i class="fa fa-comment"></i></span>
<span>Description</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-docs">
<a class="tabSelect" href="#" v-on:click="selectTab('docs',$event)">
<span class="icon is-small"><i class="fa fa-book"></i></span>
<span>Docs</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-parameters">
<a class="tabSelect" href="#" v-on:click="selectTab('parameters',$event)">
<span class="icon is-small"><i class="fa fa-list"></i></span>
<span>Parameters</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-requestbodies">
<a class="tabSelect" href="#" v-on:click="selectTab('requestbodies',$event)">
<span class="icon is-small"><i class="fa fa-question"></i></span>
<span>Request Body</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-responses">
<a class="tabSelect" href="#" v-on:click="selectTab('responses',$event)">
<span class="icon is-small"><i class="fa fa-thumbs-o-up"></i></span>
<span>Responses</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-security">
<a class="tabSelect" href="#" v-on:click="selectTab('security',$event)">
<span class="icon is-small"><i class="fa fa-lock"></i></span>
<span>Security</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-links">
<a class="tabSelect" href="#" v-on:click="selectTab('links',$event)">
<span class="icon is-small"><i class="fa fa-link"></i></span>
<span>Links</span>
</a>
</li>
<li class="tabItem method-tab tabItem-method-callbacks">
<a class="tabSelect" href="#" v-on:click="selectTab('callbacks',$event)">
<span class="icon is-small"><i class="fa fa-chevron-circle-left"></i></span>
<span>Callbacks</span>
</a>
</li>
</ul>
<div class="method-pane method-pane-main">
<div class="field is-grouped">
<div class='control is-horizontal'>
<label class='label field-label is-normal'>Method</label>
<div class='control field-body'>
<div class="select">
<select v-model="httpMethod">
<option value="GET">GET</option>
<option value="POST">POST</option>
<option value="PUT">PUT</option>
<option value="DELETE">DELETE</option>
<option value="HEAD">HEAD</option>
<option value="PATCH">PATCH</option>
<option value="OPTIONS">OPTIONS</option>
<option value="TRACE">TRACE</option>
</select>
</div>
</div>
</div>
<div class='control is-horizontal is-expanded'>
<label class='label field-label is-normal'> OperationId </label>
<div class='field-body'>
<input class='input methodName' v-model="method.operationId">
</div>
</div>
<div class='control is-horizontal'>
<label class='field-label label is-normal'> Deprecated </label>
<div class='field-body'>
<input type='checkbox' class='checkbox' v-model='method.deprecated'>
</div>
</div>
</div>
</div>
<div class="method-pane method-pane-description hidden">
<div class='field is-horizontal'>
<label class='is-normal label field-label'> Summary </label>
<div class='field-body'>
<input class="input" v-model="method.summary">
</div>
</div>
<div class='field is-horizontal'>
<div class="field-label is-normal">
<label class='label'> Description </label>
<span class="icon" data-balloon="Preview markdown"><a v-on:click="markdownPreview()"><i class='fa fa-check-circle'></i></a></span>
</div>
<div class="field-body">
<textarea class="textarea" :id="descId" v-model="method.description"></textarea>
</div>
</div>
<div class='field is-horizontal'>
<div class="field-label is-normal">
<label class='label'> Tags </label>
</div>
<div class="field-body">
<b-field>
<b-taginput horizontal=true v-model="vtags" icon="label"
placeholder="Add a tag"
autocomplete :data="mtags" allow-new=true
type="is-success"></b-taginput>
</b-field>
</div>
</div>
</div>
<div class="method-pane method-pane-docs hidden">
<div class="none">
<div class='field is-horizontal'>
<label class='label field-label is-normal'> Docs Description </label>
<div class='field-body'>
<textarea class="textarea" v-model="method.externalDocs.description"></textarea>
</div>
</div>
<div class='field is-horizontal'>
<label class='label field-label is-normal'> Docs URL </label>
<div class='field-body control has-icons-left'>
<input type="url" class="input" v-model="method.externalDocs.url">
<span class="icon is-small is-left"><i class="fa fa-link"></i></span>
</div>
</div>
</div>
</div>
<div class="method-pane method-pane-parameters hidden">
<div class="card" v-if="method.parameters.length==0">
<div class="card-content">
<p class="title">
<a v-bind:href="specLink('#parametersObject')">OpenAPI Specification Parameters Object</a>
</p>
<p class="subtitle">
There are no parameters defined for this operation.
</p>
</div>
<footer class="card-footer">
<p class="card-footer-item">
<a v-on:click="addParameter()"><span class="button is-primary"><i class="fa fa-fw fa-plus"></i>Create Parameter</span></a>
</p>
</footer>
</div>
<div class="sortable-params" v-for="(parameter,index) in method.parameters">
<api-parameter :parameter="parameter" :index='index'></api-parameter>
</div>
</div>
<div class="method-pane method-pane-requestbodies hidden">
<div class="card" v-if="!method.requestBody">
<div class="card-content">
<p class="title">
<a v-bind:href="specLink('#requestBodyObject')">OpenAPI Specification requestBody Object</a>
</p>
<p class="subtitle">
There is no requestBody defined. RequestBodies on GET and DELETE operations SHALL be ignored.
</p>
</div>
<footer class="card-footer">
<p class="card-footer-item">
<a v-on:click="addRequestBody()"><span class="button is-primary"><i class="fa fa-fw fa-plus"></i>Create Request Body</span></a>
</p>
</footer>
</div>
<div class="box" v-if="method.requestBody">
<div class="field is-horizontal is-grouped">
<div class="control">
<label class='label field-label is-normal'>Description</label>
</div>
<div class="control is-expanded">
<div class='field-body'>
<textarea class="textarea" v-model="effectiveRequestBody.description"></textarea>
</div>
</div>
</div>
<div class="field is-horizontal is-grouped">
<div class="control">
<label class='label field-label is-normal'>Required</label>
</div>
<div class="control is-expanded">
<div class='field-body'>
<input type="checkbox" class="checkbox" v-model="effectiveRequestBody.required">
</div>
</div>
</div>
<api-mediatype v-for="(content, mediatype) in effectiveRequestBody.content"
:content="content" :key="mediatype" :mediatype="mediatype" :container="effectiveRequestBody" inline-template>
<div class="box">
<div class='field level is-horizontal is-grouped'>
<div class="control">
<span class="icon" data-balloon="Add media-type"><a v-on:click="addMediaType()"><i class="fa fa-fw fa-plus"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Duplicate media-type"><a v-on:click="duplicateMediaType()"><i class="fa fa-fw fa-copy"></i></a></span>
</div>
<div class="control">
<span class="icon" :data-balloon="schemaTooltip"><a v-on:click="editMediaType(mediatype)"><i class="fa fa-fw fa-edit"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Remove media-type"><a v-on:click="removeMediaType()"><i class="fa fa-fw fa-trash"></i></a></span>
</div>
<div class="control">
<label class='label field-label is-normal'>Media-Type</label>
</div>
<div class="control is-expanded">
<div class='field-body'>
<input class="input" placeholder="Required" v-model.lazy="mediaTypeName">
</div>
</div>
</div>
</div>
</api-mediatype>
</div>
</div>
<div class="method-pane method-pane-responses hidden">
<api-response v-for="(response, status) in method.responses"
:response="response" :key="status" :status="status" :method="method" inline-template>
<div class="box">
<div class='field level is-horizontal is-grouped'>
<div class="control">
<span class="icon" data-balloon="Add response"><a v-on:click="addResponse()"><i class="fa fa-fw fa-plus"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Duplicate response"><a v-on:click="duplicateResponse()"><i class="fa fa-fw fa-copy"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Remove response"><a v-on:click="removeResponse()"><i class="fa fa-fw fa-trash"></i></a></span>
</div>
<div class="control">
<label class='label field-label is-normal'>Status Code </label>
</div>
<div class="field">
<div class='field-body'>
<input class="input" size="3" v-model.lazy="statusCode">
</div>
</div>
<div class="control">
<label class='label field-label is-normal'> Description</label>
</div>
<div class="control is-expanded">
<div class='field-body'>
<input class="input" placeholder="Required" v-model="response.description">
</div>
</div>
</div>
<div class="box">
<api-mediatype v-for="(content, mediatype) in response.content"
:content="content" :key="mediatype" :mediatype="mediatype" :container="response" inline-template>
<div class="box">
<div class='field level is-horizontal is-grouped'>
<div class="control">
<span class="icon" data-balloon="Add media-type"><a v-on:click="addMediaType()"><i class="fa fa-fw fa-plus"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Duplicate media-type"><a v-on:click="duplicateMediaType()"><i class="fa fa-fw fa-copy"></i></a></span>
</div>
<div class="control">
<span class="icon" :data-balloon="schemaTooltip"><a v-on:click="editMediaType(mediatype)"><i class="fa fa-fw fa-edit"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Remove media-type"><a v-on:click="removeMediaType()"><i class="fa fa-fw fa-trash"></i></a></span>
</div>
<div class="control">
<label class='label field-label is-normal'>Media-Type</label>
</div>
<div class="control is-expanded">
<div class='field-body'>
<input class="input" placeholder="Required" v-model.lazy="mediaTypeName">
</div>
</div>
</div>
</div>
</api-mediatype>
</div>
</div>
</api-response>
</div>
<div class="method-pane method-pane-callbacks hidden container is-fluid">
<div class="card" v-if="!method.callbacks || Object.keys(method.callbacks).length == 0">
<div class="card-content">
<p class="title">
<a v-bind:href="specLink('#callbackObject')">OpenAPI Specification Callback Object</a>
</p>
<p class="subtitle">
There are no callbacks defined.
</p>
</div>
<footer class="card-footer">
<p class="card-footer-item">
<a v-on:click="addCallback()"><span class="button is-primary"><i class="fa fa-fw fa-plus"></i>Create Callback</span></a>
</p>
</footer>
</div>
<div class="box" v-if="method.callbacks && Object.keys(method.callbacks).length>0">
<!-- todo callbacks -->
<div v-for="(callback, cbname) in method.callbacks">
<div class='field level is-horizontal is-grouped'>
<div class="control">
<span class="icon" data-balloon="Add callback"><a v-on:click="addCallback()"><i class="fa fa-fw fa-plus"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Duplicate callback"><a v-on:click="duplicateCallback(cbname)"><i class="fa fa-fw fa-copy"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Remove callback"><a v-on:click="removeCallback(cbname)"><i class="fa fa-fw fa-trash"></i></a></span>
</div>
<div class="control">
<label class='label field-label is-normal'>Name </label>
</div>
<div class="field">
<div class='field-body'>
<input class="input" v-on:focus="storeCallbackName(cbname)" v-on:change="renameCallback(cbname)" v-model.lazy="cbname">
</div>
</div>
</div>
<div class='column is-2' v-if="Object.keys(callback).length==0">
<a v-on:click="addCallbackURL(cbname)" class='button is-primary is-right'>
<i class='fa fa-fw fa-plus'></i>
Add URL Expression
</a>
</div>
<div v-for="(expression, expname) in callback">
<div class='box field level is-horizontal is-grouped'>
<div class="control">
<span class="icon" data-balloon="Add expression"><a v-on:click="addCallbackURL(cbname)"><i class="fa fa-fw fa-plus"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Duplicate expression"><a v-on:click="duplicateExpression(cbname,expname)"><i class="fa fa-fw fa-copy"></i></a></span>
</div>
<div class="control">
<span class="icon" data-balloon="Remove expession"><a v-on:click="removeExpression(cbname,expname)"><i class="fa fa-fw fa-trash"></i></a></span>
</div>
<div class="control">
<label class='label field-label is-normal'>URL Expression </label>
</div>
<div class="control is-expanded">
<div class="field-body">
<input class="input" v-on:focus="storeExpressionName(expname)" v-on:change="renameExpression(cbname,expname)" v-model.lazy="expname">
</div>
</div>
<div v-if="Object.keys(expression).length == 0">
<a v-on:click="addExpressionOperation(expression)" class='button is-primary is-right'>
<i class='fa fa-fw fa-plus'></i>
Add Operation
</a>
</div>
</div> <!-- expression box -->
<div class="accordion method-container" v-for="(method,key,index) in expression">
<api-method :method="method" :index="key" :maintags="maintags"></api-method>
</div>
</div>
</div>
</div>
</div>
<div class="method-pane method-pane-security hidden container is-fluid">
<div class="level">
<label class="label" for="chkDefault">Use default security</label>
<input id="chkDefault" class="radio" type="radio" value="default" v-model="secType"/>
<label class="label" for="chkNone">Disable security</label>
<input id="chkNone" class="radio" type="radio" value="none" v-model="secType"/>
<label class="label" for="chkCustom">Use custom security</label>
<input id="chkCustom" class="radio" type="radio" value="custom" v-model="secType"/>
</div>
<div v-if="secType === 'custom'">
<h4 class="none"><strong>Selected security schemes</strong></h4>
<ul>
<li v-for="(scheme,index) in method.security">
<span class="icon" data-balloon="Remove security scheme from operation"><a v-on:click="removeSecScheme(index)"><i class="fa fa-trash"></i></a></span>
<span><strong>{{Object.keys(scheme)[0]}}</strong></span>
<span>{{Object.values(scheme)[0]}}</span>
</li>
</ul>
</div>
</div>
<div class="method-pane method-pane-links hidden container is-fluid">
<div class="card" v-if="!method.links || Object.keys(method.links).length == 0">
<div class="card-content">
<p class="title">
<a v-bind:href="specLink('#linksObject')">OpenAPI Specification Links Object</a>
</p>
<p class="subtitle">
There are no links defined.
</p>
</div>
<footer class="card-footer">
<p class="card-footer-item">
<a v-on:click="addLink()"><span class="button is-primary"><i class="fa fa-fw fa-plus"></i>Create Link</span></a>
</p>
</footer>
</div>
</div>
</div>
</div>
</div>