add pwa app

This commit is contained in:
Amir Mohamadi
2021-01-31 20:47:26 +03:30
parent faa0d48d87
commit 534fe02b3a
23 changed files with 1541 additions and 929 deletions
+64 -123
View File
@@ -316,26 +316,23 @@ module.exports.calculate = [
},
}
///////// grating weight
const gratingLength = 1000
const gratingWidth = 1000
const frameThickness = 5
const forgeCrossBarThickness = 6
///////////////// api
///////// weight formula
function forgeWeight() {
// formula variables
const B2 = gratingLength
const B3 = gratingWidth
const B4 = bearingBarHeight
const B5 = bearingBarThickness
const B6 = forgeCrossBarThickness
const B7 = bearingBarPitch
const B8 = crossBarPitch
const B9 = frameThickness
const B2 = Number(gratingLength)
const B3 = Number(gratingWidth)
const B4 = Number(bearingBarHeight)
const B5 = Number(bearingBarThickness)
const B6 = Number(forgeCrossBarThickness)
const B7 = Number(bearingBarPitch)
const B8 = Number(crossBarPitch)
const B9 = Number(frameThickness)
//
const E2 = B2 - 2 * B9
const E3 = B3
@@ -358,7 +355,7 @@ module.exports.calculate = [
const K3 = E3 * (2 * (B4 + B5)) * H3 / 1000000
const K4 = E4 * (2 * (B4 + B5)) * H4 / 1000000
const K5 = E5 * B6 * B6 * H5 / 1000000
const K6 = K2 + K5
const K6 = K2 + K3 + K4 + K5
const K7 = 80
const K8 = K6 * K7 / 1000000 * 7140
const K9 = K8 / E6 * 100
@@ -368,110 +365,67 @@ module.exports.calculate = [
//
const H10 = E8 / ((B2 * B3) / 1000000)
// ///////// debug variables
// // B
// console.log('************ B Column ************')
// console.log('B2 = ', B2)
// console.log('B3 = ', B3)
// console.log('B4 = ', B4)
// console.log('B5 = ', B5)
// console.log('B6 = ', B6)
// console.log('B7 = ', B7)
// console.log('B8 = ', B8)
// console.log('B9 = ', B9)
// // E
// console.log('************ E Column ************')
// console.log('E2 = ', E2)
// console.log('E3 = ', E3)
// console.log('E4 = ', E4)
// console.log('E5 = ', E5)
// console.log('E6 = ', E6)
// console.log('E7 = ', E7)
// console.log('E8 = ', E8)
// // H
// console.log('************ H Column ************')
// console.log('H2 = ', H2)
// console.log('H3 = ', H3)
// console.log('H4 = ', H4)
// console.log('H5 = ', H5)
// console.log('H6 = ', H6)
// console.log('H7 = ', H7)
// console.log('H8 = ', H8)
// console.log('H9 = ', H9)
// console.log('H10 = ', H10)
// // K
// console.log('************ K Column ************')
// console.log('K2 = ', K2)
// console.log('K3 = ', K3)
// console.log('K4 = ', K4)
// console.log('K5 = ', K5)
// console.log('K6 = ', K6)
// console.log('K7 = ', K7)
// console.log('K8 = ', K8)
// console.log('K9 = ', K9)
return {
normal: Number(E6.toFixed(2)),
galvanized: Number(E8.toFixed(2))
}
}
// function forgeWeight_rounded() {
// // formula variables
// const B2 = gratingLength
// const B3 = gratingWidth
// const B4 = bearingBarHeight
// const B5 = bearingBarThickness
// const B6 = forgeCrossBarThickness
// const B7 = bearingBarPitch
// const B8 = crossBarPitch
// const B9 = frameThickness
// //
// const E2 = Math.round(B2 - 2 * B9)
// const E3 = B3
// const E4 = Math.round(B2 - 2 * B9)
// const E5 = B3
// //
// const H2 = 0
// const H3 = 2
// const H4 = Math.round(E5 / B7 + 1)
// const H5 = Math.round(E4 / B8 - 1)
// const H6 = Number((E4 * B4 * B5 / 1000000 * 7.85 * H4).toFixed(2))
// const H7 = Number(((E5 / 1000) * B6 * B6 * 7.85 / 1000 * H5).toFixed(2))
// const H8 = Number((E2 * B9 * B4 / 1000000 * H2 * 7.85 + E3 * B4 * B9 / 1000000 * 7.85 * H3).toFixed(2))
// const H9 = Math.round((1750 * (25.25 / (B4 * B5))))
//
// //
// const E6 = Number((H6 + H7 + H8).toFixed(2))
// //
// const K2 = Number((E2 * (2 * (B4 + B5)) * H2 / 1000000).toFixed(2))
// const K3 = Number((E3 * (2 * (B4 + B5)) * H3 / 1000000).toFixed(2))
// const K4 = Number((E4 * (2 * (B4 + B5)) * H4 / 1000000).toFixed(2))
// const K5 = Number((E5 * B6 * B6 * H5 / 1000000).toFixed(2))
// const K6 = Number((K2 + K5).toFixed(2))
// const K7 = 80
// const K8 = Number((K6 * K7 / 1000000 * 7140).toFixed(2))
// const K9 = Number((K8 / E6 * 100).toFixed(2))
// //
// const E7 = Number((K9 / 100 * E6).toFixed(2))
// const E8 = Number((E6 + E7).toFixed(2))
// //
// const H10 = Number((E8 / ((B2 * B3) / 1000000)).toFixed(2))
//
// ///////// debug variables
// // B
// console.log('************ B Column ************')
// console.log('B2 = ', B2)
// console.log('B3 = ', B3)
// console.log('B4 = ', B4)
// console.log('B5 = ', B5)
// console.log('B6 = ', B6)
// console.log('B7 = ', B7)
// console.log('B8 = ', B8)
// console.log('B9 = ', B9)
// // E
// console.log('************ E Column ************')
// console.log('E2 = ', E2)
// console.log('E3 = ', E3)
// console.log('E4 = ', E4)
// console.log('E5 = ', E5)
// console.log('E6 = ', E6)
// console.log('E7 = ', E7)
// console.log('E8 = ', E8)
// // H
// console.log('************ H Column ************')
// console.log('H2 = ', H2)
// console.log('H3 = ', H3)
// console.log('H4 = ', H4)
// console.log('H5 = ', H5)
// console.log('H6 = ', H6)
// console.log('H7 = ', H7)
// console.log('H8 = ', H8)
// console.log('H9 = ', H9)
// console.log('H10 = ', H10)
// // K
// console.log('************ K Column ************')
// console.log('K2 = ', K2)
// console.log('K3 = ', K3)
// console.log('K4 = ', K4)
// console.log('K5 = ', K5)
// console.log('K6 = ', K6)
// console.log('K7 = ', K7)
// console.log('K8 = ', K8)
// console.log('K9 = ', K9)
// // check H6
// return E8
// }
function pressuredWeight() {
// formula variables
const B15 = gratingLength
const B16 = gratingWidth
const B17 = bearingBarHeight
const B18 = bearingBarThickness
const B19 = crossBarHeight
const B20 = crossBarThickness
const B21 = bearingBarPitch
const B22 = crossBarPitch
const B23 = frameThickness
const B15 = Number(gratingLength)
const B16 = Number(gratingWidth)
const B17 = Number(bearingBarHeight)
const B18 = Number(bearingBarThickness)
const B19 = Number(crossBarHeight)
const B20 = Number(crossBarThickness)
const B21 = Number(bearingBarPitch)
const B22 = Number(crossBarPitch)
const B23 = Number(frameThickness)
//
const E15 = B15 - 2
const E16 = B16 - 2 * B23 - 2
@@ -496,7 +450,7 @@ module.exports.calculate = [
const K16 = E16 * (2 * (B17 + B18)) * H16 / 1000000
const K17 = E17 * (2 * (B17 + B18)) * H17 / 1000000
const K18 = E18 * (2 * (B19 + B20)) * H18 / 1000000
const K19 = K15 + K18
const K19 = K15 + K16 + K17 + K18
const K20 = 80
const K21 = K19 * K20 / 1000000 * 7140
const K22 = K21 / E19 * 100
@@ -511,19 +465,6 @@ module.exports.calculate = [
const K26 = L26 - 4 - 2 * B23 - B18
//
// console.log('H15 ' + H15)
// console.log('H16 ' + H16)
// console.log('H17 ' + H17)
// console.log('H18 ' + H18)
// console.log('H19 ' + H19)
// console.log('H20 ' + H20)
// console.log('H21 ' + H21)
// console.log('H22 ' + H22)
// console.log('H23 ' + H23)
// console.log('answer ' + H18)
return {
normal: Number(E19.toFixed(2)),
galvanized: Number(E21.toFixed(2))
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

+570 -307
View File
@@ -333,6 +333,49 @@
}
}
}
.install-app-dialog {
.el-dialog {
@media (max-width: 1400px) {
width: 80%;
}
@media (max-width: 992px) {
width: 90%;
}
@media (max-width: 768px) {
width: calc(100% - 20px);
}
.el-button {
span {
color: #fff;
}
}
}
.install-app-description {
h2 {
margin-bottom: 20px;
}
p {
margin-bottom: 10px;
word-break: break-word;
}
.imgBox {
text-align: center;
margin: 20px 0 40px;
img {
width: 520px;
max-width: 100%;
@include boxShadow(0 4px 10px rgba(#000, 0.4));
@include borderRadius(5px);
}
}
}
}
}
///////////////////////////// about page
@@ -1488,56 +1531,427 @@
.s1 {
}
}
.s2 {
.app {
$appLayoutPadding: 55px;
@include transition(0.1s);
.app-section {
.app {
$appLayoutPadding: 55px;
@include transition(0.1s);
& > .container-fluid, & > .container-fluid .row {
padding: 0 !important;
& > .container-fluid, & > .container-fluid .row {
padding: 0 !important;
}
.appTitle {
text-align: center;
.title {
font-size: 30px;
@media (max-width: 1400px) {
font-size: 25px;
}
}
}
.appMethod {
text-align: center;
margin-bottom: 50px;
background: $theme;
padding: 15px;
.txt {
display: inline-block;
margin: 0 10px 10px;
}
.appTitle {
text-align: center;
span {
color: #fff;
}
.title {
font-size: 30px;
.el-radio-button__orig-radio:checked + .el-radio-button__inner {
background-color: $darkGray;
border-color: #fff;
@include boxShadow(-1px 0 0 0 $darkGray);
}
@media (max-width: 1400px) {
font-size: 25px;
}
.el-radio-button .el-radio-button__inner {
color: $theme;
@extend %userSelect;
@media (max-width: 530px) {
font-size: 12px;
}
}
.appMethod {
text-align: center;
.el-radio-button.is-active .el-radio-button__inner {
color: #fff;
}
}
.appLayout {
padding: $appLayoutPadding;
background: $theme;
height: 100%;
@include boxSizing(border-box);
position: relative;
@media (max-width: 1400px) {
padding: 55px 15px;
}
span, p, b, * {
color: #fff;
}
input {
color: $red;
}
.layoutTitle {
margin-bottom: 50px;
background: $theme;
padding: 15px;
}
.txt {
display: inline-block;
margin: 0 10px 10px;
.class {
margin-bottom: 40px;
h4 {
margin-bottom: 15px;
}
}
span {
color: #fff;
}
.calculateBtn {
text-align: center;
.el-radio-button__orig-radio:checked + .el-radio-button__inner {
background-color: $darkGray;
.btn {
@include borderRadius(5px);
background: #fff;
border-color: #fff;
@include boxShadow(-1px 0 0 0 $darkGray);
color: $darkGray;
&:hover {
background: $darkGray;
border-color: $darkGray;
color: #fff;
}
}
}
.el-radio {
margin-bottom: 15px;
}
.el-radio__input.is-checked .el-radio__inner {
background-color: $darkGray;
border-color: $darkGray;
}
.el-form-item__label {
@media (max-width: 600px) {
float: none !important;
&:lang(fa) {
float: none !important;
}
}
}
.el-form-item__content {
margin-left: 200px !important;
@media (max-width: 600px) {
margin-left: 0 !important;
}
.el-radio-button .el-radio-button__inner {
color: $theme;
@extend %userSelect;
@media (max-width: 530px) {
font-size: 12px;
&:lang(fa) {
margin-left: 0 !important;
margin-right: 200px !important;
@media (max-width: 600px) {
margin-right: 0 !important;
}
}
}
.el-input--suffix .el-input__inner {
padding-right: 15px;
}
.el-input__inner {
&::placeholder {
color: $darkGray;
}
}
.err {
color: $red;
}
.copyRight {
position: absolute;
width: 100%;
font-size: 12px;
bottom: 5px;
left: 0;
p {
color: rgba(#fff, 0.5);
text-align: center;
width: 100%;
a {
@keyframes blinking {
from {
color: rgba(#fff, 0.5);
}
to {
color: rgba(#fff, 0.7);
}
}
@include animation(blinking 1s alternate-reverse infinite);
@extend %defaultTransition;
color: rgba(#fff, 0.5);
&:hover {
color: rgba(#fff, 1);
}
}
}
}
}
.el-input {
//width: auto;
//
//@media (max-width: 600px) {
// width: 100%;
//}
input {
font-family: 'sahel', 'diodrum', sans-serif;
&:lang(en) {
font-family: 'diodrum', sans-serif;
}
&::placeholder {
font-family: 'sahel';
&:lang(en) {
font-family: 'diodrum';
}
}
}
.el-input__suffix {
right: auto;
left: 5px;
&:lang(en) {
right: 5px;
left: auto;
}
.el-input__icon {
color: #000;
}
}
}
.el-select {
width: 100%;
}
.el-radio {
margin-right: 20px;
&:lang(fa) {
margin-right: 0;
margin-left: 20px;
}
}
.appResult {
background: lightgray;
padding-left: $appLayoutPadding;
padding-right: $appLayoutPadding;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.success {
color: #67C23A;
}
.failure {
color: $red;
}
@keyframes waiting {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
p {
font-size: 0;
letter-spacing: -10px;
font-weight: bold;
}
.waiting {
@include animation(waiting 0.7s alternate-reverse infinite);
}
}
.weight {
margin-top: 30px;
background: lightgray;
padding: 20px;
text-align: center;
opacity: 0;
p {
font-size: 0;
letter-spacing: -10px;
}
.colored {
color: $theme;
}
}
}
}
.app-guide-tables {
.notice {
color: red;
font-size: 14px;
display: none;
@media (max-width: 992px) {
display: block;
}
}
.tableBox {
width: 100%;
overflow: auto;
table {
width: 100%;
min-width: 960px;
border: 1px solid rgba(#000, 1);
thead {
background: $theme;
color: #fff;
th {
padding: 20px;
font-family: 'sahel-LD', 'diodrum', sans-serif;
direction: ltr;
&.middle {
border-left: 2px solid rgba(#fff, 0.4) !important;
border-right: 2px solid rgba(#fff, 0.4) !important;
}
}
}
tbody {
background: rgba($theme, 0.2);
color: #000;
tr {
line-height: 1.3em;
td {
border: 1px solid rgba(#000, 1);
padding: 20px;
font-family: 'sahel-LD', 'diodrum', sans-serif;
direction: ltr;
text-align: center;
&:last-child {
direction: ltr !important;
}
}
&.odd {
background: rgba(#000, 0.1);
}
}
}
}
&.vehicles {
}
&.forklifts {
margin-top: 50px;
}
}
}
///////////////////////////// pwa app
.pwa {
position: relative;
padding-top: 80px;
background: #fff;
@include transition(background-color 0.2s, color 0.2s !important);
div, p, a, h1, h2, h3, b, span, i {
@include transition(background-color 0.2s, color 0.2s !important);
}
&.dark-mode {
$darkModeBG: #1b1b1b ;
$darkModeAppLayout: #2b2b2b;
background: $darkModeBG;
p, h2, h3, a, i, b {
color: #fff !important;
}
.appLayout, .appMethod, .app-guide-tables thead {
background: $darkModeAppLayout;
}
.app-guide-tables tbody {
background: rgba(#fff, 0.4);
}
.notice {
//color: #805858 !important;
color: $red !important;
}
.pwa-header {
background: $darkModeAppLayout;
}
.pwa-about {
background: $darkModeBG;
span {
color: #fff;
}
}
.app {
.appMethod {
.el-radio-button__orig-radio:checked + .el-radio-button__inner {
background-color: rgba(#fff, 0.5);
border-color: #fff;
}
.el-radio-button.is-active .el-radio-button__inner {
color: #fff;
@@ -1545,317 +1959,166 @@
}
.appLayout {
padding: $appLayoutPadding;
background: $theme;
height: 100%;
@include boxSizing(border-box);
position: relative;
@media (max-width: 1400px) {
padding: 55px 15px;
}
span, p, b, * {
color: #fff;
}
input {
color: $red;
}
button {
color: $red;
span {
color: $red;
}
}
.layoutTitle {
margin-bottom: 50px;
}
.class {
margin-bottom: 40px;
h4 {
margin-bottom: 15px;
}
}
.calculateBtn {
text-align: center;
.btn {
@include borderRadius(5px);
&:hover {
background: $darkGray;
color: #fff;
}
}
}
.el-radio {
margin-bottom: 15px;
}
.el-radio__input.is-checked .el-radio__inner {
background-color: $darkGray;
border-color: $darkGray;
background-color: rgba($red, 1) !important;
border-color: rgba(#fff, 0.3) !important;
}
.el-form-item__label {
@media (max-width: 600px) {
float: none !important;
&:lang(fa) {
float: none !important;
}
}
}
.el-form-item__content {
margin-left: 200px !important;
@media (max-width: 600px) {
margin-left: 0 !important;
}
&:lang(fa) {
margin-left: 0 !important;
margin-right: 200px !important;
@media (max-width: 600px) {
margin-right: 0 !important;
}
}
}
.el-input--suffix .el-input__inner {
padding-right: 15px;
}
.el-input__inner {
&::placeholder {
color: $darkGray;
.btn {
&:hover {
border-color: #fff;
}
}
.err {
color: $red;
}
.copyRight {
position: absolute;
width: 100%;
font-size: 12px;
bottom: 5px;
left: 0;
p {
color: rgba(#fff, 0.5);
text-align: center;
width: 100%;
a {
@keyframes blinking {
from {
color: rgba(#fff, 0.5);
}
to {
color: rgba(#fff, 0.7);
}
}
@include animation(blinking 1s alternate-reverse infinite);
@extend %defaultTransition;
color: rgba(#fff, 0.5);
&:hover {
color: rgba(#fff, 1);
}
}
}
color: $red !important;
}
}
.el-input {
//width: auto;
//
//@media (max-width: 600px) {
// width: 100%;
//}
input {
font-family: 'sahel', 'diodrum', sans-serif;
&:lang(en) {
font-family: 'diodrum', sans-serif;
}
&::placeholder {
font-family: 'sahel';
&:lang(en) {
font-family: 'diodrum';
}
}
}
.el-input__suffix {
right: auto;
left: 5px;
&:lang(en) {
right: 5px;
left: auto;
}
.el-input__icon {
color: #000;
}
}
}
.el-select {
width: 100%;
}
.el-radio {
margin-right: 20px;
&:lang(fa) {
margin-right: 0;
margin-left: 20px;
}
}
.appResult {
background: lightgray;
padding-left: $appLayoutPadding;
padding-right: $appLayoutPadding;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.appResult, .weight {
background: #454545;
.success {
color: #67C23A;
color: #7cfc00 !important;
}
.failure {
color: $red;
}
@keyframes waiting {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
p {
font-size: 0;
letter-spacing: -10px;
font-weight: bold;
}
.waiting {
@include animation(waiting 0.7s alternate-reverse infinite);
color: $red !important;
}
}
}
.weight {
margin-top: 30px;
background: lightgray;
padding: 20px;
text-align: center;
opacity: 0;
.page-load {
background: $darkModeAppLayout;
p {
font-size: 0;
letter-spacing: -10px;
}
.colored {
color: $theme;
svg {
path {
fill: #fff;
}
}
}
}
.s3 {
.notice {
color: red;
font-size: 14px;
display: none;
.pwa-header {
padding: 10px 0;
background: $theme;
position: fixed;
top: 0;
left: 0;
z-index: 10;
width: 100%;
@include boxShadow(0 4px 8px rgba(#000, 0.4));
@media (max-width: 992px) {
display: block;
.options {
display: flex;
justify-content: flex-end;
align-items: center;
a {
color: #fff;
font-size: 16px;
margin-right: 5px;
display: inline-block;
padding: 2px 5px;
@include borderRadius(8px);
&.active {
background-color: rgba(#fff, 0.2);
}
}
i {
color: #fff;
font-size: 22px;
margin-right: 10px;
padding: 10px;
padding-left: 0;
&:lang(en) {
padding-left: 10px;
padding-right: 0;
margin-right: 0;
margin-left: 10px;
}
}
}
.tableBox {
width: 100%;
overflow: auto;
.logo {
svg {
width: 60px;
table {
width: 100%;
min-width: 960px;
border: 1px solid rgba(#000, 1);
thead {
background: $theme;
color: #fff;
th {
padding: 20px;
font-family: 'sahel-LD', 'diodrum', sans-serif;
direction: ltr;
&.middle {
border-left: 2px solid rgba(#fff, 0.4) !important;
border-right: 2px solid rgba(#fff, 0.4) !important;
}
}
}
tbody {
background: rgba($theme, 0.2);
color: #000;
tr {
line-height: 1.3em;
td {
border: 1px solid rgba(#000, 1);
padding: 20px;
font-family: 'sahel-LD', 'diodrum', sans-serif;
direction: ltr;
text-align: center;
&:last-child {
direction: ltr !important;
}
}
&.odd {
background: rgba(#000, 0.1);
}
}
path {
fill: #fff;
}
}
}
}
&.vehicles {
.pwa-about {
background: #fff;
width: 100%;
height: 100vh;
overflow: auto;
position: fixed;
top: 0;
left: 0;
z-index: 9;
padding-top: 100px;
padding-bottom: 100px;
@include boxSizing(border-box);
visibility: hidden;
opacity: 0;
.description {
a {
color: $theme;
}
&.forklifts {
margin-top: 50px;
.copyRight {
text-align: center;
p {
margin-top: 80px;
font-weight: bold;
text-align: center;
}
a {
color: #872071;
font-size: 14px;
}
}
}
}
.calculation--page {
.s1 {
padding-bottom: 0;
.notice {
margin-top: 20px;
color: red;
}
}
}
.connection-status {
position: fixed;
bottom: 15px;
right: 15px;
z-index: 20;
background: $red;
padding: 2px 8px;
@include borderRadius(10px);
&:lang(en) {
right: auto;
left: 15px;
}
p {
color: #fff;
}
}
}
+343
View File
@@ -0,0 +1,343 @@
<template>
<section class="app-section">
<div class="container">
<div class="row">
<div class="app m-auto" :class="app.method === 'custom' ? 'col-12 col-lg-9 col-xl-8 col-xxl-6' : 'col-12'">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="appTitle">
<h2 class="title">{{ titleTxt }}</h2>
</div>
<div class="appMethod">
<span class="txt">{{ staticData.app.t4 }}</span>
<el-radio-group v-model="app.method" style="direction: ltr">
<template v-if="$route.params.lang === 'fa'">
<el-radio-button label="classified">{{ staticData.app.t5 }}</el-radio-button>
<el-radio-button label="custom">{{ staticData.app.t6 }}</el-radio-button>
</template>
<template v-else>
<el-radio-button label="custom">{{ staticData.app.t6 }}</el-radio-button>
<el-radio-button label="classified">{{ staticData.app.t5 }}</el-radio-button>
</template>
</el-radio-group>
</div>
</div>
<div class="col-12 col-lg-6 mb-5 mb-lg-0" v-if="app.method === 'classified'">
<div class="appLayout">
<h2 class="layoutTitle">{{ staticData.app.t7 }}</h2>
<div class="class">
<h4>{{ staticData.app.t8 }}</h4>
<el-radio v-model="app.vehicleClass" label="class1">{{ staticData.app.t9 }}</el-radio>
</div>
<div class="class">
<h4>{{ staticData.app.t10 }}</h4>
<el-radio v-model="app.vehicleClass" label="class2">{{ staticData.app.t11 }}</el-radio>
<el-radio v-model="app.vehicleClass" label="class3">{{ staticData.app.t12 }}</el-radio>
<el-radio v-model="app.vehicleClass" label="class4">{{ staticData.app.t13 }}</el-radio>
</div>
<div class="class">
<h4>{{ staticData.app.t14 }}</h4>
<el-radio v-model="app.vehicleClass" label="FL1">FL1</el-radio>
<el-radio v-model="app.vehicleClass" label="FL2">FL2</el-radio>
<el-radio v-model="app.vehicleClass" label="FL3">FL3</el-radio>
<el-radio v-model="app.vehicleClass" label="FL4">FL4</el-radio>
<el-radio v-model="app.vehicleClass" label="FL5">FL5</el-radio>
<el-radio v-model="app.vehicleClass" label="FL6">FL6</el-radio>
</div>
</div>
</div>
<div :class="app.method === 'custom' ? 'col-12' : 'col-12 col-lg-6'">
<div class="appLayout">
<h2 class="layoutTitle">{{ staticData.app.t15 }}</h2>
<el-form key="form-a">
<el-form-item :label="staticData.app.t16">
<el-radio-group v-model="app.gratingType">
<el-radio label="forge">{{ staticData.app.t17 }}</el-radio>
<el-radio label="pressured">{{ staticData.app.t18 }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="staticData.app.t19" v-if="app.method === 'custom'">
<el-radio-group v-model="app.loadType">
<el-radio label="pointedLoad">{{ staticData.app.t20 }}</el-radio>
<el-radio label="distributedLoad">{{ staticData.app.t21 }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :class="validation.pointedLoadValue ? 'is-error' : null" :label="staticData.app.t22" v-if="app.method === 'custom' && app.loadType === 'pointedLoad'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.pointedLoadValue" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.pointedLoadValue">{{ validation.pointedLoadValue.msg }}</p>
</el-form-item>
<el-form-item :class="validation.distributedLoadValue ? 'is-error' : null" :label="staticData.app.t23" v-if="app.method === 'custom' && app.loadType === 'distributedLoad'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.distributedLoadValue" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.distributedLoadValue">{{ validation.distributedLoadValue.msg }}</p>
</el-form-item>
<el-form-item :class="validation.bearingBarPitch ? 'is-error' : null" :label="staticData.app.t24" v-if="calculationValues">
<el-select v-model="app.bearingBarPitch" key="bearingBarPitch_forge" v-if="app.gratingType === 'forge'"
:placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.bearingBarPitch_forge"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<el-select v-model="app.bearingBarPitch" key="bearingBarPitch_pressured" v-if="app.gratingType === 'pressured'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.bearingBarPitch_pressured"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.bearingBarPitch">{{ validation.bearingBarPitch.msg }}</p>
</el-form-item>
<el-form-item :class="validation.crossBarPitch ? 'is-error' : null" :label="staticData.app.t25" v-if="calculationValues">
<el-select v-model="app.crossBarPitch" key="crossBarPitch_forge" v-if="app.gratingType === 'forge'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.crossBarPitch_forge"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<el-select v-model="app.crossBarPitch" key="crossBarPitch_pressured" v-if="app.gratingType === 'pressured'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.crossBarPitch_pressured"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.crossBarPitch">{{ validation.crossBarPitch.msg }}</p>
</el-form-item>
<el-form-item :class="validation.clearSpan ? 'is-error' : null" :label="staticData.app.t26">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.clearSpan" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.clearSpan">{{ validation.clearSpan.msg }}</p>
</el-form-item>
<el-form-item :class="validation.bearingBarThickness ? 'is-error' : null" :label="staticData.app.t27">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.bearingBarThickness" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.bearingBarThickness">{{ validation.bearingBarThickness.msg }}</p>
</el-form-item>
<!-- cross bar thickness -->
<el-form-item :class="validation.crossBarThickness ? 'is-error' : null" :label="staticData.app.t30" v-if="app.gratingType === 'pressured'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.crossBarThickness" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.crossBarThickness">{{ validation.crossBarThickness.msg }}</p>
</el-form-item>
<!-- cross bar thickness -->
<el-form-item :class="validation.bearingBarHeight ? 'is-error' : null" :label="staticData.app.t28">
<el-select v-model="app.bearingBarHeight"
key="bearingBarHeight"
:placeholder="relativeValues || app.loadType === 'distributedLoad' ? staticData.app.select : staticData.app.t29">
<el-option
v-for="item in app.loadType === 'distributedLoad' ? calculationValues.bearingBarHeight : relativeValues"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.bearingBarHeight">{{ validation.bearingBarHeight.msg }}</p>
</el-form-item>
<!-- cross bar height -->
<el-form-item :class="validation.crossBarHeight ? 'is-error' : null" :label="staticData.app.t31" v-if="app.gratingType === 'pressured'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.crossBarHeight" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.crossBarHeight">{{ validation.crossBarHeight.msg }}</p>
</el-form-item>
<!-- cross bar height -->
<div class="calculateBtn">
<button class="btn btn-reverse-fill" @click.prevent="calculate">{{ staticData.app.calculate }}</button>
</div>
</el-form>
<div class="copyRight">
<p>Design And develop by <a href="https://www.negarehagency.com" target="_blank">negarehagency.com</a></p>
</div>
</div>
</div>
<div class="col-12 mt-5">
<div class="appResult" v-if="waiting || appResult || validation">
<p class="waiting" v-if="waiting">{{ staticData.app.waiting }}</p>
<p class="err" v-if="!appResult && !waiting">{{ staticData.app.validationErr }}</p>
<p v-if="appResult" :class="appResult.sigmaStatus ? 'success' : 'failure'">{{ appResult.sigma }}</p>
<p v-if="appResult" :class="appResult.deflectionStatus ? 'success' : 'failure'">{{ appResult.deflection }}</p>
</div>
<div class="weight" v-if="!validation && waiting || appResult">
<p v-if="appResult">{{ staticData.app.t32 }}</p>
<p dir="ltr">
<b class="colored"> {{ appResult.gratingWeight.normal }} </b>
<b> Kg/m<sup>2</sup> </b>
</p>
<br>
<p v-if="appResult">{{ staticData.app.t33 }}</p>
<p dir="ltr">
<b class="colored"> {{ appResult.gratingWeight.galvanized }} </b>
<b> Kg/m<sup>2</sup> </b>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
data() {
return {
app: {
method: 'custom',
gratingType: 'forge',
loadType: 'pointedLoad',
vehicleClass: 'class1',
pointedLoadValue: '',
distributedLoadValue: '',
bearingBarPitch: '',
crossBarPitch: '',
clearSpan: '',
bearingBarThickness: '',
crossBarThickness: '',
bearingBarHeight: '',
crossBarHeight: '',
locale: this.$route.params.lang
},
calculationValues: null,
relativeValues: null,
validation: {},
waiting: false,
appResult: null
}
},
async fetch() {
const calculationValues = await this.$axios.get('/api/public/calculation/values')
this.calculationValues = calculationValues.data
},
props: ['titleTxt'],
computed: {
staticData() {
return this.$store.state.staticData.calculation[this.$route.params.lang]
},
gratingTypeTrigger() {
return this.app.gratingType
},
crossBarPitchTrigger() {
return this.app.crossBarPitch
},
loadTypeTrigger() {
return this.app.loadType
},
vehicleClassTrigger() {
return this.app.vehicleClass
},
methodTrigger() {
return this.app.method
}
},
watch: {
loadTypeTrigger(newVal, oldVal) {
this.app.bearingBarHeight = ''
},
gratingTypeTrigger(newVal, oldVal) {
this.app.bearingBarPitch = ''
this.app.crossBarPitch = ''
},
crossBarPitchTrigger(newVal, oldVal) {
if (this.app.loadType === 'pointedLoad') {
this.app.bearingBarHeight = ''
const data = {
gratingType: this.app.gratingType,
crossBarPitch: this.app.crossBarPitch
}
this.$axios.post('/api/public/calculation/relativeValues', data)
.then(res => {
this.relativeValues = res.data
})
.catch(err => {
this.relativeValues = null
})
}
},
vehicleClassTrigger(newVal, oldVal) {
this.app.crossBarPitch = ''
if (newVal === 'class1') this.app.loadType = 'distributedLoad'
else this.app.loadType = 'pointedLoad'
},
methodTrigger(newVal, oldVal) {
if (newVal === 'classified') {
this.app.vehicleClass = 'class1'
this.app.loadType = 'distributedLoad'
} else {
this.app.vehicleClass = ''
this.app.loadType = 'pointedLoad'
}
},
waiting() {
setTimeout(() => {
this.$gsap.timeline()
.to($('.app .appResult,.app .weight'), {opacity: 1, paddingTop: 20, paddingBottom: 20, duration: 0.2})
.to($('.app .appResult p,.app .weight p'), {opacity: 1, fontSize: 16, letterSpacing: 0, duration: 0.2}, 0)
}, 100)
}
},
methods: {
calculate() {
this.validation = {}
this.waiting = true
this.appResult = null
setTimeout(() => {
this.$axios.post('/api/public/calculate', this.app)
.then(res => {
this.waiting = false
this.appResult = res.data
})
.catch(err => {
this.waiting = false
if (err.response.status === 422) this.validation = err.response.data.validation
})
}, 2000)
}
}
}
</script>
<style lang="scss">
.el-popper .popper__arrow {
border-width: 0;
filter: none;
left: 35px;
&:lang(fa) {
left: auto;
right: 35px;
}
}
</style>
+151
View File
@@ -0,0 +1,151 @@
<template>
<section class="app-guide-tables">
<div class="container">
<div class="row">
<div class="col-12">
<div class="tableBox vehicles">
<table>
<thead>
<tr>
<th colspan="4" class="center">{{ staticData.table1.title }}</th>
<th class="middle">{{ staticData.table1.load }}</th>
<th>{{ staticData.table1.imprint }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ staticData.table1.class1.t1 }}</td>
<td>{{ staticData.table1.class1.t2 }}</td>
<td>{{ staticData.table1.class1.t3 }}</td>
<td>{{ staticData.table1.danSqm }}</td>
<td>600</td>
<td>1000 x 1000</td>
</tr>
<tr class="odd">
<td>{{ staticData.table1.class2.t1 }}</td>
<td>{{ staticData.table1.class2.t2 }}</td>
<td>{{ staticData.table1.class2.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>1.000</td>
<td>200 x 200</td>
</tr>
<tr>
<td>{{ staticData.table1.class3.t1 }}</td>
<td>{{ staticData.table1.class3.t2 }}</td>
<td>{{ staticData.table1.class3.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>3.000</td>
<td>200 x 400</td>
</tr>
<tr class="odd">
<td>{{ staticData.table1.class4.t1 }}</td>
<td>{{ staticData.table1.class4.t2 }}</td>
<td>{{ staticData.table1.class4.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>9.000</td>
<td>250 x 600</td>
</tr>
</tbody>
</table>
</div>
<p class="notice">{{ staticData.scrollToSee }}</p>
<div class="tableBox forklifts">
<table>
<thead>
<tr>
<th colspan="6" class="center">{{ staticData.table2.title }}</th>
<th class="middle">{{ staticData.table2.load }}</th>
<th>{{ staticData.table2.imprint }}</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>{{ staticData.table2.t1 }}</td>
<td>{{ staticData.table2.t2 }}</td>
<td>{{ staticData.table2.t3 }}</td>
<td>{{ staticData.table2.t4 }}</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl1.t1 }}</td>
<td>{{ staticData.table2.fl1.t2 }}</td>
<td>21</td>
<td>10</td>
<td>31</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>2600</td>
<td>130 x 130</td>
</tr>
<tr>
<td>{{ staticData.table2.fl2.t1 }}</td>
<td>{{ staticData.table2.fl2.t2 }}</td>
<td>31</td>
<td>15</td>
<td>46</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>4000</td>
<td>175 x 150</td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl3.t1 }}</td>
<td>{{ staticData.table2.fl3.t2 }}</td>
<td>44</td>
<td>25</td>
<td>69</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>6300</td>
<td>200 x 200</td>
</tr>
<tr>
<td>{{ staticData.table2.fl4.t1 }}</td>
<td>{{ staticData.table2.fl4.t2 }}</td>
<td>60</td>
<td>40</td>
<td>100</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>9000</td>
<td>300 x 200</td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl5.t1 }}</td>
<td>{{ staticData.table2.fl5.t2 }}</td>
<td>90</td>
<td>60</td>
<td>150</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>14000</td>
<td>375 x 200</td>
</tr>
<tr>
<td>{{ staticData.table2.fl6.t1 }}</td>
<td>{{ staticData.table2.fl6.t2 }}</td>
<td>110</td>
<td>80</td>
<td>190</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>17000</td>
<td>450 x 200</td>
</tr>
</tbody>
</table>
</div>
<p class="notice">{{ staticData.scrollToSee }}</p>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
computed: {
staticData() {
return this.$store.state.staticData.calculation[this.$route.params.lang]
}
}
}
</script>
+28 -4
View File
@@ -1,6 +1,30 @@
<template>
<div class="page-load">
<logo/>
<p>Arak Rail Co.</p>
</div>
<div class="page-load">
<logo/>
<p>Arak Rail Co.</p>
</div>
</template>
<script>
export default {
mounted() {
////////////////////////////////////////// global router guards
this.$router.beforeEach((to, from, next) => {
this.$gsap.timeline({
onComplete: () => {
next()
}
})
.to($('.page-load'), {autoAlpha: 1, duration: 0.3})
.fromTo($('.page-load svg'), {opacity: 0, scale: 1, y: 10}, {opacity: 1, y: 0, duration: 0.15})
.fromTo($('.page-load p'), {opacity: 0, scale: 1, y: 10}, {opacity: 1, y: 0, duration: 0.15})
})
this.$router.afterEach((to, from) => {
this.$gsap.timeline({delay: 0.3})
.to($('.page-load p,.page-load svg'), {opacity: 0, scale: 0.5, duration: 0.15})
.to($('.page-load'), {autoAlpha: 0, duration: 0.5})
})
}
}
</script>
+38
View File
@@ -0,0 +1,38 @@
<template>
<section class="pwa-about">
<div class="container">
<div class="row">
<div class="col-12">
<div class="description">
<h2 class="title">{{ staticData.t6 }}</h2>
<p>{{ staticData.t1 }}</p>
<br>
<p>
<span>{{ staticData.t3 }}</span>
<a href="/" target="_blank">www.arakrail.com</a>
<span>{{ staticData.t4 }}</span>
</p>
<br>
<p>{{ staticData.t2 }}</p>
<div class="copyRight">
<p>{{ staticData.t5 }}</p>
<a href="http://negarehagency.com/" target="_blank">Negareh Agency</a>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
computed: {
staticData() {
return this.$store.state.staticData.pwa[this.$route.params.lang]
}
}
}
</script>
+51
View File
@@ -0,0 +1,51 @@
<template>
<header class="pwa-header">
<div class="container-fluid">
<div class="row">
<div class="col-6">
<div class="logo">
<logo/>
</div>
</div>
<div class="col-6 options">
<nuxt-link :to="{name: 'lang-pwa',params: {lang: 'fa'}}">FA</nuxt-link>
<nuxt-link :to="{name: 'lang-pwa',params: {lang: 'en'}}">EN</nuxt-link>
<i :class="darkMode ? 'fas fa-sun' : 'fad fa-moon'" @click="toggleDarkMode"></i>
<i :class="aboutPage ? 'fas fa-times-circle' : 'fas fa-info-circle'" @click="showAbout"></i>
</div>
</div>
</div>
</header>
</template>
<script>
export default {
data() {
return {
darkMode: false,
aboutPage: false,
aboutPageTL: null
}
},
computed: {
staticData() {
return this.$store.state.staticData.pwa[this.$route.params.lang]
}
},
methods: {
toggleDarkMode() {
this.darkMode = !this.darkMode
this.$emit('darkModeStatus', this.darkMode)
},
showAbout() {
!this.aboutPage ? this.aboutPageTL.play() : this.aboutPageTL.play().reverse()
this.aboutPage = !this.aboutPage
}
},
mounted() {
this.aboutPageTL = this.$gsap.timeline({paused: true})
.to($('.pwa .pwa-about'), {autoAlpha: 1, duration: 0.1})
}
}
</script>
-19
View File
@@ -13,25 +13,6 @@
<script>
export default {
mounted() {
////////////////////////////////////////// global router guards
this.$router.beforeEach((to, from, next) => {
this.$gsap.timeline({
onComplete: () => {
next()
}
})
.to($('.page-load'), {autoAlpha: 1, duration: 0.3})
.fromTo($('.page-load svg'), {opacity: 0, scale: 1, y: 10}, {opacity: 1, y: 0, duration: 0.15})
.fromTo($('.page-load p'), {opacity: 0, scale: 1, y: 10}, {opacity: 1, y: 0, duration: 0.15})
})
this.$router.afterEach((to, from) => {
this.$gsap.timeline({delay: 0.3})
.to($('.page-load p,.page-load svg'), {opacity: 0, scale: 0.5, duration: 0.15})
.to($('.page-load'), {autoAlpha: 0, duration: 0.5})
})
},
head() {
return {
htmlAttrs: {
+39
View File
@@ -0,0 +1,39 @@
<template>
<div class="pwa" :class="darkMode ? 'dark-mode' : null">
<div class="connection-status" v-if="$nuxt.isOffline">
<p>{{ staticData.connection }}</p>
</div>
<pwa-about/>
<pwa-header @darkModeStatus="changeTheme"/>
<nuxt/>
<page-load/>
</div>
</template>
<script>
export default {
data() {
return {
darkMode: false
}
},
computed: {
staticData() {
return this.$store.state.staticData.pwa[this.$route.params.lang]
}
},
methods: {
changeTheme(val) {
this.darkMode = val
}
},
head() {
return {
htmlAttrs: {
lang: this.$route.params.lang
}
}
}
}
</script>
+24 -4
View File
@@ -1,4 +1,5 @@
const webpack = require("webpack")
const {state} = require('./store/global')
export default {
// Global page headers (https://go.nuxtjs.dev/config-head)
head: {
@@ -39,7 +40,9 @@ export default {
components: true,
// Modules for dev and build (recommended) (https://go.nuxtjs.dev/config-modules)
buildModules: [],
buildModules: [
'@nuxtjs/pwa'
],
// Modules (https://go.nuxtjs.dev/config-modules)
modules: [
@@ -47,13 +50,30 @@ export default {
'@nuxtjs/axios',
'@nuxtjs/auth'
],
pwa: {
manifest: {
name: 'وزن گریتینگ',
short_name: 'ArakRail Grating',
// description: state().meta_description.fa,
description: false,
lang: 'fa',
useWebmanifestExtension: false,
start_url: '/fa/pwa'
},
meta: {
mobileAppIOS: true,
name: 'اراک ریل'
},
workbox: {
cleanupOutdatedCaches: true
}
},
// Axios module configuration (https://go.nuxtjs.dev/config-axios)
axios: {
proxy: true
},
proxy: {
'/api': {target: 'http://127.0.0.1:7320'}
'/api': {target: 'http://127.0.0.1:6096'}
},
// Build Configuration (https://go.nuxtjs.dev/config-build)
@@ -72,7 +92,7 @@ export default {
},
server: {
host: '0.0.0.0',
port: 7320
port: 6096
},
serverMiddleware: ['~/api/index'],
auth: {
+112
View File
@@ -1881,6 +1881,82 @@
"http-proxy-middleware": "^1.0.4"
}
},
"@nuxtjs/pwa": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/@nuxtjs/pwa/-/pwa-3.3.5.tgz",
"integrity": "sha512-8tTmW8DBspWxlJwTimOHTkwfkwPpL9wIcGmy75Gcmin+c9YtX2Ehxmhgt/TLFOC9XsLAqojqynw3/Agr/9OE1w==",
"dev": true,
"requires": {
"clone-deep": "^4.0.1",
"defu": "^3.2.2",
"execa": "^5.0.0",
"fs-extra": "^9.1.0",
"hasha": "^5.2.2",
"jimp-compact": "^0.16.1",
"lodash.template": "^4.5.0",
"serve-static": "^1.14.1",
"workbox-cdn": "^5.1.4"
},
"dependencies": {
"execa": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
"integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
"dev": true,
"requires": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
"is-stream": "^2.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^4.0.1",
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
}
},
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"get-stream": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
"integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
"dev": true
},
"human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
}
}
},
"@nuxtjs/youch": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/@nuxtjs/youch/-/youch-4.2.3.tgz",
@@ -2632,6 +2708,12 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -6044,6 +6126,24 @@
"minimalistic-assert": "^1.0.1"
}
},
"hasha": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
"integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
"dev": true,
"requires": {
"is-stream": "^2.0.0",
"type-fest": "^0.8.0"
},
"dependencies": {
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
}
}
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -6892,6 +6992,12 @@
}
}
},
"jimp-compact": {
"version": "0.16.1",
"resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz",
"integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==",
"dev": true
},
"jiti": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-0.1.12.tgz",
@@ -12959,6 +13065,12 @@
}
}
},
"workbox-cdn": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/workbox-cdn/-/workbox-cdn-5.1.4.tgz",
"integrity": "sha512-04gM3mi8QGutokkSaA9xunVfjURnLbo9TTWyi8+pSDCEW5cD8u5GbJiliLK1vB9CShk/9OY1UDfW+XcmD+d6KQ==",
"dev": true
},
"worker-farm": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+1
View File
@@ -34,6 +34,7 @@
"vue-persian-datetime-picker": "^2.4.1"
},
"devDependencies": {
"@nuxtjs/pwa": "^3.3.5",
"node-sass": "^4.14.1",
"sass-loader": "^8.0.2"
}
+2 -467
View File
@@ -10,353 +10,10 @@
</div>
</section>
<section class="s2">
<div class="container">
<div class="row">
<calculation-app :titleTxt="staticData.app.t3"/>
<div class="app m-auto" :class="app.method === 'custom' ? 'col-12 col-lg-9 col-xl-8 col-xxl-6' : 'col-12'">
<div class="container-fluid">
<div class="row">
<calculation-guide-tables/>
<div class="col-12">
<div class="appTitle">
<h2 class="title">{{ staticData.app.t3 }}</h2>
</div>
<div class="appMethod">
<span class="txt">{{ staticData.app.t4 }}</span>
<el-radio-group v-model="app.method" style="direction: ltr">
<template v-if="$route.params.lang === 'fa'">
<el-radio-button label="classified">{{ staticData.app.t5 }}</el-radio-button>
<el-radio-button label="custom">{{ staticData.app.t6 }}</el-radio-button>
</template>
<template v-else>
<el-radio-button label="custom">{{ staticData.app.t6 }}</el-radio-button>
<el-radio-button label="classified">{{ staticData.app.t5 }}</el-radio-button>
</template>
</el-radio-group>
</div>
</div>
<div class="col-12 col-lg-6 mb-5 mb-lg-0" v-if="app.method === 'classified'">
<div class="appLayout">
<h2 class="layoutTitle">{{ staticData.app.t7 }}</h2>
<div class="class">
<h4>{{ staticData.app.t8 }}</h4>
<el-radio v-model="app.vehicleClass" label="class1">{{ staticData.app.t9 }}</el-radio>
</div>
<div class="class">
<h4>{{ staticData.app.t10 }}</h4>
<el-radio v-model="app.vehicleClass" label="class2">{{ staticData.app.t11 }}</el-radio>
<el-radio v-model="app.vehicleClass" label="class3">{{ staticData.app.t12 }}</el-radio>
<el-radio v-model="app.vehicleClass" label="class4">{{ staticData.app.t13 }}</el-radio>
</div>
<div class="class">
<h4>{{ staticData.app.t14 }}</h4>
<el-radio v-model="app.vehicleClass" label="FL1">FL1</el-radio>
<el-radio v-model="app.vehicleClass" label="FL2">FL2</el-radio>
<el-radio v-model="app.vehicleClass" label="FL3">FL3</el-radio>
<el-radio v-model="app.vehicleClass" label="FL4">FL4</el-radio>
<el-radio v-model="app.vehicleClass" label="FL5">FL5</el-radio>
<el-radio v-model="app.vehicleClass" label="FL6">FL6</el-radio>
</div>
</div>
</div>
<div :class="app.method === 'custom' ? 'col-12' : 'col-12 col-lg-6'">
<div class="appLayout">
<h2 class="layoutTitle">{{ staticData.app.t15 }}</h2>
<el-form key="form-a">
<el-form-item :label="staticData.app.t16">
<el-radio-group v-model="app.gratingType">
<el-radio label="forge">{{ staticData.app.t17 }}</el-radio>
<el-radio label="pressured">{{ staticData.app.t18 }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="staticData.app.t19" v-if="app.method === 'custom'">
<el-radio-group v-model="app.loadType">
<el-radio label="pointedLoad">{{ staticData.app.t20 }}</el-radio>
<el-radio label="distributedLoad">{{ staticData.app.t21 }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :class="validation.pointedLoadValue ? 'is-error' : null" :label="staticData.app.t22" v-if="app.method === 'custom' && app.loadType === 'pointedLoad'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.pointedLoadValue" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.pointedLoadValue">{{ validation.pointedLoadValue.msg }}</p>
</el-form-item>
<el-form-item :class="validation.distributedLoadValue ? 'is-error' : null" :label="staticData.app.t23" v-if="app.method === 'custom' && app.loadType === 'distributedLoad'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.distributedLoadValue" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.distributedLoadValue">{{ validation.distributedLoadValue.msg }}</p>
</el-form-item>
<el-form-item :class="validation.bearingBarPitch ? 'is-error' : null" :label="staticData.app.t24">
<el-select v-model="app.bearingBarPitch" key="bearingBarPitch_forge" v-if="app.gratingType === 'forge'"
:placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.bearingBarPitch_forge"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<el-select v-model="app.bearingBarPitch" key="bearingBarPitch_pressured" v-if="app.gratingType === 'pressured'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.bearingBarPitch_pressured"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.bearingBarPitch">{{ validation.bearingBarPitch.msg }}</p>
</el-form-item>
<el-form-item :class="validation.crossBarPitch ? 'is-error' : null" :label="staticData.app.t25">
<el-select v-model="app.crossBarPitch" key="crossBarPitch_forge" v-if="app.gratingType === 'forge'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.crossBarPitch_forge"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<el-select v-model="app.crossBarPitch" key="crossBarPitch_pressured" v-if="app.gratingType === 'pressured'" :placeholder="staticData.app.select">
<el-option
v-for="item in calculationValues.crossBarPitch_pressured"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.crossBarPitch">{{ validation.crossBarPitch.msg }}</p>
</el-form-item>
<el-form-item :class="validation.clearSpan ? 'is-error' : null" :label="staticData.app.t26">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.clearSpan" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.clearSpan">{{ validation.clearSpan.msg }}</p>
</el-form-item>
<el-form-item :class="validation.bearingBarThickness ? 'is-error' : null" :label="staticData.app.t27">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.bearingBarThickness" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.bearingBarThickness">{{ validation.bearingBarThickness.msg }}</p>
</el-form-item>
<!-- cross bar thickness -->
<el-form-item :class="validation.crossBarThickness ? 'is-error' : null" :label="staticData.app.t30" v-if="app.gratingType === 'pressured'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.crossBarThickness" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.crossBarThickness">{{ validation.crossBarThickness.msg }}</p>
</el-form-item>
<!-- cross bar thickness -->
<el-form-item :class="validation.bearingBarHeight ? 'is-error' : null" :label="staticData.app.t28">
<el-select v-model="app.bearingBarHeight"
key="bearingBarHeight"
:placeholder="relativeValues || app.loadType === 'distributedLoad' ? staticData.app.select : staticData.app.t29">
<el-option
v-for="item in app.loadType === 'distributedLoad' ? calculationValues.bearingBarHeight : relativeValues"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<p class="err" v-if="validation.bearingBarHeight">{{ validation.bearingBarHeight.msg }}</p>
</el-form-item>
<!-- cross bar height -->
<el-form-item :class="validation.crossBarHeight ? 'is-error' : null" :label="staticData.app.t31" v-if="app.gratingType === 'pressured'">
<el-input inputmode="numeric" pattern="[0-9]*" v-model="app.crossBarHeight" :placeholder="staticData.app.enter"></el-input>
<p class="err" v-if="validation.crossBarHeight">{{ validation.crossBarHeight.msg }}</p>
</el-form-item>
<!-- cross bar height -->
<div class="calculateBtn">
<button class="btn btn-reverse-fill" @click.prevent="calculate">{{ staticData.app.calculate }}</button>
</div>
</el-form>
<div class="copyRight">
<p>Design And develop by <a href="https://www.negarehagency.com" target="_blank">negarehagency.com</a></p>
</div>
</div>
</div>
<div class="col-12 mt-5">
<div class="appResult" v-if="waiting || appResult || validation">
<p class="waiting" v-if="waiting">{{ staticData.app.waiting }}</p>
<p class="err" v-if="!appResult && !waiting">{{ staticData.app.validationErr }}</p>
<p v-if="appResult" :class="appResult.sigmaStatus ? 'success' : 'failure'">{{ appResult.sigma }}</p>
<p v-if="appResult" :class="appResult.deflectionStatus ? 'success' : 'failure'">{{ appResult.deflection }}</p>
</div>
<div class="weight" v-if="!validation && waiting || appResult">
<p v-if="appResult">{{ staticData.app.t32 }}</p>
<p dir="ltr">
<b class="colored"> {{ appResult.gratingWeight.normal }} </b>
<b> Kg/m<sup>2</sup> </b>
</p>
<br>
<p v-if="appResult">{{ staticData.app.t33 }}</p>
<p dir="ltr">
<b class="colored"> {{ appResult.gratingWeight.galvanized }} </b>
<b> Kg/m<sup>2</sup> </b>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="s3">
<div class="container">
<div class="row">
<div class="col-12">
<div class="tableBox vehicles">
<table>
<thead>
<tr>
<th colspan="4" class="center">{{ staticData.table1.title }}</th>
<th class="middle">{{ staticData.table1.load }}</th>
<th>{{ staticData.table1.imprint }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ staticData.table1.class1.t1 }}</td>
<td>{{ staticData.table1.class1.t2 }}</td>
<td>{{ staticData.table1.class1.t3 }}</td>
<td>{{ staticData.table1.danSqm }}</td>
<td>600</td>
<td>1000 x 1000</td>
</tr>
<tr class="odd">
<td>{{ staticData.table1.class2.t1 }}</td>
<td>{{ staticData.table1.class2.t2 }}</td>
<td>{{ staticData.table1.class2.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>1.000</td>
<td>200 x 200</td>
</tr>
<tr>
<td>{{ staticData.table1.class3.t1 }}</td>
<td>{{ staticData.table1.class3.t2 }}</td>
<td>{{ staticData.table1.class3.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>3.000</td>
<td>200 x 400</td>
</tr>
<tr class="odd">
<td>{{ staticData.table1.class4.t1 }}</td>
<td>{{ staticData.table1.class4.t2 }}</td>
<td>{{ staticData.table1.class4.t3 }}</td>
<td>{{ staticData.table1.danImprint }}</td>
<td>9.000</td>
<td>250 x 600</td>
</tr>
</tbody>
</table>
</div>
<p class="notice">{{ staticData.scrollToSee }}</p>
<div class="tableBox forklifts">
<table>
<thead>
<tr>
<th colspan="6" class="center">{{ staticData.table2.title }}</th>
<th class="middle">{{ staticData.table2.load }}</th>
<th>{{ staticData.table2.imprint }}</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>{{ staticData.table2.t1 }}</td>
<td>{{ staticData.table2.t2 }}</td>
<td>{{ staticData.table2.t3 }}</td>
<td>{{ staticData.table2.t4 }}</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl1.t1 }}</td>
<td>{{ staticData.table2.fl1.t2 }}</td>
<td>21</td>
<td>10</td>
<td>31</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>2600</td>
<td>130 x 130</td>
</tr>
<tr>
<td>{{ staticData.table2.fl2.t1 }}</td>
<td>{{ staticData.table2.fl2.t2 }}</td>
<td>31</td>
<td>15</td>
<td>46</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>4000</td>
<td>175 x 150</td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl3.t1 }}</td>
<td>{{ staticData.table2.fl3.t2 }}</td>
<td>44</td>
<td>25</td>
<td>69</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>6300</td>
<td>200 x 200</td>
</tr>
<tr>
<td>{{ staticData.table2.fl4.t1 }}</td>
<td>{{ staticData.table2.fl4.t2 }}</td>
<td>60</td>
<td>40</td>
<td>100</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>9000</td>
<td>300 x 200</td>
</tr>
<tr class="odd">
<td>{{ staticData.table2.fl5.t1 }}</td>
<td>{{ staticData.table2.fl5.t2 }}</td>
<td>90</td>
<td>60</td>
<td>150</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>14000</td>
<td>375 x 200</td>
</tr>
<tr>
<td>{{ staticData.table2.fl6.t1 }}</td>
<td>{{ staticData.table2.fl6.t2 }}</td>
<td>110</td>
<td>80</td>
<td>190</td>
<td>{{ staticData.table2.danImprint }}</td>
<td>17000</td>
<td>450 x 200</td>
</tr>
</tbody>
</table>
</div>
<p class="notice">{{ staticData.scrollToSee }}</p>
</div>
</div>
</div>
</section>
</div>
</template>
@@ -365,116 +22,12 @@
import {fadeInAnimation} from '~/mixins/animations'
export default {
data() {
return {
app: {
method: 'custom',
gratingType: 'forge',
loadType: 'pointedLoad',
vehicleClass: 'class1',
pointedLoadValue: '',
distributedLoadValue: '',
bearingBarPitch: '',
crossBarPitch: '',
clearSpan: '',
bearingBarThickness: '',
crossBarThickness: '',
bearingBarHeight: '',
crossBarHeight: '',
locale: this.$route.params.lang
},
calculationValues: null,
relativeValues: null,
validation: {},
waiting: false,
appResult: null
}
},
computed: {
staticData() {
return this.$store.state.staticData.calculation[this.$route.params.lang]
},
gratingTypeTrigger() {
return this.app.gratingType
},
crossBarPitchTrigger() {
return this.app.crossBarPitch
},
loadTypeTrigger() {
return this.app.loadType
},
vehicleClassTrigger() {
return this.app.vehicleClass
},
methodTrigger() {
return this.app.method
}
},
watch: {
loadTypeTrigger(newVal, oldVal) {
this.app.bearingBarHeight = ''
},
gratingTypeTrigger(newVal, oldVal) {
this.app.bearingBarPitch = ''
this.app.crossBarPitch = ''
},
crossBarPitchTrigger(newVal, oldVal) {
if (this.app.loadType === 'pointedLoad') {
this.app.bearingBarHeight = ''
const data = {
gratingType: this.app.gratingType,
crossBarPitch: this.app.crossBarPitch
}
this.$axios.post('/api/public/calculation/relativeValues', data)
.then(res => {
this.relativeValues = res.data
})
.catch(err => {
this.relativeValues = null
})
}
},
vehicleClassTrigger(newVal, oldVal) {
this.app.crossBarPitch = ''
if (newVal === 'class1') this.app.loadType = 'distributedLoad'
else this.app.loadType = 'pointedLoad'
},
methodTrigger(newVal, oldVal) {
if (newVal === 'classified') {
this.app.vehicleClass = 'class1'
this.app.loadType = 'distributedLoad'
} else {
this.app.vehicleClass = ''
this.app.loadType = 'pointedLoad'
}
},
waiting() {
setTimeout(() => {
this.$gsap.timeline()
.to($('.app .appResult,.app .weight'), {opacity: 1, paddingTop: 20, paddingBottom: 20, duration: 0.2})
.to($('.app .appResult p,.app .weight p'), {opacity: 1, fontSize: 16, letterSpacing: 0, duration: 0.2}, 0)
}, 100)
}
},
mixins: [fadeInAnimation],
methods: {
calculate() {
this.validation = {}
this.waiting = true
this.appResult = null
setTimeout(() => {
this.$axios.post('/api/public/calculate', this.app)
.then(res => {
this.waiting = false
this.appResult = res.data
})
.catch(err => {
this.waiting = false
if (err.response.status === 422) this.validation = err.response.data.validation
})
}, 2000)
}
},
head() {
return {
htmlAttrs: {
@@ -489,26 +42,8 @@ export default {
}
]
}
},
async asyncData({$axios}) {
const calculationValues = await $axios.get('/api/public/calculation/values')
return {
calculationValues: calculationValues.data
}
}
}
</script>
<style lang="scss">
.el-popper .popper__arrow {
border-width: 0;
filter: none;
left: 35px;
&:lang(fa) {
left: auto;
right: 35px;
}
}
</style>
+40 -3
View File
@@ -129,7 +129,7 @@
<section class="s5">
<img src="~/assets/img/home/hp-s4-i1.jpg" alt="" class="section-bg">
<div class="txt anim-parallax">
<div class="txt anim-fadeIn">
<h2 class="title title-shape">{{ staticData.s4.t1 }} <span>{{ staticData.s4.t2 }}</span></h2>
<p>{{ staticData.s4.t3 }}</p>
<a v-if="catalog && catalog.file" :href="catalog.file[$route.params.lang]" target="_blank" class="btn btn-reverse-fill">{{ staticData.s4.link }}</a>
@@ -146,7 +146,7 @@
<h2 class="title title-shape">{{ staticData.s6.t1 }}</h2>
<p>{{ staticData.s6.t2 }}</p>
<nuxt-link :to="{name: 'lang-calculation',params: {lang: $route.params.lang}}" class="btn btn-primary">{{ staticData.s6.link1 }}</nuxt-link>
<a @click.prevent="notAvailable" :href="calc_app_link" target="_blank" class="btn btn-primary-fill">{{ staticData.s6.link2 }}</a>
<a @click.prevent="dialogVisible = true" :href="calc_app_link" target="_blank" class="btn btn-primary-fill">{{ staticData.s6.link2 }}</a>
</div>
<div class="col-2 img-side d-none d-lg-block">
<img src="~/assets/img/home/hp-s6-i1.png" class="anim-fadeIn" alt="">
@@ -154,6 +154,42 @@
</div>
</div>
</section>
<el-dialog class="install-app-dialog" :title="staticData.s6.link1" :visible.sync="dialogVisible">
<div class="install-app-description">
<h2>{{ staticData.s6.t3 }}</h2>
<p>{{ staticData.s6.t4 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/android-step-1.jpg" :alt="staticData.s6.link2">
</div>
<p>{{ staticData.s6.t5 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/android-step-2.jpg" :alt="staticData.s6.link2">
</div>
<h2>{{ staticData.s6.t6 }}</h2>
<p>{{ staticData.s6.t7 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/ios-step-1.jpg" :alt="staticData.s6.link2">
</div>
<p>{{ staticData.s6.t8 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/ios-step-2.jpg" :alt="staticData.s6.link2">
</div>
<h2>{{ staticData.s6.t9 }}</h2>
<p>{{ staticData.s6.t10 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/desktop-step-1.jpg" :alt="staticData.s6.link2">
</div>
<p>{{ staticData.s6.t11 }}</p>
<div class="imgBox">
<img src="~/assets/img/home/desktop-step-2.jpg" :alt="staticData.s6.link2">
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="dialogVisible = false">{{ staticData.s6.t12 }}</el-button>
</span>
</el-dialog>
</div>
</template>
@@ -168,7 +204,8 @@ export default {
favoriteProducts: null,
catalog: null,
calc_app_link: this.$store.state.staticData.calc_app_link,
validation: []
validation: {},
dialogVisible: false
}
},
computed: {
+34
View File
@@ -0,0 +1,34 @@
<template>
<div class="page calculation--page latin-digits">
<calculation-app/>
<calculation-guide-tables/>
</div>
</template>
<script>
export default {
computed: {
staticData() {
return this.$store.state.staticData.pwa[this.$route.params.lang]
}
},
head() {
return {
htmlAttrs: {
title: this.staticData.title
},
title: this.staticData.title,
meta: [
{
hid: this.staticData.title,
name: 'description',
content: this.staticData.t1
}
]
}
},
layout: 'pwa'
}
</script>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

+44 -2
View File
@@ -114,7 +114,17 @@ export const state = () => ({
t1: 'نرم افزار محاسبه وزن گریتینگ',
t2: 'نرم افزار طراحی شده در این بخش، با انجام محاسبات دقیق، آنالیز وزن و مقاومتی گریتینگ را ارائه می کند، با استفاده از این ابزار انتخاب محصول برای شما آسان تر خواهد بود.',
link1: 'ماژول محاسبات',
link2: 'دانلود نرم افزار'
link2: 'نصب نرم افزار',
t3: 'آموزش نصب در Android',
t4: 'برای نصب نرم افزار اراک ریل در گوشی های اندرویدی ابتدا با مرورگر گوگل کروم وارد سایت اراک ریل شوید و مطابق تصویر زیر دکمه منو را بزنید:',
t5: 'سپس گزینه install app را بزنید و برنامه روی گوشی شما نصب میشود.',
t6: 'آموزش نصب در iOS',
t7: 'برای نصب نرم افزار اراک ریل در گوشی های آیفون ابتدا با مرورگر خود گوشی وارد سایت اراک ریل شوید و مطابق تصویر زیر دکمه اشتراک گزاری را بزنید:',
t8: 'سپس گزینه add to home screen را بزنید و برنامه روی گوشی شما نصب میشود.',
t9: 'آموزش نصب در کامپیوتر',
t10: 'برای نصب نرم افزار اراک ریل در کامپیوتر (Windows,Mac,Linux) ابتدا با مرورگر گوگل کروم وارد سایت اراک ریل شوید و مطابق تصویر زیر دکمه نصب موجود در نوار آدرس را بزنید:',
t11: 'سپس گزینه install را بزنید و برنامه روی کامپیوتر شما نصب میشود.',
t12: 'متوجه شدم'
}
},
en: {
@@ -165,7 +175,17 @@ export const state = () => ({
t1: 'Grating weight calculation software',
t2: "The software designed in this section, by performing accurate calculations, provides weight analysis and grating resistance, using this tool, product selection will be easier for you.",
link1: 'Calculation Module',
link2: 'Download App'
link2: 'Install App',
t3: 'Android installation tutorial',
t4: 'To install Arak Rail software on Android phones, first enter the Arak Rail site with Google Chrome browser and click the menu button according to the image below:',
t5: 'Then click install app and the app will be installed on your phone.',
t6: 'iOS installation tutorial',
t7: 'To install Arak Rail software on iPhones, first enter the Arak Rail site with your phone browser and click the share button as shown below:',
t8: 'Then click the add to home screen option and the app will be installed on your phone.',
t9: 'Computer installation tutorial',
t10: 'To install Arak Rail software on a computer (Windows, Mac, Linux), first enter the Arak Rail site with Google Chrome browser and according to the image below, click the installation button in the address bar:',
t11: 'Then click install and the program will be installed on your computer.',
t12: 'Got it!'
}
}
},
@@ -905,6 +925,28 @@ export const state = () => ({
}
}
}
},
pwa: {
fa: {
title: '',
connection: 'اتصال اینترنت خود را بررسی نمایید.',
t1: 'بدلیل این که وزن گریتینگ ها به واسطه مواردی همچون مشخصات فنی یا همان دیتیل ساخت از جمله نوع گریتینگ،جنس تسمه و اندازه چشمه ها متغیر است،بدین منظور جهت راحتی و سهولت در انجام کار شما مشتری گرامی، شرکت اراک ریل نرم افزار محاسبه وزن و میزان بار قابل تحمل را برای گریتینگ طراحی و در این صفحه قرار داده است.که با داشتن مشخصات فنی گریتینگ مورد نظر خود می‌توانید وزن گریتینگ خود را همراه با گالوانیزه و یا بدون گالوانیزه محاسبه کنید.',
t2: 'توجه داشته باشید که برای بدست آوردن نتایج صحیح محاسبات داخل سرور اصلی اراک ریل انجام میشود و برای محاسبات نیاز به اینترنت دارید.',
t3: 'برای اطلاعات بیشتر راجب گریتینگ و تماس با متخصصین شرکت اراک ریل میتوانید به سایت ',
t4: ' مراجعه فرمایید. ',
t5: 'طراحی و ساخت برنامه توسط نگاره',
t6: 'وزن و مقاومت گریتینگ'
},
en: {
title: '',
connection: 'Check your internet connection.',
t1: 'Due to the fact that the weight of the gratings varies due to items such as technical specifications or construction details such as the type of grating, the type of belt and the size of the springs, for the convenience and ease of your work, dear customer, Arak Rail Company And has designed the amount of tolerable load for the grating and placed it on this page. Having the technical specifications of the grating you want, you can calculate the weight of your grating with or without galvanizing.',
t2: 'Note that in order to get the correct results, the calculations are done inside the main server of Arak Rail and you need internet for the calculations.',
t3: 'For more information about Grating and contacting the experts of Arak Rail Company, you can visit the site ',
t4: '',
t5: 'Design and Develop by Negareh',
t6: 'Grating weight and strength'
}
}
})