%3 ::xowiki::Includelet ::xowiki::Includelet → html_encode ::xo::Context ::xo::Context exists_query_parameter export_vars get_parameters original_url_and_query process_query_parameter ::xowiki::Includelet->::xo::Context ::xotcl::Object ::xotcl::Object ::xo::Context->::xotcl::Object ::xowiki::includelet::personal-notification-messages ::xowiki::includelet::personal-notification-messages → get_messages_response → message_add → message_dismiss → modal_message_dialog → modal_message_dialog_register_submit ::xowiki::includelet::personal-notification-messages->::xowiki::Includelet

Class ::xowiki::includelet::personal-notification-messages

::xowiki::includelet::personal-notification-messages[i] create ... \
           [ -__decoration (default "plain") ] \
           [ -parameter_declaration (default " {-url_poll ""} {-url_dismiss ""} {-poll_interval 5000} ") ]

Personal notification messages This includelet can be used for personal messaging, where a sender can send messages to a single user in a single applications (e.g. in an exam), where the user has to acknowledge every single message to make it disappear (current implementation). The messages are not persisted (current implementation).
Defined in packages/xowiki/tcl/personal-notification-procs.tcl

Class Relations

  • class: ::xotcl::Class[i]
  • superclass: ::xowiki::Includelet[i]
::xotcl::Class create ::xowiki::includelet::personal-notification-messages \
     -superclass ::xowiki::Includelet

Methods (to be applied on the object)

  • get_messages_response (scripted, public)

     xowiki::includelet::personal-notification-messages[i] get_messages_response \
        [ -notification_id notification_id ] [ -user_id user_id ]

    Get all messages for the notification-id and the give user in form of an AJAX array.

    Switches:
    -notification_id
    (optional)
    -user_id
    (optional)

    Partial Call Graph (max 5 caller/called nodes):
    %3 xo::get_user_name xo::get_user_name xowiki::includelet::personal-notification-messages proc get_messages_response xowiki::includelet::personal-notification-messages proc get_messages_response xowiki::includelet::personal-notification-messages proc get_messages_response->xo::get_user_name

    Testcases:
    No testcase defined.
    #
    # Get messages for this notification_id and user. This function
    # returns a JSON result.
    #
    # TODO: replace inclass_exam with personal_notifications
    if {[nsv_dict exists inclass_exam $notification_id $user_id]} {
      set msgs [nsv_dict get inclass_exam $notification_id $user_id]
    } else {
      set msgs {}
    }
       #
    # Convert the messages to JSON. The timestamp (ts) is used as an
    # ID for an individual message.
    #
    set json {}
    foreach {ts msgDict} $msgs {
      set msg  [string map {\" {\"} \n {<br>}} [dict get $msgDict msg]]
      set from [string map {\" {\"} \n {<br>}} [::xo::get_user_name [dict get $msgDict from]]]
      set urgency [string map {\" {\"} \n {<br>}} [dict get $msgDict urgency]]
      lappend json [subst -nobackslash {{"text""$msg","ts":$ts,"from":"$from","urgency":"$urgency"}}]
    }
    return [subst {\[[join $json ,]\]}]
  • message_add (scripted, public)

     xowiki::includelet::personal-notification-messages[i] message_add \
        [ -notification_id notification_id ] [ -to_user_id to_user_id ] \
        -payload payload 

    Send the user a message. The payload has the form of a dict containing at least "msg" and "from" (in form of a user_id).

    Switches:
    -notification_id
    (optional)
    -to_user_id
    (optional)
    -payload
    (required)

    Partial Call Graph (max 5 caller/called nodes):
    %3

    Testcases:
    No testcase defined.
    #
    # Set the timestamp to [clock microseconds]. It is assumed that we have
    # at most one message per microsecond to this user.
    #
    foreach to_user_id $to_user_id {
      nsv_dict set inclass_exam $notification_id $to_user_id  [clock microseconds]  $payload
    }
  • message_dismiss (scripted, public)

     xowiki::includelet::personal-notification-messages[i] message_dismiss \
        [ -notification_id notification_id ] [ -user_id user_id ] \
        [ -ts ts ]

    The user has dismissed a message. flush this message from the set of displayed messages.

    Switches:
    -notification_id
    (optional)
    -user_id
    (optional)
    -ts
    (optional)

    Partial Call Graph (max 5 caller/called nodes):
    %3

    Testcases:
    No testcase defined.
    nsv_dict unset inclass_exam $notification_id $user_id $ts
  • modal_message_dialog (scripted, public)

     xowiki::includelet::personal-notification-messages[i] modal_message_dialog \
        [ -to_user_id to_user_id ] [ -title title ] [ -adpicon adpicon ]

    Create a bootstrap3 modal dialog

    Switches:
    -to_user_id
    (optional)
    -title
    (defaults to "#xowiki.Send_message_to#") (optional)
    -adpicon
    (defaults to "pencil") (optional)

    Partial Call Graph (max 5 caller/called nodes):
    %3 xo::get_user_name xo::get_user_name xowiki::includelet::personal-notification-messages proc modal_message_dialog xowiki::includelet::personal-notification-messages proc modal_message_dialog xowiki::includelet::personal-notification-messages proc modal_message_dialog->xo::get_user_name

    Testcases:
    No testcase defined.
    if {[llength $to_user_id] == 1} {
      set id dialog-msg-$to_user_id
      set to_user_name [::xo::get_user_name $to_user_id]
    } else {
      set id dialog-msg-all
      set to_user_name " [llength $to_user_id] #xowiki.Participants#"
    }
    append title " " $to_user_name
    
    foreach to_user_id $to_user_id {
      append input_fields [subst {<input type="hidden" name="to_user_id" value="$to_user_id">}]
    }
    set btnDefault [::xowiki::CSS class btn-default]
    return [list link [subst {
      <a href="#$id" title="$title" role="button" data-toggle="modal" data-keyboard="false">
      <adp:icon name="$adpicon" aria-hidden="true"></span>
    }] dialog [subst {
      <div class="modal fade" id='$id' tabindex="-1" role="dialog">
      <div class="modal-dialog" role="document">
    <form role="form" class="form-vertical" method="post" action="">
      <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      <h4 class="modal-title">$title</h4>
    </div><!-- modal-header -->
    
    <div class="modal-body">
      <div class="form-group">
      <label for="msg"><adp:icon name="$adpicon"#xowiki.Message#</label>
        <input class="form-control" id="msg" name="msg" placeholder="#xowiki.Enter_message#" required autofocus>
      </div>
      <div class="form-group">
      #xowiki.Urgency#
        <label class="radio-inline" for="option1">#xowiki.urgency_low#</label>
        <input id="option1" name="urgency" value="info" type="radio">
        <label class="radio-inline" for="option2">#xowiki.urgency_normal#</label>
        <input id="option2" name="urgency" value="warning" type="radio" checked>
        <label class="radio-inline" for="option3">#xowiki.urgency_high#</label>
        <input id="option3" name="urgency" value="danger" type="radio">
      </div> <!--form-group-->
    
      $input_fields
    </div><!--modal-body-->
    <div class="modal-footer">
    <button type="button" class="btn $btnDefault" data-dismiss="modal">#acs-kernel.common_Close#</button>
    <button type="submit" class="btn $btnDefault submit" data-id="$id" data-dismiss="modal">#xowiki.Send#</button>
    </div>
      </div>
    </form>
      </div><!--modal-dialog-->
      </div><!--modal-->
    }]]
  • modal_message_dialog_register_submit (scripted, public)

     xowiki::includelet::personal-notification-messages[i] modal_message_dialog_register_submit \
        -url url 

    Register a submit callback for all bootstrap3 modal dialogs having an .submit class.

    Switches:
    -url
    (required)

    Partial Call Graph (max 5 caller/called nodes):
    %3 test_create_test_items create_test_items (test xowf) xowiki::includelet::personal-notification-messages proc modal_message_dialog_register_submit xowiki::includelet::personal-notification-messages proc modal_message_dialog_register_submit test_create_test_items->xowiki::includelet::personal-notification-messages proc modal_message_dialog_register_submit template::add_body_script template::add_body_script (public) xowiki::includelet::personal-notification-messages proc modal_message_dialog_register_submit->template::add_body_script

    Testcases:
    create_test_items
    template::add_body_script -script [subst {
      document.querySelectorAll('div.modal form .submit').forEach(function(e) {
        e.addEventListener('click', function(ev){
          ev.preventDefault();
          //console.log(ev.target.dataset.id);
          var form = document.querySelector('#' + ev.target.dataset.id + ' form');
    
          var data = new FormData(form);
          var xhttp = new XMLHttpRequest();
          xhttp.open('POST', '$url', true);
          xhttp.onload = function () {
            //console.log(this.responseText);
          };
          xhttp.send(data);
        });});
    }]