Mercurial > libervia-web
diff libervia/pages/photos/album/_browser/__init__.py @ 1331:fe353fceec38
browser (invitation, photos/album): invitation manager improvments:
invitation manager has been moved to a separated module, it is generic so it can be used
with other activities.
It has been simplified, and contact to add are dynamically filtered using a text input.
Invitation are done by email using a the new modal.
New notification module is used to indicate when invitation has been done.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 14 Aug 2020 09:31:32 +0200 |
parents | b525fdcb393b |
children | a75d82713a02 |
line wrap: on
line diff
--- a/libervia/pages/photos/album/_browser/__init__.py Fri Aug 14 09:31:32 2020 +0200 +++ b/libervia/pages/photos/album/_browser/__init__.py Fri Aug 14 09:31:32 2020 +0200 @@ -1,12 +1,18 @@ -from browser import document, window, bind, html, DOMNode, timer +from browser import document, window, bind, html, DOMNode from javascript import JSON from bridge import Bridge from template import Template import dialog from slideshow import SlideShow +from invitation import InvitationManager +cache_path = window.cache_path files_service = window.files_service files_path = window.files_path +try: + affiliations = window.affiliations.to_dict() +except AttributeError: + pass bridge = Bridge() # file upload @@ -177,136 +183,10 @@ # manage -def on_manager_close(manager_panel_elt): - side_panel = manager_panel_elt.select_one('.invitation_manager_side_panel') - side_panel.classList.remove('open') - side_panel.bind("transitionend", lambda evt: manager_panel_elt.remove()) - -def _on_invitation_cb(field_elt, entity): - print(f"invitation for {entity!r} sent successfully") - submit_elt = document['invitation_submit'] - submit_elt.disabled = False - form_elt = document['invitation_form'] - form_elt.disabled = False - jids_elt = form_elt.select_one('*[name="jids"]') - emails_elt = form_elt.select_one('*[name="emails"]') - new = [d.strip() for d in field_elt.value.split('\n') if d and d.strip() != entity] - field_elt.value = '\n'.join(new) - if not jids_elt.value.strip() and not emails_elt.value.strip(): - # FIXME: Q&D notification, needs to do this properly in a separated module with - # some animations - notifs_elt = document['invitation_notifications'] - notification_elt = html.DIV(Class="notification is-success has-text-centered") - notification_elt <= "invitations sent successfully" - notifs_elt <= notification_elt - timer.set_timeout(lambda: notification_elt.remove(), 5000) - - -def invitationSimpleCreateCb(invitation_data, email): - invitee_jid = invitation_data['jid'] - album_name = files_path.rsplit('/')[-1] - form_elt = document['invitation_form'] - emails_elt = form_elt.select_one('*[name="emails"]') - bridge.FISInvite( - invitee_jid, - files_service, - "photos", - "", - files_path, - album_name, - '', - callback=lambda: _on_invitation_cb(emails_elt, email), - errback=lambda e: window.alert(f"invitation failed for {email}: {e}") - ) - - -def invite_by_email(email): - guest_url_tpl = f'{window.URL.new("/g", document.baseURI).href}/{{uuid}}' - bridge.invitationSimpleCreate( - email, - guest_url_tpl, - '', - callback=lambda data: invitationSimpleCreateCb(data, email), - errback=lambda e: window.alert(f"can't send email invitation: {e}") - ) - - -def on_invitation_submit(evt, manager_panel_elt): - evt.stopPropagation() - evt.preventDefault() - submit_elt = document['invitation_submit'] - submit_elt.disabled = True - form_elt = document['invitation_form'] - form_elt.disabled = True - jids_elt = form_elt.select_one('*[name="jids"]') - emails_elt = form_elt.select_one('*[name="emails"]') - jids = [j.strip() for j in jids_elt.value.split('\n') if j.strip()] - emails = [e.strip() for e in emails_elt.value.split('\n') if e.strip()] - album_name = files_path.rsplit('/')[-1] - for entity_jid in jids: - print(f"inviting {entity_jid}") - bridge.FISInvite( - entity_jid, - files_service, - "photos", - "", - files_path, - album_name, - '', - callback=lambda entity=entity_jid: _on_invitation_cb(jids_elt, entity), - errback=lambda e: window.alert(f"invitation failed: {e}") - ) - - for email in emails: - invite_by_email(email) - - print(f"{jids=}, {emails=}") - - -def _FISAffiliationSetCb(affiliation_elt): - affiliation_elt.remove() - - -def on_affiliation_remove(entity_jid, affiliation_elt): - bridge.FISAffiliationsSet( - files_service, - "", - files_path, - {entity_jid: "none"}, - callback=lambda: _FISAffiliationSetCb(affiliation_elt), - errback=lambda e: window.alert(f"can't remove affiliation: {e}") - ) - @bind("#button_manage", "click") def manage_click(evt): evt.stopPropagation() evt.preventDefault() - manager_panel_tpl = Template('invitation/manager.html') - manager_panel_elt = manager_panel_tpl.get_elt() - document.body <= manager_panel_elt - document['invitation_submit'].bind( - "click", lambda evt: on_invitation_submit(evt, manager_panel_elt)) - side_panel = manager_panel_elt.select_one('.invitation_manager_side_panel') - timer.set_timeout(lambda: side_panel.classList.add("open"), 0) - for close_elt in manager_panel_elt.select('.click_to_close'): - close_elt.bind("click", lambda evt: on_manager_close(manager_panel_elt)) - side_panel.bind("click", lambda evt: evt.stopPropagation()) - affiliations = window.affiliations.to_dict() - affiliation_tpl = Template('invitation/affiliation_item.html') - for entity_jid, affiliation in affiliations.items(): - affiliation_elt = affiliation_tpl.get_elt({ - "entity_jid": entity_jid, - "affiliation": affiliation, - }) - document['affiliations'] <= affiliation_elt - for elt in affiliation_elt.select(".click_to_delete"): - elt.bind( - "click", - lambda evt, - entity_jid=entity_jid, - affiliation_elt=affiliation_elt: on_affiliation_remove( - entity_jid, - affiliation_elt - ) - ) + manager = InvitationManager("photos", {"service": files_service, "path": files_path}) + manager.attach(affiliations=affiliations)