Utilizador:LBelo (WMB)/gpgp.js: diferenças entre revisões
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição |
Sem resumo de edição Etiqueta: Revertida |
||
Linha 157: | Linha 157: | ||
visibleItemLimit: 6, |
visibleItemLimit: 6, |
||
boldLabel: true |
boldLabel: true |
||
}; |
|||
const MenuItemData = { |
|||
language: {label: 'pt'} |
|||
}; |
}; |
||
Linha 299: | Linha 303: | ||
menuConfig, |
menuConfig, |
||
aliasChips, |
aliasChips, |
||
MenuItemData, |
|||
selectionLocal, |
selectionLocal, |
||
researchersChips, |
researchersChips, |
Revisão das 20h50min de 15 de maio de 2024
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,
currentTab: 'Sobre',
tabsData: [{
name: 'Sobre',
label: 'Sobre'
}, {
name: 'Pesquisadores',
label: 'Pesquisadores'
}, {
name: 'Publicações',
label: 'Publicações'
}, {
name: 'Identidade visual',
label: 'Identidade visual'
}, {
name: 'Contato',
label: 'Contato'
}],
};
},
template: `
<cdx-button action="progressive" weight="primary">Criar Grupo de Pesquisa</cdx-button>
<cdx-dialog v-model:open="showDialog" title="Grupo de Pesquisa" close-button-label="Close"
:default-action="defaultAction" @default="open = false">
<cdx-tabs v-model:active="currentTab" :framed="framed">
<cdx-tab v-for="( tab, index ) in tabsData" :key="index" :name="tab.name" :label="tab.label"
:disabled="tab.disabled">
<template v-if="tab.name === 'Sobre'">
<br>
<cdx-field>
<template #label>Título</template>
<cdx-text-input v-model="inputTitle" aria-label="TextInput default demo"></cdx-text-input>
</cdx-field>
<cdx-field>
<template #label>Descrição</template>
<cdx-text-area v-model="inputDescription" aria-label="TextArea default demo"></cdx-text-area>
</cdx-field>
<cdx-field optionalFlag="(opcional)">
<template #label>Nomes alternativos</template>
<template #help-text>Siglas ou abreviações do nome do grupo de pesquisa</template>
<cdx-chip-input v-model:input-chips="aliasChips" remove-button-label="Remove"></cdx-chip-input>
</cdx-field>
<cdx-field>
<template #label>Data de criação</template>
<cdx-text-input v-model="inputDate" aria-label="TextInput date demo"
input-type="date"></cdx-text-input>
</cdx-field>
<cdx-field>
<template #label>País de atuação</template>
<template #description>Encontre o país no Wikidata</template>
<cdx-lookup v-model:selected="selectionCountry" :menu-items="menuItems" :menu-config="menuConfig"
@input="onInput" @load-more="onLoadMore">
<template #no-results>Nenhum resultado encontrado.</template>
</cdx-lookup>
</cdx-field>
<cdx-field>
<template #label>Localização</template>
<template #description>Encontre o local no Wikidata</template>
<template #help-text>Local da sede do grupo de pesquisa: estado, cidade, bairro ou rua</template>
<cdx-lookup v-model:selected="selectionLocal" :menu-items="menuItems" :menu-config="menuConfig"
@input="onInput" @load-more="onLoadMore">
<template #no-results>Nenhum resultado encontrado.</template>
</cdx-lookup>
</cdx-field>
<br>
</template>
<template v-if="tab.name === 'Pesquisadores'">
<br>
<cdx-field>
<template #label>Pesquisador líder</template>
<template #description>Encontre o pesquisador no Wikidata</template>
<template #help-text>
Se o pesquisador não tiver um item no Wikidata apenas insira o nome dele neste campo
</template>
<cdx-lookup v-model:selected="selectionResearcher" :menu-items="menuItems" :menu-config="menuConfig"
@input="onInput" @load-more="onLoadMore">
<template #no-results>Nenhum resultado encontrado.</template>
</cdx-lookup>
</cdx-field>
<cdx-field>
<template #label>Pesquisadores membros</template>
<template #description>Encontre os pesquisadores no Wikidata</template>
<template #help-text>
Se o pesquisador não tiver um item no Wikidata insira o nome dele no campo a baixo
</template>
<cdx-lookup v-model:selected="selectionResearchers" :menu-items="menuItems" :menu-config="menuConfig"
:clearable="true"
@input="onInput" @load-more="onLoadMore" @update:selected="insertSelectedInChipInput">
<template #no-results>Nenhum resultado encontrado.</template>
</cdx-lookup>
</cdx-field>
<cdx-field>
<cdx-chip-input v-model:input-chips="researchersChips" remove-button-label="Remove"
separateInput="true">
</cdx-chip-input>
</cdx-field>
<br>
</template>
<template v-if="tab.name === 'Publicações'">
<br>
<br>
</template>
<template v-if="tab.name === 'Identidade visual'">
<br>
<br>
</template>
<template v-if="tab.name === 'Contato'">
<br>
<br>
</template>
</cdx-tab>
</cdx-tabs>
</cdx-dialog>
`,
methods: {
openDialog() {
this.showDialog = true;
}
},
setup() {
const menuItems = ref([]);
const aliasChips = ref([]);
const selectionLocal = ref(null);
const selectionCountry = ref(null);
const selectionResearchers = ref(null);
const selectionResearcher = ref(null);
const researchersChips = ref([]);
const currentSearchTerm = ref('');
const menuConfig = {
visibleItemLimit: 6,
boldLabel: true
};
const MenuItemData = {
language: {label: 'pt'}
};
function ref(value) {
return Vue.ref(value);
}
function insertSelectedInChipInput() {
// selected value has a QID
if (selectionResearchers.value !== null) {
// iterates over suggested items to find the selected item
for (let item of menuItems.value) {
if (item.value == selectionResearchers.value) {
// manipulates chipInput values
var payload = item.label + " (" + item.value + ")";
var payloadInChips = false;
var chips = researchersChips.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: 'pt',
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 {
onInput,
menuItems,
onLoadMore,
menuConfig,
aliasChips,
MenuItemData,
selectionLocal,
researchersChips,
selectionCountry,
selectionResearcher,
selectionResearchers,
insertSelectedInChipInput
};
},
mounted() {
elementGpgp.addEventListener('click', this.openDialog);
},
unMounted() {
elementGpgp.removeEventListener(this.openDialog);
}
})
.component('cdx-tab', Codex.CdxTab)
.component('cdx-tabs', Codex.CdxTabs)
.component('cdx-field', Codex.CdxField)
.component('cdx-lookup', Codex.CdxLookup)
.component('cdx-button', Codex.CdxButton)
.component('cdx-dialog', Codex.CdxDialog)
.component('cdx-text-area', Codex.CdxTextArea)
.component('cdx-text-input', Codex.CdxTextInput)
.component('cdx-chip-input', Codex.CdxChipInput)
.mount(mountPoint);
});