Changeset 511 for Dev


Ignore:
Timestamp:
03/13/14 00:44:08 (11 years ago)
Author:
hendrikvanantwerpen
Message:
  • Added open item options to singe and multiple choice.
  • Question view widgets are forms again, because we needed the control.
  • Multiple and singel choice share their widgets.
  • QuestionEditorPreview? now has items that were already there close, but opens newly dropped items.
  • PreviewItems? will save modified value even when we change to view before the widget loses its focus (which causes a change event).
Location:
Dev/trunk/src
Files:
5 deleted
21 edited

Legend:

Unmodified
Added
Removed
  • Dev/trunk/src/client/qed-client/css/model/widgets/MultipleChoiceWidget.less

    r508 r511  
    1 #rft.claro .qedMultipleChoiceWidget {
    2     .subcode {
    3         &.dijitTextBox {
     1#rft.claro {
     2    .qedMultipleChoiceWidget {
     3        .openItem {
     4            margin-left: 2em;
     5        }
     6    }
     7    .qedMultipleChoiceConfigWidget {
     8        .subcode {
    49            width: 4em;
    510        }
  • Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreview.js

    r510 r511  
    1818            });
    1919        },
    20         createListElement: function(id, item) {
     20        createListElement: function(id, item, fromDrop) {
    2121            var previewItem = new QuestionEditorPreviewItem({
    2222                id: id,
    2323                value: item
    2424            });
    25             previewItem.showEdit();
     25            previewItem.startup();
     26            if ( fromDrop ) { previewItem.showEdit(); }
    2627            this.own(previewItem.on('destroy',
    2728                                    lang.hitch(this,'removeItem',id,true)));
    28             previewItem.startup();
    2929            return previewItem;
    3030        }
  • Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js

    r510 r511  
    148148        _destroyInnerWidget: function() {
    149149            if ( this.innerWidget !== null ) {
     150                if ( this._editing === true ) {
     151                    this._onChange();
     152                }
    150153                this.removeChild(this.innerWidget);
    151154                this.innerWidget.destroyRecursive();
  • Dev/trunk/src/client/qed-client/model/widgets/SurveyRenderWidget.js

    r508 r511  
    44    "dojo/_base/array",
    55    "dojo/_base/declare",
     6    "dojo/_base/lang",
    67    "dojo/dom-construct",
    78    "dojo/text!./templates/SurveyRenderWidget.html"
    8 ], function(_ComplexValueWidget, QuestionWidgetFactory, array, declare, domConstruct, template) {
     9], function(_ComplexValueWidget, QuestionWidgetFactory, array, declare, lang, domConstruct, template) {
    910    return declare([_ComplexValueWidget],{
    1011        templateString: template,
     
    3132                },this);
    3233            },this);
     34        },
     35        _getValueAttr: function() {
     36            var newValue = {};
     37            array.forEach(this._getDescendantFormWidgets(),function(widget){
     38                lang.mixin(newValue,widget.get('value'));
     39            },this);
     40            this.value = newValue;
     41            return this.value;
     42        },
     43        _setValueAttr: function(value) {
     44            array.forEach(this._getDescendantFormWidgets(),function(widget){
     45                widget.set('value',value);
     46            },this);
     47            this.value = value;
    3348        }
    3449    });
  • Dev/trunk/src/client/qed-client/model/widgets/questions/Factory.js

    r510 r511  
    99    "./ScaleInputConfigWidget",
    1010    "./ScaleInputWidget",
    11     "./SingleChoiceInputConfigWidget",
    12     "./SingleChoiceInputWidget",
    1311    "./StringInputConfigWidget",
    1412    "./StringInputWidget",
     
    1917    "dijit/_WidgetBase",
    2018    "dojo/_base/declare"
    21 ], function(objectFuns, HeaderConfigWidget, HeaderWidget, MultipleChoiceInputConfigWidget, MultipleChoiceInputWidget, NumberInputConfigWidget, NumberInputWidget, ScaleInputConfigWidget, ScaleInputWidget, SingleChoiceInputConfigWidget, SingleChoiceInputWidget, StringInputConfigWidget, StringInputWidget, TextConfigWidget, TextInputConfigWidget, TextInputWidget, TextWidget, _WidgetBase, declare) {
     19], function(objectFuns, HeaderConfigWidget, HeaderWidget, MultipleChoiceInputConfigWidget, MultipleChoiceInputWidget, NumberInputConfigWidget, NumberInputWidget, ScaleInputConfigWidget, ScaleInputWidget, StringInputConfigWidget, StringInputWidget, TextConfigWidget, TextInputConfigWidget, TextInputWidget, TextWidget, _WidgetBase, declare) {
    2220   
    2321    var DividerWidget = declare([_WidgetBase], {
     
    3432        TextInput: TextInputWidget,
    3533        NumberInput: NumberInputWidget,
    36         MultipleChoiceInput: MultipleChoiceInputWidget,
    37         SingleChoiceInput: SingleChoiceInputWidget,
     34        MultipleChoiceInput: declare([MultipleChoiceInputWidget],
     35                                     {allowMultiple:true}),
     36        SingleChoiceInput: declare([MultipleChoiceInputWidget],
     37                                   {allowMultiple:false}),
    3838        ScaleInput: ScaleInputWidget
    3939    };
     
    4444        TextInput: TextInputConfigWidget,
    4545        NumberInput: NumberInputConfigWidget,
    46         MultipleChoiceInput: MultipleChoiceInputConfigWidget,
    47         SingleChoiceInput: SingleChoiceInputConfigWidget,
     46        MultipleChoiceInput: declare([MultipleChoiceInputConfigWidget],
     47                                     {allowMultiple:true}),
     48        SingleChoiceInput: declare([MultipleChoiceInputConfigWidget],
     49                                   {allowMultiple:false}),
    4850        ScaleInput: ScaleInputConfigWidget
    4951    };
  • Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js

    r510 r511  
    1919   
    2020    return declare([_ComplexValueWidget],{
    21         baseClass: 'qedMultipleChoiceWidget',
     21        baseClass: 'qedMultipleChoiceConfigWidget',
    2222        templateString: template,
     23        allowMultiple: false,
    2324        buildRendering: function() {
    2425            this.inherited(arguments);
     
    3637                id: id,
    3738                value: item,
     39                _valueOrSubcode: this.allowMultiple ? 'subcode' : 'value',
     40                _valueOrSubcodeName: this.allowMultiple ? 'Subcode' : 'Value',
    3841                onDestroy: lang.hitch(this,function(evt){
    3942                    this.itemsWidget.removeItem(id,true);
     
    5457            if ( evt ) { event.stop(evt); }
    5558            return false;
     59        },
     60        _setDisabledAttr: function() {
     61            this.inherited(arguments);
     62            this._handleOpenItemChange();
     63        },
     64        _setReadOnlyAttr: function() {
     65            this.inherited(arguments);
     66            this._handleOpenItemChange();
     67        },
     68        _getValueAttr: function() {
     69            var value = this.inherited(arguments);
     70            if ( value.lastItemIsOpen[0] ) {
     71                value.lastItemIsOpen = {
     72                    subcode: value.openItemSubcode
     73                };
     74            } else {
     75                delete value.lastItemIsOpen;
     76            }
     77            delete value.openItemSubcode;
     78            return value;
     79        },
     80        _setValueAttr: function(value) {
     81            if ( value.lastItemIsOpen ) {
     82                value.openItemSubcode = value.lastItemIsOpen.subcode;
     83                value.lastItemIsOpen = ["on"];
     84            }
     85            this.inherited(arguments);
     86        },
     87        _handleOpenItemChange: function() {
     88            var enabled = !(this.readOnly || this.disabled) && 
     89                          this.openItemCheckBox.get('value')[0];
     90            this.openItemSubcodeTextBox.set('disabled',!enabled);
     91            this.openItemSubcodeTextBox.set('readOnly',!enabled);
    5692        }
    5793    });
  • Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js

    r510 r511  
    11define([
    2     "dijit/_Container",
    3     "dijit/_TemplatedMixin",
    4     "dijit/_WidgetBase",
    5     "dijit/_WidgetsInTemplateMixin",
     2    "../../../widgets/_ComplexValueWidget",
    63    "dijit/form/CheckBox",
     4    "dijit/form/RadioButton",
     5    "dijit/form/TextBox",
    76    "dojo/_base/array",
    87    "dojo/_base/declare",
     8    "dojo/_base/lang",
    99    "dojo/dom-construct",
    1010    "dojo/text!./templates/MultipleChoiceInputWidget.html"
    11 ], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, CheckBox, array, declare, domConstruct, template) {
    12     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
     11], function(_ComplexValueWidget, CheckBox, RadioButton, TextBox, array, declare, lang, domConstruct, template) {
     12    return declare([_ComplexValueWidget],{
    1313        templateString: template,
     14        baseClass: 'qedMultipleChoiceWidget',
     15        allowMultiple: false,
    1416        startup: function() {
    1517            if ( this._started ) { return; }
    1618            this.inherited(arguments);
    1719
     20            var Ctor = this.allowMultiple ? CheckBox : RadioButton;
     21
     22            var input;
    1823            domConstruct.empty(this.domNode);
    1924            array.forEach(this.items, function(item){
    2025                var div = domConstruct.create("div", {
    2126                }, this.domNode, "last");
    22                 var input = new CheckBox({
    23                     name: this.code + item.subcode,
    24                     value: 1
     27                input = new Ctor({
     28                    name: this.code + (this.allowMultiple?item.subcode:this.subcode),
     29                    value: this.allowMultiple ? 1 : item.value
    2530                }).placeAt(div);
    2631                var label = domConstruct.create("label",{
     
    2934                }, div);
    3035            }, this);
     36           
     37            if ( this.lastItemIsOpen && input ) {
     38                this.lastItem = input;
     39                var openItemDiv = domConstruct.create("div", {
     40                }, this.domNode, "last");
     41                this.openItemTextBox = new TextBox({
     42                    name: this.code + this.lastItemIsOpen.subcode,
     43                    disabled: true,
     44                    readOnly: true,
     45                    'class': 'openItem'
     46                });
     47                this.openItemTextBox.placeAt(openItemDiv);
     48                this.own(this.lastItem.on(
     49                    'change',lang.hitch(this,'_handleOpenItemChange')));
     50            }
     51        },
     52        _setDisabledAttr: function() {
     53            this.inherited(arguments);
     54            this._handleOpenItemChange();
     55        },
     56        _setReadOnlyAttr: function() {
     57            this.inherited(arguments);
     58            this._handleOpenItemChange();
     59        },
     60        _handleOpenItemChange: function() {
     61            if ( this.lastItem ) {
     62                var value = this.allowMultiple ?
     63                            this.lastItem.get('value') :
     64                            this.lastItem.get('value')[0];
     65                var enabled = !(this.readOnly || this.disabled) && value;
     66                this.openItemTextBox.set('disabled',!enabled);
     67                this.openItemTextBox.set('readOnly',!enabled);
     68            }
    3169        }
    3270    });
  • Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputWidget.js

    r510 r511  
    11define([
    2     "dijit/_Container",
    3     "dijit/_TemplatedMixin",
    4     "dijit/_WidgetBase",
    5     "dijit/_WidgetsInTemplateMixin",
     2    "../../../widgets/_ComplexValueWidget",
    63    "dojo/_base/declare",
    74    "dojo/text!./templates/NumberInputWidget.html"
    8 ], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, template) {
    9     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
     5], function(_ComplexValueWidget, declare, template) {
     6    return declare([_ComplexValueWidget],{
    107        templateString: template,
    118        text: '',
  • Dev/trunk/src/client/qed-client/model/widgets/questions/ScaleInputWidget.js

    r508 r511  
    11define([
    2     "dijit/_Container",
    3     "dijit/_TemplatedMixin",
    4     "dijit/_WidgetBase",
    5     "dijit/_WidgetsInTemplateMixin",
     2    "../../../widgets/_ComplexValueWidget",
     3    "dijit/form/CheckBox",
    64    "dijit/form/RadioButton",
    75    "dojo/_base/array",
     
    119    "dojo/dom-construct",
    1210    "dojo/text!./templates/ScaleInputWidget.html"
    13 ], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, RadioButton, array, declare, lang, domAttr, domConstruct, template) {
    14     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
     11], function(_ComplexValueWidget, CheckBox, RadioButton, array, declare, lang, domAttr, domConstruct, template) {
     12    return declare([_ComplexValueWidget],{
    1513        templateString: template,
    1614        baseClass: "qedScaleWidget",
  • Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputWidget.js

    r510 r511  
    11define([
    2     "dijit/_Container",
    3     "dijit/_TemplatedMixin",
    4     "dijit/_WidgetBase",
    5     "dijit/_WidgetsInTemplateMixin",
     2    "../../../widgets/_ComplexValueWidget",
    63    "dojo/_base/declare",
    74    "dojo/text!./templates/StringInputWidget.html"
    8 ], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, template) {
    9     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
     5], function(_ComplexValueWidget, declare, template) {
     6    return declare([_ComplexValueWidget],{
    107        templateString: template,
    118        text: '',
  • Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputWidget.js

    r510 r511  
    11define([
    2     "dijit/_Container",
    3     "dijit/_TemplatedMixin",
    4     "dijit/_WidgetBase",
    5     "dijit/_WidgetsInTemplateMixin",
     2    "../../../widgets/_ComplexValueWidget",
    63    "dojo/_base/declare",
    74    "dojo/text!./templates/TextInputWidget.html"
    8 ], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, template) {
    9     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
     5], function(_ComplexValueWidget, declare, template) {
     6    return declare([_ComplexValueWidget],{
    107        templateString: template,
    118        text: '',
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html

    r510 r511  
    11<form>
    2   <div data-dojo-type="dijit/form/CheckBox"
    3        data-dojo-props="disabled: true, readOnly: true"></div>
    42  <div data-dojo-type="dijit/form/ValidationTextBox"
    5        data-dojo-props="required: true, placeholder: 'Subcode'"
     3       data-dojo-props="required: true, placeholder: '${_valueOrSubcodeName}'"
    64       class="subcode"
    7        name="subcode"></div>
     5       name="${_valueOrSubcode}"></div>
    86  <div data-dojo-type="dijit/form/ValidationTextBox"
    97       data-dojo-props="required: true, placeholder: 'Item text'"
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html

    r510 r511  
    11<form class="${baseClass}">
     2  <div>
     3    <label class="qedLabel" for="subcode">Subcode</label>
     4    <input data-dojo-type="dijit/form/ValidationTextBox"
     5           data-dojo-props="required:true,placeHolder:'Subcode'"
     6           class="subcode"
     7           name="subcode"/>
     8  </div>
    29  <div data-dojo-attach-point="itemsNode">
    310  </div>
    411  <div data-dojo-type="dijit/form/Button"
    512       data-dojo-attach-event="onClick:onAddItem">Add item</div>
     13  <div>
     14    <label class="qedLabel" for="lastItemIsOpen">Last option is open</label>
     15    <input data-dojo-type="dijit/form/CheckBox"
     16           class="qedField"
     17           name="lastItemIsOpen"
     18           data-dojo-attach-point="openItemCheckBox"
     19           data-dojo-attach-event="onChange:_handleOpenItemChange"/>
     20    <input data-dojo-type="dijit/form/ValidationTextBox"
     21           data-dojo-props="required:true,disabled:true,placeHolder:'Subcode'"
     22           data-dojo-attach-point="openItemSubcodeTextBox"
     23           class="subcode"
     24           name="openItemSubcode"/>
     25  </div>
    626</form>
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputWidget.html

    r508 r511  
    1 <div>
    2 </div>
     1<form class="${baseClass}">
     2</form>
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/NumberInputWidget.html

    r508 r511  
    1 <div>
     1<form>
    22  <p>${text}</p>
    33  <div class="qedField"
     
    55       data-dojo-type="dijit/form/NumberTextBox"
    66       name="${code}${subcode}"></div>
    7 </div>
     7</form>
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/ScaleInputWidget.html

    r508 r511  
    1 <div class="${baseClass}">
     1<form class="${baseClass}">
    22  <table>
    33    <thead>
     
    1212    </tbody>
    1313  </table>
    14 </div>
     14</form>
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/StringInputWidget.html

    r508 r511  
    1 <div>
     1<form>
    22  <p>${text}</p>
    33  <div data-dojo-type="dijit/form/TextBox"
    44       name="${code}${subcode}"></div>
    5 </div>
     5</form>
  • Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextInputWidget.html

    r508 r511  
    1 <div>
     1<form>
    22  <p>${text}</p>
    33  <textarea class="qedField"
     
    55            data-dojo-type="dijit/form/Textarea"
    66            name="${code}${subcode}"></textarea>
    7 </div>
     7</form>
  • Dev/trunk/src/client/qed-client/widgets/ListWidget.js

    r506 r511  
    2626        _onChangeActive: false,
    2727        _onChangeHandle: null,
     28        _fromDrop: true,
    2829        buildRendering: function() {
    2930            this.inherited(arguments);
     
    5253            lang.mixin(sourceParams, {
    5354                accept: [this.type],
    54                 creator: lang.hitch(this, "creator"),
     55                creator: lang.hitch(this,"creator"),
    5556                dropParent: this.containerNode
    5657            });
     
    8283            } else {
    8384                if ( this.createListElement ) {
    84                     nodeOrWidget = this.createListElement(id,item);
     85                    nodeOrWidget = this.createListElement(id,item,this._fromDrop);
    8586                } else {
    8687                    return this.source.defaultCreator(item, hint);
     
    9899        },
    99100        createAvatar: null, /*function(id,item){},*/
    100         createListElement: null, /* function(id,item){},*/
     101        createListElement: null, /* function(id,item,fromDrop){},*/
    101102        _getValueAttr: function() {
    102103            this.value = array.map(this.source.getAllNodes(),function(node){
     
    145146        },
    146147        appendItems: function(items,forceEvent) {
     148            this._fromDrop = false;
    147149            this.source.insertNodes(false,items);
    148150            if ( forceEvent ) { this._handleDrop(); }
     151            this._fromDrop = true;
    149152        },
    150153        appendItem: function(item,forceEvent) {
     154            this._fromDrop = false;
    151155            this.source.insertNodes(false,[item]);
    152156            if ( forceEvent ) { this._handleDrop(); }
     157            this._fromDrop = true;
    153158        },
    154159        removeItem: function(key,forceEvent) {
     
    200205            this._onChange();
    201206        },
    202         _onChange: function(){
     207        _onChange: function() {
    203208            if ( this._onChangeActive &&
    204209                 !(this.readOnly || this.disabled) ) {
  • Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.js

    r506 r511  
    9292        },
    9393        focus: function() {
    94             var children = this._getDescendantFormWidgets();
     94            /*var children = this._getDescendantFormWidgets();
    9595            if ( children.length > 0 ) {
    9696                children[0].focus();
    97             }
     97            }*/
    9898        },
    9999        _handleChange: function(evt) {
    100100            if ( evt.target !== this.domNode ) {
    101                 if ( this._onChangeActive &&
    102                      !(this.readOnly || this.disabled) ) {
    103                     if ( this._onChangeHandle ) {
    104                         this._onChangeHandle.cancel();
    105                     }
    106                     this._onChangeHandle = this.defer(function(){
    107                         this._onChangeHandle = null;
    108                         on.emit(this.domNode,'change',{
    109                             target: this.domNode,
    110                             value: this.get('value'),
    111                             bubbles: true,
    112                             cancellable: true
    113                         });
    114                     });
    115                 }
     101                this._onChange();
    116102                if ( evt ) { event.stop(evt); }
    117103                return false;
     
    133119            if (evt) { event.stop(evt); }
    134120            return false;
     121        },
     122        _onChange: function() {
     123            if ( this._onChangeActive &&
     124                 !(this.readOnly || this.disabled) ) {
     125                if ( this._onChangeHandle ) {
     126                    this._onChangeHandle.cancel();
     127                }
     128                this._onChangeHandle = this.defer(function(){
     129                    this._onChangeHandle = null;
     130                    on.emit(this.domNode,'change',{
     131                        target: this.domNode,
     132                        value: this.get('value'),
     133                        bubbles: true,
     134                        cancellable: true
     135                    });
     136                });
     137            }
    135138        }
    136139    });
  • Dev/trunk/src/server/config/couchdb-schema.json

    r510 r511  
    214214              "additionalProperties": false
    215215          } },
    216           "otherItem": {
    217               "type": "object",
    218               "properties": {
    219                   "text": { "$ref": "#/definitions/nonEmptyString" },
    220                   "value": { "$ref": "#/definitions/nonEmptyString" }
    221               },
    222               "required": ["subcode","value"],
     216          "lastItemIsOpen": {
     217              "type": "object",
     218              "properties": {
     219                  "subcode": { "$ref": "#/definitions/codeString" }
     220              },
     221              "required": ["subcode"],
    223222              "additionalProperties": false
    224223          },
     
    235234              "type": "object",
    236235              "properties": {
    237                   "subcode": { "$ref": "#/definitions/codeString" },
    238                   "text": { "$ref": "#/definitions/nonEmptyString" }
     236                "subcode": { "$ref": "#/definitions/codeString" },
     237                "text": { "$ref": "#/definitions/nonEmptyString" }
    239238              },
    240239              "required": ["subcode","text"],
    241240              "additionalProperties": false
    242241          } },
    243           "otherItem": {
    244               "type": "object",
    245               "properties": {
    246                   "subcode": { "$ref": "#/definitions/codeString" },
    247                   "text": { "$ref": "#/definitions/nonEmptyString" }
    248               },
    249               "required": ["subcode","text"],
     242          "lastItemIsOpen": {
     243              "type": "object",
     244              "properties": {
     245                "subcode": { "$ref": "#/definitions/codeString" }
     246              },
     247              "required": ["subcode"],
    250248              "additionalProperties": false
    251249          }
Note: See TracChangeset for help on using the changeset viewer.