diff --git a/package-lock.json b/package-lock.json
index 7c1c84de..abbbc917 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1299,7 +1299,6 @@
"requires": {
"anymatch": "1.3.0",
"async-each": "1.0.1",
- "fsevents": "1.1.2",
"glob-parent": "2.0.0",
"inherits": "2.0.3",
"is-binary-path": "1.0.1",
@@ -3443,905 +3442,6 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "fsevents": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz",
- "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==",
- "dev": true,
- "optional": true,
- "requires": {
- "nan": "2.6.2",
- "node-pre-gyp": "0.6.36"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ajv": {
- "version": "4.11.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "co": "4.6.0",
- "json-stable-stringify": "1.0.1"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true
- },
- "aproba": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.2.9"
- }
- },
- "asn1": {
- "version": "0.2.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "aws4": {
- "version": "1.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true,
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- }
- },
- "boom": {
- "version": "2.10.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "brace-expansion": {
- "version": "1.1.7",
- "bundled": true,
- "dev": true,
- "requires": {
- "balanced-match": "0.4.2",
- "concat-map": "0.0.1"
- }
- },
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "co": {
- "version": "4.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "cryptiles": {
- "version": "2.0.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "boom": "2.10.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "debug": {
- "version": "2.6.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "extend": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "extsprintf": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "form-data": {
- "version": "2.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.15"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "fstream": {
- "version": "1.0.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "inherits": "2.0.3",
- "mkdirp": "0.5.1",
- "rimraf": "2.6.1"
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "fstream": "1.0.11",
- "inherits": "2.0.3",
- "minimatch": "3.0.4"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "aproba": "1.1.1",
- "console-control-strings": "1.1.0",
- "has-unicode": "2.0.1",
- "object-assign": "4.1.1",
- "signal-exit": "3.0.2",
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wide-align": "1.1.2"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "bundled": true,
- "dev": true
- },
- "har-schema": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "har-validator": {
- "version": "4.2.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ajv": "4.11.8",
- "har-schema": "1.0.5"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "hawk": {
- "version": "3.1.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "bundled": true,
- "dev": true
- },
- "http-signature": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.0",
- "sshpk": "1.13.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "dev": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "dev": true
- },
- "ini": {
- "version": "1.3.4",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jodid25519": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsonify": "0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jsonify": {
- "version": "0.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jsprim": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "mime-db": {
- "version": "1.27.0",
- "bundled": true,
- "dev": true
- },
- "mime-types": {
- "version": "2.1.15",
- "bundled": true,
- "dev": true,
- "requires": {
- "mime-db": "1.27.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "brace-expansion": "1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "node-pre-gyp": {
- "version": "0.6.36",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "mkdirp": "0.5.1",
- "nopt": "4.0.1",
- "npmlog": "4.1.0",
- "rc": "1.2.1",
- "request": "2.81.0",
- "rimraf": "2.6.1",
- "semver": "5.3.0",
- "tar": "2.2.1",
- "tar-pack": "3.4.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "abbrev": "1.1.0",
- "osenv": "0.1.4"
- }
- },
- "npmlog": {
- "version": "4.1.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "1.1.4",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "performance-now": {
- "version": "0.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true,
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "qs": {
- "version": "6.4.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "deep-extend": "0.4.2",
- "ini": "1.3.4",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.2.9",
- "bundled": true,
- "dev": true,
- "requires": {
- "buffer-shims": "1.0.0",
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "1.0.1",
- "util-deprecate": "1.0.2"
- }
- },
- "request": {
- "version": "2.81.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "caseless": "0.12.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "2.1.4",
- "har-validator": "4.2.1",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.15",
- "oauth-sign": "0.8.2",
- "performance-now": "0.2.0",
- "qs": "6.4.0",
- "safe-buffer": "5.0.1",
- "stringstream": "0.0.5",
- "tough-cookie": "2.3.2",
- "tunnel-agent": "0.6.0",
- "uuid": "3.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "glob": "7.1.2"
- }
- },
- "safe-buffer": {
- "version": "5.0.1",
- "bundled": true,
- "dev": true
- },
- "semver": {
- "version": "5.3.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "sntp": {
- "version": "1.0.9",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "sshpk": {
- "version": "1.13.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jodid25519": "1.0.2",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "tar": {
- "version": "2.2.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "block-stream": "0.0.9",
- "fstream": "1.0.11",
- "inherits": "2.0.3"
- }
- },
- "tar-pack": {
- "version": "3.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "2.6.8",
- "fstream": "1.0.11",
- "fstream-ignore": "1.0.5",
- "once": "1.4.0",
- "readable-stream": "2.2.9",
- "rimraf": "2.6.1",
- "tar": "2.2.1",
- "uid-number": "0.0.6"
- }
- },
- "tough-cookie": {
- "version": "2.3.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "punycode": "1.4.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "uid-number": {
- "version": "0.0.6",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "uuid": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "verror": {
- "version": "1.3.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "extsprintf": "1.0.2"
- }
- },
- "wide-align": {
- "version": "1.1.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "string-width": "1.0.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- }
- }
- },
"fstream": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
@@ -8940,6 +8040,15 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true
},
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -8967,15 +8076,6 @@
}
}
},
- "string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.1.1"
- }
- },
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index c125b9bd..461ce15c 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -36,6 +36,10 @@ const appRoutes: Routes = [
path : 'apps/calendar',
loadChildren: './main/content/apps/calendar/calendar.module#FuseCalendarModule'
},
+ {
+ path : 'apps/e-commerce',
+ loadChildren: './main/content/apps/e-commerce/e-commerce.module#FuseEcommerceModule'
+ },
{
path : 'apps/todo',
loadChildren: './main/content/apps/todo/todo.module#FuseTodoModule'
diff --git a/src/app/core/fuseUtils.ts b/src/app/core/fuseUtils.ts
index 1d1763f3..c246c033 100644
--- a/src/app/core/fuseUtils.ts
+++ b/src/app/core/fuseUtils.ts
@@ -82,10 +82,12 @@ export class FuseUtils
{
function S4()
{
- return (((1 + Math.random()) * 0x10000) || 0).toString(16).substring(1);
+ return Math.floor((1 + Math.random()) * 0x10000)
+ .toString(16)
+ .substring(1);
}
- return (S4() + S4());
+ return S4() + S4();
}
public static toggleInArray(item, array)
@@ -99,4 +101,14 @@ export class FuseUtils
array.splice(array.indexOf(item), 1);
}
}
+
+ public static handleize(text)
+ {
+ return text.toString().toLowerCase()
+ .replace(/\s+/g, '-') // Replace spaces with -
+ .replace(/[^\w\-]+/g, '') // Remove all non-word chars
+ .replace(/\-\-+/g, '-') // Replace multiple - with single -
+ .replace(/^-+/, '') // Trim - from start of text
+ .replace(/-+$/, ''); // Trim - from end of text
+ }
}
diff --git a/src/app/core/scss/partials/_colors.scss b/src/app/core/scss/partials/_colors.scss
index 0bfdfa10..2a572ae1 100644
--- a/src/app/core/scss/partials/_colors.scss
+++ b/src/app/core/scss/partials/_colors.scss
@@ -187,6 +187,11 @@ $matColorHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400
// Generate material element colors
// based on current contrast color
@include generateMaterialElementColors($contrastColor);
+
+ &[disabled] {
+ background-color: rgba($color, .12) !important;
+ color: rgba($contrastColor, .26) !important;
+ }
}
.#{$colorName}#{$hue}-fg {
diff --git a/src/app/core/scss/partials/_page-layouts.scss b/src/app/core/scss/partials/_page-layouts.scss
index 083e0f80..b1188038 100644
--- a/src/app/core/scss/partials/_page-layouts.scss
+++ b/src/app/core/scss/partials/_page-layouts.scss
@@ -96,7 +96,7 @@ $top-bg-image: url('assets/images/backgrounds/header-bg.png');
max-height: $carded-toolbar-height;
}
- .content {
+ > .content {
display: flex;
flex: 1;
overflow: auto;
diff --git a/src/app/fuse-fake-db/e-commerce.ts b/src/app/fuse-fake-db/e-commerce.ts
new file mode 100644
index 00000000..f35dd3bb
--- /dev/null
+++ b/src/app/fuse-fake-db/e-commerce.ts
@@ -0,0 +1,3962 @@
+export class ECommerceFakeDb
+{
+ public static dashboard = {
+ 'widget1': {
+ 'ranges' : {
+ 'DY' : 'Yesterday',
+ 'DT' : 'Today',
+ 'DTM': 'Tomorrow'
+ },
+ 'currentRange': 'DT',
+ 'data' : {
+ 'label': 'CONVERSION RATE',
+ 'count': {
+ 'DY' : 21,
+ 'DT' : 25,
+ 'DTM': 19
+ },
+ 'extra': {
+ 'label': 'Abandoned carts',
+ 'count': {
+ 'DY' : 3,
+ 'DT' : 7,
+ 'DTM': 8
+ }
+ }
+ },
+ 'detail' : 'You can show some detailed information about this widget in here.'
+ },
+ 'widget2': {
+ 'title' : 'Average Order Value',
+ 'data' : {
+ 'label': '30 DAYS',
+ 'count': 21,
+ 'extra': {
+ 'label': 'Last year same time',
+ 'count': 14
+ }
+ },
+ 'detail': 'You can show some detailed information about this widget in here.'
+ },
+ 'widget3': {
+ 'title' : 'Online Visitors',
+ 'data' : {
+ 'label': 'last 30 minutes',
+ 'count': 32,
+ 'extra': {
+ 'label': 'Total visitors today',
+ 'count': 998
+ }
+ },
+ 'detail': 'You can show some detailed information about this widget in here.'
+ },
+ 'widget4': {
+ 'title' : 'Profit per Visitor',
+ 'data' : {
+ 'label': 'TODAY',
+ 'count': '3,7',
+ 'extra': {
+ 'label': 'Yesterday',
+ 'count': '2,90'
+ }
+ },
+ 'detail': 'You can show some detailed information about this widget in here.'
+ },
+ 'widget5': {
+ 'title' : 'Sales',
+ 'ranges' : {
+ 'TW': 'This Week',
+ 'LW': 'Last Week',
+ '2W': '2 Weeks Ago'
+ },
+ 'mainChart': {
+ '2W': [
+ {
+ 'name' : 'Mon',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 9
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 37
+ }
+ ]
+ },
+ {
+ 'name' : 'Tue',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 12
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 32
+ }
+ ]
+ },
+ {
+ 'name' : 'Wed',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 9
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 39
+ }
+ ]
+ },
+ {
+ 'name' : 'Thu',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 12
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 27
+ }
+ ]
+ },
+ {
+ 'name' : 'Fri',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 7
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 18
+ }
+ ]
+ },
+ {
+ 'name' : 'Sat',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 8
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 24
+ }
+ ]
+ },
+ {
+ 'name' : 'Sun',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 16
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 20
+ }
+ ]
+ }
+ ],
+ 'LW': [
+ {
+ 'name' : 'Mon',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 12
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 37
+ }
+ ]
+ },
+ {
+ 'name' : 'Tue',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 8
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 24
+ }
+ ]
+ },
+ {
+ 'name' : 'Wed',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 7
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 51
+ }
+ ]
+ },
+ {
+ 'name' : 'Thu',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 13
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 31
+ }
+ ]
+ },
+ {
+ 'name' : 'Fri',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 7
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 29
+ }
+ ]
+ },
+ {
+ 'name' : 'Sat',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 6
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 17
+ }
+ ]
+ },
+ {
+ 'name' : 'Sun',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 10
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 31
+ }
+ ]
+ }
+ ],
+ 'TW': [
+ {
+ 'name' : 'Mon',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 11
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 42
+ }
+ ]
+ },
+ {
+ 'name' : 'Tue',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 10
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 28
+ }
+ ]
+ },
+ {
+ 'name' : 'Wed',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 8
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 43
+ }
+ ]
+ },
+ {
+ 'name' : 'Thu',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 11
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 34
+ }
+ ]
+ },
+ {
+ 'name' : 'Fri',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 8
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 20
+ }
+ ]
+ },
+ {
+ 'name' : 'Sat',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 10
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 25
+ }
+ ]
+ },
+ {
+ 'name' : 'Sun',
+ 'series': [
+ {
+ 'name' : 'Sales',
+ 'value': 17
+ },
+ {
+ 'name' : 'Abandoned Carts',
+ 'value': 22
+ }
+ ]
+ }
+ ]
+ }
+ },
+ 'widget6': {
+ 'title' : 'Top 5 Categories',
+ 'ranges' : {
+ 'TW': 'This Week',
+ 'LW': 'Last Week',
+ '2W': '2 Weeks Ago'
+ },
+ 'mainChart' : {
+ '2W': [
+ {
+ 'name' : 'Women Dresses',
+ 'value': 18
+ },
+ {
+ 'name' : 'Men Shoes',
+ 'value': 12
+ },
+ {
+ 'name' : 'Women Shoes',
+ 'value': 40
+ },
+ {
+ 'name' : 'Women Bags',
+ 'value': 20
+ },
+ {
+ 'name' : 'Men T-Shirts',
+ 'value': 10
+ }
+ ],
+ 'LW': [
+ {
+ 'name' : 'Women Dresses',
+ 'value': 17
+ },
+ {
+ 'name' : 'Men Shoes',
+ 'value': 14
+ },
+ {
+ 'name' : 'Women Shoes',
+ 'value': 36
+ },
+ {
+ 'name' : 'Women Bags',
+ 'value': 23
+ },
+ {
+ 'name' : 'Men T-Shirts',
+ 'value': 12
+ }
+ ],
+ 'TW': [
+ {
+ 'name' : 'Women Dresses',
+ 'value': 13
+ },
+ {
+ 'name' : 'Men Shoes',
+ 'value': 16
+ },
+ {
+ 'name' : 'Women Shoes',
+ 'value': 34
+ },
+ {
+ 'name' : 'Women Bags',
+ 'value': 23
+ },
+ {
+ 'name' : 'Men T-Shirts',
+ 'value': 14
+ }
+ ]
+ },
+ 'footerLeft' : {
+ 'title': 'Total Sales',
+ 'count': {
+ '2W': 487,
+ 'LW': 526,
+ 'TW': 594
+ }
+ },
+ 'footerRight': {
+ 'title': 'Sales From Top 5 Categories',
+ 'count': {
+ '2W': 193,
+ 'LW': 260,
+ 'TW': 287
+ }
+ }
+ },
+ 'widget7': {
+ 'title' : 'Latest Customers',
+ 'ranges' : {
+ 'T' : 'Today',
+ 'TM': 'Tomorrow'
+ },
+ 'customers': {
+ 'T' : [
+ {
+ 'name' : 'Abbott Keitch',
+ 'location': 'United States of America'
+ },
+ {
+ 'name' : 'Arnold Matlock',
+ 'location': 'United States of America'
+ },
+ {
+ 'name' : 'Barrera Bradbury',
+ 'location': 'England'
+ },
+ {
+ 'name' : 'Blair Strangeway',
+ 'location': 'Germany'
+ },
+ {
+ 'name' : 'Copeland Redcliff',
+ 'location': 'French'
+ },
+ {
+ 'name' : 'Henderson Cambias',
+ 'location': 'Russia'
+ },
+ {
+ 'name' : 'Lily Peasegood',
+ 'location': 'Mexico'
+ }
+ ],
+ 'TM': [
+ {
+ 'name' : 'Boyle Winters',
+ 'location': 'United States of America'
+ },
+ {
+ 'name' : 'Tyson Marshall',
+ 'location': 'United States of America'
+ },
+ {
+ 'name' : 'Reyna Preece',
+ 'location': 'England'
+ },
+ {
+ 'name' : 'Shauna Atherton',
+ 'location': 'Germany'
+ },
+ {
+ 'name' : 'Tillman Lee',
+ 'location': 'French'
+ },
+ {
+ 'name' : 'Velazquez Smethley',
+ 'location': 'Russia'
+ },
+ {
+ 'name' : 'Helen Sheridan',
+ 'location': 'Mexico'
+ }
+ ]
+ }
+ }
+ };
+
+ public static products = [
+ {
+ 'id' : '1',
+ 'name' : 'Printed Dress',
+ 'handle' : 'printed-dress',
+ 'description' : 'Officia amet eiusmod eu sunt tempor voluptate laboris velit nisi amet enim proident et. Consequat laborum non eiusmod cillum eu exercitation. Qui adipisicing est fugiat eiusmod esse. Sint aliqua cupidatat pariatur mollit ad est proident reprehenderit. Eiusmod adipisicing laborum incididunt sit aliqua ullamco.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 9.309,
+ 'priceTaxIncl' : 10.24,
+ 'taxRate' : 10,
+ 'comparedPrice' : 19.90,
+ 'quantity' : 3,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '2',
+ 'name' : 'Green Skirt',
+ 'handle' : 'green-skirt',
+ 'description' : 'Duis anim est non exercitation consequat. Ullamco ut ipsum dolore est elit est ea elit ad fugiat exercitation. Adipisicing eu ad sit culpa sint. Minim irure Lorem eiusmod minim nisi sit est consectetur.',
+ 'categories' : [
+ 'Skirts',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 22.381,
+ 'priceTaxIncl' : 24.62,
+ 'taxRate' : 10,
+ 'comparedPrice' : 29.90,
+ 'quantity' : 92,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '3',
+ 'name' : 'Printed Dress',
+ 'handle' : 'printed-dress',
+ 'description' : 'Sit ipsum esse eu consequat veniam sit consectetur consectetur anim. Ut Lorem dolor ullamco do. Laboris excepteur consectetur tempor nisi commodo amet deserunt duis.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 44.809,
+ 'priceTaxIncl' : 49.29,
+ 'taxRate' : 10,
+ 'comparedPrice' : 59.90,
+ 'quantity' : 60,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '4',
+ 'name' : 'White T-Shirt',
+ 'handle' : 'white-t-shirt',
+ 'description' : 'Incididunt nostrud culpa labore nostrud veniam nostrud dolore velit sunt laborum ad reprehenderit. Excepteur enim irure ut labore elit ut deserunt qui qui consequat quis do nostrud ad. Aliqua dolor labore ut occaecat laborum irure. Aute in deserunt do aute laborum sit et reprehenderit minim voluptate proident do est.',
+ 'categories' : [
+ 'T-Shirts',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 62.827,
+ 'priceTaxIncl' : 69.11,
+ 'taxRate' : 10,
+ 'comparedPrice' : 79.90,
+ 'quantity' : 101,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : false
+ },
+ {
+ 'id' : '5',
+ 'name' : 'Red Hoodie',
+ 'handle' : 'red-hoodie',
+ 'description' : 'Laboris laborum minim qui reprehenderit duis fugiat ea anim labore incididunt duis. Officia adipisicing anim amet in sit aliqua fugiat quis do sint non velit eu. Labore occaecat labore elit voluptate Lorem adipisicing et ipsum id et reprehenderit ullamco. Elit in nulla laborum nulla quis dolor deserunt magna dolor ad anim magna. Esse aute reprehenderit anim sit est et quis est. Ex reprehenderit culpa deserunt qui sint eiusmod reprehenderit ipsum consequat ut.',
+ 'categories' : [
+ 'Hoodies',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 9.309,
+ 'priceTaxIncl' : 10.24,
+ 'taxRate' : 10,
+ 'comparedPrice' : 19.90,
+ 'quantity' : 19,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '6',
+ 'name' : 'Red Hoodie',
+ 'handle' : 'red-hoodie',
+ 'description' : 'Tempor sunt tempor veniam non culpa excepteur. Ea irure elit non cupidatat cillum dolore. Sit incididunt qui dolore ipsum commodo aliqua amet cupidatat incididunt nisi qui consectetur. Cillum eu aute qui irure aute adipisicing cupidatat magna.',
+ 'categories' : [
+ 'Hoodies',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 53.963,
+ 'priceTaxIncl' : 59.36,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 101,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '7',
+ 'name' : 'Summer Dress',
+ 'handle' : 'summer-dress',
+ 'description' : 'Excepteur commodo ipsum in ex esse elit ea id voluptate id occaecat. Sunt Lorem ipsum ut proident eu aliquip velit non minim. Sunt velit deserunt veniam eu non veniam. Eiusmod sit ex et id incididunt labore aliqua eu aute dolor cillum ex mollit mollit. Incididunt voluptate adipisicing eiusmod non ipsum cupidatat excepteur enim in pariatur eu. Labore dolor qui exercitation amet labore laboris Lorem do adipisicing. Minim non consectetur adipisicing esse ut occaecat incididunt eiusmod commodo et cillum pariatur.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 58.372,
+ 'priceTaxIncl' : 64.21,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 34,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '8',
+ 'name' : 'Black Shoes',
+ 'handle' : 'black-shoes',
+ 'description' : 'Velit cillum cupidatat eiusmod ea quis sit. Consequat dolore elit sunt sunt voluptate irure incididunt consectetur non. Dolore veniam ipsum anim commodo ex. Proident ipsum nostrud ullamco sit. Ad dolore nulla qui mollit laborum ex ipsum.',
+ 'categories' : [
+ 'Shoes',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 63.390,
+ 'priceTaxIncl' : 69.73,
+ 'taxRate' : 10,
+ 'comparedPrice' : 79.90,
+ 'quantity' : 4,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : false
+ },
+ {
+ 'id' : '9',
+ 'name' : 'Yellow Bag',
+ 'handle' : 'yellow-bag',
+ 'description' : 'Consequat minim velit commodo Lorem ipsum velit elit amet ut. In deserunt id duis nisi labore. Proident cillum et reprehenderit excepteur ex nulla enim.',
+ 'categories' : [
+ 'Bags',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 52.154,
+ 'priceTaxIncl' : 57.37,
+ 'taxRate' : 10,
+ 'comparedPrice' : 59.90,
+ 'quantity' : 58,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '10',
+ 'name' : 'Brown Shoes',
+ 'handle' : 'brown-shoes',
+ 'description' : 'Proident do sunt dolor tempor aliquip adipisicing dolor reprehenderit officia proident. Culpa non reprehenderit velit anim consequat velit elit eu culpa quis incididunt id. Eu incididunt exercitation nostrud est mollit officia. Laboris deserunt dolore sit occaecat exercitation quis sunt sunt nisi commodo.',
+ 'categories' : [
+ 'Shoes',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 62.18,
+ 'priceTaxIncl' : 68.40,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 125,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '11',
+ 'name' : 'Brown Shoes',
+ 'handle' : 'brown-shoes',
+ 'description' : 'Aute do cupidatat amet excepteur. Adipisicing est exercitation ullamco velit pariatur ex id laborum ex consectetur velit et eiusmod. Do laborum commodo veniam adipisicing aute cillum. Adipisicing est minim voluptate aliqua nostrud.',
+ 'categories' : [
+ 'Shoes',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 48.727,
+ 'priceTaxIncl' : 53.60,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 27,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '12',
+ 'name' : 'Night Dress',
+ 'handle' : 'night-dress',
+ 'description' : 'Ex culpa et enim aute labore deserunt. Culpa occaecat nostrud culpa elit Lorem deserunt qui nulla ea elit veniam ea. Qui ullamco ullamco minim esse excepteur magna aliquip Lorem tempor ut aliqua sunt ad. Lorem minim tempor aliqua in in. In nisi esse ea eiusmod consequat sint.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 9.309,
+ 'priceTaxIncl' : 10.24,
+ 'taxRate' : 10,
+ 'comparedPrice' : 19.90,
+ 'quantity' : 188,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '13',
+ 'name' : 'Red Hoodie',
+ 'handle' : 'red-hoodie',
+ 'description' : 'Aliquip cillum qui in consectetur ullamco ipsum ea esse eu non nostrud cillum velit minim. Deserunt est do non mollit incididunt enim non consectetur dolore ullamco do ad enim aliqua. Velit ipsum duis sunt sint dolore reprehenderit aute sint sunt esse laborum.',
+ 'categories' : [
+ 'Hoodies',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 22.381,
+ 'priceTaxIncl' : 24.62,
+ 'taxRate' : 10,
+ 'comparedPrice' : 29.90,
+ 'quantity' : 147,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : false
+ },
+ {
+ 'id' : '14',
+ 'name' : 'Red Hoodie',
+ 'handle' : 'red-hoodie',
+ 'description' : 'Proident excepteur consectetur elit eiusmod ipsum in pariatur voluptate laborum ex ullamco. Nisi cupidatat officia veniam eiusmod enim do aute labore dolor in nostrud sunt pariatur ex. Dolore elit non excepteur sint proident aliqua in aliquip irure elit.',
+ 'categories' : [
+ 'Hoodies',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 44.809,
+ 'priceTaxIncl' : 49.29,
+ 'taxRate' : 10,
+ 'comparedPrice' : 59.90,
+ 'quantity' : 21,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : false
+ },
+ {
+ 'id' : '15',
+ 'name' : 'Summer Dress',
+ 'handle' : 'summer-dress',
+ 'description' : 'Exercitation consectetur eiusmod nisi aliqua adipisicing nisi sit eiusmod. Quis ex est in cillum sit consequat ut mollit excepteur ipsum. Culpa Lorem magna cillum qui tempor nisi eiusmod occaecat veniam eiusmod officia culpa. Incididunt est nulla incididunt quis dolore duis id laborum magna veniam velit amet nostrud. Ad deserunt velit dolor irure exercitation reprehenderit nisi occaecat officia anim. Minim eiusmod aliquip eu do ipsum excepteur in reprehenderit voluptate laborum ullamco anim.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 62.827,
+ 'priceTaxIncl' : 69.11,
+ 'taxRate' : 10,
+ 'comparedPrice' : 79.90,
+ 'quantity' : 10,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '16',
+ 'name' : 'Red Hoodie',
+ 'handle' : 'red-hoodie',
+ 'description' : 'Deserunt exercitation Lorem est tempor. Elit magna irure dolore pariatur culpa elit labore laborum anim ad excepteur esse. Irure qui proident irure elit exercitation qui cupidatat mollit in excepteur nulla. Laboris exercitation culpa irure non ea in incididunt est. Dolor ipsum proident esse ea ipsum culpa nulla officia ad ipsum excepteur. Commodo veniam cillum non eu anim exercitation.',
+ 'categories' : [
+ 'Hoodies',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 9.309,
+ 'priceTaxIncl' : 10.24,
+ 'taxRate' : 10,
+ 'comparedPrice' : 19.90,
+ 'quantity' : 68,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '17',
+ 'name' : 'Printed Dress',
+ 'handle' : 'printed-dress',
+ 'description' : 'Labore adipisicing exercitation velit minim nostrud excepteur eu esse. Dolor ullamco exercitation consequat cupidatat amet qui occaecat anim pariatur aute anim enim aute fugiat. Enim sint eiusmod amet nulla consequat aute culpa elit. Laborum laboris duis do quis do dolor incididunt id culpa laborum non est. Commodo ullamco labore duis occaecat est pariatur voluptate occaecat et voluptate occaecat sit.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 53.963,
+ 'priceTaxIncl' : 59.36,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 66,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : false
+ },
+ {
+ 'id' : '18',
+ 'name' : 'Blouse',
+ 'handle' : 'blouse',
+ 'description' : 'Id dolor sunt deserunt adipisicing nostrud sit enim magna. Eu ut ea qui ullamco aute. Elit do non anim labore culpa aliquip eu ullamco magna aliqua culpa velit. Culpa nisi laboris cupidatat ea in officia est ex.',
+ 'categories' : [
+ 'Dresses',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 58.372,
+ 'priceTaxIncl' : 64.21,
+ 'taxRate' : 10,
+ 'comparedPrice' : 69.90,
+ 'quantity' : 60,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '19',
+ 'name' : 'Leather Belt',
+ 'handle' : 'leather-belt',
+ 'description' : 'Enim adipisicing commodo laboris voluptate minim officia irure aliqua exercitation ad. Laboris in elit culpa aute aliquip ex fugiat enim labore. Ut commodo magna dolore dolore officia exercitation non enim id. Est proident enim incididunt consectetur consequat magna consequat esse veniam ea cillum laboris fugiat incididunt.',
+ 'categories' : [
+ 'Belts',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 63.390,
+ 'priceTaxIncl' : 69.73,
+ 'taxRate' : 10,
+ 'comparedPrice' : 79.90,
+ 'quantity' : 78,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ },
+ {
+ 'id' : '20',
+ 'name' : 'Leather Belt',
+ 'handle' : 'leather-belt',
+ 'description' : 'Id et id ad consequat non exercitation laboris enim. Cillum nulla nulla elit ipsum in aliquip culpa fugiat est nulla id adipisicing et. Occaecat aliqua esse dolor aliquip veniam ad amet nisi ipsum. Et aliquip culpa adipisicing Lorem ipsum aute non dolor eu deserunt ex consequat.',
+ 'categories' : [
+ 'Belts',
+ 'Women'
+ ],
+ 'tags' : [
+ 'dress',
+ 'printed'
+ ],
+ 'images' : [
+ {
+ 'id' : 1,
+ 'url' : 'assets/images/backgrounds/january.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 2,
+ 'url' : 'assets/images/backgrounds/february.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 3,
+ 'url' : 'assets/images/backgrounds/march.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 4,
+ 'url' : 'assets/images/backgrounds/april.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 5,
+ 'url' : 'assets/images/backgrounds/may.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 6,
+ 'url' : 'assets/images/backgrounds/june.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 7,
+ 'url' : 'assets/images/backgrounds/july.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 8,
+ 'url' : 'assets/images/backgrounds/august.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 9,
+ 'url' : 'assets/images/backgrounds/september.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 10,
+ 'url' : 'assets/images/backgrounds/october.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 11,
+ 'url' : 'assets/images/backgrounds/november.jpg',
+ 'type': 'image'
+ },
+ {
+ 'id' : 12,
+ 'url' : 'assets/images/backgrounds/december.jpg',
+ 'type': 'image'
+ }
+ ],
+ 'priceTaxExcl' : 52.154,
+ 'priceTaxIncl' : 57.37,
+ 'taxRate' : 10,
+ 'comparedPrice' : 59.90,
+ 'quantity' : 2,
+ 'sku' : 'A445BV',
+ 'width' : '22cm',
+ 'height' : '24cm',
+ 'depth' : '15cm',
+ 'weight' : '3kg',
+ 'extraShippingFee': 3.00,
+ 'active' : true
+ }
+ ];
+
+ public static orders = [
+ {
+ 'id' : 1,
+ 'reference' : '70d4d7d0',
+ 'subtotal' : '39.97',
+ 'tax' : '77.44',
+ 'discount' : '-10.17',
+ 'total' : '73.31',
+ 'date' : '2015/04/25 02:07:59',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Dollie',
+ 'lastName' : 'Bullock',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 13,
+ 'name' : 'On pre-order (not paid)',
+ 'color': 'mat-purple-300-bg',
+ 'date' : '2016/04/03 10:06:18'
+ },
+ {
+ 'id' : 1,
+ 'name' : 'Awaiting check payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/03/17 18:28:37'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '2a894b9e',
+ 'amount' : '73.31',
+ 'method' : 'Credit Card',
+ 'date' : '2016/02/23 15:50:23'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'TNT',
+ 'weight' : '10.44',
+ 'fee' : '7.00',
+ 'date' : '2015/04/10 07:03:52'
+ }
+ ]
+ },
+ {
+ 'id' : 2,
+ 'reference' : '2003479c',
+ 'subtotal' : '98.68',
+ 'tax' : '45.55',
+ 'discount' : '-10.25',
+ 'total' : '24.51',
+ 'date' : '2015/11/07 15:47:31',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Holmes',
+ 'lastName' : 'Hines',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 2,
+ 'name' : 'Payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/10/04 08:54:33'
+ },
+ {
+ 'id' : 1,
+ 'name' : 'Awaiting check payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/05/03 03:43:04'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '79c640c8',
+ 'amount' : '24.51',
+ 'method' : 'Check',
+ 'date' : '2015/04/22 04:49:49'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '2.92',
+ 'fee' : '4.00',
+ 'date' : '2015/07/11 14:57:12'
+ }
+ ]
+ },
+ {
+ 'id' : 3,
+ 'reference' : '09f5443b',
+ 'subtotal' : '23.03',
+ 'tax' : '16.36',
+ 'discount' : '-19.46',
+ 'total' : '87.17',
+ 'date' : '2015/11/26 16:04:40',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Serena',
+ 'lastName' : 'Glover',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 8,
+ 'name' : 'Payment error',
+ 'color': 'mat-red-900-bg',
+ 'date' : '2015/07/02 20:44:34'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Preparing the order',
+ 'color': 'mat-orange-500-bg',
+ 'date' : '2015/03/23 04:59:45'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '5ff44b0c',
+ 'amount' : '87.17',
+ 'method' : 'PayPal',
+ 'date' : '2016/01/25 11:46:28'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '7.53',
+ 'fee' : '7.00',
+ 'date' : '2015/11/25 00:40:54'
+ }
+ ]
+ },
+ {
+ 'id' : 4,
+ 'reference' : '960898d0',
+ 'subtotal' : '13.47',
+ 'tax' : '53.45',
+ 'discount' : '-15.55',
+ 'total' : '26.98',
+ 'date' : '2015/11/23 05:35:18',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Dianne',
+ 'lastName' : 'Prince',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 5,
+ 'name' : 'Delivered',
+ 'color': 'mat-green-800-bg',
+ 'date' : '2015/10/26 16:12:47'
+ },
+ {
+ 'id' : 4,
+ 'name' : 'Shipped',
+ 'color': 'mat-purple-500-bg',
+ 'date' : '2016/02/06 06:42:37'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '787d49b1',
+ 'amount' : '26.98',
+ 'method' : 'Check',
+ 'date' : '2015/03/07 05:50:57'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'FedEx',
+ 'weight' : '11.93',
+ 'fee' : '5.00',
+ 'date' : '2016/03/21 07:08:26'
+ }
+ ]
+ },
+ {
+ 'id' : 5,
+ 'reference' : '2d7f68de',
+ 'subtotal' : '46.93',
+ 'tax' : '12.14',
+ 'discount' : '-19.16',
+ 'total' : '12.97',
+ 'date' : '2015/01/13 06:21:21',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Frankie',
+ 'lastName' : 'Hewitt',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 8,
+ 'name' : 'Payment error',
+ 'color': 'mat-red-900-bg',
+ 'date' : '2015/02/01 09:21:46'
+ },
+ {
+ 'id' : 6,
+ 'name' : 'Canceled',
+ 'color': 'mat-pink-500-bg',
+ 'date' : '2015/11/16 04:48:32'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 'cd8c4727',
+ 'amount' : '12.97',
+ 'method' : 'Bank-wire',
+ 'date' : '2016/05/15 21:15:32'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '5.43',
+ 'fee' : '3.00',
+ 'date' : '2016/01/06 00:51:59'
+ }
+ ]
+ },
+ {
+ 'id' : 6,
+ 'reference' : '9c991708',
+ 'subtotal' : '32.55',
+ 'tax' : '11.81',
+ 'discount' : '-12.33',
+ 'total' : '30.96',
+ 'date' : '2015/01/17 04:21:08',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Cole',
+ 'lastName' : 'Holcomb',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 3,
+ 'name' : 'Preparing the order',
+ 'color': 'mat-orange-500-bg',
+ 'date' : '2015/11/30 01:04:32'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/11/12 21:27:18'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 'a41f4b7c',
+ 'amount' : '30.96',
+ 'method' : 'Check',
+ 'date' : '2015/04/27 03:59:22'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'FedEx',
+ 'weight' : '6.05',
+ 'fee' : '4.00',
+ 'date' : '2015/09/10 11:28:47'
+ }
+ ]
+ },
+ {
+ 'id' : 7,
+ 'reference' : '7683b54d',
+ 'subtotal' : '14.08',
+ 'tax' : '74.96',
+ 'discount' : '-16.60',
+ 'total' : '63.36',
+ 'date' : '2015/06/14 14:49:47',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Merrill',
+ 'lastName' : 'Richardson',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 11,
+ 'name' : 'Awaiting PayPal payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/09/03 18:53:02'
+ },
+ {
+ 'id' : 13,
+ 'name' : 'On pre-order (not paid)',
+ 'color': 'mat-purple-300-bg',
+ 'date' : '2015/12/13 18:14:40'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 1974588,
+ 'amount' : '63.36',
+ 'method' : 'PayPal',
+ 'date' : '2015/11/28 22:24:58'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'FedEx',
+ 'weight' : '2.89',
+ 'fee' : '3.00',
+ 'date' : '2016/02/10 09:03:44'
+ }
+ ]
+ },
+ {
+ 'id' : 8,
+ 'reference' : 'c1de0f75',
+ 'subtotal' : '13.77',
+ 'tax' : '55.78',
+ 'discount' : '-17.20',
+ 'total' : '45.74',
+ 'date' : '2015/01/18 01:31:47',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Morgan',
+ 'lastName' : 'Pitts',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 4,
+ 'name' : 'Shipped',
+ 'color': 'mat-purple-500-bg',
+ 'date' : '2015/04/29 07:57:43'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Preparing the order',
+ 'color': 'mat-orange-500-bg',
+ 'date' : '2015/04/23 11:14:38'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '1e704aaf',
+ 'amount' : '45.74',
+ 'method' : 'Credit Card',
+ 'date' : '2015/06/08 03:50:41'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '6.35',
+ 'fee' : '2.00',
+ 'date' : '2015/06/01 09:18:26'
+ }
+ ]
+ },
+ {
+ 'id' : 9,
+ 'reference' : '35a4dbc6',
+ 'subtotal' : '56.49',
+ 'tax' : '11.44',
+ 'discount' : '-17.45',
+ 'total' : '15.31',
+ 'date' : '2016/02/14 14:22:58',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Krista',
+ 'lastName' : 'Mathis',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 12,
+ 'name' : 'Remote payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/07/15 15:48:00'
+ },
+ {
+ 'id' : 14,
+ 'name' : 'Awaiting Cash-on-delivery payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/11/08 18:30:15'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '762c4e1a',
+ 'amount' : '15.31',
+ 'method' : 'Bank-wire',
+ 'date' : '2015/06/19 14:52:53'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '7.93',
+ 'fee' : '8.00',
+ 'date' : '2015/08/25 15:18:55'
+ }
+ ]
+ },
+ {
+ 'id' : 10,
+ 'reference' : 'a8bc5b17',
+ 'subtotal' : '29.34',
+ 'tax' : '87.50',
+ 'discount' : '-18.11',
+ 'total' : '20.97',
+ 'date' : '2015/10/23 03:02:55',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Hayden',
+ 'lastName' : 'Fitzgerald',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 5,
+ 'name' : 'Delivered',
+ 'color': 'mat-green-800-bg',
+ 'date' : '2016/05/02 09:53:55'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/07/11 05:33:31'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '3dce47a3',
+ 'amount' : '20.97',
+ 'method' : 'Credit Card',
+ 'date' : '2015/07/28 23:53:49'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'TNT',
+ 'weight' : '9.20',
+ 'fee' : '2.00',
+ 'date' : '2015/08/05 08:45:55'
+ }
+ ]
+ },
+ {
+ 'id' : 11,
+ 'reference' : '54ab8191',
+ 'subtotal' : '50.35',
+ 'tax' : '71.75',
+ 'discount' : '-10.46',
+ 'total' : '72.30',
+ 'date' : '2015/07/28 13:22:49',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Cotton',
+ 'lastName' : 'Carlson',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 9,
+ 'name' : 'On pre-order (paid)',
+ 'color': 'mat-purple-300-bg',
+ 'date' : '2016/02/26 14:15:38'
+ },
+ {
+ 'id' : 4,
+ 'name' : 'Shipped',
+ 'color': 'mat-purple-500-bg',
+ 'date' : '2015/10/17 03:32:39'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 'f4154419',
+ 'amount' : '72.30',
+ 'method' : 'PayPal',
+ 'date' : '2016/03/07 15:10:12'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '2.81',
+ 'fee' : '7.00',
+ 'date' : '2016/05/01 11:15:22'
+ }
+ ]
+ },
+ {
+ 'id' : 12,
+ 'reference' : '6919050',
+ 'subtotal' : '81.95',
+ 'tax' : '22.44',
+ 'discount' : '-10.89',
+ 'total' : '42.54',
+ 'date' : '2015/06/07 17:54:36',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Kaye',
+ 'lastName' : 'Baldwin',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 10,
+ 'name' : 'Awaiting bank wire payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/09/01 20:50:07'
+ },
+ {
+ 'id' : 12,
+ 'name' : 'Remote payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2016/02/13 21:19:04'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 44464979,
+ 'amount' : '42.54',
+ 'method' : 'Credit Card',
+ 'date' : '2015/06/30 11:59:49'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'FedEx',
+ 'weight' : '5.52',
+ 'fee' : '2.00',
+ 'date' : '2015/03/15 07:08:37'
+ }
+ ]
+ },
+ {
+ 'id' : 13,
+ 'reference' : '1d4e89f0',
+ 'subtotal' : '67.10',
+ 'tax' : '46.96',
+ 'discount' : '-11.64',
+ 'total' : '97.49',
+ 'date' : '2016/02/06 13:26:55',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Iva',
+ 'lastName' : 'Clark',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 6,
+ 'name' : 'Canceled',
+ 'color': 'mat-pink-500-bg',
+ 'date' : '2015/03/31 03:01:12'
+ },
+ {
+ 'id' : 8,
+ 'name' : 'Payment error',
+ 'color': 'mat-red-900-bg',
+ 'date' : '2016/03/11 18:53:35'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '2aef4aa3',
+ 'amount' : '97.49',
+ 'method' : 'Check',
+ 'date' : '2015/05/13 13:28:52'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'TNT',
+ 'weight' : '5.37',
+ 'fee' : '6.00',
+ 'date' : '2015/04/22 01:48:15'
+ }
+ ]
+ },
+ {
+ 'id' : 14,
+ 'reference' : 'd897564e',
+ 'subtotal' : '55.50',
+ 'tax' : '48.92',
+ 'discount' : '-18.45',
+ 'total' : '16.95',
+ 'date' : '2016/01/17 04:23:11',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Shauna',
+ 'lastName' : 'Rosales',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 7,
+ 'name' : 'Refunded',
+ 'color': 'mat-red-500-bg',
+ 'date' : '2015/12/29 15:34:46'
+ },
+ {
+ 'id' : 11,
+ 'name' : 'Awaiting PayPal payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/07/14 19:10:43'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': 'b7ea43c9',
+ 'amount' : '16.95',
+ 'method' : 'PayPal',
+ 'date' : '2015/07/11 07:18:06'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'TNT',
+ 'weight' : '6.49',
+ 'fee' : '6.00',
+ 'date' : '2015/01/05 13:42:13'
+ }
+ ]
+ },
+ {
+ 'id' : 15,
+ 'reference' : '1a803de2',
+ 'subtotal' : '13.73',
+ 'tax' : '64.42',
+ 'discount' : '-19.64',
+ 'total' : '20.34',
+ 'date' : '2015/09/26 14:26:33',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Carroll',
+ 'lastName' : 'Dotson',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 1,
+ 'name' : 'Awaiting check payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/12/21 10:42:21'
+ },
+ {
+ 'id' : 6,
+ 'name' : 'Canceled',
+ 'color': 'mat-pink-500-bg',
+ 'date' : '2016/02/11 05:58:55'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '0633458c',
+ 'amount' : '20.34',
+ 'method' : 'Check',
+ 'date' : '2015/07/17 20:54:14'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'TNT',
+ 'weight' : '3.30',
+ 'fee' : '2.00',
+ 'date' : '2015/11/04 14:08:16'
+ }
+ ]
+ },
+ {
+ 'id' : 16,
+ 'reference' : '7d90eaa6',
+ 'subtotal' : '99.07',
+ 'tax' : '31.36',
+ 'discount' : '-18.23',
+ 'total' : '10.64',
+ 'date' : '2015/08/10 14:28:10',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Jeannie',
+ 'lastName' : 'Reese',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 9,
+ 'name' : 'On pre-order (paid)',
+ 'color': 'mat-purple-300-bg',
+ 'date' : '2015/06/20 08:37:46'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/01/01 01:42:21'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '45f7440a',
+ 'amount' : '10.64',
+ 'method' : 'PayPal',
+ 'date' : '2015/11/23 11:14:47'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '9.94',
+ 'fee' : '6.00',
+ 'date' : '2016/04/30 19:17:39'
+ }
+ ]
+ },
+ {
+ 'id' : 17,
+ 'reference' : 'cf9b4bfc',
+ 'subtotal' : '96.93',
+ 'tax' : '74.32',
+ 'discount' : '-12.63',
+ 'total' : '27.06',
+ 'date' : '2015/11/10 16:54:11',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Dena',
+ 'lastName' : 'Rowe',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 5,
+ 'name' : 'Delivered',
+ 'color': 'mat-green-800-bg',
+ 'date' : '2015/03/23 00:18:52'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Preparing the order',
+ 'color': 'mat-orange-500-bg',
+ 'date' : '2015/03/22 04:48:12'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '966f4c8e',
+ 'amount' : '27.06',
+ 'method' : 'PayPal',
+ 'date' : '2015/07/10 17:22:44'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'FedEx',
+ 'weight' : '6.81',
+ 'fee' : '3.00',
+ 'date' : '2015/01/23 07:31:46'
+ }
+ ]
+ },
+ {
+ 'id' : 18,
+ 'reference' : '07a938c4',
+ 'subtotal' : '67.73',
+ 'tax' : '33.33',
+ 'discount' : '-12.33',
+ 'total' : '91.50',
+ 'date' : '2015/08/26 16:24:38',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Blankenship',
+ 'lastName' : 'Lynch',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 6,
+ 'name' : 'Canceled',
+ 'color': 'mat-pink-500-bg',
+ 'date' : '2016/03/24 22:56:35'
+ },
+ {
+ 'id' : 4,
+ 'name' : 'Shipped',
+ 'color': 'mat-purple-500-bg',
+ 'date' : '2016/04/09 13:33:26'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '411a4e97',
+ 'amount' : '91.50',
+ 'method' : 'PayPal',
+ 'date' : '2016/02/05 05:35:52'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '6.11',
+ 'fee' : '7.00',
+ 'date' : '2015/10/20 10:46:31'
+ }
+ ]
+ },
+ {
+ 'id' : 19,
+ 'reference' : 'd460f4ff',
+ 'subtotal' : '15.83',
+ 'tax' : '41.90',
+ 'discount' : '-16.54',
+ 'total' : '47.99',
+ 'date' : '2015/01/04 21:13:53',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Whitley',
+ 'lastName' : 'Mcgee',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 7,
+ 'name' : 'Refunded',
+ 'color': 'mat-red-500-bg',
+ 'date' : '2015/08/10 17:14:57'
+ },
+ {
+ 'id' : 5,
+ 'name' : 'Delivered',
+ 'color': 'mat-green-800-bg',
+ 'date' : '2016/03/30 01:38:14'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '761943c2',
+ 'amount' : '47.99',
+ 'method' : 'PayPal',
+ 'date' : '2015/10/11 20:10:46'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '5.51',
+ 'fee' : '5.00',
+ 'date' : '2015/08/28 21:24:36'
+ }
+ ]
+ },
+ {
+ 'id' : 20,
+ 'reference' : 'ba6a946d',
+ 'subtotal' : '36.84',
+ 'tax' : '20.12',
+ 'discount' : '-14.57',
+ 'total' : '44.40',
+ 'date' : '2015/02/24 00:57:18',
+ 'customer' : {
+ 'id' : 1,
+ 'firstName' : 'Hood',
+ 'lastName' : 'Hodges',
+ 'avatar' : 'assets/images/avatars/Abbott.jpg',
+ 'company' : 'Saois',
+ 'jobTitle' : 'Digital Archivist',
+ 'email' : 'abbott@withinpixels.com',
+ 'phone' : '+1-202-555-0175',
+ 'invoiceAddress' : {
+ 'address': '704 6th Ave, New York, NY 10010, USA',
+ 'lat' : 40.7424739,
+ 'lng' : -73.99283919999999
+ },
+ 'shippingAddress': {
+ 'address': '377 E South Omaha Bridge Rd, Council Bluffs, IA 51501, USA',
+ 'lat' : 41.2183223,
+ 'lng' : -95.8420876
+ }
+ },
+ 'products' : [
+ {
+ 'id' : 1,
+ 'name' : 'Printed Dress',
+ 'price' : '10.24',
+ 'quantity': 1,
+ 'total' : '10.24',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Green Skirt',
+ 'price' : '24.62',
+ 'quantity': 1,
+ 'total' : '24.62',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Printed Dress',
+ 'price' : '49.29',
+ 'quantity': 1,
+ 'total' : '49.29',
+ 'image' : 'assets/images/ecommerce/product-image-placeholder.png'
+ }
+ ],
+ 'status' : [
+ {
+ 'id' : 10,
+ 'name' : 'Awaiting bank wire payment',
+ 'color': 'mat-blue-500-bg',
+ 'date' : '2015/05/19 11:09:56'
+ },
+ {
+ 'id' : 12,
+ 'name' : 'Remote payment accepted',
+ 'color': 'mat-green-500-bg',
+ 'date' : '2015/03/27 05:02:33'
+ }
+ ],
+ 'payment' : {
+ 'transactionId': '4af94368',
+ 'amount' : '44.40',
+ 'method' : 'PayPal',
+ 'date' : '2015/11/11 14:25:39'
+ },
+ 'shippingDetails': [
+ {
+ 'tracking': '',
+ 'carrier' : 'USPS',
+ 'weight' : '3.63',
+ 'fee' : '5.00',
+ 'date' : '2016/03/01 09:07:49'
+ }
+ ]
+ }
+ ];
+}
diff --git a/src/app/fuse-fake-db/fuse-fake-db.service.ts b/src/app/fuse-fake-db/fuse-fake-db.service.ts
index 7ab922a2..5d5a1cc7 100644
--- a/src/app/fuse-fake-db/fuse-fake-db.service.ts
+++ b/src/app/fuse-fake-db/fuse-fake-db.service.ts
@@ -15,6 +15,7 @@ import { ProjectsDashboardDb } from './projects-dashboard';
import { ScrumboardFakeDb } from './scrumboard';
import { FaqFakeDb } from './faq';
import { KnowledgeBaseFakeDb } from './knowledge-base';
+import { ECommerceFakeDb } from './e-commerce';
export class FuseFakeDbService implements InMemoryDbService
{
@@ -48,7 +49,10 @@ export class FuseFakeDbService implements InMemoryDbService
'projects-dashboard-widgets' : ProjectsDashboardDb.widgets,
'scrumboard-boards' : ScrumboardFakeDb.boards,
'faq' : FaqFakeDb.data,
- 'knowledge-base' : KnowledgeBaseFakeDb.data
+ 'knowledge-base' : KnowledgeBaseFakeDb.data,
+ 'e-commerce-dashboard' : ECommerceFakeDb.dashboard,
+ 'e-commerce-products' : ECommerceFakeDb.products,
+ 'e-commerce-orders' : ECommerceFakeDb.orders
};
}
}
diff --git a/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.html b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.html
new file mode 100644
index 00000000..4853088e
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.html
@@ -0,0 +1,325 @@
+
diff --git a/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.scss b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.scss
new file mode 100644
index 00000000..593372fc
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.scss
@@ -0,0 +1,7 @@
+#e-commerce-dashboard {
+
+ .content {
+ flex: 1 0 auto;
+ }
+
+}
diff --git a/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.ts b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.ts
new file mode 100644
index 00000000..08419154
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/dashboard/dashboard.component.ts
@@ -0,0 +1,93 @@
+import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
+import { EcommerceDashboardService } from './dashboard.service';
+import * as shape from 'd3-shape';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+import { Observable } from 'rxjs/Observable';
+import { DataSource } from '@angular/cdk/collections';
+import { fuseAnimations } from '../../../../../core/animations';
+
+@Component({
+ selector : 'fuse-e-commerce-dashboard',
+ templateUrl : './dashboard.component.html',
+ styleUrls : ['./dashboard.component.scss'],
+ encapsulation: ViewEncapsulation.None,
+ animations : fuseAnimations
+})
+export class FuseEcommerceDashboardComponent implements OnInit, OnDestroy
+{
+ projects: any[];
+ selectedProject: any;
+
+ widgets: any;
+ widget5: any = {};
+ widget6: any = {};
+ widget7: any = {};
+
+ dateNow = Date.now();
+
+ constructor(private projectsDashboardService: EcommerceDashboardService)
+ {
+ this.projects = this.projectsDashboardService.projects;
+
+ this.selectedProject = this.projects[0];
+
+ this.widgets = this.projectsDashboardService.widgets;
+
+ /**
+ * Widget 5
+ */
+ this.widget5 = {
+ currentRange : 'TW',
+ xAxis : true,
+ yAxis : true,
+ gradient : false,
+ legend : false,
+ showXAxisLabel: false,
+ xAxisLabel : 'Days',
+ showYAxisLabel: false,
+ yAxisLabel : 'Isues',
+ scheme : {
+ domain: ['#42BFF7', '#C6ECFD', '#C7B42C', '#AAAAAA']
+ },
+ onSelect : (ev) => {
+ console.log(ev);
+ }
+ };
+
+ /**
+ * Widget 6
+ */
+ this.widget6 = {
+ currentRange : 'TW',
+ legend : false,
+ explodeSlices: false,
+ labels : true,
+ doughnut : true,
+ gradient : false,
+ scheme : {
+ domain: ['#f44336', '#9c27b0', '#03a9f4', '#e91e63']
+ },
+ onSelect : (ev) => {
+ console.log(ev);
+ }
+ };
+
+ /**
+ * Widget 7
+ */
+ this.widget7 = {
+ currentRange: 'T'
+ };
+
+ }
+
+ ngOnInit()
+ {
+ }
+
+ ngOnDestroy()
+ {
+ }
+
+}
+
diff --git a/src/app/main/content/apps/e-commerce/dashboard/dashboard.service.ts b/src/app/main/content/apps/e-commerce/dashboard/dashboard.service.ts
new file mode 100644
index 00000000..654da549
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/dashboard/dashboard.service.ts
@@ -0,0 +1,62 @@
+import { Injectable } from '@angular/core';
+import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { HttpClient } from '@angular/common/http';
+
+@Injectable()
+export class EcommerceDashboardService implements Resolve
+{
+ projects: any[];
+ widgets: any[];
+
+ constructor(
+ private http: HttpClient
+ )
+ {
+ }
+
+ /**
+ * Resolve
+ * @param {ActivatedRouteSnapshot} route
+ * @param {RouterStateSnapshot} state
+ * @returns {Observable | Promise | any}
+ */
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any
+ {
+
+ return new Promise((resolve, reject) => {
+
+ Promise.all([
+ this.getProjects(),
+ this.getWidgets()
+ ]).then(
+ () => {
+ resolve();
+ },
+ reject
+ );
+ });
+ }
+
+ getProjects(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ this.http.get('api/projects-dashboard-projects')
+ .subscribe((response: any) => {
+ this.projects = response;
+ resolve(response);
+ }, reject);
+ });
+ }
+
+ getWidgets(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ this.http.get('api/e-commerce-dashboard')
+ .subscribe((response: any) => {
+ this.widgets = response;
+ resolve(response);
+ }, reject);
+ });
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/e-commerce.module.ts b/src/app/main/content/apps/e-commerce/e-commerce.module.ts
new file mode 100644
index 00000000..96a599a2
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/e-commerce.module.ts
@@ -0,0 +1,91 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { NgxChartsModule } from '@swimlane/ngx-charts';
+import { FuseEcommerceDashboardComponent } from './dashboard/dashboard.component';
+import { EcommerceDashboardService } from './dashboard/dashboard.service';
+import { SharedModule } from '../../../../core/modules/shared.module';
+import { FuseWidgetModule } from '../../../../core/components/widget/widget.module';
+import { FuseEcommerceProductsComponent } from './products/products.component';
+import { EcommerceProductsService } from './products/products.service';
+import { FuseEcommerceProductComponent } from './product/product.component';
+import { EcommerceProductService } from './product/product.service';
+import { FuseEcommerceOrdersComponent } from './orders/orders.component';
+import { EcommerceOrdersService } from './orders/orders.service';
+import { FuseEcommerceOrderComponent } from './order/order.component';
+import { EcommerceOrderService } from './order/order.service';
+import { AgmCoreModule } from '@agm/core';
+
+const routes: Routes = [
+ {
+ path : 'dashboard',
+ component: FuseEcommerceDashboardComponent,
+ resolve : {
+ data: EcommerceDashboardService
+ }
+ },
+ {
+ path : 'products',
+ component: FuseEcommerceProductsComponent,
+ resolve : {
+ data: EcommerceProductsService
+ }
+ },
+ {
+ path : 'products/:id',
+ component: FuseEcommerceProductComponent,
+ resolve : {
+ data: EcommerceProductService
+ }
+ },
+ {
+ path : 'products/:id/:handle',
+ component: FuseEcommerceProductComponent,
+ resolve : {
+ data: EcommerceProductService
+ }
+ },
+ {
+ path : 'orders',
+ component: FuseEcommerceOrdersComponent,
+ resolve : {
+ data: EcommerceOrdersService
+ }
+ },
+ {
+ path : 'orders/:id',
+ component: FuseEcommerceOrderComponent,
+ resolve : {
+ data: EcommerceOrderService
+ }
+ }
+
+];
+
+@NgModule({
+ imports : [
+ SharedModule,
+ RouterModule.forChild(routes),
+ FuseWidgetModule,
+ NgxChartsModule,
+ AgmCoreModule.forRoot({
+ apiKey: 'AIzaSyD81ecsCj4yYpcXSLFcYU97PvRsE_X8Bx8'
+ })
+ ],
+ declarations: [
+ FuseEcommerceDashboardComponent,
+ FuseEcommerceProductsComponent,
+ FuseEcommerceProductComponent,
+ FuseEcommerceOrdersComponent,
+ FuseEcommerceOrderComponent
+ ],
+ providers : [
+ EcommerceDashboardService,
+ EcommerceProductsService,
+ EcommerceProductService,
+ EcommerceOrdersService,
+ EcommerceOrderService
+ ]
+})
+export class FuseEcommerceModule
+{
+}
diff --git a/src/app/main/content/apps/e-commerce/order/order-statuses.ts b/src/app/main/content/apps/e-commerce/order/order-statuses.ts
new file mode 100644
index 00000000..c2d15d88
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order-statuses.ts
@@ -0,0 +1,72 @@
+export const orderStatuses = [
+ {
+ 'id' : 1,
+ 'name' : 'Awaiting check payment',
+ 'color': 'mat-blue-500-bg'
+ },
+ {
+ 'id' : 2,
+ 'name' : 'Payment accepted',
+ 'color': 'mat-green-500-bg'
+ },
+ {
+ 'id' : 3,
+ 'name' : 'Preparing the order',
+ 'color': 'mat-orange-500-bg'
+ },
+ {
+ 'id' : 4,
+ 'name' : 'Shipped',
+ 'color': 'mat-purple-500-bg'
+ },
+ {
+ 'id' : 5,
+ 'name' : 'Delivered',
+ 'color': 'mat-green-800-bg'
+ },
+ {
+ 'id' : 6,
+ 'name' : 'Canceled',
+ 'color': 'mat-pink-500-bg'
+ },
+ {
+ 'id' : 7,
+ 'name' : 'Refunded',
+ 'color': 'mat-red-500-bg'
+ },
+ {
+ 'id' : 8,
+ 'name' : 'Payment error',
+ 'color': 'mat-red-900-bg'
+ },
+ {
+ 'id' : 9,
+ 'name' : 'On pre-order (paid)',
+ 'color': 'mat-purple-300-bg'
+ },
+ {
+ 'id' : 10,
+ 'name' : 'Awaiting bank wire payment',
+ 'color': 'mat-blue-500-bg'
+ },
+ {
+ 'id' : 11,
+ 'name' : 'Awaiting PayPal payment',
+ 'color': 'mat-blue-500-bg'
+ },
+ {
+ 'id' : 12,
+ 'name' : 'Remote payment accepted',
+ 'color': 'mat-green-500-bg'
+ },
+ {
+ 'id' : 13,
+ 'name' : 'On pre-order (not paid)',
+ 'color': 'mat-purple-300-bg'
+ },
+ {
+ 'id' : 14,
+ 'name' : 'Awaiting Cash-on-delivery payment',
+ 'color': 'mat-blue-500-bg'
+ }
+];
diff --git a/src/app/main/content/apps/e-commerce/order/order.component.html b/src/app/main/content/apps/e-commerce/order/order.component.html
new file mode 100644
index 00000000..9e6b7e9f
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order.component.html
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
account_circle
+
Customer
+
+
+
+
+
+
+ Name |
+ Email |
+ Phone |
+ Company |
+
+
+
+
+
+
+
+ {{order.customer.firstName}} {{order.customer.lastName}}
+
+ |
+
+ {{order.customer.email}}
+ |
+
+ {{order.customer.phone}}
+ |
+
+ {{order.customer.company}}
+ |
+
+
+
+
+
+
+
+
+
+
{{order.customer.shippingAddress.address}}
+
+
+
+
+
+
+
+
+
+
{{order.customer.invoiceAddress.address}}
+
+
+
+
+
+
+
+
+
+
+
+
+
access_time
+
Order Status
+
+
+
+
+
+ Status |
+ Updated On |
+
+
+
+
+
+
+
+ {{status.name}}
+
+ |
+
+
+ {{status.date | date}}
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
attach_money
+
Payment
+
+
+
+
+
+ TransactionID |
+ Payment Method |
+ Amount |
+ Date |
+
+
+
+
+
+
+ {{order.payment.transactionId}}
+
+ |
+
+
+ {{order.payment.method}}
+
+ |
+
+
+ {{order.payment.amount}}
+
+ |
+
+
+ {{order.payment.date | date}}
+
+ |
+
+
+
+
+
+
+
+
+
+
local_shipping
+
Shipping
+
+
+
+
+
+ Tracking Code |
+ Carrier |
+ Weight |
+ Fee |
+ Date |
+
+
+
+
+
+ {{shipping.tracking}}
+ |
+
+ {{shipping.carrier}}
+ |
+
+ {{shipping.weight}}
+ |
+
+ {{shipping.fee}}
+ |
+
+ {{shipping.date}}
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID |
+ Image |
+ Name |
+ Price |
+ Quantity |
+
+
+
+
+
+ {{product.id}}
+ |
+
+
+ |
+
+ {{product.name}}
+ |
+
+ {{product.price}}
+ |
+
+ {{product.quantity}}
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PRODUCT |
+ PRICE |
+ QUANTITY |
+ TOTAL |
+
+
+
+
+
+
+ {{product.name}}
+
+ |
+
+ {{product.price | currency:'USD':true}}
+ |
+
+ {{product.quantity}}
+ |
+
+ {{product.total | currency:'USD':true}}
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/main/content/apps/e-commerce/order/order.component.scss b/src/app/main/content/apps/e-commerce/order/order.component.scss
new file mode 100644
index 00000000..2becc79d
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order.component.scss
@@ -0,0 +1,395 @@
+@import "src/app/core/scss/fuse";
+
+#order {
+
+ .header {
+
+ .subtitle {
+ margin: 6px 0 0 0;
+ }
+ }
+
+ .content {
+
+ .mat-tab-group,
+ .mat-tab-body-wrapper,
+ .tab-content {
+ flex: 1 1 auto;
+ max-width: 100%;
+ }
+
+ .tab-content {
+ flex: 1 1 auto;
+
+ &.products {
+
+ .product-row {
+ cursor: pointer;
+ }
+ }
+
+ &.invoice {
+
+ #invoice {
+
+ &.compact {
+ padding: 0;
+ overflow: auto;
+
+ .invoice-container {
+ padding: 64px;
+
+ .card {
+ width: 1020px;
+ min-width: 1020px;
+ max-width: 1020px;
+ padding: 64px 88px;
+ overflow: hidden;
+ background: #FFFFFF;
+ @include mat-elevation(7);
+
+ .header {
+
+ .invoice-date {
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.54);
+ margin-bottom: 32px;
+ }
+
+ .client {
+
+ .invoice-number {
+ font-size: 18px;
+ padding-bottom: 2px;
+
+ .title {
+ color: rgba(0, 0, 0, 0.54);
+ }
+
+ .number {
+ padding-left: 6px;
+ }
+ }
+
+ .due-date {
+ font-size: 18px;
+ padding-bottom: 16px;
+
+ .title {
+ color: rgba(0, 0, 0, 0.54);
+ }
+
+ .date {
+ padding-left: 6px;
+ }
+ }
+
+ .info {
+ color: rgba(0, 0, 0, 0.54);
+ line-height: 22px;
+ }
+ }
+
+ .issuer {
+ margin-right: -88px;
+ padding-right: 66px;
+
+ .logo {
+ width: 96px;
+ padding: 0 8px;
+ border-right: 1px solid rgba(255, 255, 255, 0.7);
+ }
+
+ .info {
+ padding: 16px;
+ }
+ }
+ }
+
+ .content {
+
+ .invoice-table {
+ margin-top: 64px;
+ font-size: 15px;
+
+ thead {
+
+ tr {
+
+ th {
+
+ &:first-child {
+ padding-left: 8px;
+ }
+
+ &:last-child {
+ padding-right: 8px;
+ }
+ }
+ }
+ }
+
+ tbody {
+
+ tr {
+
+ td {
+
+ &:first-child {
+ padding-left: 8px;
+ }
+
+ &:last-child {
+ padding-right: 8px;
+ }
+ }
+ }
+ }
+
+ .title {
+ font-size: 16px;
+ }
+
+ .detail {
+ margin-top: 8px;
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.54);
+ max-width: 360px;
+ }
+ }
+
+ .invoice-table-footer {
+ margin: 32px 0 72px 0;
+
+ tr {
+
+ td {
+ text-align: right;
+ font-size: 16px;
+ font-weight: 500;
+ color: rgba(0, 0, 0, 0.54);
+ border-bottom: none;
+ padding: 4px 8px;
+
+ &:first-child {
+ text-align: left;
+ }
+ }
+
+ &.discount {
+
+ td {
+ padding-bottom: 32px;
+ }
+ }
+
+ &.total {
+
+ td {
+ padding: 24px 8px;
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
+ font-size: 35px;
+ font-weight: 300;
+ color: rgba(0, 0, 0, 1);
+ }
+ }
+ }
+ }
+ }
+
+ .footer {
+
+ .note {
+ font-size: 15px;
+ font-weight: 500;
+ margin-bottom: 24px;
+ }
+
+ // IE10 fix
+ .logo, .small-note {
+ -ms-flex: 0 1 auto;
+ }
+
+ .logo {
+ width: 32px;
+ min-width: 32px;
+ margin-right: 24px;
+ }
+
+ .small-note {
+ font-size: 12px;
+ font-weight: 500;
+ color: rgba(0, 0, 0, 0.54);
+ line-height: 18px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* PRINT STYLES */
+ @media print {
+
+ /* Invoice Specific Styles */
+ #invoice {
+
+ &.compact {
+
+ .invoice-container {
+ padding: 0;
+
+ .card {
+ width: 100%;
+ min-width: 0;
+ background: none;
+ padding: 0;
+ box-shadow: none;
+
+ .header {
+
+ .invoice-date {
+ margin-bottom: 16pt;
+ }
+
+ .issuer {
+ padding-right: 0;
+ margin-right: 0;
+ }
+ }
+
+ .content {
+
+ .invoice-table {
+ margin-top: 16pt;
+
+ thead {
+
+ tr {
+
+ th {
+ font-size: 10pt;
+ max-width: 60pt;
+
+ &:first-child {
+ padding-left: 0;
+ }
+
+ &:last-child {
+ padding-right: 0;
+ }
+ }
+ }
+ }
+
+ tbody {
+
+ tr {
+
+ td {
+
+ &:first-child {
+ padding-left: 0;
+ }
+
+ &:last-child {
+ padding-right: 0;
+ }
+ }
+ }
+ }
+
+ .title {
+ font-size: 10pt;
+ }
+
+ .detail {
+ margin-top: 4pt;
+ font-size: 9pt;
+ max-width: none;
+ }
+ }
+
+ .invoice-table-footer {
+ margin: 16pt 0;
+
+ tr {
+
+ td {
+ font-size: 13pt;
+ padding: 4pt 4pt;
+
+ &:first-child {
+ text-align: left;
+ padding-left: 0;
+ }
+
+ &:last-child {
+ padding-right: 0;
+ }
+ }
+
+ &.discount {
+
+ td {
+ padding-bottom: 16pt;
+ }
+ }
+
+ &.total {
+
+ td {
+ padding: 16pt 4pt 0 4pt;
+ font-size: 16pt;
+
+ &:first-child {
+ padding-left: 0;
+ }
+
+ &:last-child {
+ padding-right: 0;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .footer {
+
+ .note {
+ font-size: 10pt;
+ margin-bottom: 8pt;
+ }
+
+ .logo {
+ margin-right: 8pt;
+ }
+
+ .small-note {
+ font-size: 8pt;
+ line-height: normal;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .mat-tab-body-content {
+ display: flex;
+ }
+
+ .mat-tab-label {
+ height: 64px;
+ }
+
+ table {
+ table-layout: fixed;
+ }
+ }
+
+}
diff --git a/src/app/main/content/apps/e-commerce/order/order.component.ts b/src/app/main/content/apps/e-commerce/order/order.component.ts
new file mode 100644
index 00000000..3a7325e4
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order.component.ts
@@ -0,0 +1,78 @@
+import { Component, ElementRef, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
+import { EcommerceOrderService } from './order.service';
+import { fuseAnimations } from '../../../../../core/animations';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from 'rxjs/Subscription';
+import { Order } from './order.model';
+import { FormBuilder, FormGroup } from '@angular/forms';
+import { FuseUtils } from '../../../../../core/fuseUtils';
+import { MatSnackBar } from '@angular/material';
+import { Location } from '@angular/common';
+import { orderStatuses } from './order-statuses';
+
+@Component({
+ selector : 'fuse-e-commerce-order',
+ templateUrl : './order.component.html',
+ styleUrls : ['./order.component.scss'],
+ encapsulation: ViewEncapsulation.None,
+ animations : fuseAnimations
+})
+export class FuseEcommerceOrderComponent implements OnInit, OnDestroy
+{
+ order = new Order();
+ onOrderChanged: Subscription;
+ statusForm: FormGroup;
+ orderStatuses = orderStatuses;
+
+ constructor(
+ private orderService: EcommerceOrderService,
+ private formBuilder: FormBuilder,
+ public snackBar: MatSnackBar,
+ private location: Location
+ )
+ {
+
+ }
+
+ ngOnInit()
+ {
+ // Subscribe to update order on changes
+ this.onOrderChanged =
+ this.orderService.onOrderChanged
+ .subscribe(order => {
+ this.order = new Order(order);
+ });
+
+ this.statusForm = this.formBuilder.group({
+ newStatus: ['']
+ });
+ }
+
+ updateStatus()
+ {
+ const newStatusId = Number.parseInt(this.statusForm.get('newStatus').value);
+
+ if ( !newStatusId )
+ {
+ return;
+ }
+
+ const newStatus = this.orderStatuses.find((status) => {
+ return status.id === newStatusId;
+ });
+
+ newStatus['date'] = new Date().toString();
+
+ this.order.status.unshift(newStatus);
+ }
+
+ ngOnDestroy()
+ {
+ this.onOrderChanged.unsubscribe();
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/order/order.model.ts b/src/app/main/content/apps/e-commerce/order/order.model.ts
new file mode 100644
index 00000000..9423a05f
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order.model.ts
@@ -0,0 +1,34 @@
+import { FuseUtils } from '../../../../../core/fuseUtils';
+
+export class Order
+{
+ id: string;
+ reference: string;
+ subtotal: string;
+ tax: string;
+ discount: string;
+ total: string;
+ date: string;
+ customer: any;
+ products: any[];
+ status: any[];
+ payment: any;
+ shippingDetails: any[];
+
+ constructor(order?)
+ {
+ order = order || {};
+ this.id = order.id || FuseUtils.generateGUID();
+ this.reference = order.reference || FuseUtils.generateGUID();
+ this.subtotal = order.subtotal || 0;
+ this.tax = order.tax || 0;
+ this.discount = order.discount || 0;
+ this.total = order.total || 0;
+ this.date = order.date || '';
+ this.customer = order.customer || {};
+ this.products = order.products || [];
+ this.status = order.status || [];
+ this.payment = order.payment || {};
+ this.shippingDetails = order.shippingDetails || [];
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/order/order.service.ts b/src/app/main/content/apps/e-commerce/order/order.service.ts
new file mode 100644
index 00000000..3b30d04d
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/order/order.service.ts
@@ -0,0 +1,75 @@
+import { Injectable } from '@angular/core';
+import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { HttpClient } from '@angular/common/http';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+
+@Injectable()
+export class EcommerceOrderService implements Resolve
+{
+ routeParams: any;
+ order: any;
+ onOrderChanged: BehaviorSubject = new BehaviorSubject({});
+
+ constructor(
+ private http: HttpClient
+ )
+ {
+ }
+
+ /**
+ * Resolve
+ * @param {ActivatedRouteSnapshot} route
+ * @param {RouterStateSnapshot} state
+ * @returns {Observable | Promise | any}
+ */
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any
+ {
+
+ this.routeParams = route.params;
+
+ return new Promise((resolve, reject) => {
+
+ Promise.all([
+ this.getOrder()
+ ]).then(
+ () => {
+ resolve();
+ },
+ reject
+ );
+ });
+ }
+
+ getOrder(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ this.http.get('api/e-commerce-orders/' + this.routeParams.id)
+ .subscribe((response: any) => {
+ this.order = response;
+ this.onOrderChanged.next(this.order);
+ resolve(response);
+ }, reject);
+ });
+ }
+
+ saveOrder(order)
+ {
+ return new Promise((resolve, reject) => {
+ this.http.post('api/e-commerce-orders/' + order.id, order)
+ .subscribe((response: any) => {
+ resolve(response);
+ }, reject);
+ });
+ }
+
+ addOrder(order)
+ {
+ return new Promise((resolve, reject) => {
+ this.http.post('api/e-commerce-orders/', order)
+ .subscribe((response: any) => {
+ resolve(response);
+ }, reject);
+ });
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/orders/orders.component.html b/src/app/main/content/apps/e-commerce/orders/orders.component.html
new file mode 100644
index 00000000..fc143877
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/orders/orders.component.html
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+
+ {{order.id}}
+
+
+
+
+
+ Reference
+
+ {{order.reference}}
+
+
+
+
+
+ Customer
+
+
+ {{order.customer.firstName}}
+ {{order.customer.lastName}}
+
+
+
+
+
+
+ Total
+
+
+ {{order.total | currency:'USD':true}}
+
+
+
+
+
+
+ Payment
+
+
+ {{order.payment.method}}
+
+
+
+
+
+
+ Status
+
+
+ {{order.status[0].name}}
+
+
+
+
+
+
+ Date
+
+
+ {{order.date}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/main/content/apps/e-commerce/orders/orders.component.scss b/src/app/main/content/apps/e-commerce/orders/orders.component.scss
new file mode 100644
index 00000000..9eec2b3b
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/orders/orders.component.scss
@@ -0,0 +1,73 @@
+:host {
+
+ .header {
+
+ .search-input-wrapper {
+ max-width: 480px;
+ }
+ }
+
+ .mat-tab-group,
+ .mat-tab-body-wrapper,
+ .tab-content{
+ flex: 1 1 auto;
+ max-width: 100%;
+ }
+
+ .orders-table {
+ flex: 1 1 auto;
+ border-bottom: 1px solid rgba(0, 0, 0, .12);
+
+ .mat-header-row {
+ min-height: 64px;
+ }
+
+ .order {
+ position: relative;
+ cursor: pointer;
+ height: 84px;
+ }
+
+ .mat-cell {
+ min-width: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .mat-column-id {
+ flex: 0 1 84px;
+ }
+
+ .mat-column-image {
+ flex: 0 1 84px;
+
+ .product-image {
+ width: 52px;
+ height: 52px;
+ border: 1px solid rgba(0, 0, 0, .12);
+ }
+ }
+
+ .mat-column-buttons {
+ flex: 0 1 80px;
+ }
+
+ .quantity-indicator {
+ display: inline-block;
+ vertical-align: middle;
+ width: 8px;
+ height: 8px;
+ border-radius: 4px;
+ margin-right: 8px;
+
+ & + span {
+ display: inline-block;
+ vertical-align: middle;
+ }
+ }
+
+ .active-icon {
+ border-radius: 50%;
+ }
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/orders/orders.component.ts b/src/app/main/content/apps/e-commerce/orders/orders.component.ts
new file mode 100644
index 00000000..87a3a3c3
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/orders/orders.component.ts
@@ -0,0 +1,169 @@
+import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
+import { EcommerceOrdersService } from './orders.service';
+import { DataSource } from '@angular/cdk/collections';
+import { Observable } from 'rxjs/Observable';
+import { fuseAnimations } from '../../../../../core/animations';
+import { MatPaginator, MatSort } from '@angular/material';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { FuseUtils } from '../../../../../core/fuseUtils';
+
+@Component({
+ selector : 'fuse-e-commerce-orders',
+ templateUrl: './orders.component.html',
+ styleUrls : ['./orders.component.scss'],
+ animations : fuseAnimations
+})
+export class FuseEcommerceOrdersComponent implements OnInit
+{
+ dataSource: FilesDataSource | null;
+ displayedColumns = ['id', 'reference', 'customer', 'total', 'payment', 'status', 'date'];
+
+ @ViewChild(MatPaginator) paginator: MatPaginator;
+ @ViewChild('filter') filter: ElementRef;
+ @ViewChild(MatSort) sort: MatSort;
+
+ constructor(
+ private ordersService: EcommerceOrdersService
+ )
+ {
+ }
+
+ ngOnInit()
+ {
+ this.dataSource = new FilesDataSource(this.ordersService, this.paginator, this.sort);
+
+ Observable.fromEvent(this.filter.nativeElement, 'keyup')
+ .debounceTime(150)
+ .distinctUntilChanged()
+ .subscribe(() => {
+ if ( !this.dataSource )
+ {
+ return;
+ }
+ this.dataSource.filter = this.filter.nativeElement.value;
+ });
+ }
+}
+
+export class FilesDataSource extends DataSource
+{
+ _filterChange = new BehaviorSubject('');
+ _filteredDataChange = new BehaviorSubject('');
+
+ get filteredData(): any
+ {
+ return this._filteredDataChange.value;
+ }
+
+ set filteredData(value: any)
+ {
+ this._filteredDataChange.next(value);
+ }
+
+ get filter(): string
+ {
+ return this._filterChange.value;
+ }
+
+ set filter(filter: string)
+ {
+ this._filterChange.next(filter);
+ }
+
+ constructor(
+ private ordersService: EcommerceOrdersService,
+ private _paginator: MatPaginator,
+ private _sort: MatSort
+ )
+ {
+ super();
+ this.filteredData = this.ordersService.orders;
+ }
+
+ /** Connect function called by the table to retrieve one stream containing the data to render. */
+ connect(): Observable
+ {
+ const displayDataChanges = [
+ this.ordersService.onOrdersChanged,
+ this._paginator.page,
+ this._filterChange,
+ this._sort.sortChange
+ ];
+ return Observable.merge(...displayDataChanges).map(() => {
+ let data = this.ordersService.orders.slice();
+
+ data = this.filterData(data);
+
+ this.filteredData = [...data];
+
+ data = this.sortData(data);
+
+ // Grab the page's slice of data.
+ const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
+ return data.splice(startIndex, this._paginator.pageSize);
+ });
+
+ }
+
+ filterData(data)
+ {
+ if ( !this.filter )
+ {
+ return data;
+ }
+ return FuseUtils.filterArrayByString(data, this.filter);
+ }
+
+ sortData(data): any[]
+ {
+ if ( !this._sort.active || this._sort.direction === '' )
+ {
+ return data;
+ }
+
+ return data.sort((a, b) => {
+ let propertyA: number | string = '';
+ let propertyB: number | string = '';
+
+ switch ( this._sort.active )
+ {
+ case 'id':
+ [propertyA, propertyB] = [a.id, b.id];
+ break;
+ case 'reference':
+ [propertyA, propertyB] = [a.reference, b.reference];
+ break;
+ case 'customer':
+ [propertyA, propertyB] = [a.customer.firstName, b.customer.firstName];
+ break;
+ case 'total':
+ [propertyA, propertyB] = [a.total, b.total];
+ break;
+ case 'payment':
+ [propertyA, propertyB] = [a.payment.method, b.payment.method];
+ break;
+ case 'status':
+ [propertyA, propertyB] = [a.status[0].name, b.status[0].name];
+ break;
+ case 'date':
+ [propertyA, propertyB] = [a.date, b.date];
+ break;
+ }
+
+ const valueA = isNaN(+propertyA) ? propertyA : +propertyA;
+ const valueB = isNaN(+propertyB) ? propertyB : +propertyB;
+
+ return (valueA < valueB ? -1 : 1) * (this._sort.direction === 'asc' ? 1 : -1);
+ });
+ }
+
+ disconnect()
+ {
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/orders/orders.service.ts b/src/app/main/content/apps/e-commerce/orders/orders.service.ts
new file mode 100644
index 00000000..08fe8075
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/orders/orders.service.ts
@@ -0,0 +1,52 @@
+import { Injectable } from '@angular/core';
+import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { HttpClient } from '@angular/common/http';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+
+@Injectable()
+export class EcommerceOrdersService implements Resolve
+{
+ orders: any[];
+ onOrdersChanged: BehaviorSubject = new BehaviorSubject({});
+
+ constructor(
+ private http: HttpClient
+ )
+ {
+ }
+
+ /**
+ * Resolve
+ * @param {ActivatedRouteSnapshot} route
+ * @param {RouterStateSnapshot} state
+ * @returns {Observable | Promise | any}
+ */
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any
+ {
+
+ return new Promise((resolve, reject) => {
+
+ Promise.all([
+ this.getOrders()
+ ]).then(
+ () => {
+ resolve();
+ },
+ reject
+ );
+ });
+ }
+
+ getOrders(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ this.http.get('api/e-commerce-orders')
+ .subscribe((response: any) => {
+ this.orders = response;
+ this.onOrdersChanged.next(this.orders);
+ resolve(response);
+ }, reject);
+ });
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/product/product.component.html b/src/app/main/content/apps/e-commerce/product/product.component.html
new file mode 100644
index 00000000..7cb5c3aa
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/product/product.component.html
@@ -0,0 +1,255 @@
+
diff --git a/src/app/main/content/apps/e-commerce/product/product.component.scss b/src/app/main/content/apps/e-commerce/product/product.component.scss
new file mode 100644
index 00000000..c1fe2c1f
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/product/product.component.scss
@@ -0,0 +1,57 @@
+#product {
+
+ .header {
+
+ .product-image {
+ overflow: hidden;
+ width: 56px;
+ height: 56px;
+ border: 3px solid rgba(0, 0, 0, 0.12);
+
+ img {
+ height: 100%;
+ width: auto;
+ max-width: none;
+ }
+ }
+
+ .subtitle {
+ margin: 6px 0 0 0;
+ }
+ }
+
+ .content {
+
+ .mat-tab-group,
+ .mat-tab-body-wrapper,
+ .tab-content{
+ flex: 1 1 auto;
+ max-width: 100%;
+ }
+
+ .mat-tab-body-content {
+ display: flex;
+ }
+
+ .mat-tab-label {
+ height: 64px;
+ }
+
+ .product-image {
+ overflow: hidden;
+ width: 128px;
+ height: 128px;
+ margin-right: 16px;
+ margin-bottom: 16px;
+ border: 3px solid rgba(0, 0, 0, 0.12);
+
+ img {
+ height: 100%;
+ width: auto;
+ max-width: none;
+ }
+ }
+
+ }
+
+}
diff --git a/src/app/main/content/apps/e-commerce/product/product.component.ts b/src/app/main/content/apps/e-commerce/product/product.component.ts
new file mode 100644
index 00000000..f2211289
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/product/product.component.ts
@@ -0,0 +1,132 @@
+import { Component, ElementRef, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
+import { EcommerceProductService } from './product.service';
+import { fuseAnimations } from '../../../../../core/animations';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from 'rxjs/Subscription';
+import { Product } from './product.model';
+import { FormBuilder, FormGroup } from '@angular/forms';
+import { FuseUtils } from '../../../../../core/fuseUtils';
+import { MatSnackBar } from '@angular/material';
+import { Location } from '@angular/common';
+
+@Component({
+ selector : 'fuse-e-commerce-product',
+ templateUrl : './product.component.html',
+ styleUrls : ['./product.component.scss'],
+ encapsulation: ViewEncapsulation.None,
+ animations : fuseAnimations
+})
+export class FuseEcommerceProductComponent implements OnInit, OnDestroy
+{
+ product = new Product();
+ onProductChanged: Subscription;
+ pageType: string;
+ productForm: FormGroup;
+
+ constructor(
+ private productService: EcommerceProductService,
+ private formBuilder: FormBuilder,
+ public snackBar: MatSnackBar,
+ private location: Location
+ )
+ {
+
+ }
+
+ ngOnInit()
+ {
+ // Subscribe to update product on changes
+ this.onProductChanged =
+ this.productService.onProductChanged
+ .subscribe(product => {
+
+ if ( product )
+ {
+ this.product = new Product(product);
+ this.pageType = 'edit';
+ }
+ else
+ {
+ this.pageType = 'new';
+ this.product = new Product();
+ }
+
+ this.productForm = this.createProductForm();
+ });
+
+ }
+
+ createProductForm()
+ {
+ return this.formBuilder.group({
+ id : [this.product.id],
+ name : [this.product.name],
+ handle : [this.product.handle],
+ description : [this.product.description],
+ categories : [this.product.categories],
+ tags : [this.product.tags],
+ images : [this.product.images],
+ priceTaxExcl : [this.product.priceTaxExcl],
+ priceTaxIncl : [this.product.priceTaxIncl],
+ taxRate : [this.product.taxRate],
+ comparedPrice : [this.product.comparedPrice],
+ quantity : [this.product.quantity],
+ sku : [this.product.sku],
+ width : [this.product.width],
+ height : [this.product.height],
+ depth : [this.product.depth],
+ weight : [this.product.weight],
+ extraShippingFee: [this.product.extraShippingFee],
+ active : [this.product.active]
+ });
+ }
+
+ saveProduct()
+ {
+ const data = this.productForm.getRawValue();
+ data.handle = FuseUtils.handleize(data.name);
+ this.productService.saveProduct(data)
+ .then(() => {
+
+ // Trigger the subscription with new data
+ this.productService.onProductChanged.next(data);
+
+ // Show the success message
+ this.snackBar.open('Product saved', 'OK', {
+ verticalPosition: 'top',
+ duration : 2000
+ });
+ });
+ }
+
+ addProduct()
+ {
+ const data = this.productForm.getRawValue();
+ data.handle = FuseUtils.handleize(data.name);
+ this.productService.addProduct(data)
+ .then(() => {
+
+ // Trigger the subscription with new data
+ this.productService.onProductChanged.next(data);
+
+ // Show the success message
+ this.snackBar.open('Product added', 'OK', {
+ verticalPosition: 'top',
+ duration : 2000
+ });
+
+ // Change the location with new one
+ this.location.go('apps/e-commerce/products/' + this.product.id + '/' + this.product.handle);
+ });
+ }
+
+ ngOnDestroy()
+ {
+ this.onProductChanged.unsubscribe();
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/product/product.model.ts b/src/app/main/content/apps/e-commerce/product/product.model.ts
new file mode 100644
index 00000000..1fa520dc
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/product/product.model.ts
@@ -0,0 +1,110 @@
+import { FuseUtils } from '../../../../../core/fuseUtils';
+import { MatChipInputEvent } from '@angular/material';
+
+export class Product
+{
+ id: string;
+ name: string;
+ handle: string;
+ description: string;
+ categories: string[];
+ tags: string[];
+ images: {
+ default: boolean,
+ id: string,
+ url: string,
+ type: string
+ }[];
+ priceTaxExcl: number;
+ priceTaxIncl: number;
+ taxRate: number;
+ comparedPrice: number;
+ quantity: number;
+ sku: string;
+ width: string;
+ height: string;
+ depth: string;
+ weight: string;
+ extraShippingFee: number;
+ active: boolean;
+
+ constructor(product?)
+ {
+ product = product || {};
+ this.id = product.id || FuseUtils.generateGUID();
+ this.name = product.name || '';
+ this.handle = product.handle || FuseUtils.handleize(this.name);
+ this.description = product.description || '';
+ this.categories = product.categories || [];
+ this.tags = product.tags || [];
+ this.images = product.images || [];
+ this.priceTaxExcl = product.priceTaxExcl || 0;
+ this.priceTaxIncl = product.priceTaxIncl || 0;
+ this.taxRate = product.taxRate || 0;
+ this.comparedPrice = product.comparedPrice || 0;
+ this.quantity = product.quantity || 0;
+ this.sku = product.sku || 0;
+ this.width = product.width || 0;
+ this.height = product.height || 0;
+ this.depth = product.depth || 0;
+ this.weight = product.weight || 0;
+ this.extraShippingFee = product.extraShippingFee || 0;
+ this.active = product.active || true;
+ }
+
+ addCategory(event: MatChipInputEvent): void
+ {
+ const input = event.input;
+ const value = event.value;
+
+ // Add category
+ if ( value )
+ {
+ this.categories.push(value);
+ }
+
+ // Reset the input value
+ if ( input )
+ {
+ input.value = '';
+ }
+ }
+
+ removeCategory(category)
+ {
+ const index = this.categories.indexOf(category);
+
+ if ( index >= 0 )
+ {
+ this.categories.splice(index, 1);
+ }
+ }
+
+ addTag(event: MatChipInputEvent): void
+ {
+ const input = event.input;
+ const value = event.value;
+
+ // Add tag
+ if ( value )
+ {
+ this.tags.push(value);
+ }
+
+ // Reset the input value
+ if ( input )
+ {
+ input.value = '';
+ }
+ }
+
+ removeTag(tag)
+ {
+ const index = this.tags.indexOf(tag);
+
+ if ( index >= 0 )
+ {
+ this.tags.splice(index, 1);
+ }
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/product/product.service.ts b/src/app/main/content/apps/e-commerce/product/product.service.ts
new file mode 100644
index 00000000..d763c784
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/product/product.service.ts
@@ -0,0 +1,83 @@
+import { Injectable } from '@angular/core';
+import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { HttpClient } from '@angular/common/http';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+
+@Injectable()
+export class EcommerceProductService implements Resolve
+{
+ routeParams: any;
+ product: any;
+ onProductChanged: BehaviorSubject = new BehaviorSubject({});
+
+ constructor(
+ private http: HttpClient
+ )
+ {
+ }
+
+ /**
+ * Resolve
+ * @param {ActivatedRouteSnapshot} route
+ * @param {RouterStateSnapshot} state
+ * @returns {Observable | Promise | any}
+ */
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any
+ {
+
+ this.routeParams = route.params;
+
+ return new Promise((resolve, reject) => {
+
+ Promise.all([
+ this.getProduct()
+ ]).then(
+ () => {
+ resolve();
+ },
+ reject
+ );
+ });
+ }
+
+ getProduct(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ if ( this.routeParams.id === 'new' )
+ {
+ this.onProductChanged.next(false);
+ resolve(false);
+ }
+ else
+ {
+ this.http.get('api/e-commerce-products/' + this.routeParams.id)
+ .subscribe((response: any) => {
+ this.product = response;
+ this.onProductChanged.next(this.product);
+ resolve(response);
+ }, reject);
+ }
+ });
+ }
+
+ saveProduct(product)
+ {
+ return new Promise((resolve, reject) => {
+ this.http.post('api/e-commerce-products/' + product.id, product)
+ .subscribe((response: any) => {
+ resolve(response);
+ }, reject);
+ });
+ }
+
+ addProduct(product)
+ {
+ return new Promise((resolve, reject) => {
+ this.http.post('api/e-commerce-products/', product)
+ .subscribe((response: any) => {
+ resolve(response);
+ }, reject);
+ });
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/products/products.component.html b/src/app/main/content/apps/e-commerce/products/products.component.html
new file mode 100644
index 00000000..3d459378
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/products/products.component.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+
+ {{product.id}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name
+
+ {{product.name}}
+
+
+
+
+
+ Category
+
+
+ {{product.categories[0]}}
+
+
+
+
+
+
+ Price
+
+
+ {{product.priceTaxIncl | currency:'USD':true}}
+
+
+
+
+
+
+ Quantity
+
+
+ 5 && product.quantity <= 25,'mat-green-600-bg':product.quantity > 25}">
+
+
+ {{product.quantity}}
+
+
+
+
+
+
+
+ Active
+
+ check
+ close
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/main/content/apps/e-commerce/products/products.component.scss b/src/app/main/content/apps/e-commerce/products/products.component.scss
new file mode 100644
index 00000000..fa8c3bc2
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/products/products.component.scss
@@ -0,0 +1,80 @@
+@import "src/app/core/scss/fuse";
+
+:host {
+
+ .header {
+
+ .search-input-wrapper {
+ max-width: 480px;
+ }
+
+ @include media-breakpoint-down(xs) {
+ height: 176px !important;
+ min-height: 176px !important;
+ max-height: 176px !important;
+ }
+ }
+
+ .top-bg {
+ @include media-breakpoint-down(xs) {
+ height: 240px;
+ }
+ }
+
+ .products-table {
+ flex: 1 1 auto;
+ border-bottom: 1px solid rgba(0, 0, 0, .12);
+
+ .mat-header-row {
+ min-height: 64px;
+ }
+
+ .product {
+ position: relative;
+ cursor: pointer;
+ height: 84px;
+ }
+
+ .mat-cell {
+ min-width: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .mat-column-id {
+ flex: 0 1 84px;
+ }
+
+ .mat-column-image {
+ flex: 0 1 84px;
+
+ .product-image {
+ width: 52px;
+ height: 52px;
+ border: 1px solid rgba(0, 0, 0, .12);
+ }
+ }
+
+ .mat-column-buttons {
+ flex: 0 1 80px;
+ }
+
+ .quantity-indicator {
+ display: inline-block;
+ vertical-align: middle;
+ width: 8px;
+ height: 8px;
+ border-radius: 4px;
+ margin-right: 8px;
+
+ & + span {
+ display: inline-block;
+ vertical-align: middle;
+ }
+ }
+
+ .active-icon {
+ border-radius: 50%;
+ }
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/products/products.component.ts b/src/app/main/content/apps/e-commerce/products/products.component.ts
new file mode 100644
index 00000000..b16f585a
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/products/products.component.ts
@@ -0,0 +1,165 @@
+import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
+import { EcommerceProductsService } from './products.service';
+import { DataSource } from '@angular/cdk/collections';
+import { Observable } from 'rxjs/Observable';
+import { fuseAnimations } from '../../../../../core/animations';
+import { MatPaginator, MatSort } from '@angular/material';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { FuseUtils } from '../../../../../core/fuseUtils';
+
+@Component({
+ selector : 'fuse-e-commerce-products',
+ templateUrl: './products.component.html',
+ styleUrls : ['./products.component.scss'],
+ animations : fuseAnimations
+})
+export class FuseEcommerceProductsComponent implements OnInit
+{
+ dataSource: FilesDataSource | null;
+ displayedColumns = ['id', 'image', 'name', 'category', 'price', 'quantity', 'active'];
+
+ @ViewChild(MatPaginator) paginator: MatPaginator;
+ @ViewChild('filter') filter: ElementRef;
+ @ViewChild(MatSort) sort: MatSort;
+
+ constructor(
+ private productsService: EcommerceProductsService
+ )
+ {
+ }
+
+ ngOnInit()
+ {
+ this.dataSource = new FilesDataSource(this.productsService, this.paginator, this.sort);
+ Observable.fromEvent(this.filter.nativeElement, 'keyup')
+ .debounceTime(150)
+ .distinctUntilChanged()
+ .subscribe(() => {
+ if ( !this.dataSource )
+ {
+ return;
+ }
+ this.dataSource.filter = this.filter.nativeElement.value;
+ });
+ }
+}
+
+export class FilesDataSource extends DataSource
+{
+ _filterChange = new BehaviorSubject('');
+ _filteredDataChange = new BehaviorSubject('');
+
+ get filteredData(): any
+ {
+ return this._filteredDataChange.value;
+ }
+
+ set filteredData(value: any)
+ {
+ this._filteredDataChange.next(value);
+ }
+
+ get filter(): string
+ {
+ return this._filterChange.value;
+ }
+
+ set filter(filter: string)
+ {
+ this._filterChange.next(filter);
+ }
+
+ constructor(
+ private productsService: EcommerceProductsService,
+ private _paginator: MatPaginator,
+ private _sort: MatSort
+ )
+ {
+ super();
+ this.filteredData = this.productsService.products;
+ }
+
+ /** Connect function called by the table to retrieve one stream containing the data to render. */
+ connect(): Observable
+ {
+ const displayDataChanges = [
+ this.productsService.onProductsChanged,
+ this._paginator.page,
+ this._filterChange,
+ this._sort.sortChange
+ ];
+
+ return Observable.merge(...displayDataChanges).map(() => {
+ let data = this.productsService.products.slice();
+
+ data = this.filterData(data);
+
+ this.filteredData = [...data];
+
+ data = this.sortData(data);
+
+ // Grab the page's slice of data.
+ const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
+ return data.splice(startIndex, this._paginator.pageSize);
+ });
+ }
+
+ filterData(data)
+ {
+ if ( !this.filter )
+ {
+ return data;
+ }
+ return FuseUtils.filterArrayByString(data, this.filter);
+ }
+
+ sortData(data): any[]
+ {
+ if ( !this._sort.active || this._sort.direction === '' )
+ {
+ return data;
+ }
+
+ return data.sort((a, b) => {
+ let propertyA: number | string = '';
+ let propertyB: number | string = '';
+
+ switch ( this._sort.active )
+ {
+ case 'id':
+ [propertyA, propertyB] = [a.id, b.id];
+ break;
+ case 'name':
+ [propertyA, propertyB] = [a.name, b.name];
+ break;
+ case 'categories':
+ [propertyA, propertyB] = [a.categories[0], b.categories[0]];
+ break;
+ case 'price':
+ [propertyA, propertyB] = [a.priceTaxIncl, b.priceTaxIncl];
+ break;
+ case 'quantity':
+ [propertyA, propertyB] = [a.quantity, b.quantity];
+ break;
+ case 'active':
+ [propertyA, propertyB] = [a.active, b.active];
+ break;
+ }
+
+ const valueA = isNaN(+propertyA) ? propertyA : +propertyA;
+ const valueB = isNaN(+propertyB) ? propertyB : +propertyB;
+
+ return (valueA < valueB ? -1 : 1) * (this._sort.direction === 'asc' ? 1 : -1);
+ });
+ }
+
+ disconnect()
+ {
+ }
+}
diff --git a/src/app/main/content/apps/e-commerce/products/products.service.ts b/src/app/main/content/apps/e-commerce/products/products.service.ts
new file mode 100644
index 00000000..2ce1c44e
--- /dev/null
+++ b/src/app/main/content/apps/e-commerce/products/products.service.ts
@@ -0,0 +1,52 @@
+import { Injectable } from '@angular/core';
+import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { HttpClient } from '@angular/common/http';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+
+@Injectable()
+export class EcommerceProductsService implements Resolve
+{
+ products: any[];
+ onProductsChanged: BehaviorSubject = new BehaviorSubject({});
+
+ constructor(
+ private http: HttpClient
+ )
+ {
+ }
+
+ /**
+ * Resolve
+ * @param {ActivatedRouteSnapshot} route
+ * @param {RouterStateSnapshot} state
+ * @returns {Observable | Promise | any}
+ */
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any
+ {
+
+ return new Promise((resolve, reject) => {
+
+ Promise.all([
+ this.getProducts()
+ ]).then(
+ () => {
+ resolve();
+ },
+ reject
+ );
+ });
+ }
+
+ getProducts(): Promise
+ {
+ return new Promise((resolve, reject) => {
+ this.http.get('api/e-commerce-products')
+ .subscribe((response: any) => {
+ this.products = response;
+ this.onProductsChanged.next(this.products);
+ resolve(response);
+ }, reject);
+ });
+ }
+}
diff --git a/src/app/navigation.model.ts b/src/app/navigation.model.ts
index ca4fca3c..35a31435 100644
--- a/src/app/navigation.model.ts
+++ b/src/app/navigation.model.ts
@@ -32,6 +32,32 @@ export class NavigationModel
'icon' : 'today',
'url' : '/apps/calendar'
},
+ {
+ 'id' : 'e-commerce',
+ 'title' : 'E-Commerce',
+ 'type' : 'collapse',
+ 'icon' : 'shopping_cart',
+ 'children': [
+ {
+ 'id' : 'dashboard',
+ 'title': 'Dashboard',
+ 'type' : 'item',
+ 'url' : '/apps/e-commerce/dashboard'
+ },
+ {
+ 'id' : 'dashboard',
+ 'title': 'Products',
+ 'type' : 'item',
+ 'url' : '/apps/e-commerce/products'
+ },
+ {
+ 'id' : 'dashboard',
+ 'title': 'Orders',
+ 'type' : 'item',
+ 'url' : '/apps/e-commerce/orders'
+ }
+ ]
+ },
{
'id' : 'mail',
'title': 'Mail',
@@ -800,3 +826,4 @@ export class NavigationModel
];
}
}
+