:: Kunagorn Sirikup :: C# Developer

23/8/56

jQuery UI Datepicker แสดงปุ่ม Today

ในกรณีที่เราใช้งาน jQuery UI Datepicker เพื่อแสดง Calendar โดยทั่วไปจะไม่แสดงปุ่ม Today เพื่อให้สามารถเลือกวันที่ปัจจุบันได้ ซึ่งจริงๆแล้วสามารถทำได้ ดังนี้

HTML

<p>Date:<input type="text" id="datepicker" /></p>

JavaScript

<script>
    $(function () {
        var _gotoToday = $.datepicker._gotoToday;
        $.datepicker._gotoToday = function (a) {
            var target = $(a);
            var inst = this._getInst(target[0]);
            _gotoToday.call(this, a);
            $.datepicker._selectDate(a, $.datepicker._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
            target.blur();
        }

        $("#datepicker").datepicker({
            showButtonPanel: true,
            dateFormat: 'dd/mm/yy'
        });
    });

</script>

เมื่อแสดงผลแล้ว DatetimePicker จะแสดงปุ่ม Today เพิ่มขึ้นมาให้สามารถเลือกวันที่ปัจจุบันได้


















credit : http://www.blrf.net/blog/18/code/jquery/datepickers-today-button-problem/

22/8/56

เลื่อกวันที่ Datepicker แบบ Multiple

หลายๆคนคงเคยใช้งาน Datepicker ของ jQuery UI  กันมาบ้างแล้วนะครับ ซึ่งสามารถนำมาใช้งานได้ง่ายและมีประสิทธิภาพ แต่อาจจะมีข้อจำกัดในการใช้งานบางเรื่องซึ่งไม่สามารถทำได้ อย่างเช่น การเลือกวันที่แบบ Multiple  ดังนั้นจึงมีการเริ่มสร้าง Extension ของ jQuery UI Datepicker เพื่อสามารถรองรับการทำงาน ในกรณที่ต้องการเลื่อกวันที่หลายๆวันได้

วันนี้เลยขอแนะนำ Extension ตัวนึงในการทำ Multiple Date Picker

เริ่มต้นให้ไปดาวน์โหลด script ที่ http://sourceforge.net/projects/multidatespickr/ จะได้ไฟล์ชือ MultiDatesPicker v1.6.1.zip เพือนำไฟล์ jquery-ui.multidatespicker.js ไปใช้งาน















ต่อมาให้ reference  script ดังนี้

<!-- load jquery and jquery ui -->
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js">
</script>

<!-- load jquery ui -->
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js">
</script>

<!-- load multidatespicker script and css -->
<script type="text/javascript" src="js/jquery-ui.multidatespicker.js">
</script>
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">


ที่นี้ลองมาดูวิธีการใช้งา่นกันบ้างนะครับ สามารถทำได้ง่ายๆโดยการเขียน Script ดังนี้

<script>
    $(document).ready(function () {
        $('#calendar').multiDatesPicker();
    });
</script>

เท่านี้ก็สามารถสร้าง DatetimePicker แบบ Multi Select ได้แล้วนะครับ รวมถึงเราสามารถ Config เพิ่มเติมให้ DateTimePicker นี้แสดงผลในรูปแบบต่างได้ด้วย เช่น
















Custom Date - การกำหนด Format และค่า Default

$('#calendar').multiDatesPicker({
    dateFormat: "yy-mm-dd",
    defaultDate: "85-02-19"
});


Pre-Select Dates - การกำหนดวันที่เริ่มต้นที่ต้องการแสดง โดยส่งข้อมูลที่ต้องการกำหนดในรูปแบบ Array ของ string หรือ Object Date

var date = new Date();
$('#calendar').multiDatesPicker({
    addDates: [date.setDate(14), date.setDate(19)]
});















Disable Dates - Disable วันที่ใน DatetimePicker

var today = new Date();
$('#calendar').multiDatesPicker({
    addDisabledDates: [date.setDate(1), date.setDate(2), date.setDate(3)]
});















Disable Calendar -  Disable DatetimePicker

var today = new Date();
var tomorrow = (new Date()).setDate(today.getDate() + 1);
$('#calendar').multiDatesPicker({
    disabled: true,
    addDates: [today, tomorrow]
});















Disable Weekend - Disable วันหยุดประจำสัปดาห์

$('#calendar').multiDatesPicker({
    beforeShowDay: $.datepicker.noWeekends
});















altField - แสดงวันที่เลือกใน Control ที่กำหนด

$('#calendar').multiDatesPicker({
    altField: '#altField'
});






















Set maximum Picks - กำหนดจำนวนวันที่เลือกสูงสุด

$('#calendar').multiDatesPicker({
    maxPicks: 3
});















Use pickableRange and adjustRangeToDisabled - การเลือกข้อมูลเป็นช่วง และ กำหนดช่วงที่ต้องการ Disable

var date = new Date();
$('#calendar').multiDatesPicker({
    pickableRange: 7,
    adjustRangeToDisabled: true,
    addDisabledDates: [date.setDate(10), date.setDate(15)]
});















Days Range Mode: Auto Select Range - กำหนดเลือกช่วงแบบอัตโนมัติ

$('#calendar').multiDatesPicker({
    mode: 'daysRange',
    autoselectRange: [0, 5]
});
















Full year - แสดงวันที่แบบเต็ม

var today = new Date();
var y = today.getFullYear();
$('#calendar').multiDatesPicker({
    addDates: ['10/14/' + y, '02/19/' + y, '01/14/' + y, '11/16/' + y],
    numberOfMonths: [3, 4],
    showCurrentAtPos: today.getMonth()
});





























credit : http://sourceforge.net/projects/multidatespickr/

21/8/56

CSS สร้าง Gradient Background

CSS สำหรับสร้าง Gradient Background โดยสร้าง class ชือ gradient โดยรวม Code ในการใช้งานจะมี กำหนด parameter ดังนี้

Start Color - สีแรก ในตัวอย่างนี้ผมจะใช้  สีขาว (#FFFFFF) 
End Color - สีที่สอง ในตัวอย่างนี้ผมจะใช้ สีน้ำเงิน (#0A82D7)


แบบ linear
.gradient-linear {
    /* IE10 Consumer Preview */ 
    background-image: -ms-linear-gradient(bottom, #FFFFFF 0%, #0A82D7 100%);

    /* Mozilla Firefox */ 
    background-image: -moz-linear-gradient(bottom, #FFFFFF 0%, #0A82D7 100%);

    /* Opera */ 
    background-image: -o-linear-gradient(bottom, #FFFFFF 0%, #0A82D7 100%);

    /* Webkit (Safari/Chrome 10) */ 
    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #FFFFFF), color-stop(1, #0A82D7));

    /* Webkit (Chrome 11+) */ 
    background-image: -webkit-linear-gradient(bottom, #FFFFFF 0%, #0A82D7 100%);

    /* W3C Markup, IE10 Release Preview */ 
    background-image: linear-gradient(to top, #FFFFFF 0%, #0A82D7 100%);
}

แบบ circular
.gradient-circular{
    /* IE10 Consumer Preview */ 
    background-image: -ms-radial-gradient(left top, circle farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Mozilla Firefox */ 
    background-image: -moz-radial-gradient(left top, circle farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Opera */ 
    background-image: -o-radial-gradient(left top, circle farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Webkit (Safari/Chrome 10) */ 
    background-image: -webkit-gradient(radial, left top, 0, left top, 1012, color-stop(0, #FFFFFF), color-stop(1, #0A82D7));

    /* Webkit (Chrome 11+) */ 
    background-image: -webkit-radial-gradient(left top, circle farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* W3C Markup, IE10 Release Preview */ 
    background-image: radial-gradient(circle farthest-corner at left top, #FFFFFF 0%, #0A82D7 100%);
}

แบบ elliptical
.gradient-elliptical{
    /* IE10 Consumer Preview */ 
    background-image: -ms-radial-gradient(left top, ellipse farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Mozilla Firefox */ 
    background-image: -moz-radial-gradient(left top, ellipse farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Opera */ 
    background-image: -o-radial-gradient(left top, ellipse farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* Webkit (Safari/Chrome 10) */ 
    background-image: -webkit-gradient(radial, left top, 0, left top, 1012, color-stop(0, #FFFFFF), color-stop(1, #0A82D7));

    /* Webkit (Chrome 11+) */ 
    background-image: -webkit-radial-gradient(left top, ellipse farthest-corner, #FFFFFF 0%, #0A82D7 100%);

    /* W3C Markup, IE10 Release Preview */ 
    background-image: radial-gradient(ellipse farthest-corner at left top, #FFFFFF 0%, #0A82D7 100%);
}

Response.Redirect โดยเปิดหน้าต่างใหม่

ตัวอย่างนี้จะเป็นการสร้าง Class เพื่อเพิ่มความสามารถให้ Redirect ของ HttpResponse  โดยเปิดหน้าต่างใหม่ได้ เริ่มต้นผมจะสร้าง Class ResonseHelper เป็น static class แล้วให้เขียน Code ดังนี้


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;

/// <summary>
/// Summary description for ResponseHelper
/// </summary>
public static class ResponseHelper
{
    public static void Redirect(this HttpResponse response, string url, string target, string windowFeatures)
    {
        if ((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) && String.IsNullOrEmpty(windowFeatures))
        {
            response.Redirect(url);
        }
        else
        {
            Page page = (Page)HttpContext.Current.Handler;

            if (page == null)
            {
                throw new InvalidOperationException("Cannot redirect to new window outside Page context.");
            }
            url = page.ResolveClientUrl(url);

            string script;
            if (!String.IsNullOrEmpty(windowFeatures))
            {
                script = @"window.open(""{0}"", ""{1}"", ""{2}"");";
            }
            else
            {
                script = @"window.open(""{0}"", ""{1}"");";
            }
            script = String.Format(script, url, target, windowFeatures);
            System.Web.UI.ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true);
        }
    }
}


ที่นี้มาดูการเรียกใช้งานกันนะครับ ผมจะยกตัวอย่างการ Redirect ไปเปิดเอกสาร pdf นะครับ

วิธีการเรียกใช้่สามารถทำได้โดยเรียกใช้คำสั่ง Response.Redirect เหมือนเดิม แต่จะสังเกตว่าจะมี overload method ให้เราสามารถเรียกใช้งานได้ โดยจะมี parameter คือ
- URL - URL หรือ Path ที่ต้องการ Redirect
- Target - รูปแบบการ Redirect เช่น _blank , _self
- WindowFeatures - รูปแบบ Popup ที่ต้องการกำหนดเอง เช่น width , height , top , scrollbar 

protected void btnHelp_Click(object sender, EventArgs e)
{
    Response.Redirect("Help.pdf", "_blank"
                       "menubar=0,scrollbars=1,width=780,height=900,top=10");
        
}


AngularJS สร้่าง List รายการ


เริ่มต้นโดย refernce script ของ AngularJS ลงไปในส่วน <head> สามารถทำได้ 2 วิธี คือ
1. ดาวน์โหลดจาก http://angularjs.org/
2. อ้างอิงจาก CDN 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>

ในตัวอย่างนี้ผมจะทำการ referece AngularJS ดังนี้ครับ

<!DOCTYPE html>
<html ng-app>
<head runat="server">
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
</head>
<body>


</body>
</html>

จะสังเกตว่าที่ tag html มีการเพิ่ม attribute ชือ ng-app เพื่อเป็นการกำหนดว่าเพจมีการใช้ AngularJS  ต่อมาผมจะสร้าง Controller ขึ้นมาเพื่อควบคุมการทำงานต่างๆ โดยจะเริ่มกำหนด Datasource ให้กับ Model ก่อน ดังนี้

<script>
    function CourseController($scope) {
        $scope.courses = [
            { ischeck: true, coursename: 'IT201' },
            { ischeck: false, coursename: 'EN101' },
            { ischeck: false, coursename: 'FA201' }
        ];
    }
</script>

ที่นี้เราจะลองนำค่าจาก Model มาแสดงบนหน้าจอกันดูนะครับ โดยสร้าง div ขึ้นมาแล้วกำหนดชื่อ Controller ตาม script ข้างบน 

<div ng-controller="CourseController">
    <h3>Course List</h3>
    <ul>
        <li ng-repeat="course in courses" style=" list-style: none;">
            <input type="checkbox" ng-model="course.ischeck"/>
            <span>{{course.coursename}}</span>
        </li>
    </ul>
</div>

ทดสอบ Run จะได้ผลลัพธ์ ดังนี้










ต่อมาผมจะมาเพิ่มในส่วนของการเพิ่มข้อมูลลงกันบ้างนะครับ โดยเพิ่ม Textbox และปุ่ม Add ใน Code นี้มีจุดที่น่าสนใจอยู่ 2 ที่ 
- TextBox จะมี attribute ng-model="courseText" ซึ่งเป็นค่าที่เราจะส่งไปให้ Model เพื่อเตรียมทำการบันทึก 
- Button จะมี attribute  ngsubmit="addCourse()" หมายถึงว่าเมื่อมีการ Submit แล้วจะมีการ Request ในรูปแบบของ AjaxRequest

<div ng-controller="CourseController">
    <h3>Course List</h3>
    <form ng-submit="addCourse()">
        <input type="text" ng-model="courseText"  size="30"
                placeholder="add new todo here">
        <input class="btn-primary" type="submit" value="add">
    </form>
    <ul>
        <li ng-repeat="course in courses" style=" list-style: none;">
            <input type="checkbox" ng-model="course.ischeck"/>
            <span>{{course.coursename}}</span>
        </li>
    </ul>
</div>

หลังจากนั้นให้เพิ่ม function addCourse เพื่อใช้สำหรับเพิ่มข้อมูล

<script>
    function CourseController($scope) {
        $scope.courses = [
            { ischeck: true, coursename: 'IT201' },
            { ischeck: false, coursename: 'EN101' },
            { ischeck: false, coursename: 'FA201' }
        ];

        $scope.addCourse = function () {
            $scope.courses.push({ ischeck: false, coursename: $scope.courseText });
            $scope.courseText = '';
        };
    }
</script>

ทดสอบ Run จะได้ผลลัพธ์ ดังนี้




















ต่อมาผมจะมาเพิ่มในส่วนของการแสดงจำนวนรายการที่เลือก และจำนวนรายการทั้งหมด  ตาม Code นี้

<div ng-controller="CourseController">
    <h3>Course List</h3>
    <span>{{remaining()}} of {{courses.length}} remaining</span> [ <a href="" ng-click="archive()">archive</a> ]
    <form ng-submit="addCourse()">
        <input type="text" ng-model="courseText"  size="30"
                placeholder="add new todo here">
        <input class="btn-primary" type="submit" value="add">
    </form>
    <ul>
        <li ng-repeat="course in courses" style=" list-style: none;">
            <input type="checkbox" ng-model="course.ischeck"/>
            <span>{{course.coursename}}</span>
        </li>
    </ul>
</div>

จะสังเกตว่าผมได้สร้าง function remaining เพื่อแสดงจำนวนรายการที่เลือก และ function archive เพื้อเคลียร์รายการทั้งหมด ดังนี้

<span>{{remaining()}} of {{courses.length}} remaining</span> [ <a href="" ng-click="archive()">archive</a> ]

หลังจากทดสอบได้ผลลัพธ์ ดังนี้








ีั












สรุป Code ทั้งหมดของตัวอย่างนี้

<!DOCTYPE html>
<html ng-app>
<head runat="server">
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
</head>
<body>

    <style>
        body {
            font-family: 'Century Gothic', Arial,'sans-serif';
             font-size:13px;
        }
    </style>
<div ng-controller="CourseController">
    <h3>Course List</h3>
    <span>{{remaining()}} of {{courses.length}} remaining</span> [ <a href="" ng-click="archive()">archive</a> ]<br /><br />
    <form ng-submit="addCourse()">
        <input type="text" ng-model="courseText"  size="30"
                placeholder="add new todo here">
        <input class="btn-primary" type="submit" value="add">
    </form>
    <ul>
        <li ng-repeat="course in courses" style=" list-style: none;">
            <input type="checkbox" ng-model="course.ischeck"/>
            <span>{{course.coursename}}</span>
        </li>
    </ul>
</div>
   
<script>
    function CourseController($scope) {
        $scope.courses = [
            { ischeck: true, coursename: 'IT201' },
            { ischeck: false, coursename: 'EN101' },
            { ischeck: false, coursename: 'FA201' }
        ];

        $scope.addCourse = function () {
            $scope.courses.push({ ischeck: false, coursename: $scope.courseText });
            $scope.courseText = '';
        };

        $scope.remaining = function () {
            var count = 0;
            angular.forEach($scope.courses, function (course) {
                count += course.ischeck ? 1 : 0;
            });
            return count;
        };

        $scope.archive = function () {
            var oldcourses = $scope.courses;
            $scope.courses = [];
            angular.forEach(oldcourses, function (course) {
                if (!course.ischeck) $scope.courses.push(course);
            });
        };
    }
</script>

</body>
</html>

เื่ท่านี้ก็สามารถสร้างรายการโดยใช้ AngularJS ได้แล้วครับ