From 370d70cd31014f701593c8470bdb0aab87b66a5c Mon Sep 17 00:00:00 2001 From: Alexandre Vanini <vanini.alexandre@gmail.com> Date: Thu, 9 May 2019 10:10:09 +0200 Subject: [PATCH] Branche pour le design improvment --- client/package-lock.json | 6 +- client/package.json | 4 +- client/src/app/app-routing.module.ts | 1 + client/src/app/app.module.ts | 25 +++++++-- .../kata-create/kata-create.component.html | 53 ++++++++++++++++++ .../program-create.component.html | 4 +- .../program-create.component.scss | 1 + client/src/styles.scss | 5 +- server_rest/.idea/workspace.xml | 41 +++++--------- server_rest/target/classes/app.class | Bin 5853 -> 5777 bytes 10 files changed, 100 insertions(+), 40 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index c5f81e8..d490f65 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -122,9 +122,9 @@ } }, "@angular/animations": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.14.tgz", - "integrity": "sha512-K+wdq7TslmvDhrbwy65x7owE8wezI0fDdO+8SO9RU4m/w6R6vo4QS3uSdc5I2pxwm4QSXSc5eKhoWJkq0muTbQ==", + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.15.tgz", + "integrity": "sha512-8oBt3HLgd2+kyJHUgsd7OzKCCss67t2sch15XNoIWlOLfxclqU+EfFE6t/vCzpT8/+lpZS6LU9ZrTnb+UBj5jg==", "requires": { "tslib": "^1.9.0" } diff --git a/client/package.json b/client/package.json index a2bc891..867e63a 100644 --- a/client/package.json +++ b/client/package.json @@ -11,8 +11,8 @@ }, "private": true, "dependencies": { - "@angular/animations": "~7.2.0", - "@angular/cdk": "~7.3.7", + "@angular/animations": "^7.2.15", + "@angular/cdk": "^7.3.7", "@angular/common": "~7.2.0", "@angular/compiler": "~7.2.0", "@angular/core": "~7.2.0", diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts index 278de4a..5754c12 100644 --- a/client/src/app/app-routing.module.ts +++ b/client/src/app/app-routing.module.ts @@ -6,6 +6,7 @@ import {KataComponent} from './kata/kata.component'; import {ProgramCreateComponent} from './program-create/program-create.component'; import {KataCreateComponent} from './kata-create/kata-create.component'; + const routerOptions: ExtraOptions = { useHash: false, anchorScrolling: 'enabled' diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts index 32ab379..1f38cdf 100644 --- a/client/src/app/app.module.ts +++ b/client/src/app/app.module.ts @@ -7,7 +7,15 @@ import {TerminalAssertComponent} from './terminal-assert/terminal-assert.compone import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {MainLeftSideNavComponent} from './main-left-side-nav/main-left-side-nav.component'; import {LayoutModule} from '@angular/cdk/layout'; -import {MatToolbarModule, MatButtonModule, MatSidenavModule, MatIconModule, MatListModule} from '@angular/material'; +import { + MatToolbarModule, + MatButtonModule, + MatSidenavModule, + MatIconModule, + MatListModule, + MatStepperModule, + MatOptionModule, MatSelectModule +} from '@angular/material'; import {AppRoutingModule} from './app-routing.module'; import {RouterModule} from '@angular/router'; import {KataDisplayerComponent} from './kata-displayer/kata-displayer.component'; @@ -16,11 +24,13 @@ import {KataComponent} from './kata/kata.component'; import {AceEditorModule} from 'ng2-ace-editor'; import {KataCreateComponent} from './kata-create/kata-create.component'; import {ProgramCreateComponent} from './program-create/program-create.component'; -import {FormsModule} from '@angular/forms'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; import {HttpClientModule} from '@angular/common/http'; import {RNotFoundComponent} from './rnot-found/rnot-found.component'; import {NgxUiLoaderModule} from 'ngx-ui-loader'; -import { AlertModule } from 'ngx-alerts'; +import {AlertModule} from 'ngx-alerts'; +import {MatInputModule} from '@angular/material'; +import {MatFormFieldModule} from '@angular/material/form-field'; @NgModule({ @@ -34,7 +44,7 @@ import { AlertModule } from 'ngx-alerts'; KataComponent, KataCreateComponent, ProgramCreateComponent, - RNotFoundComponent + RNotFoundComponent, ], imports: [ @@ -46,6 +56,13 @@ import { AlertModule } from 'ngx-alerts'; MatSidenavModule, MatIconModule, MatListModule, + MatStepperModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatOptionModule, + MatSelectModule, AppRoutingModule, RouterModule, AceEditorModule, diff --git a/client/src/app/kata-create/kata-create.component.html b/client/src/app/kata-create/kata-create.component.html index 1837926..1a7bbaa 100644 --- a/client/src/app/kata-create/kata-create.component.html +++ b/client/src/app/kata-create/kata-create.component.html @@ -40,6 +40,59 @@ </div> </div> + <!-- <mat-horizontal-stepper [linear]="false" #stepper> + <mat-step [stepControl]="firstFormGroup"> + <form [formGroup]="firstFormGroup"> + <ng-template matStepLabel>Kata's options</ng-template> + <mat-form-field> + <mat-label>Display assert box</mat-label> + <mat-select (change)="UpdateChoice($event)" matNativeControl required> + <mat-option value="true">yes</mat-option> + <mat-option value="false">no</mat-option> + </mat-select> + </mat-form-field><br/> + <mat-form-field> + <input matInput autocomplete="off" placeholder="Kata's title" [(ngModel)]="title" required> + </mat-form-field><br/> + <mat-form-field> + <input matInput type="number" [(ngModel)]="numberOfAttempt" placeholder="Unlock solution at (n) attempt" required> + </mat-form-field> + + <div> + <button mat-button matStepperNext>Next</button> + </div> + </form> + </mat-step> + <mat-step [stepControl]="secondFormGroup"> + <form [formGroup]="secondFormGroup"> + <ng-template matStepLabel>Kata's instructions</ng-template> + + <textarea [(ngModel)]="rules" formControlName="secondCtrl" required></textarea> + + <br/> + <div> + <button mat-button matStepperPrevious>Back</button> + <button mat-button matStepperNext>Next</button> + </div> + </form> + </mat-step> + <mat-step [stepControl]="thirdFormGroup"> + <form [formGroup]="thirdFormGroup"> + <ng-template matStepLabel>Kata</ng-template> + <app-terminal-code [code]="solution" [type]="language" (new)="OnNewEventSolution($event)"></app-terminal-code> + <app-terminal-code style="margin-left: 20px;" [code]="assert" [type]="language" (new)="OnNewEventAssert($event)"></app-terminal-code><br/> + <app-terminal-code [code]="canva" [type]="language" (new)="OnNewEventCanva($event)"></app-terminal-code> + <textarea [ngClass]="{'success':status === 0,'error':status === 1,'':status === 2}" + style="white-space: pre-wrap" disabled>{{result}}</textarea><br/> + <div> + <button mat-button (click)="try()" type="button">Try my solution</button> + <button mat-button (click)="publish()" type="button">Create kata</button> + <button mat-button matStepperPrevious>Back</button> + <button mat-button (click)="stepper.reset()">Reset</button> + </div> + </form> + </mat-step> + </mat-horizontal-stepper>--> </div> diff --git a/client/src/app/program-create/program-create.component.html b/client/src/app/program-create/program-create.component.html index 31faa13..63c9287 100644 --- a/client/src/app/program-create/program-create.component.html +++ b/client/src/app/program-create/program-create.component.html @@ -2,7 +2,7 @@ <div class="d-flex flex-column"> <fieldset> <legend>New program</legend> - <div class="p-2"><label>Title</label><input placeholder="Some title.." type="text" [(ngModel)]="programTitle"/> + <div class="p-2"><label>Title</label><input matInput placeholder="Some title.." type="text" [(ngModel)]="programTitle"/> </div> <div class="p-2"><label>Targeted language</label><select (change)="update($event)"> <option value="python">python</option> @@ -10,7 +10,7 @@ </select></div> <div class="p-2"><label>Program description</label><textarea [(ngModel)]="programDescr" placeholder="Some text.."></textarea></div> - <div class="p-2"><label>Tags</label><input type="text" [(ngModel)]="programTags" + <div class="p-2"><label>Tags (_,_)</label><input type="text" [(ngModel)]="programTags" placeholder=" arrays,writeable,.."/></div> <div class="p-2"> diff --git a/client/src/app/program-create/program-create.component.scss b/client/src/app/program-create/program-create.component.scss index 1f3449f..e7c857d 100644 --- a/client/src/app/program-create/program-create.component.scss +++ b/client/src/app/program-create/program-create.component.scss @@ -1,3 +1,4 @@ + input[type=text]{ width: 100%; background-color: rgba(43, 47, 57, 1); diff --git a/client/src/styles.scss b/client/src/styles.scss index e7d6f82..4959ba1 100644 --- a/client/src/styles.scss +++ b/client/src/styles.scss @@ -1,5 +1,4 @@ /* You can add global styles to this file, and also import other style files */ - html, body { height: 100%; --color-cloud: rgba(236, 240, 241, 1); @@ -37,6 +36,10 @@ body { } +button:focus{ +outline: none; +} + .button:hover { background-color: var(--color-button-hover); } diff --git a/server_rest/.idea/workspace.xml b/server_rest/.idea/workspace.xml index ee65090..e01421b 100644 --- a/server_rest/.idea/workspace.xml +++ b/server_rest/.idea/workspace.xml @@ -2,26 +2,9 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="e6a1f2e5-4f60-4227-82bb-83eb10fa94a5" name="Default Changelist" comment=""> - <change beforePath="$PROJECT_DIR$/../client/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/../client/package-lock.json" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/../client/package.json" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/app.module.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/app.module.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata-create/kata-create.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata-displayer/kata-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata-displayer/kata-displayer.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata-displayer/kata-displayer.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata-displayer/kata-displayer.component.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata/kata.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata/kata.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata/kata.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata/kata.component.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/kata/kata.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/kata/kata.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/languages_canvas.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/languages_canvas.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/main-left-side-nav/main-left-side-nav.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/main-left-side-nav/main-left-side-nav.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/main-left-side-nav/main-left-side-nav.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/main-left-side-nav/main-left-side-nav.component.scss" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/program-create/program-create.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/program-displayer/program-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/program-displayer/program-displayer.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/program-displayer/program-displayer.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/program-displayer/program-displayer.component.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/styles.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/styles.scss" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/target/classes/app.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/app.class" afterDir="false" /> </list> <ignored path="$PROJECT_DIR$/out/" /> <ignored path="$PROJECT_DIR$/target/" /> @@ -48,8 +31,8 @@ <file pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="243"> - <caret line="52" lean-forward="true" selection-start-line="52" selection-end-line="52" /> + <state relative-caret-position="153"> + <caret line="46" column="13" lean-forward="true" selection-start-line="46" selection-start-column="13" selection-end-line="46" selection-end-column="13" /> <folding> <element signature="imports" expanded="true" /> </folding> @@ -157,8 +140,8 @@ <foldersAlwaysOnTop value="true" /> </navigator> <panes> - <pane id="ProjectPane" /> <pane id="Scope" /> + <pane id="ProjectPane" /> <pane id="PackagesPane" /> </panes> </component> @@ -229,11 +212,13 @@ <workItem from="1557298032818" duration="4720000" /> <workItem from="1557322451462" duration="202000" /> <workItem from="1557327228313" duration="707000" /> + <workItem from="1557340241267" duration="154000" /> + <workItem from="1557383112195" duration="510000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="48450000" /> + <option name="totallyTimeSpent" value="49114000" /> </component> <component name="TodoView"> <todo-panel id="selected-file"> @@ -245,10 +230,10 @@ </todo-panel> </component> <component name="ToolWindowManager"> - <frame x="0" y="23" width="1920" height="1121" extended-state="0" /> + <frame x="0" y="23" width="1920" height="1121" extended-state="6" /> <editor active="true" /> <layout> - <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.2736954" /> + <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.1970181" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Image Layers" order="2" /> <window_info id="Designer" order="3" /> @@ -257,7 +242,7 @@ <window_info id="Favorites" order="6" side_tool="true" /> <window_info anchor="bottom" id="Message" order="0" /> <window_info anchor="bottom" id="Find" order="1" /> - <window_info anchor="bottom" id="Run" order="2" weight="0.3595724" /> + <window_info anchor="bottom" id="Run" order="2" weight="0.35939643" /> <window_info anchor="bottom" id="Debug" order="3" weight="0.39941692" /> <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> @@ -490,8 +475,8 @@ </entry> <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="243"> - <caret line="52" lean-forward="true" selection-start-line="52" selection-end-line="52" /> + <state relative-caret-position="153"> + <caret line="46" column="13" lean-forward="true" selection-start-line="46" selection-start-column="13" selection-end-line="46" selection-end-column="13" /> <folding> <element signature="imports" expanded="true" /> </folding> diff --git a/server_rest/target/classes/app.class b/server_rest/target/classes/app.class index 4330328ec39ca3c488dd2ea4f9dae24083eb77d9..1c9802a0ba2547a05908d5756ebce45a16bfac3e 100644 GIT binary patch delta 2418 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 delta 2524 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 G!*l?^^uu2O -- GitLab