1 <div id=
"bootstrap-theme" class=
"api4-explorer-page">
4 {{:: ts('CiviCRM APIv4') }}{{ entity ? (' (' + entity + '::' + action + ')') : '' }}
7 <div class=
"api4-explorer-row crm-flex-box">
8 <form name=
"api4-explorer" class=
"panel panel-default explorer-params-panel crm-flex-2">
9 <div class=
"panel-heading">
10 <div class=
"form-inline">
11 <span ng-mouseenter=
"help('entity', paramDoc('$entity'))" ng-mouseleave=
"help()">
12 <input class=
"collapsible-optgroups form-control" ng-model=
"entity" ng-disabled=
"!entities.length" ng-class=
"{loading: !entities.length}" crm-ui-select=
"::{placeholder: ts('Entity'), data: entities, formatResultCssClass: formatResultCssClass}" />
14 <span ng-mouseenter=
"help('action', paramDoc('$action'))" ng-mouseleave=
"help()">
15 <input class=
"collapsible-optgroups form-control" ng-model=
"action" ng-disabled=
"!entity || !actions.length" ng-class=
"{loading: entity && !actions.length}" crm-ui-select=
"::{placeholder: ts('Action'), data: actions, formatResultCssClass: formatResultCssClass}" />
17 <input class=
"form-control api4-index" type=
"search" ng-model=
"index" ng-mouseenter=
"help('index', paramDoc('$index'))" ng-mouseleave=
"help()" placeholder=
"{{:: ts('Index') }}" />
18 <button class=
"btn btn-success pull-right" crm-icon=
"fa-bolt" ng-disabled=
"!entity || !action || loading" ng-click=
"execute()" ng-mouseenter=
"help(ts('Execute'), executeDoc())" ng-mouseleave=
"help()">{{:: ts('Execute') }}
</button>
19 <button class=
"btn btn-primary pull-right" crm-icon=
"fa-save" ng-show=
"perm.editGroups && action === 'get'" ng-click=
"save()" ng-mouseenter=
"help(ts('Save smart group'), saveDoc())" ng-mouseleave=
"help()">{{:: ts('Save...') }}
</button>
22 <div class=
"panel-body">
23 <div class=
"api4-input form-inline">
24 <div class=
"checkbox-inline form-control" ng-mouseenter=
"help(name, param)" ng-mouseleave=
"help()" ng-repeat=
"(name, param) in ::getGenericParams(['bool'], false)">
26 <input type=
"checkbox" id=
"api4-param-{{:: name }}" ng-model=
"params[name]"/>
27 <span>{{:: name }}
</span><span class=
"crm-marker" ng-if=
"::param.required"> *
</span>
30 <div class=
"checkbox-inline form-control" ng-mouseenter=
"help('selectRowCount', availableParams.select)" ng-mouseleave=
"help()" ng-if=
"::availableParams.select">
32 <input type=
"checkbox" id=
"api4-param-selectRowCount" ng-checked=
"isSelectRowCount()" ng-click=
"selectRowCount()" />
33 <span>SelectRowCount
</span>
37 <div class=
"api4-input form-inline" ng-mouseenter=
"help(name, param)" ng-mouseleave=
"help()" ng-repeat=
"(name, param) in ::getGenericParams(['bool'], true)">
38 <label>{{ name }}
<span class=
"crm-marker" ng-if=
"::param.required"> *
</span></label>
39 <label class=
"radio-inline">
40 <input type=
"radio" ng-model=
"params[name]" ng-value=
"true" />true
42 <label class=
"radio-inline">
43 <input type=
"radio" ng-model=
"params[name]" ng-value=
"false" />false
45 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam(name)" ng-show=
"params[name] !== null"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
47 <fieldset class=
"api4-input form-inline" ng-mouseenter=
"help('select', availableParams.select)" ng-mouseleave=
"help()" ng-if=
"availableParams.select">
48 <legend>select
<span class=
"crm-marker" ng-if=
"::availableParams.select.required"> *
</span></legend>
49 <div ng-model=
"params.select" ui-sortable=
"{axis: 'y'}">
50 <div class=
"api4-input form-inline" ng-repeat=
"item in params.select track by $index" ng-show=
"item !== 'row_count'">
51 <i class=
"crm-i fa-arrows" aria-hidden=
"true"></i>
52 <input class=
"form-control huge" type=
"text" ng-model=
"params.select[$index]" />
53 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam('select', $index)"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
56 <div class=
"api4-input form-inline">
57 <input class=
"collapsible-optgroups form-control huge" ng-model=
"controls.select" crm-ui-select=
"{data: fieldsAndJoinsAndFunctionsAndWildcards}" placeholder=
"Add select" />
60 <fieldset id=
"api4-join-fieldset" class=
"api4-input form-inline" ng-mouseenter=
"help('join', availableParams.join)" ng-mouseleave=
"help()" ng-if=
"::availableParams.join">
61 <legend>join
<span class=
"crm-marker" ng-if=
"::availableParams.join.required"> *
</span></legend>
62 <div ng-model=
"params.join" ui-sortable=
"{axis: 'y', containment: '#api4-join-fieldset'}">
63 <fieldset ng-repeat=
"item in params.join track by $index">
64 <div class=
"api4-input form-inline">
65 <i class=
"crm-i fa-arrows"></i>
66 <input class=
"form-control twenty" type=
"text" ng-model=
"params.join[$index][0]" ng-model-options=
"{updateOn: 'blur'}" ng-change=
"$ctrl.buildFieldList()"/>
67 <label>{{:: ts('Required:') }}
</label>
68 <select class=
"form-control" ng-model=
"params.join[$index][1]" ng-options=
"o.k as o.v for o in ::joinTypes" ></select>
69 <label>{{:: ts('Using:') }}
</label>
70 <select class=
"form-control" ng-model=
"params.join[$index][2]" ng-options=
"e.name as e.name for e in ::bridgeEntities" ng-change=
"$ctrl.buildFieldList()">
71 <option value=
"">{{:: ts('- none -') }}
</option>
73 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam('join', $index)"><i class=
"crm-i fa-times"></i></a>
75 <fieldset class=
"api4-clause-fieldset">
76 <crm-api4-clause clauses=
"params.join[$index]" format=
"plain" skip=
"3" op=
"AND" label=
"On" fields=
"fieldsAndJoins" ></crm-api4-clause>
80 <div class=
"api4-input form-inline">
81 <input class=
"collapsible-optgroups form-control huge" ng-model=
"controls.join" crm-ui-select=
"{data: entities}" placeholder=
"Add join" />
84 <div class=
"api4-input form-inline" ng-mouseenter=
"help('fields', availableParams.fields)" ng-mouseleave=
"help()" ng-if=
"::availableParams.fields">
85 <label for=
"api4-param-fields">fields
<span class=
"crm-marker" ng-if=
"::availableParams.fields.required"> *
</span></label>
86 <input class=
"form-control" ng-list
crm-ui-select=
"::{data: fields, multiple: true}" id=
"api4-param-fields" ng-model=
"params.fields" style=
"width: 85%;"/>
88 <div class=
"api4-input form-inline" ng-mouseenter=
"help('action', availableParams.action)" ng-mouseleave=
"help()"ng-if=
"::availableParams.action">
89 <label for=
"api4-param-action">action
<span class=
"crm-marker" ng-if=
"::availableParams.action.required"> *
</span></label>
90 <input class=
"form-control" crm-ui-select=
"{data: actions, allowClear: true, placeholder: 'None'}" id=
"api4-param-action" ng-model=
"params.action"/>
92 <div class=
"api4-input form-inline" ng-mouseenter=
"help(name, param)" ng-mouseleave=
"help()" ng-repeat=
"(name, param) in ::getGenericParams(['string', 'int'])">
93 <label for=
"api4-param-{{:: name }}">{{:: name }}
<span class=
"crm-marker" ng-if=
"::param.required"> *
</span></label>
94 <input class=
"form-control" ng-if=
"::!param.options" type=
"{{:: param.type[0] === 'int' && param.type.length === 1 ? 'number' : 'text' }}" id=
"api4-param-{{:: name }}" ng-model=
"params[name]"/>
95 <select class=
"form-control" ng-if=
"::param.options" ng-options=
"o for o in ::param.options" id=
"api4-param-{{:: name }}" ng-model=
"params[name]"></select>
96 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam(name)" ng-show=
"!!params[name]"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
98 <div class=
"api4-input" ng-mouseenter=
"help(name, param)" ng-mouseleave=
"help()" ng-repeat=
"(name, param) in ::getGenericParams(['array', 'mixed'])">
99 <label for=
"api4-param-{{:: name }}">{{:: name }}
<span class=
"crm-marker" ng-if=
"::param.required"> *
</span></label>
100 <textarea class=
"form-control" ng-if=
"::!param.options" id=
"api4-param-{{:: name }}" ng-model=
"params[name]">
102 <select multiple
ng-if=
"::param.options" crm-ui-select
class=
"form-control" id=
"api4-param-{{:: name }}" ng-model=
"params[name]">
103 <option ng-repeat=
"opt in param.options" value=
"{{ opt }}">{{ opt }}
</option>
106 <fieldset ng-if=
"::availableParams.where" class=
"api4-clause-fieldset" ng-mouseenter=
"help('where', availableParams.where)" ng-mouseleave=
"help()">
107 <crm-api4-clause clauses=
"params.where" is-required=
"availableParams.where.required" op=
"AND" label=
"Where" fields=
"fieldsAndJoins" ></crm-api4-clause>
109 <fieldset ng-repeat=
"name in ['values', 'defaults']" ng-if=
"::availableParams[name]" ng-mouseenter=
"help(name, availableParams[name])" ng-mouseleave=
"help()">
110 <legend>{{:: name }}
<span class=
"crm-marker" ng-if=
"::availableParams[name].required"> *
</span></legend>
111 <div class=
"api4-input form-inline" ng-repeat=
"clause in params[name]" ng-mouseenter=
"help('value: ' + clause[0], fieldHelp(clause[0]))" ng-mouseleave=
"help(name, availableParams[name])">
112 <input class=
"collapsible-optgroups form-control twenty" ng-model=
"clause[0]" crm-ui-select=
"{formatResult: formatSelect2Item, formatSelection: formatSelect2Item, data: fieldList(name), allowClear: true, placeholder: 'Field'}" />
113 <input class=
"form-control" ng-model=
"clause[1]" api4-exp-value=
"{field: clause[0], action: action === 'getFields' ? params.action || 'get' : action}" />
115 <div class=
"api4-input form-inline">
116 <input class=
"collapsible-optgroups form-control twenty" ng-model=
"controls[name]" crm-ui-select=
"{formatResult: formatSelect2Item, formatSelection: formatSelect2Item, data: fieldList(name), placeholder: ts('Add %1', {1: name.slice(0, -1)})}"/>
119 <fieldset ng-if=
"::availableParams.groupBy" ng-mouseenter=
"help('groupBy', availableParams.groupBy)" ng-mouseleave=
"help()">
120 <legend>groupBy
<span class=
"crm-marker" ng-if=
"::availableParams.groupBy.required"> *
</span></legend>
121 <div ng-model=
"params.groupBy" ui-sortable=
"{axis: 'y'}">
122 <div class=
"api4-input form-inline" ng-repeat=
"item in params.groupBy track by $index">
123 <i class=
"crm-i fa-arrows" aria-hidden=
"true"></i>
124 <input class=
"form-control huge" type=
"text" ng-model=
"params.groupBy[$index]" />
125 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam('groupBy', $index)"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
128 <div class=
"api4-input form-inline">
129 <input class=
"collapsible-optgroups form-control huge" ng-model=
"controls.groupBy" crm-ui-select=
"{data: fieldsAndJoinsAndFunctions}" placeholder=
"Add groupBy" />
132 <fieldset ng-if=
"::availableParams.having" class=
"api4-clause-fieldset" ng-mouseenter=
"help('having', availableParams.having)" ng-mouseleave=
"help()">
133 <crm-api4-clause clauses=
"params.having" is-required=
"availableParams.having.required" op=
"AND" label=
"Having" fields=
"havingOptions" ></crm-api4-clause>
135 <fieldset ng-if=
"::availableParams.orderBy" ng-mouseenter=
"help('orderBy', availableParams.orderBy)" ng-mouseleave=
"help()">
136 <legend>orderBy
<span class=
"crm-marker" ng-if=
"::availableParams.orderBy.required"> *
</span></legend>
137 <div ng-model=
"params.orderBy" ui-sortable=
"{axis: 'y'}">
138 <div class=
"api4-input form-inline" ng-repeat=
"clause in params.orderBy">
139 <i class=
"crm-i fa-arrows" aria-hidden=
"true"></i>
140 <input class=
"form-control huge" type=
"text" ng-model=
"clause[0]" />
141 <select class=
"form-control" ng-model=
"clause[1]">
142 <option value=
"ASC">ASC
</option>
143 <option value=
"DESC">DESC
</option>
145 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam('orderBy', $index)"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
148 <div class=
"api4-input form-inline">
149 <input class=
"collapsible-optgroups form-control huge" ng-model=
"controls.orderBy" crm-ui-select=
"{data: fieldsAndJoinsAndFunctionsWithSuffixes}" placeholder=
"Add orderBy" />
152 <fieldset ng-if=
"::availableParams.limit && availableParams.offset">
153 <div class=
"api4-input form-inline">
154 <span ng-mouseenter=
"help('limit', availableParams.limit)" ng-mouseleave=
"help()">
155 <label for=
"api4-param-limit">limit
<span class=
"crm-marker" ng-if=
"::availableParams.limit.required"> *
</span></label>
156 <input class=
"form-control" type=
"number" min=
"0" id=
"api4-param-limit" ng-model=
"params.limit"/>
158 <span ng-mouseenter=
"help('offset', availableParams.offset)" ng-mouseleave=
"help()">
159 <label for=
"api4-param-offset">offset
<span class=
"crm-marker" ng-if=
"::availableParams.offset.required"> *
</span></label>
160 <input class=
"form-control" type=
"number" min=
"0" id=
"api4-param-offset" ng-model=
"params.offset"/>
162 <a href
class=
"crm-hover-button" title=
"Clear" ng-click=
"clearParam('limit');clearParam('offset');" ng-show=
"!!params.limit || !!params.offset"><i class=
"crm-i fa-times" aria-hidden=
"true"></i></a>
165 <fieldset ng-if=
"::availableParams.chain" ng-mouseenter=
"help('chain', availableParams.chain)" ng-mouseleave=
"help()">
166 <legend>chain
</legend>
167 <div class=
"api4-input form-inline" ng-repeat=
"clause in params.chain" api4-exp-chain=
"clause" entities=
"::entities" main-entity=
"::entity" >
169 <div class=
"api4-input form-inline">
170 <input class=
"form-control" ng-model=
"controls.chain" crm-ui-select=
"::{data: entities}" placeholder=
"Add chain" />
175 <div class=
"panel panel-info explorer-help-panel">
176 <div class=
"panel-heading">
177 <h3 class=
"panel-title" crm-icon=
"fa-info-circle">{{ helpTitle }}
</h3>
179 <div class=
"panel-body">
180 <h4 ng-bind-html=
"helpContent.description"></h4>
181 <div ng-bind-html=
"helpContent.comment"></div>
182 <p ng-repeat=
"(key, item) in helpContent" ng-if=
"key !== 'description' && key !== 'comment' && key !== 'see'">
183 <strong>{{ key }}:
</strong> {{ item }}
185 <div ng-if=
"helpContent.see">
186 <strong>See:
</strong>
188 <li ng-repeat=
"ref in helpContent.see" ng-bind-html=
"ref"> </li>
194 <div class=
"api4-explorer-row crm-flex-box">
195 <div class=
"panel panel-info explorer-code-panel">
196 <div class=
"panel-heading">
197 <ul class=
"nav nav-tabs">
198 <li role=
"presentation" ng-repeat=
"lang in ::langs" ng-class=
"{active: selectedTab.code === lang}">
199 <a href
ng-click=
"selectLang(lang)">
205 <div class=
"panel-body">
206 <div class=
"alert alert-danger" ng-if=
"selectedTab.code === 'rest' && !$ctrl.authxEnabled">
208 {{:: ts('To enable REST authentication, the AuthX extension must be installed.') }}
209 <a target=
"_blank" ng-href=
"{{ crmUrl('civicrm/admin/extensions') }}">
210 <i class=
"crm-i fa-gear"> {{:: ts('Manage Extensions') }}
</i>
214 <div class=
"alert alert-warning" ng-if=
"selectedTab.code === 'rest' && $ctrl.authxEnabled">
216 <a target=
"_blank" ng-href=
"{{ crmUrl('civicrm/admin/setting/authx', {reset: 1}) }}">
217 <i class=
"crm-i fa-gear"> {{:: ts('Configure REST Authentication') }}
</i>
221 <a target=
"_blank" href=
"https://docs.civicrm.org/dev/en/latest/api/v4/rest/">
222 <i class=
"crm-i fa-external-link"> {{:: ts('REST Documentation') }}
</i>
226 <div ng-repeat=
"style in code[selectedTab.code]">
227 <label>{{:: style.label }}
</label>
228 <div><pre class=
"prettyprint" ng-bind-html=
"style.code"></pre></div>
232 <div class=
"panel explorer-result-panel panel-{{ status }}" >
233 <div class=
"panel-heading">
234 <div class=
"form-inline pull-right">
235 <select ng-show=
"selectedTab.result === 'result'" class=
"form-control" ng-model=
"$ctrl.resultFormat" ng-change=
"$ctrl.formatResult()">
236 <option ng-repeat=
"fmt in $ctrl.resultFormats" value=
"{{:: fmt.name }}">
241 <ul class=
"nav nav-tabs">
242 <li role=
"presentation" ng-class=
"{active: selectedTab.result === 'result'}">
243 <a href
ng-click=
"selectedTab.result = 'result'">
244 <span ng-switch=
"status">
245 <i class=
"fa fa-fw fa-circle-o" ng-switch-when=
"default"></i>
246 <i class=
"fa fa-fw fa-check-circle" ng-switch-when=
"success"></i>
247 <i class=
"fa fa-fw fa-check-circle" ng-switch-when=
"warning"></i>
248 <i class=
"fa fa-fw fa-minus-circle" ng-switch-when=
"danger"></i>
249 <i class=
"fa fa-fw fa-spinner fa-pulse" ng-switch-when=
"info"></i>
251 <span>{{:: ts('Result') }}
</span>
254 <li role=
"presentation" ng-if=
"::perm.accessDebugOutput" ng-class=
"{active: selectedTab.result === 'debug'}">
255 <a href
ng-click=
"selectedTab.result = 'debug'">
256 <i class=
"fa fa-fw fa-{{ debug ? (status === 'warning' || status === 'danger' ? 'warning' : 'bug') : 'circle-o' }}"></i>
257 <span>{{:: ts('Debug') }}
</span>
262 <div class=
"panel-body">
263 <div ng-show=
"selectedTab.result === 'result'">
264 <pre class=
"prettyprint" ng-repeat=
"code in result" ng-bind-html=
"code"></pre>
266 <div ng-if=
"::perm.accessDebugOutput" ng-show=
"selectedTab.result === 'debug'">
267 <pre ng-if=
"debug" class=
"prettyprint" ng-bind-html=
"debug"></pre>
270 {{:: ts('To view debugging output, enable the debug param before executing.') }}
273 {{:: ts('Enable backtrace in system settings to see error backtraces.') }}