--[[ @Title: Record Baptism Data (England and Wales) @Type: Source-driven Data Entry @Subtype: "Church Register" @Author: Helen Wright @Version: 1.6 Changes added to modify TfS depending on what data is entered Also allows unidentified father and/or mother Fixed issue with & Better UTF8 handling Other minor fixes @Keywords: @LastUpdated: November 2021 @GH #24 #37 #54 #76 #110 #112 #119 @Description: Based on the format of the England and Wales Parish register before and after 1813, it allows details of baptism facts to be recorded, as well as details of parents and celebrants, creating records as necessary. Only entry of information about the principal is mandatory. ]] fhInitialise(7) fh = require 'fhUtils' fh.setIupDefaults() -- Local Globals local form, templateName, templateDefault local iForm = 1 local sPluginName = fhGetContextInfo 'CI_PLUGIN_NAME' local s = {} -- Autofill table local pCite -- Citation Object local tUpdatedFields = {} -- Added and updated fields local cells = {} -- Main Dialog sections --- Builds dialog and drives process. function main() -- ------------------------------------------------------------Load citation and associated fields pCite = fh.loadPreparedCitation() if not pCite.result then fh.getParam(sPluginName, pCite.err) return end -- Ensure all needed fields have been completed if not ( pCite:checkRequired( 'EN-EVENT_TYPE', 'NM-PRINCIPAL', 'DT-DATE', 'PL-LOCATION', 'TX-CHURCH' ) ) then fh.getParam( sPluginName, 'Not all required fields are set,\nplease ensure you have entered type, date, church, location and principal. ' ) return end if pCite:getValue 'EN-EVENT_TYPE' ~= 'Baptism' then fh.getParam(sPluginName, 'Only Baptism is supported by this plugin. ') return end -- Get form and load values from Citation dtEventDateString = pCite:getDisplayValue 'DT-DATE' dtEventDate = pCite:getValue 'DT-DATE' dtP1 = dtEventDate:GetDatePt1() dtYear = dtP1:GetYear() sDay = dtEventDate:GetDisplayText 'DAY' sMonth = dtEventDate:GetDisplayText 'MONTH_NAME' if dtYear < 1813 then iForm = 2 end local masterForms = loadMasterForms() form = tablex.deepcopy(masterForms[iForm]['sections']) templateName = masterForms[iForm]['templateName'] templateDefault = masterForms[iForm]['templateDefault'] form.principal.fields[1].value = pCite:getValue 'NM-PRINCIPAL' -- ------------------------------------------------------------ Get currently selected person local ptrPrincipal = fh.getCurrentIndividual() if ptrPrincipal:IsNotNull() then form.principal.fields[field(form.principal.fields, 'RECORD')].value = ptrPrincipal:Clone() changePrincipal(ptrPrincipal, true) end -- ------------------------------------------------------------ Create Dialog for k, v in pairs(form) do grid = iup.gridbox { numdiv = 2, cgaplin = '1', cgapcol = '1', margin = '4x4', expand = 'YES', NORMALIZESIZE = 'HORIZONTAL', } for l, f in ipairs(v.fields) do if f.label then local label = ' ' local value = ' ' if f.gridDisplay or v.gridDisplay then label = f.label .. ':' value = getParamValueForDisplay(f, true) if value == f.label then value = utils.choose(f.value == true, 'Yes', 'No') end value = getParamValueForDisplay(f, true) end f.gridLabel = iup.label { title = label, size = '80', expand = 'NO' } iup.Append(grid, f.gridLabel) f.iupgrid = iup.label { title = value, expand = 'YES' } iup.Append(grid, f.iupgrid) end end v.button = iup.button { title = 'Edit', active = 'NO' } if v.active then v.button.active = 'YES' end v.button.action = function() doEdit(k, v.title, v.seq) end cells[v.seq] = iup.vbox { EXPANDCHILDREN = 'YES', EXPAND = 'YES', iup.frame { title = v.title, EXPANDCHILDREN = 'YES', EXPAND = 'YES', iup.vbox { EXPANDCHILDREN = 'YES', EXPAND = 'YES', v.button, grid, }, }, } end local placeList = fh.createPlaceList() s['PLAC'] = placeList s['OCCU'] = fhGetDataList 'OCCUPATIONS' local addressList = {} txtMessage = iup.label { title = ' Hint: please edit the Principal section to enable the other sections', } btnOk = iup.button { title = 'OK', padding = '20x4', expand = 'HORIZONTAL' } function btnOk.action() if form.principal.valid then local sVenue = pCite:getValue 'TX-CHURCH' if not sVenue then sVenue = pCite:getValue 'AD-ADDRESS' end processBaptism(pCite:getValue 'PL-LOCATION', sVenue) return iup.CLOSE else fhMessageBox 'Information has not been entered on Principal' end end btnCancel = iup.button { title = 'Cancel', padding = '4x4', expand = 'HORIZONTAL', } function btnCancel.action() return iup.CLOSE end local sTitle = 'Baptism Entry: ' .. fhGetDisplayText(pCite.source) dlg = iup.dialog { title = sTitle, minsize = '1000', iup.vbox { EXPANDCHILDREN = 'YES', EXPAND = 'YES', iup.gridbox { numdiv = 2, cgaplin = '1', cgapcol = '1', margin = '4x4', expand = 'YES', EXPANDCHILDREN = 'YES', table.unpack(cells), }, iup.hbox { margin = '4x4', expand = 'NO', btnOk, btnCancel, fh.helpButton 'record-baptism-data-uk', txtMessage, }, }, } iup.SetAttribute(dlg, 'NATIVEPARENT', fhGetContextInfo 'CI_PARENT_HWND') -- Set the parent window handle iup.SetHandle('main', dlg) iup.SetGlobal('PARENTDIALOG', 'main') iup.Popup(dlg) iup.Destroy(dlg) end -- --------------------------------------------------------------- doEdit --- Called from the Edit buttons to update the sections -- @param sType string, section name from form table -- @param sTitle string Name of dialog -- @param seq number, sequence number of section function doEdit(sType, sTitle, seq) local fields = form[sType].fields if sType == 'principal' then local oldRecord = form[sType]['fields'][field(fields, 'RECORD')].value:Clone() local oldFamily = form[sType]['fields'][field(fields, 'FAMILY')] if oldFamily.value then oldFamily = oldFamily.value:Clone() else oldFamily = fhNewItemPtr() end local r = fh.getParam( 'Enter ' .. sTitle, nil, fields, { 'OK', 'Cancel', fh.helpButton 'record-baptism-data-uk-principal' }, s ) if r.ok then form[sType].valid = true -- enable all Edit buttons for k, v in pairs(form) do v.button.active = 'YES' end -- To Do Ripple all fields if not (oldRecord:IsSame(r.results['RECORD'])) or not (oldFamily:IsSame(r.results['FAMILY'])) then changePrincipal(r.results['RECORD']) end end else local r = fh.getParam( 'Enter ' .. sTitle, nil, fields, { 'OK', 'Cancel' }, s ) if r.ok then form[sType].valid = true form[sType].gridDisplay = true end end updateGrid() end -- --------------------------------------------------------------- changePrincipal --- Update other section/grid boxes when the Principal record is changed -- @param ptrPrincipal fhItemPointer for the Principal person on the certifcate -- @param init boolean, true on first run. function changePrincipal(ptrPrincipal, init) local f = form['principal'].fields if ptrPrincipal:IsNotNull() then if init then -- first time load or new Record selected local values, prompts = updateFamList(ptrPrincipal, 'FamilyAsChild') f[field(f, 'FAMILY')].values = values f[field(f, 'FAMILY')].prompts = prompts f[field(f, 'FAMILY')].value = values[1] f[field(f, 'ACTION')].value = 'select' f[field(f, 'FAMILY')].protect = false f[field(f, 'RECORD')].protect = false end f[field(f, 'SEX')].value = fhGetItemText(ptrPrincipal, '~.SEX') -- f[field(f,'SEX')].protect = true local ptrFam = f[field(f, 'FAMILY')].value if ptrFam:IsNotNull() then -- Set up Father of Principal if they exist local ptrF = fhGetItemPtr(ptrFam, '~.HUSB>') if ptrF:IsNotNull() then local s = form['father'].fields s[field(s, 'NAME')].value = fh.editableName( fhGetItemText(ptrF, '~.NAME:STORED') ) s[field(s, 'RECORD')].value = ptrF:Clone() s[field(s, 'RECORD')].protect = true s[field(s, 'ACTION')].value = 'select' s[field(s, 'ACTION')].protect = true end -- Set up Mother of Principal if they exist local ptrF = fhGetItemPtr(ptrFam, '~.WIFE>') if ptrF:IsNotNull() then local s = form['mother'].fields s[field(s, 'NAME')].value = fh.editableName( fhGetItemText(ptrF, '~.NAME:STORED') ) s[field(s, 'RECORD')].value = ptrF:Clone() s[field(s, 'RECORD')].protect = true s[field(s, 'ACTION')].value = 'select' s[field(s, 'ACTION')].protect = true end else resetSection 'father' resetSection 'mother' end else resetSection 'father' resetSection 'mother' end end -- --------------------------------------------------------------- resetSection --- Reset the section values from the master form -- @param formSection string section index function resetSection(formSection) for k, v in ipairs(masterForms[iForm].sections[formSection].fields) do for m, u in pairs(v) do form[formSection]['fields'][k][m] = u end end updateGrid() end -- --------------------------------------------------------------- updateGrid --- Update All Grid Fields from table function updateGrid() for sType, sSection in pairs(form) do for l, f in ipairs(sSection.fields) do local label = ' ' local value = ' ' if f.gridDisplay or form[sType].gridDisplay then label = f.label value = fh.getParamValueForDisplay(f, true) if value == f.label then value = utils.choose(f.value == true, 'Yes', 'No') end end if f.gridLabel then f.gridLabel.title = label end if f.iupgrid then f.iupgrid.title = value end end end end function processBaptism(sPlace, sAddress, sCelebrant) local fields = {} local data = {} for k, s in pairs(form) do data[k] = {} for i, f in ipairs(s.fields) do data[k][f.tag] = { value = f.value, type = f.type, dr = f.df } end end -- Create needed Individual Records for _, f in pairs(data) do if f.ACTION and f.ACTION.value == 'create' then local sex if f.SEX and f.SEX.value then sex = f.SEX.value end local ptr = fh.createIndi(f.NAME.value, sex) addCitation(ptr, 'Created') local ptrName = fhGetItemPtr(ptr, '~.NAME') addCitation(ptrName, 'Cited') f.RECORD.value:MoveTo(ptr) end end processParents( data.father.RECORD.value, data.mother.RECORD.value, data.principal.RECORD.value ) local eventDate = pCite:getValue 'DT-DATE' local sPlace = pCite:getValue 'PL-LOCATION' local sChurch = pCite:getValue 'TX-CHURCH' -- Create / Update Baptism Event local ptrBaptism = fhGetItemPtr(data.principal.RECORD.value, '~.BAPM') local sAction = '' --Create/Update baptism event if ptrBaptism:IsNotNull() then ptrBaptism, sAction = fh.createUpdateFact( data.principal.RECORD.value, 'BAPM', 'Baptism', sPlace, eventDate, sChurch ) if ptrBaptism then addCitation(ptrBaptism, sAction) end else ptrBaptism = fh.createFact( data.principal.RECORD.value, 'BAPM', sPlace, eventDate, sChurch ) if ptrBaptism then addCitation(ptrBaptism, 'Added') end end --Create/Update Birth fact is Age or Date of Birth specified if dtYear > 1812 then local dtBirth = fhNewDate() if fh.isSet(data.principal.DATE.value) then dtBirth = data.principal.DATE.value else if fh.isSet(data.principal.AGE.value) then dtBirth = fh.calcBirth(eventDate, data.principal.AGE.value) end end if not (dtBirth:IsNull()) then local ptrBirth = fhGetItemPtr(data.principal.RECORD.value, '~.BIRT') ptrBirth, sAction = fh.createUpdateFact( data.principal.RECORD.value, 'BIRT', 'Birth', nil, dtBirth ) if ptrBirth then addCitation(ptrBirth, sAction) end end end for k, f in pairs(data) do if ptrBaptism and k == 'celebrant' then -- Add celebrant as witness if not name only if f.ACTION.value == 'name' and fh.isSet(f.NAME.value) then fh.addWitness(ptrBaptism, f.NAME.value, f.ROLE.value) elseif fh.isSet(f.RECORD.value) then fh.addWitness(ptrBaptism, f.RECORD.value, f.ROLE.value) end end if f.RECORD and fh.isSet(f.RECORD.value) then -- Add occupation if specified if f.OCCU and f.OCCU.value:len() > 0 then local ptrFact ptrFact, sAction = fh.createFact( f.RECORD.value, 'OCCU', nil, eventDate, nil, f.OCCU.value ) if ptrFact then addCitation(ptrFact, 'Added') end end end if f.PLAC and f.PLAC.value:len() > 0 then -- add residence if specified local ptrFact, sAction = fh.createFact( f.RECORD.value, 'RESI', f.PLAC.value, eventDate, f.ADDR.value ) if ptrFact then addCitation(ptrFact, 'Added') end for _, r in pairs { data.father.RECORD.value, data.mother.RECORD.value } do if fh.isSet(r) then local ptrFact, sAction = fh.createFact( r, 'RESI', f.PLAC.value, eventDate, f.ADDR.value ) if ptrFact then addCitation(ptrFact, 'Added') end end end end end -- Create text from source template local fields = {} for k, s in pairs(form) do for i, f in ipairs(s.fields) do local inx = string.upper(k .. '.' .. tostring(f.tag)) fields[inx] = fh.getParamValueForDisplay(f) if f.tag == 'NAME' and k == 'principal' then fields['PRINCIPAL.NAMEUNLINKED'] = fields[inx] end if f.tag == 'NAME' and data[k].RECORD then local ptr = data[k].RECORD.value if ptr:IsNotNull() then -- Add record link fields[inx] = fh.richTextRecordLink(ptr, fields[inx]) end end end end if stringx.strip(fields['PRINCIPAL.NOTES']) ~= '' then fields['PRINCIPAL.NOTES'] = 'Notes: ' .. stringx.strip(fields['PRINCIPAL.NOTES']) end fields['BAPTISM.YEAR'] = tostring(dtYear) fields['BAPTISM.DAY'] = utils.choose(sDay == '0', '', sDay) fields['BAPTISM.MONTH'] = sMonth if dtYear < 1813 then local sFather = stringx.strip(fields['FATHER.NAME']) local sMother = stringx.strip(fields['MOTHER.NAME']) local sPlace = stringx.strip(fields['PRINCIPAL.PLAC']) local sAddr = stringx.strip(fields['PRINCIPAL.ADDR']) if sAddr ~= '' then fields['PRINCIPAL.ADDR'] = ' of ' .. sAddr elseif sPlace ~= '' then fields['PRINCIPAL.PLAC'] = ' of ' .. sPlace end if sFather ~= '' or sMother ~= '' then fields['PRINCIPAL.NAME'] = fields['PRINCIPAL.NAME'] .. utils.choose( fields['PRINCIPAL.SEX'] == 'Male', ' son of', ' daughter of' ) end fields['FATHER.NAME'] = sFather .. utils.choose(sFather == '' or sMother == '', '', ' and ') else if stringx.strip(fields['PRINCIPAL.AGE']) ~= '' then fields['PRINCIPAL.AGE'] = 'Age: ' .. stringx.strip(fields['PRINCIPAL.AGE']) .. '\n' end if stringx.strip(fields['PRINCIPAL.DATE']) ~= '' then fields['PRINCIPAL.DATE'] = 'Born: ' .. stringx.strip(fields['PRINCIPAL.DATE']) .. '\n' end if stringx.strip(fields['PRINCIPAL.NOTES']) ~= '' then fields['PRINCIPAL.NOTES'] = fields['PRINCIPAL.NOTES'] .. '\n' end if pCite:getDisplayValue 'TX-REFERENCE' then fields['REFERENCE'] = 'Reference: ' .. pCite:getDisplayValue 'TX-REFERENCE' end end sText = fh.formatTextFromSource(templateName, templateDefault, pCite, fields) fh.createTextFromSource(pCite, sText, 'source') fh.outputUpdatedFields(tUpdatedFields, pCite) end function beforeDate(dt) local newDate = fhNewDate() if dt:IsNull() then return end dp = dt:GetDatePt1() if dp:IsNull() then return end newDate:SetRange('before', dp) return newDate end function addCitation(ptr, action) local action = action or '' table.insert(tUpdatedFields, { ptr:Clone(), action }) pCite:appendCitation(ptr) end function processParents(ptrFather, ptrMother, ptrChild) local ptrFamC = fhNewItemPtr() local ptrFam = fhNewItemPtr() local ptrHusb = fhNewItemPtr() local ptrWife = fhNewItemPtr() local bFamc = false ptrFamC:MoveTo(ptrChild, '~.FAMC') while ptrFamC:IsNotNull() do ptrHusb:MoveTo(ptrFamC, '~>HUSB>') ptrWife:MoveTo(ptrFamC, '~>WIFE>') if ptrHusb:IsSame(ptrFather) and (ptrWife:IsSame(ptrMother) or ptrWife:IsNull()) then ptrFam:MoveTo(ptrFamC, '~>') bFamc = true elseif ptrWife:IsSame(ptrMother) and (ptrHusb:IsSame(ptrFather) or ptrHusb:IsNull()) then ptrFam:MoveTo(ptrFamC, '~>') bFamc = true end ptrFamC:MoveNext 'SAME_TAG' end -- Check if selected people already married if not bFamc then local ptrChk = fhGetItemPtr(ptrFather, '~.FAMS') local ptrWifeChk = fhNewItemPtr() while ptrChk:IsNotNull() do ptrWifeChk:MoveTo(ptrChk, '~>WIFE>') if ptrWifeChk:IsSame(ptrMother) then ptrFam:MoveTo(ptrChk, '~>') end ptrChk:MoveNext 'SAME_TAG' end if ptrFam:IsNotNull() then fh.addFamilyAsChild(ptrChild, ptrFam) end end if ptrFather:IsNotNull() or ptrMother:IsNotNull() then if ptrFam:IsNull() then ptrFam = fh.createFamilyAsChild(ptrChild) addCitation(ptrFam, 'Created') end if fhGetItemPtr(ptrFam, '~.HUSB>'):IsNull() and ptrFather:IsNotNull() then fh.addFamilyAsSpouse(ptrFather, ptrFam) end if fhGetItemPtr(ptrFam, '~.WIFE>'):IsNull() and ptrMother:IsNotNull() then fh.addFamilyAsSpouse(ptrMother, ptrFam) end end end function ptrDescription(ptr) local strDesc = '' local strTag = fhGetTag(ptr) if not (fhHasParentItem(ptr)) then strDesc = 'Record (' .. fhGetTag(ptr) .. ')' else local strTitle = string.match(fhGetDisplayText(ptr), '([%a%w%s]*):') if not strTitle then strTitle = string.match(fhGetDisplayText(ptr), '(%a*)') end strDesc = strTitle .. ' (' .. strTag .. ')' end return strDesc end --------------------------------------------------------------------------- getParamValueForDisplay function getParamValueForDisplay(field) local s = '' local type = field.type or 'STRING' if field.value then if type == 'RECORD' then if fh.isSet(field.value) then s = fhGetDisplayText(field.value) elseif fh.isSet(field.value.ptr) then s = fhGetDisplayText(field.value.ptr) else s = 'N/A' end elseif type == 'DATE' then if fh.isSet(field.value) then s = field.value:GetAsText() end elseif type == 'LIST' then for l, k in pairs(field.values) do if k == field.value then if field.prompts then s = field.prompts[l] else s = field.values[l] end end end elseif type == 'BOOLEAN' then if field.value then s = field.label else s = '' end else s = tostring(field.value) end end return s end function selectOrCreate(value) if value == 'select' then return false, 1 else return true, 0 end end function selectOrCreatePrincipal() if value == 'select' then return false, 1 else -- data.principal.SEX.protect = false return true, 0 end end function updateFamList(ptr) local ptrs = { fhNewItemPtr() } local prompts = { 'New Family As Child' } if fh.isSet(ptr) then local famList = fh.familyList(ptr, 'FamilyAsChild') for i, tFam in ipairs(famList) do table.insert(ptrs, tFam.ptr) table.insert(prompts, tFam.label) end end return ptrs, prompts end function field(fields, tag) local i for i, v in ipairs(fields) do if tag == v.tag then return i end end end function updateAddressList(...) args = { ... } print ',,,' end function loadMasterForms() ptrFamily = fhNewItemPtr() masterForms = {} masterForms[1] = { templateName = 'Baptism post 1812 (England and Wales).ftf', templateDefault = [[Baptism {PRINCIPAL.NAMEUNLINKED} {DT-DATE} {TX-CHURCH} {PL-LOCATION} Baptisms solemnised in the Parish of {TX-CHURCH} {PL-LOCATION} in the Year {BAPTISM.YEAR} When Baptised | Child's Christian Name | Parents' Names | Abode | Quality Trade or Profession | By Whom the ceremony was performed {BAPTISM.DAY} {BAPTISM.MONTH} | {PRINCIPAL.NAME} | {FATHER.NAME} {MOTHER.NAME} | {PRINCIPAL.ADDR} {PRINCIPAL.PLAC} | {FATHER.OCCU} | {CELEBRANT.NAME} {PRINCIPAL.AGE}{PRINCIPAL.DATE}{PRINCIPAL.NOTES}{REFERENCE} ]], sections = { principal = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = pCite:getValue 'NM-PRINCIPAL', minlength = 1, protect = true, }, { tag = 'ACTION', label = 'Add principal as', type = 'LIST', value = 'create', values = { 'create', 'select' }, prompts = { 'Create New Record', 'Use Existing Record' }, child = 'RECORD', childUpdate = function(...) return selectOrCreate(...) end, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', dr = 'PTR', value = fhNewItemPtr(), protect = true, child = 'FAMILY', childUpdate = function(...) return updateFamList(...) end, }, { tag = 'FAMILY', label = 'Family', type = 'LIST', value = ptrFamily, values = { ptrFamily }, prompts = { 'New Family as Child' }, }, { tag = 'SEX', type = 'LIST', label = 'Sex', dr = 'SEX', value = 'Male', values = { 'Male', 'Female', 'Unknown' }, }, { tag = 'AGE', type = 'STRING', label = 'Age', value = '', mask = '(/d+[dwmyf]|full)', minlength = 0, }, { tag = 'DATE', type = 'DATE', label = 'Birth Date', value = fhNewDate(), }, { tag = 'PLAC', type = 'STRING', label = 'Abode Place', dr = 'RESI.PLAC', value = '', child = 'ADDR', childUpdate = function(place) return fh.createAddressList(place) end, }, { tag = 'ADDR', type = 'STRING', label = 'Abode Address', dr = 'RESI.ADDR', value = '', }, { tag = 'NOTES', label = 'Notes', type = 'STRING', value = '' }, { tag = 'BAPM', dr = 'BAPM' }, }, title = 'Principal', label = 'principal', seq = 1, active = true, gridDisplay = true, }, father = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = '', minlength = 0, gridDisplay = true, }, { tag = 'ACTION', label = 'Add father as', type = 'LIST', value = 'name', values = { 'name', 'create', 'select' }, prompts = { 'Name Only', 'Create New Record', 'Use Existing Record', }, child = 'RECORD', childUpdate = selectOrCreate, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', recordtype = 'INDI', value = fhNewItemPtr(), protect = true, }, { tag = 'OCCU', dr = 'OCCU', type = 'STRING', label = 'Occupation', value = '', }, { tag = 'SEX', value = 'Male' }, }, title = 'Father', seq = 3, gridDisplay = true, }, mother = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = '', minlength = 0, gridDisplay = true, }, { tag = 'ACTION', label = 'Add mother as', type = 'LIST', value = 'name', values = { 'name', 'create', 'select' }, prompts = { 'Name Only', 'Create New Record', 'Use Existing Record', }, child = 'RECORD', childUpdate = selectOrCreate, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', recordtype = 'INDI', value = fhNewItemPtr(), protect = true, }, { tag = 'SEX', value = 'Female' }, }, title = 'Mother', seq = 4, gridDisplay = true, }, celebrant = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = '', minlength = 1, }, { tag = 'ACTION', label = 'Add celebrant as', type = 'LIST', value = 'name', values = { 'name', 'create', 'select' }, prompts = { 'Name Only', 'Create New Record', 'Use Existing Record', }, child = 'RECORD', childUpdate = selectOrCreate, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', recordtype = 'INDI', value = fhNewItemPtr(), protect = true, }, { tag = 'ROLE', label = 'Role', type = 'LIST', value = 'None', values = { 'None', 'Minister', 'Priest' }, }, }, title = 'Celebrant', seq = 2, gridDisplay = true, }, }, } --set up pre 1813 variant masterForms[2] = tablex.deepcopy(masterForms[1]) masterForms[2].templateName = 'Baptism pre 1813 (England and Wales).ftf' masterForms[2].templateDefault = [[Baptism {PRINCIPAL.NAMEUNLINKED} {DT-DATE} {TX-CHURCH} {PL-LOCATION} Baptisms solemnised in the Parish of {TX-CHURCH} {PL-LOCATION} in the Year {BAPTISM.YEAR} {BAPTISM.DAY} {BAPTISM.MONTH} {PRINCIPAL.NAME} {FATHER.NAME}{MOTHER.NAME}{PRINCIPAL.ADDR} {PRINCIPAL.PLAC} {PRINCIPAL.NOTES} ]] masterForms[2].sections = { principal = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = pCite:getValue 'NM-PRINCIPAL', minlength = 1, protect = true, }, { tag = 'ACTION', label = 'Add principal as', type = 'LIST', value = 'create', values = { 'create', 'select' }, prompts = { 'Create New Record', 'Use Existing Record' }, child = 'RECORD', childUpdate = function(...) return selectOrCreate(...) end, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', dr = 'PTR', value = fhNewItemPtr(), protect = true, child = 'FAMILY', childUpdate = function(...) return updateFamList(...) end, }, { tag = 'FAMILY', label = 'Family', type = 'LIST', value = ptrFamily, values = { ptrFamily }, prompts = { 'New Family as Child' }, }, { tag = 'SEX', type = 'LIST', label = 'Sex', dr = 'SEX', value = 'Male', values = { 'Male', 'Female', 'Unknown' }, }, { tag = 'PLAC', type = 'STRING', label = 'Abode Place', dr = 'RESI.PLAC', value = '', child = 'ADDR', childUpdate = function(place) return fh.createAddressList(place) end, }, { tag = 'ADDR', type = 'STRING', label = 'Abode Address', dr = 'RESI.ADDR', value = '', }, { tag = 'NOTES', label = 'Notes', type = 'STRING', value = '' }, { tag = 'BAPM', dr = 'BAPM' }, }, title = 'Principal', label = 'Principal', seq = 1, active = true, gridDisplay = true, }, father = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = '', minlength = 0, gridDisplay = true, }, { tag = 'ACTION', label = 'Add father as', type = 'LIST', value = 'name', values = { 'name', 'create', 'select' }, prompts = { 'Name Only', 'Create New Record', 'Use Existing Record', }, child = 'RECORD', childUpdate = selectOrCreate, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', recordtype = 'INDI', value = fhNewItemPtr(), protect = true, }, { tag = 'SEX', value = 'Male' }, }, title = 'Father', seq = 2, }, mother = { fields = { { tag = 'NAME', label = 'Name', type = 'STRING', dr = 'NAME', value = '', minlength = 0, gridDisplay = true, }, { tag = 'ACTION', label = 'Add mother as', type = 'LIST', value = 'name', values = { 'name', 'create', 'select' }, prompts = { 'Name Only', 'Create New Record', 'Use Existing Record', }, child = 'RECORD', childUpdate = selectOrCreate, }, { tag = 'RECORD', label = 'Record', type = 'RECORD', recordtype = 'INDI', value = fhNewItemPtr(), protect = true, }, { tag = 'SEX', value = 'Female' }, }, title = 'Mother', seq = 3, }, } return masterForms end -------------------------------------------------------------------------------------------------------- Start Plugin main()