234 attempt to fix js error Uncaught SyntaxError: Unexpected identifier 'hidden'
This commit is contained in:
+247
-159
@@ -4,8 +4,13 @@
|
||||
<title><cfoutput>#application._taffy.settings.docs.APIName# Documentation - #application._taffy.settings.docs.APIversion#</cfoutput></title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="icon" href="https://fav.farm/🍬" />
|
||||
<cfif application._taffy.settings.allowGoogleFonts>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;500;600;700&family=Atkinson+Hyperlegible+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
</cfif>
|
||||
<style>
|
||||
<cfinclude template="dash.css" />
|
||||
<cfinclude template="dashboard.css" />
|
||||
<cfinclude template="highlight-github.min.css" />
|
||||
</style>
|
||||
</head>
|
||||
@@ -14,15 +19,29 @@
|
||||
window.taffy = { resources: {} };
|
||||
</script>
|
||||
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<h1><cfoutput>#application._taffy.settings.docs.APIName#</cfoutput></h1>
|
||||
<span class="ver text-muted" style="left: 0">Version <cfoutput>#application._taffy.settings.docs.APIversion#</cfoutput></span>
|
||||
</div>
|
||||
<div style="max-width: 1200px; margin: 0 auto; padding: 1.5rem;">
|
||||
|
||||
<div class="row" id="resources">
|
||||
<h3>Resources:</h3>
|
||||
<div class="panel-group" id="resourcesAccordion">
|
||||
<header class="dashboard-header">
|
||||
<div>
|
||||
<h1 class="dashboard-title"><cfoutput>#application._taffy.settings.docs.APIName#</cfoutput></h1>
|
||||
<span class="dashboard-version">Version <cfoutput>#application._taffy.settings.docs.APIversion#</cfoutput></span>
|
||||
</div>
|
||||
<div style="display: flex; gap: 0.5rem;">
|
||||
<button class="btn btn-icon has-tooltip" id="openapi" data-tooltip="OpenAPI/Swagger" aria-label="OpenAPI/Swagger" onclick="window.location.href = '<cfoutput>#CGI.SCRIPT_NAME#</cfoutput>?openapi'"><cfinclude template="swagger.svg" /></button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="resources">
|
||||
<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; margin-bottom: 1rem;">
|
||||
<h2 style="font-size: 1.25rem; font-weight: 600; margin: 0;">Resources:</h2>
|
||||
<div class="sort-picker" data-store-key="taffyDocsSort">
|
||||
<button type="button" class="sort-btn active" data-sort="name">Name</button>
|
||||
<button type="button" class="sort-btn" data-sort="uri">URI</button>
|
||||
<button type="button" class="sort-btn" data-sort="match">Match Order</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="resourcesAccordion">
|
||||
<cfoutput>
|
||||
<cfloop from="1" to="#arrayLen(application._taffy.uriMatchOrder)#" index="local.resource">
|
||||
<cfset local.currentResource = application._taffy.endpoints[application._taffy.uriMatchOrder[local.resource]] />
|
||||
@@ -31,159 +50,144 @@
|
||||
<cfif structKeyExists(local.beanMeta, "taffy_docs_hide") OR structKeyExists(local.beanMeta, "taffy:docs:hide")>
|
||||
<cfscript>continue;</cfscript>
|
||||
</cfif>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<a href="###local.currentResource.beanName#" class="accordion-toggle" data-toggle="collapse" data-parent="##resourcesAccordion">
|
||||
<cfif structKeyExists(local.beanMeta, "taffy:docs:name")>
|
||||
#local.beanMeta['taffy:docs:name']#
|
||||
<cfelseif structKeyExists(local.beanMeta, "taffy_docs_name")>
|
||||
#local.beanMeta['taffy_docs_name']#
|
||||
<cfelse>
|
||||
#local.currentResource.beanName#
|
||||
</cfif>
|
||||
</a>
|
||||
<cfloop list="DELETE|warning,PATCH|warning,PUT|warning,POST|danger,GET|primary" index="local.verb">
|
||||
<cfif structKeyExists(local.currentResource.methods, listFirst(local.verb,'|'))>
|
||||
<span class="verb label label-success">#ucase(listFirst(local.verb,'|'))#</span>
|
||||
<cfset local.displayName = local.currentResource.beanName />
|
||||
<cfif structKeyExists(local.beanMeta, "taffy:docs:name")>
|
||||
<cfset local.displayName = local.beanMeta['taffy:docs:name'] />
|
||||
<cfelseif structKeyExists(local.beanMeta, "taffy_docs_name")>
|
||||
<cfset local.displayName = local.beanMeta['taffy_docs_name'] />
|
||||
</cfif>
|
||||
<div class="resource-panel" data-sort-name="#lCase(local.displayName)#" data-sort-uri="#lCase(local.currentResource.srcUri)#">
|
||||
<div class="resource-header" data-target="#local.currentResource.beanName#">
|
||||
<span class="resource-name">#local.displayName#</span>
|
||||
<span class="resource-meta">
|
||||
<code class="resource-uri">#local.currentResource.srcUri#</code>
|
||||
<cfloop list="GET,POST,PUT,PATCH,DELETE" index="local.verb">
|
||||
<cfif structKeyExists(local.currentResource.methods, local.verb)>
|
||||
<span class="verb verb-#lcase(local.verb)#">#local.verb#</span>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<code style="float:right; margin-top: -15px; display: inline-block;">#local.currentResource.srcUri#</code>
|
||||
</h4>
|
||||
</span>
|
||||
</div>
|
||||
<div id="#local.currentResource.beanName#" class="in">
|
||||
<div class="panel-body resourceWrapper">
|
||||
<div class="col-md-12 docs">
|
||||
<cfset local.metadata = getMetaData(application._taffy.factory.getBean(local.currentResource.beanName)) />
|
||||
<cfset local.docData = getHintsFromMetadata(local.metadata) />
|
||||
<cfif structKeyExists(local.docData, 'hint')><div class="doc">#docData.hint#</div><hr/></cfif>
|
||||
<cfset local.found = { get=false, post=false, put=false, patch=false, delete=false } />
|
||||
<cfloop from="1" to="#arrayLen(local.docData.functions)#" index="local.f">
|
||||
<cfset local.func = local.docData.functions[local.f] />
|
||||
<cfset verbs = "GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD" />
|
||||
<cfset thisVerb = local.func.name />
|
||||
<cfif structKeyExists(local.func,"taffy_verb")>
|
||||
<cfset thisVerb = local.func.taffy_verb />
|
||||
<cfelseif structKeyExists(local.func,"taffy:verb")>
|
||||
<cfset thisVerb = local.func['taffy:verb'] />
|
||||
<div class="resource-content" id="#local.currentResource.beanName#">
|
||||
<cfset local.metadata = getMetaData(application._taffy.factory.getBean(local.currentResource.beanName)) />
|
||||
<cfset local.docData = getHintsFromMetadata(local.metadata) />
|
||||
<cfif structKeyExists(local.docData, 'hint')>
|
||||
<p class="doc-hint">#local.docData.hint#</p>
|
||||
</cfif>
|
||||
<cfset local.found = { get=false, post=false, put=false, patch=false, delete=false } />
|
||||
<cfloop from="1" to="#arrayLen(local.docData.functions)#" index="local.f">
|
||||
<cfset local.func = local.docData.functions[local.f] />
|
||||
<cfset verbs = "GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD" />
|
||||
<cfset thisVerb = local.func.name />
|
||||
<cfif structKeyExists(local.func,"taffy_verb")>
|
||||
<cfset thisVerb = local.func.taffy_verb />
|
||||
<cfelseif structKeyExists(local.func,"taffy:verb")>
|
||||
<cfset thisVerb = local.func['taffy:verb'] />
|
||||
</cfif>
|
||||
<cfif listFindNoCase(verbs, thisVerb) eq 0
|
||||
OR structKeyExists(local.func, "taffy_docs_hide")
|
||||
OR structKeyExists(local.func, "taffy:docs:hide")>
|
||||
<cfscript>continue;</cfscript>
|
||||
</cfif>
|
||||
<cfset local.found[local.func.name] = true />
|
||||
<div class="doc-section">
|
||||
<h5 class="doc-verb-title">#thisVerb#</h5>
|
||||
<cfif structKeyExists(local.func, "hint")>
|
||||
<p class="doc-hint">#local.func.hint#</p>
|
||||
</cfif>
|
||||
<!--- begin inputs --->
|
||||
<cfset local.visibleParams = [] />
|
||||
<cfloop from="1" to="#arrayLen(local.func.parameters)#" index="local.p">
|
||||
<cfset local.param = local.func.parameters[local.p] />
|
||||
<cfif NOT (structKeyExists(local.param, "taffy_docs_hide") OR structKeyExists(local.param, "taffy:docs:hide"))>
|
||||
<cfset arrayAppend(local.visibleParams, local.param) />
|
||||
</cfif>
|
||||
<cfif listFindNoCase(verbs, thisVerb) eq 0
|
||||
OR structKeyExists(local.func, "taffy_docs_hide")
|
||||
OR structKeyExists(local.func, "taffy:docs:hide")>
|
||||
<cfscript>continue;</cfscript><!--- this has to be script for CF8 compat --->
|
||||
</cfif>
|
||||
<cfset local.found[local.func.name] = true />
|
||||
<div class="col-md-12"><h5 class="verbHeading">#thisVerb#</h5></div>
|
||||
<cfif structKeyExists(local.func, "hint")>
|
||||
<div class="col-md-12 doc">#local.func.hint#</div>
|
||||
</cfif>
|
||||
<div class="inputs-wrapper">
|
||||
<!--- begin inputs panel --->
|
||||
<cfset inputsCount = 0 />
|
||||
<cfloop from="1" to="#arrayLen(local.func.parameters)#" index="local.p">
|
||||
<cfset local.param = local.func.parameters[local.p] />
|
||||
<cfif structKeyExists(local.param, "taffy_docs_hide") OR structKeyExists(local.param, "taffy:docs:hide")>
|
||||
<cfscript>continue;</cfscript>
|
||||
</cfif>
|
||||
<cfset inputsCount++ />
|
||||
</cfloop>
|
||||
<cfif inputsCount gt 0>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h6 class="panel-title"><a href="###local.currentResource.beanName#_#local.func.name#_inputs" class="accordion-toggle" data-toggle="collapse" data-parent="###local.currentResource.beanName#_docs">Inputs</a></h6>
|
||||
</div>
|
||||
<div class="panel-collapse collapse" id="#local.currentResource.beanName#_#local.func.name#_inputs">
|
||||
<div class="panel-body">
|
||||
<cfloop from="1" to="#arrayLen(local.func.parameters)#" index="local.p">
|
||||
<cfset local.param = local.func.parameters[local.p] />
|
||||
<cfif structKeyExists(local.param, "taffy_docs_hide") OR structKeyExists(local.param, "taffy:docs:hide")>
|
||||
<cfscript>continue;</cfscript>
|
||||
</cfif>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<strong>#local.param.name#</strong>
|
||||
<cfif not structKeyExists(local.param, 'required') or not local.param.required>
|
||||
optional
|
||||
<cfelse>
|
||||
required
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "type")>
|
||||
#local.param.type#
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "default")>
|
||||
<cfif local.param.default eq "">
|
||||
(default: "")
|
||||
<cfelse>
|
||||
(default: #local.param.default#)
|
||||
</cfif>
|
||||
<cfelse>
|
||||
<!--- no default value --->
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "hint")>
|
||||
<br/><p class="doc hint">#local.param.hint#</p>
|
||||
</cfif>
|
||||
</div>
|
||||
</div>
|
||||
</cfloop>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</cfif>
|
||||
<!--- end inputs panel --->
|
||||
<!--- begin sample response --->
|
||||
<cfset hasSample = false />
|
||||
<cfset sample = '' />
|
||||
<cfloop from="1" to="#arrayLen(local.beanMeta.functions)#" index="functionIndex">
|
||||
<cfif local.beanMeta.functions[functionIndex].name eq 'sample#local.func.name#Response'>
|
||||
<cfset hasSample = true />
|
||||
<cfinvoke
|
||||
component="#local.bean#"
|
||||
method="sample#local.func.name#Response"
|
||||
argumentcollection={}
|
||||
returnvariable="sample"
|
||||
/>
|
||||
<cfbreak />
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<cfif hasSample>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h6 class="panel-title">
|
||||
<a href="###local.currentResource.beanName#_#local.func.name#_sample" class="accordion-toggle" data-toggle="collapse" data-parent="###local.currentResource.beanName#_docs">Sample Response</a>
|
||||
</h6>
|
||||
</div>
|
||||
<div class="panel-collapse collapse" id="#local.currentResource.beanName#_#local.func.name#_sample">
|
||||
<div class="panel-body">
|
||||
<div class="col-md-12">
|
||||
<script type="text/javascript" defer>
|
||||
document.write("<pre><code>");
|
||||
document.write(JSON.stringify(#serializeJson(sample)#, null, ' '));
|
||||
document.write("</code></pre>");
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</cfif>
|
||||
<!--- end sample response --->
|
||||
</div>
|
||||
</cfloop>
|
||||
</div><!-- /col-md-6 (docs) -->
|
||||
</div>
|
||||
<cfif arrayLen(local.visibleParams) gt 0>
|
||||
<div class="doc-accordion">
|
||||
<button type="button" class="doc-accordion-trigger" data-target="#local.currentResource.beanName#_#local.func.name#_inputs">
|
||||
Inputs
|
||||
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path></svg>
|
||||
</button>
|
||||
<div class="doc-accordion-content" id="#local.currentResource.beanName#_#local.func.name#_inputs">
|
||||
<cfloop array="#local.visibleParams#" index="local.param">
|
||||
<div class="param-item">
|
||||
<cfif not structKeyExists(local.param, 'required') or not local.param.required>
|
||||
<span class="param-badge param-optional">optional</span>
|
||||
<cfelse>
|
||||
<span class="param-badge param-required">required</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "type")>
|
||||
<span class="param-type">#local.param.type#</span>
|
||||
</cfif>
|
||||
<span class="param-name">#local.param.name#</span>
|
||||
<cfif structKeyExists(local.param, "taffy_minlength")>
|
||||
<span class="param-constraint">min length: #local.param["taffy_minlength"]#</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "taffy_maxlength")>
|
||||
<span class="param-constraint">max length: #local.param["taffy_maxlength"]#</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "taffy_min")>
|
||||
<span class="param-constraint">min: #local.param["taffy_min"]#</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "taffy_max")>
|
||||
<span class="param-constraint">max: #local.param["taffy_max"]#</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "taffy_pattern")>
|
||||
<span class="param-constraint">pattern: #local.param["taffy_pattern"]#</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "default")>
|
||||
<span class="param-default">
|
||||
<cfif local.param.default eq "">(default: "")<cfelse>(default: #local.param.default#)</cfif>
|
||||
</span>
|
||||
</cfif>
|
||||
<cfif structKeyExists(local.param, "hint")>
|
||||
<p class="param-hint">#local.param.hint#</p>
|
||||
</cfif>
|
||||
</div>
|
||||
</cfloop>
|
||||
</div>
|
||||
</div>
|
||||
</cfif>
|
||||
<!--- end inputs --->
|
||||
<!--- begin sample response --->
|
||||
<cfset hasSample = false />
|
||||
<cfset sample = '' />
|
||||
<cfloop from="1" to="#arrayLen(local.beanMeta.functions)#" index="functionIndex">
|
||||
<cfif local.beanMeta.functions[functionIndex].name eq 'sample#local.func.name#Response'>
|
||||
<cfset hasSample = true />
|
||||
<cfinvoke
|
||||
component="#local.bean#"
|
||||
method="#local.beanMeta.functions[functionIndex].name#"
|
||||
returnvariable="sample"
|
||||
/>
|
||||
<cfbreak />
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<cfif hasSample>
|
||||
<div class="doc-accordion">
|
||||
<button type="button" class="doc-accordion-trigger" data-target="#local.currentResource.beanName#_#local.func.name#_sample">
|
||||
Sample Response
|
||||
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path></svg>
|
||||
</button>
|
||||
<div class="doc-accordion-content sample-response-content" id="#local.currentResource.beanName#_#local.func.name#_sample">
|
||||
<pre class="response-body"><code class="json-format">#serializeJson(sample)#</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</cfif>
|
||||
<!--- end sample response --->
|
||||
</div>
|
||||
</cfloop>
|
||||
</div>
|
||||
</div>
|
||||
</cfloop>
|
||||
</cfoutput>
|
||||
</div><!-- /panel-group -->
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<cfif arrayLen(application._taffy.uriMatchOrder) eq 0>
|
||||
<div class="panel panel-warning">
|
||||
<div class="panel-heading">Taffy is running but you haven't defined any resources yet.</div>
|
||||
<div class="panel-body">
|
||||
<div class="empty-state">
|
||||
<div class="empty-state-header">Taffy is running but you haven't defined any resources yet.</div>
|
||||
<div class="empty-state-body">
|
||||
<p>
|
||||
It looks like you don't have any resources defined. Get started by creating the folder
|
||||
<code><cfoutput>#guessResourcesFullPath()#</cfoutput></code>, in which you should place your
|
||||
@@ -201,19 +205,103 @@
|
||||
</div>
|
||||
</div>
|
||||
</cfif>
|
||||
<div class="alert alert-info">Resources are listed in matching order. From top to bottom, the first URI to match the request is used.</div>
|
||||
</div><!-- /#resources -->
|
||||
|
||||
</div><!-- /container -->
|
||||
<div class="alert alert-info mt-4 match-order-hint" style="display: none;">Resources are listed in matching order. From top to bottom, the first URI to match the request is used.</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
<cfinclude template="jquery.min.js" />
|
||||
<cfinclude template="bootstrap.min.js" />
|
||||
<cfinclude template="highlight.min.js" />
|
||||
<cfinclude template="dash.js" />
|
||||
|
||||
$(function(){
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
hljs.initHighlighting();
|
||||
|
||||
// Resource header toggle
|
||||
document.querySelectorAll('.resource-header').forEach(function(header) {
|
||||
header.addEventListener('click', function() {
|
||||
var targetId = this.getAttribute('data-target');
|
||||
var content = document.getElementById(targetId);
|
||||
if (content) {
|
||||
content.classList.toggle('open');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Doc accordion toggle
|
||||
document.querySelectorAll('.doc-accordion-trigger').forEach(function(trigger) {
|
||||
trigger.addEventListener('click', function() {
|
||||
var targetId = this.getAttribute('data-target');
|
||||
var content = document.getElementById(targetId);
|
||||
if (content) {
|
||||
this.classList.toggle('open');
|
||||
content.classList.toggle('open');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Format JSON in sample responses
|
||||
document.querySelectorAll('.json-format').forEach(function(el) {
|
||||
try {
|
||||
var data = JSON.parse(el.textContent);
|
||||
el.textContent = JSON.stringify(data, null, ' ');
|
||||
hljs.highlightElement(el);
|
||||
} catch(e) {}
|
||||
});
|
||||
|
||||
// Resource sorting
|
||||
document.querySelectorAll('.sort-picker').forEach(function(picker) {
|
||||
var storeKey = picker.dataset.storeKey;
|
||||
var accordion = picker.closest('section').querySelector('#resourcesAccordion');
|
||||
if (!accordion) return;
|
||||
|
||||
var panels = Array.prototype.slice.call(accordion.querySelectorAll('.resource-panel'));
|
||||
panels.forEach(function(panel, i) {
|
||||
panel.dataset.sortMatch = i;
|
||||
});
|
||||
|
||||
function sortPanels(mode) {
|
||||
var sorted = panels.slice();
|
||||
if (mode === 'name') {
|
||||
sorted.sort(function(a, b) {
|
||||
return (a.dataset.sortName || '').localeCompare(b.dataset.sortName || '');
|
||||
});
|
||||
} else if (mode === 'uri') {
|
||||
sorted.sort(function(a, b) {
|
||||
return (a.dataset.sortUri || '').localeCompare(b.dataset.sortUri || '');
|
||||
});
|
||||
} else {
|
||||
sorted.sort(function(a, b) {
|
||||
return Number(a.dataset.sortMatch) - Number(b.dataset.sortMatch);
|
||||
});
|
||||
}
|
||||
sorted.forEach(function(panel) {
|
||||
accordion.appendChild(panel);
|
||||
});
|
||||
var hint = picker.closest('section').querySelector('.match-order-hint');
|
||||
if (hint) {
|
||||
hint.style.display = mode === 'match' ? '' : 'none';
|
||||
}
|
||||
}
|
||||
|
||||
var saved = localStorage.getItem(storeKey) || 'name';
|
||||
picker.querySelectorAll('.sort-btn').forEach(function(btn) {
|
||||
btn.classList.toggle('active', btn.dataset.sort === saved);
|
||||
});
|
||||
sortPanels(saved);
|
||||
|
||||
picker.querySelectorAll('.sort-btn').forEach(function(btn) {
|
||||
btn.addEventListener('click', function() {
|
||||
picker.querySelectorAll('.sort-btn').forEach(function(b) {
|
||||
b.classList.remove('active');
|
||||
});
|
||||
btn.classList.add('active');
|
||||
var mode = btn.dataset.sort;
|
||||
localStorage.setItem(storeKey, mode);
|
||||
sortPanels(mode);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user