+ template: '<div id="bootstrap-theme" class="crm-search"><crm-search ng-if="$ctrl.mode === \'create\'" entity="$ctrl.entity" load=":: $ctrl.savedSearch"></crm-search></div>',
+ reloadOnSearch: false,
+ resolve: {
+ // For paths like /load/Group/MySmartGroup, load the group, stash it in the savedSearch variable, and then redirect
+ // For paths like /create/Contact, return the stashed savedSearch if present
+ savedSearch: function($route, $location, $timeout, crmApi4) {
+ var retrievedSearch = savedSearch,
+ getParams,
+ params = $route.current.params;
+ savedSearch = undefined;
+ switch (params.mode) {
+ case 'create':
+ return retrievedSearch;
+
+ case 'load':
+ // Load savedSearch by `id` (the SavedSearch entity doesn't have `name`)
+ if (params.entity === 'SavedSearch' && /^\d+$/.test(params.name)) {
+ getParams = {
+ where: [['id', '=', params.name]]
+ };
+ }
+ // Load attached entity (e.g. Smart Groups) with a join via saved_search_id
+ else if (params.entity === 'Group' && params.name) {
+ getParams = {
+ select: ['id', 'title', 'saved_search_id', 'saved_search.*'],
+ where: [['name', '=', params.name]]
+ };
+ }
+ // In theory savedSearches could be attached to something other than groups, but for now that's not supported
+ else {
+ throw 'Failed to load ' + params.entity;
+ }
+ return crmApi4(params.entity, 'get', getParams, 0).then(function(retrieved) {
+ savedSearch = retrieved;
+ savedSearch.type = params.entity;
+ if (params.entity !== 'SavedSearch') {
+ savedSearch.api_entity = retrieved['saved_search.api_entity'];
+ savedSearch.api_params = retrieved['saved_search.api_params'];
+ savedSearch.form_values = retrieved['saved_search.form_values'];
+ }
+ $timeout(function() {
+ $location.url('/create/' + savedSearch.api_entity);
+ });
+ });
+ }
+ }
+ }