Angular Material এর বেস্ট প্র্যাকটিস

Web Development - অ্যাঙ্গুলার ম্যাটেরিয়াল (Angular Material) -

Angular Material একটি শক্তিশালী UI লাইব্রেরি যা Angular অ্যাপ্লিকেশনগুলোর জন্য প্রি-বিল্ট কম্পোনেন্ট সরবরাহ করে। তবে, এর সঠিক ব্যবহার নিশ্চিত করতে কিছু বেস্ট প্র্যাকটিস অনুসরণ করা গুরুত্বপূর্ণ, যা অ্যাপ্লিকেশনের পারফরম্যান্স, ইউজার এক্সপিরিয়েন্স (UX), এবং কোড মেইনটেনেবিলিটি উন্নত করতে সহায়ক। এখানে Angular Material ব্যবহার করার কিছু বেস্ট প্র্যাকটিস আলোচনা করা হলো।


১. উপযুক্ত মডিউল ইমপোর্ট করা

Angular Material এর প্রতিটি কম্পোনেন্ট আলাদা মডিউল হিসেবে আসছে। শুধুমাত্র প্রয়োজনীয় কম্পোনেন্টের মডিউলগুলোই ইমপোর্ট করা উচিত, যাতে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত হয় এবং অবাঞ্ছিত ডিপেনডেন্সি লোড না হয়।

উদাহরণ:

import { MatButtonModule } from '@angular/material/button';
import { MatInputModule } from '@angular/material/input';
import { MatToolbarModule } from '@angular/material/toolbar';

@NgModule({
  imports: [
    MatButtonModule,
    MatInputModule,
    MatToolbarModule,
  ],
})
export class AppModule {}

এখানে, শুধুমাত্র ব্যবহার করা কম্পোনেন্টগুলোর মডিউল ইমপোর্ট করা হয়েছে।


২. থিমিং এবং কাস্টমাইজেশন

Angular Material এর প্রি-বিল্ট থিম ব্যবহার করা যেতে পারে, তবে আপনার অ্যাপ্লিকেশন এবং ব্র্যান্ডিংয়ের জন্য কাস্টম থিম তৈরি করা বেস্ট প্র্যাকটিস। Angular Material এর থিমিং সিস্টেম অত্যন্ত শক্তিশালী এবং সহজে কাস্টমাইজযোগ্য।

কাস্টম থিম তৈরি করার উদাহরণ:

@import '~@angular/material/theming';

@include mat-core();

// Custom color palette
$primary: mat-palette($mat-indigo);
$accent: mat-palette($mat-pink);
$warn: mat-palette($mat-red);

// Define the theme
$theme: mat-light-theme((
  color: (
    primary: $primary,
    accent: $accent,
    warn: $warn,
  ),
));

@include angular-material-theme($theme);

এটি আপনার অ্যাপ্লিকেশনের জন্য ইউনিফর্ম ডিজাইন সিস্টেম তৈরি করবে।


৩. রেসপন্সিভ ডিজাইন ব্যবহার করা

Angular Material এর বিভিন্ন কম্পোনেন্ট রেসপন্সিভ ডিজাইন সাপোর্ট করে, যেমন MatGridList, MatSidenav, MatToolbar ইত্যাদি। Flex Layout বা Grid List ব্যবহার করে রেসপন্সিভ লেআউট তৈরি করুন।

উদাহরণ:

<mat-grid-list cols="3" rowHeight="2:1">
  <mat-grid-tile>Tile 1</mat-grid-tile>
  <mat-grid-tile>Tile 2</mat-grid-tile>
  <mat-grid-tile>Tile 3</mat-grid-tile>
</mat-grid-list>

এখানে, MatGridList কম্পোনেন্ট ব্যবহার করে একটি রেসপন্সিভ গ্রিড তৈরি করা হয়েছে যা বিভিন্ন ডিভাইসের জন্য উপযুক্ত।


৪. ডেটা ভ্যালিডেশন এবং ফর্ম কন্ট্রোল

Angular Material এর MatFormField এবং MatInput ব্যবহার করে সহজেই ফর্ম ভ্যালিডেশন ইমপ্লিমেন্ট করা যায়। ব্যবহারকারীর ইনপুট চেক করার জন্য Angular এর Reactive Forms বা Template-driven Forms ব্যবহার করুন।

উদাহরণ:

<form [formGroup]="form">
  <mat-form-field appearance="fill">
    <mat-label>Email</mat-label>
    <input matInput formControlName="email" required email>
    <mat-error *ngIf="form.get('email').hasError('required')">
      Email is required
    </mat-error>
    <mat-error *ngIf="form.get('email').hasError('email')">
      Invalid email
    </mat-error>
  </mat-form-field>
</form>

এখানে, ইনপুট ভ্যালিডেশন কাস্টমাইজ করা হয়েছে এবং mat-error এর মাধ্যমে ব্যবহারকারীদের ত্রুটি দেখানো হচ্ছে।


৫. ডায়লগ এবং পপআপ ব্যবহারে সর্বোচ্চ ব্যবহারিকতা

MatDialog ব্যবহার করার সময়, ডায়লগের কনটেন্ট, আকার এবং অ্যাকশন বোতামগুলি প্রাসঙ্গিকভাবে কাস্টমাইজ করুন। এটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়ক।

উদাহরণ:

import { MatDialog } from '@angular/material/dialog';

@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent {
  constructor(public dialog: MatDialog) {}

  openDialog(): void {
    const dialogRef = this.dialog.open(MyDialogComponent, {
      width: '250px',
      data: { name: 'Angular' },
    });

    dialogRef.afterClosed().subscribe(result => {
      console.log('Dialog closed', result);
    });
  }
}

এখানে, MatDialog ব্যবহার করে ডায়লগ তৈরি করা হয়েছে, যা একটি নির্দিষ্ট আকারে খুলবে এবং বন্ধ হওয়ার পর কনসোল লগ দেখাবে।


৬. অ্যাক্সেসিবিলিটি এবং ইউজার ফ্রেন্ডলি ইন্টারফেস

Angular Material কম্পোনেন্টগুলি ইতিমধ্যে অ্যাক্সেসিবিলিটি (Accessibility) ফিচার সমর্থন করে, তবে আপনাকে নিশ্চিত করতে হবে যে আপনার অ্যাপ্লিকেশন সঠিকভাবে স্ক্রীন রিডার, কীবোর্ড নেভিগেশন ইত্যাদির জন্য উপযুক্ত।

  • MatTooltip এবং MatButton এর জন্য aria-label প্রদান করুন।
  • MatFormField ব্যবহার করার সময় লেবেল এবং ইনপুট ফিল্ডের সাথে সঠিক অ্যাক্সেসিবিলিটি সেটিংস যুক্ত করুন।

উদাহরণ:

<mat-icon matTooltip="Delete" aria-label="Delete">
  delete
</mat-icon>

এখানে, aria-label ব্যবহার করে ইমেজ বা আইকনের জন্য স্ক্রীন রিডার সাপোর্ট বাড়ানো হয়েছে।


৭. স্টাইলিং এবং কাস্টম CSS

Angular Material কম্পোনেন্টের প্রি-ডিফাইন্ড স্টাইল সরবরাহ করে, তবে আপনি আপনার অ্যাপ্লিকেশন ডিজাইনের জন্য সেগুলো কাস্টমাইজ করতে পারেন। এতে CSS বা SCSS ব্যবহার করুন।

উদাহরণ:

::ng-deep .mat-toolbar {
  background-color: #3f51b5;
  color: white;
}

এখানে, mat-toolbar এর ব্যাকগ্রাউন্ড কালার এবং টেক্সট কালার কাস্টমাইজ করা হয়েছে।


৮. পারফরম্যান্স অপটিমাইজেশন

Angular Material ব্যবহার করার সময়, কিছু সাধারণ পারফরম্যান্স অপটিমাইজেশন প্র্যাকটিস অনুসরণ করা উচিত, যেমন:

  • শুধু প্রয়োজনীয় কম্পোনেন্ট এবং মডিউল ইমপোর্ট করা।
  • Lazy Loading ব্যবহার করা, বিশেষত বড় সেকশনের জন্য।
  • Change Detection Strategy সেট করা, যাতে unnecessary change detection cycles কমানো যায়।

উদাহরণ:

@Component({
  selector: 'app-example',
  changeDetection: ChangeDetectionStrategy.OnPush,
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  // Component logic
}

এখানে, OnPush change detection স্ট্র্যাটেজি ব্যবহার করা হয়েছে, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।


Angular Material এর বেস্ট প্র্যাকটিস অনুসরণ করে আপনি একটি স্কেলেবল, মেইনটেনেবল এবং ইউজার-বান্ধব অ্যাপ্লিকেশন তৈরি করতে পারেন। সঠিক কম্পোনেন্ট ইমপোর্ট, কাস্টম থিমিং, ফর্ম ভ্যালিডেশন, অ্যাক্সেসিবিলিটি এবং পারফরম্যান্স অপটিমাইজেশন আপনার অ্যাপ্লিকেশনের সফলতার চাবিকাঠি হতে পারে।

Content added By

Angular Material এ এক্সেসিবিলিটি

এক্সেসিবিলিটি (Accessibility) হল এমন একটি বৈশিষ্ট্য, যা ব্যবহারকারীদের (বিশেষ করে অক্ষমতার অধিকারী ব্যবহারকারীদের) জন্য ওয়েব অ্যাপ্লিকেশন বা সিস্টেমকে সহজে ব্যবহারযোগ্য করে তোলে। Angular Material এমন একটি UI লাইব্রেরি, যা ব্যবহারকারীদের জন্য এক্সেসিবিলিটি নিশ্চিত করতে বিভিন্ন ফিচার সরবরাহ করে। এটি keyboard navigation, screen reader support, ARIA (Accessible Rich Internet Applications) সাপোর্ট, এবং অন্যান্য বৈশিষ্ট্য অন্তর্ভুক্ত করে, যাতে সকল ব্যবহারকারী সহজে অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন।

Angular Material এর কম্পোনেন্টগুলো প্রায়শই ARIA সাপোর্ট করে এবং প্রতিটি কম্পোনেন্টে এক্সেসিবিলিটি নিশ্চিত করতে কিছু প্রাথমিক নির্দেশিকা অনুসরণ করা হয়।


Angular Material এ এক্সেসিবিলিটি নিশ্চিত করার কিছু পদ্ধতি

১. ARIA (Accessible Rich Internet Applications) ব্যবহার

ARIA (Accessible Rich Internet Applications) হল একটি ওয়েব অ্যাপ্লিকেশনের জন্য এক্সেসিবিলিটি ঠিক করার জন্য সরবরাহ করা ট্যাগ এবং প্রপার্টি। Angular Material এর কম্পোনেন্টগুলো ARIA বৈশিষ্ট্য ব্যবহার করতে সহায়ক। যেমন, ARIA-label, ARIA-labelledby, এবং ARIA-hidden প্রপার্টিগুলোর মাধ্যমে কন্ট্রোলের উপলব্ধতা নিশ্চিত করা যায়।

উদাহরণ:
<button mat-button [attr.aria-label]="'Save changes'">
  Save
</button>

এখানে, aria-label একটি বাটনের জন্য স্ক্রিন রিডারের মাধ্যমে একটি বর্ণনা প্রদান করে, যাতে অক্ষম ব্যবহারকারী বাটনের উদ্দেশ্য বুঝতে পারে।

২. ফোকাস ম্যানেজমেন্ট (Focus Management)

ফোকাস ম্যানেজমেন্ট খুবই গুরুত্বপূর্ণ এক্সেসিবিলিটি ফিচার, বিশেষ করে কীবোর্ড ব্যবহারকারীদের জন্য। Angular Material কম্পোনেন্টগুলোতে সাধারণত স্বয়ংক্রিয়ভাবে ফোকাস ম্যানেজমেন্ট থাকে। তবে আপনি যদি কাস্টম ফোকাসিং প্রয়োজন করেন, তবে তা কনফিগার করতে পারেন।

উদাহরণ:
<mat-form-field>
  <mat-label>Enter your name</mat-label>
  <input matInput aria-label="Name" [(ngModel)]="name" />
</mat-form-field>

এখানে, matInput ফোকাসযোগ্য একটি ইনপুট ফিল্ড, এবং aria-label ফিল্ডের জন্য স্ক্রিন রিডারে পাঠযোগ্য একটি লেবেল সরবরাহ করছে।

৩. কীবোর্ড নেভিগেশন (Keyboard Navigation)

Angular Material কম্পোনেন্টগুলোর মধ্যে কীবোর্ড নেভিগেশন এক্সেসিবিলিটি নিশ্চিত করার জন্য tabindex এবং keyboard events সঠিকভাবে ব্যবহার করা হয়। কীবোর্ড ব্যবহারকারীরা সহজেই অ্যাপ্লিকেশনের বিভিন্ন অংশে নেভিগেট করতে পারে, যেমন ফোকাসযোগ্য এলিমেন্টগুলিতে ফোকাস রাখা।

Angular Material এর অনেক কম্পোনেন্টে tab (ট্যাব), enter, esc কীবোর্ড ইভেন্ট সাপোর্ট করা হয়।

উদাহরণ:
<mat-checkbox [(ngModel)]="checked" aria-label="Accept terms and conditions">
  I accept the terms and conditions
</mat-checkbox>

এখানে mat-checkbox কীবোর্ডের মাধ্যমে এক্সেস করা যাবে এবং ব্যবহারকারী স্পেসবার দিয়ে চেকবক্সটি সিলেক্ট করতে পারবে।

৪. স্ক্রিন রিডার সাপোর্ট

Angular Material কম্পোনেন্টগুলো স্ক্রিন রিডার সাপোর্ট করে, যা অক্ষম ব্যবহারকারীদের জন্য বিশেষভাবে সহায়ক। এই কম্পোনেন্টগুলোতে ARIA এর মাধ্যমে স্ক্রিন রিডারকে ডোম এলিমেন্টের বর্ণনা প্রদান করা হয়।

উদাহরণ:
<mat-button [attr.aria-label]="'Close'" (click)="close()">
  <mat-icon>close</mat-icon>
</mat-button>

এখানে aria-label স্ক্রিন রিডারকে বাটনের উদ্দেশ্য সম্পর্কে তথ্য প্রদান করছে (যেমন, "Close" লেখা বা নির্দেশনা)।

৫. প্যালেট ও কন্ট্রাস্ট (Color Palette and Contrast)

এক্সেসিবিলিটির জন্য কম্পোনেন্টের মধ্যে রঙের কন্ট্রাস্ট খুবই গুরুত্বপূর্ণ। Angular Material ডিফল্টভাবে ম্যাটেরিয়াল ডিজাইন এর রঙ ব্যবস্থাপনা ব্যবহার করে, যা রঙের কন্ট্রাস্টের দিকে নজর দেয়। এর মাধ্যমে high contrast mode নিশ্চিত করা যায় যাতে দৃষ্টি প্রতিবন্ধী ব্যবহারকারীরা সহজে অ্যাপ্লিকেশনটি ব্যবহার করতে পারে।

৬. লেবেল এবং ইনপুট (Labeling and Input)

MatFormField, MatInput ইত্যাদি কম্পোনেন্টগুলোতে লেবেল এবং ইনপুট ফিল্ডের ARIA প্রপার্টি ব্যবহারের মাধ্যমে অ্যাক্সেসিবিলিটি উন্নত করা যায়।

উদাহরণ:
<mat-form-field>
  <mat-label>Enter your email</mat-label>
  <input matInput aria-label="Email" [(ngModel)]="email" />
</mat-form-field>

এখানে, aria-label="Email" স্ক্রিন রিডারকে ইনপুট ফিল্ডের উদ্দেশ্য জানায়।

৭. নেভিগেশন কম্পোনেন্টে এক্সেসিবিলিটি

MatMenu, MatSidenav, MatDialog ইত্যাদি কম্পোনেন্টে এক্সেসিবিলিটি নিশ্চিত করার জন্য ARIA এবং কীবোর্ড নেভিগেশন সঠিকভাবে কনফিগার করা হয়।

উদাহরণ:
<mat-menu #appMenu="matMenu">
  <button mat-menu-item [matMenuTriggerFor]="subMenu">Submenu</button>
  <button mat-menu-item>Option 1</button>
  <button mat-menu-item>Option 2</button>
</mat-menu>

এখানে, মেনু এবং সাব-মেনু ব্যবহারে কীবোর্ড এবং স্ক্রিন রিডারের জন্য এক্সেসিবিলিটি নিশ্চিত করা হচ্ছে।


Angular Material বিভিন্ন কম্পোনেন্টের মাধ্যমে এক্সেসিবিলিটি সমর্থন করে, যাতে বিশেষ প্রয়োজনীয়তা সম্পন্ন ব্যবহারকারীরাও সহজে অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন। ARIA, keyboard navigation, screen reader support, এবং focus management এর মতো বৈশিষ্ট্যগুলি Angular Material এ অন্তর্ভুক্ত করা হয়েছে, যাতে ব্যবহারকারীরা একটি আরো সাশ্রয়ী এবং অ্যাক্সেসযোগ্য ডিজাইন উপভোগ করতে পারে। এই ফিচারগুলি অ্যাপ্লিকেশনের ইউজার এক্সপিরিয়েন্স এবং প্রাপ্যতা উন্নত করতে সাহায্য করে।

Content added By

Material কম্পোনেন্ট কাস্টমাইজ করা

Angular Material একটি আধুনিক এবং ব্যবহারকারী-বান্ধব UI লাইব্রেরি, যা ডেভেলপারদের জন্য প্রি-বিল্ট কম্পোনেন্ট সরবরাহ করে। তবে, কখনো কখনো আপনি Angular Material এর ডিফল্ট কম্পোনেন্টের স্টাইল বা বৈশিষ্ট্য কাস্টমাইজ করতে চাইবেন, যেমন রঙ, ফন্ট, আকার ইত্যাদি। Angular Material এর কম্পোনেন্ট কাস্টমাইজ করার অনেক উপায় আছে এবং এটি Angular's theming system এবং CSS/SCSS এর মাধ্যমে করা যায়।

এখানে কিছু জনপ্রিয় Angular Material কম্পোনেন্ট কাস্টমাইজ করার উপায় আলোচনা করা হলো।


১. Angular Material থিমিং সিস্টেম ব্যবহার করা

Angular Material এর থিমিং সিস্টেমের মাধ্যমে আপনি সহজেই পুরো অ্যাপ্লিকেশনের স্টাইল কাস্টমাইজ করতে পারেন। Angular Material থিমিং সিস্টেমে প্রধান রং (Primary), হাইলাইট রং (Accent) এবং ত্রুটি রং (Warn) কাস্টমাইজ করা যায়।

কাস্টম থিম তৈরি করা

আপনার অ্যাপ্লিকেশনের জন্য কাস্টম থিম তৈরি করতে SCSS ফাইল ব্যবহার করতে হবে।

@import '~@angular/material/theming';

// কাস্টম রঙের প্যালেট তৈরি করা
$primary: mat-palette($mat-indigo);
$accent: mat-palette($mat-pink);
$warn: mat-palette($mat-red);

// থিম তৈরি করা
$theme: mat-light-theme((
  color: (
    primary: $primary,
    accent: $accent,
    warn: $warn
  )
));

// থিম অ্যাপ্লাই করা
@include angular-material-theme($theme);

এটি Angular Material এর ডিফল্ট কম্পোনেন্টগুলোর স্টাইলকে কাস্টম রঙে রূপান্তরিত করবে।


২. CSS বা SCSS দিয়ে কম্পোনেন্ট কাস্টমাইজ করা

Angular Material এর কম্পোনেন্টগুলি CSS বা SCSS দিয়ে কাস্টমাইজ করা সম্ভব। আপনি টেবিল, বাটন, ইনপুট ফিল্ড, ডায়লগ ইত্যাদি কম্পোনেন্টের স্টাইল পরিবর্তন করতে পারেন।

উদাহরণ: Material Button কাস্টমাইজ করা

MatButton কম্পোনেন্টটি কাস্টমাইজ করতে, আপনি CSS বা SCSS ব্যবহার করতে পারেন:

::ng-deep .mat-button {
  background-color: #4caf50;   /* গ্রিন ব্যাকগ্রাউন্ড */
  color: white;                 /* সাদা টেক্সট */
  border-radius: 8px;           /* গোলাকার কোণ */
  padding: 10px 20px;           /* প্যাডিং */
}

::ng-deep .mat-button:hover {
  background-color: #45a049;   /* হোভার ইফেক্ট */
}

এখানে, ::ng-deep এর মাধ্যমে আপনি Angular Material কম্পোনেন্টের স্টাইল কাস্টমাইজ করছেন। (এটি ব্যবহারকারীর স্টাইল শীট প্রভাবিত করার জন্য ব্যবহৃত হয়।)


৩. কাস্টম আইকন এবং সাইজ কাস্টমাইজেশন

MatIcon কম্পোনেন্টটি কাস্টম আইকন এবং সাইজ কাস্টমাইজ করার জন্য অত্যন্ত সহজ। আপনি font-size, color, background-color এবং অন্যান্য CSS প্রপার্টি ব্যবহার করে আইকনের আকার এবং রঙ পরিবর্তন করতে পারেন।

উদাহরণ: Material Icon কাস্টমাইজ করা

<mat-icon style="font-size: 40px; color: #ff4081;">home</mat-icon>

এখানে, font-size এবং color CSS প্রপার্টি ব্যবহার করে আইকনটির আকার এবং রঙ কাস্টমাইজ করা হয়েছে।


৪. Material Input কাস্টমাইজ করা

Angular Material এর MatInput কম্পোনেন্টটি কাস্টমাইজ করার জন্য, আপনি ইনপুটের আকার, রঙ, বর্ডার এবং অন্যান্য বৈশিষ্ট্য পরিবর্তন করতে পারেন।

উদাহরণ: Material Input কাস্টমাইজ করা

<mat-form-field appearance="outline">
  <mat-label>Enter your name</mat-label>
  <input matInput placeholder="John Doe">
</mat-form-field>

এখানে, appearance="outline" দিয়ে ইনপুট ফিল্ডের স্টাইল পরিবর্তন করা হয়েছে। এছাড়াও, MatLabel এবং MatInput এর স্টাইল পরিবর্তন করা যেতে পারে।

SCSS দিয়ে কাস্টমাইজেশন:

::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline {
  border-color: #ff4081; /* বর্ডার রঙ কাস্টমাইজ করা */
}

::ng-deep .mat-input-element {
  font-size: 16px; /* ইনপুট ফন্ট সাইজ কাস্টমাইজ করা */
}

৫. Material Dialog কাস্টমাইজ করা

MatDialog কম্পোনেন্টটি কাস্টমাইজ করতে হলে, আপনি Dialog এর স্টাইল এবং ভিউ পরিবর্তন করতে পারেন।

উদাহরণ: Material Dialog কাস্টমাইজ করা

import { MatDialog } from '@angular/material/dialog';
import { Component } from '@angular/core';

@Component({
  selector: 'app-dialog',
  templateUrl: './dialog.component.html',
})
export class DialogComponent {
  constructor(public dialog: MatDialog) {}

  openDialog() {
    this.dialog.open(DialogContentComponent, {
      width: '400px',
      height: '300px',
      panelClass: 'custom-dialog-container'
    });
  }
}
::ng-deep .custom-dialog-container {
  background-color: #4caf50;   /* কাস্টম ব্যাকগ্রাউন্ড রঙ */
  color: white;                 /* সাদা টেক্সট */
  border-radius: 10px;          /* গোলাকার কোণ */
}

এখানে, panelClass ব্যবহার করে আপনি ডায়ালগের কাস্টম ক্লাস যোগ করেছেন এবং SCSS দিয়ে ডায়ালগের স্টাইল পরিবর্তন করেছেন।


৬. Material Table কাস্টমাইজ করা

MatTable কম্পোনেন্টে বিভিন্ন কাস্টমাইজেশন করা যায়, যেমন কলাম সাইজ, প্যাডিং, ফন্ট সাইজ ইত্যাদি।

উদাহরণ: Material Table কাস্টমাইজ করা

<table mat-table [dataSource]="dataSource" matSort>
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>Name</th>
    <td mat-cell *matCellDef="let element">{{element.name}}</td>
  </ng-container>

  <ng-container matColumnDef="age">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>Age</th>
    <td mat-cell *matCellDef="let element">{{element.age}}</td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

SCSS দিয়ে কাস্টমাইজেশন:

::ng-deep .mat-header-cell, .mat-cell {
  font-size: 16px;        /* টেবিলের ফন্ট সাইজ পরিবর্তন */
  padding: 12px 24px;     /* টেবিলের প্যাডিং কাস্টমাইজ */
}

::ng-deep .mat-sort-header-container {
  color: #ff4081;        /* কলামের সোর্টিং আইকনের রঙ পরিবর্তন */
}

Angular Material এর কম্পোনেন্ট কাস্টমাইজ করার মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটিকে আরও ইউজার-ফ্রেন্ডলি এবং ব্র্যান্ডিংয়ের সাথে মানানসই করে তুলতে পারেন। Theming, CSS/SCSS কাস্টমাইজেশন, এবং Angular's styling API ব্যবহার করে আপনি অ্যাপ্লিকেশনের প্রতিটি অংশের ডিজাইন এবং অনুভূতি পরিবর্তন করতে পারবেন।

Content added By

মোবাইল ডিভাইসের জন্য Material অপটিমাইজ করা

Angular Material এমন একটি UI লাইব্রেরি যা Material Design গাইডলাইন অনুসরণ করে এবং অ্যাঙ্গুলার অ্যাপ্লিকেশনগুলোর জন্য একটি শক্তিশালী এবং আধুনিক UI প্রদান করে। তবে মোবাইল ডিভাইসে সঠিকভাবে কাজ করতে Angular Material কম্পোনেন্টগুলোকে মোবাইল-ফ্রেন্ডলি এবং রেসপন্সিভ হতে হবে। এর জন্য কিছু কৌশল ও কাস্টমাইজেশন প্রয়োগ করা প্রয়োজন, যা অ্যাপ্লিকেশনটির মোবাইল ডিভাইসের অভিজ্ঞতা উন্নত করবে।

এখানে কিছু কৌশল ও স্ট্র্যাটেজি দেওয়া হলো, যা আপনাকে Angular Material ব্যবহার করে মোবাইল ডিভাইসের জন্য আপনার অ্যাপ্লিকেশন অপটিমাইজ করতে সাহায্য করবে।


১. রেসপন্সিভ ডিজাইন নিশ্চিত করা

Angular Material স্বয়ংক্রিয়ভাবে রেসপন্সিভ ডিজাইন প্রদান করে, তবে কিছু কাস্টমাইজেশন এবং প্রাসঙ্গিক ফিচার ব্যবহার করে মোবাইল ডিভাইসের জন্য আরও ভাল অপটিমাইজেশন করা যায়। রেসপন্সিভ ডিজাইনের জন্য Flex Layout এবং Breakpoints ব্যবহার করা যেতে পারে, যা স্ক্রীন সাইজের ভিত্তিতে লেআউট কাস্টমাইজ করতে সহায়ক।

১.১ Flex Layout ব্যবহার করা

Angular Material এর Flex Layout একটি খুব শক্তিশালী টুল যা flexbox সিস্টেমের মাধ্যমে বিভিন্ন ডিভাইসে রেসপন্সিভ লেআউট তৈরি করতে সাহায্য করে। এটি এলিমেন্টগুলোর সাইজ এবং অবস্থান নির্ধারণে সাহায্য করে।

npm install @angular/flex-layout

HTML টেমপ্লেট উদাহরণ:

<div fxLayout="row" fxLayout.xs="column" fxLayoutAlign="center center">
  <div fxFlex="25">Item 1</div>
  <div fxFlex="25">Item 2</div>
  <div fxFlex="25">Item 3</div>
</div>

এখানে:

  • fxLayout="row": ডিফল্টভাবে উপাদানগুলো একটি সারিতে সাজানো হবে।
  • fxLayout.xs="column": স্ক্রীন সাইজ extra small (xs) হলে, এলিমেন্টগুলো কলামে সাজানো হবে।
  • fxLayoutAlign="center center": এলিমেন্টগুলোর অবস্থান সেন্টার করা হবে।

১.২ Breakpoints ব্যবহার করা

Breakpoints ব্যবহার করে আপনি নির্ধারণ করতে পারেন কোন স্ক্রীন সাইজের জন্য কোন লেআউট প্রযোজ্য হবে। Angular Material এ কিছু ডিফল্ট ব্রেকপয়েন্ট রয়েছে, যেমন xs, sm, md, lg, এবং xl

<mat-toolbar color="primary" fxLayout="row" fxLayout.gt-sm="column">
  <span>My Application</span>
</mat-toolbar>

এখানে, gt-sm এর মানে হলো যদি স্ক্রীন সাইজ sm (ট্যাবলেট) এর থেকে বড় হয়, তখন এলিমেন্টগুলো সারিতে থাকবে, অন্যথায় কলামে সজ্জিত হবে।


২. টুলবার কাস্টমাইজেশন (Toolbar Customization)

মোবাইল ডিভাইসে mat-toolbar (টুলবার) কে আরও ফ্লেক্সিবল এবং উপযোগী করতে কিছু কাস্টমাইজেশন প্রয়োজন। আপনি মোবাইল ডিভাইসে টুলবারের আকার ছোট এবং মেনু বাটন যোগ করতে পারেন।

২.১ মেনু বাটন ও ট্যাব সিস্টেম

মোবাইল ডিভাইসে একটি হ্যামবার্গার মেনু (menu icon) বা ট্যাব সিস্টেম খুবই জনপ্রিয়। MatSidenav বা MatTabGroup ব্যবহার করে এটি কার্যকরভাবে ইমপ্লিমেন্ট করা যায়।

<mat-toolbar color="primary">
  <button mat-icon-button [matMenuTriggerFor]="menu">
    <mat-icon>menu</mat-icon>
  </button>
  <mat-menu #menu="matMenu">
    <button mat-menu-item>Home</button>
    <button mat-menu-item>About</button>
  </mat-menu>
  <span>My Application</span>
</mat-toolbar>

এখানে:

  • mat-icon-button: এটি একটি আইকন বাটন তৈরি করে।
  • matMenuTriggerFor: এটি মেনুটি ট্রিগার করে।

২.২ Responsive Toolbar

<mat-toolbar color="primary" fxLayout="row" fxLayoutAlign="space-between center">
  <span>My Application</span>
  <button mat-icon-button (click)="toggleMenu()">
    <mat-icon>menu</mat-icon>
  </button>
</mat-toolbar>

এখানে fxLayoutAlign ব্যবহার করে টুলবারে উপাদানগুলোর অবস্থান ঠিক করা হয়েছে।


৩. ইমেজ ও ভিউফোল্ডার অপটিমাইজেশন

মোবাইল ডিভাইসের জন্য ইমেজ অপটিমাইজেশন খুবই গুরুত্বপূর্ণ, কারণ এটি পারফরম্যান্সে গুরুত্বপূর্ণ প্রভাব ফেলতে পারে। Angular Material এর mat-card কম্পোনেন্টের মাধ্যমে ছবির সাইজ এবং রেজুলেশন কাস্টমাইজ করা যায়।

<mat-card>
  <img mat-card-image src="image.jpg" alt="Image">
  <mat-card-title>Card Title</mat-card-title>
  <mat-card-content>Card content here...</mat-card-content>
</mat-card>

এখানে:

  • mat-card-image: এটি ইমেজ ট্যাগে স্বয়ংক্রিয়ভাবে স্টাইল যোগ করে এবং ইমেজের আকার কাস্টমাইজ করে।

৪. কাস্টম থিমিং এবং রঙ

মোবাইল ডিভাইসের জন্য কাস্টম থিম ব্যবহার করা যেতে পারে, যা আরো সুদৃশ্য এবং ব্যবহারকারী-বান্ধব ডিজাইন প্রদান করে।

@import '~@angular/material/theming';

@include mat-core();

$primary: mat-palette($mat-blue);
$accent: mat-palette($mat-pink);
$warn: mat-palette($mat-red);

$theme: mat-light-theme($primary, $accent, $warn);

@include angular-material-theme($theme);

এখানে, মোবাইল-ফ্রেন্ডলি রঙ এবং স্টাইল কাস্টমাইজ করতে SCSS ফাইল ব্যবহার করা হচ্ছে।


৫. পারফরম্যান্স অপটিমাইজেশন

মোবাইল ডিভাইসে পারফরম্যান্স অপটিমাইজেশন নিশ্চিত করার জন্য Angular Material এর বিভিন্ন কম্পোনেন্টের মাধ্যমে লোডিং সময় কমাতে হবে। যেমন:

  • Lazy Loading: মোবাইল ডিভাইসে অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করতে লেজি লোডিং ব্যবহার করা হয়।
  • Tree Shaking: অ্যাপ্লিকেশনের অব্যবহৃত কোড সরিয়ে ফেলতে tree shaking ব্যবহার করা হয়।

Angular Material এর মাধ্যমে মোবাইল ডিভাইসের জন্য অ্যাপ্লিকেশন অপটিমাইজ করা সহজ এবং কার্যকর। Flex Layout, Breakpoints, Material Components, Toolbars, এবং Responsive Design এর সাহায্যে আপনি খুব সহজে মোবাইল-বান্ধব এবং রেসপন্সিভ অ্যাপ্লিকেশন তৈরি করতে পারবেন। এটি মোবাইল ডিভাইসে পারফরম্যান্স বৃদ্ধি এবং ইউজার এক্সপিরিয়েন্স উন্নত করার জন্য অত্যন্ত কার্যকরী।

Content added By

Angular Material কম্পোনেন্টের ইউনিট টেস্টিং

Angular Material কম্পোনেন্টের ইউনিট টেস্টিং (Unit Testing) করা গুরুত্বপূর্ণ, যাতে আপনি নিশ্চিত করতে পারেন যে আপনার কম্পোনেন্ট সঠিকভাবে কাজ করছে এবং কোনো বাগ বা অপ্রত্যাশিত আচরণ দেখা যাচ্ছে না। Angular কম্পোনেন্টের জন্য ইউনিট টেস্টিং করতে সাধারণত Jasmine এবং Karma ব্যবহার করা হয়। Jasmine একটি টেস্টিং ফ্রেমওয়ার্ক এবং Karma একটি রাননার যা টেস্টগুলো চালায়। Angular CLI এর মাধ্যমে এটি স্বয়ংক্রিয়ভাবে কনফিগার করা থাকে।

এই টিউটোরিয়ালে, আমরা দেখব কীভাবে Angular Material কম্পোনেন্ট যেমন MatTable, MatButton, MatStepper ইত্যাদির ইউনিট টেস্ট তৈরি করা যায়।


১. Angular Material কম্পোনেন্টের টেস্টিং সেটআপ

প্রথমে, নিশ্চিত করুন যে আপনার অ্যাপ্লিকেশনটি Jasmine এবং Karma ব্যবহার করছে। যদি আপনি Angular CLI ব্যবহার করে অ্যাপ তৈরি করে থাকেন, তাহলে এটি স্বয়ংক্রিয়ভাবে কনফিগার করা থাকে।

টেস্ট ফাইলের মূল কাঠামো:

প্রতিটি কম্পোনেন্টের জন্য একটি টেস্ট ফাইল থাকে, যেটির এক্সটেনশন .spec.ts হয়।


২. MatButton কম্পোনেন্টের টেস্টিং

MatButton কম্পোনেন্টের টেস্টিং করতে নিচে একটি সাধারণ টেস্টের উদাহরণ দেওয়া হলো:

টেস্ট কোড:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatButtonModule } from '@angular/material/button';
import { AppComponent } from './app.component';
import { By } from '@angular/platform-browser';

describe('AppComponent', () => {
  let fixture: ComponentFixture<AppComponent>;
  let component: AppComponent;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [MatButtonModule], // MatButtonModule ইমপোর্ট করতে হবে
      declarations: [AppComponent],
    }).compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create the app', () => {
    expect(component).toBeTruthy();
  });

  it('should contain a button with the correct text', () => {
    const button = fixture.debugElement.query(By.css('button'));
    expect(button.nativeElement.textContent).toContain('Click me');
  });

  it('should call the onClick method when the button is clicked', () => {
    spyOn(component, 'onClick');
    const button = fixture.debugElement.query(By.css('button'));
    button.triggerEventHandler('click', null);
    expect(component.onClick).toHaveBeenCalled();
  });
});

কোড ব্যাখ্যা:

  • MatButtonModule: MatButton কম্পোনেন্ট ব্যবহার করার জন্য এটি ইমপোর্ট করতে হয়।
  • fixture.debugElement.query(By.css('button')): এই লাইনটি DOM-এ button এলিমেন্ট খুঁজে বের করে।
  • button.triggerEventHandler('click', null): এটি বাটনে ক্লিক করার মতো ইভেন্ট ট্রিগার করে, যাতে onClick মেথডটি কল হয়।

৩. MatTable কম্পোনেন্টের টেস্টিং

MatTable কম্পোনেন্টে ডেটা সঠিকভাবে প্রদর্শিত হচ্ছে কিনা তা টেস্ট করতে হবে।

টেস্ট কোড:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatTableModule } from '@angular/material/table';
import { AppComponent } from './app.component';
import { By } from '@angular/platform-browser';

describe('AppComponent with MatTable', () => {
  let fixture: ComponentFixture<AppComponent>;
  let component: AppComponent;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [MatTableModule], // MatTableModule ইমপোর্ট
      declarations: [AppComponent],
    }).compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should display the correct number of rows in the table', () => {
    const rows = fixture.debugElement.queryAll(By.css('mat-row'));
    expect(rows.length).toBe(3); // এখানে ৩টি রো হওয়ার কথা
  });

  it('should display the correct data in the table', () => {
    const row = fixture.debugElement.queryAll(By.css('mat-row'))[0];
    const columns = row.queryAll(By.css('mat-cell'));
    expect(columns[0].nativeElement.textContent).toBe('1');
    expect(columns[1].nativeElement.textContent).toBe('Hydrogen');
    expect(columns[2].nativeElement.textContent).toBe('1.0079');
  });
});

কোড ব্যাখ্যা:

  • MatTableModule: MatTable কম্পোনেন্ট ব্যবহার করার জন্য এটি ইমপোর্ট করতে হয়।
  • fixture.debugElement.queryAll(By.css('mat-row')): এই লাইনটি ডেটা টেবিলের সব রো (row) গুলো খুঁজে বের করে।
  • expect(columns[0].nativeElement.textContent): এখানে প্রতিটি সেলে সঠিক ডেটা প্রদর্শিত হচ্ছে কিনা তা যাচাই করা হচ্ছে।

৪. MatStepper কম্পোনেন্টের টেস্টিং

MatStepper কম্পোনেন্টের স্টেপ ভ্যালিডেশন এবং নেভিগেশন টেস্ট করার জন্য, স্টেপস মধ্যে ন্যাভিগেশন এবং ফর্ম ভ্যালিডেশন চেক করা হয়।

টেস্ট কোড:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatStepperModule } from '@angular/material/stepper';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';

describe('AppComponent with MatStepper', () => {
  let fixture: ComponentFixture<AppComponent>;
  let component: AppComponent;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [MatStepperModule, ReactiveFormsModule], // MatStepperModule ইমপোর্ট
      declarations: [AppComponent],
    }).compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should disable next button if form is invalid', () => {
    const nextButton = fixture.debugElement.nativeElement.querySelector('button[matStepperNext]');
    expect(nextButton.disabled).toBeTruthy(); // ফর্ম ইনভ্যালিড হলে নেক্সট বাটন ডিসেবল থাকবে
  });

  it('should navigate to the next step when the form is valid', () => {
    component.firstFormGroup.controls.firstName.setValue('John');
    fixture.detectChanges();
    const nextButton = fixture.debugElement.nativeElement.querySelector('button[matStepperNext]');
    nextButton.click();
    fixture.detectChanges();
    expect(component.stepper.selectedIndex).toBe(1); // পরবর্তী স্টেপে নেভিগেট হবে
  });
});

কোড ব্যাখ্যা:

  • matStepperNext: এটি নেক্সট স্টেপে নেভিগেট করতে ব্যবহৃত হয়।
  • nextButton.disabled: এখানে টেস্ট করা হচ্ছে, যদি ফর্ম ইনভ্যালিড হয়, তাহলে নেক্সট বাটনটি ডিসেবল হবে।
  • component.stepper.selectedIndex: এটি স্টেপারের নির্বাচিত স্টেপ চেক করার জন্য ব্যবহৃত হয়।

Angular Material কম্পোনেন্টের ইউনিট টেস্টিং অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনের ব্যবহারকারীর ইন্টারফেসের বিভিন্ন অংশের কার্যকারিতা নিশ্চিত করে। Jasmine, Karma, এবং TestBed ব্যবহার করে আপনি Angular Material কম্পোনেন্টের জন্য ইউনিট টেস্ট লিখতে পারেন। বিভিন্ন কম্পোনেন্ট যেমন MatButton, MatTable, MatStepper ইত্যাদির টেস্টিং সহজে করা যায়, যা আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং নির্ভরযোগ্য করে তোলে।

Content added By
Promotion