JSFiddle - React, Tailwind, and code Playground

by origineil

HTML

<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
<button class="btn btn-default btn-sm" data-bind="click: toggleFavorite, css: { favorited: cssToggle}" style="padding: 0px 7px; font-size: 20px; margin-left: 10px; color: #cccccc;"><span class="glyphicon glyphicon-star" style="padding-top: 5px;"></span>

</button>
<select data-bind="foreach: $root.favorites, value: selectedProject" class="selectpicker" data-live-search="true">
    <!-- ko if: $data==1 -->
    <optgroup data-bind="attr: {label: 'Favorites'}, foreach: {data: $root.projects, as: 'projectAlias'}">
        <!-- ko if: favorite() -->
        <option data-bind="text: project_name, value: projectAlias"></option>
        <!-- /ko -->
    </optgroup>
    <!-- /ko -->
    <!-- ko if: $data==0 -->
    <option data-divider="true"></option>
    <!-- ko foreach: {data: $root.projects, as: 'projectAlias'} -->
    <!-- ko if: !favorite() -->
    <option data-bind="text: project_name, value: projectAlias"></option>
    <!-- /ko -->
    <!-- /ko -->
    <!-- /ko -->
</select>

CSS

.favorited {
    background-color: #f0ad4e !important;
    border: #eea236;
}
.favorited span {
    color: #FFFFFF !important;
    font-weight: bold !important;
}

JavaScript

// Initial data
var entriesdata = [{
    "entry_id": "51814",
        "project_id": "2",
        "user_id": "1"
}];

var projectsdata = [{
    "project_txt": "Test 1",
        "project_id": "1",
        "favorite": true
}, {
    "project_txt": "Test 2",
        "project_id": "2",
        "favorite": true
}, {
    "project_txt": "Test 3",
        "project_id": "3",
        "favorite": false
}, {
    "project_txt": "Test 4",
        "project_id": "4",
        "favorite": true
}, {
    "project_txt": "Test 5",
        "project_id": "5",
        "favorite": false
}, {
    "project_txt": "Test 6",
        "project_id": "6",
        "favorite": false
}, {
    "project_txt": "Test 7",
        "project_id": "7",
        "favorite": false
}, {
    "project_txt": "Test 8",
        "project_id": "8",
        "favorite": false
}];

var ProjectsViewModel = function (project) {

    var self = this;

    self.project_id = project.project_id;
    self.project_name = project.project_txt;
    self.favorite = ko.observable(project.favorite);
}

// Main entries binding
var TimeEntriesModel = function (entries, projects) {
    var self = this;

    self.favorites = [1, 0];

    self.projects = ko.observableArray(ko.utils.arrayMap(projects, function (project) {
        return new ProjectsViewModel(project);
    }));

    self.selectedProject = ko.observable();
    self.cssToggle = ko.computed(function() {
        if(self.selectedProject()){
            return self.selectedProject().favorite();
        }
        return false;
    });
 
    
    self.toggleFavorite = function () {
        var currentState = self.selectedProject().favorite();
        self.selectedProject().favorite( !currentState);
    }
    
}

var entriesModel = new TimeEntriesModel(entriesdata, projectsdata);

entriesModel.selectedProject.subscribe(function (newValue) {
    console.log("New Selection is favorite? " + newValue.favorite())
});

ko.applyBindings(entriesModel);