This commit is contained in:
Gal Podlipnik 2025-08-05 12:44:47 +02:00
parent bef1e9c398
commit 54b779390e
5 changed files with 25 additions and 114 deletions

102
README.md
View File

@ -1,101 +1,5 @@
# StudentApp
To install dependencies use:
<a alt="Nx logo" href="https://nx.dev" target="_blank" rel="noreferrer"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png" width="45"></a>
✨ Your new, shiny [Nx workspace](https://nx.dev) is ready ✨.
[Learn more about this workspace setup and its capabilities](https://nx.dev/getting-started/tutorials/angular-standalone-tutorial?utm_source=nx_project&amp;utm_medium=readme&amp;utm_campaign=nx_projects) or run `npx nx graph` to visually explore what was created. Now, let's get you up to speed!
## Run tasks
To run the dev server for your app, use:
```sh
npx nx serve student-app
```bash
npm install --legacy-peer-deps
```
To create a production bundle:
```sh
npx nx build student-app
```
To see all available targets to run for a project, run:
```sh
npx nx show project student-app
```
These targets are either [inferred automatically](https://nx.dev/concepts/inferred-tasks?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) or defined in the `project.json` or `package.json` files.
[More about running tasks in the docs &raquo;](https://nx.dev/features/run-tasks?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
## Add new projects
While you could add new projects to your workspace manually, you might want to leverage [Nx plugins](https://nx.dev/concepts/nx-plugins?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) and their [code generation](https://nx.dev/features/generate-code?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) feature.
Use the plugin's generator to create new projects.
To generate a new application, use:
```sh
npx nx g @nx/angular:app demo
```
To generate a new library, use:
```sh
npx nx g @nx/angular:lib mylib
```
You can use `npx nx list` to get a list of installed plugins. Then, run `npx nx list <plugin-name>` to learn about more specific capabilities of a particular plugin. Alternatively, [install Nx Console](https://nx.dev/getting-started/editor-setup?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) to browse plugins and generators in your IDE.
[Learn more about Nx plugins &raquo;](https://nx.dev/concepts/nx-plugins?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) | [Browse the plugin registry &raquo;](https://nx.dev/plugin-registry?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
## Set up CI!
### Step 1
To connect to Nx Cloud, run the following command:
```sh
npx nx connect
```
Connecting to Nx Cloud ensures a [fast and scalable CI](https://nx.dev/ci/intro/why-nx-cloud?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects) pipeline. It includes features such as:
- [Remote caching](https://nx.dev/ci/features/remote-cache?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
- [Task distribution across multiple machines](https://nx.dev/ci/features/distribute-task-execution?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
- [Automated e2e test splitting](https://nx.dev/ci/features/split-e2e-tasks?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
- [Task flakiness detection and rerunning](https://nx.dev/ci/features/flaky-tasks?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
### Step 2
Use the following command to configure a CI workflow for your workspace:
```sh
npx nx g ci-workflow
```
[Learn more about Nx on CI](https://nx.dev/ci/intro/ci-with-nx#ready-get-started-with-your-provider?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
## Install Nx Console
Nx Console is an editor extension that enriches your developer experience. It lets you run tasks, generate code, and improves code autocompletion in your IDE. It is available for VSCode and IntelliJ.
[Install Nx Console &raquo;](https://nx.dev/getting-started/editor-setup?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
## Useful links
Learn more:
- [Learn more about this workspace setup](https://nx.dev/getting-started/tutorials/angular-standalone-tutorial?utm_source=nx_project&amp;utm_medium=readme&amp;utm_campaign=nx_projects)
- [Learn about Nx on CI](https://nx.dev/ci/intro/ci-with-nx?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
- [Releasing Packages with Nx release](https://nx.dev/features/manage-releases?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
- [What are Nx plugins?](https://nx.dev/concepts/nx-plugins?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)
And join the Nx community:
- [Discord](https://go.nx.dev/community)
- [Follow us on X](https://twitter.com/nxdevtools) or [LinkedIn](https://www.linkedin.com/company/nrwl)
- [Our Youtube channel](https://www.youtube.com/@nxdevtools)
- [Our blog](https://nx.dev/blog?utm_source=nx_project&utm_medium=readme&utm_campaign=nx_projects)

View File

@ -6,6 +6,7 @@ import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';
import { MultiSelectModule } from 'primeng/multiselect';
import { StudentService } from './student.service';
import { LocaleStore } from './translations/locale.service';
@Component({
selector: 'app-add-student',
@ -117,6 +118,7 @@ import { StudentService } from './student.service';
})
export class AddStudentComponent {
private readonly studentService = inject(StudentService);
private readonly localeStore = inject(LocaleStore);
private readonly router = inject(Router);
protected name = '';
@ -142,11 +144,10 @@ export class AddStudentComponent {
email: this.email,
courses: this.selectedCourses,
});
this.router.navigate(['/students']);
this.router.navigate([`/${this.localeStore.getCurrentLocale()}/students`]);
}
cancel() {
this.router.navigate(['/students']);
this.router.navigate([`/${this.localeStore.getCurrentLocale()}/students`]);
}
}

View File

@ -211,7 +211,7 @@ import { LocaleStore } from './translations/locale.service';
],
})
export class App implements OnInit {
private readonly theme = stored('light', {
private readonly theme = stored('dark', {
key: 'theme',
});
private readonly locale = inject(LocaleStore);

View File

@ -7,6 +7,7 @@ import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';
import { MultiSelectModule } from 'primeng/multiselect';
import { StudentService } from './student.service';
import { LocaleStore } from './translations/locale.service';
@Component({
selector: 'app-edit-student',
@ -30,7 +31,6 @@ import { StudentService } from './student.service';
pInputText
[ngModel]="student()?.name"
name="name"
disabled
/>
</div>
<div class="form-field">
@ -40,7 +40,6 @@ import { StudentService } from './student.service';
pInputText
[ngModel]="student()?.email"
name="email"
disabled
/>
</div>
<div class="form-field">
@ -148,6 +147,7 @@ import { StudentService } from './student.service';
})
export class EditStudentComponent implements OnInit {
private readonly studentService = inject(StudentService);
private readonly localeStore = inject(LocaleStore);
private readonly router = inject(Router);
private readonly queryId = queryParam('id');
@ -176,10 +176,10 @@ export class EditStudentComponent implements OnInit {
save() {
this.studentService.updateStudent(this.student()!);
this.router.navigate(['/students']);
this.router.navigate([`/${this.localeStore.getCurrentLocale()}/students`]);
}
cancel() {
this.router.navigate(['/students']);
this.router.navigate([`/${this.localeStore.getCurrentLocale()}/students`]);
}
}

View File

@ -4,6 +4,7 @@ import { Router } from '@angular/router';
import { ButtonModule } from 'primeng/button';
import { TableModule } from 'primeng/table';
import { StudentService } from './student.service';
import { LocaleStore } from './translations/locale.service';
import { AppTranslatePipe } from './translations/translate.pipe';
@Component({
@ -230,20 +231,25 @@ import { AppTranslatePipe } from './translations/translate.pipe';
export class OverviewComponent {
private readonly router = inject(Router);
private readonly studentsService = inject(StudentService);
private readonly localeStore = inject(LocaleStore);
protected readonly students = computed(() => this.studentsService.students());
protected generateMock = () => this.studentsService.generateMockData();
goToAdd() {
this.router.navigate(['/students/add']);
this.router.navigate([
`/${this.localeStore.getCurrentLocale()}/students/add`,
]);
}
editStudent(id: number) {
this.router.navigate([`/students/edit`], {
this.router.navigate(
[`/${this.localeStore.getCurrentLocale()}/students/edit`],
{
queryParams: {
id,
},
});
}
);
}
deleteStudent(id: string) {