import json from random import randrange from flask import ( Flask, render_template, request, send_from_directory, ) import jinja_partials from helpers import ( get_contacts, get_contact, save_contacts, get_page_of_agents, activate_contacts, get_active_contacts, delete_contact, ) app = Flask(__name__) jinja_partials.register_extensions(app) @app.route("/") @app.route("/examples/") def get_htmx_examples(): contacts = get_contacts() return render_template('htmx_examples.html') @app.route("/examples/click-to-edit/") def get_click_to_edit(): contacts = get_contacts() return render_template( 'click_to_edit.html', id=1, contact=contacts[1], contacts=contacts) @app.route( "/contact/", methods=['GET']) def get_single_contact(id): contacts = get_contacts() return jinja_partials.render_partial( 'partials/click_to_edit_contact_get.html', id=id, contact=contacts[id]) @app.route( "/contact/", methods=['PUT']) def put_contact(id): contacts = get_contacts() contacts[id]['name'] = request.form['firstName'] contacts[id]['surname'] = request.form['lastName'] contacts[id]['email'] = request.form['email'] save_contacts(contacts) return jinja_partials.render_partial( 'partials/click_to_edit_contact_get.html', id=id, contact=contacts[id]) @app.route("/contact//edit") def get_contact_edit_form(id): contacts = get_contacts() return jinja_partials.render_partial( 'partials/click_to_edit_contact_put.html', id=id, contact=contacts[id]) @app.route("/examples/bulk-update/") def get_bulk_update(): contacts = get_contacts() return render_template( 'bulk_update.html', contacts=contacts) @app.route("/activate", methods=['PUT']) def activate(): contacts = get_contacts() for id in request.form.getlist('ids'): contacts[int(id)-1]['status']='active' save_contacts(contacts) return jinja_partials.render_partial( 'partials/bulk_update_get.html', contacts=contacts) @app.route("/deactivate", methods=['PUT']) def deactivate(): contacts = get_contacts() for id in request.form.getlist('ids'): contacts[int(id)-1]['status']='inactive' save_contacts(contacts) return jinja_partials.render_partial( 'partials/bulk_update_get.html', contacts=contacts) @app.route("/examples/click-to-load/") def get_click_to_load(): page_number = request.args.get('page', default=1, type=int) agents = get_page_of_agents(page_number) return render_template( 'click_to_load.html', next_page=page_number+1, agents=agents) @app.route("/contacts/") def get_contacts_for_load(): page_number = request.args.get('page', default=1, type=int) agents = get_page_of_agents(page_number) return render_template( 'partials/click_to_load_get.html', next_page=page_number+1, agents=agents) @app.route("/examples/delete-row/") def get_delete_row(): activate_contacts() contacts = get_active_contacts() return render_template( 'delete_row.html', contacts=contacts) @app.route( "/contact//", methods=['DELETE']) def delete_row(id): delete_contact(id) return "" @app.route("/examples/edit-row/") def get_edit_row(): contacts = get_contacts() return render_template( 'edit_row.html', contacts=contacts) @app.route("/contacts//edit") def get_contact_for_edit(id): contact = get_contact(id) return render_template( 'partials/edit_row_get_single_row.html', contact=contact) @app.route( "/contacts//", methods=["GET"]) def get_contact_for_row(id): contact = get_contact(id) return render_template( 'partials/edit_row_show_single_row.html', contact=contact) @app.route( "/contacts//", methods=["PUT"]) def put_contact_for_row(id): contacts = get_contacts() contacts[id-1]['name'] = request.form['name'] contacts[id-1]['email'] = request.form['email'] save_contacts(contacts) return render_template( 'partials/edit_row_show_single_row.html', contact=contacts[id-1]) @app.route("/examples/confirm/") def get_confirm(): return render_template( 'confirm.html') @app.route("/confirmed/") def get_confirmed(): return "Confirmed" @app.route("/examples/lazy-load/") def get_lazy_load(): return render_template( 'lazy_load.html') @app.route("/graph") def get_graph(): return "Tokyo Climate" @app.route("/examples/inline-validation/") def get_inline_validation(): return render_template( 'inline_validation.html') @app.route( "/contact/email", methods=["POST"]) def post_contact_email(): email = request.form['email'] if email == 'test@test.com': return render_template( 'partials/inline_validation_email.html', email=email ) elif '.com' in email: error_message = 'That email is already taken. Please enter another email.' else: error_message = 'Please enter a valid email address' return render_template( 'partials/inline_validation_error.html', email=email, error_message = error_message ) @app.route("/examples/infinite-scroll/") def get_infinite_scroll(): page_number = request.args.get('page', default=1, type=int) agents = get_page_of_agents(page_number) last_agent = agents.pop() return render_template( 'infinite_scroll.html', next_page=page_number+1, agents=agents, last_agent=last_agent) @app.route("/infinite-scroll-contacts") def get_contacts_for_scroll(): page_number = request.args.get('page', default=1, type=int) agents = get_page_of_agents(page_number) last_agent = agents.pop() return render_template( 'partials/infinite_scroll_get.html', next_page=page_number+1, agents=agents, last_agent=last_agent) @app.route("/examples/active-search/") def get_active_search(): return render_template( 'active_search.html') @app.route( "/search", methods=['POST']) def get_search(): search_string = request.form['search'] results = [] if not search_string=="": results = [ {'name': f'{search_string}{i}', 'surname': 'Hivemind', 'email': f'{search_string}{i}@hivemind.org'} for i in range(1,4) ] return render_template( 'partials/active_search_get.html', results=results) @app.route("/examples/progress-bar/") def get_progress_bar(): return render_template( 'progress_bar.html') @app.route( "/start", methods=['POST']) def get_start(): return render_template( 'partials/progress_bar_job.html', percentage=0) @app.route( "/job", methods=['GET']) def get_job(): # In production percentage must come # from a background job runner. # Here it is simulated. percentage = randrange(1,3)*50 if percentage==50: return render_template( 'partials/progress_bar_job.html', percentage=percentage) else: return render_template( 'partials/progress_bar_restart.html') all_models = { 'audi': ["A1", "A4", "A6"], 'toyota': ["Landcruiser", "Tacoma", "Yaris"], 'bmw': ["325i", "325ix", "X5"], } @app.route("/examples/value-select/") def get_value_select(): make_models = all_models['toyota'] return render_template( 'value_select.html', models=make_models) @app.route( "/models", methods=['GET']) def get_models(): make = request.args.get('make') make_models = all_models[make] return render_template( 'partials/value_select_models.html', models=make_models) @app.route("/examples/dialogs/") def get_dialogs(): return render_template( 'dialogs.html') @app.route( "/submit", methods=['POST']) def submit(): return request.headers.get('HX-Prompt') @app.route("/examples/modal-custom/") def get_custom_modal_dialogs(): return render_template( 'modal_custom.html') @app.route( "/modal", methods=['GET']) def get_modal(): return render_template( 'modal_custom_modal.html' ) @app.route("/examples/tabs-hateoas/") def get_tabs_hateoas(): return render_template( 'tabs_hateoas.html') @app.route("/tab1") def get_tabs_hateoas_tab1(): return render_template( 'partials/tabs_hateoas_tab1.html') @app.route("/tab2") def get_tabs_hateoas_tab2(): return render_template( 'partials/tabs_hateoas_tab2.html') @app.route("/tab3") def get_tabs_hateoas_tab3(): return render_template( 'partials/tabs_hateoas_tab3.html') @app.route("/examples/tabs-hyperscript/") def get_tabs_hyperscript(): return render_template( 'tabs_hyperscript.html') @app.route("/tab1-hyperscript") def get_tabs_hyperscript_tab1(): return render_template( 'partials/tabs_hyperscript_tab1.html') @app.route("/tab2-hyperscript") def get_tabs_hyperscript_tab2(): return render_template( 'partials/tabs_hyperscript_tab2.html') @app.route("/tab3-hyperscript") def get_tabs_hyperscript_tab3(): return render_template( 'partials/tabs_hyperscript_tab3.html') def create_items(ids): return [ {'id':id, 'value': f'Item {id}'} for id in ids ] @app.route("/examples/sortable/") def get_sortable(): return render_template( 'sortable.html', items=create_items([1,2,3,4,5])) @app.route( "/items", methods=['POST']) def get_items(): return render_template( 'partials/sortable_items.html', items=create_items( request.form.getlist('item'))) @app.route("/examples/update-other-content/") def get_update_other_content(): return render_template( 'update_other_content.html', contacts = get_contacts()) @app.route( "/update-other-contents-expand-target-contacts", methods=['POST']) def post_update_other_contents_expand_target_contact(): contacts = get_contacts() contacts[id]['name'] = request.form['firstName'] contacts[id]['surname'] = request.form['lastName'] contacts[id]['email'] = request.form['email'] save_contacts(contacts) return jinja_partials.render_partial( 'partials/click_to_edit_contact_get.html', id=id, contact=contacts[id])