axlsx conditional formatting for letters / words - axlsx

I want to style the background color of an axlsx created sheet based upon cell content that is a word (ie. 'Pass' or 'Fail')
I can format the sheet if the cell content is a number. I've tried changed type => :containsText and adding :text => "Fail" but with no success. I can change the cell content to 'Fail' easily, but then I cannot get the conditional styling to work.
This is the code that works great if the cell values are numbers (in this case 2):
red = styles.add_style(:bg_color=> 'FFFF0000', :type => :dxf)
# Apply conditional formatting to range I:L in the worksheet
sheet.add_conditional_formatting('I:L', { :type => :cellIs,
:operator => :equal,
:formula => "2",
:dxfId => red,
:priority => 1 })
But if I change the :formula => "Fail" then it doesn't work. I've tried changing :type => containsText and a bunch of combinations.

Took some more fiddling around, but here's the answer :)
red = styles.add_style(:bg_color=> 'FFFF0000', :type => :dxf)
sheet.add_conditional_formatting('I:L', { :type => :containsText,
:text => "Fail",
:operator => :equal,
:dxfId => red,
:priority => 1 })

Related

yii gridview dropdownlist issue

I have a grid which list all of the data, but the problem is what I want is when select status change to "non-active", all "non-active" should be list out with orange color as below:
Any suggestion to change it? Active actually is based on date>now() and non-active is based on date
You can try this in your GridView. You can use bootstrap colors of your choice, 'warning' gives red. If you have some other condition that qualifies your status to be 'non-active', write your if condition accordingly.
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'rowOptions' => function($model) {
if ($model->status == 'non-active') {
return ['class' => 'warning'];
}},
'columns' => []
]);

axlsx conditional formatting using a dynamic range

I need to apply conditional formatting on a dynamic range by axlsx. That is, in the example below, replace the 'A2:A10' by something like
'A2:A' & sheet.rows.last
as it would work in excel VBA
red = styles.add_style(:bg_color=> 'FFFF0000', :type => :dxf)
# Apply conditional formatting to range A2:A10 in the worksheet
sheet.add_conditional_formatting('A2:A10', { :type => :cellIs,
:operator => :equal,
:formula => "1",
:dxfId => red,
:priority => 1 })
I studied the documentation and tried some versions without success.
I'm not very familiar to axlsx, but want to extend functionality of an existing project. Thank you very much in advance!

Yii CMaskedTextField with one or two digits 0-99 (quantity)

I'm trying to make CMaskedTextField as quantity input field with base quantity = 0, and maximum = 99.
Can't figure out the mask and/or charMap.
I've tried:
$this->widget('CMaskedTextField', array(
'model' => $position,
'attribute' => 'Quantity',
'mask' => '99',
'value' => $currentQuantity,
'htmlOptions' => array('size' => 2, 'maxlength'=>2, 'minlength'=>1)
), true);
but this mask means there must be only 2 digits
Optional (i guess js will do the work if cmaskedtextfield not): when user clears input it should converts to '0'.
Mask might be set thru regex:
\d{1,2}
In model rules() you might define:
array('attributeName', 'match', 'pattern' => '/\d{1,2}/',
'message' => '{attribute} can only contain digits from 0 to 99'),
There is no convertion to 0 but the explicit message for user.

Changing CForm dropdown name attribute in Yii

I'm using Yii and I'm having a little problem with some dropdowns.
Basically I'm using CForm to display some dropdown menus of courses. A student can select up to two courses and for each course choice the student can select a 1st choice and second. It is a requirement that each course choice is inserted separately into the database. For example, it a student wants to study 2 courses and wants to have a 1st and 2nd priority course, they would choose like this:
Course one - 1st Priority
Course one - 2nd Priority
Course two - 1st Priority
Course two - 2nd Priority
This would put 4 new rows into the database. The administrators of the courses want this displayed as 4 dropdown menus containing the courses.
At the moment, I'm testing with just the 1st and 2nd priorities of course one, but the problem is that course one - priority one is always empty unless a value is selected for priority two. Then priority one gets the same value as priority two, even though two different courses are selected. I've been following this tutorial Form Builder as I am using the Wizard Behavior which uses CForm to build the forms.
Here is my code so far, again only dealing with "course one":
This is a snippet of the relevant code from the controller:
// inside controller
$model = new CourseChoice();
$form = new CForm('application.views.wizard.ccForm', $model);
$form['courseOneP1']->model = new CourseChoice();
$form['courseOneP2']->model = new CourseChoice();
$c1p1 = $form['courseOneP1']->model;
$c1p2 = $form['courseOneP2']->model;
// Here I am just reading the attributes and exiting for testing
if ($form->submitted()&& $form->validate()) {
echo '<pre>';
print_r($c1p1->attributes);
print_r($c1p2->attributes);
echo '</pre>';
exit;
..........
And here is code in the form in ccForm
return array(
'showErrorSummary' => true,
'title' => 'Course Choice 1',
'elements' => array(
// Course 1 - 1st Priority
'courseOneP1' => array(
'type' => 'form',
'elements' => array(
'course' => array(
'label' => '1st Priority',
'type' => 'dropdownlist',
'id' => 'c1p1',
'prompt' => 'Select 1st Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
),
),
// Course 1 - 2nd Priority
'courseOneP2' => array(
'type' => 'form',
'elements' => array(
'course' => array(
'label' => '2nd Priority',
'type' => 'dropdownlist',
'id' => 'c1p2',
'prompt' => 'Select 2nd Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
),
),
),
'buttons' => array(
'previous' => array(
'type' => 'submit',
'label' => 'Previous'
),
'submit' => array(
'type' => 'submit',
'label' => 'Next'
)
)
);
So lets say I choose 2 courses, one with an id of 15 and the other with an id of 86, I get the following when I print_r() both dropdowns:
Array // Dropdown 1
(
[course] => 86
.... // other irrelevant attributes
)
Array // Dropdown 2
(
[course] => 86
.... // other irrelevant attributes
)
Update
I've been looking further into this and when I look at firebug, I see that both dropdowns have the same name:
<div class="row field_course">
<label for="c1p1">1st Priority</label>
<select id="c1p1" name="CourseChoice[course]">
</div>
<div class="row field_course">
<label for="c1p2">2nd Priority</label>
<select id="c1p2" name="CourseChoice[course]">
</div>
So the 2nd menu is overwriting the first. But how can I change this? If I change 'course'=>array(.... in the CForm for either subform, the applicable dropdown does not render. I have already tried adding 'name'=>'course1' in the form but it makes no difference.
Couldn't you just set the name of the 2nd priority input element?
'course' => array(
'label' => '2nd Priority',
'name' => 'course2',
'type' => 'dropdownlist',
'id' => 'c1p2',
'prompt' => 'Select 2nd Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
Just to answer my own question and close it as it is pretty old now, CForm does not support tabular input and would need to extended to achieve this. Probably not a big job but in the end I convinced management that the four dropdowns design was horrible. :-) I went with a more flexible design showing a gridview of courses in a pop-up to choose courses instead which works well and is less confusing for the user.
Anyone interested in this issue can see the open issue here. There is a link in there to view a possible implementation of extending CForm, though this was posted at the end of 2009.

yii tokeninput extension cursor focus on wrong place after same match?

I am having problem with yii tokeninput extension. When i search name it gives the user list and if i select any name and if that name is also selected previous than the cursor point after the selected item, it does not point at the end of all the the item in the input box.
I am using this configuration.
$this->widget('ext.tokeninput.TokenInput', array(
'model' => $model,
'attribute' => 'USER_ID',
'url'=>$this->createUrl('user/searchUserNames'),
'options' => array(
'allowCreation' => false,
'preventDuplicates' => true,
// 'resultsFormatter' => 'js:function(item){ return “<li><p>” + item.name + “</p></li>” }',
'theme' => 'facebook',
//'hintText' => 'Type',
'prePopulate' => $prePopulate,
'processPrePopulate' => $processPrePopulate,
)
));
I have also lookout at the examples but does not find the solution. can any one help me ?
Loopj: jquery token input demo
plz comment the line number 509 in **jquery.tokeninput.js**
input_token.insertAfter(found_existing_token);
that line insert cursor after that selected item so if you comment
this line cursor is at the end of all names