add edit json v1 WIP, testing
This commit is contained in:
parent
e5eee656d5
commit
ea92145350
11 changed files with 216 additions and 67 deletions
|
|
@ -93,13 +93,13 @@ const routes: Routes = [
|
|||
).then((m) => m.RecipeDetailsComponent),
|
||||
canActivate: [authGuard],
|
||||
},
|
||||
{
|
||||
path: 'log',
|
||||
loadComponent: () =>
|
||||
import('./features/changelog/changelog.component').then(
|
||||
(m) => m.ChangelogComponent
|
||||
),
|
||||
},
|
||||
// {
|
||||
// path: 'log',
|
||||
// loadComponent: () =>
|
||||
// import('./features/changelog/changelog.component').then(
|
||||
// (m) => m.ChangelogComponent
|
||||
// ),
|
||||
// },
|
||||
{
|
||||
path: '**',
|
||||
redirectTo: 'recipes',
|
||||
|
|
|
|||
|
|
@ -80,4 +80,20 @@ export class RecipeService {
|
|||
{ withCredentials: true, responseType: 'json' }
|
||||
);
|
||||
}
|
||||
|
||||
editChanges(version: string, change: any){
|
||||
console.log("target version = ", version);
|
||||
console.log("change in edit: ",change.value)
|
||||
return this._httpClient.post<{
|
||||
status: string
|
||||
}>(
|
||||
environment.api + ('/recipes/edit/'+version),
|
||||
change.value,
|
||||
{ withCredentials: true, responseType: 'json', }
|
||||
).subscribe({
|
||||
next(value) {
|
||||
console.log(value, change.value)
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,4 +94,16 @@
|
|||
<!-- Temporary remove merge tool -->
|
||||
|
||||
|
||||
<div class="card h-full max-h-full">
|
||||
<h2 class="card-title p-2">Diff</h2>
|
||||
<!-- selectable version -->
|
||||
<div class="card-body bg-stone-200">
|
||||
<h3 class="card-title">Select Version</h3>
|
||||
<div class="rela flex-row m-2" id="diff_version_select">
|
||||
<input class="input input-md input-bordered m-2 bg-red-100" type="number" name="master_target" placeholder="Master Version" id="master_target">
|
||||
<input class="input input-md input-bordered m-2 bg-green-100" type="number" name="target" placeholder="Target Version" id="target">
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="button bg-stone-400 p-2 rounded m-2 text-black font-bold" id="diff_load" (click)="addVersion()">+ Add Version</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -150,5 +150,12 @@ export class ChangelogComponent {
|
|||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add version button
|
||||
addVersion(){
|
||||
let dvs = document.getElementById("diff_version_select");
|
||||
dvs!.innerHTML += `<input class="input input-md input-bordered m-2 bg-green-100" type="number" name="target" placeholder="Target Version" id="target">`;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,6 +182,14 @@ export class RecipeDetailsComponent implements OnInit {
|
|||
message: 'Do you want to save changes?',
|
||||
confirmCallBack: () => {
|
||||
console.log('confirm save');
|
||||
// TODO: update value in targeted recipe
|
||||
this._recipeService.editChanges(
|
||||
this._recipeService.getCurrentVersion(),
|
||||
{
|
||||
...this.recipeDetail
|
||||
}
|
||||
);
|
||||
console.log("Sending changes")
|
||||
this._router.navigate(['/recipes']);
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -191,4 +191,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-circle fixed z-100 bottom-5 right-1" (click)="scrollToTop()">^</button>
|
||||
</main>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,12 @@ export class DashboardComponent implements OnInit {
|
|||
private searchStr = '';
|
||||
private oldSearchStr = '';
|
||||
|
||||
tableCtx?: ElementRef;
|
||||
|
||||
@ViewChild('table', { static: false }) set content(table: ElementRef) {
|
||||
// expose element ref for other fn
|
||||
this.tableCtx = table;
|
||||
|
||||
table.nativeElement.addEventListener(
|
||||
'scroll',
|
||||
() => {
|
||||
|
|
@ -202,4 +207,8 @@ export class DashboardComponent implements OnInit {
|
|||
'_blank'
|
||||
);
|
||||
}
|
||||
|
||||
scrollToTop() {
|
||||
this.tableCtx!.nativeElement.scroll;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,8 +6,15 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"recipe-manager/models"
|
||||
"recipe-manager/services/logger"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var (
|
||||
Log = logger.GetInstance()
|
||||
)
|
||||
|
||||
func readFile(version string) *models.Recipe {
|
||||
|
|
@ -131,6 +138,27 @@ func (d *Data) GetRecipe01() []models.Recipe01 {
|
|||
return d.currentRecipe.Recipe01
|
||||
}
|
||||
|
||||
func (d *Data) GetRecipe01ByProductCode(code string) models.Recipe01 {
|
||||
result := make([]models.Recipe01, 0)
|
||||
|
||||
for _, v := range d.currentRecipe.Recipe01 {
|
||||
if v.ProductCode == code {
|
||||
result = append(result, v)
|
||||
}
|
||||
}
|
||||
|
||||
return result[0]
|
||||
}
|
||||
|
||||
func (d *Data) SetValuesToRecipe(recipe models.Recipe01) {
|
||||
for _, v := range d.currentRecipe.Recipe01 {
|
||||
if v.ProductCode == recipe.ProductCode {
|
||||
v = recipe
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Data) GetMaterialSetting(version string) []models.MaterialSetting {
|
||||
result := make([]models.MaterialSetting, 0)
|
||||
|
||||
|
|
@ -225,3 +253,13 @@ func (d *Data) GetMaterialCode(ids []uint64, version string) []models.MaterialCo
|
|||
|
||||
return resultFilter
|
||||
}
|
||||
|
||||
func (d *Data) ExportToJSON() []byte {
|
||||
b_recipe, err := json.Marshal(d.currentRecipe)
|
||||
if err != nil {
|
||||
Log.Error("Error when marshal recipe", zap.Error(err))
|
||||
return nil
|
||||
}
|
||||
|
||||
return b_recipe
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package models
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
type Recipe struct {
|
||||
Timestamp string `json:"Timestamp"`
|
||||
MachineSetting MachineSetting `json:"MachineSetting"`
|
||||
|
|
@ -82,6 +84,19 @@ type Recipe01 struct {
|
|||
Weight_float int `json:"weight_float"`
|
||||
}
|
||||
|
||||
func (r *Recipe01) ToMap() map[string]interface{} {
|
||||
var m map[string]interface{}
|
||||
recipeRecord, _ := json.Marshal(r)
|
||||
json.Unmarshal(recipeRecord, &m)
|
||||
return m
|
||||
}
|
||||
|
||||
func (r *Recipe01) FromMap(m map[string]interface{}) Recipe01 {
|
||||
recipeRecord, _ := json.Marshal(m)
|
||||
json.Unmarshal(recipeRecord, &r)
|
||||
return *r
|
||||
}
|
||||
|
||||
type MatRecipe struct {
|
||||
MixOrder int `json:"MixOrder"`
|
||||
FeedParameter int `json:"FeedParameter"`
|
||||
|
|
|
|||
|
|
@ -2,15 +2,19 @@ package routers
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"os"
|
||||
"recipe-manager/data"
|
||||
"recipe-manager/models"
|
||||
"recipe-manager/services/logger"
|
||||
"recipe-manager/services/sheet"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type RecipeRouter struct {
|
||||
|
|
@ -18,6 +22,10 @@ type RecipeRouter struct {
|
|||
sheetService sheet.SheetService
|
||||
}
|
||||
|
||||
var (
|
||||
Log = logger.GetInstance()
|
||||
)
|
||||
|
||||
func NewRecipeRouter(data *data.Data, sheetService sheet.SheetService) *RecipeRouter {
|
||||
return &RecipeRouter{
|
||||
data: data,
|
||||
|
|
@ -143,5 +151,53 @@ func (rr *RecipeRouter) Route(r chi.Router) {
|
|||
}
|
||||
json.NewEncoder(w).Encode(mapResult)
|
||||
})
|
||||
|
||||
r.Post("/edit/{version}", func(w http.ResponseWriter, r *http.Request) {
|
||||
Log.Debug("Edit: ", zap.String("path", r.RequestURI))
|
||||
version := chi.URLParam(r, "version")
|
||||
target_recipe := rr.data.GetRecipe(version)
|
||||
|
||||
Log.Debug("Target => ", zap.Any("target", target_recipe.MachineSetting.ConfigNumber))
|
||||
|
||||
// Body
|
||||
var changes models.Recipe01
|
||||
err := json.NewDecoder(r.Body).Decode(&changes)
|
||||
if err != nil {
|
||||
Log.Error("Decode in request failed: ", zap.Error(err))
|
||||
}
|
||||
|
||||
Log.Debug("Changes: ", zap.Any("changes", changes))
|
||||
// TODO: find the matched pd
|
||||
target_menu := rr.data.GetRecipe01ByProductCode(changes.ProductCode)
|
||||
|
||||
menu_map := target_menu.ToMap()
|
||||
change_map := changes.ToMap()
|
||||
|
||||
// Find changes
|
||||
for key, val := range menu_map {
|
||||
if val != change_map[key] {
|
||||
menu_map[key] = change_map[key]
|
||||
}
|
||||
}
|
||||
|
||||
// Apply changes
|
||||
tempRecipe := models.Recipe01{}
|
||||
tempRecipe = tempRecipe.FromMap(menu_map)
|
||||
rr.data.SetValuesToRecipe(tempRecipe)
|
||||
|
||||
finalData := rr.data.ExportToJSON()
|
||||
temp_finalData, err := json.MarshalIndent(finalData, "", " ")
|
||||
if err != nil {
|
||||
Log.Error("Error when indent marshal recipe", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
os.WriteFile("./cofffeemachineConfig/coffeethai02_"+version+".json", temp_finalData, fs.FileMode(0666))
|
||||
|
||||
w.Header().Add("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"status": "OK",
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
|||
104
server/server.go
104
server/server.go
|
|
@ -324,67 +324,8 @@ func (s *Server) createHandler() {
|
|||
|
||||
})
|
||||
|
||||
// r.Get("/mergelogList", func(w http.ResponseWriter, r *http.Request) {
|
||||
// ch_dir, err := os.ReadDir("cofffeemachineConfig/changelog")
|
||||
// if err != nil {
|
||||
// Log.Error("Error while trying to read dir: ", zap.String("dir", "cofffeemachineConfig/changelog"), zap.Error(err))
|
||||
// http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
// }
|
||||
// displayable := make([]string, 0)
|
||||
|
||||
// for _, file := range ch_dir {
|
||||
// if strings.Contains(file.Name(), ".html") {
|
||||
|
||||
// displayable = append(displayable, file.Name()[:len(file.Name())-len(filepath.Ext(file.Name()))])
|
||||
// }
|
||||
// }
|
||||
// w.Header().Set("Content-Type", "application/json")
|
||||
// w.WriteHeader(http.StatusOK)
|
||||
// json.NewEncoder(w).Encode(map[string][]string{"dirs": displayable})
|
||||
// })
|
||||
|
||||
r.Get("/listFileInDir/*", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// // socket
|
||||
// socket, err := upgrader.Upgrade(w, r, nil)
|
||||
|
||||
// if err != nil {
|
||||
// Log.Error("Error while trying to upgrade socket: ", zap.Error(err))
|
||||
// return
|
||||
// }
|
||||
|
||||
// // TODO: Change to websocket for better performance
|
||||
// for {
|
||||
// msg_type, msg, err := socket.ReadMessage()
|
||||
|
||||
// if err != nil {
|
||||
// Log.Warn("Idle ", zap.Any("status", err))
|
||||
// return
|
||||
// }
|
||||
|
||||
// var msgPayload map[string]interface{}
|
||||
|
||||
// err = json.Unmarshal(msg, &msgPayload)
|
||||
// if err != nil {
|
||||
// Log.Error("Error while trying to unmarshal message: ", zap.Error(err))
|
||||
// return
|
||||
// }
|
||||
|
||||
// // topic := msgPayload["topic"].(string)
|
||||
|
||||
// Log.Info("Receive message: ", zap.Any("msg_type", msg_type), zap.Any("msg", msgPayload))
|
||||
|
||||
// response, err := json.Marshal(map[string]interface{}{
|
||||
// "message": "ok",
|
||||
// })
|
||||
// if err != nil {
|
||||
// Log.Error("Error at marshalling response: ", zap.Error(err))
|
||||
// return
|
||||
// }
|
||||
// // respons to client
|
||||
// socket.WriteMessage(msg_type, response)
|
||||
// }
|
||||
|
||||
//spl
|
||||
spl_path := strings.Split(r.RequestURI, "/")
|
||||
if len(spl_path) > 3 {
|
||||
|
|
@ -437,6 +378,51 @@ func (s *Server) createHandler() {
|
|||
Log.Debug("Scan dir completed < ", zap.String("path", r.RequestURI))
|
||||
})
|
||||
|
||||
r.Get("/get_log_relation", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// Python looker
|
||||
py_exec, err := exec.LookPath("python")
|
||||
if err != nil {
|
||||
Log.Error("Error while trying to find python: ", zap.Error(err))
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
merge_timeline, api_err := os.Open("./python_api/merge_timeline.py")
|
||||
if api_err != nil {
|
||||
Log.Error("Error while trying to open merge_timeline.json: ", zap.Error(api_err))
|
||||
http.Error(w, api_err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
defer merge_timeline.Close()
|
||||
|
||||
cmd := exec.Command(py_exec, merge_timeline.Name(), "get_relate")
|
||||
|
||||
Log.Debug("Command: ", zap.String("command", cmd.String()))
|
||||
|
||||
out, err := cmd.CombinedOutput()
|
||||
|
||||
Log.Debug("Output: ", zap.String("output", string(out)))
|
||||
|
||||
if err != nil {
|
||||
Log.Error("Error while trying to run python: ", zap.Error(err))
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
// clean up output
|
||||
clean1 := strings.ReplaceAll(string(out), "\n", "")
|
||||
clean2 := strings.ReplaceAll(clean1, "\r", "")
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"message": clean2,
|
||||
})
|
||||
})
|
||||
|
||||
r.Post("/diffpy/*", func(w http.ResponseWriter, r *http.Request) {
|
||||
Log.Debug("Diffpy: ", zap.String("path", r.RequestURI))
|
||||
// TODO: add command exec `python_Exec` `merge_recipe.py` `diff` `master_version` `version-version-version` `debug?` `flatten={true|false}` `out={true|false}`
|
||||
})
|
||||
|
||||
sheetService, err := sheet.NewSheetService(context.Background(), s.cfg)
|
||||
|
||||
if err != nil {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue