diff --git a/app/appdb.cls b/app/appdb.cls index 3ada79c..0c8571b 100644 --- a/app/appdb.cls +++ b/app/appdb.cls @@ -84,6 +84,7 @@ return -1 end contactId = db~lastInsertRowId() /* the row id of 'contacts' table is the master id */ + self~addPhoneNumber(contactId, contactDict["PHONE_TYPE"], contactDict["PHONE_NUMBER"]) self~addEmailAddress(contactId, contactDict["EMAIL_TYPE"], contactDict["EMAIL_ADDRESS"]) self~addRealAddress(contactId, contactDict~addressType, contactDict~street, contactDict~city, contactDict~state, @@ -109,10 +110,29 @@ END return contacts[1] /* Rexx is 1-indexed */ + /*************************** + * GET ALL CONTACT INFO * + ***************************/ ::METHOD getAllContacts expose db sql = "SELECT * FROM contacts ORDER BY last_name, first_name" contacts = db~exec(sql, .true, .ooSQLite~OO_ARRAY_OF_DIRECTORIES) + + do contact over contacts + /* Get Phone Numbers */ + psql = "SELECT * FROM phone_numbers WHERE contact_id = "contact["ID"] + phones = db~exec(psql,.true,.ooSQLite~OO_ARRAY_OF_DIRECTORIES) + phone = phones[1] /* just grab the first phone */ + contact["PHONE_NUMBER"] = phone["NUMBER"] + contact["PHONE_TYPE"] = phone["TYPE"] + + /* Now get email addresses */ + esql = "SELECT * FROM email_addresses WHERE contact_id = "contact["ID"] + emails = db~exec(esql,.true,.ooSQLite~OO_ARRAY_OF_DIRECTORIES) + email = emails[1] + contact["EMAIL_ADDRESS"] = email["EMAIL"] + contact["EMAIL_TYPE"] = email["TYPE"] + END return contacts ::METHOD searchContacts @@ -144,6 +164,9 @@ end return rc + /************************** + * DELETE CONTACT * + *************************/ ::METHOD deleteContact expose db use arg contactId diff --git a/app/appui.cls b/app/appui.cls index 878d8c9..33241de 100644 --- a/app/appui.cls +++ b/app/appui.cls @@ -87,6 +87,9 @@ panel~refresh RETURN + /*********************** + * SETUP MAIN MENU * + ***********************/ ::method setupMainMenu expose mainMenu menuwin menu_items menu_keys selected use arg win @@ -106,12 +109,14 @@ menu_items = .array~of("[A]dd Contact", "[D]elete Contact", "[E]dit Contact", "[S]earch", "[L]ist All", "[Q]uit") menu_keys = .array~of("a", "d", "e", "s", "l", "q") - /* Display menu items */ .environment~selected = 1 self~DrawMenu(menuwin, menu_items, .environment~selected, win) menuwin~refresh RETURN + /*********************** + * DRAW MENU * + ***********************/ ::method DrawMenu expose win menu_items menu_keys selected mainwin use arg menuwin, items, selected, mainwin @@ -131,6 +136,9 @@ menuwin~refresh return + /*********************** + * DROP WINDOW * + ***********************/ ::method dropWindow expose win menuwin use arg window @@ -153,7 +161,7 @@ max_y = win~lines max_x = win~cols form_height = 14 - form_width = 50 + form_width = 55 start_y = (max_y - form_height) % 2 start_x = (max_x - form_width) % 2 formwin = self~DrawSubPanel(form_height, form_width, start_y, start_x, 0, "Add New Contact", .true) @@ -161,8 +169,8 @@ /* Create form fields */ formwin~mvaddstr(3, 2, "First Name: ") formwin~mvaddstr(4, 2, "Last Name: ") - formwin~mvaddstr(5, 2, "Phone: ") - formwin~mvaddstr(6, 2, "Email: ") + formwin~mvaddstr(5, 2, "Phone: "); formwin~mvaddstr(5, 35, "Type: "); + formwin~mvaddstr(6, 2, "Email: "); formwin~mvaddstr(7, 2, "Email Type: "); formwin~mvaddstr(form_height-2, 2, "[Enter] to save, [Esc] to cancel") formwin~refresh() @@ -178,11 +186,21 @@ RETURN END phone = self~getInputField(formwin, 5, 14, 15) + if phone = .nil then do + self~dropWindow(formwin) + RETURN + END + phone_type = self~getInputField(formwin, 5, 45, 15) if phone = .nil then do self~dropWindow(formwin) RETURN END email = self~getInputField(formwin, 6, 14, 30) + if email = .nil then do + self~dropWindow(formwin) + RETURN + END + email_type = self~getInputField(formwin, 7, 14, 15) if email = .nil then do self~dropWindow(formwin) RETURN @@ -198,8 +216,10 @@ contactDict = .Directory~new() contactDict["FIRST_NAME"] = firstName contactDict["LAST_NAME"] = lastName - contactDict["PHONE"] = phone - contactDict["EMAIL"] = email + contactDict["PHONE_NUMBER"] = phone + contactDict["PHONE_TYPE"] = phone_type + contactDict["EMAIL_ADDRESS"] = email + contactDict["EMAIL_TYPE"] = email_type result = db~addContact(contactDict) /* Display result message */ @@ -267,7 +287,7 @@ max_y = win~lines max_x = win~cols list_height = max_y - 5 - list_width = 70 + list_width = max_x - 23 start_y = (max_y - list_height) % 2 start_x = (max_x - list_width) % 2 @@ -277,27 +297,25 @@ /* Display column headers */ listwin~attron(listwin~A_BOLD) - listwin~mvaddstr(3, 2, "ID") - listwin~mvaddstr(3, 6, "First Name") - listwin~mvaddstr(3, 22, "Last Name") - listwin~mvaddstr(4, 2, "-- ---------- ---------") - /* listwin~mvaddstr(2, 38, "Phone") - listwin~mvaddstr(2, 54, "Email") */ + listwin~mvaddstr(4, 2, "ID") + listwin~mvaddstr(4, 6, "First Name") + listwin~mvaddstr(4, 18, "Last Name") + listwin~mvaddstr(4, 30, "Phone") + listwin~mvaddstr(4, 50, "Email") + listwin~mvaddstr(5, 2, "-- ---------- --------- --------------- ------------------") listwin~attroff(listwin~A_BOLD) - /* Get all contacts */ contacts = db~getAllContacts() /* Display contacts */ if contacts~items > 0 then do do i = 1 to contacts~items contact = contacts[i] - listwin~mvaddstr(i+4, 2, contact['ID']) - listwin~mvaddstr(i+4, 6, contact['FIRST_NAME']) - listwin~mvaddstr(i+4, 22, contact['LAST_NAME']) - /* listwin~mvaddstr(i+3, 38, contact['phone']) - listwin~mvaddstr(i+3, 54, contact['email']) */ - + listwin~mvaddstr(i+5, 2, contact['ID']) + listwin~mvaddstr(i+5, 6, contact['FIRST_NAME']) + listwin~mvaddstr(i+5, 18, contact['LAST_NAME']) + listwin~mvaddstr(i+5, 30, contact['PHONE_NUMBER']) + listwin~mvaddstr(i+5, 50, contact['EMAIL_ADDRESS']) /* Break if we run out of screen space */ if i > list_height-7 then LEAVE end @@ -305,12 +323,7 @@ else do listwin~mvaddstr(5, 5, "No contacts found.") end - /* - listwin~mvaddstr(list_height-1, 2, "Press any key to return to main menu") - listwin~refresh() - */ - /* Wait for any key */ listwin~getch() self~dropWindow(listwin) RETURN @@ -352,6 +365,9 @@ self~displaySearchResults(term) return + /************************** + * DISPLAY SEARCH RESULTS * + **************************/ ::METHOD displaySearchResults expose win menuwin db use arg term @@ -408,7 +424,9 @@ end return buffer + /***************/ /** MAIN LOOP **/ + /***************/ ::method mainLoop expose win mainMenu menuwin selected menu_items menu_keys menuwin~refresh @@ -462,7 +480,9 @@ end /* do while running */ return - /* Process selection */ + /*********************** + * PROCESS SELECTION * + ***********************/ ::METHOD ProcessSelection expose menu_items menu_keys use arg menuwin, key_char diff --git a/db/contacts.sqlite b/db/contacts.sqlite index 7533425..8585a86 100644 Binary files a/db/contacts.sqlite and b/db/contacts.sqlite differ