Icone Mini momie.png Wiki zombi

Ce wiki n'est plus entretenu. Les informations qui y sont contenues sont pour la plupart obsolètes.

MediaWiki:CompositeListField.js

De Le wiki Final Fantasy XIV Online - JeuxOnLine
Sauter à la navigation Sauter à la recherche

Note : après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac)
  • Google Chrome : appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac)
  • Internet Explorer : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5
  • Opera : allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité & sécurité → Effacer les données d’exploration → Images et fichiers en cache.
mw.loader.using('jquery.ui.sortable', function()
{
$.widget( "custom.wiki_CompositeListField", {

	// the constructor
	_create: function() {

		this.textarea = $("textarea", this.element).hide();

		this.select = $("<ul>")
			.sortable({placeholder: "ui-state-highlight", axis: "y", handle: ".handle"});
		this.element.append(this.select);

		this.formsDatas = $.parseJSON($(".ListFieldForms", this.element).text());

		var $forms = {};
		var $addButtons = $("<div>");
		var $floatingForms = $('<div>');
		for(var template in this.formsDatas)
		{
			$forms[template] = this._createForm(this.formsDatas[template]);
			$floatingForms.append($forms[template]);
			this.currentForm = $forms[template];
			
			var $addButton = $('<input type="button" template="'+template+'" value="Ajouter un(e) '+this.formsDatas[template]['nom']+'">');
			$addButtons.append($addButton);
		}

		var $validateButton = $('<input type="button" value="Valider">');
		var $cancelButton = $('<input type="button" value="Annuler">');
		var $removeButton = $('<input type="button" value="Supprimer">');
		var $formButtons = $("<div>").append([$validateButton, $cancelButton, $removeButton]).hide();
		$floatingForms.append($formButtons);

		this.element.append([$floatingForms, $addButtons]);

		this.data = {}
		this.count = 0;
		var self = this;

		// lit les données du textarea au chargement de la page
		if(this.textarea.val())
		{
			var mainRegex = /{{(.*?)\|(.*)}}/g;
			var subRegex = /(.*?)=(.*?)(\||$)/g;	
			var item, itemParam;
			while(item = mainRegex.exec(this.textarea.val()))
			{
				var itemData = {};
				itemData['template'] = item[1];
				var values = item[2];
				while(itemParam = subRegex.exec(values))
				{
					itemData[itemParam[1]] = itemParam[2];
				}
				var itemId = this.count;
				this._newLine(itemData['template']);
				this._setValue(itemId, itemData);
			}
		}

		// Ajouter un objet
		$("input", $addButtons).on('click', function()
		{
			self._newLine($(this).attr('template'));
		});

		// Valider un ajout ou une modification
		$validateButton.on('click', function()
		{
			var data = {};
			$("input, select", self.currentForm).each(function()
			{
				$this = $(this);
				data[$this.attr('name')] = $this.val();
			});
			self._setValue($("li.selected").attr('item'), data);

			// toggle form
			$addButtons.show();
			self.currentForm.hide();
			$formButtons.hide();

			self._refreshText();
		});

		// Annuler une modification
		$cancelButton.on('click', function()
		{
			$("li.selected").removeClass("selected");

			// toggle form
			$addButtons.show();
			self.currentForm.hide();
			$formButtons.hide();
		});

		// Supprimer une ligne
		$removeButton.on('click', function()
		{
			self._removeValue($("li.selected").attr('item'));

			// toggle form
			$addButtons.show();
			self.currentForm.hide();
			$formButtons.hide();

			self._refreshText();
		});

		// Selectionner une ligne
		this.select.on('click', 'li', function()
		{
			self.currentForm.hide();
			var $this = $(this);
			$this.addClass("selected").siblings().removeClass("selected");

			// récupération des infos
			var itemId = $this.attr("item");
			if(self.data[itemId])
			{
				self.currentForm = $forms[self.data[itemId]['template']];
				$("input:not([type=button]), select", self.currentForm).each(function()
				{
					$this = $(this);
					$this.val(self.data[itemId][$this.attr("name")]);
				});
			}
			else
			{
				$("input:not([type=button])", self.currentForm).val("");
			}

			// toggle form
			$addButtons.hide();
			self.currentForm.show();
			$formButtons.show();
		});

		// rafraichis le textarea lorsque l'ordre des objets est modifié
		this.select.on("sortstop", function() {
			self._refreshText();
		});

	},

	_newLine: function(template) {
		var $li = $('<li item="'+this.count+'">').append(['<span class="handle">[+] </span>', '<span class="value">'+this.formsDatas[template]['nom']+' : </span>']);
		this.select.append($li);
		this.data[this.count] = {};
		this.data[this.count]['template'] = template;
		this.count++;
		return $li;
	},

	_setValue: function(itemId, data) {
		var template = this.data[itemId]['template'];
		this.data[itemId] = data;
		this.data[itemId]['template'] = template;
		$("li[item="+itemId+"] span.value", this.select).text(this.formsDatas[template]['nom'] + " : " + data[this.formsDatas[template]['main']]);
	},

	_removeValue: function(itemId) {
		delete this.data[itemId];
		$("li[item="+itemId+"]").remove();
	},

	_refreshText: function() {
		var text = "";
		var data = this.data;

		$("li", this.select).each(function()
		{
			var item = data[$(this).attr('item')];
			text += "{{"+item['template'];
			for(var i in item)
			{
				if(i != 'template')
				{
					text += "|"+i+"="+item[i];
				}
			}
			text += "}}\n";
		});
		this.textarea.val(text);
	},

	_createForm: function(data) {
		var template = data['template'];
		var $form =  $("<form>").hide();
		for(var param in data['fields'])
		{
			var field = data['fields'][param];
			var $field;
			if(field['type'] == 'select')
			{
				$field = $('<select>');
				var values = field['values']; //JSON.parse(field['values']);
				for(var v in values)
				{
					$field.append('<option value="'+values[v]+'">'+values[v]+'</option>');
				}
			}
			else
			{
				$field = $('<input>').attr('size', '60');
				if(field['autocomplete'] !== "")
				{
					$field.attr('autocompletedatatype', 'category');
					$field.attr('autocompletesettings', field['autocomplete']);
					// hack
					(function($f) {
						setTimeout(function() { $f.attachAutocomplete(); }, 500);
					})($field);
				}
			}
			$field.attr('name', param);
			
			$form.append($("<div>").append([field['nom'] + " : ", $field]));
		}

		return $form;
	}
		

});

$(".ListField").wiki_CompositeListField();

});