Utilizador:LBelo (WMB)/gpgp.js
Nota: Depois de publicar, poderá ter de contornar a cache do seu navegador para ver as alterações.
- Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
- Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
- Internet Explorer / Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5
- Opera: Pressione Ctrl-F5.
const elementGpgp = document.getElementById('gpgp-modal');
mw.loader.using( '@wikimedia/codex' ).then( function( require ) {
const Vue = require( 'vue' );
const Codex = require( '@wikimedia/codex' );
const mountPoint = elementGpgp.appendChild( document.createElement( 'div' ) );
Vue.createMwApp( {
data: function() {
return {
showDialog: false,
searchQuery: ''
};
},
template: `
<cdx-button action="progressive" weight="primary">Criar Grupo de Pesquisa</cdx-button>
<cdx-dialog v-model:open="showDialog" title="Criar Grupo de Pesquisa" close-button-label="Close" :default-action="defaultAction" @default="open = false">
<p>Digite o título do Grupo de Pesquisa:</p>
<cdx-text-input v-model="inputValue" aria-label="TextInput default demo"></cdx-text-input>
<p>Insira uma descrição:</p>
<cdx-text-area v-model="textareaValue" aria-label="TextArea default demo"></cdx-text-area>
<p>Cor para o layout no formato #FFFFFF (opcional):</p>
<cdx-text-input v-model="inputValue" aria-label="TextInput default demo"></cdx-text-input>
<cdx-field>
<template #label>
Pesquisadores
</template>
<template #description>
Encontre o pesquisador no Wikidata
</template>
<template #help-text>
Se o pesquisador não tiver um item no Wikidata insira o nome dele no campo acima
</template>
<cdx-lookup
v-model:selected="selection"
:menu-items="menuItems"
:menu-config="menuConfig"
@input="onInput"
@load-more="onLoadMore"
@update:selected="insertSelectedInChipInput"
>
<template #no-results>
Nenhum resultado encontrado.
</template>
</cdx-lookup>
<cdx-chip-input
v-model:input-chips="exampleChips"
remove-button-label="Remove"
separateInput="true"
></cdx-chip-input>
</cdx-field>
<p>Digite um resumo da edição:</p>
<cdx-text-input v-model="inputValue" aria-label="TextInput default demo"></cdx-text-input>
<cdx-button action="progressive">Progressive button</cdx-button>
</cdx-dialog>
`,
methods: {
openDialog () {
this.showDialog = true;
}
},
setup() {
const selection = ref( null );
const menuItems = ref( [] );
const currentSearchTerm = ref( '' );
const exampleChips = ref( [] );
const menuConfig = {
visibleItemLimit: 6
};
function ref(value){
return Vue.ref(value);
}
function insertSelectedInChipInput(){
// selected value has a QID
if(selection.value !== null){
// iterates over suggested items to find the selected item
for (let item of menuItems.value) {
if(item.value == selection.value){
// manipulates chipInput values
// var payload = '<a href="https://www.wikidata.org/wiki/' + item.value + '" target="_blank">' + item.label + ' (' + item.value + ')</a>';
var payload = item.label + " (" + item.value + ")";
var payloadInChips = false;
var chips = exampleChips.value;
for (let chip of chips){
if(payload == chip.value){
payloadInChips = true;
break;
}
}
if (payloadInChips == false) {
chips.push({value: payload});
return;
}
}
}
}
}
/**
* Get search results.
*
* @param {string} searchTerm
* @param {number} offset Optional result offset
*
* @return {Promise}
*/
function fetchResults( searchTerm, offset ) {
const params = new URLSearchParams( {
origin: '*',
action: 'wbsearchentities',
format: 'json',
limit: '10',
props: 'url',
language: 'en',
search: searchTerm
} );
if ( offset ) {
params.set( 'continue', String( offset ) );
}
return fetch( `https://www.wikidata.org/w/api.php?${ params.toString() }` )
.then( ( response ) => response.json() );
}
/**
* Handle lookup input.
*
* TODO: this should be debounced.
*
* @param {string} value
*/
function onInput( value ) {
// Internally track the current search term.
currentSearchTerm.value = value;
// Do nothing if we have no input.
if ( !value ) {
menuItems.value = [];
return;
}
fetchResults( value )
.then( ( data ) => {
// Make sure this data is still relevant first.
if ( currentSearchTerm.value !== value ) {
return;
}
// Reset the menu items if there are no results.
if ( !data.search || data.search.length === 0 ) {
menuItems.value = [];
return;
}
// Build an array of menu items.
const results = data.search.map( ( result ) => {
return {
label: result.label,
value: result.id,
description: result.description
};
} );
// Update menuItems.
menuItems.value = results;
} )
.catch( () => {
// On error, set results to empty.
menuItems.value = [];
} );
}
function deduplicateResults( results ) {
const seen = new Set( menuItems.value.map( ( result ) => result.value ) );
return results.filter( ( result ) => !seen.has( result.value ) );
}
function onLoadMore() {
if ( !currentSearchTerm.value ) {
return;
}
fetchResults( currentSearchTerm.value, menuItems.value.length )
.then( ( data ) => {
if ( !data.search || data.search.length === 0 ) {
return;
}
const results = data.search.map( ( result ) => {
return {
label: result.label,
value: result.id,
description: result.description
};
} );
// Update menuItems.
const deduplicatedResults = deduplicateResults( results );
menuItems.value.push( ...deduplicatedResults );
} );
}
return {
selection,
menuItems,
menuConfig,
onInput,
onLoadMore,
exampleChips,
insertSelectedInChipInput
};
},
mounted() {
elementGpgp.addEventListener( 'click', this.openDialog );
},
unMounted() {
elementGpgp.removeEventListener( this.openDialog );
}
} )
.component( 'cdx-dialog', Codex.CdxDialog )
.component( 'cdx-text-input', Codex.CdxTextInput )
.component( 'cdx-text-area', Codex.CdxTextArea )
.component( 'cdx-button', Codex.CdxButton )
.component( 'cdx-lookup', Codex.CdxLookup )
.component( 'cdx-field', Codex.CdxField )
.component( 'cdx-chip-input', Codex.CdxChipInput )
.mount( mountPoint );
} );