Index: openacs-4/packages/xowf/xowf.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/xowf.info,v diff -u -N -r1.12.2.31 -r1.12.2.32 --- openacs-4/packages/xowf/xowf.info 29 Mar 2021 09:04:00 -0000 1.12.2.31 +++ openacs-4/packages/xowf/xowf.info 5 Apr 2021 18:02:55 -0000 1.12.2.32 @@ -10,16 +10,16 @@ t xowf - + Gustaf Neumann XoWiki Content Flow - an XoWiki based workflow system implementing state-based behavior of wiki pages and forms 2017-08-06 WU Vienna BSD-Style 2 - - + + Index: openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml,v diff -u -N -r1.2.2.46 -r1.2.2.47 --- openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 26 Feb 2021 11:37:22 -0000 1.2.2.46 +++ openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 5 Apr 2021 18:02:55 -0000 1.2.2.47 @@ -209,4 +209,8 @@ Optionen f�r Online-Beaufsichtigung Detailangaben, welche Funktionen der Online-Beaufsichtigung genutzt werden sollen Vorschau + + Frage markieren + Makierung l�schen + Index: openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml,v diff -u -N -r1.2.2.46 -r1.2.2.47 --- openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 29 Mar 2021 09:08:27 -0000 1.2.2.46 +++ openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 5 Apr 2021 18:02:55 -0000 1.2.2.47 @@ -228,4 +228,7 @@ Proctoring Options Options to tailor proctoring behavior Preview + + Flag this Question + Remove Flag Index: openacs-4/packages/xowf/lib/inclass-exam-answer.wf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/lib/Attic/inclass-exam-answer.wf,v diff -u -N -r1.1.2.34 -r1.1.2.35 --- openacs-4/packages/xowf/lib/inclass-exam-answer.wf 3 Apr 2021 18:12:50 -0000 1.1.2.34 +++ openacs-4/packages/xowf/lib/inclass-exam-answer.wf 5 Apr 2021 18:02:55 -0000 1.1.2.35 @@ -97,7 +97,7 @@ :set_property position $position } Action instproc set_page {obj increment} { - set parent_obj [::xo::db::CrClass get_instance_from_db -item_id [$obj parent_id]] + set parent_obj [::xo::db::CrClass get_instance_from_db -item_id [$obj parent_id]] set pages [:{$QM} question_names $parent_obj] set position [:property position 0] incr position $increment @@ -109,7 +109,7 @@ :goto_page $position } -Action create prevQuestion \ +Action create previousQuestion \ -state_safe true \ -next_state working \ -label #xowf.previous_question# \ @@ -132,6 +132,23 @@ -state_safe true \ -label #xowf.online-exam-save# +Action create flag \ + -state_safe true \ + -proc activate {obj} { + # + # In case, the current question is flagged, remove flag, + # otherwise add flag. + # + set flagged [:property flagged {}] + set i [lsearch $flagged [:property position 0]] + if {$i > -1} { + set flagged [lreplace $flagged $i $i] + } else { + lappend flagged $position + } + $obj set_property -new 1 flagged $flagged + } + Action create logout \ -state_safe true \ -next_state done \ @@ -466,33 +483,27 @@ # questions due to shuffling. # set current_position [:property position] - set actions {} - #if {$current_position > 0 && ${:state} eq "working"} { - # lappend actions prevQuestion - #} - if {${:state} ne "done"} { - if {$question_count > 1} { - for {set count 1} {$count <= $question_count} {incr count} { - ${container}::Action create ${container}::q.$count \ - -label "$count" \ - -state_safe true \ - -next_state working \ - -extra_css_class [expr {$current_position == $count - 1 ? "current" : ""}] \ - -proc activate {obj} [subst { - next - :goto_page [expr {$count -1}] - }] - lappend actions q.$count - } + if {${:state} ne "done"} { + set revision_sets [expr {[info exists :item_id] ? [:get_revision_sets -with_instance_attributes] : ""}] + set positions {} + foreach revision_set $revision_sets { + dict set positions [dict get [ns_set get $revision_set instance_attributes] position] 1 } - if { ${:state} in {initial working} - && [${:QM} more_ahead -position $current_position $parent_obj] - } { - lappend actions nextQuestion - } + set pagination [${:QM} pagination_actions \ + -container $container \ + -visited [dict keys $positions] \ + -flagged [:property flagged {}] \ + -question_count $question_count \ + -current_position $current_position \ + ] + + set actions $pagination if {${:state} in {initial working} } { + if {$question_count > 1} { + lappend actions flag + } lappend actions save } lappend actions logout Index: openacs-4/packages/xowf/tcl/test-item-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/tcl/test-item-procs.tcl,v diff -u -N -r1.7.2.120 -r1.7.2.121 --- openacs-4/packages/xowf/tcl/test-item-procs.tcl 1 Apr 2021 17:24:57 -0000 1.7.2.120 +++ openacs-4/packages/xowf/tcl/test-item-procs.tcl 5 Apr 2021 18:02:55 -0000 1.7.2.121 @@ -710,8 +710,11 @@ "{#xowiki.multiple_lines# multiple_lines}" "{#xowiki.file_upload# file_upload}" } " "] + # + # The options field is made "required" to avoid deselecting. + # set textEntryConfigSpec [subst { - {options {radio,horizontal=true,form_item_wrapper_CSSclass=form-inline,options=$render_hints,default=single_word,label=#xowf.answer#}} + {options {radio,horizontal=true,form_item_wrapper_CSSclass=form-inline,options=$render_hints,default=single_word,required,label=#xowf.answer#}} {lines {number,form_item_wrapper_CSSclass=form-inline,default=1,min=1,label=#xowf.lines#}} }] @@ -2784,6 +2787,7 @@ # # - goto_page # - more_ahead + # - pagination_actions # # - current_question_form # - current_question_obj @@ -2823,6 +2827,81 @@ return [expr {$position + 1 < [:question_count $obj]}] } + :method pagination_button_css { + {-CSSclass "btn-sm"} + {-cond:boolean,required} + {-extra ""} + } { + if {$cond} { + append CSSclass " " $extra + } + return $CSSclass + } + + :public method pagination_actions { + -container:object + -question_count:integer + {-visited:integer,0..n {}} + {-flagged:integer,0..n {}} + -current_position:integer + {-CSSclass "btn-sm"} + } { + # + # Create actions used for pagination. + # + set actions "" + + if {$question_count > 1} { + set extra_css [:pagination_button_css \ + -CSSclass $CSSclass \ + -cond [expr {$current_position == 0}] \ + -extra "disabled"] + ${container}::previousQuestion configure \ + -extra_css_class $extra_css \ + -label "«" \ + -label_noquote true \ + -wrapper_CSSclass "pagination" + lappend actions previousQuestion + + for {set count 1} {$count <= $question_count} {incr count} { + set visited_css [expr {($count - 1) in $visited ? "visited" : ""}] + set flag_label [expr {($count - 1) in $flagged + ? " " : ""}] + set extra_css [:pagination_button_css \ + -CSSclass "$CSSclass $visited_css" \ + -cond [expr {$current_position == $count - 1 }] \ + -extra "active current"] + ${container}::Action create ${container}::q.$count \ + -label "$count$flag_label" \ + -label_noquote true \ + -state_safe true \ + -next_state working \ + -wrapper_CSSclass "pagination" \ + -extra_css_class $extra_css \ + -proc activate {obj} [subst { + next + :goto_page [expr {$count - 1}] + }] + lappend actions q.$count + } + set extra_css [:pagination_button_css \ + -CSSclass $CSSclass \ + -cond [expr {$current_position+2 > $question_count}] \ + -extra "disabled"] + ${container}::nextQuestion configure \ + -extra_css_class $extra_css \ + -label "»" \ + -label_noquote true \ + -wrapper_CSSclass "pagination" + + set flag_state [expr {$current_position in $flagged ? "delete" : "set"}] + ${container}::flag label "#xowf.flag_$flag_state#" + + lappend actions nextQuestion + } + return $actions + } + :method load_question_objs {obj:object names} { # # Load the question objects for the provided question names and Index: openacs-4/packages/xowf/tcl/xowf-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/tcl/xowf-procs.tcl,v diff -u -N -r1.28.2.50 -r1.28.2.51 --- openacs-4/packages/xowf/tcl/xowf-procs.tcl 29 Mar 2021 09:01:04 -0000 1.28.2.50 +++ openacs-4/packages/xowf/tcl/xowf-procs.tcl 5 Apr 2021 18:02:55 -0000 1.28.2.51 @@ -69,7 +69,7 @@ quiz-select_question.form select_question.form select-topics.form - select-group-members.form + select-group-members.form } Package default_package_parameters { @@ -579,7 +579,7 @@ -form_constraints ""] } - set :form_obj $form_object + set :form_obj $form_object return $form_object } ::nsf::method::property Context form_object returns object @@ -1194,6 +1194,8 @@ {roles all} {state_safe false} {extra_css_class ""} + {wrapper_CSSclass ""} + {label_noquote false} {title} } Action instproc activate {obj} {;} @@ -1390,13 +1392,27 @@ } { if {[llength $buttons] > 0} { # - # Take the form_button_wrapper_CSSclass from the first button. + # Build button groups based on "form_button_wrapper_CSSclass". # - set wrapper_CSSclass [[lindex $buttons 0] form_button_wrapper_CSSclass] + set previous_wrapper_class "NONE" + set wrapper_groups {} + set group_num 0 + foreach f $buttons { + set wrapper_class [$f form_button_wrapper_CSSclass] + if {$wrapper_class eq $previous_wrapper_class} { + dict lappend wrapper_groups [list $wrapper_class $group_num] $f + continue + } + incr group_num + dict lappend wrapper_groups [list $wrapper_class $group_num] $f + set previous_wrapper_class $wrapper_class + } - ::html::div -class $wrapper_CSSclass { - foreach f $buttons { - $f render_input + foreach wrapper_group [dict keys $wrapper_groups] { + ::html::div -class [lindex $wrapper_group 0] { + foreach f [dict get $wrapper_groups $wrapper_group] { + $f render_input + } } } } @@ -1421,9 +1437,13 @@ if {$success} { set f [$formfieldButtonClass new -destroy_on_cleanup \ -name __action_[namespace tail $action] \ - -CSSclass $CSSclass] + -form_button_wrapper_CSSclass [$action wrapper_CSSclass] \ + -label_noquote [$action label_noquote] \ + -CSSclass $CSSclass \ + ] if {[$action extra_css_class] ne ""} { - $f append form_button_CSSclass " " [$action extra_css_class] + #$f append form_button_CSSclass " " [$action extra_css_class] + $f CSSclass_list_add form_button_CSSclass [$action extra_css_class] } #ns_log notice "RENDER BUTTON has CSSclass [$f CSSclass] // [$f form_button_CSSclass]" if {[$action exists title]} { @@ -2326,10 +2346,10 @@ } WorkflowPage ad_instproc schedule_job {-time:required -party_id cmd} { - + Schedule the specified Tcl command for the current package instance at the given time. - + } { :log "-at $time" set j [::xowf::atjob new \ @@ -2357,7 +2377,7 @@ lassign $atts state assignee instance_attributes xowiki_form_page_id if {[dict exists $instance_attributes wf_current_state] && [dict get $instance_attributes wf_current_state] ne $state} { - + #Object msg "must update state $state for $xowiki_form_page_id to [dict get $instance_attributes wf_current_state]" xo::db dml update_state "update xowiki_form_page \ Index: openacs-4/packages/xowf/www/resources/test-item.css =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/www/resources/Attic/test-item.css,v diff -u -N -r1.1.2.32 -r1.1.2.33 --- openacs-4/packages/xowf/www/resources/test-item.css 1 Apr 2021 17:24:57 -0000 1.1.2.32 +++ openacs-4/packages/xowf/www/resources/test-item.css 5 Apr 2021 18:02:55 -0000 1.1.2.33 @@ -41,30 +41,30 @@ opacity: 0.6; } -@media print{ +@media print{ div { - font-size: 11px; + font-size: 11px; } div.single_exam { - page-break-after: always; + page-break-after: always; } div.single_exam h2 { - font-size: 12px; + font-size: 12px; } div.single_exam h3 { - font-size: 12px; + font-size: 12px; } div.single_exam div.form-label { - display: none; + display: none; } div.xowiki-content a.btn { - display: none; + display: none; } div.header { - display: none; + display: none; } #print-button { - display: none; + display: none; } } @@ -114,7 +114,7 @@ div.sc_interaction label { font-weight: normal; /*margin: 0px 0px 10px 0px;*/ - padding: 0px 0px 4px 0px; + padding: 0px 0px 4px 0px; } label div.richtext-label { /*display: inline-block;*/ @@ -242,7 +242,20 @@ border-bottom: 2px solid #999; border-style: groove; } +form div.pagination button.visited { + background-color: #E6F4D6; +} +form div.pagination button span.text-danger { + color: #a94442; + background-color: transparent; +} +/*form div.pagination button.bookmark::after { + font-family: 'Glyphicons Halflings'; + content: "\e034"; +}*/ + + /* * Attachments styling */ @@ -264,7 +277,7 @@ div.short_text_interaction .modal.fade.in, div.text_interaction .modal.fade.in { - height: auto; /* let the content decide it */ + height: auto; /* let the content decide it */ } @@ -279,7 +292,7 @@ float: right; margin-top: 10px; margin-bottom: 10px; - vertical-align: text-bottom; + vertical-align: text-bottom; } div.xowiki-content div.countdown-timer span.glyphicon-volume-off { color: red;