UNPKG

jangular-cli

Version:

A powerful CLI tool for rapidly bootstrapping Angular 17 & Spring Boot (Java 21) applications with integrated security, services, and enterprise-ready best practices.

105 lines (101 loc) 5.42 kB
<!-- dashboard.component.html --> <div class="min-h-screen bg-gray-100"> <nav class="bg-white shadow"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex justify-between h-16"> <div class="flex"> <div class="flex-shrink-0 flex items-center"> <h1 class="text-xl font-bold text-indigo-600">Jangular</h1> </div> </div> <div class="flex items-center"> <div class="ml-3 relative"> <div class="flex items-center"> <span *ngIf="user" class="mr-4 text-gray-700">Welcome, {{ user.firstName || "John" }}</span> <button (click)="logout()" class="px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"> Sign out </button> </div> </div> </div> </div> </div> </nav> <div class="py-10"> <header> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <h1 class="text-3xl font-bold text-gray-900">Dashboard</h1> </div> </header> <main> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <!-- Loading state --> <div *ngIf="loading" class="text-center py-10"> <svg class="animate-spin h-10 w-10 text-indigo-600 mx-auto" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"> <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> </svg> <p class="mt-2 text-gray-600">Loading profile...</p> </div> <!-- Error state --> <div *ngIf="error && !loading" class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative mt-6" role="alert"> <span class="block sm:inline">{{ error }}</span> <button (click)="loadUserProfile()" class="mt-2 text-sm text-red-700 underline">Try again</button> </div> <!-- User profile --> <div *ngIf="user && !loading" class="bg-white shadow overflow-hidden sm:rounded-lg mt-6"> <div class="px-4 py-5 sm:px-6"> <h3 class="text-lg leading-6 font-medium text-gray-900"> User Profile </h3> <p class="mt-1 max-w-2xl text-sm text-gray-500"> Personal details and account information </p> </div> <div class="border-t border-gray-200"> <dl> <div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Username</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ user.username }}</dd> </div> <div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Full name</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ user.firstName }} {{ user.lastName }}</dd> </div> <div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Email address</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ user.email }}</dd> </div> <div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">User ID</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ user.id }}</dd> </div> <div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Roles</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2"> <span *ngFor="let role of user.roles; let last = last" class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-indigo-100 text-indigo-800 mr-2"> {{ role.replace('ROLE_', '') }} </span> </dd> </div> <div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Account created</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ user.createdAt }}</dd> </div> <div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <dt class="text-sm font-medium text-gray-500">Account status</dt> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2"> <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full" [ngClass]="user.active ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'"> {{ user.active ? 'Active' : 'Inactive' }} </span> </dd> </div> </dl> </div> </div> </div> </main> </div> </div>