<commit_before>//MODULO DE ANGULAR
(function(w, ng){

	var app = ng.module("store", []);
	//CONTROLADOR DE DATOS (mineralGems.json)
	app.controller("StoreController", function($scope, $http){
		$http	.get('data/mineralGems.json')
				.success(function(json, status, headers, config) {
					//creo una propiedad que se llamara 'products', y se la asigno al contexto del controlador 'StoreController' 
					$scope.products = json;
				})
				.error(function(data, status, headers, config) {
					console.log(data+" :: "+status+" :: "+headers+" :: "+config);
				});
	});

	//en angular las expresiones {{tab}} se reevaluan cuando las propiedades cambian [tab = 1]
	//CONTROLADOR DE INITERACCION CON TABS
	var panel = app.controller('PanaleController', function(){
		this.tab = 1; //inicializamos la propiedad
		this.selectedTab = function(setTab){
			this.tab = setTab;
		};
		this.isSelected = function(checkTab){
			return (checkTab === this.tab) ? true : false;
		};
	});

	//CONTROLADORD DE IMAGEN SELECCIONADA
	app.controller("GalleryController", function(){
		this.current = 0; //valor por defecto de imagen product.images[0]
		this.setCurrent = function(select){
			//HAY QUE PASAR : select = product.image.full[select]
			this.current =  (!isEmpty(select)) ? select : 0;
		};
	});

	//CONTROLLER FOR  REVIEW FORM
	app.controller("ReviewController", function(){
		this.review = {};
		this.addReview = function(product){
			this.review.createdOn = new Date();
			product.reviews.push(this.review);
			//primero se añade como nueva propiedad del modelo product y despues se  
			//aqui se formateara en la vista de automaticamente
			this.review = {};//reseteare para que en la siguente vista se muestren los campos vacios
		};
	});

})(window, window.angular);
<commit_msg>app: funcionalidad de directivas html que permiten mostrar semanticamente en html la logica de la app<commit_after>//MODULO DE ANGULAR
(function(w, ng){

	var app = ng.module("store", []);
	//CONTROLADOR DE DATOS (mineralGems.json)
	app.controller("StoreController", function($scope, $http){
		$http	.get('data/mineralGems.json')
				.success(function(json, status, headers, config) {
					//creo una propiedad que se llamara 'products', y se la asigno al contexto del controlador 'StoreController' 
					$scope.products = json;
				})
				.error(function(data, status, headers, config) {
					console.log(data+" :: "+status+" :: "+headers+" :: "+config);
				});
	});

	//en angular las expresiones {{tab}} se reevaluan cuando las propiedades cambian [tab = 1]
	//CONTROLADOR DE INITERACCION CON TABS
	var panel = app.controller('PanaleController', function(){
		this.tab = 1; //inicializamos la propiedad
		this.selectedTab = function(setTab){
			this.tab = setTab;
		};
		this.isSelected = function(checkTab){
			return (checkTab === this.tab) ? true : false;
		};
	});

	//CONTROLADORD DE IMAGEN SELECCIONADA
	app.controller("GalleryController", function(){
		this.current = 0; //valor por defecto de imagen product.images[0]
		this.setCurrent = function(select){
			//HAY QUE PASAR : select = product.image.full[select]
			this.current =  (!isEmpty(select)) ? select : 0;
		};
	});

	//CONTROLLER FOR  REVIEW FORM
	app.controller("ReviewController", function(){
		this.review = {};
		this.addReview = function(product){
			this.review.createdOn = new Date();
			product.reviews.push(this.review);
			//primero se añade como nueva propiedad del modelo product y despues se  
			//aqui se formateara en la vista de automaticamente
			this.review = {};//reseteare para que en la siguente vista se muestren los campos vacios
		};
	});

	// engine template: a traves de directivas ng-include o directivas customizadas puedes importar el contenido de un html desde otro
	// custom directives: permite crear una estructura de html mas escalable y visualmente mas semantica, permitiendonos kincrustrar la logica del modelo de angular en un html aislado (que incluiremos en la vista)

	// el nombre de la directiva en el html (nodo del DOM), en el momento de su implementacion en javascript, se convierte en camelCase
	app.directive("productReviews", function(){
		return { //configuraciones de diretivas html
			//restrict: 'A', //tipo de directiva, A: atributo
			//templateUrl: 'directive/include-product-reviews.tpl.html'
			restrict: 'E', //tipo de directiva, E: elemento html
			templateUrl: 'directive/product-reviews.tpl.html'
		};
	});

	app.directive("productNewReviews", function(){
		return {
			restrict: "E",
			templateUrl: "directive/product-new-reviews.tpl.html"
		};
	});

	app.directive("productDescription", function(){
		return {
			restrict: "A",
			templateUrl: "directive/product-description.tpl.html"
		};
	});

	app.directive("productSpecs", function(){
		return {
			restrict: "A",
			templateUrl: "directive/product-specs.tpl.html"
		};
	});

})(window, window.angular);

{'fraction_non_alphanumeric': 0.13464696223316913, 'fraction_numerical': 0.002052545155993432, 'mean_word_length': 3.9724489795918365, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5948389', 'n_tokens_mistral': 1727, 'n_tokens_neox': 1562, 'n_words': 451}