UNPKG

betsol-ng-entity-list

Version:

Automatic entity lists for Angular.js

9 lines 4.78 kB
/** * betsol-ng-entity-list - Automatic entity lists for Angular.js * @version v0.4.0 * @link https://github.com/betsol/ng-entity-list * @license MIT * * @author Slava Fomin II <s.fomin@betsol.ru> */ !function(window,angular,moment){"use strict";function normalizeScheme(e){return e=angular.extend({},defaultScheme,e),angular.forEach(e.fields,function(t,n){t=angular.extend({},defaultField,t),t.name=n,applyTransformers(t,n),e.fields[n]=t}),e}function applyTransformers(e,t){angular.forEach(fieldTransformers,function(n){if(e.type==n.type){if("function"!=typeof n.transformer)return console.log("Missing transformer function"),void 0;n.transformer(e,t)}})}function getDefaultFormatters(){var e={};return e.default=function(e){return e},e.email=function(e){return e.toLowerCase()},e.skype=function(e){return e.toLowerCase()},e.date=function(e,t){return moment&&moment.isMoment(e)?e.format(t.format||"D.M.YY"):e instanceof Date?e.toString():void 0},e.datetime=function(e,t){return moment&&moment.isMoment(e)?e.format(t.format||"DD.MM.YY HH:mm:ss"):e instanceof Date?e.toString():void 0},e}var defaultScheme={fields:{},edit:!0,"delete":!0},defaultField={name:"",title:"",type:"string"},defaultTemplateUrl="templates/entity-list.html",defaultItemsPerPage=50,fieldTransformers=[];angular.module("betsol.entityList",["ui.router","betsol.paginator","ngDropdowns","angular-inview"]).provider("EntityListConfig",function(){var e=defaultTemplateUrl,t={setTemplateUrl:function(t){return e=t,this},getTemplateUrl:function(){return e}};return t.$get=function(){return t},t}).directive("bsEntityList",["EntityListConfig",function(EntityListConfig){return{restrict:"E",scope:{config:"="},templateUrl:function(){return EntityListConfig.getTemplateUrl()},controller:["$scope","$state","Paginator",function($scope,$state,Paginator){var defaultConfig={baseStateName:"",repository:null,scheme:null,itemsPerPage:50,formatters:getDefaultFormatters(),criteria:null,sortParams:null,fieldTransformers:[]},config=angular.extend({},defaultConfig,$scope.config);if(!config.baseStateName)return console.log("Missing base state name");if(!config.repository)return console.log("Missing repository");fieldTransformers=fieldTransformers.concat(config.fieldTransformers);var repository=config.repository,scheme=normalizeScheme(config.scheme||{}),paginator=new Paginator(repository.find).setItemsPerPage(config.itemsPerPage||defaultItemsPerPage);config.criteria&&paginator.setCriteria(config.criteria),config.sortParams&&paginator.setSorting(config.sortParams),paginator.first(),$scope.baseStateName=config.baseStateName,$scope.scheme=scheme,$scope.paginator=paginator,scheme.delete&&($scope.delete=function(e){window.confirm("Вы уверены, что хотите удалить «"+e.title+"»?")&&repository.delete(e.id).then(function(){paginator.first()}).catch(function(){alert("Не удалось удалить запись")})}),$scope.renderValue=function(entity,field){var value;value="function"==typeof field.value?field.value(entity):field.value?field.value:eval("entity."+field.name);var formatter=config.formatters[field.type]||config.formatters.default;return formatter(value,field)},$scope.getClassForEntity=function(e){if("function"==typeof config.rowDecorator){var t=config.rowDecorator(e);return t.className}return""},$scope.$emit("bs.entity-list.init",{getPaginator:function(){return $scope.paginator}})}]}}]).directive("entityField",["$compile","$state",function(e,t){function n(e,t){var n=$("<"+t+"/>");return e.append(n),n.after("\n"),n}function r(e,n){if(e.stateName){var r={};return"function"==typeof e.params&&(r=e.params(n)),t.href(e.stateName,r)}return e.url?"function"==typeof e.url?e.url(n):e.url:"#"}function i(e,t){return"function"==typeof t?t(e):t}return{restrict:"E",scope:!1,link:function(t,a){var o=t.field,f=t.entity,l="span";o.link&&(l="a");var s=$("<"+l+"/>");o.link&&(s.attr("href",r(o.link,f)),o.link.target&&s.attr("target",o.link.target)),o.tooltip&&s.attr("title",i(f,o.tooltip)),o.classNames&&angular.forEach(o.classNames,function(e,t){e=i(f,e),e&&s.addClass(t)}),o.icon&&n(s,"span").addClass(i(f,o.icon)),o.image&&o.image.url&&n(s,"img").attr("src",i(f,o.image.url));var u="renderValue(entity, field)";o.filter&&(u+=" | "+(Array.isArray(o.filter)?o.filter.join(" | "):o.filter)),s.append($("<span/>").attr("ng-bind",u)),s=e(s)(t),a.append(s),t.value=t.entity[t.field.name]}}}]),fieldTransformers.push({type:"email",transformer:function(field,fieldName){field.link||(field.link={url:function(entity){return"mailto:"+eval("entity."+fieldName)}})}}),fieldTransformers.push({type:"skype",transformer:function(field,fieldName){field.link||(field.link={url:function(entity){return"skype:"+eval("entity."+fieldName)+"?chat"}})}})}(window,angular,window.moment);