import { html, render, useState, useEffect } from './vendor/preact/standalone.js'; import { getRecords } from './api.js'; const rdataInputProperties = { Address: {label: 'adresse :', type: 'text'}, Serial: {label: 'serial :', type: 'number'}, Minimum: {label: 'minimum :', type: 'number'}, Retry: {label: 'nouvelle tentative :', type: 'number'}, Refresh: {label: 'actualisation :', type: 'number'}, MaintainerName: {label: 'contact :', type: 'text'}, MasterServerName: {label: 'serveur primaire :', type: 'text'}, Expire: {label: 'expiration :', type: 'number'}, Target: {label: 'cible :', type: 'text'}, }; const recordTypes = { 'A': 'address', 'AAAA': 'address', 'SRV': 'service', 'CNAME': 'alias', 'NS': 'name_server', 'SOA': 'soa', }; const recordTypeNames = { 'address': 'Adresse IP', 'service': 'Service', 'alias': 'Alias', 'name_server': 'Serveur de nom', 'soa': 'SOA', } function getNameForRecord(name, type) { return name; } function getTypeForRecord(name, type) { return recordTypes[type]; } function processRecords(records) { return records.reduce((acc, record) => { let name = getNameForRecord(record.Name, record.Type); let type = getTypeForRecord(record.Name, record.Type); if (!(name in acc)) { acc[name] = {}; } if (!(type in acc[name])) { acc[name][type] = []; } acc[name][type].push(record); return acc; }, {}); } const recordsKeys = { 'address': (record) => { return [[ 'Address', record.Address ]] }, 'service': (record) => { /* TODO */ }, 'alias': (record) => { return [[ 'Target', record.Target ]] }, 'name_server': (record) => { return [[ 'Target', record.Target ]] }, 'soa': (record) => { return [ [ 'MasterServerName', record.MasterServerName ], [ 'MaintainerName', record.MaintainerName ], [ 'Refresh', record.Refresh ], [ 'Retry', record.Retry ], [ 'Expire', record.Expire ], [ 'Minimum', record.Minimum ], [ 'Serial', record.Serial ], ] }, } function FriendlyRecord({type, record}) { let keys = recordsKeys[type](record); if (keys.length == 1) { return html`${keys[0][1]}`; } else { return html`
${keys.map(([name, value]) => {return html`
${rdataInputProperties[name].label}
${value}
`})}
`; } } function RecordsByName({ name, recordSets }) { return html`

${name}

${Object.entries(recordSets).map( ([type, records]) => { return html`

${recordTypeNames[type]}

    ${records.map(record => html`
  • <${FriendlyRecord} type=${type} record=${record}/>
  • `)}
`; } )}
`; } function RecordListFriendly({ zone }) { const [records, setRecords] = useState({}); const [editable, setEditable] = useState(false); useEffect(() => { getRecords(zone) .then((res) => setRecords(processRecords(res))); }, [zone]); return html` ${Object.entries(records).map( ([name, recordSets]) => { return html` <${RecordsByName} name=${name} recordSets=${recordSets}/> `; } )} `; } function NewRecordFormFriendly({ zone }) { return html`
.${ zone }
`; } function ZoneRecords({ zone }) { const [addNewRecord, setAddNewRecord] = useState(false); const [newRecords, setNewRecords] = useState([]); return html`

Enregistrements

${newRecords} <${RecordListFriendly} zone=${zone} /> `; } export default function(element, { zone }) { render(html`<${ZoneRecords} zone=${zone} />`, element); };