To create the fill pattern image, check out the following website:
http://www.patternify.com/
/*dots*/
.inactive_cell2 {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAEklEQVQImWNgYGD4z0AswK4SAFXuAf8EPy+xAAAAAElFTkSuQmCC");
background-repeat: repeat;
}
To create strips without using any image data,
https://css-tricks.com/stripes-css/
/*stripes*/
.inactive_cell {
background: repeating-linear-gradient( 48deg, #fefefe, #e0e0e1 5px, #eaeaea 5px, #eaeaea 10px );
}
Tuesday, 21 November 2017
Friday, 17 November 2017
Simple pie chart & doughnut chart with SVG + CSS
You can draw a simple pie chart & doughnut chart with SVG + CSS. This is quite simple and straight forward. But the limitation is that it is able to show 2 sections only.
To change the value of the section, look for stroke-dasharray and change the first value.
To change the value of the section, look for stroke-dasharray and change the first value.
.pie2 {
fill: yellow;
stroke: green;
/* max=50 (radius x 2) */
stroke-width: 50;
/* 158 = (radius x 2) x 3.142 = 25 x 2 x 3.142 */
stroke-dasharray: 40 158;
}
.chart2 {
background-color: yellow;
border-radius: 50%;
-webkit-transform: rotate(-90deg);
transform: rotate(-90deg);
}
<svg width="100" height="100" class="chart2">
<circle r="25" cx="50" cy="50" class="pie2"/>
</svg>
To draw a doughnut chart,
.doghnut {
fill: yellow;
stroke: green;
stroke-width: 20;
stroke-dasharray: 180 251;
}
.doghnut_chart {
background-color: yellow;
border-radius: 50%;
-webkit-transform: rotate(-90deg);
transform: rotate(-90deg);
}
<svg width="100" height="100" class="doghnut_chart">
<circle r="40" cx="50" cy="50" class="doghnut"/>
</svg>
Wednesday, 15 November 2017
Javascript that prevents double click on submit button
This is what happening:
var _prev_save_click_ts = null;
function beforeSubmit() {
if (_prev_save_click_ts != null) {
var ts = new Date();
if (ts - _prev_save_click_ts < 500) {
// user is double clicking.
return false;
}
}
_prev_save_click_ts = new Date();
return true;
}
- The user loves "double clicking" on any button even though single click will trigger the action.
- The Internet connection slows down and the user thought that he did not click on the correct button. So, he decided to click it again even though the waiting time is lesser than 1 second (?!).
var _prev_save_click_ts = null;
function beforeSubmit() {
if (_prev_save_click_ts != null) {
var ts = new Date();
if (ts - _prev_save_click_ts < 500) {
// user is double clicking.
return false;
}
}
_prev_save_click_ts = new Date();
return true;
}
Thursday, 9 November 2017
Easiest way to search without using loop
If you have two sets of data and one set is referencing the other set, you will need to do a "double loop" to iterating through the data. But, there is a way to eliminate one loop and shorten the code.
For example, set 1 is the list of employees and set 2 is the list of working shift.
If you are using FOR loop, your codes will look similar to the following:
var employees = [];
employees.push({name: 'Mike', shift_id:'A'});
employees.push({name: 'Micky', shift_id:'B'});
employees.push({name: 'Mini', shift_id:'C'});
var shifts = [];
shifts.push({id: 'A', start_time: '08:00', end_time: '17:00'});
shifts.push({id: 'B', start_time: '09:00', end_time: '18:00'});
var s;
for (var i = 0; i < employees.length; i++) {
s = null;
// look for the shift:
for (var j = 0; j < shifts.length; j++) {
if (shifts[j].id == employees[i].shift_id) {
s = shifts[j];
break;
}
}
if (s != null){
console.log(employees[i].name, s.start_time);
} else {
console.log(employees[i].name, 'Cannot find the shift record');
}
}
The JavaScript object is a key value collection:
o = {};
o['a'] = 'Apple';
o['b'] = 'Banana';
And you can access the value:
console.log(o['b']);
Below is the code that uses the key value collection to store the shift information and it will save us from writing one FOR loop.
var employees = [];
employees.push({name: 'Mike', shift_id:'A'});
employees.push({name: 'Micky', shift_id:'B'});
employees.push({name: 'Mini', shift_id:'C'});
var shifts = {};
shifts['A'] = {id: 'A', start_time: '08:00', end_time: '17:00'};
shifts['B'] = {id: 'B', start_time: '09:00', end_time: '18:00'};
var s;
for (var i = 0; i < employees.length; i++) {
s = null;
// look for the shift:
if (shifts.hasOwnProperty(employees[i].shift_id)) {
s = shifts[employees[i].shift_id];
console.log(employees[i].name, s.start_time);
} else {
console.log(employees[i].name, 'Cannot find the shift record');
}
}
For example, set 1 is the list of employees and set 2 is the list of working shift.
If you are using FOR loop, your codes will look similar to the following:
var employees = [];
employees.push({name: 'Mike', shift_id:'A'});
employees.push({name: 'Micky', shift_id:'B'});
employees.push({name: 'Mini', shift_id:'C'});
var shifts = [];
shifts.push({id: 'A', start_time: '08:00', end_time: '17:00'});
shifts.push({id: 'B', start_time: '09:00', end_time: '18:00'});
var s;
for (var i = 0; i < employees.length; i++) {
s = null;
// look for the shift:
for (var j = 0; j < shifts.length; j++) {
if (shifts[j].id == employees[i].shift_id) {
s = shifts[j];
break;
}
}
if (s != null){
console.log(employees[i].name, s.start_time);
} else {
console.log(employees[i].name, 'Cannot find the shift record');
}
}
The JavaScript object is a key value collection:
o = {};
o['a'] = 'Apple';
o['b'] = 'Banana';
And you can access the value:
console.log(o['b']);
Below is the code that uses the key value collection to store the shift information and it will save us from writing one FOR loop.
var employees = [];
employees.push({name: 'Mike', shift_id:'A'});
employees.push({name: 'Micky', shift_id:'B'});
employees.push({name: 'Mini', shift_id:'C'});
var shifts = {};
shifts['A'] = {id: 'A', start_time: '08:00', end_time: '17:00'};
shifts['B'] = {id: 'B', start_time: '09:00', end_time: '18:00'};
var s;
for (var i = 0; i < employees.length; i++) {
s = null;
// look for the shift:
if (shifts.hasOwnProperty(employees[i].shift_id)) {
s = shifts[employees[i].shift_id];
console.log(employees[i].name, s.start_time);
} else {
console.log(employees[i].name, 'Cannot find the shift record');
}
}
Thursday, 2 November 2017
Printing HTML with JavaScript
You want to allow the user from printing current page directly to the printer and here is the recipe:
1. A print button that calls your print function (written in JavaScript).
2. In your print function, you need to do the following thing:
2.1. Inject a hidden iFrame.
2.2. Set the "src" to the page that you have to print. If you are developing a POS (Point of Sales), you may specify the URL of the receipt page to the "src" together with the receipt number in the query string. For example,
<iframe id="receipt-frame" style="display:none;" src="myReceipt.aspx?refno=123456"/>
Note: the page that you call should return the contents to be printed out. You have two choices to merge the data into the receipt format: (1) do everything at the server side (2) execute client side JavaScript upon page loaded.
2.3. Once you have the content to be printed, you need to call the following function (upon page loaded). This function will send the content to the printer.
window.onafterprint = function() {
window.parent.myPrintJobCompleted();
}
window.print();
In case you want to inform the parent page that the user has printed the content, you must handle the window.onafterprint event. In the example above, it executes the function myPrintJobCompleted (this function will load with the main page).
1. A print button that calls your print function (written in JavaScript).
2. In your print function, you need to do the following thing:
2.1. Inject a hidden iFrame.
2.2. Set the "src" to the page that you have to print. If you are developing a POS (Point of Sales), you may specify the URL of the receipt page to the "src" together with the receipt number in the query string. For example,
<iframe id="receipt-frame" style="display:none;" src="myReceipt.aspx?refno=123456"/>
Note: the page that you call should return the contents to be printed out. You have two choices to merge the data into the receipt format: (1) do everything at the server side (2) execute client side JavaScript upon page loaded.
2.3. Once you have the content to be printed, you need to call the following function (upon page loaded). This function will send the content to the printer.
window.onafterprint = function() {
window.parent.myPrintJobCompleted();
}
window.print();
In case you want to inform the parent page that the user has printed the content, you must handle the window.onafterprint event. In the example above, it executes the function myPrintJobCompleted (this function will load with the main page).
Tuesday, 3 October 2017
JavaScript - sending raw text to printer
While I'm working on the receipt printer, I found this nice code to send the raw text to printer. You will have more freedom and control over the print out.
function doPrint(rawText) {
var printWindow = window.open();
printWindow.document.open('text/plain')
printWindow.document.write(rawText);
printWindow.document.close();
printWindow.focus();
printWindow.print();
printWindow.close();
}
Reference
https://stackoverflow.com/questions/36570689/javascript-send-raw-text-to-printer-no-server-requests-method-calls-able-to
Notes
In the receipt printer driver, goto Advanced tab and change the driver to "generic/text only". Then, the following codes will print the raw text.
function doPrint(rawText) {
var printWindow = window.open();
printWindow.document.open('text/plain')
printWindow.document.write(rawText);
printWindow.document.close();
printWindow.focus();
printWindow.print();
printWindow.close();
}
Reference
https://stackoverflow.com/questions/36570689/javascript-send-raw-text-to-printer-no-server-requests-method-calls-able-to
Notes
In the receipt printer driver, goto Advanced tab and change the driver to "generic/text only". Then, the following codes will print the raw text.
Tuesday, 26 September 2017
Decoupling the development of front end and back end
We used to develop the entire system using ASP.Net web form or MVC. It sounds logical to build everything with the back end coding except for some validation processes using JavaScript (which runs in the client browser).
The problem with this approach is that it's very hard to shorten the development time because the file sharing is the big headache when the team gets bigger. Parallel development requires massive collaboration.
For example, you want to develop an Online Shopping cart which has the catalog for public access. If you are using ASP.Net web form to develop the system, the front end and the back end will be either in one file (ASPX) or two files (ASPX + ASPX.CS). If you are using MVC, it's very hard to to sync the source codes among the programmer because it has controller, page, style, etc.
To enable the parallel development, the front end and the back end should be decoupled.
This is great. Isn't it?
The problem with this approach is that it's very hard to shorten the development time because the file sharing is the big headache when the team gets bigger. Parallel development requires massive collaboration.
For example, you want to develop an Online Shopping cart which has the catalog for public access. If you are using ASP.Net web form to develop the system, the front end and the back end will be either in one file (ASPX) or two files (ASPX + ASPX.CS). If you are using MVC, it's very hard to to sync the source codes among the programmer because it has controller, page, style, etc.
To enable the parallel development, the front end and the back end should be decoupled.
- The front end should be build from the scratch with HTML, CSS + JavaScript.
- The back end will be develop in Generic Handler (ASHX) in ASP.Net/C#. This ASHX provides an interface for the client to submit their query, processes by the web server and then response back to the client.
- The front end developer will have the freedom changing the CSS styles without affecting the back end coding. Rearranging the layout without have to get permission from the back end programmer.
- The back end developer will have to focus on processing the incoming request and response with the appropriate data. Any changes in the back end will not affect the front end.
This is great. Isn't it?
Wednesday, 23 August 2017
Something about the z-index
In CSS, z-index is the property to control the 3D Z position of the element (for example DIV). This property is useful when you have element that has absolute or fixed position.
In the real work application, we use z-index for the date picker, time picker, numeric keypad, any popup list, prompt, etc.
Here is the find out:
1. If you set the z-index for the DIV, it works as expected. Not strange thing will happen in this simplest case.
<body>
<div class="container1">helo</div>
<body>
2.But, if you have the following structure, then, it might work unexpectedly.
First of all, if you set the z-index for the inner1 & inner2, the z-index is relative to container1. While container2 is relative to the body.
<body>
<div class="container1">Container 1
<div class="inner1">Inner 1</div>
<div class="inner2">Inner 2</div>
</div>
<div class="container2">Container 2
</div>
<body>
For example, you have the following settings for the z-index where the final output is container2 is always at the top that covers container1 and hence it covers inner1 and inner2.
container1 - z-index: 100
inner1 - z-index: 300
inner2 - z-index: 400
container2 - z-index: 200
All DIV elements have the following settings.
position: absolute;
top: 0;
left:0;
width:100px;
height:100px;
overflow:hidden;
In the real work application, we use z-index for the date picker, time picker, numeric keypad, any popup list, prompt, etc.
Here is the find out:
1. If you set the z-index for the DIV, it works as expected. Not strange thing will happen in this simplest case.
<body>
<div class="container1">helo</div>
<body>
2.But, if you have the following structure, then, it might work unexpectedly.
First of all, if you set the z-index for the inner1 & inner2, the z-index is relative to container1. While container2 is relative to the body.
<body>
<div class="container1">Container 1
<div class="inner1">Inner 1</div>
<div class="inner2">Inner 2</div>
</div>
<div class="container2">Container 2
</div>
<body>
For example, you have the following settings for the z-index where the final output is container2 is always at the top that covers container1 and hence it covers inner1 and inner2.
container1 - z-index: 100
inner1 - z-index: 300
inner2 - z-index: 400
container2 - z-index: 200
All DIV elements have the following settings.
position: absolute;
top: 0;
left:0;
width:100px;
height:100px;
overflow:hidden;
Calculating age
Calculating age using moment.js is very simple:
var birth_date = new Date(1966,1,1)
var age = moment().diff(birth_date, 'years', true);
var birth_date = new Date(1966,1,1)
var age = moment().diff(birth_date, 'years', true);
Thursday, 17 August 2017
User interface with HTML+CSS+JS
Let's build the user interface with HTML+CSS+JS and then build the back end program with any web programming language (ASP.Net, PHP, etc) or objective-C for iOS.
This strategy decouple the front end and back end which leads to shorter development and higher customer satisfaction.
From the front end aspect:
Cheers!!
This strategy decouple the front end and back end which leads to shorter development and higher customer satisfaction.
From the front end aspect:
- We build the prototype in a shorter time.
- We build a back end program using Javascript that simulate the AJAX call between the front end and back end. This script does not rely on any database and web server. It will be loaded and running within the browser context. So, the AJAX call simulation does not required a complex development environment setup.
- The prototype can be build with any tool as simple as a text file editor + a browser to test the prototype.
- The user can "see' and "feel" the prototype. It's not talking on a "paper" and the user must "imagine" how it works.
- This prototype will be uploaded to any web server for discussion purpose.
- Now, we build a more stable front end regardless of which OS platform.
- It solves the problem with "installation".
- The back end can be built with any programming language (ASP.Net, PHP, etc) or Objective-C for iOS.
- The back end program should only provides the correct API for AJAX request and response.
- The back end program can be build parallel with the front end.
Cheers!!
Wednesday, 12 July 2017
Avoiding uncertainty with "this"
Most of the time, we don't know what is "this"? Is it a "window", jQuery object, or what is it. It is difficult to debug and make the code to work.
One of the easiest solution that I found is to capture the context into "self" and then all public functions to be declared with the object function. For example, sayHelo() will always referring to the same context as you call the setMyName().
function myClass() {
var self = this;
var name;
this.setMyName = function (s) { name = s; };
this.getMyName = function() { return name; };
this.sayHelo = function() { return self.getMyName(); };
}
var c = new myClass();
c.setMyName('Mickey');
console.log(c.sayHelo());
One of the easiest solution that I found is to capture the context into "self" and then all public functions to be declared with the object function. For example, sayHelo() will always referring to the same context as you call the setMyName().
function myClass() {
var self = this;
var name;
this.setMyName = function (s) { name = s; };
this.getMyName = function() { return name; };
this.sayHelo = function() { return self.getMyName(); };
}
var c = new myClass();
c.setMyName('Mickey');
console.log(c.sayHelo());
Wednesday, 18 January 2017
Spinner generator
The following website provides an easy way to generate the spinner animation in 3 output: SVG, CSS and GIF. This tool is great and very helpful.
http://loading.io/
http://loading.io/
Subscribe to:
Comments (Atom)
We are moving
We are moving this blog to our new blog site: https://ciysys.com/blog/nodejs.htm
-
Overview Usually, we start developing a new system with designing database and then writing codes. If you are not a fan of ORM, you will h...
-
Below is the sample HTML which will hide the URL at the page header when printing with Javascript. <html moznomarginboxes > ...
-
You can draw a simple pie chart & doughnut chart with SVG + CSS. This is quite simple and straight forward. But the limitation is that i...