@stratusjs/idx
Version:
AngularJS idx/property Service and Components bundle to be used as an add on to StratusJS
336 lines (334 loc) • 18.6 kB
JavaScript
System.register(["lodash", "@stratusjs/runtime/stratus", "angular", "angular-material", "angular-sanitize", "@stratusjs/angularjs/services/collection", "@stratusjs/core/misc", "@stratusjs/core/environment"], function (exports_1, context_1) {
"use strict";
var lodash_1, stratus_1, angular_1, collection_1, misc_1, environment_1, min, packageName, moduleName, componentName, localDir;
var __moduleName = context_1 && context_1.id;
return {
setters: [
function (lodash_1_1) {
lodash_1 = lodash_1_1;
},
function (stratus_1_1) {
stratus_1 = stratus_1_1;
},
function (angular_1_1) {
angular_1 = angular_1_1;
},
function (_1) {
},
function (_2) {
},
function (collection_1_1) {
collection_1 = collection_1_1;
},
function (misc_1_1) {
misc_1 = misc_1_1;
},
function (environment_1_1) {
environment_1 = environment_1_1;
}
],
execute: function () {
min = !environment_1.cookie('env') ? '.min' : '';
packageName = 'idx';
moduleName = 'office';
componentName = 'list';
localDir = `${stratus_1.Stratus.BaseUrl}${stratus_1.Stratus.DeploymentPath}@stratusjs/${packageName}/src/${moduleName}/`;
stratus_1.Stratus.Components.IdxOfficeList = {
bindings: {
elementId: '@',
tokenUrl: '@',
urlLoad: '@',
searchOnLoad: '@',
detailsLinkPopup: '@',
detailsLinkUrl: '@',
detailsLinkTarget: '@',
orderOptions: '@',
query: '@',
queryService: '@',
template: '@',
variableSync: '@'
},
controller($anchorScroll, $attrs, $q, $mdDialog, $timeout, $scope, $window, Idx) {
$scope.uid = misc_1.safeUniqueId(packageName, moduleName, componentName);
$scope.elementId = $attrs.elementId || $scope.uid;
stratus_1.Stratus.Instances[$scope.elementId] = $scope;
if ($attrs.tokenUrl) {
Idx.setTokenURL($attrs.tokenUrl);
}
let defaultOptions;
let defaultQuery;
let lastQuery;
const init = async () => {
$scope.urlLoad = $attrs.urlLoad && misc_1.isJSON($attrs.urlLoad) ? JSON.parse($attrs.urlLoad) : false;
$scope.searchOnLoad = $attrs.searchOnLoad && misc_1.isJSON($attrs.searchOnLoad) ? JSON.parse($attrs.searchOnLoad) : false;
$scope.detailsLinkPopup = $attrs.detailsLinkPopup && misc_1.isJSON($attrs.detailsLinkPopup) ?
JSON.parse($attrs.detailsLinkPopup) : true;
$scope.detailsLinkUrl = $attrs.detailsLinkUrl || '/property/office/details';
$scope.detailsLinkTarget = $attrs.detailsLinkTarget || '_self';
$scope.query = $attrs.query && misc_1.isJSON($attrs.query) ? JSON.parse($attrs.query) : {};
$scope.query.service = $attrs.queryService && misc_1.isJSON($attrs.queryService) ?
JSON.parse($attrs.queryService) : $scope.query.service || [];
$scope.query.order =
$scope.query.order && lodash_1.isString($scope.query.order) && misc_1.isJSON($scope.query.order) ? JSON.parse($scope.query.order) :
$attrs.queryOrder && misc_1.isJSON($attrs.queryOrder) ? JSON.parse($attrs.queryOrder) : $scope.query.order || null;
$scope.query.page ??= null;
$scope.query.perPage ??=
($attrs.queryPerPage && lodash_1.isString($attrs.queryPerPage) ? parseInt($attrs.queryPerPage, 10) : null) ||
($attrs.queryPerPage && lodash_1.isNumber($attrs.queryPerPage) ? $attrs.queryPerPage : null) ||
25;
$scope.query.where = $attrs.queryWhere && misc_1.isJSON($attrs.queryWhere) ? JSON.parse($attrs.queryWhere) : $scope.query.where || [];
defaultOptions = JSON.parse(JSON.stringify($scope.query.where));
defaultQuery = JSON.parse(JSON.stringify($scope.query.where));
Idx.registerListInstance($scope.elementId, moduleName, $scope);
if ($scope.searchOnLoad) {
await $scope.search($scope.query, false, false);
}
$scope.$applyAsync(() => {
$scope.initialized = true;
Idx.emit('init', $scope);
});
};
this.$onInit = () => {
$scope.Idx = Idx;
$scope.collection = new collection_1.Collection({});
let initNow = true;
if (Object.prototype.hasOwnProperty.call($attrs.$attr, 'initNow')) {
initNow = misc_1.isJSON($attrs.initNow) ? JSON.parse($attrs.initNow) : false;
}
if (initNow) {
init().then();
return;
}
const stopWatchingInitNow = $scope.$watch('$ctrl.initNow', (initNowCtrl) => {
if (initNowCtrl !== true) {
return;
}
if (!$scope.initialized) {
init().then();
}
stopWatchingInitNow();
});
};
$scope.$watch('collection.models', () => {
if ($scope.collection.completed) {
Idx.emit('collectionUpdated', $scope, lodash_1.clone($scope.collection));
}
});
$scope.getPageModels = () => {
const offices = [];
const models = $scope.collection.models;
models.slice(($scope.query.perPage * ($scope.query.page - 1)), ($scope.query.perPage * $scope.query.page)).forEach((member) => {
offices.push(member);
});
return offices;
};
$scope.scrollToModel = (model) => {
$anchorScroll(`${$scope.elementId}_${model._id}`);
};
$scope.search = async (query, refresh, updateUrl) => $q(async (resolve) => {
query ??= {};
updateUrl = updateUrl === false ? updateUrl : true;
if (Object.keys(query.where).length > 0) {
$scope.query.where = query.where;
}
if (query.where.page) {
query.page = query.where.page;
delete query.where.page;
}
if (query.where.Page) {
query.page = query.where.Page;
delete query.where.Page;
}
if (query.page) {
$scope.query.page = query.page;
}
if (refresh) {
$scope.query.page = 1;
}
if (query.where.order) {
query.order = query.where.order;
delete query.where.order;
}
if (query.where.Order) {
query.order = query.where.Order;
delete query.where.Order;
}
if (query.order) {
$scope.query.order = query.order;
}
if (query.hasOwnProperty('service') &&
!lodash_1.isNil(query.service)) {
$scope.query.service = query.service;
}
Idx.emit('searching', $scope, lodash_1.clone($scope.query));
try {
const results = await Idx.fetchOffices($scope.elementId, 'collection', $scope.query, refresh);
lastQuery = lodash_1.cloneDeep($scope.query);
Idx.emit('searched', $scope, lodash_1.clone($scope.query));
resolve(results);
}
catch (e) {
console.error('Unable to fetchMembers:', e);
}
});
$scope.pageChange = async (pageNumber, ev) => {
if ($scope.collection.pending) {
return;
}
Idx.emit('pageChanging', $scope, lodash_1.clone($scope.query.page));
if (ev) {
ev.preventDefault();
}
$scope.query.page = pageNumber;
await $scope.search();
Idx.emit('pageChanged', $scope, lodash_1.clone($scope.query.page));
};
$scope.pageNext = async (ev) => {
if ($scope.collection.pending) {
return;
}
if (!$scope.query.page) {
$scope.query.page = 1;
}
if ($scope.collection.completed && $scope.query.page < $scope.collection.meta.data.totalPages) {
if (lodash_1.isString($scope.query.page)) {
$scope.query.page = parseInt($scope.query.page, 10);
}
await $scope.pageChange($scope.query.page + 1, ev);
}
};
$scope.pagePrevious = async (ev) => {
if ($scope.collection.pending) {
return;
}
if (!$scope.query.page) {
$scope.query.page = 1;
}
if ($scope.collection.completed && $scope.query.page > 1) {
if (lodash_1.isString($scope.query.page)) {
$scope.query.page = parseInt($scope.query.page, 10);
}
const prev = $scope.query.page - 1 || 1;
await $scope.pageChange(prev, ev);
}
};
$scope.orderChange = async (order, ev) => {
if ($scope.collection.pending) {
return;
}
Idx.emit('orderChanging', $scope, lodash_1.clone(order));
if (ev) {
ev.preventDefault();
}
$scope.query.order = order;
await $scope.search(null, true, true);
Idx.emit('orderChanged', $scope, lodash_1.clone(order));
};
$scope.highlightModel = (model, timeout) => {
timeout ??= 0;
model._unmapped ??= {};
$scope.$applyAsync(() => {
model._unmapped._highlight = true;
});
if (timeout > 0) {
$timeout(() => {
$scope.unhighlightModel(model);
}, timeout);
}
};
$scope.unhighlightModel = (model) => {
if (model) {
model._unmapped ??= {};
$scope.$applyAsync(() => {
model._unmapped._highlight = false;
});
}
};
$scope.displayModelDetails = (model, ev) => {
if (ev) {
ev.preventDefault();
}
if ($scope.detailsLinkPopup === true) {
const templateOptions = {
element_id: 'property_member_detail_popup',
service: model._ServiceId,
'member-key': model.MemberKey,
'page-title': true
};
if ($scope.googleApiKey) {
templateOptions['google-api-key'] = $scope.googleApiKey;
}
let template = '<md-dialog aria-label="' + model.MemberKey + '">' +
'<stratus-idx-member-details ';
lodash_1.forEach(templateOptions, (optionValue, optionKey) => {
template += `${optionKey}='${optionValue}'`;
});
template +=
'></stratus-idx-member-details>' +
'</md-dialog>';
$mdDialog.show({
template,
parent: angular_1.element(document.body),
targetEvent: ev,
clickOutsideToClose: true,
fullscreen: true
})
.then(() => {
}, () => {
Idx.setPageTitle();
$timeout(() => Idx.unregisterDetailsInstance('property_member_detail_popup', 'member'), 10);
});
}
else {
$window.open($scope.getDetailsURL(model), $scope.detailsLinkTarget);
}
};
$scope.variableInject =
async (member) => {
$scope.variableSyncing = $attrs.variableSync && misc_1.isJSON($attrs.variableSync) ? JSON.parse($attrs.variableSync) : {};
Object.keys($scope.variableSyncing).forEach(elementId => {
const varElement = Idx.getInput(elementId);
if (varElement) {
if (Object.prototype.hasOwnProperty.call(member, $scope.variableSyncing[elementId])) {
varElement.val(member[$scope.variableSyncing[elementId]]);
}
else if ($scope.variableSyncing[elementId] === 'MemberFullName' &&
Object.prototype.hasOwnProperty.call(member, 'MemberFirstName') &&
Object.prototype.hasOwnProperty.call(member, 'MemberLastName')) {
varElement.val(member.MemberFirstName + ' ' + member.MemberLastName);
}
else if ($scope.variableSyncing[elementId] === 'MemberFirstName' &&
!Object.prototype.hasOwnProperty.call(member, 'MemberFirstName') &&
Object.prototype.hasOwnProperty.call(member, 'MemberFullName')) {
const nameArray = member.MemberFullName.split(' ');
const firstName = nameArray.shift();
varElement.val(firstName);
}
else if ($scope.variableSyncing[elementId] === 'MemberLastName' &&
!Object.prototype.hasOwnProperty.call(member, 'MemberLastName') &&
Object.prototype.hasOwnProperty.call(member, 'MemberFullName')) {
const nameArray = member.MemberFullName.split(' ');
const lastName = nameArray.join(' ');
varElement.val(lastName);
}
else if ($scope.variableSyncing[elementId] === 'OfficeNumber') {
if (Object.prototype.hasOwnProperty.call(member, 'OfficeMlsId')) {
varElement.val(member.OfficeMlsId);
}
else if (Object.prototype.hasOwnProperty.call(member, 'OfficeKey')) {
varElement.val(member.OfficeKey);
}
}
}
});
};
$scope.on = (emitterName, callback) => Idx.on($scope.elementId, emitterName, callback);
$scope.remove = () => {
};
},
templateUrl: ($attrs) => `${localDir}${$attrs.template || componentName}.component${min}.html`
};
}
};
});
//# sourceMappingURL=list.component.js.map