MediaWiki:AuthorityLinks.js: mudanças entre as edições

De Wikincat
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
 
(Sem diferença)

Edição atual tal como às 11h36min de 22 de abril de 2024

/* jshint esversion: 10 */
function authorityLinks() {
  let tag = '';
  let tagFromDropdown = '';
  const inputs = document.body.querySelectorAll(
    '.instanceMain div table .oo-ui-inputWidget-input',
  );
  inputs.forEach((elem) => {
    const authorityLink = document.createElement('a');
    authorityLink.setAttribute('target', '_blank');
    authorityLink.innerText = 'Criar registro de autoridade';
    authorityLink.setAttribute(
    	'title',
    	'Abre uma nova aba para criar ou editar um registro de autoridade',
    	);
    authorityLink.style.display = 'none';

    const createAuthorityLink = elem
      .closest('table')
      .querySelector('.createAuthorityLink');
    createAuthorityLink.innerHTML = '';
    createAuthorityLink.appendChild(authorityLink);

    const pattern1 = /\$0\sA\d{6}/;
    const pattern2 = /\$0\s\(BN\)\d{9}/;

    elem.addEventListener('focusout', () => {
      // if already recorded
      if (pattern1.test(elem.value)) {
        // build the URL for Wikincat aut record edit
        authorityLink.innerText = 'Editar autoridade';
        authorityLink.setAttribute(
        	'title',
        	'Abre uma nova aba para editar um registro de autoridade',
        	);
        authorityLink.setAttribute(
          'href',
          `/wiki/Special:FormEdit/AutRecord/Autoridade:${elem.value.match(
            /A\d{6}/,
          )}`,
        );
      } else if (pattern2.test(elem.value)) {
        // build the URL for BN aut record view
        authorityLink.innerText = 'Ver registro de autoridade na BN';
        authorityLink.setAttribute( 
        	'title',
        	'Abre uma nova aba para ver o registro na Biblioteca Nacional',
        	);
        authorityLink.setAttribute(
          'href',
          `https://acervo.bn.gov.br/sophia_web/autoridade/detalhe/${elem.value.match(
            /\d{9}/,
          )}`,
        );
      } else {
        // find the tag value from the chosen dropdown
        tagFromDropdown =
          elem
            .closest('.instanceMain')
            .querySelector('.oo-ui-inputWidget-input')
            .getAttribute('title') || '00x';
        tagFromDropdown = tagFromDropdown.substring(0, 3);
        // find the tag value from checked radio button

        const tagFromRadio = elem
          .closest('.instanceMain')
          .querySelector(
            "input[origname='Field[authorityType]']:checked",
          ).value;

        const authorityTypes = {
          Pessoa: '100',
          'Entidade coletiva': '110',
          Evento: '111',
          'Título uniforme': '130',
          Tópico: '150',
          Local: '151',
        };

        if (tagFromRadio in authorityTypes) {
          tag = authorityTypes[tagFromRadio];
        }

        // declare the indicators default values
        let ind1 = elem
          .closest('.instanceMain')
          .querySelector("select[origname='Field[ind1]'] option:checked").value;
        let ind2 = elem
          .closest('.instanceMain')
          .querySelector("select[origname='Field[ind2]'] option:checked").value;

        // declare the 008 field default values
        let directOrIndirectGeogSubdiv = ''; // 06
        let kindOfRecord = ''; // 09
        let descriptiveCatalogingRules = 'c'; // 10
        let subjectHeadingSystem = 'n'; // 11
        let typeOfSeries = 'n'; // 12
        let numberedOrUnnumberedSeries = 'n'; // 13
        let headingUseMainOrAddedEntry = 'a'; // 14
        let headingUseSubjectAddedEntry = 'a'; // 15
        let headingUseSeriesAddedEntry = 'b'; // 16
        let typeOfSubjectSubdivision = 'n'; // 17
        let undifferentiatedPersonalName = 'n'; // 32
        let levelOfEstablishment = 'a'; // 33

        // set the 008 field and indicadors specific values
        if (tag === '100') {
          undifferentiatedPersonalName = 'a';
          ind2 = '';
        }
        if (tag === '110') {
          // in case of autocomplete of 260
          if (tagFromDropdown === '260') {
            directOrIndirectGeogSubdiv = 'n';
            kindOfRecord = 'b';
            headingUseMainOrAddedEntry = 'b';
            headingUseSubjectAddedEntry = 'b';
            levelOfEstablishment = 'n';
            ind1 = '1';
          }
          ind2 = '';
        }
        if (tag === '111') {
          ind1 = '2';
          ind2 = '';
        }
        if (tag === '130') {
          typeOfSeries = 'a';
          numberedOrUnnumberedSeries = 'b';
          headingUseSeriesAddedEntry = 'a';
          if (
            tagFromDropdown === '130' ||
            tagFromDropdown === '630' ||
            tagFromDropdown === '730'
          ) {
            ind2 = ind1; // an inverted value happens here, see and
            ind1 = ''; // compare bib. and auth. 130 MARC definitions
          }
          ind1 = '';
        }
        if (tag === '150' || tag === '151') {
          descriptiveCatalogingRules = 'n';
          subjectHeadingSystem = 'z';
          headingUseMainOrAddedEntry = 'b';
          ind1 = ''; // 150 and 151 indicators must be empty in
          ind2 = ''; // authority MARC records
          if (tag === '151') {
            typeOfSubjectSubdivision = 'd';
          }
        }
        // build the URL
        const autRecordParams = {
          AutRecord: {
            directOrIndirectGeogSubdiv,
            kindOfRecord,
            descriptiveCatalogingRules,
            subjectHeadingSystem,
            typeOfSeries,
            numberedOrUnnumberedSeries,
            headingUseMainOrAddedEntry,
            headingUseSubjectAddedEntry,
            headingUseSeriesAddedEntry,
            typeOfSubjectSubdivision,
            undifferentiatedPersonalName,
            levelOfEstablishment,
          },
          Field: {
            1: {
              tag: '040',
              data: '$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC',
            },
            2: {
              tag,
              ind1,
              ind2,
              data: elem.value,
            },
            3: {
              tag: '670',
              data: '$a ',
            },
          },
        };

        const url = new URL(
          `${window.location.origin}/wiki/Special:FormEdit/AutRecord`,
        );
        // function to transform a 3rd level object to URL query strings
        const makeUrlParams = (obj) => {
          for (const [key, value] of Object.entries(obj)) {
            if (typeof value === 'object') {
              for (const [key2, value2] of Object.entries(value)) {
                if (typeof value2 === 'object') {
                  for (const [key3, value3] of Object.entries(value2)) {
                    url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
                  }
                } else {
                  url.searchParams.set(`${key}[${key2}]`, value2);
                }
              }
            } else {
              url.searchParams.set(key, value);
            }
          }
        };
        makeUrlParams(autRecordParams);
        authorityLink.innerText = 'Criar registro de autoridade';
        authorityLink.setAttribute(
        	'title',
        	'Abre uma nova aba para criar um registro de autoridade',
        	);
        authorityLink.setAttribute('href', url.pathname + url.search);
      }
      authorityLink.style.display = '';
    });
  });
}