Huge rewrite and update of style/layout + theme simplification

master
Mark Moffat 2019-12-26 13:53:21 +10:30
parent 63b7855bf0
commit 32ea7da4da
53 changed files with 1319 additions and 1095 deletions

10
app.js
View File

@ -121,19 +121,19 @@ handlebars = handlebars.create({
},
perRowClass: (numProducts) => {
if(parseInt(numProducts) === 1){
return'col-md-12 col-xl-12 col m12 xl12 product-item';
return'col-md-12 product-item';
}
if(parseInt(numProducts) === 2){
return'col-md-6 col-xl-6 col m6 xl6 product-item';
return'col-md-6 product-item';
}
if(parseInt(numProducts) === 3){
return'col-md-4 col-xl-4 col m4 xl4 product-item';
return'col-md-4 product-item';
}
if(parseInt(numProducts) === 4){
return'col-md-3 col-xl-3 col m3 xl3 product-item';
return'col-md-3 product-item';
}
return'col-md-6 col-xl-6 col m6 xl6 product-item';
return'col-md-6 product-item';
},
menuMatch: (title, search) => {
if(!title || !search){

View File

@ -4,6 +4,12 @@ const cleanCSS = require('gulp-clean-css');
const minify = require('gulp-minify');
const rename = require('gulp-rename');
function less(){
return gulp.src('public/stylesheets/less/**/*.less')
.pipe(less())
.pipe(gulp.dest('./'));
};
function compressJS(){
return src([
'public/javascripts/*.js',
@ -58,4 +64,4 @@ function compressThemeJS(){
};
// run the tasks
gulp.task('default', series(compressJS, compressCss, compressThemeCss, compressThemeJS));
gulp.task('default', series(less, compressJS, compressCss, compressThemeCss, compressThemeJS));

View File

@ -436,9 +436,10 @@ const orderMenu = (req, res) => {
const db = req.app.db;
return getMenu(db)
.then((menu) => {
const menuOrder = req.body['order[]'];
// update the order
for(let i = 0; i < req.body.navId.length; i++){
_.find(menu.items, ['title', req.body.navId[i]]).order = i;
for(let i = 0; i < menuOrder.length; i++){
_.find(menu.items, ['title', menuOrder[i]]).order = i;
}
return db.menu.updateOne({}, { $set: { items: menu.items } }, { upsert: true })
.then(() => {

539
package-lock.json generated
View File

@ -504,6 +504,75 @@
}
}
},
"accord": {
"version": "0.29.0",
"resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz",
"integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==",
"requires": {
"convert-source-map": "^1.5.0",
"glob": "^7.0.5",
"indx": "^0.2.3",
"lodash.clone": "^4.3.2",
"lodash.defaults": "^4.0.1",
"lodash.flatten": "^4.2.0",
"lodash.merge": "^4.4.0",
"lodash.partialright": "^4.1.4",
"lodash.pick": "^4.2.1",
"lodash.uniq": "^4.3.0",
"resolve": "^1.5.0",
"semver": "^5.3.0",
"uglify-js": "^2.8.22",
"when": "^3.7.8"
},
"dependencies": {
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
},
"cliui": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"requires": {
"center-align": "^0.1.1",
"right-align": "^0.1.1",
"wordwrap": "0.0.2"
}
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
},
"uglify-js": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
"requires": {
"source-map": "~0.5.1",
"uglify-to-browserify": "~1.0.0",
"yargs": "~3.10.0"
}
},
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
},
"yargs": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"requires": {
"camelcase": "^1.0.2",
"cliui": "^2.1.0",
"decamelize": "^1.0.0",
"window-size": "0.1.0"
}
}
}
},
"acorn": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
@ -535,6 +604,16 @@
"uri-js": "^4.2.2"
}
},
"align-text": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"requires": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
"repeat-string": "^1.5.2"
}
},
"ansi-align": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
@ -597,7 +676,6 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
"integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
"dev": true,
"requires": {
"ansi-wrap": "0.1.0"
}
@ -624,7 +702,6 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
"integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
"dev": true,
"requires": {
"ansi-wrap": "0.1.0"
}
@ -664,8 +741,7 @@
"ansi-wrap": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
"integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
"dev": true
"integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
},
"anymatch": {
"version": "3.1.1",
@ -743,8 +819,7 @@
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
"dev": true
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
},
"arr-map": {
"version": "2.0.2",
@ -876,6 +951,21 @@
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"optional": true,
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"optional": true
},
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
@ -926,8 +1016,7 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"atob": {
"version": "2.1.2",
@ -1153,6 +1242,18 @@
}
}
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"optional": true
},
"aws4": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz",
"integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==",
"optional": true
},
"axios": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
@ -1291,6 +1392,15 @@
}
}
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"optional": true,
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bcryptjs": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
@ -1656,6 +1766,21 @@
"resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"optional": true
},
"center-align": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"requires": {
"align-text": "^0.1.3",
"lazy-cache": "^1.0.3"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@ -1943,8 +2068,7 @@
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
"dev": true
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
},
"clone-buffer": {
"version": "1.0.0",
@ -2073,7 +2197,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@ -2262,8 +2385,7 @@
"convert-source-map": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
"dev": true
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
},
"convert-to-spaces": {
"version": "1.0.2",
@ -2379,6 +2501,15 @@
"es5-ext": "^0.10.9"
}
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"optional": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"dasherize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
@ -2621,8 +2752,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"depd": {
"version": "1.1.2",
@ -2780,6 +2910,16 @@
"object.defaults": "^1.1.0"
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"optional": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -2832,6 +2972,15 @@
"integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=",
"dev": true
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
"optional": true,
"requires": {
"prr": "~1.0.1"
}
},
"error-ex": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
@ -3654,8 +3803,7 @@
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extend-shallow": {
"version": "3.0.2",
@ -3760,6 +3908,12 @@
}
}
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"optional": true
},
"fancy-log": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
@ -4065,11 +4219,16 @@
"for-in": "^1.0.1"
}
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"optional": true
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
@ -4174,6 +4333,15 @@
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
"dev": true
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"optional": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
@ -5044,6 +5212,20 @@
}
}
},
"gulp-less": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz",
"integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==",
"requires": {
"accord": "^0.29.0",
"less": "2.6.x || ^3.7.1",
"object-assign": "^4.0.1",
"plugin-error": "^0.1.2",
"replace-ext": "^1.0.0",
"through2": "^2.0.0",
"vinyl-sourcemaps-apply": "^0.2.0"
}
},
"gulp-minify": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz",
@ -5084,6 +5266,22 @@
"uglify-js": "^3.1.4"
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"optional": true
},
"har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"optional": true,
"requires": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -5281,6 +5479,17 @@
"toidentifier": "1.0.0"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"optional": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"https-proxy-agent": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
@ -5350,6 +5559,12 @@
"integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
"dev": true
},
"image-size": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
"optional": true
},
"import-fresh": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
@ -5396,6 +5611,11 @@
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
"indx": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz",
"integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@ -5545,8 +5765,7 @@
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-builtin-module": {
"version": "1.0.0",
@ -5777,8 +5996,7 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-unc-path": {
"version": "1.0.0",
@ -5836,6 +6054,12 @@
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"optional": true
},
"js-string-escape": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
@ -5857,6 +6081,12 @@
"esprima": "^4.0.0"
}
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"optional": true
},
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@ -5875,6 +6105,12 @@
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"optional": true
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@ -5886,6 +6122,12 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"optional": true
},
"json5": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
@ -5903,6 +6145,18 @@
}
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"optional": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"just-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
@ -5927,7 +6181,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@ -5951,6 +6204,11 @@
"package-json": "^6.3.0"
}
},
"lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
},
"lazystream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
@ -5978,6 +6236,33 @@
"flush-write-stream": "^1.0.2"
}
},
"less": {
"version": "3.10.3",
"resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz",
"integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==",
"requires": {
"clone": "^2.1.2",
"errno": "^0.1.1",
"graceful-fs": "^4.1.2",
"image-size": "~0.5.0",
"mime": "^1.4.1",
"mkdirp": "^0.5.0",
"promise": "^7.1.1",
"request": "^2.83.0",
"source-map": "~0.6.0"
},
"dependencies": {
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"optional": true,
"requires": {
"asap": "~2.0.3"
}
}
}
},
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@ -6058,6 +6343,11 @@
"resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
"integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU="
},
"lodash.clone": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
"integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y="
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
@ -6125,6 +6415,11 @@
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
},
"lodash.partialright": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz",
"integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs="
},
"lodash.pick": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
@ -6150,6 +6445,11 @@
"resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
"integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
},
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
},
"lodash.unset": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz",
@ -6164,6 +6464,11 @@
"chalk": "^2.0.1"
}
},
"longest": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
},
"loud-rejection": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz",
@ -6466,8 +6771,7 @@
"mime": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
"dev": true
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
},
"mime-db": {
"version": "1.42.0",
@ -6490,7 +6794,6 @@
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true,
"requires": {
"mime-db": "~1.37.0"
},
@ -6498,8 +6801,7 @@
"mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
"dev": true
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
}
}
},
@ -6832,6 +7134,12 @@
"resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz",
"integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY="
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"optional": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -7281,8 +7589,7 @@
"path-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
"dev": true
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
},
"path-root": {
"version": "0.1.1",
@ -7329,6 +7636,12 @@
"semver": "^5.0.3"
}
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"optional": true
},
"picomatch": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
@ -7474,7 +7787,6 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
"integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
"dev": true,
"requires": {
"ansi-cyan": "^0.1.1",
"ansi-red": "^0.1.1",
@ -7487,7 +7799,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
"integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
"dev": true,
"requires": {
"arr-flatten": "^1.0.1",
"array-slice": "^0.2.3"
@ -7496,20 +7807,17 @@
"arr-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
"integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
"dev": true
"integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0="
},
"array-slice": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
"integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
"dev": true
"integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU="
},
"extend-shallow": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
"integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
"dev": true,
"requires": {
"kind-of": "^1.1.0"
}
@ -7517,8 +7825,7 @@
"kind-of": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
"integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
"dev": true
"integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ="
}
}
},
@ -7645,12 +7952,24 @@
"ipaddr.js": "1.9.0"
}
},
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"optional": true
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"psl": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz",
"integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==",
"optional": true
},
"pump": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
@ -7680,8 +7999,7 @@
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"quick-lru": {
"version": "1.1.0",
@ -8020,14 +8338,12 @@
"repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
"replace-ext": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
},
"replace-homedir": {
"version": "1.0.0",
@ -8040,6 +8356,42 @@
"remove-trailing-separator": "^1.1.0"
}
},
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"optional": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.0",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.4.3",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
"optional": true
}
}
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@ -8070,7 +8422,6 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
"integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
"dev": true,
"requires": {
"path-parse": "^1.0.5"
}
@ -8153,6 +8504,14 @@
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
"right-align": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"requires": {
"align-text": "^0.1.1"
}
},
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
@ -8669,6 +9028,23 @@
"number-is-nan": "^1.0.0"
}
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"optional": true,
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@ -9051,7 +9427,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
"dev": true,
"requires": {
"readable-stream": "^2.1.5",
"xtend": "~4.0.1"
@ -9155,6 +9530,24 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"optional": true,
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
},
"dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"optional": true
}
}
},
"trim-newlines": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
@ -9179,6 +9572,21 @@
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
"dev": true
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"optional": true,
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"optional": true
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@ -9247,6 +9655,12 @@
"source-map": "~0.6.1"
}
},
"uglify-to-browserify": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"optional": true
},
"uglifycss": {
"version": "0.0.27",
"resolved": "https://registry.npmjs.org/uglifycss/-/uglifycss-0.0.27.tgz",
@ -9494,6 +9908,12 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
"integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
"optional": true
},
"v8-compile-cache": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
@ -9530,6 +9950,17 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"optional": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"vinyl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
@ -9596,7 +10027,6 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
"integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
"dev": true,
"requires": {
"source-map": "^0.5.1"
},
@ -9604,8 +10034,7 @@
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
}
}
},
@ -9624,6 +10053,11 @@
"integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
"dev": true
},
"when": {
"version": "3.7.8",
"resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
"integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
},
"which": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
@ -9681,6 +10115,11 @@
}
}
},
"window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
},
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",

View File

@ -43,6 +43,7 @@
"express-rate-limit": "^5.0.0",
"express-session": "^1.17.0",
"glob": "^7.1.5",
"gulp-less": "^4.0.1",
"helmet": "^3.21.2",
"html-entities": "^1.2.0",
"i18n": "^0.8.4",
@ -80,6 +81,7 @@
"gulp-clean-css": "^3.10.0",
"gulp-minify": "^3.1.0",
"gulp-rename": "^1.4.0",
"less": "^3.10.3",
"mime-db": "^1.42.0",
"supertest": "^3.4.2",
"supertest-session": "^4.0.0"

View File

@ -48,12 +48,12 @@ $(document).ready(function (){
var html = '<li class="list-group-item">';
html += '<div class="row">';
html += '<div class="col-lg-2 opt-name">' + optName + '</div>';
html += '<div class="col-lg-2">' + optLabel + '</div>';
html += '<div class="col-lg-2">' + optType + '</div>';
html += '<div class="col-lg-4">' + optOptions + '</div>';
html += '<div class="col-lg-2 text-right">';
html += '<button class="product_opt_remove btn btn-danger btn-sm">Remove</button>';
html += '<div class="col-sm-2 opt-name">' + optName + '</div>';
html += '<div class="col-sm-2">' + optLabel + '</div>';
html += '<div class="col-sm-2">' + optType + '</div>';
html += '<div class="col-sm-4">' + optOptions + '</div>';
html += '<div class="col-sm-2 text-right">';
html += '<button class="product_opt_remove btn btn-outline-danger">Remove</button>';
html += '</div></div></li>';
// append data
@ -252,31 +252,35 @@ $(document).ready(function (){
});
$('.btn-delete-image').on('click', function(){
$.ajax({
method: 'POST',
url: '/admin/product/deleteimage',
data: { product_id: $('#productId').val(), productImage: $(this).attr('data-id') }
})
.done(function(msg){
showNotification(msg.message, 'success', true);
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger');
});
if(confirm('Are you sure you want to delete this image?')){
$.ajax({
method: 'POST',
url: '/admin/product/deleteimage',
data: { product_id: $('#productId').val(), productImage: $(this).attr('data-id') }
})
.done(function(msg){
showNotification(msg.message, 'success', true);
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger');
});
}
});
$('.btn-delete-product').on('click', function(){
$.ajax({
method: 'POST',
url: '/admin/product/delete',
data: { productId: $(this).attr('data-id') }
})
.done(function(msg){
showNotification(msg.message, 'success', true);
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger');
});
if(confirm('Are you sure you want to delete this product?')){
$.ajax({
method: 'POST',
url: '/admin/product/delete',
data: { productId: $(this).attr('data-id') }
})
.done(function(msg){
showNotification(msg.message, 'success', true);
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger');
});
}
});
// Call to API to check if a permalink is available
@ -544,6 +548,28 @@ $(document).ready(function (){
}
});
if($('#draggable_list').length){
$('#draggable_list').sortable({
update: function (){
var menuOrder = [];
$('.navId').each(function(val){
menuOrder.push($($('.navId')[val]).val());
});
$.ajax({
data: { order: menuOrder },
type: 'POST',
url: '/admin/settings/menu/save_order'
})
.done(function(){
showNotification('Menu order saved', 'success', true);
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger', true);
});
}
});
}
$(document).on('click', '#uploadButton', function(e){
e.preventDefault();
var formData = new FormData($('#uploadForm')[0]);

File diff suppressed because one or more lines are too long

View File

@ -40,23 +40,23 @@ $(document).ready(function (){
}
});
$('.shipping-form input').each(function(e){
$(this).wrap('<fieldset></fieldset>');
var tag = $(this).attr('placeholder');
$(this).after('<label for="name" class="hidden">' + tag + '</label>');
});
// $('.shipping-form input').each(function(e){
// $(this).wrap('<fieldset></fieldset>');
// var tag = $(this).attr('placeholder');
// $(this).after('<label for="name" class="hidden">' + tag + '</label>');
// });
$('.shipping-form input').on('focus', function(){
$(this).next().addClass('floatLabel');
$(this).next().removeClass('hidden');
});
// $('.shipping-form input').on('focus', function(){
// $(this).next().addClass('floatLabel');
// $(this).next().removeClass('hidden');
// });
$('.shipping-form input').on('blur', function(){
if($(this).val() === ''){
$(this).next().addClass('hidden');
$(this).next().removeClass('floatLabel');
}
});
// $('.shipping-form input').on('blur', function(){
// if($(this).val() === ''){
// $(this).next().addClass('hidden');
// $(this).next().removeClass('floatLabel');
// }
// });
$(document).on('click', '.menu-btn', function(e){
e.preventDefault();
@ -76,27 +76,25 @@ $(document).ready(function (){
$(this).toggleClass('hover');
});
if($('.product-title').length){
$('.product-title').dotdotdot({
ellipsis: '...'
});
}
$(document).on('click', '.btn-qty-minus', function(e){
e.preventDefault();
var qtyElement = $(e.target).parent().parent().find('.cart-product-quantity');
// console.log('qtyElement', qtyElement);
$(qtyElement).val(parseInt(qtyElement.val()) - 1);
cartUpdate(qtyElement);
});
$(document).on('click', '.btn-qty-add', function(e){
e.preventDefault();
var qtyElement = $(e.target).parent().parent().find('.cart-product-quantity');
$(qtyElement).val(parseInt(qtyElement.val()) + 1);
cartUpdate(qtyElement);
});
$(document).on('change', '.cart-product-quantity', function (e){
cartUpdate(e.target);
});
// $(document).on('change', '.cart-product-quantity', function (e){
// console.log('test');
// cartUpdate(e.target);
// });
$(document).on('click', '.btn-delete-from-cart', function(e){
deleteFromCart($(e.target));
@ -123,9 +121,14 @@ $(document).ready(function (){
maxVisible: 5,
href: pagerHref,
wrapClass: 'pagination',
prevClass: 'waves-effect',
nextClass: 'waves-effect',
activeClass: 'pag-active waves-effect'
prevClass: 'page-item previous',
nextClass: 'page-item next',
activeClass: 'page-item active'
});
// Fix for Bootstrap 4
$('#pager a').each(function(){
$(this).addClass('page-link');
});
}
}
@ -409,7 +412,7 @@ $(document).ready(function (){
$('#input_notify_messageType').val('');
// alert
showNotification(messageVal, messageTypeVal, false);
showNotification(messageVal, messageTypeVal || 'danger', false);
}
});
@ -443,6 +446,7 @@ function deleteFromCart(element){
}
function cartUpdate(element){
console.log('element', element.val());
if($(element).val() > 0){
if($(element).val() !== ''){
updateCart();
@ -462,6 +466,8 @@ function updateCart(){
});
});
console.log('cartItems', cartItems)
// update cart on server
$.ajax({
method: 'POST',

View File

@ -1,3 +1,9 @@
.btn-outline-danger, .btn-warning, .btn-outline-primary {
color: #ffffff !important;
background-color: #000000;
border-color: #000000;
}
.search-bar-input, #frm_search, .search-bar-input .btn{
padding-top: 10px;
height: 45px;
@ -38,7 +44,7 @@
padding-left: 0;
}
.product_wrapper>a:hover{
.product-wrapper>a:hover{
color: #cc4135 !important;
}
@ -55,12 +61,15 @@
background-color: #cc4135 !important;
}
/* Fixes summernote editor issue: https://github.com/summernote/summernote/issues/2516 */
body .popover{display:none !important; }
.navbar-brand{
color: #cc4135 !important;
letter-spacing: 4px;
padding-left: 20px !important;
padding-top: 20px !important;
height: 100px !important;
padding-top: 0 !important;
height: 80px !important;
font-size: 55px !important;
}

View File

@ -1,270 +0,0 @@
/*
* CSS file with Bootstrap grid classes for screens bigger than 1600px. Just add this file after the Bootstrap CSS file and you will be able to juse col-xl, col-xl-push, hidden-xl, etc.
*
* Author: Marc van Nieuwenhuijzen
* Company: WebVakman
* Site: WebVakman.nl
*
*/
@media (min-width: 1200px) and (max-width: 1599px) {
.hidden-lg {
display: none !important;
}
}
.visible-xl-block,
.visible-xl-inline,
.visible-xl-inline-block,
.visible-xl{
display: none !important;
}
@media (min-width: 1600px) {
.container {
width: 1570px;
}
.col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 {
float: left;
}
.col-xl-12 {
width: 100%;
}
.col-xl-11 {
width: 91.66666667%;
}
.col-xl-10 {
width: 83.33333333%;
}
.col-xl-9 {
width: 75%;
}
.col-xl-8 {
width: 66.66666667%;
}
.col-xl-7 {
width: 58.33333333%;
}
.col-xl-6 {
width: 50%;
}
.col-xl-5 {
width: 41.66666667%;
}
.col-xl-4 {
width: 33.33333333%;
}
.col-xl-3 {
width: 25%;
}
.col-xl-2 {
width: 16.66666667%;
}
.col-xl-1 {
width: 8.33333333%;
}
.col-xl-pull-12 {
right: 100%;
}
.col-xl-pull-11 {
right: 91.66666667%;
}
.col-xl-pull-10 {
right: 83.33333333%;
}
.col-xl-pull-9 {
right: 75%;
}
.col-xl-pull-8 {
right: 66.66666667%;
}
.col-xl-pull-7 {
right: 58.33333333%;
}
.col-xl-pull-6 {
right: 50%;
}
.col-xl-pull-5 {
right: 41.66666667%;
}
.col-xl-pull-4 {
right: 33.33333333%;
}
.col-xl-pull-3 {
right: 25%;
}
.col-xl-pull-2 {
right: 16.66666667%;
}
.col-xl-pull-1 {
right: 8.33333333%;
}
.col-xl-pull-0 {
right: auto;
}
.col-xl-push-12 {
left: 100%;
}
.col-xl-push-11 {
left: 91.66666667%;
}
.col-xl-push-10 {
left: 83.33333333%;
}
.col-xl-push-9 {
left: 75%;
}
.col-xl-push-8 {
left: 66.66666667%;
}
.col-xl-push-7 {
left: 58.33333333%;
}
.col-xl-push-6 {
left: 50%;
}
.col-xl-push-5 {
left: 41.66666667%;
}
.col-xl-push-4 {
left: 33.33333333%;
}
.col-xl-push-3 {
left: 25%;
}
.col-xl-push-2 {
left: 16.66666667%;
}
.col-xl-push-1 {
left: 8.33333333%;
}
.col-xl-push-0 {
left: auto;
}
.col-xl-offset-12 {
margin-left: 100%;
}
.col-xl-offset-11 {
margin-left: 91.66666667%;
}
.col-xl-offset-10 {
margin-left: 83.33333333%;
}
.col-xl-offset-9 {
margin-left: 75%;
}
.col-xl-offset-8 {
margin-left: 66.66666667%;
}
.col-xl-offset-7 {
margin-left: 58.33333333%;
}
.col-xl-offset-6 {
margin-left: 50%;
}
.col-xl-offset-5 {
margin-left: 41.66666667%;
}
.col-xl-offset-4 {
margin-left: 33.33333333%;
}
.col-xl-offset-3 {
margin-left: 25%;
}
.col-xl-offset-2 {
margin-left: 16.66666667%;
}
.col-xl-offset-1 {
margin-left: 8.33333333%;
}
.col-xl-offset-0 {
margin-left: 0;
}
.visible-xl {
display: block !important;
}
table.visible-xl {
display: table;
}
tr.visible-xl {
display: table-row !important;
}
th.visible-xl, td.visible-xl {
display: table-cell !important;
}
.visible-xl-block {
display: block !important;
}
.visible-xl-inline {
display: inline !important;
}
.visible-xl-inline-block {
display: inline-block !important;
}
.hidden-xl {
display: none !important;
}
}

View File

@ -1 +0,0 @@
@media (min-width:1200px) and (max-width:1599px){.hidden-lg{display:none!important}}.visible-xl,.visible-xl-block,.visible-xl-inline,.visible-xl-inline-block{display:none!important}@media (min-width:1600px){.container{width:1570px}.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}.visible-xl{display:block!important}table.visible-xl{display:table}tr.visible-xl{display:table-row!important}td.visible-xl,th.visible-xl{display:table-cell!important}.visible-xl-block{display:block!important}.visible-xl-inline{display:inline!important}.visible-xl-inline-block{display:inline-block!important}.hidden-xl{display:none!important}}

View File

@ -91,7 +91,7 @@ a.text-danger:hover, a.text-danger:focus {
width: auto;
}
.thumbnail-image-container .img-responsive {
.thumbnail-image-container .img-fluid {
display: block;
width: auto;
max-height: 100%;
@ -118,7 +118,7 @@ input[type=number]::-webkit-outer-spin-button {
align-items: center;
}
.title-image-container .img-responsive {
.title-image-container .img-fluid {
display: block;
width: auto;
max-height: 100%;
@ -193,6 +193,18 @@ input[type=number]::-webkit-outer-spin-button {
padding-right: 0px;
}
.top-marg-10{
margin-top: 10px;
}
.top-marg-15{
margin-top: 15px;
}
.top-marg-20{
margin-top: 20px;
}
.top-pad-10{
padding-top: 10px;
}
@ -201,10 +213,38 @@ input[type=number]::-webkit-outer-spin-button {
padding-top: 20px;
}
.top-pad-50{
padding-top: 50px;
}
.top-pad-100{
padding-top: 100px;
}
.bottom-pad-10{
padding-bottom: 10px;
}
.bottom-pad-15{
padding-bottom: 15px;
}
.bottom-pad-20{
padding-bottom: 20px;
}
.bottom-marg-10{
margin-bottom: 10px;
}
.bottom-marg-15{
margin-bottom: 15px;
}
.bottom-marg-20{
margin-bottom: 20px;
}
.left-pad-30{
padding-left: 30px;
}
@ -230,6 +270,11 @@ input[type=number]::-webkit-outer-spin-button {
padding-right: 5px;
}
.breadcrumb{
background-color: #f8f9fa;
margin-top: 10px;
}
.breadcrumbProPerRow-3{
margin-left: 10px;
margin-right: 10px;
@ -261,11 +306,6 @@ input[type=number]::-webkit-outer-spin-button {
font-size: 19px;
}
.customer-details{
padding-left: 0px;
padding-right: 0px;
}
.file-form{
padding-left: 15px;
padding-right: 15px;
@ -293,7 +333,6 @@ input[type=number]::-webkit-outer-spin-button {
width: 100%;
text-align: center;
font-size: 22px;
color: white;
}
.input-group .form-control {
@ -404,18 +443,13 @@ input.form-control.customerDetails{
color: #000000;
}
.alert-success{
background-color: #000000;
opacity: 0.65;
}
.btn-danger, .btn-warning, .btn-primary {
.btn-outline-danger, .btn-warning, .btn-outline-primary {
color: #ffffff;
background-color: #000000;
border-color: #000000;
}
.btn-warning:hover, .btn-danger:hover {
.btn-warning:hover, .btn-outline-danger:hover {
color: #ffffff;
background-color: #000000;
border-color: #000000;
@ -459,22 +493,13 @@ a {
border-color: #000000;
}
.pagination>.disabled>span, .pagination>.disabled>span:hover, .pagination>.disabled>span:focus, .pagination>.disabled>a, .pagination>.disabled>a:hover, .pagination>.disabled>a:focus {
background-color: #000000;
.page-item.disabled .page-link{
color:#b7b7b7;
}
.pagination>li>a, .pagination>li>span {
background-color: #000000;
}
.pagination>.active>a, .pagination>.active>span, .pagination>.active>a:hover, .pagination>.active>span:hover, .pagination>.active>a:focus, .pagination>.active>span:focus {
background-color: #000000;
opacity: 0.65;
}
.pagination>li>a:hover, .pagination>li>span:hover, .pagination>li>a:focus, .pagination>li>span:focus {
background-color: #000000;
opacity: 0.65;
.page-link {
color: white;
border: 0;
}
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
@ -494,24 +519,6 @@ a {
border-top-left-radius: 0px;
}
.form-control {
border-radius: 0px;
}
.btn {
border-radius: 0px;
}
.pagination>li:first-child>a, .pagination>li:first-child>span{
border-bottom-left-radius: 0px;
border-top-left-radius: 0px;
}
.pagination>li:last-child>a, .pagination>li:last-child>span {
border-bottom-right-radius: 0px;
border-top-right-radius: 0px;
}
@media only screen and (min-width: 768px){
.pushy {
width: 700px;
@ -561,7 +568,8 @@ a {
}
.product-title{
padding-top: 25px;
font-size: 18px;
padding-top: 18px;
min-height: auto;
}

File diff suppressed because one or more lines are too long

View File

@ -349,7 +349,7 @@ router.post('/admin/settings/menu/save_order', restrict, checkAccess, (req, res)
res.status(400).json({ message: 'Failed saving menu order' });
return;
}
res.status(200);
res.status(200).json({});
});
// validate the permalink

View File

@ -180,6 +180,7 @@ router.get('/checkout/payment', (req, res) => {
paymentType,
cartSize: 'part',
cartClose: true,
cartReadOnly: true,
page: 'checkout-information',
countryList,
message: clearSessionValue(req.session, 'message'),
@ -250,12 +251,16 @@ router.post('/product/updatecart', (req, res, next) => {
let hasError = false;
let stockError = false;
console.log('cartItems', cartItems);
// Check cart exists
if(!req.session.cart){
emptyCart(req, res, 'json', 'There are no items if your cart or your cart is expired');
return;
}
console.log('req.session.cart', req.session.cart);
async.eachSeries(cartItems, async (cartItem, callback) => {
// Find index in cart
const cartIndex = _.findIndex(req.session.cart, { productId: cartItem.productId });
@ -265,6 +270,8 @@ router.post('/product/updatecart', (req, res, next) => {
if(typeof productQuantity === 'string'){
productQuantity = parseInt(productQuantity);
}
console.log('productQuantity', productQuantity);
if(productQuantity === 0){
// quantity equals zero so we remove the item
req.session.cart.splice(cartIndex, 1);

View File

@ -1,8 +1,10 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-lg-10">
<div class="row">
<div class="col-sm-9">
<div class="col-sm-10">
<div class="page-header">
<h2>Dashboard</h2>
</div>
</div>
</div>
</div>

View File

@ -1,87 +1,84 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="row">
<form method="post" class="form-horizontal" id="customer-form" role="form" data-toggle="validator" novalidate="false">
<div class="col-xs-12 col-md-12">
<div class="col-sm-9 top-pad-10">
<form method="post" class="form-horizontal" id="customer-form" role="form" data-toggle="validator" novalidate="false">
<div class="row">
<div class="col-sm-10">
<div class="page-header">
<div class="pull-right">
<button class="btn btn-success" id="updateCustomer">Save customer <i class="fa fa-floppy-o"></i></button>
</div>
<div class="pull-right">
<button id="deleteCustomer" onclick="return confirm('Are you sure you want to delete this customer?');" class="btn btn-info">Delete customer <i class="fa fa-trash"></i></button>
<div class="btn-group float-right" role="group" aria-label="Basic example">
<button class="btn btn-outline-success" id="updateCustomer">Save customer <i class="fa fa-floppy-o"></i></button>
<button id="deleteCustomer" onclick="return confirm('Are you sure you want to delete this customer?');" class="btn btn-outline-info">Delete customer <i class="fa fa-trash"></i></button>
</div>
<h2>Customer</h2>
</div>
</div>
<div class="col-sm-10">
<div class="form-group">
<label class="col-sm-2 control-label">Email *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="email" id="email" value={{result.email}} required>
</div>
<label class="control-label">Email *</label>
<input type="text" class="form-control" name="email" id="email" value={{result.email}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "First name" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="firstName" id="firstName" value={{result.firstName}} required>
</div>
<label class="control-label">{{ @root.__ "First name" }} *</label>
<input type="text" class="form-control" name="firstName" id="firstName" value={{result.firstName}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Last name" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="lastName" id="lastName" value={{result.lastName}} required>
</div>
<label class="control-label">{{ @root.__ "Last name" }} *</label>
<input type="text" class="form-control" name="lastName" id="lastName" value={{result.lastName}} required>
</div>
</div>
<div class="col-sm-10">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Address 1" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="address1" id="address1" value={{result.address1}} required>
</div>
<label class="control-label">{{ @root.__ "Address 1" }} *</label>
<input type="text" class="form-control" name="address1" id="address1" value={{result.address1}} required>
</div>
</div>
<div class="col-sm-10">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Address 2" }}</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="address2" id="address2" value={{result.address2}}>
</div>
<label class="control-label">{{ @root.__ "Address 2" }}</label>
<input type="text" class="form-control" name="address2" id="address2" value={{result.address2}}>
</div>
</div>
<div class="col-sm-10">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Country" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="country" id="country" value={{result.country}} required>
</div>
<label class="control-label">{{ @root.__ "Country" }} *</label>
<input type="text" class="form-control" name="country" id="country" value={{result.country}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "State" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="state" id="state" value={{result.state}} required>
</div>
<label class="control-label">{{ @root.__ "State" }} *</label>
<input type="text" class="form-control" name="state" id="state" value={{result.state}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Postcode" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="postcode" id="postcode" value={{result.postcode}} required>
</div>
<label class="control-label">{{ @root.__ "Postcode" }} *</label>
<input type="text" class="form-control" name="postcode" id="postcode" value={{result.postcode}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Phone number" }} *</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="phone" id="phone" value={{result.phone}} required>
</div>
<label class="control-label">{{ @root.__ "Phone number" }} *</label>
<input type="text" class="form-control" name="phone" id="phone" value={{result.phone}} required>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Password" }}</label>
<div class="col-sm-10">
<input type="password" class="form-control" name="password" id="password">
<p class="help-block">Only populate if wanting to reset the customers password</p>
</div>
<label class="control-label">{{ @root.__ "Password" }}</label>
<input type="password" class="form-control" name="password" id="password">
<p class="help-block">Only populate if wanting to reset the customers password</p>
</div>
</div>
<div class="col-sm-10">
<div class="form-group">
<label class="col-sm-2 control-label">{{ @root.__ "Creation date" }}</label>
<div class="col-sm-10">
<input type="text" class="form-control" value="{{formatDate result.created "DD/MM/YYYY hh:mmA"}}" readonly>
</div>
<label class="control-label">{{ @root.__ "Creation date" }}</label>
<input type="text" class="form-control" value="{{formatDate result.created "DD/MM/YYYY hh:mmA"}}" readonly>
</div>
</div>
<input type="hidden" name="customerId" id="customerId" value="{{result._id}}">
</form>
</div>
</div>
</form>
</div>

View File

@ -1,20 +1,20 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-lg-12">
<div class="col-sm-9">
<div class="col-sm-12">
<h2>Customers</h2>
</div>
<div class="col-lg-12 search_bar">
<div class="col-sm-12 search_bar">
<div class="input-group">
<input type="text" name="customer_filter" id="customer_filter" class="form-control input-lg" placeholder="Filter customers">
<span class="input-group-btn">
<button class="btn btn-success btn-lg" id="btn_customer_filter">Filter</button>
<a href="/admin/customers" class="hidden-xs btn btn-warning btn-lg"><i class="fa fa-times" aria-hidden="true"></i></a>
</span>
<input type="text" name="customer_filter" id="customer_filter" class="form-control" placeholder="Filter customers">
<div class="input-group-append">
<button type="button" class="btn btn-outline-success" id="btn_customer_filter">Filter</button>
<a href="/admin/customers" class="hidden-xs btn btn-outline-warning"><i class="fa fa-times" aria-hidden="true"></i></a>
</div>
</div>
<p class="text-warning top-pad-10">{{ @root.__ "Customers can be filtered by: email, name or phone number" }}</p>
</div>
{{#if customers}}
<div class="col-lg-12">
<div class="col-sm-12">
<ul class="list-group">
<li class="list-group-item">
<strong>
@ -26,32 +26,34 @@
</li>
<li class="list-group-item">
<div class="row">
<div class="col-md-4">
<h5 class="text-info"><strong>{{ @root.__ "Email address" }}</strong></h5>
<div class="col-sm-6">
<h6 class="text-info"><strong>{{ @root.__ "Email address" }}</strong></h6>
</div>
<div class="col-md-4">
<h5 class="text-info"><strong>{{ @root.__ "Name" }}</strong></h5>
<div class="col-sm-3">
<h6 class="text-info"><strong>{{ @root.__ "Name" }}</strong></h6>
</div>
<div class="col-md-4">
<h5 class="text-info"><strong>{{ @root.__ "Phone number" }}</strong></h5>
<div class="col-sm-3">
<h6 class="text-info"><strong>{{ @root.__ "Phone number" }}</strong></h6>
</div>
</div>
</li>
{{#each customers}}
<li class="list-group-item">
<div class="row">
<a href="/admin/customer/view/{{this._id}}">
<div class="col-md-4">
<h5 class="">{{this.email}}</h5>
<div class="row">
<div class="col-sm-6">
<h6 class="">{{this.email}}</h6>
</div>
<div class="col-md-4">
<h5 class="">{{this.firstName}} {{this.lastName}}</h5>
<div class="col-sm-3">
<h6 class="">{{this.firstName}} {{this.lastName}}</h6>
</div>
<div class="col-md-4">
<h5 class="">{{this.phone}}</h5>
<div class="col-sm-3">
<h6 class="">{{this.phone}}</h6>
</div>
</div>
</a>
</div>
</li>
{{/each}}
</ul>

View File

@ -1,6 +1,6 @@
<div class="col-md-12">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="col-md-6 offset-md-3">
<h1 class="text-center">{{message}}</h1>
</div>
</div>

View File

@ -1,9 +1,9 @@
<div class="col-md-offset-4 col-md-4 col-lg-offset-4 col-lg-4" style="padding-top: 100px" >
<div class="col-md-4 ffset-md-4 top-pad-100">
<form class="form-signin" id="customerForgotten" data-toggle="validator">
<h2 class="form-signin-heading">{{ @root.__ "Please enter your email address" }}</h2>
<div class="form-group">
<input type="email" id="email" class="form-control" placeholder="email address" required autofocus>
</div>
<button class="btn btn-lg btn-primary btn-block">{{ @root.__ "Reset" }}</button>
<button class="btn btn-outline-primary btn-block">{{ @root.__ "Reset" }}</button>
</form>
</div>

View File

@ -18,8 +18,7 @@
<meta name="description" content="{{config.cartDescription}}">
{{/if}}
<meta name="keywords" content="{{config.cartTitle}}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/flatly/bootstrap.min.css">
<link rel="stylesheet" href="/stylesheets/bootstrap-xl.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha256-L/W5Wfqfa0sdBNIKN9cG6QA5F2qx4qICmU2VgLruv9Y=" crossorigin="anonymous" />
<link rel="stylesheet" href="/stylesheets/pushy.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.20.2/codemirror.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
@ -30,12 +29,13 @@
{{#if admin}}
<link rel="stylesheet" href="/stylesheets/admin{{config.env}}.css">
{{/if}}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha256-WqU1JavFxSAMcLP2WIOI+GB2zWmShMI82mTpLDcqFUg=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.20.2/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.20.2/mode/css/css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.20.2/mode/xml/xml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
<script src="/javascripts/jquery.bootpag.min.js"></script>
<script src="/javascripts/cssbeautify.min.js"></script>
@ -47,7 +47,6 @@
{{#if admin}}
<script src="/javascripts/admin{{config.env}}.js"></script>
{{/if}}
<script src="/javascripts/jquery.dotdotdot.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-tokenfield/0.12.0/bootstrap-tokenfield.min.js"></script>
<!-- SEO data -->
<link rel="canonical" href="{{config.baseUrl}}" />
@ -67,6 +66,7 @@
"url": "{{config.baseUrl}}"
}
</script>
<!-- SEO data -->
{{#if config.googleAnalytics}}{{{config.googleAnalytics}}}{{/if}}
{{#if config.customCss}}<style>{{{config.customCss}}}</style>{{/if}}
{{#if admin}}
@ -77,7 +77,6 @@
<script src="/{{config.theme}}/index{{config.env}}.js"></script>
{{/if}}
{{/if}}
<!-- SEO data -->
</head>
{{#if admin}}
<body class="admin">
@ -85,65 +84,46 @@
<body>
{{/if}}
<!-- Static navbar -->
<nav class="navbar navbar-default navbar-static-top">
<div class="container-fluid mainNavBar">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed offcanvas-trigger" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
{{#if admin}}
<a class="navbar-brand navbar-brand-image" href="/admin"><img class="img-responsive" src="/images/logo-admin.png"></a>
{{else}}
{{#isNull @root.config.cartLogo}}
{{#isNull @root.config.cartTitle}}
<a class="navbar-brand" href="/">expressCart</a>
<nav class="navbar navbar-expand-lg navbar-light bg-light mainNavBar">
<a class="navbar-brand" href="/">CLOTH</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav ml-auto">
{{#ifCond @root.config.enableLanguages "!=" false}}
<li class="nav-item dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ @root.__ "Languages" }} <span class="caret"></span></a>
<ul class="dropdown-menu">
{{#availableLanguages}}
<li><a href="/lang/{{this}}">{{@root.__ this}}</a></li>
{{/availableLanguages}}
</ul>
</li>
{{/ifCond}}
{{#unless admin}}
{{#if @root.session.cart}}
<li class="nav-item"><a href="/checkout/cart" class="btn menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge badge-danger" id="cart-count">{{@root.session.cartTotalItems}}</span></a></li>
{{else}}
<a class="navbar-brand" href="/">{{@root.config.cartTitle}}</a>
{{/isNull}}
{{else}}
<a class="navbar-brand navbar-brand-image" href="/"><img class="img-responsive" src="{{@root.config.cartLogo}}"></a>
{{/isNull}}
{{/if}}
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
{{#ifCond @root.config.enableLanguages "!=" false}}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ @root.__ "Languages" }} <span class="caret"></span></a>
<ul class="dropdown-menu">
{{#availableLanguages}}
<li><a href="/lang/{{this}}">{{@root.__ this}}</a></li>
{{/availableLanguages}}
</ul>
</li>
{{/ifCond}}
{{#unless admin}}
{{#if @root.session.cart}}
<li><a href="/checkout/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge" id="cart-count">{{@root.session.cartTotalItems}}</span></a></li>
{{else}}
<li><a href="/checkout/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge" id="cart-count">0</span></a></li>
{{/if}}
{{/unless}}
{{#if admin}}
{{#if @root.session.user}}
<li><a href="/admin/logout"><i class="fa fa-sign-out" aria-hidden="true"> </i>Logout</a></li>
{{/if}}
<li class="nav-item"><a href="/checkout/cart" class="btn menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge badge-danger" id="cart-count">0</span></a></li>
{{/if}}
</ul>
</div>
</div>
</nav>
{{/unless}}
{{#if admin}}
{{#if @root.session.user}}
<li class="nav-item"><a href="/admin/logout"><i class="fa fa-sign-out" aria-hidden="true"> </i>Logout</a></li>
{{/if}}
{{/if}}
</ul>
</div>
</nav>
<div class="site-overlay"></div>
{{#unless admin}}
{{#ifCond page '!=' 'checkout'}}
{{#ifCond page '!=' 'pay'}}
<div id="cart" class="col-md-12 pad-left-12 pushy pushy-right">
<div id="cart" class="col-md-12 pad-left-12 top-pad-10 pushy pushy-right">
<div class="row {{checkout}}">
<div class="col-lg-12 col l12 text-right">
<button class="pushy-link btn btn-primary" type="button">X</button>
<div class="col-sm-12 text-right">
<button class="pushy-link btn btn-outline-primary" type="button">X</button>
</div>
</div>
<div class="row">
@ -151,9 +131,9 @@
{{> (getTheme 'cart')}}
<div class="row">
{{#if @root.session.cart}}
<div class="col-xs-12 col s12">
<button class="btn btn-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<a href="/checkout/information" class="btn btn-primary pull-right">Checkout</a>
<div class="col-sm-12">
<button class="btn btn-outline-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<a href="/checkout/information" class="btn btn-outline-primary pull-right">Checkout</a>
</div>
{{/if}}
</div>
@ -166,9 +146,7 @@
<div class="container-fluid content-body" id="container">
<div class="row">
{{#if admin}}
<div class="col-xs-12 col s12">
{{{body}}}
</div>
{{else}}
{{{body}}}
{{/if}}
@ -183,7 +161,7 @@
<footer class="footer">
<div class="container-fluid">
{{#isNull @root.config.footerHtml}}
<h4 class="text-center">Powered by expressCart</h4>
<h5 class="text-center">Powered by expressCart</h5>
{{else}}
{{{@root.config.footerHtml}}}
{{/isNull}}

View File

@ -1,4 +1,4 @@
<div class="col-md-offset-4 col-md-4 col-lg-offset-4 col-lg-4" style="padding-top: 100px" >
<div class="col-md-4 offset-md-4 top-pad-100">
<form class="form-signin" method="post" role="form" data-toggle="validator">
<input type="hidden" name="frm_referringUrl" value="{{referringUrl}}">
<h2 class="form-signin-heading">{{ @root.__ "Please sign in" }}</h2>
@ -8,6 +8,6 @@
<div class="form-group">
<input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
</div>
<button class="btn btn-lg btn-primary btn-block" id="loginForm" type="submit">{{ @root.__ "Sign in" }}</button>
<button class="btn btn-outline-primary btn-block" id="loginForm" type="submit">{{ @root.__ "Sign in" }}</button>
</form>
</div>

View File

@ -1,13 +1,13 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-lg-12">
<div class="col-sm-9">
<div class="col-sm-12">
<h2>View Order</h2>
</div>
<div class="order-layout col-md-12">
<div class="row">
<div class="col-md-12 bottom-pad-20">
<a id="orderStatusUpdate" class="btn btn-sm btn-success pull-left">{{ @root.__ "Update status" }}</a>
<a href="/admin/orders" class="btn btn-sm btn-info pull-right">{{ @root.__ "Go Back" }}</a>
<button id="orderStatusUpdate" class="btn btn-outline-success pull-left">{{ @root.__ "Update status" }}</button>
<a href="/admin/orders" class="btn btn-outline-info pull-right">{{ @root.__ "Go Back" }}</a>
</div>
</div>
<ul class="list-group">

View File

@ -1,39 +1,40 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-lg-12">
<div class="col-sm-9 top-pad-5">
<div class="col-sm-12">
<h2>Orders</h2>
</div>
<div class="col-lg-12 search_bar">
<div class="col-sm-12 search_bar">
<div class="input-group">
<input type="text" name="order_filter" id="order_filter" class="form-control input-lg" placeholder="Filter orders">
<span class="input-group-btn">
<button class="btn btn-success btn-lg" id="btn_order_filter">{{ @root.__ "Filter" }}</button>
<a href="/admin/orders/bystatus/" class="hidden-xs btn btn-info btn-lg orderFilterByStatus">{{ @root.__ "By status" }}</a>
<a href="/admin/orders" class="hidden-xs btn btn-warning btn-lg"><i class="fa fa-times" aria-hidden="true"></i></a>
</span>
<input type="text" name="order_filter" id="order_filter" class="form-control" placeholder="Filter orders">
<div class="input-group-append">
<button class="btn btn-outline-success" id="btn_order_filter">{{ @root.__ "Filter" }}</button>
<a href="/admin/orders/bystatus/" class="hidden-xs btn btn-outline-info orderFilterByStatus">{{ @root.__ "By status" }}</a>
<a href="/admin/orders" class="hidden-xs btn btn-outline-warning"><i class="fa fa-times" aria-hidden="true"></i></a>
</div>
</div>
<div class="orderFilter">
<div class="text-warning top-pad-10 col-md-8">{{ @root.__ "Orders can be filtered by: surname, email address or postcode/zipcode" }}</div>
<div class="col-md-4 no-pad-right">
<div class="form-group">
<label for="orderStatusFilter" class="col-sm-2 control-label formLabel">Status</label>
<div class="col-sm-10 no-pad-right">
<select class="form-control input-sm" id="orderStatusFilter">
<option>{{ @root.__ "Completed" }}</option>
<option>{{ @root.__ "Paid" }}</option>
<option>{{ @root.__ "Created" }}</option>
<option>{{ @root.__ "Cancelled" }}</option>
<option>{{ @root.__ "Declined" }}</option>
<option>{{ @root.__ "Shipped" }}</option>
<option>{{ @root.__ "Pending" }}</option>
</select>
<div class="row">
<div class="text-warning top-pad-10 col-sm-8">{{ @root.__ "Orders can be filtered by: surname, email address or postcode/zipcode" }}</div>
<div class="col-sm-4">
<div class="form-group">
<label for="orderStatusFilter" class="col-sm-2 control-label formLabel">Status</label>
<div class="no-pad-right">
<select class="form-control input-sm" id="orderStatusFilter">
<option>{{ @root.__ "Completed" }}</option>
<option>{{ @root.__ "Paid" }}</option>
<option>{{ @root.__ "Created" }}</option>
<option>{{ @root.__ "Cancelled" }}</option>
<option>{{ @root.__ "Declined" }}</option>
<option>{{ @root.__ "Shipped" }}</option>
<option>{{ @root.__ "Pending" }}</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12 top-pad-10">
<div class="col-sm-12 top-pad-10">
<ul class="list-group">
<li class="list-group-item">
{{#if searchTerm}}
@ -45,13 +46,13 @@
{{#if orders}}
{{#each orders}}
<li class="list-group-item">
<h4 class="pull-right" style="padding-left: 10px;">
<h6 class="pull-right top-pad-5">
{{ @root.__ "Status" }}: <span class="text-{{getStatusColor this.orderStatus}}">{{this.orderStatus}}</span>
<a class="text-danger" href="/admin/order/delete/{{this._id}}" onclick="return confirm('Are you sure you want to delete this order?');"> <i class="fa fa-trash-o"></i></a>
</h4>
<h5>
</h6>
<h6>
<a href="/admin/order/view/{{this._id}}" class="text-success">View order</a> - <span class="text-info">Date: </span>{{formatDate this.orderDate "DD/MM/YYYY hh:mm"}} | <span class="text-info">Email:</span> {{this.orderEmail}} | <span class="text-info">{{ @root.__ "Last name" }}:</span> {{this.orderLastname}}
</h5>
</h6>
</li>
{{/each}}
{{else}}

View File

@ -1,4 +1,4 @@
<div class="col-lg-3">
<div class="col-sm-3">
<h2>&nbsp;</h2>
<ul class="list-group">
<li class="list-group-item"><strong>Products</strong></li>

View File

@ -1,4 +1,4 @@
<div class="col-xs-12 col s12 text-center">
<div class="col-sm-12 text-center">
<div id="adyen-dropin"></div>
<link rel="stylesheet" href="https://checkoutshopper-live.adyen.com/checkoutshopper/sdk/3.2.0/adyen.css"/>
<script src="https://checkoutshopper-live.adyen.com/checkoutshopper/sdk/3.2.0/adyen.js"></script>

View File

@ -41,12 +41,12 @@
});
}
</script>
<div class="col-sm-12 col s12 text-center">
<div class="col-sm-12 text-center">
<form id="paymentForm" method="POST">
<input type="hidden" name="dataValue" id="dataValue" />
<input type="hidden" name="dataDescriptor" id="dataDescriptor" />
<button type="button"
class="AcceptUI btn btn-success waves-effect waves-light blue darken-3"
class="AcceptUI btn btn-outline-success waves-effect waves-light blue darken-3"
data-billingAddressOptions='{"show":false, "required":false}'
data-apiLoginID="{{@root.paymentConfig.loginId}}"
data-clientKey="{{@root.paymentConfig.clientKey}}"

View File

@ -1,3 +1,3 @@
<div class="paypal_button col-sm-12 col s12 text-center">
<button id="checkout_paypal" class="btn btn-success waves-effect waves-light blue darken-3" type="submit"><i class="fa fa-cc-paypal fa-lg" aria-hidden="true"></i> Pay with PayPal <i class="fa fa-cc-paypal fa-lg" aria-hidden="true"></i></button>
<div class="paypal_button col-sm-12 text-center">
<button id="checkout_paypal" class="btn btn-outline-success waves-effect waves-light blue darken-3" type="submit"><i class="fa fa-cc-paypal fa-lg" aria-hidden="true"></i> Pay with PayPal <i class="fa fa-cc-paypal fa-lg" aria-hidden="true"></i></button>
</div>

View File

@ -1,10 +1,10 @@
<div class="col-xs-12 col s12 text-center">
<div class="col-sm-12 text-center">
<form method="POST" id="payment-form">
<button
type="submit"
id="stripeButton"
value="Process payment"
class="btn btn-success waves-effect waves-light blue darken-3"
class="btn btn-outline-success waves-effect waves-light blue darken-3"
type="submit"
data-key="{{@root.paymentConfig.publicKey}}"
data-amount="{{amountNoDecimal @root.session.totalCartAmount}}"

View File

@ -1,32 +1,35 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9 top-pad-10">
<form class="form-horizontal" id="productEditForm" data-toggle="validator">
<div class="col-lg-12">
<div class="page-header">
<div class="pull-right">
<button type="button" class="btn btn-info" data-toggle="modal" data-target="#myModal">{{ @root.__ "Upload image" }}</button>
<button id="productUpdate" class="btn btn-success">{{ @root.__ "Save product" }} <i class="fa fa-floppy-o"></i></button>
<div class="col-sm-12">
<div class="page-header">
<div class="pull-right">
<button type="button" class="btn btn-outline-info" data-toggle="modal" data-target="#myModal">{{ @root.__ "Upload image" }}</button>
<button id="productUpdate" class="btn btn-outline-success">{{ @root.__ "Save product" }} <i class="fa fa-floppy-o"></i></button>
</div>
<h2>{{ @root.__ "Edit product" }}</h2>
</div>
<h2>{{ @root.__ "Edit product" }}</h2>
</div>
<div class="form-group">
<label for="productTitle" class="col-sm-2 control-label">{{ @root.__ "Product title" }} *</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productTitle" class="control-label">{{ @root.__ "Product title" }} *</label>
<input type="text" id="productTitle" class="form-control" minlength="5" maxlength="200" value="{{result.productTitle}}" required/>
</div>
</div>
<div class="form-group">
<label for="productPrice" class="col-sm-2 control-label">{{ @root.__ "Product price" }} *</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productPrice" class="control-label">{{ @root.__ "Product price" }} *</label>
<div class="input-group">
<span class="input-group-addon">{{currencySymbol config.currencySymbol}}</span>
<div class="input-group-prepend">
<label class="input-group-text">{{currencySymbol config.currencySymbol}}</label>
</div>
<input type="number" id="productPrice" class="form-control" value="{{result.productPrice}}" step="any" required/>
</div>
</div>
</div>
<div class="form-group">
<label for="productPublished" class="col-sm-2 control-label">{{ @root.__ "Status" }}</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productPublished" class="control-label">{{ @root.__ "Status" }}</label>
<select class="form-control" id="productPublished">
<option value="true" {{selectState result.productPublished "true"}}>{{ @root.__ "Published" }}</option>
<option value="false" {{selectState result.productPublished "false"}}>{{ @root.__ "Draft" }}</option>
@ -34,47 +37,47 @@
</div>
</div>
{{#if config.trackStock}}
<div class="form-group">
<label for="productStock" class="col-sm-2 control-label">{{ @root.__ "Stock level" }}</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productStock" class="control-label">{{ @root.__ "Stock level" }}</label>
<input type="number" id="productStock" class="form-control" value="{{result.productStock}}" step="any" />
</div>
</div>
{{/if}}
<div class="form-group">
<label for="productDescription" class="col-sm-2 control-label">{{ @root.__ "Product description" }} *</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productDescription" class="control-label">{{ @root.__ "Product description" }} *</label>
<textarea minlength="5" rows="10" id="productDescription" class="form-control" required>{{result.productDescription}}</textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Permalink</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label class="control-label">Permalink</label>
<div class="input-group">
<input type="text" class="form-control" id="productPermalink" placeholder="Permalink for the article" value={{result.productPermalink}}>
<span class="input-group-btn">
<button class="btn btn-success" id="validate_permalink" type="button">{{ @root.__ "Validate" }}</button>
</span>
<div class="input-group-append">
<button class="btn btn-outline-success" id="validate_permalink" type="button">{{ @root.__ "Validate" }}</button>
</div>
</div>
<p class="help-block">{{ @root.__ "This sets a readable URL for the product" }}</p>
</div>
</div>
<div class="form-group">
<input type="hidden" id="productOptions" value="{{stringify result.productOptions}}" />
<label class="col-sm-2 control-label">{{ @root.__ "Product options" }}</label>
<div class="col-lg-10">
<div class="col-sm-10">
<div class="form-group">
<input type="hidden" id="productOptions" value="{{stringify result.productOptions}}" />
<label class="control-label">{{ @root.__ "Product options" }}</label>
<ul class="list-group" id="product_opt_wrapper">
<li class="list-group-item">
<div class="row">
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Name" }}:</strong>
<input type="text" id="product_optName" class="form-control" placeholder="size" />
</div>
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Label" }}:</strong>
<input type="text" id="product_optLabel" class="form-control" placeholder="Select size"/>
</div>
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Type" }}:</strong>
<select id="product_optType" class="form-control">
<option value="select">Select</option>
@ -82,23 +85,23 @@
<option value="checkbox">Checkbox</option>
</select>
</div>
<div class="col-lg-4">
<div class="col-sm-4">
<strong>{{ @root.__ "Options" }}:</strong>
<input type="text" id="product_optOptions" class="form-control" placeholder="comma, seporated, list"/>
</div>
<div class="col-lg-2 text-right"></br>
<button id="product_opt_add" class="btn btn-success">{{ @root.__ "Add" }}</button>
<div class="col-sm-2 text-right"></br>
<button id="product_opt_add" class="btn btn-outline-success">{{ @root.__ "Add" }}</button>
</div></div>
</li>
{{#each options}}
<li class="list-group-item">
<div class="row">
<div class='col-lg-2 opt-name'>{{this.optName}}</div>
<div class='col-lg-2'>{{this.optLabel}}</div>
<div class='col-lg-2'>{{this.optType}}</div>
<div class='col-lg-4'>{{{this.optOptions}}}</div>
<div class='col-lg-2 text-right'>
<button class='product_opt_remove btn btn-danger btn-sm'>{{ @root.__ "Remove" }}</button>
<div class='col-sm-2 opt-name'>{{this.optName}}</div>
<div class='col-sm-2'>{{this.optLabel}}</div>
<div class='col-sm-2'>{{this.optType}}</div>
<div class='col-sm-4'>{{{this.optOptions}}}</div>
<div class='col-sm-2 text-right'>
<button class='product_opt_remove btn btn-outline-danger'>{{ @root.__ "Remove" }}</button>
</div>
</div>
</li>
@ -108,17 +111,17 @@
</div>
</div>
{{#ifCond config.paymentGateway '==' 'stripe'}}
<div class="form-group">
<label class="col-sm-2 control-label">Subscription plan</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label class="control-label">Subscription plan</label>
<input type="text" class="form-control" id="productSubscription" placeholder="plan_XXXXXXXXXXXXXX" value={{@root.result.productSubscription}}>
<p class="help-block">First setup the plan in <strong>Stripe</strong> dashboard and enter the Plan ID. Format: plan_XXXXXXXXXXXXXX</p>
</div>
</div>
{{/ifCond}}
<div class="form-group">
<label for="productComment" class="col-sm-2 control-label">{{ @root.__ "Allow comment" }}</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productComment" class="control-label">{{ @root.__ "Allow comment" }}</label>
<div class="checkbox">
<label>
<input class="productComment" type="checkbox" {{checkedState result.productComment}} id="productComment">
@ -127,36 +130,38 @@
<p class="help-block">{{ @root.__ "Allow free form comments when adding products to cart" }}</p>
</div>
</div>
<div class="form-group">
<label for="productTags" class="col-sm-2 control-label">{{ @root.__ "Product tag words" }}</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productTags" class="control-label">{{ @root.__ "Product tag words" }}</label>
<input type="text" class="form-control" id="productTags" value="{{result.productTags}}">
<p class="help-block">{{ @root.__ "Tag words used to indexed products, making them easier to find and filter." }}</p>
</div>
</div>
<div id="product-images">
<h2>{{ @root.__ "Product images" }}</h2>
{{#if images}}
<div class="row">
<div class="col-md-10 col-md-offset-2">
{{#each images}}
<div class="col-md-3">
<p>
<a data-id="{{this.path}}" class="btn-delete-image btn btn-danger btn-sm">{{ @root.__ "Delete" }}</a>
{{#ifCond this.productImage '==' true}}
<span class="label label-info">{{ @root.__ "main image" }}</span>
{{else}}
<a data-id="{{../this.path}}" class="set-as-main-image btn btn-sm btn-success">{{ @root.__ "Set as main image" }}</a>
{{/ifCond}}
</p>
<img src="{{this.path}}" class="product-main-image img-responsive">
<div class="col-sm-12">
<div id="product-images">
<h2>{{ @root.__ "Product images" }}</h2>
{{#if images}}
<div class="row">
<div class="col-sm-10 offset-sm-2">
{{#each images}}
<div class="col-sm-3">
<p>
<a data-id="{{this.path}}" class="btn-delete-image btn btn-outline-danger">{{ @root.__ "Delete" }}</a>
{{#ifCond this.productImage '==' true}}
<span class="label label-info">{{ @root.__ "main image" }}</span>
{{else}}
<a data-id="{{../this.path}}" class="set-as-main-image btn btn-outline-success">{{ @root.__ "Set as main image" }}</a>
{{/ifCond}}
</p>
<img src="{{this.path}}" class="product-main-image img-responsive">
</div>
{{/each}}
</div>
{{/each}}
</div>
{{else}}
<h4 class="text-warning">{{ @root.__ "No images have been uploaded for this product" }}</h4>
{{/if}}
</div>
{{else}}
<h4 class="text-warning">{{ @root.__ "No images have been uploaded for this product" }}</h4>
{{/if}}
</div>
</div>
<input type="hidden" id="productId" value="{{result._id}}" />
@ -173,20 +178,20 @@
<h4 class="modal-title" id="myModalLabel">{{ @root.__ "Product image upload" }}</h4>
</div>
<div class="modal-body">
<span class="btn btn-info btn-file">
<span class="btn btn-outline-info btn-file">
{{ @root.__ "Select file" }}<input type="file" name="uploadFile" id="uploadFile" form="uploadForm">
</span>
<input type="hidden" id="productId" name="productId" value="{{result._id}}"/>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="uploadButton" class="btn btn-primary">{{ @root.__ "Upload" }}</button>
<button type="button" id="uploadButton" class="btn btn-outline-primary">{{ @root.__ "Upload" }}</button>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.2/summernote.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.2/summernote.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.min.js" integrity="sha256-Q4K0T9IUORjpebn9dIu9szj2Rgn7GmLF+S3RjgM8aXw=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.css" integrity="sha256-f/v2ew/bb0v4el1ALE7bOoXGUDWGk2k+dkPLo3JPhLw=" crossorigin="anonymous" />
<script>
$(document).ready(function() {
$('#productDescription').summernote({

View File

@ -1,31 +1,34 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9 top-pad-10">
<form class="form-horizontal" id="productNewForm" data-toggle="validator">
<div class="col-lg-12">
<div class="page-header">
<div class="pull-right">
<button id="frm_edit_product_save" class="btn btn-success" type="submit">Add product <i class="fa fa-plus"></i></button>
<div class="col-sm-12">
<div class="page-header">
<div class="pull-right">
<button id="frm_edit_product_save" class="btn btn-outline-success" type="submit">Add product <i class="fa fa-plus"></i></button>
</div>
<h2>{{ @root.__ "New product" }}</h2>
</div>
<h2>{{ @root.__ "New product" }}</h2>
</div>
<div class="form-group">
<label for="productTitle" class="col-sm-2 control-label">{{ @root.__ "Product title" }} *</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productTitle" class="control-label">{{ @root.__ "Product title" }} *</label>
<input type="text" id="productTitle" class="form-control" minlength="5" maxlength="200" value="{{productTitle}}" required/>
</div>
</div>
<div class="form-group">
<label for="productPrice" class="col-sm-2 control-label">{{ @root.__ "Product price" }} *</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productPrice" class="control-label">{{ @root.__ "Product price" }} *</label>
<div class="input-group">
<span class="input-group-addon">$</span>
<div class="input-group-prepend">
<label class="input-group-text">{{currencySymbol config.currencySymbol}}</label>
</div>
<input type="number" id="productPrice" class="form-control" step="any" value="{{productPrice}}" required/>
</div>
</div>
</div>
<div class="form-group">
<label for="productPublished" class="col-sm-2 control-label">{{ @root.__ "Status" }}</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productPublished" class="control-label">{{ @root.__ "Status" }}</label>
<select class="form-control" id="productPublished">
<option value="true" selected>{{ @root.__ "Published" }}</option>
<option value="false">{{ @root.__ "Draft" }}</option>
@ -33,47 +36,47 @@
</div>
</div>
{{#if config.trackStock}}
<div class="form-group">
<label for="productStock" class="col-sm-2 control-label">{{ @root.__ "Stock level" }}</label>
<div class="col-sm-6">
<div class="col-sm-6">
<div class="form-group">
<label for="productStock" class="control-label">{{ @root.__ "Stock level" }}</label>
<input type="number" id="productStock" class="form-control" value="{{productStock}}" step="any" />
</div>
</div>
{{/if}}
<div class="form-group" id="editor-wrapper">
<label for="editor" class="col-sm-2 control-label">{{ @root.__ "Product description" }} *</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group" id="editor-wrapper">
<label for="editor" class="control-label">{{ @root.__ "Product description" }} *</label>
<textarea minlength="5" rows="10" id="productDescription" class="form-control" required>{{productDescription}}</textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Permalink</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label class="control-label">Permalink</label>
<div class="input-group">
<input type="text" class="form-control" id="productPermalink" placeholder="Permalink for the article" value={{productPermalink}}>
<span class="input-group-btn">
<button class="btn btn-success" id="validate_permalink" type="button">Validate</button>
</span>
<div class="input-group-append">
<button class="btn btn-outline-success" id="validate_permalink" type="button">Validate</button>
</div>
</div>
<p class="help-block">{{ @root.__ "This sets a readable URL for the product" }}</p>
</div>
</div>
<div class="form-group">
<input type="hidden" id="productOptions" value="{{result.productOptions}}" />
<label for="editor" class="col-sm-2 control-label">{{ @root.__ "Product options" }}</label>
<div class="col-lg-10">
<div class="col-sm-10">
<div class="form-group">
<label class="control-label">{{ @root.__ "Product options" }}</label>
<input type="hidden" id="productOptions" value="{{result.productOptions}}" />
<ul class="list-group" id="product_opt_wrapper">
<li class="list-group-item">
<div class="row">
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Name" }}:</strong>
<input type="text" id="product_optName" class="form-control" placeholder="Size" />
</div>
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Label" }}:</strong>
<input type="text" id="product_optLabel" class="form-control" placeholder="Select size"/>
</div>
<div class="col-lg-2">
<div class="col-sm-2">
<strong>{{ @root.__ "Type" }}:</strong>
<select id="product_optType" class="form-control">
<option value="select">Select</option>
@ -81,23 +84,23 @@
<option value="checkbox">Checkbox</option>
</select>
</div>
<div class="col-lg-4">
<div class="col-sm-4">
<strong>{{ @root.__ "Options" }}:</strong>
<input type="text" id="product_optOptions" class="form-control" placeholder="comma, seporated, list"/>
</div>
<div class="col-lg-2 text-right"></br>
<button id="product_opt_add" class="btn btn-success">{{ @root.__ "Add" }}</button>
<div class="col-sm-2 text-right"></br>
<button id="product_opt_add" class="btn btn-outline-success">{{ @root.__ "Add" }}</button>
</div></div>
</li>
{{#each options}}
<li class="list-group-item">
<div class="row">
<div class='col-lg-2 opt-name'>{{this.optName}}</div>
<div class='col-lg-2'>{{this.optLabel}}</div>
<div class='col-lg-2'>{{this.optType}}</div>
<div class='col-lg-4'>{{{this.optOptions}}}</div>
<div class='col-lg-2 text-right'>
<button class='product_opt_remove btn btn-danger btn-sm'>{{ @root.__ "Remove" }}</button>
<div class='col-sm-2 opt-name'>{{this.optName}}</div>
<div class='col-sm-2'>{{this.optLabel}}</div>
<div class='col-sm-2'>{{this.optType}}</div>
<div class='col-sm-4'>{{{this.optOptions}}}</div>
<div class='col-sm-2 text-right'>
<button class='product_opt_remove btn btn-outline-danger'>{{ @root.__ "Remove" }}</button>
</div>
</div>
</li>
@ -107,17 +110,17 @@
</div>
</div>
{{#ifCond config.paymentGateway '==' 'stripe'}}
<div class="form-group">
<label class="col-sm-2 control-label">Subscription plan</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label class="control-label">Subscription plan</label>
<input type="text" class="form-control" id="productSubscription" placeholder="plan_XXXXXXXXXXXXXX">
<p class="help-block">First setup the plan in <strong>Stripe</strong> dashboard and enter the Plan ID. Format: plan_XXXXXXXXXXXXXX</p>
</div>
</div>
{{/ifCond}}
<div class="form-group">
<label for="productComment" class="col-sm-2 control-label">{{ @root.__ "Allow comment" }}</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productComment" class="control-label">{{ @root.__ "Allow comment" }}</label>
<div class="checkbox">
<label>
<input class="productComment" type="checkbox" {{checkedState result.productComment}} id="productComment">
@ -126,9 +129,9 @@
<p class="help-block">{{ @root.__ "Allow free form comments when adding products to cart" }}</p>
</div>
</div>
<div class="form-group">
<label for="productTags" class="col-sm-2 control-label">Product tag words</label>
<div class="col-sm-10">
<div class="col-sm-10">
<div class="form-group">
<label for="productTags" class="control-label">Product tag words</label>
<input type="text" class="form-control" id="productTags">
<p class="help-block">{{ @root.__ "Tag words used to indexed products, making them easier to find and filter." }}</p>
</div>

View File

@ -1,19 +1,19 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-lg-12">
<div class="col-sm-9">
<div class="col-sm-12">
<h2>Products</h2>
</div>
<div class="col-lg-12 search_bar">
<div class="col-sm-12 search_bar">
<div class="input-group">
<input type="text" name="product_filter" id="product_filter" class="form-control input-lg" placeholder="Filter products">
<span class="input-group-btn">
<button class="btn btn-success btn-lg" id="btn_product_filter">Filter</button>
<a href="/admin/products" class="hidden-xs btn btn-warning btn-lg"><i class="fa fa-times" aria-hidden="true"></i></a>
</span>
<input type="text" name="product_filter" id="product_filter" class="form-control" placeholder="Filter products">
<div class="input-group-append">
<button class="btn btn-outline-success" id="btn_product_filter">Filter</button>
<a href="/admin/products" class="hidden-xs btn btn-outline-warning"><i class="fa fa-times" aria-hidden="true"></i></a>
</div>
</div>
<p class="text-warning top-pad-10">{{ @root.__ "Products can be filtered by: product title or product description keywords" }}</p>
</div>
<div class="col-lg-12">
<div class="col-sm-12">
<ul class="list-group">
<li class="list-group-item">
<span class="pull-right"><strong>{{ @root.__ "Published" }}</strong></span>
@ -27,7 +27,7 @@
<li class="list-group-item">
<button class="pull-right btn text-danger btn-delete-product" data-id="{{this._id}}"> <i class="fa fa-trash-o"></i></button>
<h4 class="pull-right"><input id="{{this._id}}" class="published_state" type="checkbox" {{checkedState this.productPublished}}></h4>
<h5><a href="/admin/product/edit/{{this._id}}">{{this.productTitle}}</a></h5>
<h6><a href="/admin/product/edit/{{this._id}}">{{this.productTitle}}</a></h6>
</li>
{{/each}}
</ul>

View File

@ -1,4 +1,4 @@
<div class="col-md-offset-4 col-md-4 col-lg-offset-4 col-lg-4">
<div class="col-md-4 offset-md-4">
<form class="form-signin" action="/{{route}}/reset/{{token}}" method="post" role="form" data-toggle="validator">
<h2 class="form-signin-heading">Password reset</h2>
<div class="form-group">
@ -9,7 +9,7 @@
<label for="frm_user_password_confirm">{{ @root.__ "Confirm" }} password *</label>
<input type="password" data-match="#user_password" placeholder="Confirm password" class="form-control" name="frm_user_password_confirm" required>
</div>
<button class="btn btn-lg btn-success btn-block" type="submit">{{ @root.__ "Update" }} password</button>
<button class="btn btn-outline-success btn-block" type="submit">{{ @root.__ "Update" }} password</button>
</br>
</form>
</div>

View File

@ -1,11 +1,11 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-10">
<form id="settingsForm" data-toggle="validator">
<h2 class="clearfix">{{ @root.__ "General settings" }}
<div class="pull-right">
<button type="submit" id="btnSettingsUpdate" class="btn btn-success">{{ @root.__ "Update" }}</button>
<button type="submit" id="btnSettingsUpdate" class="btn btn-outline-success">{{ @root.__ "Update" }}</button>
</h2>
<div class="form-group">
<label>{{ @root.__ "Cart name" }} *</label>
@ -146,7 +146,7 @@
<input type="password" class="form-control" name="emailPassword" value="{{config.emailPassword}}" autocomplete="off" required>
</div>
<div class="form-group">
<button id="sendTestEmail" class="btn btn-success">{{ @root.__ "Send test email" }}</button>
<button id="sendTestEmail" class="btn btn-outline-success">{{ @root.__ "Send test email" }}</button>
</div>
</div>
</div>

View File

@ -1,73 +1,53 @@
{{> partials/menu}}
<script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-10">
<div class="col-sm-10">
<h2>Menu</h2>
<table class="table table-condensed">
<th></th>
<th>Menu</th>
<th>Link</th>
<th></th>
<tbody id="draggable_list">
<div class="row">
<div class="col-sm-2 offset-sm-1">Menu</div>
<div class="col-sm-9">link</div>
</div>
<div id="draggable_list">
{{#each menu.items}}
<tr class="drag-row" id="menuId-{{@key}}">
<div class="row drag-row" id="menuId-{{@key}}">
<input type="hidden" class="navId" value="{{title}}">
<td class="dragable_item col-md-1 td-pad"><i class="fa fa-arrows"></i></td>
<td class="dragable_item col-md-2">
<input type="text" class="form-control input-sm navMenu" value="{{title}}">
</td>
<td class="dragable_item col-md-6">
<input type="text" class="form-control input-sm navLink" value="{{link}}">
</td>
<td class="col-md-2">
<a class="btn btn-danger btn-sm settings-menu-delete" data-id="{{@key}}">
<div class="col-sm-1 dragable_item"><i class="fa fa-arrows"></i></div>
<div class="col-sm-2 dragable_item">
<input type="text" class="form-control navMenu navItem" value="{{title}}">
</div>
<div class="col-sm-6 dragable_item">
<input type="text" class="form-control navLink navItem" value="{{link}}">
</div>
<div class="col-sm-3 dragable_item">
<a class="btn btn-outline-danger settings-menu-delete" data-id="{{@key}}">
<i class="fa fa-trash-o"></i>
</a>
<button type="submit" class="btn btn-success btn-sm" id="settings-menu-update" >
<button type="submit" class="btn btn-outline-success" id="settings-menu-update" data-id="{{@key}}">
<i class="fa fa-floppy-o"></i>
</button>
</td>
</tr>
</div>
</div>
{{/each}}
<tr>
<td class="dragable_item col-md-1"></td>
<td class="dragable_item col-md-2">
<input type="text" class="form-control input-sm" id="newNavMenu">
</td>
<td class="dragable_item col-md-6">
<input type="text" class="form-control input-sm" id="newNavLink">
</td>
<td class="col-md-2">
<button type="submit" id="settings-menu-new" class="btn btn-success btn-sm">
<i class="fa fa-plus"></i>
</button>
</td>
</tr>
</tbody>
</table>
<p class="text-muted">
</div>
<div class="row">
<div class="col-sm-2 offset-sm-1">
<input type="text" class="form-control input-sm" id="newNavMenu" placeholder="Contact Us">
</div>
<div class="col-sm-6">
<input type="text" class="form-control input-sm" id="newNavLink" placeholder="/contact">
</div>
<div class="col-sm-3">
<button type="submit" id="settings-menu-new" class="btn btn-outline-success">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
</div>
<p class="text-muted">
{{ @root.__ "Setting_menu_explain" }}
</p>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$('#draggable_list').sortable({
update: function (event, ui) {
var sorted = $( ".navId" ).serialize();
$.ajax({
data: sorted,
type: 'POST',
url: '/admin/settings/menu/save_order'
})
.fail(function(msg){
showNotification(msg.responseJSON.message, 'danger', true);
});
}
});
});
</script>

View File

@ -1,9 +1,9 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-12">
<form id="settingsPageEditor">
<h2 class="clearfix">{{ @root.__ "Static page" }} <div class="pull-right"><button type="submit" id="btnPageUpdate" class="btn btn-success">{{button_text}}</button></div></h2>
<h2 class="clearfix">{{ @root.__ "Static page" }} <div class="pull-right"><button type="submit" id="btnPageUpdate" class="btn btn-outline-success">{{button_text}}</button></div></h2>
<input type="hidden" id="pageId" value="{{page._id}}">
<div class="form-group">
<label>{{ @root.__ "Page name" }} *</label>

View File

@ -1,8 +1,8 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-10">
<h2 class="clearfix">{{ @root.__ "Static pages" }} <div class="pull-right"><a href="/admin/settings/pages/new" class="btn btn-success">{{ @root.__ "New page" }}</a></div></h2>
<h2 class="clearfix">{{ @root.__ "Static pages" }} <div class="pull-right"><a href="/admin/settings/pages/new" class="btn btn-outline-success">{{ @root.__ "New page" }}</a></div></h2>
<p class="text-muted">
{{ @root.__ "Static_Pages_Info" }}
</p>
@ -11,12 +11,12 @@
{{#each pages}}
<li class="list-group-item">
<div class="row">
<div class="col-lg-8">
<h5><strong>{{ @root.__ "Name" }}:</strong>&nbsp; {{pageName}}</h5>
<div class="col-sm-8">
<h6><strong>{{ @root.__ "Name" }}:</strong>&nbsp; {{pageName}}</h6>
</div>
<div class="col-lg-4 text-right">
<a class="btn btn-sm btn-success" href="/admin/settings/pages/edit/{{_id}}">{{ @root.__ "Edit" }}</a>
<button class="btn btn-sm btn-danger" id="btnPageDelete" data-id="{{_id}}">{{ @root.__ "Delete" }}</button>
<div class="col-sm-4 text-right">
<a class="btn btn-outline-success" href="/admin/settings/pages/edit/{{_id}}">{{ @root.__ "Edit" }}</a>
<button class="btn btn-outline-danger" id="btnPageDelete" data-id="{{_id}}">{{ @root.__ "Delete" }}</button>
</div>
</div>
</li>
@ -25,7 +25,7 @@
{{else}}
<h4 class="text-warning text-center">{{ @root.__ "There are currently no static pages setup. Please setup a static page." }}</h4>
<p class="text-center">
<a class="btn btn-success" href="/admin/settings/pages/new"> {{ @root.__ "Create new" }}</a>
<a class="btn btn-outline-success" href="/admin/settings/pages/new"> {{ @root.__ "Create new" }}</a>
</p>
{{/if}}
</div>

View File

@ -1,4 +1,4 @@
<div class="col-md-offset-4 col-md-4 col-lg-offset-4 col-lg-4" style="padding-top: 50px">
<div class="col-md-4 offset-md-4 top-pad-50">
<form class="form-signin" id="userSetupForm" role="form" data-toggle="validator">
<h2 class="form-signin-heading text-center">expressCart Setup</h2>
<div class="form-group">
@ -17,6 +17,6 @@
<label for="frm_userPassword_confirm">{{ @root.__ "Password confirm" }} *</label>
<input type="password" data-match="#userPassword" placeholder="Confirm password" class="form-control" id="frm_userPassword_confirm" name="frm_userPassword_confirm" required>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{ @root.__ "Complete setup" }}</button>
<button class="btn btn-outline-primary btn-block" type="submit">{{ @root.__ "Complete setup" }}</button>
</form>
</div>

View File

@ -1,59 +1,56 @@
<div class="panel panel-default" style="margin-top: 30px;">
<div class="panel-heading">{{ @root.__ "Cart contents" }}</div>
<div class="panel-body cart-body">
<div class="container-fluid">
{{#each @root.session.cart}}
<div class="row cart-row">
<div class="col-xs-4 col-md-2 col s4 m2">
{{#if productImage}}
<img class="img-responsive" src="{{this.productImage}}" alt="{{this.title}} product image"> {{else}}
<img class="img-responsive" src="/uploads/placeholder.png" alt="{{this.title}} product image"> {{/if}}
</div>
<div class="cart-item-row text-left col-xs-12 col-md-7 col s12 m7">
<p>
<a class="cart-link" href="/product/{{this.link}}">{{this.title}}</a>
</p>
<p>
&nbsp;
{{#each this.options}}
{{#if @last}}
{{@key}}: {{this}}
{{else}}
{{@key}}: {{this}} /
{{/if}}
{{/each}}
</p>
<p>
<div class="form-group">
<div class="col-lg-5 col l5 no-pad-left">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-sm btn-primary btn-qty-minus" type="button">-</button>
</span>
<input type="number" class="form-control cart-product-quantity input-sm text-center" data-id="{{this.productId}}" data-index="{{@key}}"
maxlength="2" value="{{this.quantity}}">
<span class="input-group-btn">
<button class="btn btn-sm btn-primary btn-qty-add" type="button">+</button>
</span>
</div>
<div class="card top-marg-15 bottom-marg-15">
<div class="card-body cart-body">
<h5 class="card-title">{{ @root.__ "Cart contents" }}</h5>
{{#each @root.session.cart}}
<div class="d-flex flex-row bottom-pad-15">
<div class="col-xs-4 col-md-3">
{{#if productImage}}
<img class="img-fluid" src="{{this.productImage}}" alt="{{this.title}} product image"> {{else}}
<img class="img-fluid" src="/uploads/placeholder.png" alt="{{this.title}} product image"> {{/if}}
</div>
<div class="col-sm-12 col-md-7">
<div class="row h-200">
<div class="col-sm-12 text-left no-pad-left">
<h6><a href="/product/{{this.link}}">{{this.title}}</a></h6>
</div>
<div class="col-sm-12 text-left no-pad-left">
{{#each this.options}}
{{#if @last}}
{{@key}}: {{this}}
{{else}}
{{@key}}: {{this}} /
{{/if}}
{{/each}}
</div>
{{#ifCond cartReadOnly '!=' true}}
<div class="col-md-8 no-pad-left">
<div class="input-group">
<div class="input-group-prepend">
<button class="btn btn-outline-primary btn-qty-minus" type="button">-</button>
</div>
<input type="number" class="form-control cart-product-quantity input-sm text-center" data-id="{{../this.productId}}" data-index="{{@key}}"
maxlength="2" value="{{../this.quantity}}">
<div class="input-group-append">
<button class="btn btn-outline-primary btn-qty-add" type="button">+</button>
</div>
<span class="pull-right">
<button class="btn btn-sm btn-danger btn-delete-from-cart" data-id="{{this.productId}}" type="button"><i class="fa fa-trash" data-id="{{this.productId}}" aria-hidden="true"></i></button>
</span>
</div>
</p>
</div>
<div class="col-xs-12 col-lg-4 col s12 l4 cart-item-row text-right no-pad-right">
<strong>{{currencySymbol ../config.currencySymbol}}{{formatAmount this.totalItemPrice}}</strong>
</div>
<div class="col-md-4 text-right">
<button class="btn btn-outline-danger btn-delete-from-cart" data-id="{{../this.productId}}" type="button"><i class="fa fa-trash" data-id="{{../this.productId}}" aria-hidden="true"></i></button>
</div>
{{/ifCond}}
</div>
</div>
{{/each}}
<div class="align-self-center col-sm-12 col-md-2 text-right no-pad-right">
<strong class="my-auto">{{currencySymbol @root.config.currencySymbol}}{{formatAmount this.totalItemPrice}}</strong>
</div>
</div>
{{/each}}
<div class="container-fluid">
{{#if @root.session.cart}}
<div class="row">
<div class="cart-contents-shipping col-md-12 col m12 no-pad-right">
<div class="cart-contents-shipping col-md-12 no-pad-right">
{{#ifCond @root.session.shippingCostApplied '===' true}}
<div class="text-right">
{{ @root.__ "Shipping" }}

View File

@ -1,12 +1,12 @@
<div class="col-xl-8 col-xl-offset-2 col-xs-12">
<div class="col-md-10 offset-md-1 col-sm-12">
<div class="row">
<div id="cart" class="col-md-12">
{{> (getTheme 'cart')}}
<div class="row">
{{#if @root.session.cart}}
<div class="col-xs-12 col s12">
<button class="btn btn-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<a href="/checkout/information" class="btn btn-danger pull-right">Checkout</a>
<div class="col-sm-12">
<button class="btn btn-outline-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<a href="/checkout/information" class="btn btn-outline-danger pull-right">Checkout</a>
</div>
{{/if}}
</div>

View File

@ -1,4 +1,4 @@
<div class="col-xl-8 col-xl-offset-2 col-xs-12">
<div class="col-md-10 offset-md-1 col-sm-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/">Home</a></li>
@ -12,71 +12,86 @@
{{/if}}
</ol>
</nav>
<div class="row">
<div class="row 1">
{{#if paymentMessage}}
<div class="col-sm-12">
<p class="text-danger text-center">{{paymentMessage}}</p>
</div>
{{/if}}
<div class="col-md-5">
<div class="panel panel-default" style="margin-top: 30px;">
<div class="panel-heading">{{ @root.__ "Customer details" }}</div>
{{#unless @root.session.customerPresent}}
<div class="panel-body customer-details-login">
<p>{{ @root.__ "Existing customer" }}</p>
<div class="form-group">
<input type="email" class="form-control" id="customerLoginEmail" name="loginEmail" minlength="5" placeholder="Email address" required>
<div class="card top-marg-15">
<div class="card-body customer-details-login">
<h5 class="card-heading">{{ @root.__ "Customer details" }}</h5>
{{#unless @root.session.customerPresent}}
<div class="row">
<div class="col-sm-12 bottom-marg-15">
<p>{{ @root.__ "Existing customer" }}</p>
<div class="form-group">
<input type="email" class="form-control" id="customerLoginEmail" name="loginEmail"
minlength="5" placeholder="Email address" required>
</div>
<div class="form-group">
<input type="password" class="form-control" id="customerLoginPassword"
name="loginPassword" minlength="5" placeholder="Password" required>
</div>
<div class="form-group">
<a href="/customer/forgotten"
class="btn btn-outline-primary float-left">{{ @root.__ "Forgotten" }}</a>
</div>
<div class="form-group">
<button id="customerLogin" class="btn btn-outline-primary float-right"
type="submit">Login</button>
</div>
</div>
</div>
<div class="form-group">
<input type="password" class="form-control" id="customerLoginPassword" name="loginPassword" minlength="5" placeholder="Password" required>
</div>
<div class="form-group">
<a href="/customer/forgotten" class="btn btn-default pull-left">{{ @root.__ "Forgotten" }}</a>
</div>
<div class="form-group">
<button id="customerLogin" class="btn btn-primary pull-right" type="submit">Login</button>
</div>
</div>
{{/unless}}
<div class="panel-body customer-details">
{{/unless}}
{{#if @root.session.customerPresent}}
<div class="col-xs-12 col-md-12">
<button id="customerLogout" class="btn btn-sm btn-primary pull-right">{{ @root.__ "Change customer" }}</button>
<div class="row bottom-marg-15">
<div class="col-sm-12">
<button id="customerLogout"
class="btn btn-outline-primary pull-right">{{ @root.__ "Change customer" }}</button>
</div>
</div>
{{/if}}
<form id="shipping-form" class="shipping-form" role="form" data-toggle="validator" novalidate="false">
{{> themes/Cloth/shipping-form}}
{{#unless @root.session.customerPresent}}
<div class="col-xs-12 col-md-12">
<p class="text-muted">{{ @root.__ "Enter a password to create an account for next time" }}</p>
</div>
<div class="col-xs-6 col-md-6">
<div class="form-group">
<input type="password" class="form-control customerDetails" id="newCustomerPassword" name="newCustomerPassword" placeholder="Password">
<div class="row">
{{#unless @root.session.customerPresent}}
<div class="col-sm-12">
<p class="text-muted">
{{ @root.__ "Enter a password to create an account for next time" }}</p>
</div>
</div>
<div class="col-xs-6 col-md-6">
<div class="checkbox">
<label>
<input type="checkbox" id="createAccountCheckbox"> Create an account
</label>
<div class="col-sm-6">
<div class="form-group">
<input type="password" class="form-control customerDetails" id="newCustomerPassword"
name="newCustomerPassword" placeholder="Password">
</div>
</div>
<div class="col-sm-6">
<div class="checkbox">
<label>
<input type="checkbox" id="createAccountCheckbox"> Create an account
</label>
</div>
</div>
{{/unless}}
<div class="col-sm-12">
<a href="/checkout/cart" class="btn btn-outline-primary pull-left">Return to cart</a>
<a href="/checkout/shipping" id="checkoutInformation" class="btn btn-outline-primary pull-right">Continue to shipping</a>
</div>
</div>
{{/unless}}
<div class="col-xs-12 col-md-12">
<a href="/checkout/cart" class="btn btn-primary pull-left">Return to cart</a>
<a href="/checkout/shipping" id="checkoutInformation" class="btn btn-primary pull-right">Continue to shipping</a>
</div>
</form>
</div>
</div>
</div>
<div id="cart" class="col-md-7">
<div class="col-md-7" id="cart">
{{> (getTheme 'cart')}}
{{#if @root.session.cart}}
<div class="row">
{{#if @root.session.cart}}
<div class="col-xs-12 col s12">
<button class="btn btn-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<div class="col-sm-12">
<button class="btn btn-outline-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
</div>
{{/if}}
{{/if}}
</div>
</div>
</div>

View File

@ -1,4 +1,4 @@
<div class="col-xl-8 col-xl-offset-2 col-xs-12">
<div class="col-md-10 offset-md-1 col-sm-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/">Home</a></li>
@ -12,17 +12,17 @@
<p class="text-danger text-center">{{paymentMessage}}</p>
{{/if}}
<div class="col-md-5">
<div class="panel panel-default" style="margin-top: 30px;">
<div class="panel-heading">{{ @root.__ "Customer details" }}</div>
<div class="panel-body">
<ul class="list-group">
<div class="card top-marg-15">
<div class="card-body">
<h5 class="card-title">{{ @root.__ "Customer details" }}</h5>
<ul class="list-group bottom-pad-15">
<li class="list-group-item">
{{@root.session.customerFirstname}} {{@root.session.customerLastname}} -
{{@root.session.customerEmail}}
<span class="pull-right"><a href="/checkout/information">Change</a></span>
</li>
</ul>
<ul class="list-group">
<ul class="list-group bottom-pad-15">
{{#if @root.session.shippingCostApplied}}
<li class="list-group-item">
<div class="row">

View File

@ -1,4 +1,4 @@
<div class="col-xl-8 col-xl-offset-2 col-xs-12">
<div class="col-md-10 offset-md-1 col-sm-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/">Home</a></li>
@ -9,29 +9,29 @@
</nav>
<div class="row">
<div class="col-md-5">
<div class="panel panel-default" style="margin-top: 30px;">
<div class="panel-heading">{{ @root.__ "Shipping options" }}</div>
<div class="panel-body cart-body">
{{#unless @root.session.shippingOptions}}
<ul class="list-group">
{{#if @root.session.shippingCostApplied}}
<li class="list-group-item">Standard shipping <span class="pull-right"><strong>{{currencySymbol @root.config.currencySymbol}}{{formatAmount @root.config.flatShipping}}</strong></span></li>
{{else}}
<li class="list-group-item">FREE shipping <span class="pull-right"></li>
{{/if}}
</ul>
{{/unless}}
<div class="card top-marg-15 bottom-marg-15">
<div class="card-body">
<h5 class="card-title">{{ @root.__ "Shipping options" }}</h5>
{{#unless @root.session.shippingOptions}}
<ul class="list-group">
{{#if @root.session.shippingCostApplied}}
<li class="list-group-item">Standard shipping <span class="pull-right"><strong>{{currencySymbol @root.config.currencySymbol}}{{formatAmount @root.config.flatShipping}}</strong></span></li>
{{else}}
<li class="list-group-item">FREE shipping <span class="pull-right"></li>
{{/if}}
</ul>
{{/unless}}
</div>
</div>
<a href="/checkout/information" class="btn btn-primary pull-left">{{ @root.__ "Return to information" }}</a>
<a href="/checkout/payment" class="btn btn-primary pull-right">{{ @root.__ "Proceed to payment" }}</a>
<a href="/checkout/information" class="btn btn-outline-primary pull-left">{{ @root.__ "Return to information" }}</a>
<a href="/checkout/payment" class="btn btn-outline-primary pull-right">{{ @root.__ "Proceed to payment" }}</a>
</div>
<div id="cart" class="col-md-7">
{{> (getTheme 'cart')}}
<div class="row">
{{#if @root.session.cart}}
<div class="col-xs-12 col s12">
<button class="btn btn-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
<div class="col-sm-12">
<button class="btn btn-outline-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button>
</div>
{{/if}}
</div>

View File

@ -1,25 +1,19 @@
<nav class="navbar navbar-default navbarMenuWrapper">
<div class="container-fluid">
<div class="col-md-8 col-md-offset-2 navbarMenu">
<ul class="nav navbar-nav">
<li {{#unless searchTerm}}class="navActive"{{/unless}}><a href="/">Home</a></li>
{{#each menu.items}}
<li
{{#menuMatch this.title @root.searchTerm}}{{/menuMatch}}
{{#menuMatch this.title @root.title}}{{/menuMatch}}>
<a href="{{this.link}}">{{this.title}}</a>
</li>
{{/each}}
<li class="pull-right col-md-4 searchBarWrapper">
<div class="search-bar-input input-group searchMenuLocation-{{config.menuLocation}} searchProPerRow-{{config.productsPerRow}}">
<input type="text" name="frm_search" id="frm_search" class="form-control" placeholder="Search the shop">
<span class="input-group-btn">
<button class="btn btn-primary" id="btn_search" type="submit">{{ @root.__ "Search" }}</button>
</span>
</div>
<nav class="navbar navbar-expand-lg navbar-light bg-light navbarMenuWrapper col-sm-12">
{{!-- <div class="col-sm-8 navbarMenu1"> --}}
<div class="col-sm-8 offset-md-2 collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item {{#unless searchTerm}}active{{/unless}}"><a class="nav-link" href="/">Home</a></li>
{{#each menu.items}}
<li class="nav-item"
{{#menuMatch this.title @root.searchTerm}}{{/menuMatch}}
{{#menuMatch this.title @root.title}}{{/menuMatch}}>
<a class="nav-link" href="{{this.link}}">{{this.title}}</a>
</li>
</ul>
</div>
{{/each}}
</ul>
<form class="form-inline ml-auto">
<input class="form-control mr-sm-2" name="frm_search" id="frm_search" type="search" placeholder="Search shop" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">{{ @root.__ "Search" }}</button>
</form>
</div>
</nav>

View File

@ -1,7 +1,7 @@
{{> themes/Cloth/front-menu}}
<div class="productsWrapper col-md-8 col-md-offset-2">
<div class="productsWrapper col-sm-8 offset-sm-2">
{{#if filtered}}
<div class="product-layout col-md-12">
<div class="product-layout col-sm-12">
{{#ifCond @root.paginateUrl '==' 'category'}}
<h4>{{ @root.__ "Category" }}: <strong>{{@root.searchTerm}}</strong></h4>
{{else}}
@ -11,21 +11,21 @@
{{/if}}
<div class="row product-layout">
{{#ifCond results.length '==' 0}}
<div class="col-md-12">
<div class="col-sm-12">
<p class="text-danger">{{ @root.__ "No products found" }}</p>
</div>
{{/ifCond}}
{{#each results}}
<div class="{{perRowClass ../config.productsPerRow}}">
<div class="thumbnail">
<div class="thumbnail1">
{{#if productPermalink}}
<div class="product_wrapper">
<div class="product-wrapper">
<a href="/product/{{this.productPermalink}}">
<div class="vertical-center thumbnail-image-container">
<div class="vertical-center img-thumbnail">
{{#if productImage}}
<img class="img-responsive" src="{{this.productImage}}" alt="...">
<img class="img-fluid" src="{{this.productImage}}" alt="...">
{{else}}
<img class="img-responsive" src="/uploads/placeholder.png" alt="...">
<img class="img-fluid" src="/uploads/placeholder.png" alt="...">
{{/if}}
</div>
<h3 class="product-title product-title-home top-pad-10">
@ -35,11 +35,11 @@
</div>
{{else}}
<a href="/product/{{this._id}}">
<div class="vertical-center thumbnail-image-container">
<div class="vertical-center img-thumbnail">
{{#if productImage}}
<img class="img-responsive" src="{{this.productImage}}" alt="...">
<img class="img-fluid" src="{{this.productImage}}" alt="...">
{{else}}
<img class="img-responsive" src="/uploads/placeholder.png" alt="...">
<img class="img-fluid" src="/uploads/placeholder.png" alt="...">
{{/if}}
</div>
<h3 class="product-title product-title-home top-pad-10">
@ -51,7 +51,7 @@
{{currencySymbol ../config.currencySymbol}}{{formatAmount productPrice}}
</h3>
<p class="text-center">
<a class="btn btn-primary add-to-cart" data-id="{{this._id}}" data-link="{{this.productPermalink}}" data-has-options="{{checkProductOptions this.productOptions}}" role="button">{{ @root.__ "Add to cart" }}</a>
<a class="btn btn-outline-primary add-to-cart" data-id="{{this._id}}" data-link="{{this.productPermalink}}" data-has-options="{{checkProductOptions this.productOptions}}" role="button">{{ @root.__ "Add to cart" }}</a>
</p>
</div>
</div>
@ -64,5 +64,5 @@
<input type="hidden" id="paginateUrl" value="{{paginateUrl}}">
<input type="hidden" id="searchTerm" value="{{searchTerm}}">
<div class="col-md-12">
<div id="pager" class="text-center"></div>
<div id="pager" class="d-flex justify-content-center"></div>
</div>

View File

@ -1,6 +1,6 @@
{{> themes/Cloth/front-menu}}
<div class="row">
<div class="col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2">
<div class="col-md-8 offset-md-2">
<div class="product-layout">
{{{page.pageContent}}}
</div>

View File

@ -1,6 +1,6 @@
<div class="col-xl-8 col-xl-offset-2 col-xs-12">
<div class="col-md-10 offset-md-1 col-sm-12 top-pad-50">
<div class="row">
<div class="text-center col-md-10 col-md-offset-1">
<div class="text-center col-md-10 offset-md-1">
{{#ifCond result.orderStatus '==' 'Paid'}}
<h2 class="text-success">{{ @root.__ "Your payment has been successfully processed" }}</h2>
{{else}}
@ -15,7 +15,7 @@
{{#ifCond result.orderStatus '==' 'Paid'}}
<h3 class="text-warning">{{ @root.__ "Please retain the details above as a reference of payment." }}</h3>
{{/ifCond}}
<a href="/" class="btn btn-warning">Home</a>
<a href="/" class="btn btn-outline-warning">Home</a>
</div>
</div>
</div>

View File

@ -1,9 +1,29 @@
{{> themes/Cloth/front-menu}}
<div class="product-layout col-md-8 col-md-offset-2">
<div class="product-layout col-sm-8 offset-sm-2">
<div class="row">
<div class="col-xs-12 col-md-6 pull-right">
<div class="col-sm-12 col-md-6 mr-auto">
{{#if result.productImage}}
<div class="title-image-container">
<div class="image-prev image-button"> <i class="fa fa-chevron-left" aria-hidden="true"></i></div>
<img src="{{result.productImage}}" id="product-title-image" class="product-title-image img-fluid" alt="...">
<div class="image-next image-button"> <i class="fa fa-chevron-right" aria-hidden="true"></i></div>
</div>
{{else}}
<div class="title-image-container">
<img src="/uploads/placeholder.png" id="product-title-image" class="product-title-image img-fluid" alt="...">
</div>
{{/if}}
{{#ifCond images.length '>' 1}}
{{#each images}}
<div class="vertical-center top-pad-20 col-sm-6">
<img src="{{this.path}}" class="thumbnail-image img-fluid">
</div>
{{/each}}
{{/ifCond}}
</div>
<div class="col-sm-12 col-md-6 ml-auto">
<div class="row">
<h1 class="col-md-10 product-title">{{result.productTitle}}</h1>
<h1 class="col-md-10 product-title text-truncate">{{result.productTitle}}</h1>
<h4 class="col-md-10 product-price">{{currencySymbol config.currencySymbol}}{{result.productPrice}}</h4>
{{#if productOptions}}
<h4 class="col-md-10 product-option">{{ @root.__ "Options" }}</h4>
@ -50,13 +70,13 @@
<div class="col-md-10 productOptions">
<p class="product-option-text">{{ @root.__ "Quantity" }}</p>
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-primary qty-btn-minus" type="button">-</button>
</span>
<div class="input-group-prepend">
<button class="btn btn-outline-primary qty-btn-minus" type="button">-</button>
</div>
<input type="text" class="form-control add-color text-center" id="product_quantity" maxlength="3" value="1">
<span class="input-group-btn">
<button class="btn btn-primary qty-btn-plus" type="button">+</button>
</span>
<div class="input-group-append">
<button class="btn btn-outline-primary qty-btn-plus" type="button">+</button>
</div>
</div>
</div>
{{#if result.productComment}}
@ -66,33 +86,13 @@
</div>
{{/if}}
<div class="col-md-10 btnAddToCart">
<button class="btn btn-primary btn-block product-add-to-cart" type="button">{{ @root.__ "Add to cart" }}</button>
<button class="btn btn-outline-primary btn-block product-add-to-cart" type="button">{{ @root.__ "Add to cart" }}</button>
</div>
<div class="col-md-10 body_text">
{{{productDescription}}}
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 pull-left">
{{#if result.productImage}}
<div class="title-image-container">
<div class="image-prev image-button"> <i class="fa fa-chevron-left" aria-hidden="true"></i></div>
<img src="{{result.productImage}}" id="product-title-image" class="product-title-image img-responsive" alt="...">
<div class="image-next image-button"> <i class="fa fa-chevron-right" aria-hidden="true"></i></div>
</div>
{{else}}
<div class="title-image-container">
<img src="/uploads/placeholder.png" id="product-title-image" class="product-title-image img-responsive" alt="...">
</div>
{{/if}}
{{#ifCond images.length '>' 1}}
{{#each images}}
<div class="vertical-center top-pad-20 col-xs-6 col-lg-6 col-xl-6">
<img src="{{this.path}}" class="thumbnail-image img-responsive">
</div>
{{/each}}
{{/ifCond}}
</div>
</div>
</div>
<input type="hidden" id="productId" value="{{result._id}}">

View File

@ -1,55 +1,60 @@
<div class="col-xs-12 col-md-12">
<div class="form-group">
<input type="email" class="form-control customerDetails" id="shipEmail" name="shipEmail" minlength="5" placeholder="Email address" value="{{@root.session.customerEmail}}" required>
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="form-group">
<input type="email" class="form-control customerDetails" id="shipEmail" name="shipEmail" minlength="5" placeholder="Email address" value="{{@root.session.customerEmail}}" required>
<div class="invalid-feedback">
Please enter a valid email address
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipFirstname" name="shipFirstname" placeholder="First name" value="{{@root.session.customerFirstname}}" required>
<div class="col-sm-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipFirstname" name="shipFirstname" placeholder="First name" value="{{@root.session.customerFirstname}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipLastname" name="shipLastname" placeholder="Last name" value="{{@root.session.customerLastname}}" required>
<div class="col-sm-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipLastname" name="shipLastname" placeholder="Last name" value="{{@root.session.customerLastname}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-12">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipAddr1" name="shipAddr1" placeholder="Address 1" value="{{@root.session.customerAddress1}}" required>
<div class="col-sm-12 col-md-12">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipAddr1" name="shipAddr1" placeholder="Address 1" value="{{@root.session.customerAddress1}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-12">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipAddr2" name="shipAddr2" placeholder="Address 2 (optional)" value="{{@root.session.customerAddress2}}">
<div class="col-sm-12 col-md-12">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipAddr2" name="shipAddr2" placeholder="Address 2 (optional)" value="{{@root.session.customerAddress2}}">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<select class="form-control" id="shipCountry" name="shipCountry" required>
<option value="" disabled selected>Select Country</option>
{{#each countryList}}
<option {{selectState this @root.session.customerCountry}} value="{{this}}">{{this}}</option>
{{/each}}
</select>
<div class="col-sm-12 col-md-12">
<div class="form-group">
<select class="form-control" id="shipCountry" name="shipCountry" required>
<option value="" disabled selected>Select Country</option>
{{#each countryList}}
<option {{selectState this @root.session.customerCountry}} value="{{this}}">{{this}}</option>
{{/each}}
</select>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipState" name="shipState" placeholder="State" value="{{@root.session.customerState}}" required>
<div class="col-sm-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipState" name="shipState" placeholder="State" value="{{@root.session.customerState}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipPostcode" name="shipPostcode" placeholder="Post code" value="{{@root.session.customerPostcode}}" required>
<div class="col-sm-12 col-md-6">
<div class="form-group">
<input type="text" class="form-control customerDetails" id="shipPostcode" name="shipPostcode" placeholder="Post code" value="{{@root.session.customerPostcode}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-12">
<div class="form-group">
<input type="number" class="form-control customerDetails" id="shipPhoneNumber" name="shipPhoneNumber" placeholder="Phone number" value="{{@root.session.customerPhone}}" required>
<div class="col-sm-12 col-md-12">
<div class="form-group">
<input type="number" class="form-control customerDetails" id="shipPhoneNumber" name="shipPhoneNumber" placeholder="Phone number" value="{{@root.session.customerPhone}}" required>
</div>
</div>
</div>
<div class="col-xs-12 col-md-12">
<div class="form-group">
<textarea class="form-control customerDetails" placeholder="Order comment" id="orderComment" name="orderComment">{{@root.session.orderComment}}</textarea>
<div class="col-sm-12 col-md-12">
<div class="form-group">
<textarea class="form-control customerDetails" placeholder="Order comment" id="orderComment" name="orderComment">{{@root.session.orderComment}}</textarea>
</div>
</div>
</div>

View File

@ -1,6 +1,5 @@
.search-bar-input, #frm_search, .search-bar-input .btn{
padding-top: 10px;
height: 45px;
.add-to-cart{
color: white !important;
}
.searchMenuLocation-side {
@ -18,17 +17,22 @@
}
.footer{
padding-top: 20px;
padding-top: 30px;
}
.product-price {
padding-bottom: 0;
}
.navbarMenuWrapper{
.navbarMenuWrapper, .mainNavBar{
background-color: #f5f5f5;
}
.navbarMenuWrapper{
padding-top: 0px;
margin-bottom: 5px;
}
.navbarMenu>ul>li>a:hover{
color: #cc4135 !important;
}
@ -38,7 +42,7 @@
padding-left: 0;
}
.product_wrapper>a:hover{
.product-wrapper>a:hover{
color: #cc4135 !important;
}
@ -51,7 +55,11 @@
padding-top: 35px;
}
.pagination>li>a{
.img-thumbnail {
border: 0;
}
.pagination .page-link{
background-color: #cc4135 !important;
}
@ -59,8 +67,8 @@
color: #cc4135 !important;
letter-spacing: 4px;
padding-left: 20px !important;
padding-top: 20px !important;
height: 100px !important;
padding-top: 0px !important;
height: 80px !important;
font-size: 55px !important;
}
@ -100,6 +108,10 @@
font-size: 20px;
}
.has-error input{
border-color: #dc3545;
}
@media only screen and (max-width: 768px){
.navbar-default .navbar-brand {
padding-top: 10px;

View File

@ -1,5 +1,5 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-8">
<h2>User edit</h2>
@ -34,14 +34,14 @@
<label>API Key</label>
<div class="input-group">
<input type="text" class="form-control" id="apiKey" value="{{user.apiKey}}" aria-label="..." readonly>
<div class="input-group-btn">
<button id="btnGenerateAPIkey" class="btn btn-success">{{ @root.__ "Generate" }}</button>
<div class="input-group-append">
<button id="btnGenerateAPIkey" class="btn btn-outline-success">{{ @root.__ "Generate" }}</button>
</div>
</div>
</div><br/>
<div class="form-group">
<div class="pull-right">
<button type="submit" class="btn btn-success">{{ @root.__ "Update" }}</button>
<button type="submit" class="btn btn-outline-success">{{ @root.__ "Update" }}</button>
</div>
</div>
</form>

View File

@ -1,5 +1,5 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-8">
<h2>{{ @root.__ "New User" }}</h2>
@ -22,7 +22,7 @@
</div>
<div class="form-group">
<div class="pull-right">
<button type="submit" class="btn btn-success">{{ @root.__ "Create" }}</button>
<button type="submit" class="btn btn-outline-success">{{ @root.__ "Create" }}</button>
</div>
</div>
</form>

View File

@ -1,8 +1,8 @@
{{> partials/menu}}
<div class="col-lg-9">
<div class="col-sm-9">
<div class="row">
<div class="col-md-8">
<h2>Users <span class="pull-right"><a href="/admin/user/new" class="btn btn-success btn-sm">{{ @root.__ "New user" }}</a></span></h2>
<h2>Users <span class="pull-right"><a href="/admin/user/new" class="btn btn-outline-success">{{ @root.__ "New user" }}</a></span></h2>
<ul class="list-group">
{{#each users}}
<li class="list-group-item">