Commit | Line | Data |
---|---|---|
19b53e5b C |
1 | <div id="bootstrap-theme" class="api4-explorer-page"> |
2 | <div crm-ui-debug="availableParams"></div> | |
3 | ||
4 | <h1 crm-page-title> | |
f9c5f498 | 5 | {{:: ts('CiviCRM APIv4') }}{{ entity ? (' (' + entity + '::' + action + ')') : '' }} |
19b53e5b C |
6 | </h1> |
7 | ||
8 | <!--This warning will show if bootstrap is unavailable. Normally it will be hidden by the bootstrap .collapse class.--> | |
9 | <div class="messages warning no-popup collapse"> | |
10 | <p> | |
11 | <i class="crm-i fa-exclamation-triangle"></i> | |
f9c5f498 | 12 | <strong>{{:: ts('Bootstrap theme not found.') }}</strong> |
19b53e5b | 13 | </p> |
f9c5f498 | 14 | <p>{{:: ts('This screen may not work correctly without a bootstrap-based theme such as Shoreditch installed.') }}</p> |
19b53e5b C |
15 | </div> |
16 | ||
17 | <div class="api4-explorer-row"> | |
18 | <form name="api4-explorer" class="panel panel-default explorer-params-panel"> | |
19 | <div class="panel-heading"> | |
20 | <div class="form-inline"> | |
9cea3619 | 21 | <span ng-mouseenter="help('entity', paramDoc('$entity'))" ng-mouseleave="help()"> |
4cd69277 | 22 | <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}" /> |
9cea3619 CW |
23 | </span> |
24 | <span ng-mouseenter="help('action', paramDoc('$action'))" ng-mouseleave="help()"> | |
4cd69277 | 25 | <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}" /> |
9cea3619 | 26 | </span> |
f9c5f498 CW |
27 | <input class="form-control api4-index" type="search" ng-model="index" ng-mouseenter="help('index', paramDoc('$index'))" ng-mouseleave="help()" placeholder="{{:: ts('Index') }}" /> |
28 | <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> | |
29 | <button class="btn btn-primary pull-right" crm-icon="fa-save" ng-show="perm.editGroups && entity === 'Contact' && action === 'get'" ng-click="save()" ng-mouseenter="help(ts('Save smart group'), saveDoc())" ng-mouseleave="help()">{{:: ts('Save...') }}</button> | |
19b53e5b C |
30 | </div> |
31 | </div> | |
32 | <div class="panel-body"> | |
33 | <div class="api4-input form-inline"> | |
f28caa2c | 34 | <label class="form-control" ng-mouseenter="help(name, param)" ng-mouseleave="help()" ng-class="{'api4-option-selected': params[name]}" ng-repeat="(name, param) in availableParams" ng-if="!isSpecial(name) && param.type[0] === 'bool' && param.default !== null"> |
4cd69277 CW |
35 | <input type="checkbox" id="api4-param-{{:: name }}" ng-model="params[name]"/> |
36 | {{:: name }}<span class="crm-marker" ng-if="::param.required"> *</span> | |
e730bd39 | 37 | </label> |
4cd69277 | 38 | <label class="form-control" ng-mouseenter="help('selectRowCount', availableParams.select)" ng-mouseleave="help()" ng-class="{'api4-option-selected': isSelectRowCount()}" ng-if="::availableParams.select"> |
19b53e5b | 39 | <input type="checkbox" id="api4-param-selectRowCount" ng-checked="isSelectRowCount()" ng-click="selectRowCount()" /> |
0c8e6f1e CW |
40 | SelectRowCount |
41 | </label> | |
19b53e5b C |
42 | </div> |
43 | <div class="api4-input form-inline" ng-mouseenter="help(name, param)" ng-mouseleave="help()" ng-repeat="(name, param) in availableParams" ng-if="!isSpecial(name) && param.type[0] === 'bool' && param.default === null"> | |
f28caa2c | 44 | <label>{{ name }}<span class="crm-marker" ng-if="::param.required"> *</span></label> |
19b53e5b C |
45 | <label class="radio-inline"> |
46 | <input type="radio" ng-model="params[name]" ng-value="true" />true | |
47 | </label> | |
48 | <label class="radio-inline"> | |
49 | <input type="radio" ng-model="params[name]" ng-value="false" />false | |
50 | </label> | |
51 | <a href class="crm-hover-button" title="Clear" ng-click="clearParam(name)" ng-show="params[name] !== null"><i class="crm-i fa-times"></i></a> | |
52 | </div> | |
292c1648 | 53 | <fieldset class="api4-input form-inline" ng-mouseenter="help('select', availableParams.select)" ng-mouseleave="help()" ng-if="availableParams.select && !isSelectRowCount()"> |
4cd69277 | 54 | <legend>select<span class="crm-marker" ng-if="::availableParams.select.required"> *</span></legend> |
292c1648 | 55 | <div ng-model="params.select" ui-sortable="{axis: 'y'}"> |
a26e006b | 56 | <div class="api4-input form-inline" ng-repeat="item in params.select track by $index"> |
292c1648 | 57 | <i class="crm-i fa-arrows"></i> |
a26e006b CW |
58 | <input class="form-control huge" type="text" ng-model="params.select[$index]" /> |
59 | <a href class="crm-hover-button" title="Clear" ng-click="clearParam('select', $index)"><i class="crm-i fa-times"></i></a> | |
292c1648 CW |
60 | </div> |
61 | </div> | |
62 | <div class="api4-input form-inline"> | |
a26e006b | 63 | <input class="collapsible-optgroups form-control huge" ng-model="controls.select" crm-ui-select="{data: fieldsAndJoinsAndFunctionsAndWildcards}" placeholder="Add select" /> |
292c1648 CW |
64 | </div> |
65 | </fieldset> | |
f28caa2c | 66 | <div class="api4-input form-inline" ng-mouseenter="help('fields', availableParams.fields)" ng-mouseleave="help()" ng-if="::availableParams.fields"> |
4cd69277 CW |
67 | <label for="api4-param-fields">fields<span class="crm-marker" ng-if="::availableParams.fields.required"> *</span></label> |
68 | <input class="form-control" ng-list crm-ui-select="::{data: fields, multiple: true}" id="api4-param-fields" ng-model="params.fields" style="width: 85%;"/> | |
19b53e5b | 69 | </div> |
4cd69277 CW |
70 | <div class="api4-input form-inline" ng-mouseenter="help('action', availableParams.action)" ng-mouseleave="help()"ng-if="::availableParams.action"> |
71 | <label for="api4-param-action">action<span class="crm-marker" ng-if="::availableParams.action.required"> *</span></label> | |
19b53e5b C |
72 | <input class="form-control" crm-ui-select="{data: actions, allowClear: true, placeholder: 'None'}" id="api4-param-action" ng-model="params.action"/> |
73 | </div> | |
74 | <div class="api4-input form-inline" ng-mouseenter="help(name, param)" ng-mouseleave="help()" ng-repeat="(name, param) in availableParams" ng-if="!isSpecial(name) && (param.type[0] === 'string' || param.type[0] === 'int')"> | |
4cd69277 CW |
75 | <label for="api4-param-{{:: name }}">{{:: name }}<span class="crm-marker" ng-if="::param.required"> *</span></label> |
76 | <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]"/> | |
77 | <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> | |
19b53e5b C |
78 | <a href class="crm-hover-button" title="Clear" ng-click="clearParam(name)" ng-show="!!params[name]"><i class="crm-i fa-times"></i></a> |
79 | </div> | |
80 | <div class="api4-input" ng-mouseenter="help(name, param)" ng-mouseleave="help()" ng-repeat="(name, param) in availableParams" ng-if="!isSpecial(name) && (param.type[0] === 'array' || param.type[0] === 'mixed')"> | |
4cd69277 CW |
81 | <label for="api4-param-{{:: name }}">{{:: name }}<span class="crm-marker" ng-if="::param.required"> *</span></label> |
82 | <textarea class="form-control" type="{{:: param.type[0] === 'int' && param.type.length === 1 ? 'number' : 'text' }}" id="api4-param-{{:: name }}" ng-model="params[name]"> | |
19b53e5b C |
83 | </textarea> |
84 | </div> | |
4cd69277 | 85 | <fieldset ng-if="::availableParams.where" class="api4-clause-fieldset" ng-mouseenter="help('where', availableParams.where)" ng-mouseleave="help()" crm-api4-clause="{type: 'where', clauses: params.where, required: availableParams.where.required, op: 'AND', label: 'where', fields: fieldsAndJoins}"> |
19b53e5b | 86 | </fieldset> |
4cd69277 | 87 | <fieldset ng-repeat="name in ['values', 'defaults']" ng-if="::availableParams[name]" ng-mouseenter="help(name, availableParams[name])" ng-mouseleave="help()"> |
f28caa2c | 88 | <legend>{{:: name }}<span class="crm-marker" ng-if="::availableParams[name].required"> *</span></legend> |
bb3786d2 CW |
89 | <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])"> |
90 | <input class="collapsible-optgroups form-control" ng-model="clause[0]" crm-ui-select="{formatResult: formatSelect2Item, formatSelection: formatSelect2Item, data: fieldList(name), allowClear: true, placeholder: 'Field'}" /> | |
c752d94b | 91 | <input class="form-control" ng-model="clause[1]" api4-exp-value="{field: clause[0], action: action === 'getFields' ? params.action || 'get' : action}" /> |
19b53e5b C |
92 | </div> |
93 | <div class="api4-input form-inline"> | |
bb3786d2 | 94 | <input class="collapsible-optgroups form-control" ng-model="controls[name]" crm-ui-select="{formatResult: formatSelect2Item, formatSelection: formatSelect2Item, data: fieldList(name), placeholder: ts('Add %1', {1: name.slice(0, -1)})}"/> |
19b53e5b | 95 | </div> |
b578f063 | 96 | </fieldset> |
4cd69277 CW |
97 | <fieldset ng-if="::availableParams.groupBy" ng-mouseenter="help('groupBy', availableParams.groupBy)" ng-mouseleave="help()"> |
98 | <legend>groupBy<span class="crm-marker" ng-if="::availableParams.groupBy.required"> *</span></legend> | |
b578f063 | 99 | <div ng-model="params.groupBy" ui-sortable="{axis: 'y'}"> |
a26e006b | 100 | <div class="api4-input form-inline" ng-repeat="item in params.groupBy track by $index"> |
b578f063 | 101 | <i class="crm-i fa-arrows"></i> |
a26e006b CW |
102 | <input class="form-control huge" type="text" ng-model="params.groupBy[$index]" /> |
103 | <a href class="crm-hover-button" title="Clear" ng-click="clearParam('groupBy', $index)"><i class="crm-i fa-times"></i></a> | |
b578f063 | 104 | </div> |
fba513f6 | 105 | </div> |
b578f063 | 106 | <div class="api4-input form-inline"> |
a26e006b | 107 | <input class="collapsible-optgroups form-control huge" ng-model="controls.groupBy" crm-ui-select="{data: fieldsAndJoinsAndFunctions}" placeholder="Add groupBy" /> |
b578f063 CW |
108 | </div> |
109 | </fieldset> | |
4cd69277 | 110 | <fieldset ng-if="::availableParams.having" class="api4-clause-fieldset" ng-mouseenter="help('having', availableParams.having)" ng-mouseleave="help()" crm-api4-clause="{type: 'having', clauses: params.having, required: availableParams.having.required, op: 'AND', label: 'having', fields: havingOptions}"> |
9f6c0e4f | 111 | </fieldset> |
4cd69277 CW |
112 | <fieldset ng-if="::availableParams.orderBy" ng-mouseenter="help('orderBy', availableParams.orderBy)" ng-mouseleave="help()"> |
113 | <legend>orderBy<span class="crm-marker" ng-if="::availableParams.orderBy.required"> *</span></legend> | |
fba513f6 CW |
114 | <div ng-model="params.orderBy" ui-sortable="{axis: 'y'}"> |
115 | <div class="api4-input form-inline" ng-repeat="clause in params.orderBy"> | |
116 | <i class="crm-i fa-arrows"></i> | |
a26e006b | 117 | <input class="form-control huge" type="text" ng-model="clause[0]" /> |
fba513f6 CW |
118 | <select class="form-control" ng-model="clause[1]"> |
119 | <option value="ASC">ASC</option> | |
120 | <option value="DESC">DESC</option> | |
121 | </select> | |
a26e006b | 122 | <a href class="crm-hover-button" title="Clear" ng-click="clearParam('orderBy', $index)"><i class="crm-i fa-times"></i></a> |
fba513f6 | 123 | </div> |
19b53e5b C |
124 | </div> |
125 | <div class="api4-input form-inline"> | |
a26e006b | 126 | <input class="collapsible-optgroups form-control huge" ng-model="controls.orderBy" crm-ui-select="{data: fieldsAndJoinsAndFunctions}" placeholder="Add orderBy" /> |
19b53e5b C |
127 | </div> |
128 | </fieldset> | |
4cd69277 | 129 | <fieldset ng-if="::availableParams.limit && availableParams.offset"> |
d71cde6c CW |
130 | <div class="api4-input form-inline"> |
131 | <span ng-mouseenter="help('limit', availableParams.limit)" ng-mouseleave="help()"> | |
4cd69277 | 132 | <label for="api4-param-limit">limit<span class="crm-marker" ng-if="::availableParams.limit.required"> *</span></label> |
d71cde6c CW |
133 | <input class="form-control" type="number" min="0" id="api4-param-limit" ng-model="params.limit"/> |
134 | </span> | |
135 | <span ng-mouseenter="help('offset', availableParams.offset)" ng-mouseleave="help()"> | |
4cd69277 | 136 | <label for="api4-param-offset">offset<span class="crm-marker" ng-if="::availableParams.offset.required"> *</span></label> |
d71cde6c CW |
137 | <input class="form-control" type="number" min="0" id="api4-param-offset" ng-model="params.offset"/> |
138 | </span> | |
139 | <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"></i></a> | |
140 | </div> | |
141 | </fieldset> | |
4cd69277 | 142 | <fieldset ng-if="::availableParams.chain" ng-mouseenter="help('chain', availableParams.chain)" ng-mouseleave="help()"> |
19b53e5b | 143 | <legend>chain</legend> |
4cd69277 | 144 | <div class="api4-input form-inline" ng-repeat="clause in params.chain" api4-exp-chain="clause" entities="::entities" main-entity="::entity" > |
19b53e5b C |
145 | </div> |
146 | <div class="api4-input form-inline"> | |
4cd69277 | 147 | <input class="form-control" ng-model="controls.chain" crm-ui-select="::{data: entities}" placeholder="Add chain" /> |
19b53e5b C |
148 | </div> |
149 | </fieldset> | |
150 | </div> | |
151 | </form> | |
152 | <div class="panel panel-info explorer-help-panel"> | |
153 | <div class="panel-heading"> | |
154 | <h3 class="panel-title" crm-icon="fa-info-circle">{{ helpTitle }}</h3> | |
155 | </div> | |
156 | <div class="panel-body"> | |
136ca5bb CW |
157 | <h4 ng-bind-html="helpContent.description"></h4> |
158 | <div ng-bind-html="helpContent.comment"></div> | |
0493ec47 | 159 | <p ng-repeat="(key, item) in helpContent" ng-if="key !== 'description' && key !== 'comment' && key !== 'see'"> |
19b53e5b C |
160 | <strong>{{ key }}:</strong> {{ item }} |
161 | </p> | |
0493ec47 CW |
162 | <div ng-if="helpContent.see"> |
163 | <strong>See:</strong> | |
164 | <ul> | |
fc95d9a5 | 165 | <li ng-repeat="ref in helpContent.see" ng-bind-html="ref"> </li> |
0493ec47 CW |
166 | </ul> |
167 | </div> | |
19b53e5b C |
168 | </div> |
169 | </div> | |
170 | </div> | |
171 | <div class="api4-explorer-row"> | |
172 | <div class="panel panel-warning explorer-code-panel"> | |
19d01932 | 173 | <ul class="panel-heading nav nav-tabs"> |
f28caa2c CW |
174 | <li role="presentation" ng-repeat="lang in ::langs" ng-class="{active: selectedTab.code === lang}"> |
175 | <a href ng-click="selectLang(lang)"> | |
176 | {{:: lang }} | |
19d01932 CW |
177 | </a> |
178 | </li> | |
179 | </ul> | |
19b53e5b | 180 | <div class="panel-body"> |
f28caa2c CW |
181 | <table> |
182 | <tr ng-repeat="style in code[selectedTab.code]"> | |
183 | <td>{{:: style.label }}</td> | |
19d01932 | 184 | <td><pre class="prettyprint" ng-bind-html="style.code"></pre></td> |
19b53e5b C |
185 | </tr> |
186 | </table> | |
187 | </div> | |
188 | </div> | |
189 | <div class="panel explorer-result-panel panel-{{ status }}" > | |
b65fa6dc | 190 | <ul class="panel-heading nav nav-tabs"> |
19d01932 CW |
191 | <li role="presentation" ng-class="{active: selectedTab.result === 'result'}"> |
192 | <a href ng-click="selectedTab.result = 'result'"> | |
f28caa2c CW |
193 | <span ng-switch="status"> |
194 | <i class="fa fa-fw fa-circle-o" ng-switch-when="default"></i> | |
195 | <i class="fa fa-fw fa-check-circle" ng-switch-when="success"></i> | |
196 | <i class="fa fa-fw fa-minus-circle" ng-switch-when="danger"></i> | |
197 | <i class="fa fa-fw fa-spinner fa-pulse" ng-switch-when="warning"></i> | |
198 | </span> | |
f9c5f498 | 199 | <span>{{:: ts('Result') }}</span> |
b65fa6dc CW |
200 | </a> |
201 | </li> | |
4cd69277 | 202 | <li role="presentation" ng-if="::perm.accessDebugOutput" ng-class="{active: selectedTab.result === 'debug'}"> |
19d01932 | 203 | <a href ng-click="selectedTab.result = 'debug'"> |
b65fa6dc | 204 | <i class="fa fa-fw fa-{{ debug ? 'bug' : 'circle-o' }}"></i> |
f9c5f498 | 205 | <span>{{:: ts('Debug') }}</span> |
b65fa6dc CW |
206 | </a> |
207 | </li> | |
208 | </ul> | |
19b53e5b | 209 | <div class="panel-body"> |
19d01932 | 210 | <div ng-show="selectedTab.result === 'result'"> |
b65fa6dc CW |
211 | <pre class="prettyprint" ng-repeat="code in result" ng-bind-html="code"></pre> |
212 | </div> | |
4cd69277 | 213 | <div ng-if="::perm.accessDebugOutput" ng-show="selectedTab.result === 'debug'"> |
b65fa6dc | 214 | <pre ng-if="debug" class="prettyprint" ng-bind-html="debug"></pre> |
f28caa2c CW |
215 | <div ng-if="!debug"> |
216 | <p> | |
217 | {{:: ts('To view debugging output, enable the debug param before executing.') }} | |
218 | </p> | |
219 | <p> | |
220 | {{:: ts('Enable backtrace in system settings to see error backtraces.') }} | |
221 | </p> | |
222 | </div> | |
b65fa6dc | 223 | </div> |
19b53e5b C |
224 | </div> |
225 | </div> | |
226 | </div> | |
19b53e5b | 227 | </div> |