From 170df80d0aeabaaea084b336a0ee27151fe7f004 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Wed, 12 Sep 2018 10:17:31 +0200 Subject: [PATCH 01/52] queue --- Step/wwwroot/assets/styles/base/card.less | 6 + Step/wwwroot/assets/styles/base/modals.less | 8 +- Step/wwwroot/assets/styles/style.css | 258 ++++++++++++++---- Step/wwwroot/src/@types/production.d.ts | 10 + .../cards/card-element-queue.vue | 12 +- .../cards/card-job-production.vue | 1 + .../cards/card-production-cms.vue | 2 +- .../cards/card-queue-production.vue | 19 +- .../modal-add-element-queue.ts | 231 ++++++++++++++++ .../modal-add-element-queue.vue | 123 +++++++++ .../base-components/modal-load-program.ts | 1 + Step/wwwroot/src/services/hub.ts | 7 + Step/wwwroot/src/store/app.store.ts | 3 + Step/wwwroot/src/store/production.store.ts | 37 +++ 14 files changed, 648 insertions(+), 70 deletions(-) create mode 100644 Step/wwwroot/src/@types/production.d.ts create mode 100644 Step/wwwroot/src/modules/base-components/modal-add-element-queue.ts create mode 100644 Step/wwwroot/src/modules/base-components/modal-add-element-queue.vue create mode 100644 Step/wwwroot/src/store/production.store.ts diff --git a/Step/wwwroot/assets/styles/base/card.less b/Step/wwwroot/assets/styles/base/card.less index dbdf5d23..031b634e 100644 --- a/Step/wwwroot/assets/styles/base/card.less +++ b/Step/wwwroot/assets/styles/base/card.less @@ -841,6 +841,12 @@ border-radius: 2px; background-color: @color-background-white; box-shadow: 0 1px 2px 0 @color-black-40; + &.border-green{ + border: solid 2px @color-apple-green; + } + &.border-blue{ + border: solid 2px @color-clear-blue; + } .card-element-queue-name{ width: 100%; display: flex; diff --git a/Step/wwwroot/assets/styles/base/modals.less b/Step/wwwroot/assets/styles/base/modals.less index 66f6939d..de5b2987 100644 --- a/Step/wwwroot/assets/styles/base/modals.less +++ b/Step/wwwroot/assets/styles/base/modals.less @@ -798,7 +798,7 @@ } } -.@{modal}.modal-load-program { +.@{modal}.modal-load-program, .@{modal}.modal-add-element-queue { width: @modal-load-program-width; height: @modal-load-program-height; top: calc(~"50%" - @modal-load-program-height / 2); @@ -830,7 +830,7 @@ color: #fff; } } - .modal-load-program-header { + .modal-load-program-header, .modal-add-element-queue-header { height: 80px; width: 100%; display: flex; @@ -878,7 +878,7 @@ } } } - .modal-load-program-body { + .modal-load-program-body, .modal-add-element-queue-body { height: 631px; width: 100%; display: flex; @@ -1134,7 +1134,7 @@ } } } - .modal-load-program-footer { + .modal-load-program-footer, .modal-add-element-queue-footer { height: 79px; width: 100%; display: flex; diff --git a/Step/wwwroot/assets/styles/style.css b/Step/wwwroot/assets/styles/style.css index f4fa59c6..2a459f68 100644 --- a/Step/wwwroot/assets/styles/style.css +++ b/Step/wwwroot/assets/styles/style.css @@ -733,14 +733,16 @@ width: 100%; border: none; } -.modal.modal-load-program { +.modal.modal-load-program, +.modal.modal-add-element-queue { width: 1808px; height: 873px; top: calc(50% - 436.5px); left: calc(50% - 904px); background-color: #fff; } -.modal.modal-load-program header { +.modal.modal-load-program header, +.modal.modal-add-element-queue header { display: flex; align-items: center; padding-left: 24px; @@ -748,7 +750,8 @@ font-size: 20px; color: #002680; } -.modal.modal-load-program header button.close { +.modal.modal-load-program header button.close, +.modal.modal-add-element-queue header button.close { position: absolute; width: 28px; height: 28px; @@ -761,17 +764,24 @@ font-size: 16px; cursor: pointer; } -.modal.modal-load-program header button.close:active { +.modal.modal-load-program header button.close:active, +.modal.modal-add-element-queue header button.close:active { background-color: #1791ff; color: #fff; } -.modal.modal-load-program .modal-load-program-header { +.modal.modal-load-program .modal-load-program-header, +.modal.modal-add-element-queue .modal-load-program-header, +.modal.modal-load-program .modal-add-element-queue-header, +.modal.modal-add-element-queue .modal-add-element-queue-header { height: 80px; width: 100%; display: flex; flex-flow: column; } -.modal.modal-load-program .modal-load-program-header .box-search { +.modal.modal-load-program .modal-load-program-header .box-search, +.modal.modal-add-element-queue .modal-load-program-header .box-search, +.modal.modal-load-program .modal-add-element-queue-header .box-search, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search { width: 100%; height: 80px; display: flex; @@ -779,28 +789,46 @@ align-items: center; background-color: #979797; } -.modal.modal-load-program .modal-load-program-header .box-search .path { +.modal.modal-load-program .modal-load-program-header .box-search .path, +.modal.modal-add-element-queue .modal-load-program-header .box-search .path, +.modal.modal-load-program .modal-add-element-queue-header .box-search .path, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .path { display: flex; flex-flow: row; color: #fff; margin-left: 20px; } -.modal.modal-load-program .modal-load-program-header .box-search .path .child { +.modal.modal-load-program .modal-load-program-header .box-search .path .child, +.modal.modal-add-element-queue .modal-load-program-header .box-search .path .child, +.modal.modal-load-program .modal-add-element-queue-header .box-search .path .child, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .path .child { display: flex; flex-flow: row; } -.modal.modal-load-program .modal-load-program-header .box-search .path .child div + .fa.fa-chevron-right:first-child { +.modal.modal-load-program .modal-load-program-header .box-search .path .child div + .fa.fa-chevron-right:first-child, +.modal.modal-add-element-queue .modal-load-program-header .box-search .path .child div + .fa.fa-chevron-right:first-child, +.modal.modal-load-program .modal-add-element-queue-header .box-search .path .child div + .fa.fa-chevron-right:first-child, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .path .child div + .fa.fa-chevron-right:first-child { display: none; } -.modal.modal-load-program .modal-load-program-header .box-search .path .child .fa { +.modal.modal-load-program .modal-load-program-header .box-search .path .child .fa, +.modal.modal-add-element-queue .modal-load-program-header .box-search .path .child .fa, +.modal.modal-load-program .modal-add-element-queue-header .box-search .path .child .fa, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .path .child .fa { margin: 0px 22px; } -.modal.modal-load-program .modal-load-program-header .box-search .search { +.modal.modal-load-program .modal-load-program-header .box-search .search, +.modal.modal-add-element-queue .modal-load-program-header .box-search .search, +.modal.modal-load-program .modal-add-element-queue-header .box-search .search, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .search { display: flex; width: 100%; justify-content: flex-end; } -.modal.modal-load-program .modal-load-program-header .box-search .search input { +.modal.modal-load-program .modal-load-program-header .box-search .search input, +.modal.modal-add-element-queue .modal-load-program-header .box-search .search input, +.modal.modal-load-program .modal-add-element-queue-header .box-search .search input, +.modal.modal-add-element-queue .modal-add-element-queue-header .box-search .search input { width: 688px; height: 48px; border-radius: 2px; @@ -808,28 +836,43 @@ border: solid 1px #dfdfdf; background-color: #f8f8f8; } -.modal.modal-load-program .modal-load-program-body { +.modal.modal-load-program .modal-load-program-body, +.modal.modal-add-element-queue .modal-load-program-body, +.modal.modal-load-program .modal-add-element-queue-body, +.modal.modal-add-element-queue .modal-add-element-queue-body { height: 631px; width: 100%; display: flex; flex-flow: row; } -.modal.modal-load-program .modal-load-program-body hr { +.modal.modal-load-program .modal-load-program-body hr, +.modal.modal-add-element-queue .modal-load-program-body hr, +.modal.modal-load-program .modal-add-element-queue-body hr, +.modal.modal-add-element-queue .modal-add-element-queue-body hr { width: 5%; } -.modal.modal-load-program .modal-load-program-body .first-column { +.modal.modal-load-program .modal-load-program-body .first-column, +.modal.modal-add-element-queue .modal-load-program-body .first-column, +.modal.modal-load-program .modal-add-element-queue-body .first-column, +.modal.modal-add-element-queue .modal-add-element-queue-body .first-column { min-width: 215px; border-right: solid 2px #e7e7e7; display: flex; flex-flow: column; padding-top: 19px; } -.modal.modal-load-program .modal-load-program-body .first-column .card-folder-path { +.modal.modal-load-program .modal-load-program-body .first-column .card-folder-path, +.modal.modal-add-element-queue .modal-load-program-body .first-column .card-folder-path, +.modal.modal-load-program .modal-add-element-queue-body .first-column .card-folder-path, +.modal.modal-add-element-queue .modal-add-element-queue-body .first-column .card-folder-path { width: 200px; display: flex; margin-top: 8px 0 8px 5px; } -.modal.modal-load-program .modal-load-program-body .second-column { +.modal.modal-load-program .modal-load-program-body .second-column, +.modal.modal-add-element-queue .modal-load-program-body .second-column, +.modal.modal-load-program .modal-add-element-queue-body .second-column, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column { height: calc(100% - 19px); min-width: 445px; border-right: solid 2px #e7e7e7; @@ -837,22 +880,34 @@ flex-flow: column; padding-top: 19px; } -.modal.modal-load-program .modal-load-program-body .second-column .content { +.modal.modal-load-program .modal-load-program-body .second-column .content, +.modal.modal-add-element-queue .modal-load-program-body .second-column .content, +.modal.modal-load-program .modal-add-element-queue-body .second-column .content, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .content { width: 94%; height: 100%; } -.modal.modal-load-program .modal-load-program-body .second-column .content .card-folder-path { +.modal.modal-load-program .modal-load-program-body .second-column .content .card-folder-path, +.modal.modal-add-element-queue .modal-load-program-body .second-column .content .card-folder-path, +.modal.modal-load-program .modal-add-element-queue-body .second-column .content .card-folder-path, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .content .card-folder-path { width: 371px; display: flex; margin-top: 8px 0 8px 8px; } -.modal.modal-load-program .modal-load-program-body .second-column .group-btn { +.modal.modal-load-program .modal-load-program-body .second-column .group-btn, +.modal.modal-add-element-queue .modal-load-program-body .second-column .group-btn, +.modal.modal-load-program .modal-add-element-queue-body .second-column .group-btn, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .group-btn { display: flex; flex-flow: row; justify-content: center; margin-bottom: 16px; } -.modal.modal-load-program .modal-load-program-body .second-column .group-btn input { +.modal.modal-load-program .modal-load-program-body .second-column .group-btn input, +.modal.modal-add-element-queue .modal-load-program-body .second-column .group-btn input, +.modal.modal-load-program .modal-add-element-queue-body .second-column .group-btn input, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .group-btn input { width: 360px; height: 48px; padding: 0; @@ -861,22 +916,34 @@ border: none; border-bottom: 1px solid rgba(0, 0, 0, 0.4); } -.modal.modal-load-program .modal-load-program-body .second-column .group-btn input[type="text"] { +.modal.modal-load-program .modal-load-program-body .second-column .group-btn input[type="text"], +.modal.modal-add-element-queue .modal-load-program-body .second-column .group-btn input[type="text"], +.modal.modal-load-program .modal-add-element-queue-body .second-column .group-btn input[type="text"], +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .group-btn input[type="text"] { padding-left: 5px; outline: none ; } -.modal.modal-load-program .modal-load-program-body .second-column .group-btn input:focus { +.modal.modal-load-program .modal-load-program-body .second-column .group-btn input:focus, +.modal.modal-add-element-queue .modal-load-program-body .second-column .group-btn input:focus, +.modal.modal-load-program .modal-add-element-queue-body .second-column .group-btn input:focus, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .group-btn input:focus { border-bottom: 1px solid #1791ff; box-shadow: none; } -.modal.modal-load-program .modal-load-program-body .second-column .group-btn i { +.modal.modal-load-program .modal-load-program-body .second-column .group-btn i, +.modal.modal-add-element-queue .modal-load-program-body .second-column .group-btn i, +.modal.modal-load-program .modal-add-element-queue-body .second-column .group-btn i, +.modal.modal-add-element-queue .modal-add-element-queue-body .second-column .group-btn i { width: 44px; height: 44px; padding: 0; margin-top: 4px; color: #002680; } -.modal.modal-load-program .modal-load-program-body .third-column { +.modal.modal-load-program .modal-load-program-body .third-column, +.modal.modal-add-element-queue .modal-load-program-body .third-column, +.modal.modal-load-program .modal-add-element-queue-body .third-column, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column { height: calc(100% - 19px); min-width: 447px; border-right: solid 2px #e7e7e7; @@ -884,16 +951,25 @@ flex-flow: column; padding-top: 19px; } -.modal.modal-load-program .modal-load-program-body .third-column .content { +.modal.modal-load-program .modal-load-program-body .third-column .content, +.modal.modal-add-element-queue .modal-load-program-body .third-column .content, +.modal.modal-load-program .modal-add-element-queue-body .third-column .content, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .content { width: 94%; height: 100%; } -.modal.modal-load-program .modal-load-program-body .third-column .content .card-folder-path { +.modal.modal-load-program .modal-load-program-body .third-column .content .card-folder-path, +.modal.modal-add-element-queue .modal-load-program-body .third-column .content .card-folder-path, +.modal.modal-load-program .modal-add-element-queue-body .third-column .content .card-folder-path, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .content .card-folder-path { width: 371px; display: flex; margin-top: 8px 0 8px 8px; } -.modal.modal-load-program .modal-load-program-body .third-column .label-folder-empty { +.modal.modal-load-program .modal-load-program-body .third-column .label-folder-empty, +.modal.modal-add-element-queue .modal-load-program-body .third-column .label-folder-empty, +.modal.modal-load-program .modal-add-element-queue-body .third-column .label-folder-empty, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .label-folder-empty { display: flex; width: 100%; height: 100%; @@ -902,13 +978,19 @@ color: #4b4b4b; font-size: 20px; } -.modal.modal-load-program .modal-load-program-body .third-column .group-btn { +.modal.modal-load-program .modal-load-program-body .third-column .group-btn, +.modal.modal-add-element-queue .modal-load-program-body .third-column .group-btn, +.modal.modal-load-program .modal-add-element-queue-body .third-column .group-btn, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .group-btn { display: flex; flex-flow: row; justify-content: center; margin-bottom: 16px; } -.modal.modal-load-program .modal-load-program-body .third-column .group-btn input { +.modal.modal-load-program .modal-load-program-body .third-column .group-btn input, +.modal.modal-add-element-queue .modal-load-program-body .third-column .group-btn input, +.modal.modal-load-program .modal-add-element-queue-body .third-column .group-btn input, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .group-btn input { width: 360px; height: 48px; padding: 0; @@ -917,22 +999,34 @@ border: none; border-bottom: 1px solid rgba(0, 0, 0, 0.4); } -.modal.modal-load-program .modal-load-program-body .third-column .group-btn input[type="text"] { +.modal.modal-load-program .modal-load-program-body .third-column .group-btn input[type="text"], +.modal.modal-add-element-queue .modal-load-program-body .third-column .group-btn input[type="text"], +.modal.modal-load-program .modal-add-element-queue-body .third-column .group-btn input[type="text"], +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .group-btn input[type="text"] { padding-left: 5px; outline: none ; } -.modal.modal-load-program .modal-load-program-body .third-column .group-btn input:focus { +.modal.modal-load-program .modal-load-program-body .third-column .group-btn input:focus, +.modal.modal-add-element-queue .modal-load-program-body .third-column .group-btn input:focus, +.modal.modal-load-program .modal-add-element-queue-body .third-column .group-btn input:focus, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .group-btn input:focus { border-bottom: 1px solid #1791ff; box-shadow: none; } -.modal.modal-load-program .modal-load-program-body .third-column .group-btn i { +.modal.modal-load-program .modal-load-program-body .third-column .group-btn i, +.modal.modal-add-element-queue .modal-load-program-body .third-column .group-btn i, +.modal.modal-load-program .modal-add-element-queue-body .third-column .group-btn i, +.modal.modal-add-element-queue .modal-add-element-queue-body .third-column .group-btn i { width: 44px; height: 44px; padding: 0; margin-top: 4px; color: #002680; } -.modal.modal-load-program .modal-load-program-body .selected-item { +.modal.modal-load-program .modal-load-program-body .selected-item, +.modal.modal-add-element-queue .modal-load-program-body .selected-item, +.modal.modal-load-program .modal-add-element-queue-body .selected-item, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item { width: 660px; height: 100%; display: flex; @@ -940,30 +1034,45 @@ justify-content: flex-end; padding: 0 16px 0 22px; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header { height: 78px; width: 100%; display: flex; flex-flow: row; align-items: center; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .subtitle, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .subtitle, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .subtitle { display: flex; flex-flow: row; font-size: 13px; line-height: 4px; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle .title { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle .title, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .subtitle .title, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .title, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .title { width: 110px; text-align: right; color: #002680; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle .text { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .subtitle .text, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .subtitle .text, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .text, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .text { margin-right: 40px; color: #4b4b4b; margin-left: 5px; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .selected-item-title { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .selected-item-title, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .selected-item-title, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .selected-item-title, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .selected-item-title { height: 100%; width: 100%; display: flex; @@ -973,17 +1082,26 @@ font-size: 26px; line-height: 55px; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .group-button { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .group-button, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .group-button, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .group-button, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .group-button { height: 100%; width: 100%; display: flex; align-items: center; justify-content: flex-end; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .group-button i { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-header .group-button i, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .group-button i, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .group-button i, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .group-button i { font-size: 24px; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body { width: 100%; height: calc(100% - 78px); position: relative; @@ -991,20 +1109,29 @@ display: flex; flex-flow: column; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image { display: flex; width: 100%; margin-top: 10px; height: 336px; align-items: center; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image img { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image img, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image img, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image img, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image img { display: block; margin: auto; max-height: 336px; box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.4); } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image .noimage { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image .noimage, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-image .noimage, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image .noimage, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-image .noimage { display: block; margin: auto; height: 290px; @@ -1016,7 +1143,10 @@ box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.4); border: 1px solid rgba(0, 0, 0, 0.1); } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description { display: flex; width: 100%; margin-top: 10px; @@ -1024,7 +1154,10 @@ height: calc(100% - 380px); flex-flow: column; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row { height: 32px; min-height: 32px; display: flex; @@ -1034,18 +1167,30 @@ text-align: justify; overflow: hidden; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row label { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row label, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row label, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row label, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row label { font-size: 18px; margin-left: 5px; white-space: nowrap; } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(odd) { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(odd), +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(odd), +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(odd), +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(odd) { background-color: rgba(23, 145, 255, 0.3); } -.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(even) { +.modal.modal-load-program .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(even), +.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(even), +.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(even), +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-body .selected-item-body-description .row:nth-child(even) { background-color: #f3f3f3; } -.modal.modal-load-program .modal-load-program-body .selected-item .notselecteditem { +.modal.modal-load-program .modal-load-program-body .selected-item .notselecteditem, +.modal.modal-add-element-queue .modal-load-program-body .selected-item .notselecteditem, +.modal.modal-load-program .modal-add-element-queue-body .selected-item .notselecteditem, +.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .notselecteditem { position: absolute; right: 0; width: 695px; @@ -1058,7 +1203,10 @@ align-items: center; justify-content: center; } -.modal.modal-load-program .modal-load-program-footer { +.modal.modal-load-program .modal-load-program-footer, +.modal.modal-add-element-queue .modal-load-program-footer, +.modal.modal-load-program .modal-add-element-queue-footer, +.modal.modal-add-element-queue .modal-add-element-queue-footer { height: 79px; width: 100%; display: flex; @@ -5656,6 +5804,12 @@ footer .container button.big:before { background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4); } +.card-element-queue.border-green { + border: solid 2px #7ed321; +} +.card-element-queue.border-blue { + border: solid 2px #1791ff; +} .card-element-queue .card-element-queue-name { width: 100%; display: flex; diff --git a/Step/wwwroot/src/@types/production.d.ts b/Step/wwwroot/src/@types/production.d.ts new file mode 100644 index 00000000..50d7981f --- /dev/null +++ b/Step/wwwroot/src/@types/production.d.ts @@ -0,0 +1,10 @@ +declare module server { + export interface PartProgramModel { + absolutePath: string, + id: number, + partProgramName: string, + remainingReps: number, + reps: number, + status: number + } +} \ No newline at end of file diff --git a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue index c58ea2b5..5b7aaac4 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue @@ -1,10 +1,15 @@ \ No newline at end of file diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index 93ca6242..47cae3f3 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -28,13 +28,20 @@
- +
- + + +
+ + +
+
+ +
+
-
+
From 35221eff5d1cf7e5428c8e3210f0dcc49f4cf950 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Wed, 19 Sep 2018 11:39:51 +0200 Subject: [PATCH 42/52] fix change reps --- .../modules/base-components/cards/card-element-queue.vue | 7 +------ .../base-components/cards/card-queue-production.vue | 7 ++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue index 211ef1a4..b942ecfa 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue @@ -53,12 +53,7 @@ export default { debugger this.enablePopup = true; this.$emit("position", this.$el, this.enablePopup, true); - }, - async changeReps(value){ - console.log(value); - await new FileService().changeReps(this.selectedProcess, this.idPartProgram, value) - this.enablePopup = false; - }, + } // close(){ // this.enablePopup = false; // } diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index c57419c4..34afeeed 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -159,7 +159,12 @@ export default { }, close(){ this.enablePopup = false; - } + }, + async changeReps(value){ + console.log(value); + await new FileService().changeReps(this.selectedProcess, this.idPartProgram, value) + this.enablePopup = false; + }, } } From 95bdb7717584944198eea9d1b3bf8ea2e65aac8a Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Wed, 19 Sep 2018 11:54:19 +0200 Subject: [PATCH 43/52] fix top reps and start stop --- .../src/modules/base-components/cards/card-job-production.vue | 4 ++-- .../modules/base-components/cards/card-queue-production.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue index 2b820115..0be0f2f8 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue @@ -132,10 +132,10 @@ export default { async stopQueue(){ await new FileService().stopQueue(this.selectedProcess); if(this.queueStatus == 0){ - this.startStopQueue = true; + this.startStopQueue = false; } else{ - this.startStopQueue = false; + this.startStopQueue = true; } } } diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index 34afeeed..599dae41 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -151,7 +151,7 @@ export default { positionBoxReps(arg1, reps){ debugger this.numberReps = reps; - this.selectedPositionTop = (arg1.offsetTop + 226); + this.selectedPositionTop = (arg1.offsetTop + 164); this.enablePopup = true; }, selectTab(value){ From 1ba3475c3208e7c1fe74cf638b1b2a4bc80fea2d Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Wed, 19 Sep 2018 12:12:57 +0200 Subject: [PATCH 44/52] Fix queue storage in the db --- Client/Browser_Tools/BrowserJSObject.cs | 196 +++++++----------- Libs/CMS_CORE_Library.dll | Bin 9089024 -> 9089024 bytes .../Controllers/NcToolManagerController.cs | 1 + Step.Database/Controllers/QueueController.cs | 31 ++- Step.NC/NcHandler.cs | 70 ++++--- 5 files changed, 151 insertions(+), 147 deletions(-) diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index da31711b..ccbe27ac 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -1,5 +1,4 @@ using Chromium; -using Chromium.Remote; using Chromium.Remote.Event; using Chromium.WebBrowser; using Client.Config; @@ -13,15 +12,11 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; -using System.Text; using System.Threading; -using System.Threading.Tasks; using System.Windows.Forms; using static Client.Utils.Constants; @@ -29,15 +24,17 @@ namespace CMS_Client.Browser_Tools { public class BrowserJSObject : JSObject { - //The first letter of All PUBLIC Variables and Methods must be Lower-Case (CEF Settings) + // The first letter of All PUBLIC Variables and Methods must be Lower-Case (CEF Settings) private MainForm mainForm; - private static readonly string[] _validExtensions = { "",".txt", ".cnc", ".ini", ".mpf", ".spf" }; + private static readonly string[] _validExtensions = { "", ".txt", ".cnc", ".ini", ".mpf", ".spf" }; private static readonly string[] _validImages = { ".jpg", ".jpeg", ".png" }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region CONSTRUCTOR_METHOD - //Constructor Method + + // Constructor Method public BrowserJSObject(MainForm f) { mainForm = f; @@ -54,7 +51,7 @@ namespace CMS_Client.Browser_Tools AddFunction("getChromiumVersion").Execute += getChromiumVersion; AddFunction("getClientID").Execute += getClientID; AddFunction("getConfiguredProcesses").Execute += getConfiguredProcesses; - AddFunction("getConfiguredProcessesInMainMenu").Execute += getConfiguredProcessesInMainMenu; + AddFunction("getConfiguredProcessesInMainMenu").Execute += getConfiguredProcessesInMainMenu; AddFunction("startNewProcess").Execute += startNewProcess; AddFunction("openOrStartProcess").Execute += openOrStartProcess; AddFunction("isVirtualKeybConfigured").Execute += isVirtualKeybConfigured; @@ -72,12 +69,13 @@ namespace CMS_Client.Browser_Tools AddFunction("delPPFromJob").Execute += delPPFromJob; } - #endregion + #endregion CONSTRUCTOR_METHOD /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region FORM_BEHAVIOUR_METHODS - //Minimize Main Window + // Minimize Main Window public void minimizeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode @@ -86,16 +84,13 @@ namespace CMS_Client.Browser_Tools { mainForm.WindowState = FormWindowState.Minimized; }); - else { mainForm.WindowState = FormWindowState.Minimized; } } - - - //Maximize Main Window + // Maximize Main Window public void maximizeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode @@ -104,16 +99,13 @@ namespace CMS_Client.Browser_Tools { mainForm.WindowState = FormWindowState.Maximized; }); - else { mainForm.WindowState = FormWindowState.Maximized; } } - - - //Close Main Window + // Close Main Window public void closeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //If the mainform is disposed do nothing @@ -124,16 +116,17 @@ namespace CMS_Client.Browser_Tools mainForm.Close(); } - //Reload Broken Page + // Reload Broken Page private void reloadBrokenPage(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode mainForm.reloadBrokenPage(); } - #endregion + #endregion FORM_BEHAVIOUR_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region NC_BEHAVIOUR_METHODS public void setNcWindowState(object sender, CfrV8HandlerExecuteEventArgs e) @@ -161,23 +154,25 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(NcWindow.NcCapture); } - #endregion + #endregion NC_BEHAVIOUR_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region CHROMIUM_METHODS - //Get the Version of Chromium + // Get the Version of Chromium public void getChromiumVersion(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue(CfxRuntime.GetChromeVersion()); } - #endregion + #endregion CHROMIUM_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region STEP_METHODS - //Get the ID of STEP Client + // Get the ID of STEP Client public void getClientID(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue((int)Config.ConnectionConfig.Id); @@ -188,31 +183,31 @@ namespace CMS_Client.Browser_Tools NcWindow.ForceStepFocus(); } - //Get the option of virtual Keyb configured + // Get the option of virtual Keyb configured private void isVirtualKeybConfigured(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue((Boolean)Config.ClientConfig.ShowVirtualKeyboard); } - #endregion + + #endregion STEP_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region PROCESSES_METHODS - //Read all configured processes + // Read all configured processes public void getConfiguredProcesses(object sender, CfrV8HandlerExecuteEventArgs e) { - e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar==false))); - } + e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == false))); + } - //Read all configured processes in main menu + // Read all configured processes in main menu public void getConfiguredProcessesInMainMenu(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == true))); } - - - //Start a new process + // Start a new process public void startNewProcess(object sender, CfrV8HandlerExecuteEventArgs e) { if (e.Arguments.Count() == 0) @@ -222,9 +217,7 @@ namespace CMS_Client.Browser_Tools t.Start(e.Arguments[0].StringValue); } - - - //Open the last window or Start a new process + // Open the last window or Start a new process public void openOrStartProcess(object sender, CfrV8HandlerExecuteEventArgs e) { if (e.Arguments.Count() == 0) @@ -234,8 +227,7 @@ namespace CMS_Client.Browser_Tools t.Start(e.Arguments[0].StringValue); } - - //Function used in Thread + // Function used in Thread private void OpenStartNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); @@ -251,21 +243,21 @@ namespace CMS_Client.Browser_Tools } } - - //Function used in Thread + // Function used in Thread private void OpenNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); if (sft != null) Process.Start(sft.path, sft.arguments); } - #endregion + #endregion PROCESSES_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region FILESYSTEM_METHODS - //Read all drives in Operating System + // Read all drives in Operating System public void getOSdriveList(object sender, CfrV8HandlerExecuteEventArgs e) { List drivelist = new List(); @@ -290,8 +282,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(drivelist)); } - - //Read all files in directory + // Read all files in directory public void getFileList(object sender, CfrV8HandlerExecuteEventArgs e) { List filelist = new List(); @@ -312,7 +303,6 @@ namespace CMS_Client.Browser_Tools { foreach (String item in Directory.GetDirectories(p)) { - filelist.Add(new Models.File { Name = Path.GetFileName(item), @@ -320,7 +310,6 @@ namespace CMS_Client.Browser_Tools Path = Path.GetFullPath(item), IsDirectory = true }); - } } catch (Exception ex) @@ -338,7 +327,6 @@ namespace CMS_Client.Browser_Tools Path = Path.GetFullPath(item), IsDirectory = false }); - } } catch (Exception ex) @@ -348,8 +336,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(filelist)); } - - //Upload and activate the program + // Upload and activate the program public async void uploadAndActivateProgram(object sender, CfrV8HandlerExecuteEventArgs e) { String fileToUpload = ""; @@ -362,7 +349,7 @@ namespace CMS_Client.Browser_Tools //Check the arguments numbers if (e.Arguments.Length < 1 || e.Arguments[0] == null) { - e.SetReturnValue(Constants.Uploadpage +"INVALID_ARGUMENTS"); + e.SetReturnValue(Constants.Uploadpage + "INVALID_ARGUMENTS"); return; } @@ -370,7 +357,7 @@ namespace CMS_Client.Browser_Tools fileToUpload = e.Arguments[0].StringValue; if (!System.IO.File.Exists(fileToUpload)) { - e.SetReturnValue(Constants.Uploadpage+";FILE_NOT_FOUND"); + e.SetReturnValue(Constants.Uploadpage + ";FILE_NOT_FOUND"); return; } @@ -399,7 +386,7 @@ namespace CMS_Client.Browser_Tools //Add the content to the form form.Add(new ByteArrayContent(filecontent), "file", fileName); - if(imagecontent != null) + if (imagecontent != null) form.Add(new ByteArrayContent(imagecontent), "image", imageName); //Send them @@ -407,17 +394,16 @@ namespace CMS_Client.Browser_Tools "http://" + Config.ConnectionConfig.ServerUrl + ":" + Config.ConnectionConfig.ServerPort + "/" + Constants.Uploadpage, form).Result; //Wait the answer - if(response.StatusCode == System.Net.HttpStatusCode.BadRequest) + if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) e.SetReturnValue(Constants.Uploadpage + ";" + await response.Content.ReadAsStringAsync()); - else if(response.StatusCode != System.Net.HttpStatusCode.OK) + else if (response.StatusCode != System.Net.HttpStatusCode.OK) e.SetReturnValue(Constants.Uploadpage + ";" + response.ReasonPhrase); else e.SetReturnValue(""); } - } - //Upload and add to queue + // Upload and add to queue public async void uploadAndAddToQueue(object sender, CfrV8HandlerExecuteEventArgs e) { string fileToUpload = ""; @@ -488,11 +474,9 @@ namespace CMS_Client.Browser_Tools else e.SetReturnValue(""); } - } - - //Read info of a file + // Read info of a file public void getProgramInfo(object sender, CfrV8HandlerExecuteEventArgs e) { InfoFile file = new InfoFile(); @@ -523,7 +507,6 @@ namespace CMS_Client.Browser_Tools file.Content = new List(); try { - StreamReader fileRead = new StreamReader(p); while ((line = fileRead.ReadLine()) != null && counter < 10) { @@ -540,7 +523,6 @@ namespace CMS_Client.Browser_Tools break; } } - } catch (Exception ex) { @@ -549,8 +531,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(file)); } - - //Private functions... + // Private functions private String ElaborateName(String name, DriveType type) { if (!String.IsNullOrWhiteSpace(name)) @@ -565,7 +546,6 @@ namespace CMS_Client.Browser_Tools } return "Undefined Drive"; } - } private String ElaborateType(DriveType type) @@ -577,15 +557,15 @@ namespace CMS_Client.Browser_Tools case DriveType.Network: return "NTW"; } return "SPFO"; - } - #endregion + #endregion FILESYSTEM_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region JOB_METHODS - - //Read all job + + // Read all job public void openJob(object sender, CfrV8HandlerExecuteEventArgs e) { JobToStep job = new JobToStep(); @@ -602,14 +582,13 @@ namespace CMS_Client.Browser_Tools using (ZipArchive archive = ZipFile.OpenRead(jobOpenFileDialog.FileName)) { - - //Setup main Fields + // Setup main Fields job.Name = Path.GetFileName(jobOpenFileDialog.FileName); job.LastEditTimestamp = new FileInfo(jobOpenFileDialog.FileName).LastAccessTime; foreach (ZipArchiveEntry entry in archive.Entries) { - //Main program + // Main program if (entry.Name.Equals(JOB_MAIN_FILENAME, StringComparison.OrdinalIgnoreCase)) { using (var reader = new StreamReader(entry.Open())) @@ -617,7 +596,7 @@ namespace CMS_Client.Browser_Tools job.IsoMainProgram = (reader.ReadToEnd()); } } - //Add all images + // Add all images else if (_validImages.Contains(Path.GetExtension(entry.Name).ToLower())) { var bytes = default(byte[]); @@ -627,21 +606,21 @@ namespace CMS_Client.Browser_Tools entry.Open().CopyTo(memstream); bytes = memstream.ToArray(); job.Metadata.Generics.Images.Add(new Image_param() - { - Name = Path.GetFileNameWithoutExtension(entry.Name), - Base64 = "data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes) - }); + { + Name = Path.GetFileNameWithoutExtension(entry.Name), + Base64 = "data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes) + }); } } - //Metadata - else if(entry.Name.Equals(JOB_METADATA_FILENAME, StringComparison.OrdinalIgnoreCase)) + // Metadata + else if (entry.Name.Equals(JOB_METADATA_FILENAME, StringComparison.OrdinalIgnoreCase)) { MetadataToFile metasFromFile = new MetadataToFile(); using (var reader = new StreamReader(entry.Open())) { metasFromFile = JsonConvert.DeserializeObject(reader.ReadToEnd()); - if(metasFromFile == null) + if (metasFromFile == null) { e.SetReturnValue(null); return; @@ -661,7 +640,6 @@ namespace CMS_Client.Browser_Tools entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); } } - } e.SetReturnValue(JsonConvert.SerializeObject(job)); return; @@ -673,9 +651,7 @@ namespace CMS_Client.Browser_Tools } } - - - //Save all job + // Save all job public void saveJob(object sender, CfrV8HandlerExecuteEventArgs e) { MetadataToFile metafile = new MetadataToFile(); @@ -687,7 +663,7 @@ namespace CMS_Client.Browser_Tools //Call Save Dialog SaveFileDialog jobSaveFileDialog = new SaveFileDialog(); jobSaveFileDialog.Filter = "CMS Job Files(*.JOB)|*.job|Zip Files(*.ZIP)|*.zip"; - if(jobSaveFileDialog.ShowDialog() == DialogResult.OK) + if (jobSaveFileDialog.ShowDialog() == DialogResult.OK) { // Job deserialize JobToStep job = JsonConvert.DeserializeObject(e.Arguments[0].StringValue); @@ -696,7 +672,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("corrupted_model"))); return; } - + //Metadata metafile.Description = job.Metadata.Generics.Description; metafile.ExecutionTime = job.Metadata.Generics.ExecutionTime; @@ -715,18 +691,15 @@ namespace CMS_Client.Browser_Tools //delete Zip File if exists if (System.IO.File.Exists(jobSaveFileDialog.FileName)) System.IO.File.Delete(jobSaveFileDialog.FileName); - + //Create Zip File ZipFile.CreateFromDirectory(JOB_OPENING_PATH, jobSaveFileDialog.FileName); - } e.SetReturnValue(null); return; } - - - //Add an image + // Add an image public void addImageToJob(object sender, CfrV8HandlerExecuteEventArgs e) { OpenFileDialog imageOpenFileDialog = new OpenFileDialog(); @@ -742,25 +715,23 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("file_esists"))); return; } - + //Copy the file System.IO.File.Copy(imageOpenFileDialog.FileName, newImagePath); //Send to Step e.SetReturnValue(JsonConvert.SerializeObject(new Image_param() - { - Name = Path.GetFileNameWithoutExtension(imageOpenFileDialog.FileName), - Base64 = "data:image/" + Path.GetExtension(newImagePath).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(System.IO.File.ReadAllBytes(newImagePath)) - })); + { + Name = Path.GetFileNameWithoutExtension(imageOpenFileDialog.FileName), + Base64 = "data:image/" + Path.GetExtension(newImagePath).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(System.IO.File.ReadAllBytes(newImagePath)) + })); return; } e.SetReturnValue(null); return; } - - - //Delete an image + // Delete an image public void delImageFromJob(object sender, CfrV8HandlerExecuteEventArgs e) { //check the arguments @@ -781,12 +752,10 @@ namespace CMS_Client.Browser_Tools System.IO.File.Delete(imagePath); e.SetReturnValue(null); - return; + return; } - - - //Add a Part-Program + // Add a Part-Program public void addPPToJob(object sender, CfrV8HandlerExecuteEventArgs e) { OpenFileDialog PPOpenFileDialog = new OpenFileDialog(); @@ -815,15 +784,12 @@ namespace CMS_Client.Browser_Tools //Send to Step e.SetReturnValue(null); return; - } e.SetReturnValue(null); return; } - - - //Delete an image + // Delete an image public void delPPFromJob(object sender, CfrV8HandlerExecuteEventArgs e) { //check the arguments @@ -845,10 +811,9 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(null); return; - } + } - - //Clear the temp folder files + // Clear the temp folder files private void ClearTempPath() { DirectoryInfo di = new DirectoryInfo(JOB_OPENING_PATH); @@ -858,20 +823,19 @@ namespace CMS_Client.Browser_Tools dir.Delete(true); } - - //Clear the temp folder files + // Clear the temp folder files private string GetExtensionFromBase64(string base64img) { - base64img = base64img.Remove(0,"data:image/".Length); + base64img = base64img.Remove(0, "data:image/".Length); return base64img.Substring(0, base64img.IndexOf(";base64,")); } - //Clear the temp folder files private string GetContentFromBase64(string base64img) { return base64img.Substring(base64img.IndexOf(";base64,") + ";base64,".Length); } - #endregion + + #endregion JOB_METHODS } -} +} \ No newline at end of file diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index b903a8c06f4cf256b10e63a12399031f0beb40b4..87bda1114ebbf0b69f21beace685436defacca05 100644 GIT binary patch delta 61157 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ℑp}2?_zca^oy+QI^HYB)dT{;^53R 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 p!~a@f-O99H4L9ShxYcQA=Enx@czR9R!@z* x.Id == id && x.Process == processId).FirstOrDefault(); + // Update reps + item.Reps = reps; + item.RemainingReps = reps; + + dbCtx.SaveChanges(); + } + + public void DeleteItem(int processId, int id) + { + QueueItemsModel item = dbCtx.Queue.Where(x => x.Id == id && x.Process == processId).FirstOrDefault(); + + dbCtx.Queue.Remove(item); + + dbCtx.SaveChanges(); + } + public void ReadAndPopulateQueue() { var dbQueue = dbCtx.Queue.ToList(); - + bool foundData = false; foreach(var entity in dbQueue) { // Check if process queue exists @@ -73,7 +92,13 @@ namespace Step.Database.Controllers Status = (QUEUE_ITEM_STATUS)entity.Status }); - if((QUEUE_ITEM_STATUS)entity.Status == QUEUE_ITEM_STATUS.RUNNING) + if ((QUEUE_ITEM_STATUS)entity.Status != QUEUE_ITEM_STATUS.FINISHED && !foundData) + { + QueueRunningIndexes[entity.Process] = entity.Id - 1; + foundData = true; + } + + if ((QUEUE_ITEM_STATUS)entity.Status == QUEUE_ITEM_STATUS.RUNNING) QueueRunningIndexes[entity.Process] = entity.Id - 1; } } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 882ce641..838d69aa 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -307,7 +307,7 @@ namespace Step.NC // Check if queue exists for the process if (PartProgramQueue.ContainsKey(item.ProcessId) && PartProgramQueue[item.ProcessId].ElementAtOrDefault(QueueRunningIndexes[item.ProcessId]) != null) { - // Set status + // Set status based on queue status if (item.Status == QUEUE_STATUS.RUNNING || item.Status == QUEUE_STATUS.CLOSING) PartProgramQueue[item.ProcessId][QueueRunningIndexes[item.ProcessId]].Status = QUEUE_ITEM_STATUS.RUNNING; @@ -318,6 +318,11 @@ namespace Step.NC PartProgramQueue[item.ProcessId][QueueRunningIndexes[item.ProcessId]].Status = QUEUE_ITEM_STATUS.WAITING_OPERATOR; } } + // Update data + using (QueueController queueController = new QueueController()) + { + queueController.UpdateQueue(); + } return NO_ERROR; } @@ -342,33 +347,33 @@ namespace Step.NC return NO_ERROR; } - public CmsError SwapQueueItems(int processId, int item1Index, int item2Index) - { - item1Index = item1Index - 1; - item2Index = item2Index - 1; + //public CmsError SwapQueueItems(int processId, int item1Index, int item2Index) + //{ + // item1Index = item1Index - 1; + // item2Index = item2Index - 1; - // Check if there is a queue - if (!PartProgramQueue.ContainsKey(processId)) - return INCORRECT_PARAMETERS_ERROR; - // Check if items exists - if (PartProgramQueue[processId].ElementAtOrDefault(item1Index) == null || PartProgramQueue[processId].ElementAtOrDefault(item2Index) == null) - return INCORRECT_PARAMETERS_ERROR; + // // Check if there is a queue + // if (!PartProgramQueue.ContainsKey(processId)) + // return INCORRECT_PARAMETERS_ERROR; + // // Check if items exists + // if (PartProgramQueue[processId].ElementAtOrDefault(item1Index) == null || PartProgramQueue[processId].ElementAtOrDefault(item2Index) == null) + // return INCORRECT_PARAMETERS_ERROR; - // Create a item - DTOQueueModel tmp = PartProgramQueue[processId][item1Index]; + // // Create a item + // DTOQueueModel tmp = PartProgramQueue[processId][item1Index]; - // Swap item 1 with 2 - PartProgramQueue[processId][item1Index] = PartProgramQueue[processId][item2Index]; - // Swap 2 with tmp - PartProgramQueue[processId][item2Index] = tmp; + // // Swap item 1 with 2 + // PartProgramQueue[processId][item1Index] = PartProgramQueue[processId][item2Index]; + // // Swap 2 with tmp + // PartProgramQueue[processId][item2Index] = tmp; - // Swap ids - PartProgramQueue[processId][item2Index].Id = item2Index + 1; - // Swap 2 with tmp - PartProgramQueue[processId][item1Index].Id = item1Index + 1; + // // Swap ids + // PartProgramQueue[processId][item2Index].Id = item2Index + 1; + // // Swap 2 with tmp + // PartProgramQueue[processId][item1Index].Id = item1Index + 1; - return NO_ERROR; - } + // return NO_ERROR; + //} public CmsError MoveQueueItems(int processId, int itemId, int newIndex, out List queue) { @@ -402,9 +407,7 @@ namespace Step.NC queue = PartProgramQueue[processId]; using (QueueController queueController = new QueueController()) - { queueController.UpdateQueue(); - } return NO_ERROR; } @@ -428,6 +431,10 @@ namespace Step.NC model = PartProgramQueue[processId][itemIndex]; + // Update database + using (QueueController queueController = new QueueController()) + queueController.UpdateReps(processId, itemIndex, reps); + return NO_ERROR; } @@ -444,6 +451,10 @@ namespace Step.NC if (tmpQueueItem != null) PartProgramQueue[processId].Remove(tmpQueueItem); } + + // Update db + using (QueueController queueController = new QueueController()) + queueController.DeleteItem(processId, id); return NO_ERROR; } @@ -452,9 +463,11 @@ namespace Step.NC { // Check if there is a queue if (PartProgramQueue.ContainsKey(processId)) - { PartProgramQueue[processId] = new List(); - } + + // Update db + using (QueueController queueController = new QueueController()) + queueController.UpdateQueue(); return NO_ERROR; } @@ -1259,6 +1272,7 @@ namespace Step.NC { config.MultitoolOptionActive = false; categories.Add("shankType"); + config.ToolsConfiguration = config.ToolsConfiguration.Where(x => !(x.Name == "shankId")).ToList(); } if (!ToolManagerConfig.FamilyOpt) @@ -1736,7 +1750,7 @@ namespace Step.NC return cmsError; } - // Update tool + // R tool cmsError = UpdateNcTools(toolsManager); } } From 580748c69b5805fd048690cb5413c20610520308 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Wed, 19 Sep 2018 12:21:29 +0200 Subject: [PATCH 45/52] fix --- .../cards/card-job-production.vue | 16 ++++++++++++---- Step/wwwroot/src/services/fileService.ts | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue index 0be0f2f8..0517542a 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue @@ -99,6 +99,13 @@ export default { return this.$store.state.process.startStopQueueEnabled; } }, + watch: { + queueStatus: function(n, o) { + if(n != o){ + this.queueStatus = n; + } + } + }, methods: { selectTab(tab) { if (tab == "IsoLines") { @@ -122,20 +129,21 @@ export default { debugger await new FileService().startQueue(this.selectedProcess); if(this.queueStatus == 0){ - this.startStopQueue = true; + this.startStopQueue = false; } else{ - this.startStopQueue = false; + this.startStopQueue = true; } }, async stopQueue(){ + debugger await new FileService().stopQueue(this.selectedProcess); if(this.queueStatus == 0){ - this.startStopQueue = false; + this.startStopQueue = true; } else{ - this.startStopQueue = true; + this.startStopQueue = false; } } } diff --git a/Step/wwwroot/src/services/fileService.ts b/Step/wwwroot/src/services/fileService.ts index 34af928e..7fdec2d1 100644 --- a/Step/wwwroot/src/services/fileService.ts +++ b/Step/wwwroot/src/services/fileService.ts @@ -43,7 +43,7 @@ export class FileService extends baseRestService { async moveItemsQueue(processId, itemsPositions, model){ var result = await this.Put(this.BASE_URL + "queue/" + processId + "/move", itemsPositions, true); - productionActions.movePartPrograms(store,model); + productionActions.movePartPrograms(store,result); return result; } From ffb69c979ba67b92d769933dac1c868652a3d9c6 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Wed, 19 Sep 2018 14:33:40 +0200 Subject: [PATCH 46/52] fix change reps --- .../cards/card-element-queue.vue | 6 ++-- .../cards/card-queue-production.vue | 32 ++++++++++--------- Step/wwwroot/src/services/fileService.ts | 2 ++ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue index b942ecfa..6980b247 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-element-queue.vue @@ -29,8 +29,7 @@ export default { number: { default: 2}, remainingReps: {default: 0}, status: { default: 0}, - selectedProcess: { default: 0}, - idPartProgram: {default: 0} + selectedProcess: { default: 0} }, data: function(){ return{ @@ -51,8 +50,7 @@ export default { }, clickReps: function(){ debugger - this.enablePopup = true; - this.$emit("position", this.$el, this.enablePopup, true); + this.$emit("position", this.$el, true); } // close(){ // this.enablePopup = false; diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index 599dae41..a211d8d8 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -28,20 +28,20 @@
- +
+ + +
+ + +
+
+ +
+
- - -
- - -
-
- -
-
@@ -49,7 +49,6 @@ export default { this.$emit("click"); }, clickReps: function(){ - debugger this.$emit("position", this.$el, true); } // close(){ diff --git a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue index 0517542a..6e3b90f7 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue @@ -126,7 +126,6 @@ export default { await fileService.deactivateProgram(); }, async startQueue(){ - debugger await new FileService().startQueue(this.selectedProcess); if(this.queueStatus == 0){ this.startStopQueue = false; @@ -137,7 +136,6 @@ export default { }, async stopQueue(){ - debugger await new FileService().stopQueue(this.selectedProcess); if(this.queueStatus == 0){ this.startStopQueue = true; diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index a211d8d8..feb9ae9c 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -62,6 +62,8 @@ import cardElementQueue from "./card-element-queue.vue"; import {ModalHelper} from "src/modules/base-components"; import modalAddElementQueue from "src/modules/base-components/modal-add-element-queue.vue" import { FileService } from '../../../services/fileService'; +import { productionActions } from "src/store/production.store"; +import { store, AppModel } from "src/store"; import { Container, Draggable, } from "vue-smooth-dnd"; export default { components:{ @@ -109,7 +111,9 @@ export default { await new FileService().deleteQueue(id); }, async deleteItemQueue(processId, item){ - await new FileService().deleteItemQueue(processId, item); + await new FileService().deleteItemQueue(processId, item).then(function(){ + productionActions.deletePartProgram(store,item); + }); }, onDrag({ isSource, payload, willAcceptDrop }) { this.enablePopup = false; @@ -129,7 +133,6 @@ export default { this.draggingPosition = null; }, async changePosition(event){ - debugger var response = false; if(event.payload && event.payload.status != 1 && event.payload.status != 3 && event.addedIndex != event.removedIndex){ this.draggingIn = false; @@ -150,7 +153,6 @@ export default { return this.partPrograms[index]; }, positionBoxReps(arg1, id, reps){ - debugger this.numberReps = reps; this.idPartProgram = id; this.selectedPositionTop = (arg1.offsetTop + 78); diff --git a/Step/wwwroot/src/services/fileService.ts b/Step/wwwroot/src/services/fileService.ts index 435e2af8..c12bd5e7 100644 --- a/Step/wwwroot/src/services/fileService.ts +++ b/Step/wwwroot/src/services/fileService.ts @@ -36,13 +36,12 @@ export class FileService extends baseRestService { } async deleteItemQueue(processId, model){ + debugger var result = await this.Delete(this.BASE_URL + "queue/" + processId + "/remove/" + model.id, true); - productionActions.deletePartProgram(store,model); return result; } async moveItemsQueue(processId, itemsPositions, model){ - debugger var result = await this.Put(this.BASE_URL + "queue/" + processId + "/move", itemsPositions, true); productionActions.movePartPrograms(store,result); return result; @@ -59,7 +58,6 @@ export class FileService extends baseRestService { } async changeReps(processId,id,reps){ - debugger var result = await this.Put(this.BASE_URL + "queue/" + processId + "/edit/" + id, {reps: reps}); productionActions.updatePartPrograms(store, result); return result; From d2d532cd18812b8c9cd450500f30d3ca680021d8 Mon Sep 17 00:00:00 2001 From: Nicola Carminati Date: Wed, 19 Sep 2018 16:27:26 +0200 Subject: [PATCH 48/52] Fix tooling-equipment names --- .../components/tooling/tooling-equipment.ts | 41 ++++++++++++------- .../components/tooling/tooling-equipment.vue | 2 +- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Step/wwwroot/src/components/tooling/tooling-equipment.ts b/Step/wwwroot/src/components/tooling/tooling-equipment.ts index 5685f260..90a60e3f 100644 --- a/Step/wwwroot/src/components/tooling/tooling-equipment.ts +++ b/Step/wwwroot/src/components/tooling/tooling-equipment.ts @@ -21,6 +21,10 @@ export default class toolingEquipment extends Vue { public get magazineStatusModel(): server.MagazineStatus { return (this.$store.state as AppModel).depot.magazineStatusModel; } + + public get familyOptionActive(): boolean { + return (this.$store.state as AppModel).tooling.familyOptionActive; + } public get tools(): server.Tool[] { return (this.$store.state as AppModel).tooling.tools; } public get ncTools(): server.ToolNc[] { return (this.$store.state as AppModel).tooling.ncTools; } @@ -88,12 +92,20 @@ export default class toolingEquipment extends Vue { return (this.$store.state as AppModel).tooling.ncFamilies; } - public familyNameFromId(id): any{ - if (((this.$store.state as AppModel).tooling.ncFamilies)[id]) - return ((this.$store.state as AppModel).tooling.ncFamilies)[id].name; + public familyNameFromId(id): any{ + var found = (this.$store.state as AppModel).tooling.ncFamilies.find(k => k.id == id); + if(found) + return found.name; return ''; } + public calcFamilyName(id): any{ + if(this.familyOptionActive) + return this.$options.filters.localize("tooling_family_abbreviation", 'F%d',id) + ' - ' + this.familyNameFromId(id); + else + return this.familyNameFromId(id); + } + public get categoriesEdge(): string[] { @@ -181,8 +193,6 @@ export default class toolingEquipment extends Vue { this.$nextTick(() => this.scrollList(this.ncTools.indexOf(ncTool))); } } - - } this.modalBlockMagazine(); } @@ -531,15 +541,18 @@ export default class toolingEquipment extends Vue { })); } else{ - awaiter(new ToolingService().SetNcTool(item).then(response => { - this.selectedTool = response; - let htmlelement = this.$refs.toolList as any; - htmlelement.scrollTop = htmlelement.scrollHeight; - - this.toolsConfiguration = (this.$store.state as AppModel).tooling.toolsConfiguration; - this.edgeConfiguration = (this.$store.state as AppModel).tooling.edgesConfiguration; - this.disableList = false; - this.enableModify = false; + await awaiter(new ToolingService().SetNcTool(item).then(response => { + new ToolingService().GetNcFamilies().then(response => { + this.selectedTool = response; + let htmlelement = this.$refs.toolList as any; + htmlelement.scrollTop = htmlelement.scrollHeight; + + this.toolsConfiguration = (this.$store.state as AppModel).tooling.toolsConfiguration; + this.edgeConfiguration = (this.$store.state as AppModel).tooling.edgesConfiguration; + this.disableList = false; + this.enableModify = false; + }); + })); } diff --git a/Step/wwwroot/src/components/tooling/tooling-equipment.vue b/Step/wwwroot/src/components/tooling/tooling-equipment.vue index 6e23262b..13e31f96 100644 --- a/Step/wwwroot/src/components/tooling/tooling-equipment.vue +++ b/Step/wwwroot/src/components/tooling/tooling-equipment.vue @@ -31,7 +31,7 @@
From 9653abacda0264acd78fa8bfc7d569e6e0c1a267 Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Wed, 19 Sep 2018 16:46:44 +0200 Subject: [PATCH 49/52] Added value to custom job fields, added is job Fixed queue --- Client/Browser_Tools/BrowserJSObject.cs | 30 +++++++++----- Client/Browser_Tools/Models/File.cs | 9 ++-- .../{Custom_Param.cs => CustomParam.cs} | 41 ++++++++++--------- .../{Generic_Params.cs => GenericsParam.cs} | 40 +++++++++--------- .../{Image_param.cs => ImageParam.cs} | 28 ++++++------- Client/Browser_Tools/Models/Metadata/Metas.cs | 8 ++-- Client/Browser_Tools/Models/MetadataToFile.cs | 4 +- Client/Client.csproj | 6 +-- Step.Config/Config/toolManagerConfig.xml | 2 +- Step.Database/Controllers/QueueController.cs | 9 ++++ Step.NC/NcHandler.cs | 15 +++---- Step/Controllers/WebApi/NcFileController.cs | 4 +- 12 files changed, 109 insertions(+), 87 deletions(-) rename Client/Browser_Tools/Models/Metadata/{Custom_Param.cs => CustomParam.cs} (80%) rename Client/Browser_Tools/Models/Metadata/{Generic_Params.cs => GenericsParam.cs} (62%) rename Client/Browser_Tools/Models/Metadata/{Image_param.cs => ImageParam.cs} (85%) diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index ccbe27ac..dcaeba59 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -320,13 +320,17 @@ namespace CMS_Client.Browser_Tools foreach (String item in Directory.GetFiles(p)) { if (_validExtensions.Contains(Path.GetExtension(item).ToLower())) + { + bool isJob = Path.GetExtension(item) == "job"; filelist.Add(new Models.File { Name = Path.GetFileName(item), AbsolutePath = Path.GetFullPath(item), Path = Path.GetFullPath(item), - IsDirectory = false + IsDirectory = false, + IsJob = isJob }); + } } } catch (Exception ex) @@ -565,13 +569,15 @@ namespace CMS_Client.Browser_Tools #region JOB_METHODS - // Read all job + // Read job data public void openJob(object sender, CfrV8HandlerExecuteEventArgs e) { JobToStep job = new JobToStep(); - OpenFileDialog jobOpenFileDialog = new OpenFileDialog(); - jobOpenFileDialog.Filter = "CMS Job Files(*.JOB,*.ZIP)|*.job;*.zip"; - jobOpenFileDialog.Multiselect = false; + OpenFileDialog jobOpenFileDialog = new OpenFileDialog + { + Filter = "CMS Job Files(*.JOB,*.ZIP)|*.job;*.zip", + Multiselect = false + }; if (jobOpenFileDialog.ShowDialog() == DialogResult.OK) { @@ -588,7 +594,7 @@ namespace CMS_Client.Browser_Tools foreach (ZipArchiveEntry entry in archive.Entries) { - // Main program + // Get main program content if (entry.Name.Equals(JOB_MAIN_FILENAME, StringComparison.OrdinalIgnoreCase)) { using (var reader = new StreamReader(entry.Open())) @@ -605,7 +611,7 @@ namespace CMS_Client.Browser_Tools { entry.Open().CopyTo(memstream); bytes = memstream.ToArray(); - job.Metadata.Generics.Images.Add(new Image_param() + job.Metadata.Generics.Images.Add(new ImageParam() { Name = Path.GetFileNameWithoutExtension(entry.Name), Base64 = "data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes) @@ -634,7 +640,7 @@ namespace CMS_Client.Browser_Tools } } } - //All other files + // All other files else { entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); @@ -680,8 +686,10 @@ namespace CMS_Client.Browser_Tools metafile.Customs = job.Metadata.Customs; using (StreamWriter file = System.IO.File.CreateText(JOB_OPENING_PATH + JOB_METADATA_FILENAME)) { - JsonSerializer serializer = new JsonSerializer(); - serializer.Formatting = Formatting.Indented; + JsonSerializer serializer = new JsonSerializer + { + Formatting = Formatting.Indented + }; serializer.Serialize(file, metafile); } @@ -720,7 +728,7 @@ namespace CMS_Client.Browser_Tools System.IO.File.Copy(imageOpenFileDialog.FileName, newImagePath); //Send to Step - e.SetReturnValue(JsonConvert.SerializeObject(new Image_param() + e.SetReturnValue(JsonConvert.SerializeObject(new ImageParam() { Name = Path.GetFileNameWithoutExtension(imageOpenFileDialog.FileName), Base64 = "data:image/" + Path.GetExtension(newImagePath).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(System.IO.File.ReadAllBytes(newImagePath)) diff --git a/Client/Browser_Tools/Models/File.cs b/Client/Browser_Tools/Models/File.cs index 2bb3236c..4710cdb0 100644 --- a/Client/Browser_Tools/Models/File.cs +++ b/Client/Browser_Tools/Models/File.cs @@ -8,9 +8,10 @@ namespace CMS_Client.Browser_Tools.Models { public class File { - public String Name; - public String AbsolutePath; - public String Path; - public Boolean IsDirectory; + public string Name; + public string AbsolutePath; + public string Path; + public bool IsDirectory; + public bool IsJob; } } diff --git a/Client/Browser_Tools/Models/Metadata/Custom_Param.cs b/Client/Browser_Tools/Models/Metadata/CustomParam.cs similarity index 80% rename from Client/Browser_Tools/Models/Metadata/Custom_Param.cs rename to Client/Browser_Tools/Models/Metadata/CustomParam.cs index 8ba0f1f2..c1fa013d 100644 --- a/Client/Browser_Tools/Models/Metadata/Custom_Param.cs +++ b/Client/Browser_Tools/Models/Metadata/CustomParam.cs @@ -1,20 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CMS_Client.Browser_Tools.Models.Metadata -{ - public class Custom_Param - { - public string Name; - public string Type; - public List SelectionList; - - public Custom_Param() - { - SelectionList = new List(); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class CustomParam + { + public string Name; + public string Type; + public List SelectionList; + public int Value; + + public CustomParam() + { + SelectionList = new List(); + } + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Generic_Params.cs b/Client/Browser_Tools/Models/Metadata/GenericsParam.cs similarity index 62% rename from Client/Browser_Tools/Models/Metadata/Generic_Params.cs rename to Client/Browser_Tools/Models/Metadata/GenericsParam.cs index 1478b9bb..6484626c 100644 --- a/Client/Browser_Tools/Models/Metadata/Generic_Params.cs +++ b/Client/Browser_Tools/Models/Metadata/GenericsParam.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CMS_Client.Browser_Tools.Models.Metadata -{ - public class Generic_Params - { - public List Images; - public string Description; - public TimeSpan ExecutionTime; - - public Generic_Params() - { - Images = new List(); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class GenericsParam + { + public List Images; + public string Description; + public TimeSpan ExecutionTime; + + public GenericsParam() + { + Images = new List(); + } + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Image_param.cs b/Client/Browser_Tools/Models/Metadata/ImageParam.cs similarity index 85% rename from Client/Browser_Tools/Models/Metadata/Image_param.cs rename to Client/Browser_Tools/Models/Metadata/ImageParam.cs index 01a4fcb6..a91005e8 100644 --- a/Client/Browser_Tools/Models/Metadata/Image_param.cs +++ b/Client/Browser_Tools/Models/Metadata/ImageParam.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CMS_Client.Browser_Tools.Models.Metadata -{ - public class Image_param - { - public string Name; - public string Base64; - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CMS_Client.Browser_Tools.Models.Metadata +{ + public class ImageParam + { + public string Name; + public string Base64; + } +} diff --git a/Client/Browser_Tools/Models/Metadata/Metas.cs b/Client/Browser_Tools/Models/Metadata/Metas.cs index 4d2356dc..3f07a344 100644 --- a/Client/Browser_Tools/Models/Metadata/Metas.cs +++ b/Client/Browser_Tools/Models/Metadata/Metas.cs @@ -8,15 +8,15 @@ namespace CMS_Client.Browser_Tools.Models.Metadata { public class Metas { - public Generic_Params Generics; + public GenericsParam Generics; public List Tools; - public List Customs; + public List Customs; public Metas() { - Generics = new Generic_Params(); + Generics = new GenericsParam(); Tools = new List(); - Customs = new List(); + Customs = new List(); } } } diff --git a/Client/Browser_Tools/Models/MetadataToFile.cs b/Client/Browser_Tools/Models/MetadataToFile.cs index 94c5d338..d17d5706 100644 --- a/Client/Browser_Tools/Models/MetadataToFile.cs +++ b/Client/Browser_Tools/Models/MetadataToFile.cs @@ -12,12 +12,12 @@ namespace CMS_Client.Browser_Tools.Models public string Description; public TimeSpan ExecutionTime; public List Tools; - public List Customs; + public List Customs; public MetadataToFile() { Tools = new List(); - Customs = new List(); + Customs = new List(); } } } diff --git a/Client/Client.csproj b/Client/Client.csproj index 877ac70e..e9b071e2 100644 --- a/Client/Client.csproj +++ b/Client/Client.csproj @@ -158,9 +158,9 @@ - - - + + + diff --git a/Step.Config/Config/toolManagerConfig.xml b/Step.Config/Config/toolManagerConfig.xml index cd5ac029..97c13789 100644 --- a/Step.Config/Config/toolManagerConfig.xml +++ b/Step.Config/Config/toolManagerConfig.xml @@ -4,7 +4,7 @@ false false true - true + false true true true diff --git a/Step.Database/Controllers/QueueController.cs b/Step.Database/Controllers/QueueController.cs index 98b49fae..dc0c9d9e 100644 --- a/Step.Database/Controllers/QueueController.cs +++ b/Step.Database/Controllers/QueueController.cs @@ -102,5 +102,14 @@ namespace Step.Database.Controllers QueueRunningIndexes[entity.Process] = entity.Id - 1; } } + + public void UpdateQueueIdsAndSave(int processId) + { + // Fix new ids + for (int i = 0; i < PartProgramQueue[processId].Count(); i++) + PartProgramQueue[processId][i].Id = i + 1; + + UpdateQueue(); + } } } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 838d69aa..04180c34 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -400,15 +400,15 @@ namespace Step.NC // Add in the new position PartProgramQueue[processId].Insert(newIndex, item); - // Insert new ids + // Fix new ids for (int i = 0; i < PartProgramQueue[processId].Count(); i++) PartProgramQueue[processId][i].Id = i + 1; + + using (QueueController queueController = new QueueController()) + queueController.UpdateQueueIdsAndSave(processId); queue = PartProgramQueue[processId]; - using (QueueController queueController = new QueueController()) - queueController.UpdateQueue(); - return NO_ERROR; } @@ -451,10 +451,11 @@ namespace Step.NC if (tmpQueueItem != null) PartProgramQueue[processId].Remove(tmpQueueItem); } - - // Update db + + // Update database data using (QueueController queueController = new QueueController()) - queueController.DeleteItem(processId, id); + queueController.UpdateQueueIdsAndSave(processId); + return NO_ERROR; } diff --git a/Step/Controllers/WebApi/NcFileController.cs b/Step/Controllers/WebApi/NcFileController.cs index 7e6f38a4..e96cba39 100644 --- a/Step/Controllers/WebApi/NcFileController.cs +++ b/Step/Controllers/WebApi/NcFileController.cs @@ -227,7 +227,6 @@ namespace Step.Controllers.WebApi CmsError cmsError = ncHandler.MoveQueueItems(processId, itemsPositions.ObjectId, itemsPositions.NewPosition, out List queue); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - return Ok(queue); } @@ -238,6 +237,9 @@ namespace Step.Controllers.WebApi { using (NcHandler ncHandler = new NcHandler()) { + if (reps.Reps < 1) + return BadRequest(INCORRECT_PARAMETERS_ERROR.localizationKey); + CmsError cmsError = ncHandler.EditQueueItemReps(processId, itemId, reps.Reps, out DTOQueueModel queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); From ef86b8f266f4bdbf4dfdaa777dd27e80db882cdd Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Thu, 20 Sep 2018 07:58:58 +0200 Subject: [PATCH 50/52] fix start stop --- .../cards/card-job-production.vue | 27 ++++++++++++++----- .../cards/card-queue-production.vue | 5 ++-- Step/wwwroot/src/services/fileService.ts | 1 + 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue index 6e3b90f7..e857cc3a 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-job-production.vue @@ -67,6 +67,26 @@ export default { startStopQueue: false, }; }, + mounted: function(){ + if(this.queueStatus == 0){ + this.startStopQueue = true; + } + else{ + this.startStopQueue = false; + } + }, + watch: { + queueStatus: function(n,o){ + if(n){ + if(n == 0){ + this.startStopQueue = true; + } + else{ + this.startStopQueue = false; + } + } + } + }, computed: { selectedProcess: function() { return this.$store.state.process.selectedProcess; @@ -99,13 +119,6 @@ export default { return this.$store.state.process.startStopQueueEnabled; } }, - watch: { - queueStatus: function(n, o) { - if(n != o){ - this.queueStatus = n; - } - } - }, methods: { selectTab(tab) { if (tab == "IsoLines") { diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index feb9ae9c..d2c26d1c 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -111,9 +111,8 @@ export default { await new FileService().deleteQueue(id); }, async deleteItemQueue(processId, item){ - await new FileService().deleteItemQueue(processId, item).then(function(){ - productionActions.deletePartProgram(store,item); - }); + debugger + await new FileService().deleteItemQueue(processId, item); }, onDrag({ isSource, payload, willAcceptDrop }) { this.enablePopup = false; diff --git a/Step/wwwroot/src/services/fileService.ts b/Step/wwwroot/src/services/fileService.ts index c12bd5e7..4b73a54e 100644 --- a/Step/wwwroot/src/services/fileService.ts +++ b/Step/wwwroot/src/services/fileService.ts @@ -38,6 +38,7 @@ export class FileService extends baseRestService { async deleteItemQueue(processId, model){ debugger var result = await this.Delete(this.BASE_URL + "queue/" + processId + "/remove/" + model.id, true); + productionActions.deletePartProgram(store,model); return result; } From f376ba16d0732cbc42e88e7d6e95a66ce4cc3eb1 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Thu, 20 Sep 2018 08:22:15 +0200 Subject: [PATCH 51/52] fix delete element disappears list --- Step/wwwroot/src/store/production.store.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Step/wwwroot/src/store/production.store.ts b/Step/wwwroot/src/store/production.store.ts index f5b50584..6af16963 100644 --- a/Step/wwwroot/src/store/production.store.ts +++ b/Step/wwwroot/src/store/production.store.ts @@ -26,12 +26,13 @@ export const productionStore = { store.partProgram = []; }, DeletePartProgram(store, model:server.PartProgramModel) { - // let idx = store.partProgram.indexOf(model); - // if(store.partProgram[idx].id == model.id){ - // store.partProgram.splice(idx,1); - // } - store._partProgram.delete(model.id); - store.partProgram = Array.from(store._partProgram.values()); + debugger + let idx = store.partProgram.indexOf(model); + if(store.partProgram[idx] && model && store.partProgram[idx].id == model.id){ + store.partProgram.splice(idx,1); + } + // store._partProgram.delete(model.id); + // store.partProgram = Array.from(store._partProgram.values()); }, MovePartPrograms(store, model:server.PartProgramModel[]) { store.partProgram = model; From da92349e0de587ff289b10ddc22cd6e04334f238 Mon Sep 17 00:00:00 2001 From: Alessandro Francia Date: Thu, 20 Sep 2018 09:23:39 +0200 Subject: [PATCH 52/52] commit all and fix reps --- .../cards/card-queue-production.vue | 13 +++++++------ Step/wwwroot/src/services/fileService.ts | 7 ++++--- Step/wwwroot/src/store/production.store.ts | 15 +++++++++++---- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue index d2c26d1c..90cc0bc3 100644 --- a/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue +++ b/Step/wwwroot/src/modules/base-components/cards/card-queue-production.vue @@ -28,7 +28,7 @@
- +
@@ -82,7 +82,7 @@ export default { selectedTab: "Sinistra", enablePopup: false, numberReps: 0, - idPartProgram: 0 + modelPartProgram: null } }, computed: { @@ -151,9 +151,9 @@ export default { getPayloadForItemQueue(index){ return this.partPrograms[index]; }, - positionBoxReps(arg1, id, reps){ - this.numberReps = reps; - this.idPartProgram = id; + positionBoxReps(arg1, model){ + this.numberReps = model.reps; + this.modelPartProgram = model; this.selectedPositionTop = (arg1.offsetTop + 78); this.enablePopup = true; }, @@ -165,7 +165,8 @@ export default { }, async changeReps(value){ console.log(value); - await new FileService().changeReps(this.selectedProcess, this.idPartProgram, value) + this.modelPartProgram.reps = value; + await new FileService().changeReps(this.selectedProcess, this.modelPartProgram) this.enablePopup = false; }, diff --git a/Step/wwwroot/src/services/fileService.ts b/Step/wwwroot/src/services/fileService.ts index 4b73a54e..331c4165 100644 --- a/Step/wwwroot/src/services/fileService.ts +++ b/Step/wwwroot/src/services/fileService.ts @@ -58,9 +58,10 @@ export class FileService extends baseRestService { return result; } - async changeReps(processId,id,reps){ - var result = await this.Put(this.BASE_URL + "queue/" + processId + "/edit/" + id, {reps: reps}); - productionActions.updatePartPrograms(store, result); + async changeReps(processId,model){ + debugger + var result = await this.Put(this.BASE_URL + "queue/" + processId + "/edit/" + model.id, {reps: model.reps}); + productionActions.updatePartProgram(store, result); return result; } diff --git a/Step/wwwroot/src/store/production.store.ts b/Step/wwwroot/src/store/production.store.ts index 6af16963..d1ca1e52 100644 --- a/Step/wwwroot/src/store/production.store.ts +++ b/Step/wwwroot/src/store/production.store.ts @@ -7,6 +7,7 @@ export interface ProductionGetters { } export interface ProductionActions { + updatePartProgram(context, model: server.PartProgramModel); updatePartPrograms(context, model:server.PartProgramModel[]); deletePartPrograms(context); deletePartProgram(context, model:server.PartProgramModel); @@ -21,7 +22,11 @@ export const productionStore = { getters: { }, mutations: { - + UpdatePartProgram(store, model: server.PartProgramModel) { + debugger + store._partProgram.set(model.id, model); + store.partProgram = Array.from(store._partProgram.values()); + }, DeletePartPrograms(store) { store.partProgram = []; }, @@ -39,10 +44,12 @@ export const productionStore = { } }, actions: { + updatePartProgram(context, model: server.PartProgramModel){ + context.commit("UpdatePartProgram", model); + }, updatePartPrograms(context, model:server.PartProgramModel[]) { - - context.commit("MovePartPrograms", model); - }, + context.commit("MovePartPrograms", model); + }, movePartPrograms(context, model:server.PartProgramModel[]) { context.commit("MovePartPrograms", model); },