1
0
فهرست منبع

Use reselectItem: in lists instead of custom onClick code
enables keyboard operation,
can select in multiselect lists by pressing enter.

Ryan Simmons 11 سال پیش
والد
کامیت
6922b3b8c4
6فایلهای تغییر یافته به همراه91 افزوده شده و 104 حذف شده
  1. 3 3
      src/Helios-Core.js
  2. 1 1
      src/Helios-Core.st
  3. 65 72
      src/Helios-SUnit.js
  4. 14 27
      src/Helios-SUnit.st
  5. 3 0
      support/helios/helios.css
  6. 5 1
      support/helios/helios.less

+ 3 - 3
src/Helios-Core.js

@@ -2367,15 +2367,15 @@ return smalltalk.withContext(function($ctx1) {
 var $2,$1;
 var $2,$1;
 $2=_st(self._selectedItem()).__eq(anObject);
 $2=_st(self._selectedItem()).__eq(anObject);
 if(smalltalk.assert($2)){
 if(smalltalk.assert($2)){
-$1="active";
+$1=self._activeItemCssClass();
 } else {
 } else {
 $1="inactive";
 $1="inactive";
 };
 };
 return $1;
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject},globals.HLListWidget)})},
 }, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject},globals.HLListWidget)})},
 args: ["anObject"],
 args: ["anObject"],
-source: "listCssClassForItem: anObject\x0a\x09^ self selectedItem = anObject\x0a\x09\x09ifTrue: [ 'active' ]\x0a\x09\x09ifFalse: [ 'inactive' ]",
-messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"],
+source: "listCssClassForItem: anObject\x0a\x09^ self selectedItem = anObject\x0a\x09\x09ifTrue: [ self activeItemCssClass ]\x0a\x09\x09ifFalse: [ 'inactive' ]",
+messageSends: ["ifTrue:ifFalse:", "=", "selectedItem", "activeItemCssClass"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLListWidget);
 globals.HLListWidget);

+ 1 - 1
src/Helios-Core.st

@@ -771,7 +771,7 @@ listCssClass
 
 
 listCssClassForItem: anObject
 listCssClassForItem: anObject
 	^ self selectedItem = anObject
 	^ self selectedItem = anObject
-		ifTrue: [ 'active' ]
+		ifTrue: [ self activeItemCssClass ]
 		ifFalse: [ 'inactive' ]
 		ifFalse: [ 'inactive' ]
 !
 !
 
 

+ 65 - 72
src/Helios-SUnit.js

@@ -56,65 +56,44 @@ selector: "listCssClassForItem:",
 protocol: 'accessing',
 protocol: 'accessing',
 fn: function (anObject){
 fn: function (anObject){
 var self=this;
 var self=this;
-var class_;
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3;
-$1=_st(self._selectedItem()).__eq(anObject);
-if(smalltalk.assert($1)){
-class_="selector";
+var $2,$4,$3,$1;
+$2=($ctx1.supercall = true, globals.HLMultiSelectToolListWidget.superclass.fn.prototype._listCssClassForItem_.apply(_st(self), [anObject]));
+$ctx1.supercall = false;
+$4=self._isSelected_(anObject);
+if(smalltalk.assert($4)){
+$3=" active";
 } else {
 } else {
-class_="";
-};
-$2=self._isSelected_(anObject);
-if(smalltalk.assert($2)){
-class_=_st(class_).__comma(" active");
-class_;
+$3="";
 };
 };
-$3=class_;
-return $3;
-}, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject,class_:class_},globals.HLMultiSelectToolListWidget)})},
+$1=_st($2).__comma($3);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject},globals.HLMultiSelectToolListWidget)})},
 args: ["anObject"],
 args: ["anObject"],
-source: "listCssClassForItem: anObject\x0a\x09 |class |\x0a\x09class := self selectedItem = anObject\x0a\x09\x09ifTrue: [ 'selector' ]\x0a\x09\x09ifFalse: [ '' ].\x0a\x09(self isSelected: anObject)\x0a\x09\x09ifTrue: [class := class, ' active'].\x0a\x09^class",
-messageSends: ["ifTrue:ifFalse:", "=", "selectedItem", "ifTrue:", "isSelected:", ","],
+source: "listCssClassForItem: anObject\x0a\x09^(super listCssClassForItem: anObject), ((self isSelected: anObject)\x0a\x09\x09ifTrue: [' active']\x0a\x09\x09ifFalse: ['']).\x0a\x09",
+messageSends: [",", "listCssClassForItem:", "ifTrue:ifFalse:", "isSelected:"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLMultiSelectToolListWidget);
 globals.HLMultiSelectToolListWidget);
 
 
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
-selector: "renderItem:on:",
+selector: "reselectItem:",
 protocol: 'rendering',
 protocol: 'rendering',
-fn: function (anObject,html){
+fn: function (anObject){
 var self=this;
 var self=this;
-var li;
-return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$4,$5,$3;
-li=_st(html)._li();
-$1=_st(li)._asJQuery();
-$ctx1.sendIdx["asJQuery"]=1;
-_st($1)._data_put_("item",anObject);
-$2=li;
-_st($2)._class_(self._listCssClassForItem_(anObject));
-$ctx1.sendIdx["class:"]=1;
-$3=_st($2)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-$4=_st(html)._a();
-_st($4)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-_st(_st(html)._tag_("i"))._class_(self._cssClassForItem_(anObject));
-return self._renderItemLabel_on_(anObject,html);
-}, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)})}));
-$5=_st($4)._onClick_((function(){
-return smalltalk.withContext(function($ctx3) {
-return self._toggleListItem_(_st(li)._asJQuery());
-}, function($ctx3) {$ctx3.fillBlock({},$ctx2,3)})}));
-return $5;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}));
-$ctx1.sendIdx["with:"]=1;
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},globals.HLMultiSelectToolListWidget)})},
-args: ["anObject", "html"],
-source: "renderItem: anObject on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09li asJQuery data: 'item' put: anObject.\x0a    li\x0a\x09\x09class: (self listCssClassForItem: anObject);\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self cssClassForItem: anObject).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: anObject on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self toggleListItem: li asJQuery ] ]",
-messageSends: ["li", "data:put:", "asJQuery", "class:", "listCssClassForItem:", "with:", "a", "tag:", "cssClassForItem:", "renderItemLabel:on:", "onClick:", "toggleListItem:"],
+return smalltalk.withContext(function($ctx1) { 
+var $receiver;
+if(($receiver = anObject) == null || $receiver.isNil){
+return self;
+} else {
+anObject;
+};
+self._toggleSelection_(anObject);
+return self}, function($ctx1) {$ctx1.fill(self,"reselectItem:",{anObject:anObject},globals.HLMultiSelectToolListWidget)})},
+args: ["anObject"],
+source: "reselectItem: anObject\x0a\x09anObject ifNil: [^self].\x0a\x09self toggleSelection: anObject",
+messageSends: ["ifNil:", "toggleSelection:"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLMultiSelectToolListWidget);
 globals.HLMultiSelectToolListWidget);
@@ -1012,13 +991,13 @@ return smalltalk.withContext(function($ctx1) {
 worker=_st($TestSuiteRunner())._on_(self._testCases());
 worker=_st($TestSuiteRunner())._on_(self._testCases());
 $ctx1.sendIdx["on:"]=1;
 $ctx1.sendIdx["on:"]=1;
 self["@testResult"]=_st(worker)._result();
 self["@testResult"]=_st(worker)._result();
-self._subscribeToTestSuite_(worker);
 _st(self._announcer())._announce_(_st($HLRunTests())._on_(worker));
 _st(self._announcer())._announce_(_st($HLRunTests())._on_(worker));
+self._subscribeToTestSuite_(worker);
 _st(worker)._run();
 _st(worker)._run();
 return self}, function($ctx1) {$ctx1.fill(self,"runTests",{worker:worker},globals.HLSUnitModel)})},
 return self}, function($ctx1) {$ctx1.fill(self,"runTests",{worker:worker},globals.HLSUnitModel)})},
 args: [],
 args: [],
-source: "runTests\x0a\x09| worker |\x0a\x09worker := TestSuiteRunner on: self testCases.\x0a\x09testResult := worker result.\x0a\x09self subscribeToTestSuite: worker.\x0a\x09self announcer announce: (HLRunTests on: worker).\x0a\x09worker run",
-messageSends: ["on:", "testCases", "result", "subscribeToTestSuite:", "announce:", "announcer", "run"],
+source: "runTests\x0a\x09| worker |\x0a\x09worker := TestSuiteRunner on: self testCases.\x0a\x09testResult := worker result.\x0a\x09self announcer announce: (HLRunTests on: worker).\x0a\x09self subscribeToTestSuite: worker.\x0a\x09worker run",
+messageSends: ["on:", "testCases", "result", "announce:", "announcer", "subscribeToTestSuite:", "run"],
 referencedClasses: ["TestSuiteRunner", "HLRunTests"]
 referencedClasses: ["TestSuiteRunner", "HLRunTests"]
 }),
 }),
 globals.HLSUnitModel);
 globals.HLSUnitModel);
@@ -1360,20 +1339,30 @@ protocol: 'rendering',
 fn: function (anObject,html){
 fn: function (anObject,html){
 var self=this;
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4;
-$1=_st(html)._span();
-$2=$1;
-$3=_st(_st(_st(_st(anObject)._class())._name()).__comma(" >> ")).__comma(_st(anObject)._selector());
+var $1;
+$1=_st(_st(_st(_st(anObject)._class())._name()).__comma(" >> ")).__comma(_st(anObject)._selector());
 $ctx1.sendIdx[","]=1;
 $ctx1.sendIdx[","]=1;
-_st($2)._with_($3);
-$4=_st($1)._onClick_((function(){
-return smalltalk.withContext(function($ctx2) {
-return self._performFailure_(anObject);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}));
+_st(html)._with_($1);
 return self}, function($ctx1) {$ctx1.fill(self,"renderItemLabel:on:",{anObject:anObject,html:html},globals.HLSUnitResultListWidget)})},
 return self}, function($ctx1) {$ctx1.fill(self,"renderItemLabel:on:",{anObject:anObject,html:html},globals.HLSUnitResultListWidget)})},
 args: ["anObject", "html"],
 args: ["anObject", "html"],
-source: "renderItemLabel: anObject on: html\x0a\x09html span\x0a\x09\x09with: anObject class name, ' >> ', anObject selector;\x0a\x09\x09onClick: [ self performFailure: anObject ]",
-messageSends: ["with:", "span", ",", "name", "class", "selector", "onClick:", "performFailure:"],
+source: "renderItemLabel: anObject on: html\x0a\x09html with: anObject class name, ' >> ', anObject selector",
+messageSends: ["with:", ",", "name", "class", "selector"],
+referencedClasses: []
+}),
+globals.HLSUnitResultListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "reselectItem:",
+protocol: 'rendering',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self._performFailure_(anObject);
+return self}, function($ctx1) {$ctx1.fill(self,"reselectItem:",{anObject:anObject},globals.HLSUnitResultListWidget)})},
+args: ["anObject"],
+source: "reselectItem: anObject\x0a\x09self performFailure: anObject ",
+messageSends: ["performFailure:"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLSUnitResultListWidget);
 globals.HLSUnitResultListWidget);
@@ -1758,20 +1747,24 @@ protocol: 'reacting',
 fn: function (announcement){
 fn: function (announcement){
 var self=this;
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $1,$6,$5,$4,$3,$2;
+var $1,$7,$6,$5,$4,$3,$2;
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
 $1=self._progressBarWidget();
 $1=self._progressBarWidget();
-$6=self._model();
-$ctx1.sendIdx["model"]=1;
-$5=_st($6)._testResult();
-$ctx1.sendIdx["testResult"]=1;
-$4=_st($5)._runs();
-$3=_st($4).__slash(_st(_st(self._model())._testResult())._total());
-$2=_st($3).__star((100));
-_st($1)._updateProgress_($2);
+$7=self._model();
+$ctx2.sendIdx["model"]=1;
+$6=_st($7)._testResult();
+$ctx2.sendIdx["testResult"]=1;
+$5=_st($6)._runs();
+$4=_st($5).__slash(_st(_st(self._model())._testResult())._total());
+$3=_st($4).__star((100));
+$2=_st($3)._rounded();
+return _st($1)._updateProgress_($2);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}))._valueWithTimeout_((10));
 return self}, function($ctx1) {$ctx1.fill(self,"onResultAnnouncement:",{announcement:announcement},globals.HLSUnitResults)})},
 return self}, function($ctx1) {$ctx1.fill(self,"onResultAnnouncement:",{announcement:announcement},globals.HLSUnitResults)})},
 args: ["announcement"],
 args: ["announcement"],
-source: "onResultAnnouncement: announcement\x0a\x09self progressBarWidget \x0a\x09\x09updateProgress: self model testResult runs / self model testResult total * 100.",
-messageSends: ["updateProgress:", "progressBarWidget", "*", "/", "runs", "testResult", "model", "total"],
+source: "onResultAnnouncement: announcement\x0a\x09[self progressBarWidget \x0a\x09\x09updateProgress: (self model testResult runs / self model testResult total * 100) rounded] valueWithTimeout: 10 ",
+messageSends: ["valueWithTimeout:", "updateProgress:", "progressBarWidget", "rounded", "*", "/", "runs", "testResult", "model", "total"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLSUnitResults);
 globals.HLSUnitResults);

+ 14 - 27
src/Helios-SUnit.st

@@ -16,13 +16,9 @@ listCssClass
 !
 !
 
 
 listCssClassForItem: anObject
 listCssClassForItem: anObject
-	 |class |
-	class := self selectedItem = anObject
-		ifTrue: [ 'selector' ]
-		ifFalse: [ '' ].
-	(self isSelected: anObject)
-		ifTrue: [class := class, ' active'].
-	^class
+	^(super listCssClassForItem: anObject), ((self isSelected: anObject)
+		ifTrue: [' active']
+		ifFalse: ['']).
 ! !
 ! !
 
 
 !HLMultiSelectToolListWidget methodsFor: 'actions'!
 !HLMultiSelectToolListWidget methodsFor: 'actions'!
@@ -52,20 +48,9 @@ unselect: anObject
 
 
 !HLMultiSelectToolListWidget methodsFor: 'rendering'!
 !HLMultiSelectToolListWidget methodsFor: 'rendering'!
 
 
-renderItem: anObject on: html
-	| li |
-    
-	li := html li.
-	li asJQuery data: 'item' put: anObject.
-    li
-		class: (self listCssClassForItem: anObject);
-        with: [ 
-        	html a
-            	with: [ 
-            		(html tag: 'i') class: (self cssClassForItem: anObject).
-  					self renderItemLabel: anObject on: html ];
-				onClick: [
-                  	self toggleListItem: li asJQuery ] ]
+reselectItem: anObject
+	anObject ifNil: [^self].
+	self toggleSelection: anObject
 ! !
 ! !
 
 
 !HLMultiSelectToolListWidget methodsFor: 'testing'!
 !HLMultiSelectToolListWidget methodsFor: 'testing'!
@@ -385,8 +370,8 @@ runTests
 	| worker |
 	| worker |
 	worker := TestSuiteRunner on: self testCases.
 	worker := TestSuiteRunner on: self testCases.
 	testResult := worker result.
 	testResult := worker result.
-	self subscribeToTestSuite: worker.
 	self announcer announce: (HLRunTests on: worker).
 	self announcer announce: (HLRunTests on: worker).
+	self subscribeToTestSuite: worker.
 	worker run
 	worker run
 !
 !
 
 
@@ -464,9 +449,11 @@ onResultAnnouncement: announcement
 !HLSUnitResultListWidget methodsFor: 'rendering'!
 !HLSUnitResultListWidget methodsFor: 'rendering'!
 
 
 renderItemLabel: anObject on: html
 renderItemLabel: anObject on: html
-	html span
-		with: anObject class name, ' >> ', anObject selector;
-		onClick: [ self performFailure: anObject ]
+	html with: anObject class name, ' >> ', anObject selector
+!
+
+reselectItem: anObject
+	self performFailure: anObject
 ! !
 ! !
 
 
 HLSUnitResultListWidget subclass: #HLSUnitErrorsListWidget
 HLSUnitResultListWidget subclass: #HLSUnitErrorsListWidget
@@ -610,8 +597,8 @@ observeModel
 !HLSUnitResults methodsFor: 'reacting'!
 !HLSUnitResults methodsFor: 'reacting'!
 
 
 onResultAnnouncement: announcement
 onResultAnnouncement: announcement
-	self progressBarWidget 
-		updateProgress: self model testResult runs / self model testResult total * 100.
+	[self progressBarWidget 
+		updateProgress: (self model testResult runs / self model testResult total * 100) rounded] valueWithTimeout: 10
 !
 !
 
 
 onRunTests: announcement
 onRunTests: announcement

+ 3 - 0
support/helios/helios.css

@@ -264,6 +264,9 @@ body[id="helios"] .nav-pills > .active > a {
   color: #fff;
   color: #fff;
   text-shadow: 0 0 0;
   text-shadow: 0 0 0;
 }
 }
+body[id="helios"] .focused .nav-multiselect .selector {
+  border-style: dotted;
+}
 body[id="helios"] .focused .nav-pills {
 body[id="helios"] .focused .nav-pills {
   background-color: #f3f7fb;
   background-color: #f3f7fb;
 }
 }

+ 5 - 1
support/helios/helios.less

@@ -312,6 +312,10 @@ body[id="helios"] {
 		color: #fff;
 		color: #fff;
 		text-shadow: 0 0 0;
 		text-shadow: 0 0 0;
 	}
 	}
+	
+	.focused .nav-multiselect .selector {
+		border-style: dotted;
+	}
 
 
 	.focused .nav-pills {
 	.focused .nav-pills {
 		background-color: #f3f7fb;
 		background-color: #f3f7fb;
@@ -1066,4 +1070,4 @@ body[id="helios"] {
 		}
 		}
 	}
 	}
 
 
-}
+}