gumga-many-to-one-ng
Version:
Gumga Many To One
1 lines • 19.2 kB
JavaScript
!function(n){function e(a){if(t[a])return t[a].exports;var o=t[a]={i:a,l:!1,exports:{}};return n[a].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var t={};e.m=n,e.c=t,e.i=function(n){return n},e.d=function(n,t,a){e.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:a})},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,"a",t),t},e.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},e.p="",e(e.s=0)}([function(n,e,t){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n};!function(){function n(n,e,t,o){function l(l,i,r,d){var u=this,s=void 0,c=void 0;u.$onInit=function(){function p(){return u.displayClear}function m(){return u.displayInfo}function y(){var n=sessionStorage.getItem("user");return n?(n=JSON.parse(n),(n.instanceOrganizationHierarchyCode||"")+"favorite-"+r.name):"favorite-"+r.name}function f(){return!!u.disabled||(!u.value||!("object"===a(u.value)))}function g(){return!("object"===a(u.value))}function h(){u.visible="typeahead",u.onDeselect&&u.onDeselect({value:angular.copy(u.value)}),delete u.value,document.getElementById("typeahead-"+u.field+"-"+r.value).focus()}function v(){if(u.value)delete u.value,b();else{if(u.isTypeaheadOpen)return;document.getElementById("typeahead-"+u.field+"-"+r.value).focus()}}function b(){u.visible="typeahead",o(function(){u.value=angular.copy(u.inputMatchValue),v(),delete u.inputMatchValue})}function O(){return u.postMethod&&("string"==typeof s.$$rawModelValue||s.$$rawModelValue instanceof String)&&s.$$rawModelValue.length>0}function T(){if(u.inputMatch){var n=document.getElementById("match-"+u.field+"-"+r.value),e=u.inputMatch.replace(/{/g,"{{").replace(/}/g,"}}").replace(/item/g,"manyToOneCtrl.value"),a='<span style="display: none;" id="match-'+u.field+"-"+r.value+'">'+e+"</span>";angular.element(n).replaceWith(t(a)(l)),o(function(){var n=document.getElementById("match-"+u.field+"-"+r.value);u.inputMatchValue=n.innerHTML,u.visible="inputMatchValue"})}else u.visible="typeahead"}function $(n,e,t,a,o,l){T(),!e.id&&u.authorizeAdd&&u.proxySave(e,o),s.$setValidity("manyToOne",!0),u.ev.onSelect&&u.ev.onSelect({value:e})}function C(){function n(n,e){n.close=function(){return e.close()}}var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=arguments[1];u.isTypeaheadOpen=!0,a.stopImmediatePropagation(),a.preventDefault(),n.$inject=["$scope","$uibModalInstance"];var o='\n <div class="modal-header">\n <h3 class="modal-title">'+u.modalTitle+'</h3>\n </div>\n <div class="modal-body">\n '+function(){return u.modalFields.reduce(function(n,e){return n+='\n <div class="form-group">\n '+("string"==typeof t[e]||t[e]instanceof String?"<label>"+e+"</label>":" ")+"\n "+("string"==typeof t[e]||t[e]instanceof String?'<input type="text" class="form-control" value="'+t[e]+'" disabled />':" ")+"\n </div>"}," ")}()+"\n </div>\n ";e.open({controller:n,template:o})}function x(n,e,t){var a="";if(t){var o=new Date;o.setTime(o.getTime()+24*t*60*60*1e3),a="; expires="+o.toUTCString()}document.cookie=n+"="+(e||"")+a+"; path=/"}function w(n){for(var e=n+"=",t=document.cookie.split(";"),a=0;a<t.length;a++){for(var o=t[a];" "==o.charAt(0);)o=o.substring(1,o.length);if(0==o.indexOf(e))return o.substring(e.length,o.length)}return null}function V(n){document.cookie=n+"=; Max-Age=-99999999;"}var M={noValue:"É necessário um atributo value no componente gumgaManyToOne",noField:"É necessário um atributo field no componente gumgaManyToOne",noSearch:"É necessário uma função de busca no componente gumgaManyToOne"},I=["loadingText","onSelect","value","list","searchMethod","field","onNewValueAdded","onValueSelected","onValueVisualizationOpened","onValueVisualizationClosed","tabindex"],S=!1,z=w(y());z&&(u.favoriteModel=JSON.parse(z)),r.debug&&u.activeFavorite&&console.log("Cookie: ",w(y())),r.debug&&(console.log("ngModel: ",u.value),console.log("activeFavorite: ",u.activeFavorite)),!u.value&&u.favoriteModel&&u.activeFavorite&&(u.value=angular.copy(u.favoriteModel)),r.value||console.error(M.noValue),r.field||console.error(M.noField),u.ev={},u.list=u.list||[],u.ev.onNewValueAdded=r.onNewValueAdded?u.onNewValueAdded:angular.noop,u.ev.onSelect=r.onSelect?u.onSelect:angular.noop,u.ev.onValueVisualizationOpened=r.onValueVisualizationOpened?r.onValueVisualizationOpened:angular.noop,u.ev.onValueVisualizationClosed=r.onValueVisualizationClosed?r.onValueVisualizationClosed:angular.noop,u.field=r.field||"",u.modalTitle=r.modalTitle||"Visualizador de Registro",u.modalFields=r.modalFields?r.modalFields.split(","):[u.field],u.postFields=r.postFields?r.postFields.split(","):[u.field],u.displayClear=!u.hasOwnProperty("displayClear")||u.displayClear,u.displayInfo=!u.hasOwnProperty("displayInfo")||u.displayInfo,u.editable=!u.hasOwnProperty("editable")||u.editable,u.async=!u.hasOwnProperty("async")||u.async,u.displayInfoButton=m,u.modelValueIsObject=f,u.disabledDisplayInfo=g,u.displayPlusButton=O,u.displayClearButton=p,u.clearModel=h,u.openInfo=C,u.valueToAdd="",u.afterSelect=$,u.openTypehead=v,u.showTypeheadAndHideMatch=b,u.proxySearch=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return u.async?u.searchMethod({param:n}).then(function(e){if(e.filter(function(e){return e[u.field]==n}).length>0||!u.authorizeAdd)return e;if(n){var t={};return t[u.field]=u.valueToAdd,e.concat(t)}return e}):(n&&(n=n.toLowerCase()),u.list.filter(function(e){return-1!=e[u.field].toLowerCase().indexOf(n)}))},u.proxySave=function(n,t){function a(n,e,t){var a=this;a.object=t,a.cancel=function(n){return e.dismiss("cancel")},a.save=function(n){return e.close(n)}}if(t){u.isTypeaheadOpen=!0;var o={value:function(){return n}};a.$inject=["$scope","$uibModalInstance","value"];var l='\n <div class="modal-header">\n <h3 class="modal-title">'+u.modalTitle+'</h3>\n </div>\n <div class="modal-body">\n <form name="formNew">\n '+function(){return u.postFields.reduce(function(n,e){var t=-1!=e.indexOf(":")?e.trim().substring(0,e.indexOf(":")):e.trim(),a=-1!=e.indexOf(":")?e.trim().substring(e.indexOf(":")+1,e.length):"false";return n+='\n <div class="form-group">\n <label>'+t+'</label>\n <input type="text" class="form-control" '+("required"==a?a:"")+' ng-model="ctrl.object.'+t+'" />\n </div>'}," ")}()+'\n </form>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" ng-click="ctrl.cancel(ctrl.object)">Retornar</button>\n <button type="button" class="btn btn-primary" ng-disabled="!formNew.$valid" ng-click="ctrl.save(ctrl.object)">Salvar</button>\n </div>';e.open({controller:a,template:l,controllerAs:"ctrl",resolve:o}).result.then(function(n){u.postMethod({value:n}).then(function(n){u.value=n.data.data,s.$viewValue=n.data.data})},function(n){delete u.value})}},u.isTypeaheadOpen=!0,d(l,function(n){angular.forEach(n,function(n){var e=angular.element(n)[0];e.nodeName&&"MATCH"===e.nodeName&&(S=!0,u.match=e.innerHTML)})}),u.keyUp=function(n){n.target.value},u.favorite=function(n,e){if(angular.equals(e,u.favoriteModel))return V(y()),void delete u.favoriteModel;x(y(),JSON.stringify(e),999999),u.favoriteModel=e},u.isFavorite=function(n){return angular.equals(n,u.favoriteModel)},u.inputBlur=function(n){delete u.noResults,u.value||(s.$viewValue="",s.$render())};var F='\n <style>\n gumga-many-to-one [uib-typeahead-popup].dropdown-menu{\n width: 100%;\n }\n gumga-many-to-one a.result {\n display: flex;\n height: 42px;\n align-items: center;\n }\n gumga-many-to-one a.result > span.str{\n display: flex;\n }\n gumga-many-to-one input{\n color: #999 !important;\n padding-right: 32px;\n font-size: 1.6rem !important;\n }\n gumga-many-to-one button.left-button{\n padding: 0; width: 32px; padding-top: 10px; padding-bottom: 3px;\n }\n gumga-many-to-one input.form-control.ng-valid-many-to-one{\n color: #555 !important;\n }\n gumga-many-to-one i.favorite{\n color: #ccc;\n }\n gumga-many-to-one i.favorite.full{\n color: #d9d90d;\n }\n gumga-many-to-one i.favorite:hover{\n cursor: pointer; \n }\n gumga-many-to-one .input-group button.btn[ng-click="manyToOneCtrl.openTypehead()"]{\n z-index: 9;\n }\n gumga-many-to-one .progress {\n max-width: 100%;\n overflow: hidden;\n background: #ddd;\n left: 0;\n width: 100%;\n border-radius: 0;\n height: 2px;\n bottom: 0;\n margin: 0;\n padding: 0;\n bottom: 0;\n height: 3px;\n z-index: 4;\n }\n gumga-many-to-one .indeterminate {\n position: absolute;\n width: 100%;\n height: 2px;\n transform: translateZ(0);\n }\n gumga-many-to-one .indeterminate:before, .indeterminate:after {\n content: \'\';\n position: absolute;\n background-color: #001eff;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n gumga-many-to-one .indeterminate:before {\n animation: indeterminate 3s cubic-bezier(0.195, 0.36, 0.945, 1.65) infinite;\n }\n gumga-many-to-one .indeterminate:after {\n animation: indeterminate 3s cubic-bezier(0.9, -0.59, 0.715, 1.045) infinite;\n }\n \n @keyframes indeterminate {\n 0% {\n width: 0%;\n transform: translateX(-100%);\n }\n 100% {\n width: 100%;\n transform: translateX(100%);\n }\n }\n gumga-many-to-one input.form-control.gmd.size-55{\n padding-right: 55px;\n }\n gumga-many-to-one input.form-control.gmd.size-25{\n padding-right: 25px;\n }\n </style>\n <div style="position: relative;">\n <div class="progress indeterminate" ng-show="manyToOneCtrl.typeaheadLoading"></div>\n <div style="width: 100%;" ng-class="{\'input-group\': (manyToOneCtrl.displayInfoButton() && manyToOneCtrl.modelValueIsObject()) || manyToOneCtrl.displayClearButton()}">\n <input type="text"\n ng-init="manyToOneCtrl.visible = \'typeahead\'"\n ng-show="manyToOneCtrl.visible == \'typeahead\'"\n id="typeahead-'+u.field+"-"+r.value+'"\n class="form-control gmd inputahead"\n tabindex="'+u.tabSeq+'"\n ng-disabled="manyToOneCtrl.disabled"\n ng-readonly="manyToOneCtrl.readonly"\n ng-model="manyToOneCtrl.value"\n ng-blur="manyToOneCtrl.inputBlur($event)"\n onfocus="this.classList.add(\'focused\')"\n ng-class="{\'size-25\' : manyToOneCtrl.modelValueIsObject() && manyToOneCtrl.displayClearButton(), \'size-55\' : !(manyToOneCtrl.modelValueIsObject() && manyToOneCtrl.displayClearButton())}"\n ng-keyup="manyToOneCtrl.keyUp($event)"\n onblur="this.classList.remove(\'focused\')"\n ng-model-options="{ debounce: '+(u.debounce||1e3)+' }"\n uib-typeahead="$value as $value[manyToOneCtrl.field] for $value in manyToOneCtrl.proxySearch($viewValue)"\n typeahead-loading="manyToOneCtrl.typeaheadLoading" '+function(){var n=function(n){return I.filter(function(e){return n==e}).length>0};return Object.keys(r.$attr).filter(function(e){return!n(e)}).reduce(function(n,e){return n+=e+'="'+r[e]+'"'},"")}()+'\n typeahead-template-url="manyToOneTemplate'+u.field+"-"+r.value+'.html"\n typeahead-is-open="manyToOneCtrl.isTypeaheadOpen"\n typeahead-editable="'+u.editable+'"\n typeahead-show-hint="true"\n typeahead-min-length="0"\n typeahead-on-select="manyToOneCtrl.afterSelect($item, $model, $label, $event, \'isNotButton\', manyToOneCtrl.match)"\n typeahead-no-results="manyToOneCtrl.noResults"\n autocomplete="off"/>\n <div ng-show="manyToOneCtrl.noResults" style="position: absolute; left: 0; width: 100%; top: 34px; background: #FFF; z-index: 999; padding: 15px; border-top: 1px solid #ccc; box-shadow: 0 2px 4px rgba(0,0,0,0.175);">\n {{'+u.messageNoResult+' || \'Nenhum resultado foi encontrado.\'}}\n </div>\n <input type="text" ng-keyup="manyToOneCtrl.showTypeheadAndHideMatch()" ng-model="manyToOneCtrl.inputMatchValue" class="form-control" ng-show="manyToOneCtrl.visible == \'inputMatchValue\'"/>\n <div ng-show="manyToOneCtrl.typeaheadLoading && manyToOneCtrl.loadingText" style="position: absolute; top: 40px;">\n <i class="glyphicon glyphicon-refresh"></i>\n {{manyToOneCtrl.loadingText}}\n </div>\n <span ng-hide="true" id="match-'+u.field+"-"+r.value+'"></span>\n <div class="input-group-btn input-group-btn-icon" style="position: absolute; right: {{manyToOneCtrl.modelValueIsObject() && manyToOneCtrl.displayClearButton() ? \'25px;\' : \'55px;\'}};" ng-show="(manyToOneCtrl.displayInfoButton() && manyToOneCtrl.modelValueIsObject()) || manyToOneCtrl.displayClearButton()">\n <button type="button" style="z-index: 9;" class="left-button btn btn-default gmd" ng-show="!manyToOneCtrl.modelValueIsObject() && manyToOneCtrl.displayClearButton()" ng-click="manyToOneCtrl.clearModel()">\n <i ng-show="manyToOneCtrl.useGumgaLayout()" class="material-icons" style="font-size: 15px;">close</i>\n <i ng-show="!manyToOneCtrl.useGumgaLayout()" class="glyphicon glyphicon-remove" style="font-size: 15px;"></i>\n </button>\n <button type="button" class="btn btn-default gmd"\n style="padding-bottom: 7px;"\n ng-click="manyToOneCtrl.openTypehead()">\n <span class="caret"></span> \n </button>\n <button type="button" class="btn btn-default gmd" ng-show="!manyToOneCtrl.modelValueIsObject() && manyToOneCtrl.displayInfoButton()" ng-disabled="manyToOneCtrl.disabledDisplayInfo()" ng-click="manyToOneCtrl.openInfo(manyToOneCtrl.value, $event)">\n <span class="glyphicon glyphicon-info-sign"></span>\n </button>\n </div>\n </div>\n </div>',k=S?"<span>"+u.match+"</span>":'<span ng-bind-html="match.model.'+u.field+' | uibTypeaheadHighlight:query"></span>',j='\n <a class="col-md-12 result gmd" style="white-space: normal;">\n <span class="col-md-10 str" ng-click="manyToOneCtrl.select()">\n '+k+'\n <span ng-show="$parent.$parent.$parent.$parent.manyToOneCtrl.valueToAdd == match.label && $parent.$parent.$parent.$parent.manyToOneCtrl.valueToAdd.length > 0 && !match.model.id && !!$parent.$parent.$parent.$parent.manyToOneCtrl.authorizeAdd">(novo)</span><br>\n </span>\n <span class="col-md-2">\n <span class="icon text-right" ng-if="'+u.displayInfo+'" ng-click="$parent.$parent.$parent.$parent.manyToOneCtrl.openInfo(match.model, $event)" ng-hide="$parent.$parent.$parent.$parent.manyToOneCtrl.valueToAdd == match.label && !match.label.id">\n <span class="glyphicon glyphicon-info-sign"></span>\n </span>\n <span style="float: right;" ng-show="$parent.$parent.$parent.$parent.manyToOneCtrl.activeFavorite">\n <i ng-show="!$parent.$parent.$parent.$parent.manyToOneCtrl.isFavorite(match.model)" \n title="Favoritar"\n ng-click="$parent.$parent.$parent.$parent.manyToOneCtrl.favorite($event, match.model)" \n class="material-icons favorite">star_border</i>\n\n <i ng-show="$parent.$parent.$parent.$parent.manyToOneCtrl.isFavorite(match.model)"\n title="Favoritar" \n ng-click="$parent.$parent.$parent.$parent.manyToOneCtrl.favorite($event, match.model)" \n class="material-icons favorite full">star</i>\n </span>\n </span>\n <div class="clearfix"></div>\n </a>\n ';n.put("manyToOneTemplate"+u.field+"-"+r.value+".html",j);for(var A=angular.element(F),B=A.find("input"),N=i.parent();"FORM"!=N[0].nodeName;)N=N.parent();var L=l.$parent[N.attr("name")];i.append(t(A)(l)),s=B.controller("ngModel"),c=angular.copy(s),L.$addControl(s),s.$viewChangeListeners.push(function(){}),s.$validators.manyToOne=function(n,e){return!n||!("string"==typeof n||n instanceof String)},u.useGumgaLayout=function(){try{return!!angular.module("gumga.layout")}catch(n){return!1}},f()||T(),l.$watch(function(){return s.$$rawModelValue},function(n){""==s.$$rawModelValue?(delete s.$$rawModelValue,delete u.value):u.valueToAdd=s.$$rawModelValue})}}return l.$inject=["$scope","$element","$attrs","$transclude"],{restrict:"E",replace:!0,transclude:!0,scope:{value:"=",loadingText:"@?",inputMatch:"@?",searchMethod:"&",postMethod:"&?",onSelect:"&?",activeFavorite:"=?",onDeselect:"&?",list:"=?",authorizeAdd:"=?",disabled:"=?",readonly:"=?",displayInfo:"=?",displayClear:"=?",editable:"=?",tabSeq:"=?",async:"=?",debounce:"@?"},controllerAs:"manyToOneCtrl",bindToController:!0,controller:l}}n.$inject=["$templateCache","$uibModal","$compile","$timeout"],angular.module("gumga.manytoone",["ui.bootstrap"]).directive("gumgaManyToOne",n)}()}]);